diff --git a/src/clock/mumeclock.cpp b/src/clock/mumeclock.cpp index 42149d382..c06eb9903 100644 --- a/src/clock/mumeclock.cpp +++ b/src/clock/mumeclock.cpp @@ -221,6 +221,13 @@ void MumeClock::parseMumeTime(const QString &mumeTime, const int64_t secsSinceEp qWarning() << "Calculated week day does not match MUME"; } m_mumeStartEpoch = newStartEpoch; + + // Check if season changed and emit signal + const auto currentSeason = capturedMoment.toSeason(); + if (currentSeason != m_lastSeasonEmitted && currentSeason != MumeSeasonEnum::UNKNOWN) { + m_lastSeasonEmitted = currentSeason; + emit sig_seasonChanged(currentSeason); + } } void MumeClock::onUserGmcp(const GmcpMessage &msg) @@ -319,6 +326,13 @@ void MumeClock::parseWeather(const MumeTimeEnum time, int64_t secsSinceEpoch) if (time != MumeTimeEnum::UNKNOWN || m_precision >= MumeClockPrecisionEnum::HOUR) { m_precision = MumeClockPrecisionEnum::MINUTE; } + + // Check if season changed and emit signal + const auto currentSeason = moment.toSeason(); + if (currentSeason != m_lastSeasonEmitted && currentSeason != MumeSeasonEnum::UNKNOWN) { + m_lastSeasonEmitted = currentSeason; + emit sig_seasonChanged(currentSeason); + } } void MumeClock::parseClockTime(const QString &clockTime) @@ -357,6 +371,13 @@ void MumeClock::parseClockTime(const QString &clockTime, const int64_t secsSince log("Synchronized with clock in room (" + QString::number(newStartEpoch - m_mumeStartEpoch) + " seconds from previous)"); m_mumeStartEpoch = newStartEpoch; + + // Check if season changed and emit signal + const auto currentSeason = moment.toSeason(); + if (currentSeason != m_lastSeasonEmitted && currentSeason != MumeSeasonEnum::UNKNOWN) { + m_lastSeasonEmitted = currentSeason; + emit sig_seasonChanged(currentSeason); + } } void MumeClock::parseMSSP(const MsspTime &msspTime) diff --git a/src/clock/mumeclock.h b/src/clock/mumeclock.h index f9cc86bfb..360212cfe 100644 --- a/src/clock/mumeclock.h +++ b/src/clock/mumeclock.h @@ -159,9 +159,11 @@ class NODISCARD_QOBJECT MumeClock final : public QObject private: void onUserGmcp(const GmcpMessage &msg); + MumeSeasonEnum m_lastSeasonEmitted = MumeSeasonEnum::UNKNOWN; signals: void sig_log(const QString &, const QString &); + void sig_seasonChanged(MumeSeasonEnum newSeason); public slots: void parseMumeTime(const QString &mumeTime); diff --git a/src/configuration/configuration.cpp b/src/configuration/configuration.cpp index 1541e3de1..3000e80d3 100644 --- a/src/configuration/configuration.cpp +++ b/src/configuration/configuration.cpp @@ -7,6 +7,7 @@ #include "configuration.h" #include "../global/utils.h" +#include "../map/infomark.h" #include #include @@ -52,6 +53,25 @@ NODISCARD const char *getPlatformEditor() } } +NODISCARD TextureSetEnum intToTextureSet(int value) +{ + switch (value) { + case 0: + return TextureSetEnum::CLASSIC; + case 1: + return TextureSetEnum::MODERN; + case 2: + return TextureSetEnum::CUSTOM; + default: + return TextureSetEnum::MODERN; // Default to Modern + } +} + +NODISCARD int textureSetToInt(TextureSetEnum value) +{ + return static_cast(value); +} + } // namespace Configuration::Configuration() @@ -194,10 +214,12 @@ ConstString GRP_ACCOUNT = "Account"; ConstString GRP_AUTO_LOAD_WORLD = "Auto load world"; ConstString GRP_AUTO_LOG = "Auto log"; ConstString GRP_CANVAS = "Canvas"; +ConstString GRP_COMMS = "Communications"; ConstString GRP_CONNECTION = "Connection"; ConstString GRP_FINDROOMS_DIALOG = "FindRooms Dialog"; ConstString GRP_GENERAL = "General"; ConstString GRP_GROUP_MANAGER = "Group Manager"; +ConstString GRP_HOTKEYS = "Hotkeys"; ConstString GRP_INFOMARKS_DIALOG = "InfoMarks Dialog"; ConstString GRP_INTEGRATED_MUD_CLIENT = "Integrated Mud Client"; ConstString GRP_MUME_CLIENT_PROTOCOL = "Mume client protocol"; @@ -227,9 +249,12 @@ ConstString KEY_CONNECTION_NORMAL_COLOR = "Connection normal color"; ConstString KEY_CORRECT_POSITION_BONUS = "correct position bonus"; ConstString KEY_DISPLAY_XP_STATUS = "Display XP status bar widget"; ConstString KEY_DISPLAY_CLOCK = "Display clock"; +ConstString KEY_GMCP_BROADCAST_CLOCK = "GMCP broadcast clock"; +ConstString KEY_GMCP_BROADCAST_INTERVAL = "GMCP broadcast interval"; ConstString KEY_DRAW_DOOR_NAMES = "Draw door names"; ConstString KEY_DRAW_NOT_MAPPED_EXITS = "Draw not mapped exits"; ConstString KEY_DRAW_UPPER_LAYERS_TEXTURED = "Draw upper layers textured"; +ConstString KEY_LAYER_TRANSPARENCY = "Layer transparency"; ConstString KEY_EMOJI_ENCODE = "encode emoji"; ConstString KEY_EMOJI_DECODE = "decode emoji"; ConstString KEY_EMULATED_EXITS = "Emulated Exits"; @@ -256,6 +281,73 @@ ConstString KEY_3D_FOV = "canvas.advanced.fov"; ConstString KEY_3D_VERTICAL_ANGLE = "canvas.advanced.verticalAngle"; ConstString KEY_3D_HORIZONTAL_ANGLE = "canvas.advanced.horizontalAngle"; ConstString KEY_3D_LAYER_HEIGHT = "canvas.advanced.layerHeight"; +ConstString KEY_BACKGROUND_IMAGE_ENABLED = "canvas.advanced.backgroundImageEnabled"; +ConstString KEY_BACKGROUND_IMAGE_PATH = "canvas.advanced.backgroundImagePath"; +ConstString KEY_BACKGROUND_IMAGE_FIT_MODE = "canvas.advanced.backgroundFitMode"; +ConstString KEY_BACKGROUND_IMAGE_OPACITY = "canvas.advanced.backgroundOpacity"; +ConstString KEY_BACKGROUND_IMAGE_FOCUSED_SCALE = "canvas.advanced.backgroundFocusedScale"; +ConstString KEY_BACKGROUND_IMAGE_FOCUSED_OFFSET_X = "canvas.advanced.backgroundFocusedOffsetX"; +ConstString KEY_BACKGROUND_IMAGE_FOCUSED_OFFSET_Y = "canvas.advanced.backgroundFocusedOffsetY"; +ConstString KEY_VISIBLE_MARKER_GENERIC = "canvas.visibleMarkers.generic"; +ConstString KEY_VISIBLE_MARKER_HERB = "canvas.visibleMarkers.herb"; +ConstString KEY_VISIBLE_MARKER_RIVER = "canvas.visibleMarkers.river"; +ConstString KEY_VISIBLE_MARKER_PLACE = "canvas.visibleMarkers.place"; +ConstString KEY_VISIBLE_MARKER_MOB = "canvas.visibleMarkers.mob"; +ConstString KEY_VISIBLE_MARKER_COMMENT = "canvas.visibleMarkers.comment"; +ConstString KEY_VISIBLE_MARKER_ROAD = "canvas.visibleMarkers.road"; +ConstString KEY_VISIBLE_MARKER_OBJECT = "canvas.visibleMarkers.object"; +ConstString KEY_VISIBLE_MARKER_ACTION = "canvas.visibleMarkers.action"; +ConstString KEY_VISIBLE_MARKER_LOCALITY = "canvas.visibleMarkers.locality"; +ConstString KEY_VISIBLE_CONNECTIONS = "canvas.visibilityFilter.connections"; + +// Hotkey configuration keys +ConstString KEY_HOTKEY_FILE_OPEN = "hotkeys.fileOpen"; +ConstString KEY_HOTKEY_FILE_SAVE = "hotkeys.fileSave"; +ConstString KEY_HOTKEY_FILE_RELOAD = "hotkeys.fileReload"; +ConstString KEY_HOTKEY_FILE_QUIT = "hotkeys.fileQuit"; +ConstString KEY_HOTKEY_EDIT_UNDO = "hotkeys.editUndo"; +ConstString KEY_HOTKEY_EDIT_REDO = "hotkeys.editRedo"; +ConstString KEY_HOTKEY_EDIT_PREFERENCES = "hotkeys.editPreferences"; +ConstString KEY_HOTKEY_EDIT_PREFERENCES_ALT = "hotkeys.editPreferencesAlt"; +ConstString KEY_HOTKEY_EDIT_FIND_ROOMS = "hotkeys.editFindRooms"; +ConstString KEY_HOTKEY_EDIT_ROOM = "hotkeys.editRoom"; +ConstString KEY_HOTKEY_VIEW_ZOOM_IN = "hotkeys.viewZoomIn"; +ConstString KEY_HOTKEY_VIEW_ZOOM_OUT = "hotkeys.viewZoomOut"; +ConstString KEY_HOTKEY_VIEW_ZOOM_RESET = "hotkeys.viewZoomReset"; +ConstString KEY_HOTKEY_VIEW_LAYER_UP = "hotkeys.viewLayerUp"; +ConstString KEY_HOTKEY_VIEW_LAYER_DOWN = "hotkeys.viewLayerDown"; +ConstString KEY_HOTKEY_VIEW_LAYER_RESET = "hotkeys.viewLayerReset"; +ConstString KEY_HOTKEY_VIEW_RADIAL_TRANSPARENCY = "hotkeys.viewRadialTransparency"; +ConstString KEY_HOTKEY_VIEW_STATUS_BAR = "hotkeys.viewStatusBar"; +ConstString KEY_HOTKEY_VIEW_SCROLL_BARS = "hotkeys.viewScrollBars"; +ConstString KEY_HOTKEY_VIEW_MENU_BAR = "hotkeys.viewMenuBar"; +ConstString KEY_HOTKEY_VIEW_ALWAYS_ON_TOP = "hotkeys.viewAlwaysOnTop"; +ConstString KEY_HOTKEY_PANEL_LOG = "hotkeys.panelLog"; +ConstString KEY_HOTKEY_PANEL_CLIENT = "hotkeys.panelClient"; +ConstString KEY_HOTKEY_PANEL_GROUP = "hotkeys.panelGroup"; +ConstString KEY_HOTKEY_PANEL_ROOM = "hotkeys.panelRoom"; +ConstString KEY_HOTKEY_PANEL_ADVENTURE = "hotkeys.panelAdventure"; +ConstString KEY_HOTKEY_PANEL_COMMS = "hotkeys.panelComms"; +ConstString KEY_HOTKEY_PANEL_DESCRIPTION = "hotkeys.panelDescription"; +ConstString KEY_HOTKEY_MODE_MOVE_MAP = "hotkeys.modeMoveMap"; +ConstString KEY_HOTKEY_MODE_RAYPICK = "hotkeys.modeRaypick"; +ConstString KEY_HOTKEY_MODE_SELECT_ROOMS = "hotkeys.modeSelectRooms"; +ConstString KEY_HOTKEY_MODE_SELECT_MARKERS = "hotkeys.modeSelectMarkers"; +ConstString KEY_HOTKEY_MODE_SELECT_CONNECTION = "hotkeys.modeSelectConnection"; +ConstString KEY_HOTKEY_MODE_CREATE_MARKER = "hotkeys.modeCreateMarker"; +ConstString KEY_HOTKEY_MODE_CREATE_ROOM = "hotkeys.modeCreateRoom"; +ConstString KEY_HOTKEY_MODE_CREATE_CONNECTION = "hotkeys.modeCreateConnection"; +ConstString KEY_HOTKEY_MODE_CREATE_ONEWAY_CONNECTION = "hotkeys.modeCreateOnewayConnection"; +ConstString KEY_HOTKEY_ROOM_CREATE = "hotkeys.roomCreate"; +ConstString KEY_HOTKEY_ROOM_MOVE_UP = "hotkeys.roomMoveUp"; +ConstString KEY_HOTKEY_ROOM_MOVE_DOWN = "hotkeys.roomMoveDown"; +ConstString KEY_HOTKEY_ROOM_MERGE_UP = "hotkeys.roomMergeUp"; +ConstString KEY_HOTKEY_ROOM_MERGE_DOWN = "hotkeys.roomMergeDown"; +ConstString KEY_HOTKEY_ROOM_DELETE = "hotkeys.roomDelete"; +ConstString KEY_HOTKEY_ROOM_CONNECT_NEIGHBORS = "hotkeys.roomConnectNeighbors"; +ConstString KEY_HOTKEY_ROOM_MOVE_TO_SELECTED = "hotkeys.roomMoveToSelected"; +ConstString KEY_HOTKEY_ROOM_UPDATE_SELECTED = "hotkeys.roomUpdateSelected"; + ConstString KEY_LAST_MAP_LOAD_DIRECTORY = "Last map load directory"; ConstString KEY_LINES_OF_INPUT_HISTORY = "Lines of input history"; ConstString KEY_LINES_OF_PEEK_PREVIEW = "Lines of peek preview"; @@ -270,6 +362,8 @@ ConstString KEY_PROXY_CONNECTION_STATUS = "Proxy connection status"; ConstString KEY_PROXY_LISTENS_ON_ANY_INTERFACE = "Proxy listens on any interface"; ConstString KEY_RELATIVE_PATH_ACCEPTANCE = "relative path acceptance"; ConstString KEY_RESOURCES_DIRECTORY = "canvas.resourcesDir"; +ConstString KEY_TEXTURE_SET = "canvas.textureSet"; +ConstString KEY_ENABLE_SEASONAL_TEXTURES = "canvas.enableSeasonalTextures"; ConstString KEY_MUME_REMOTE_PORT = "Remote port number"; ConstString KEY_REMEMBER_LOGIN = "remember login"; ConstString KEY_ROOM_CREATION_PENALTY = "room creation penalty"; @@ -441,6 +535,8 @@ NODISCARD static uint16_t sanitizeUint16(const int input, const uint16_t default GROUP_CALLBACK(callback, GRP_GENERAL, general); \ GROUP_CALLBACK(callback, GRP_CONNECTION, connection); \ GROUP_CALLBACK(callback, GRP_CANVAS, canvas); \ + GROUP_CALLBACK(callback, GRP_HOTKEYS, hotkeys); \ + GROUP_CALLBACK(callback, GRP_COMMS, comms); \ GROUP_CALLBACK(callback, GRP_ACCOUNT, account); \ GROUP_CALLBACK(callback, GRP_AUTO_LOAD_WORLD, autoLoad); \ GROUP_CALLBACK(callback, GRP_AUTO_LOG, autoLog); \ @@ -565,7 +661,7 @@ void Configuration::ConnectionSettings::read(const QSettings &conf) } // closest well-known color is "Outer Space" -static constexpr const std::string_view DEFAULT_BGCOLOR = "#2E3436"; +static constexpr const std::string_view DEFAULT_BGCOLOR = "#161f21"; // closest well-known color is "Dusty Gray" static constexpr const std::string_view DEFAULT_DARK_COLOR = "#A19494"; // closest well-known color is "Cold Turkey" @@ -587,11 +683,14 @@ void Configuration::CanvasSettings::read(const QSettings &conf) .append(DEFAULT_MMAPPER_SUBDIR) .append(DEFAULT_RESOURCES_SUBDIR)) .toString(); + textureSet = intToTextureSet(conf.value(KEY_TEXTURE_SET, 1).toInt()); // Default: MODERN + enableSeasonalTextures = conf.value(KEY_ENABLE_SEASONAL_TEXTURES, true).toBool(); showMissingMapId.set(conf.value(KEY_SHOW_MISSING_MAP_ID, true).toBool()); showUnsavedChanges.set(conf.value(KEY_SHOW_UNSAVED_CHANGES, true).toBool()); showUnmappedExits.set(conf.value(KEY_DRAW_NOT_MAPPED_EXITS, true).toBool()); drawUpperLayersTextured = conf.value(KEY_DRAW_UPPER_LAYERS_TEXTURED, false).toBool(); drawDoorNames = conf.value(KEY_DRAW_DOOR_NAMES, true).toBool(); + layerTransparency = conf.value(KEY_LAYER_TRANSPARENCY, 1.0).toFloat(); backgroundColor = lookupColor(KEY_BACKGROUND_COLOR, DEFAULT_BGCOLOR); connectionNormalColor = lookupColor(KEY_CONNECTION_NORMAL_COLOR, Colors::white.toHex()); roomDarkColor = lookupColor(KEY_ROOM_DARK_COLOR, DEFAULT_DARK_COLOR); @@ -605,6 +704,30 @@ void Configuration::CanvasSettings::read(const QSettings &conf) advanced.verticalAngle.set(conf.value(KEY_3D_VERTICAL_ANGLE, 450).toInt()); advanced.horizontalAngle.set(conf.value(KEY_3D_HORIZONTAL_ANGLE, 0).toInt()); advanced.layerHeight.set(conf.value(KEY_3D_LAYER_HEIGHT, 15).toInt()); + + // Load background image settings + advanced.useBackgroundImage = conf.value(KEY_BACKGROUND_IMAGE_ENABLED, false).toBool(); + advanced.backgroundImagePath = conf.value(KEY_BACKGROUND_IMAGE_PATH, "").toString(); + advanced.backgroundFitMode = conf.value(KEY_BACKGROUND_IMAGE_FIT_MODE, 0).toInt(); + advanced.backgroundOpacity = conf.value(KEY_BACKGROUND_IMAGE_OPACITY, 1.0f).toFloat(); + advanced.backgroundFocusedScale = conf.value(KEY_BACKGROUND_IMAGE_FOCUSED_SCALE, 1.0f).toFloat(); + advanced.backgroundFocusedOffsetX = conf.value(KEY_BACKGROUND_IMAGE_FOCUSED_OFFSET_X, 0.0f) + .toFloat(); + advanced.backgroundFocusedOffsetY = conf.value(KEY_BACKGROUND_IMAGE_FOCUSED_OFFSET_Y, 0.0f) + .toFloat(); + + // Load visible markers settings + visibilityFilter.generic.set(conf.value(KEY_VISIBLE_MARKER_GENERIC, true).toBool()); + visibilityFilter.herb.set(conf.value(KEY_VISIBLE_MARKER_HERB, true).toBool()); + visibilityFilter.river.set(conf.value(KEY_VISIBLE_MARKER_RIVER, true).toBool()); + visibilityFilter.place.set(conf.value(KEY_VISIBLE_MARKER_PLACE, true).toBool()); + visibilityFilter.mob.set(conf.value(KEY_VISIBLE_MARKER_MOB, true).toBool()); + visibilityFilter.comment.set(conf.value(KEY_VISIBLE_MARKER_COMMENT, true).toBool()); + visibilityFilter.road.set(conf.value(KEY_VISIBLE_MARKER_ROAD, true).toBool()); + visibilityFilter.object.set(conf.value(KEY_VISIBLE_MARKER_OBJECT, true).toBool()); + visibilityFilter.action.set(conf.value(KEY_VISIBLE_MARKER_ACTION, true).toBool()); + visibilityFilter.locality.set(conf.value(KEY_VISIBLE_MARKER_LOCALITY, true).toBool()); + visibilityFilter.connections.set(conf.value(KEY_VISIBLE_CONNECTIONS, true).toBool()); } void Configuration::AccountSettings::read(const QSettings &conf) @@ -691,11 +814,15 @@ void Configuration::GroupManagerSettings::read(const QSettings &conf) npcSortBottom = conf.value(KEY_GROUP_NPC_SORT_BOTTOM, false).toBool(); } +Configuration::MumeClockSettings::MumeClockSettings() = default; + void Configuration::MumeClockSettings::read(const QSettings &conf) { // NOTE: old values might be stored as int32 startEpoch = conf.value(KEY_MUME_START_EPOCH, 1517443173).toLongLong(); display = conf.value(KEY_DISPLAY_CLOCK, true).toBool(); + gmcpBroadcast.set(conf.value(KEY_GMCP_BROADCAST_CLOCK, true).toBool()); + gmcpBroadcastInterval.set(conf.value(KEY_GMCP_BROADCAST_INTERVAL, 2500).toInt()); } void Configuration::AdventurePanelSettings::read(const QSettings &conf) @@ -770,11 +897,14 @@ NODISCARD static auto getQColorName(const XNamedColor &color) void Configuration::CanvasSettings::write(QSettings &conf) const { conf.setValue(KEY_RESOURCES_DIRECTORY, resourcesDirectory); + conf.setValue(KEY_TEXTURE_SET, textureSetToInt(textureSet)); + conf.setValue(KEY_ENABLE_SEASONAL_TEXTURES, enableSeasonalTextures); conf.setValue(KEY_SHOW_MISSING_MAP_ID, showMissingMapId.get()); conf.setValue(KEY_SHOW_UNSAVED_CHANGES, showUnsavedChanges.get()); conf.setValue(KEY_DRAW_NOT_MAPPED_EXITS, showUnmappedExits.get()); conf.setValue(KEY_DRAW_UPPER_LAYERS_TEXTURED, drawUpperLayersTextured); conf.setValue(KEY_DRAW_DOOR_NAMES, drawDoorNames); + conf.setValue(KEY_LAYER_TRANSPARENCY, layerTransparency); conf.setValue(KEY_BACKGROUND_COLOR, getQColorName(backgroundColor)); conf.setValue(KEY_ROOM_DARK_COLOR, getQColorName(roomDarkColor)); conf.setValue(KEY_ROOM_DARK_LIT_COLOR, getQColorName(roomDarkLitColor)); @@ -788,6 +918,239 @@ void Configuration::CanvasSettings::write(QSettings &conf) const conf.setValue(KEY_3D_VERTICAL_ANGLE, advanced.verticalAngle.get()); conf.setValue(KEY_3D_HORIZONTAL_ANGLE, advanced.horizontalAngle.get()); conf.setValue(KEY_3D_LAYER_HEIGHT, advanced.layerHeight.get()); + + // Save background image settings + conf.setValue(KEY_BACKGROUND_IMAGE_ENABLED, advanced.useBackgroundImage); + conf.setValue(KEY_BACKGROUND_IMAGE_PATH, advanced.backgroundImagePath); + conf.setValue(KEY_BACKGROUND_IMAGE_FIT_MODE, advanced.backgroundFitMode); + conf.setValue(KEY_BACKGROUND_IMAGE_OPACITY, advanced.backgroundOpacity); + conf.setValue(KEY_BACKGROUND_IMAGE_FOCUSED_SCALE, advanced.backgroundFocusedScale); + conf.setValue(KEY_BACKGROUND_IMAGE_FOCUSED_OFFSET_X, advanced.backgroundFocusedOffsetX); + conf.setValue(KEY_BACKGROUND_IMAGE_FOCUSED_OFFSET_Y, advanced.backgroundFocusedOffsetY); + + // Save visible markers settings + conf.setValue(KEY_VISIBLE_MARKER_GENERIC, visibilityFilter.generic.get()); + conf.setValue(KEY_VISIBLE_MARKER_HERB, visibilityFilter.herb.get()); + conf.setValue(KEY_VISIBLE_MARKER_RIVER, visibilityFilter.river.get()); + conf.setValue(KEY_VISIBLE_MARKER_PLACE, visibilityFilter.place.get()); + conf.setValue(KEY_VISIBLE_MARKER_MOB, visibilityFilter.mob.get()); + conf.setValue(KEY_VISIBLE_MARKER_COMMENT, visibilityFilter.comment.get()); + conf.setValue(KEY_VISIBLE_MARKER_ROAD, visibilityFilter.road.get()); + conf.setValue(KEY_VISIBLE_MARKER_OBJECT, visibilityFilter.object.get()); + conf.setValue(KEY_VISIBLE_MARKER_ACTION, visibilityFilter.action.get()); + conf.setValue(KEY_VISIBLE_MARKER_LOCALITY, visibilityFilter.locality.get()); + conf.setValue(KEY_VISIBLE_CONNECTIONS, visibilityFilter.connections.get()); +} + +void Configuration::Hotkeys::read(const QSettings &conf) +{ + // File operations + fileOpen.set(conf.value(KEY_HOTKEY_FILE_OPEN, "Ctrl+O").toString()); + fileSave.set(conf.value(KEY_HOTKEY_FILE_SAVE, "Ctrl+S").toString()); + fileReload.set(conf.value(KEY_HOTKEY_FILE_RELOAD, "Ctrl+R").toString()); + fileQuit.set(conf.value(KEY_HOTKEY_FILE_QUIT, "Ctrl+Q").toString()); + + // Edit operations + editUndo.set(conf.value(KEY_HOTKEY_EDIT_UNDO, "Ctrl+Z").toString()); + editRedo.set(conf.value(KEY_HOTKEY_EDIT_REDO, "Ctrl+Y").toString()); + editPreferences.set(conf.value(KEY_HOTKEY_EDIT_PREFERENCES, "Ctrl+P").toString()); + editPreferencesAlt.set(conf.value(KEY_HOTKEY_EDIT_PREFERENCES_ALT, "Esc").toString()); + editFindRooms.set(conf.value(KEY_HOTKEY_EDIT_FIND_ROOMS, "Ctrl+F").toString()); + editRoom.set(conf.value(KEY_HOTKEY_EDIT_ROOM, "Ctrl+E").toString()); + + // View operations + viewZoomIn.set(conf.value(KEY_HOTKEY_VIEW_ZOOM_IN, "").toString()); + viewZoomOut.set(conf.value(KEY_HOTKEY_VIEW_ZOOM_OUT, "").toString()); + viewZoomReset.set(conf.value(KEY_HOTKEY_VIEW_ZOOM_RESET, "Ctrl+0").toString()); + viewLayerUp.set(conf.value(KEY_HOTKEY_VIEW_LAYER_UP, "").toString()); + viewLayerDown.set(conf.value(KEY_HOTKEY_VIEW_LAYER_DOWN, "").toString()); + viewLayerReset.set(conf.value(KEY_HOTKEY_VIEW_LAYER_RESET, "").toString()); + + // View toggles + viewRadialTransparency.set(conf.value(KEY_HOTKEY_VIEW_RADIAL_TRANSPARENCY, "").toString()); + viewStatusBar.set(conf.value(KEY_HOTKEY_VIEW_STATUS_BAR, "").toString()); + viewScrollBars.set(conf.value(KEY_HOTKEY_VIEW_SCROLL_BARS, "").toString()); + viewMenuBar.set(conf.value(KEY_HOTKEY_VIEW_MENU_BAR, "").toString()); + viewAlwaysOnTop.set(conf.value(KEY_HOTKEY_VIEW_ALWAYS_ON_TOP, "").toString()); + + // Side panels + panelLog.set(conf.value(KEY_HOTKEY_PANEL_LOG, "Ctrl+L").toString()); + panelClient.set(conf.value(KEY_HOTKEY_PANEL_CLIENT, "").toString()); + panelGroup.set(conf.value(KEY_HOTKEY_PANEL_GROUP, "").toString()); + panelRoom.set(conf.value(KEY_HOTKEY_PANEL_ROOM, "").toString()); + panelAdventure.set(conf.value(KEY_HOTKEY_PANEL_ADVENTURE, "").toString()); + panelComms.set(conf.value(KEY_HOTKEY_PANEL_COMMS, "").toString()); + panelDescription.set(conf.value(KEY_HOTKEY_PANEL_DESCRIPTION, "").toString()); + + // Mouse modes + modeMoveMap.set(conf.value(KEY_HOTKEY_MODE_MOVE_MAP, "").toString()); + modeRaypick.set(conf.value(KEY_HOTKEY_MODE_RAYPICK, "").toString()); + modeSelectRooms.set(conf.value(KEY_HOTKEY_MODE_SELECT_ROOMS, "").toString()); + modeSelectMarkers.set(conf.value(KEY_HOTKEY_MODE_SELECT_MARKERS, "").toString()); + modeSelectConnection.set(conf.value(KEY_HOTKEY_MODE_SELECT_CONNECTION, "").toString()); + modeCreateMarker.set(conf.value(KEY_HOTKEY_MODE_CREATE_MARKER, "").toString()); + modeCreateRoom.set(conf.value(KEY_HOTKEY_MODE_CREATE_ROOM, "").toString()); + modeCreateConnection.set(conf.value(KEY_HOTKEY_MODE_CREATE_CONNECTION, "").toString()); + modeCreateOnewayConnection.set( + conf.value(KEY_HOTKEY_MODE_CREATE_ONEWAY_CONNECTION, "").toString()); + + // Room operations + roomCreate.set(conf.value(KEY_HOTKEY_ROOM_CREATE, "").toString()); + roomMoveUp.set(conf.value(KEY_HOTKEY_ROOM_MOVE_UP, "").toString()); + roomMoveDown.set(conf.value(KEY_HOTKEY_ROOM_MOVE_DOWN, "").toString()); + roomMergeUp.set(conf.value(KEY_HOTKEY_ROOM_MERGE_UP, "").toString()); + roomMergeDown.set(conf.value(KEY_HOTKEY_ROOM_MERGE_DOWN, "").toString()); + roomDelete.set(conf.value(KEY_HOTKEY_ROOM_DELETE, "Del").toString()); + roomConnectNeighbors.set(conf.value(KEY_HOTKEY_ROOM_CONNECT_NEIGHBORS, "").toString()); + roomMoveToSelected.set(conf.value(KEY_HOTKEY_ROOM_MOVE_TO_SELECTED, "").toString()); + roomUpdateSelected.set(conf.value(KEY_HOTKEY_ROOM_UPDATE_SELECTED, "").toString()); +} + +void Configuration::Hotkeys::write(QSettings &conf) const +{ + // File operations + conf.setValue(KEY_HOTKEY_FILE_OPEN, fileOpen.get()); + conf.setValue(KEY_HOTKEY_FILE_SAVE, fileSave.get()); + conf.setValue(KEY_HOTKEY_FILE_RELOAD, fileReload.get()); + conf.setValue(KEY_HOTKEY_FILE_QUIT, fileQuit.get()); + + // Edit operations + conf.setValue(KEY_HOTKEY_EDIT_UNDO, editUndo.get()); + conf.setValue(KEY_HOTKEY_EDIT_REDO, editRedo.get()); + conf.setValue(KEY_HOTKEY_EDIT_PREFERENCES, editPreferences.get()); + conf.setValue(KEY_HOTKEY_EDIT_PREFERENCES_ALT, editPreferencesAlt.get()); + conf.setValue(KEY_HOTKEY_EDIT_FIND_ROOMS, editFindRooms.get()); + conf.setValue(KEY_HOTKEY_EDIT_ROOM, editRoom.get()); + + // View operations + conf.setValue(KEY_HOTKEY_VIEW_ZOOM_IN, viewZoomIn.get()); + conf.setValue(KEY_HOTKEY_VIEW_ZOOM_OUT, viewZoomOut.get()); + conf.setValue(KEY_HOTKEY_VIEW_ZOOM_RESET, viewZoomReset.get()); + conf.setValue(KEY_HOTKEY_VIEW_LAYER_UP, viewLayerUp.get()); + conf.setValue(KEY_HOTKEY_VIEW_LAYER_DOWN, viewLayerDown.get()); + conf.setValue(KEY_HOTKEY_VIEW_LAYER_RESET, viewLayerReset.get()); + + // View toggles + conf.setValue(KEY_HOTKEY_VIEW_RADIAL_TRANSPARENCY, viewRadialTransparency.get()); + conf.setValue(KEY_HOTKEY_VIEW_STATUS_BAR, viewStatusBar.get()); + conf.setValue(KEY_HOTKEY_VIEW_SCROLL_BARS, viewScrollBars.get()); + conf.setValue(KEY_HOTKEY_VIEW_MENU_BAR, viewMenuBar.get()); + conf.setValue(KEY_HOTKEY_VIEW_ALWAYS_ON_TOP, viewAlwaysOnTop.get()); + + // Side panels + conf.setValue(KEY_HOTKEY_PANEL_LOG, panelLog.get()); + conf.setValue(KEY_HOTKEY_PANEL_CLIENT, panelClient.get()); + conf.setValue(KEY_HOTKEY_PANEL_GROUP, panelGroup.get()); + conf.setValue(KEY_HOTKEY_PANEL_ROOM, panelRoom.get()); + conf.setValue(KEY_HOTKEY_PANEL_ADVENTURE, panelAdventure.get()); + conf.setValue(KEY_HOTKEY_PANEL_COMMS, panelComms.get()); + conf.setValue(KEY_HOTKEY_PANEL_DESCRIPTION, panelDescription.get()); + + // Mouse modes + conf.setValue(KEY_HOTKEY_MODE_MOVE_MAP, modeMoveMap.get()); + conf.setValue(KEY_HOTKEY_MODE_RAYPICK, modeRaypick.get()); + conf.setValue(KEY_HOTKEY_MODE_SELECT_ROOMS, modeSelectRooms.get()); + conf.setValue(KEY_HOTKEY_MODE_SELECT_MARKERS, modeSelectMarkers.get()); + conf.setValue(KEY_HOTKEY_MODE_SELECT_CONNECTION, modeSelectConnection.get()); + conf.setValue(KEY_HOTKEY_MODE_CREATE_MARKER, modeCreateMarker.get()); + conf.setValue(KEY_HOTKEY_MODE_CREATE_ROOM, modeCreateRoom.get()); + conf.setValue(KEY_HOTKEY_MODE_CREATE_CONNECTION, modeCreateConnection.get()); + conf.setValue(KEY_HOTKEY_MODE_CREATE_ONEWAY_CONNECTION, modeCreateOnewayConnection.get()); + + // Room operations + conf.setValue(KEY_HOTKEY_ROOM_CREATE, roomCreate.get()); + conf.setValue(KEY_HOTKEY_ROOM_MOVE_UP, roomMoveUp.get()); + conf.setValue(KEY_HOTKEY_ROOM_MOVE_DOWN, roomMoveDown.get()); + conf.setValue(KEY_HOTKEY_ROOM_MERGE_UP, roomMergeUp.get()); + conf.setValue(KEY_HOTKEY_ROOM_MERGE_DOWN, roomMergeDown.get()); + conf.setValue(KEY_HOTKEY_ROOM_DELETE, roomDelete.get()); + conf.setValue(KEY_HOTKEY_ROOM_CONNECT_NEIGHBORS, roomConnectNeighbors.get()); + conf.setValue(KEY_HOTKEY_ROOM_MOVE_TO_SELECTED, roomMoveToSelected.get()); + conf.setValue(KEY_HOTKEY_ROOM_UPDATE_SELECTED, roomUpdateSelected.get()); +} + +void Configuration::CommsSettings::read(const QSettings &conf) +{ + // Communication colors + tellColor.set(conf.value(tellColor.getName(), QColor(32, 108, 9)).value()); + whisperColor.set(conf.value(whisperColor.getName(), QColor(103, 135, 149)).value()); + groupColor.set(conf.value(groupColor.getName(), QColor(15, 123, 255)).value()); + askColor.set(conf.value(askColor.getName(), QColor(Qt::yellow)).value()); + sayColor.set(conf.value(sayColor.getName(), QColor(80, 173, 199)).value()); + emoteColor.set(conf.value(emoteColor.getName(), QColor(203, 37, 111)).value()); + socialColor.set(conf.value(socialColor.getName(), QColor(217, 140, 151)).value()); + yellColor.set(conf.value(yellColor.getName(), QColor(176, 80, 189)).value()); + narrateColor.set(conf.value(narrateColor.getName(), QColor(119, 197, 203)).value()); + prayColor.set(conf.value(prayColor.getName(), QColor(173, 216, 230)).value()); + shoutColor.set(conf.value(shoutColor.getName(), QColor(160, 9, 198)).value()); + singColor.set(conf.value(singColor.getName(), QColor(144, 238, 144)).value()); + backgroundColor.set(conf.value(backgroundColor.getName(), QColor(22, 31, 33)).value()); + + // Font styling options + yellAllCaps.set(conf.value(yellAllCaps.getName(), true).toBool()); + whisperItalic.set(conf.value(whisperItalic.getName(), true).toBool()); + emoteItalic.set(conf.value(emoteItalic.getName(), true).toBool()); + + // Display options + showTimestamps.set(conf.value(showTimestamps.getName(), false).toBool()); + saveLogOnExit.set(conf.value(saveLogOnExit.getName(), false).toBool()); + logDirectory.set(conf.value(logDirectory.getName(), QString("")).toString()); + + // Talker colors + talkerYouColor.set(conf.value(talkerYouColor.getName(), QColor(228, 250, 255)).value()); + talkerPlayerColor.set( + conf.value(talkerPlayerColor.getName(), QColor(255, 187, 16)).value()); + talkerNpcColor.set(conf.value(talkerNpcColor.getName(), QColor(25, 138, 23)).value()); + talkerAllyColor.set(conf.value(talkerAllyColor.getName(), QColor(33, 166, 255)).value()); + talkerNeutralColor.set( + conf.value(talkerNeutralColor.getName(), QColor(166, 168, 168)).value()); + talkerEnemyColor.set(conf.value(talkerEnemyColor.getName(), QColor(173, 7, 37)).value()); + + // Tab muting (filters) + muteDirectTab.set(conf.value(muteDirectTab.getName(), false).toBool()); + muteLocalTab.set(conf.value(muteLocalTab.getName(), false).toBool()); + muteGlobalTab.set(conf.value(muteGlobalTab.getName(), false).toBool()); +} + +void Configuration::CommsSettings::write(QSettings &conf) const +{ + // Communication colors + conf.setValue(tellColor.getName(), tellColor.get()); + conf.setValue(whisperColor.getName(), whisperColor.get()); + conf.setValue(groupColor.getName(), groupColor.get()); + conf.setValue(askColor.getName(), askColor.get()); + conf.setValue(sayColor.getName(), sayColor.get()); + conf.setValue(emoteColor.getName(), emoteColor.get()); + conf.setValue(socialColor.getName(), socialColor.get()); + conf.setValue(yellColor.getName(), yellColor.get()); + conf.setValue(narrateColor.getName(), narrateColor.get()); + conf.setValue(prayColor.getName(), prayColor.get()); + conf.setValue(shoutColor.getName(), shoutColor.get()); + conf.setValue(singColor.getName(), singColor.get()); + conf.setValue(backgroundColor.getName(), backgroundColor.get()); + + // Font styling options + conf.setValue(yellAllCaps.getName(), yellAllCaps.get()); + conf.setValue(whisperItalic.getName(), whisperItalic.get()); + conf.setValue(emoteItalic.getName(), emoteItalic.get()); + + // Display options + conf.setValue(showTimestamps.getName(), showTimestamps.get()); + conf.setValue(saveLogOnExit.getName(), saveLogOnExit.get()); + conf.setValue(logDirectory.getName(), logDirectory.get()); + + // Talker colors + conf.setValue(talkerYouColor.getName(), talkerYouColor.get()); + conf.setValue(talkerPlayerColor.getName(), talkerPlayerColor.get()); + conf.setValue(talkerNpcColor.getName(), talkerNpcColor.get()); + conf.setValue(talkerAllyColor.getName(), talkerAllyColor.get()); + conf.setValue(talkerNeutralColor.getName(), talkerNeutralColor.get()); + conf.setValue(talkerEnemyColor.getName(), talkerEnemyColor.get()); + + // Tab muting (filters) + conf.setValue(muteDirectTab.getName(), muteDirectTab.get()); + conf.setValue(muteLocalTab.getName(), muteLocalTab.get()); + conf.setValue(muteGlobalTab.getName(), muteGlobalTab.get()); } void Configuration::AccountSettings::write(QSettings &conf) const @@ -862,6 +1225,8 @@ void Configuration::MumeClockSettings::write(QSettings &conf) const // Note: There's no QVariant(int64_t) constructor. conf.setValue(KEY_MUME_START_EPOCH, static_cast(startEpoch)); conf.setValue(KEY_DISPLAY_CLOCK, display); + conf.setValue(KEY_GMCP_BROADCAST_CLOCK, gmcpBroadcast.get()); + conf.setValue(KEY_GMCP_BROADCAST_INTERVAL, gmcpBroadcastInterval.get()); } void Configuration::AdventurePanelSettings::write(QSettings &conf) const @@ -994,6 +1359,118 @@ void Configuration::CanvasSettings::Advanced::registerChangeCallback( layerHeight.registerChangeCallback(lifetime, callback); } +Configuration::CanvasSettings::VisibilityFilter::VisibilityFilter() = default; + +bool Configuration::CanvasSettings::VisibilityFilter::isVisible(InfomarkClassEnum markerClass) const +{ + switch (markerClass) { + case InfomarkClassEnum::GENERIC: + return generic.get(); + case InfomarkClassEnum::HERB: + return herb.get(); + case InfomarkClassEnum::RIVER: + return river.get(); + case InfomarkClassEnum::PLACE: + return place.get(); + case InfomarkClassEnum::MOB: + return mob.get(); + case InfomarkClassEnum::COMMENT: + return comment.get(); + case InfomarkClassEnum::ROAD: + return road.get(); + case InfomarkClassEnum::OBJECT: + return object.get(); + case InfomarkClassEnum::ACTION: + return action.get(); + case InfomarkClassEnum::LOCALITY: + return locality.get(); + } + return true; // Default to visible for unknown types +} + +void Configuration::CanvasSettings::VisibilityFilter::setVisible(InfomarkClassEnum markerClass, + bool visible) +{ + switch (markerClass) { + case InfomarkClassEnum::GENERIC: + generic.set(visible); + break; + case InfomarkClassEnum::HERB: + herb.set(visible); + break; + case InfomarkClassEnum::RIVER: + river.set(visible); + break; + case InfomarkClassEnum::PLACE: + place.set(visible); + break; + case InfomarkClassEnum::MOB: + mob.set(visible); + break; + case InfomarkClassEnum::COMMENT: + comment.set(visible); + break; + case InfomarkClassEnum::ROAD: + road.set(visible); + break; + case InfomarkClassEnum::OBJECT: + object.set(visible); + break; + case InfomarkClassEnum::ACTION: + action.set(visible); + break; + case InfomarkClassEnum::LOCALITY: + locality.set(visible); + break; + } +} + +void Configuration::CanvasSettings::VisibilityFilter::showAll() +{ + generic.set(true); + herb.set(true); + river.set(true); + place.set(true); + mob.set(true); + comment.set(true); + road.set(true); + object.set(true); + action.set(true); + locality.set(true); + connections.set(true); +} + +void Configuration::CanvasSettings::VisibilityFilter::hideAll() +{ + generic.set(false); + herb.set(false); + river.set(false); + place.set(false); + mob.set(false); + comment.set(false); + road.set(false); + object.set(false); + action.set(false); + locality.set(false); + connections.set(false); +} + +void Configuration::CanvasSettings::VisibilityFilter::registerChangeCallback( + const ChangeMonitor::Lifetime &lifetime, const ChangeMonitor::Function &callback) +{ + generic.registerChangeCallback(lifetime, callback); + herb.registerChangeCallback(lifetime, callback); + river.registerChangeCallback(lifetime, callback); + place.registerChangeCallback(lifetime, callback); + mob.registerChangeCallback(lifetime, callback); + comment.registerChangeCallback(lifetime, callback); + road.registerChangeCallback(lifetime, callback); + object.registerChangeCallback(lifetime, callback); + action.registerChangeCallback(lifetime, callback); + locality.registerChangeCallback(lifetime, callback); + connections.registerChangeCallback(lifetime, callback); +} + void setEnteredMain() { g_thread = std::this_thread::get_id(); diff --git a/src/configuration/configuration.h b/src/configuration/configuration.h index 58d1d1e9f..d83f60ce5 100644 --- a/src/configuration/configuration.h +++ b/src/configuration/configuration.h @@ -29,6 +29,9 @@ #undef TRANSPARENT // Bad dog, Microsoft; bad dog!!! +// Forward declaration for InfomarkClassEnum +enum class InfomarkClassEnum : uint8_t; + #define SUBGROUP() \ friend class Configuration; \ void read(const QSettings &conf); \ @@ -79,6 +82,7 @@ class NODISCARD Configuration final char prefixChar = char_consts::C_UNDERSCORE; bool encodeEmoji = true; bool decodeEmoji = true; + bool enableYellFallbackParsing = true; // Parse yells from game text when GMCP unavailable private: SUBGROUP(); @@ -143,6 +147,10 @@ class NODISCARD Configuration final bool trilinearFiltering = false; bool softwareOpenGL = false; QString resourcesDirectory; + TextureSetEnum textureSet = TextureSetEnum::MODERN; + bool enableSeasonalTextures = true; + float layerTransparency = 1.0f; // 0.0 = only focused layer, 1.0 = maximum transparency + bool enableRadialTransparency = true; // Enable radial transparency zones on upper layers // not saved yet: bool drawCharBeacons = true; @@ -159,12 +167,21 @@ class NODISCARD Configuration final NamedConfig autoTilt{"MMAPPER_AUTO_TILT", true}; NamedConfig printPerfStats{"MMAPPER_GL_PERFSTATS", IS_DEBUG_BUILD}; + // Background image settings + bool useBackgroundImage = false; + QString backgroundImagePath; + int backgroundFitMode = 0; // BackgroundFitModeEnum::FIT + float backgroundOpacity = 1.0f; + float backgroundFocusedScale = 1.0f; // Scale factor for FOCUSED mode (0.1 to 10.0) + float backgroundFocusedOffsetX = 0.0f; // X offset for FOCUSED mode (-1000 to 1000) + float backgroundFocusedOffsetY = 0.0f; // Y offset for FOCUSED mode (-1000 to 1000) + // 5..90 degrees FixedPoint<1> fov{50, 900, 765}; // 0..90 degrees FixedPoint<1> verticalAngle{0, 900, 450}; - // -45..45 degrees - FixedPoint<1> horizontalAngle{-450, 450, 0}; + // -180..180 degrees (full rotation) + FixedPoint<1> horizontalAngle{-1800, 1800, 0}; // 1..10 rooms FixedPoint<1> layerHeight{10, 100, 15}; @@ -175,10 +192,147 @@ class NODISCARD Configuration final Advanced(); } advanced; + struct NODISCARD VisibilityFilter final + { + NamedConfig generic{"VISIBLE_MARKER_GENERIC", true}; + NamedConfig herb{"VISIBLE_MARKER_HERB", true}; + NamedConfig river{"VISIBLE_MARKER_RIVER", true}; + NamedConfig place{"VISIBLE_MARKER_PLACE", true}; + NamedConfig mob{"VISIBLE_MARKER_MOB", true}; + NamedConfig comment{"VISIBLE_MARKER_COMMENT", true}; + NamedConfig road{"VISIBLE_MARKER_ROAD", true}; + NamedConfig object{"VISIBLE_MARKER_OBJECT", true}; + NamedConfig action{"VISIBLE_MARKER_ACTION", true}; + NamedConfig locality{"VISIBLE_MARKER_LOCALITY", true}; + NamedConfig connections{"VISIBLE_CONNECTIONS", true}; + + public: + NODISCARD bool isVisible(InfomarkClassEnum markerClass) const; + void setVisible(InfomarkClassEnum markerClass, bool visible); + NODISCARD bool isConnectionsVisible() const { return connections.get(); } + void setConnectionsVisible(bool visible) { connections.set(visible); } + void showAll(); + void hideAll(); + void registerChangeCallback(const ChangeMonitor::Lifetime &lifetime, + const ChangeMonitor::Function &callback); + + VisibilityFilter(); + } visibilityFilter; + private: SUBGROUP(); } canvas; + struct NODISCARD Hotkeys final + { + // File operations + NamedConfig fileOpen{"HOTKEY_FILE_OPEN", "Ctrl+O"}; + NamedConfig fileSave{"HOTKEY_FILE_SAVE", "Ctrl+S"}; + NamedConfig fileReload{"HOTKEY_FILE_RELOAD", "Ctrl+R"}; + NamedConfig fileQuit{"HOTKEY_FILE_QUIT", "Ctrl+Q"}; + + // Edit operations + NamedConfig editUndo{"HOTKEY_EDIT_UNDO", "Ctrl+Z"}; + NamedConfig editRedo{"HOTKEY_EDIT_REDO", "Ctrl+Y"}; + NamedConfig editPreferences{"HOTKEY_EDIT_PREFERENCES", "Ctrl+P"}; + NamedConfig editPreferencesAlt{"HOTKEY_EDIT_PREFERENCES_ALT", "Esc"}; + NamedConfig editFindRooms{"HOTKEY_EDIT_FIND_ROOMS", "Ctrl+F"}; + NamedConfig editRoom{"HOTKEY_EDIT_ROOM", "Ctrl+E"}; + + // View operations + NamedConfig viewZoomIn{"HOTKEY_VIEW_ZOOM_IN", ""}; + NamedConfig viewZoomOut{"HOTKEY_VIEW_ZOOM_OUT", ""}; + NamedConfig viewZoomReset{"HOTKEY_VIEW_ZOOM_RESET", "Ctrl+0"}; + NamedConfig viewLayerUp{"HOTKEY_VIEW_LAYER_UP", ""}; + NamedConfig viewLayerDown{"HOTKEY_VIEW_LAYER_DOWN", ""}; + NamedConfig viewLayerReset{"HOTKEY_VIEW_LAYER_RESET", ""}; + + // View toggles + NamedConfig viewRadialTransparency{"HOTKEY_VIEW_RADIAL_TRANSPARENCY", ""}; + NamedConfig viewStatusBar{"HOTKEY_VIEW_STATUS_BAR", ""}; + NamedConfig viewScrollBars{"HOTKEY_VIEW_SCROLL_BARS", ""}; + NamedConfig viewMenuBar{"HOTKEY_VIEW_MENU_BAR", ""}; + NamedConfig viewAlwaysOnTop{"HOTKEY_VIEW_ALWAYS_ON_TOP", ""}; + + // Side panels + NamedConfig panelLog{"HOTKEY_PANEL_LOG", "Ctrl+L"}; + NamedConfig panelClient{"HOTKEY_PANEL_CLIENT", ""}; + NamedConfig panelGroup{"HOTKEY_PANEL_GROUP", ""}; + NamedConfig panelRoom{"HOTKEY_PANEL_ROOM", ""}; + NamedConfig panelAdventure{"HOTKEY_PANEL_ADVENTURE", ""}; + NamedConfig panelDescription{"HOTKEY_PANEL_DESCRIPTION", ""}; + NamedConfig panelComms{"HOTKEY_PANEL_COMMS", ""}; + + // Mouse modes + NamedConfig modeMoveMap{"HOTKEY_MODE_MOVE_MAP", ""}; + NamedConfig modeRaypick{"HOTKEY_MODE_RAYPICK", ""}; + NamedConfig modeSelectRooms{"HOTKEY_MODE_SELECT_ROOMS", ""}; + NamedConfig modeSelectMarkers{"HOTKEY_MODE_SELECT_MARKERS", ""}; + NamedConfig modeSelectConnection{"HOTKEY_MODE_SELECT_CONNECTION", ""}; + NamedConfig modeCreateMarker{"HOTKEY_MODE_CREATE_MARKER", ""}; + NamedConfig modeCreateRoom{"HOTKEY_MODE_CREATE_ROOM", ""}; + NamedConfig modeCreateConnection{"HOTKEY_MODE_CREATE_CONNECTION", ""}; + NamedConfig modeCreateOnewayConnection{"HOTKEY_MODE_CREATE_ONEWAY_CONNECTION", ""}; + + // Room operations + NamedConfig roomCreate{"HOTKEY_ROOM_CREATE", ""}; + NamedConfig roomMoveUp{"HOTKEY_ROOM_MOVE_UP", ""}; + NamedConfig roomMoveDown{"HOTKEY_ROOM_MOVE_DOWN", ""}; + NamedConfig roomMergeUp{"HOTKEY_ROOM_MERGE_UP", ""}; + NamedConfig roomMergeDown{"HOTKEY_ROOM_MERGE_DOWN", ""}; + NamedConfig roomDelete{"HOTKEY_ROOM_DELETE", "Del"}; + NamedConfig roomConnectNeighbors{"HOTKEY_ROOM_CONNECT_NEIGHBORS", ""}; + NamedConfig roomMoveToSelected{"HOTKEY_ROOM_MOVE_TO_SELECTED", ""}; + NamedConfig roomUpdateSelected{"HOTKEY_ROOM_UPDATE_SELECTED", ""}; + + private: + SUBGROUP(); + } hotkeys; + + struct NODISCARD CommsSettings final + { + // Colors for each communication type + NamedConfig tellColor{"COMMS_TELL_COLOR", QColor(Qt::cyan)}; + NamedConfig whisperColor{"COMMS_WHISPER_COLOR", QColor(135, 206, 250)}; // Light sky blue + NamedConfig groupColor{"COMMS_GROUP_COLOR", QColor(Qt::green)}; + NamedConfig askColor{"COMMS_ASK_COLOR", QColor(Qt::yellow)}; + NamedConfig sayColor{"COMMS_SAY_COLOR", QColor(Qt::white)}; + NamedConfig emoteColor{"COMMS_EMOTE_COLOR", QColor(Qt::magenta)}; + NamedConfig socialColor{"COMMS_SOCIAL_COLOR", QColor(255, 182, 193)}; // Light pink + NamedConfig yellColor{"COMMS_YELL_COLOR", QColor(Qt::red)}; + NamedConfig narrateColor{"COMMS_NARRATE_COLOR", QColor(255, 165, 0)}; // Orange + NamedConfig prayColor{"COMMS_PRAY_COLOR", QColor(173, 216, 230)}; // Light blue + NamedConfig shoutColor{"COMMS_SHOUT_COLOR", QColor(139, 0, 0)}; // Dark red + NamedConfig singColor{"COMMS_SING_COLOR", QColor(144, 238, 144)}; // Light green + NamedConfig backgroundColor{"COMMS_BG_COLOR", QColor(Qt::black)}; + + // Talker colors (based on GMCP Comm.Channel talker-type) + NamedConfig talkerYouColor{"COMMS_TALKER_YOU_COLOR", QColor(255, 215, 0)}; // Gold + NamedConfig talkerPlayerColor{"COMMS_TALKER_PLAYER_COLOR", QColor(Qt::white)}; + NamedConfig talkerNpcColor{"COMMS_TALKER_NPC_COLOR", QColor(192, 192, 192)}; // Silver/Gray + NamedConfig talkerAllyColor{"COMMS_TALKER_ALLY_COLOR", QColor(0, 255, 0)}; // Bright green + NamedConfig talkerNeutralColor{"COMMS_TALKER_NEUTRAL_COLOR", QColor(255, 255, 0)}; // Yellow + NamedConfig talkerEnemyColor{"COMMS_TALKER_ENEMY_COLOR", QColor(255, 0, 0)}; // Red + + // Font styling options + NamedConfig yellAllCaps{"COMMS_YELL_ALL_CAPS", true}; + NamedConfig whisperItalic{"COMMS_WHISPER_ITALIC", true}; + NamedConfig emoteItalic{"COMMS_EMOTE_ITALIC", true}; + + // Display options + NamedConfig showTimestamps{"COMMS_SHOW_TIMESTAMPS", false}; + NamedConfig saveLogOnExit{"COMMS_SAVE_LOG_ON_EXIT", false}; + NamedConfig logDirectory{"COMMS_LOG_DIR", ""}; + + // Tab muting (acts as a filter) + NamedConfig muteDirectTab{"COMMS_MUTE_DIRECT", false}; + NamedConfig muteLocalTab{"COMMS_MUTE_LOCAL", false}; + NamedConfig muteGlobalTab{"COMMS_MUTE_GLOBAL", false}; + + private: + SUBGROUP(); + } comms; + #define XFOREACH_NAMED_COLOR_OPTIONS(X) \ X(BACKGROUND, BACKGROUND_NAME) \ X(CONNECTION_NORMAL, CONNECTION_NORMAL_NAME) \ @@ -300,6 +454,10 @@ class NODISCARD Configuration final { int64_t startEpoch = 0; bool display = false; + NamedConfig gmcpBroadcast{"GMCP_BROADCAST_CLOCK", true}; // Enable GMCP clock broadcasting + NamedConfig gmcpBroadcastInterval{"GMCP_BROADCAST_INTERVAL", 2500}; // Update interval in milliseconds (default: 2.5 seconds = 1 MUME minute) + + MumeClockSettings(); private: SUBGROUP(); diff --git a/src/display/Filenames.cpp b/src/display/Filenames.cpp index 5c52577d6..5c033689f 100644 --- a/src/display/Filenames.cpp +++ b/src/display/Filenames.cpp @@ -4,18 +4,67 @@ #include "Filenames.h" +#include "../clock/mumemoment.h" #include "../configuration/configuration.h" #include "../global/Consts.h" #include "../global/EnumIndexedArray.h" #include "../global/NullPointerException.h" #include "../parser/AbstractParser-Commands.h" +#include #include #include #include #include +// Thread-safe storage for current season +namespace { +std::atomic g_currentSeason{MumeSeasonEnum::SPRING}; + +NODISCARD const char *seasonToString(MumeSeasonEnum season) +{ + switch (season) { + case MumeSeasonEnum::WINTER: + return "Winter"; + case MumeSeasonEnum::SPRING: + return "Spring"; + case MumeSeasonEnum::SUMMER: + return "Summer"; + case MumeSeasonEnum::AUTUMN: + return "Autumn"; + case MumeSeasonEnum::UNKNOWN: + default: + return "Spring"; // Default to Spring + } +} + +NODISCARD const char *textureSetToString(TextureSetEnum textureSet) +{ + switch (textureSet) { + case TextureSetEnum::CLASSIC: + return "Classic"; + case TextureSetEnum::MODERN: + return "Modern"; + case TextureSetEnum::CUSTOM: + return ""; // Custom uses resourcesDirectory directly + default: + return "Modern"; + } +} + +} // namespace + +void setCurrentSeason(MumeSeasonEnum season) +{ + g_currentSeason.store(season); +} + +MumeSeasonEnum getCurrentSeason() +{ + return g_currentSeason.load(); +} + // NOTE: This isn't used by the parser (currently only used for filenames). // If we were going to use it for parsing, then we'd probably want to // return special ArgRoadIndex that could match the direction combinations @@ -78,18 +127,119 @@ NODISCARD static const char *getFilenameSuffix(const E x) QString getResourceFilenameRaw(const QString &dir, const QString &name) { - const auto filename = QString("/%1/%2").arg(dir, name); + const auto &config = getConfig().canvas; + const auto textureSet = config.textureSet; + const auto enableSeasonalTextures = config.enableSeasonalTextures; + + // Determine the base directory for the texture set + QString setDir; + QString customBasePath; + + if (textureSet == TextureSetEnum::CUSTOM) { + // Use custom resources directory directly + customBasePath = config.resourcesDirectory; + } else { + // Use Classic or Modern from bundled or custom resources + setDir = textureSetToString(textureSet); + } + + // Determine which season to use + const char *seasonStr = nullptr; + if (dir == "pixmaps" && enableSeasonalTextures) { + // Only apply seasonal logic when seasonal textures are enabled + seasonStr = seasonToString(getCurrentSeason()); + } + + // Try multiple paths with fallback logic + QStringList pathsToTry; - // Check if the user provided a custom resource - auto custom = getConfig().canvas.resourcesDirectory + filename; - if (QFile{custom}.exists()) { - return custom; + if (textureSet == TextureSetEnum::CUSTOM) { + // Custom texture set paths + const auto baseFilename = QString("/%1/%2").arg(dir, name); + + if (seasonStr != nullptr) { + // Try: custom/pixmaps/[Season]/file.png + pathsToTry << customBasePath + QString("/%1/%2/%3").arg(dir, seasonStr, name); + } + // Try: custom/pixmaps/file.png + pathsToTry << customBasePath + baseFilename; + + // Fallback to Modern tileset for missing custom textures + const QString modernDir = "Modern"; + + // Try Modern with current season (if seasonal textures enabled) + if (seasonStr != nullptr) { + if (!config.resourcesDirectory.isEmpty()) { + pathsToTry << config.resourcesDirectory + QString("/%1/%2/%3/%4") + .arg(dir, modernDir, seasonStr, name); + } + pathsToTry << QString(":/%1/%2/%3/%4").arg(dir, modernDir, seasonStr, name); + } + + // Try Modern base folder + if (!config.resourcesDirectory.isEmpty()) { + pathsToTry << config.resourcesDirectory + QString("/%1/%2/%3") + .arg(dir, modernDir, name); + } + pathsToTry << QString(":/%1/%2/%3").arg(dir, modernDir, name); + + // Try Modern/Spring as final fallback for pixmaps + if (dir == "pixmaps") { + if (!config.resourcesDirectory.isEmpty()) { + pathsToTry << config.resourcesDirectory + QString("/%1/%2/Spring/%3") + .arg(dir, modernDir, name); + } + pathsToTry << QString(":/%1/%2/Spring/%3").arg(dir, modernDir, name); + } + } else { + // Classic or Modern texture sets + if (seasonStr != nullptr) { + // Try: resourcesDir/pixmaps/Modern/[Season]/file.png (custom location) + if (!config.resourcesDirectory.isEmpty()) { + pathsToTry << config.resourcesDirectory + QString("/%1/%2/%3/%4") + .arg(dir, setDir, seasonStr, name); + } + // Try: :pixmaps/Modern/[Season]/file.png (bundled) + pathsToTry << QString(":/%1/%2/%3/%4").arg(dir, setDir, seasonStr, name); + + // Try: resourcesDir/pixmaps/Modern/file.png (fallback without season, custom) + if (!config.resourcesDirectory.isEmpty()) { + pathsToTry << config.resourcesDirectory + QString("/%1/%2/%3") + .arg(dir, setDir, name); + } + // Try: :pixmaps/Modern/file.png (fallback without season, bundled) + pathsToTry << QString(":/%1/%2/%3").arg(dir, setDir, name); + } else { + // Seasonal textures disabled - try base folder first, then Spring as fallback + if (!config.resourcesDirectory.isEmpty()) { + pathsToTry << config.resourcesDirectory + QString("/%1/%2/%3") + .arg(dir, setDir, name); + } + pathsToTry << QString(":/%1/%2/%3").arg(dir, setDir, name); + + // For Modern tileset with seasonal disabled, fallback to Spring for pixmaps + if (dir == "pixmaps" && textureSet == TextureSetEnum::MODERN) { + if (!config.resourcesDirectory.isEmpty()) { + pathsToTry << config.resourcesDirectory + QString("/%1/%2/Spring/%3") + .arg(dir, setDir, name); + } + pathsToTry << QString(":/%1/%2/Spring/%3").arg(dir, setDir, name); + } + } + } + + // Try each path in order + for (const auto &path : pathsToTry) { + if (QFile{path}.exists()) { + return path; + } } - // Fallback to the qrc resource - const auto qrc = ":" + filename; + // Final fallback to original bundled resource location (without texture set) + const auto qrc = QString(":/%1/%2").arg(dir, name); if (!QFile{qrc}.exists()) { - qWarning() << "WARNING:" << dir << filename << "does not exist."; + qWarning() << "WARNING: Resource not found:" << dir << "/" << name + << "(tried" << pathsToTry.size() << "locations)"; } return qrc; } diff --git a/src/display/Filenames.h b/src/display/Filenames.h index b89e0ca49..14fae90e7 100644 --- a/src/display/Filenames.h +++ b/src/display/Filenames.h @@ -3,12 +3,17 @@ // Copyright (C) 2019 The MMapper Authors // Author: Nils Schimmelmann (Jahara) +#include "../clock/mumemoment.h" #include "../group/mmapper2character.h" #include "../map/mmapper2room.h" #include "RoadIndex.h" #include +// Season management for texture loading +extern void setCurrentSeason(MumeSeasonEnum season); +NODISCARD extern MumeSeasonEnum getCurrentSeason(); + NODISCARD extern QString getResourceFilenameRaw(const QString &dir, const QString &name); NODISCARD extern QString getPixmapFilenameRaw(const QString &name); NODISCARD extern QString getPixmapFilename(RoomTerrainEnum); diff --git a/src/display/MapBatches.h b/src/display/MapBatches.h index 86e4c42c1..53974a40c 100644 --- a/src/display/MapBatches.h +++ b/src/display/MapBatches.h @@ -29,7 +29,7 @@ struct NODISCARD LayerMeshes final DEFAULT_MOVES_DELETE_COPIES(LayerMeshes); ~LayerMeshes() = default; - void render(int thisLayer, int focusedLayer); + void render(int thisLayer, int focusedLayer, const glm::vec3 &playerPos, bool isNight); explicit operator bool() const { return isValid; } }; @@ -68,6 +68,7 @@ struct NODISCARD MapBatches final BatchedMeshes batchedMeshes; BatchedConnectionMeshes connectionMeshes; BatchedRoomNames roomNameBatches; + bool isNight = false; // True if current time is night (for darker tinting) MapBatches() = default; ~MapBatches() = default; diff --git a/src/display/MapCanvasData.h b/src/display/MapCanvasData.h index 886c625bf..2100dd821 100644 --- a/src/display/MapCanvasData.h +++ b/src/display/MapCanvasData.h @@ -166,6 +166,7 @@ struct NODISCARD MapCanvasInputState bool m_mouseRightPressed = false; bool m_mouseLeftPressed = false; + bool m_mouseMiddlePressed = false; bool m_altPressed = false; bool m_ctrlPressed = false; @@ -196,6 +197,15 @@ struct NODISCARD MapCanvasInputState std::optional m_infoMarkSelectionMove; NODISCARD bool hasInfomarkSelectionMove() const { return m_infoMarkSelectionMove.has_value(); } + struct NODISCARD CameraRotationState final + { + glm::vec2 initialMousePos; + float initialVerticalAngle; + float initialHorizontalAngle; + }; + std::optional m_cameraRotation; + NODISCARD bool isCameraRotating() const { return m_cameraRotation.has_value(); } + std::shared_ptr m_connectionSelection; PrespammedPath &m_prespammedPath; diff --git a/src/display/mapcanvas.cpp b/src/display/mapcanvas.cpp index 5aeb66fff..fedce35d8 100644 --- a/src/display/mapcanvas.cpp +++ b/src/display/mapcanvas.cpp @@ -6,6 +6,7 @@ #include "mapcanvas.h" +#include "../clock/mumemoment.h" #include "../configuration/configuration.h" #include "../global/parserutils.h" #include "../global/progresscounter.h" @@ -18,7 +19,9 @@ #include "../map/roomid.h" #include "../mapdata/mapdata.h" #include "../mapdata/roomselection.h" +#include "Filenames.h" #include "InfomarkSelection.h" +#include "MapCanvasConfig.h" #include "MapCanvasData.h" #include "MapCanvasRoomDrawer.h" #include "connectionselection.h" @@ -109,19 +112,9 @@ void MapCanvas::slot_layerReset() layerChanged(); } -void MapCanvas::slot_setCanvasMouseMode(const CanvasMouseModeEnum mode) +void MapCanvas::restoreCursorForMouseMode() { - // FIXME: This probably isn't what you actually want here, - // since it clears selections when re-choosing the same mode, - // or when changing to a compatible mode. - // - // e.g. RAYPICK_ROOMS vs SELECT_CONNECTIONS, - // or if you're trying to use MOVE to pan to reach more rooms - // (granted, the latter isn't "necessary" because you can use - // scrollbars or use the new zoom-recenter feature). - slot_clearAllSelections(); - - switch (mode) { + switch (m_canvasMouseMode) { case CanvasMouseModeEnum::MOVE: setCursor(Qt::OpenHandCursor); break; @@ -142,8 +135,22 @@ void MapCanvas::slot_setCanvasMouseMode(const CanvasMouseModeEnum mode) setCursor(Qt::ArrowCursor); break; } +} + +void MapCanvas::slot_setCanvasMouseMode(const CanvasMouseModeEnum mode) +{ + // FIXME: This probably isn't what you actually want here, + // since it clears selections when re-choosing the same mode, + // or when changing to a compatible mode. + // + // e.g. RAYPICK_ROOMS vs SELECT_CONNECTIONS, + // or if you're trying to use MOVE to pan to reach more rooms + // (granted, the latter isn't "necessary" because you can use + // scrollbars or use the new zoom-recenter feature). + slot_clearAllSelections(); m_canvasMouseMode = mode; + restoreCursorForMouseMode(); m_selectedArea = false; selectionChanged(); } @@ -354,6 +361,48 @@ void MapCanvas::slot_createRoom() } } +void MapCanvas::slot_onSeasonChanged(MumeSeasonEnum newSeason) +{ + if (!getConfig().canvas.enableSeasonalTextures) { + return; // Don't reload if seasonal textures are disabled + } + + qInfo() << "Season changed to:" << static_cast(newSeason) << "- Reloading textures..."; + + // Update the current season for filename resolution + setCurrentSeason(newSeason); + + // Reload all textures + makeCurrent(); + m_textures.destroyAll(); + initTextures(); + doneCurrent(); + + // Mark batches as dirty to trigger redraw + m_diff.resetExistingMeshesAndIgnorePendingRemesh(); + slot_requestUpdate(); + + qInfo() << "Texture reload complete."; +} + +void MapCanvas::slot_reloadTextures() +{ + qInfo() << "Texture settings changed - Reloading textures..."; + + // Reload all textures with new settings + makeCurrent(); + m_textures.destroyAll(); + initTextures(); + doneCurrent(); + + // Force complete mesh rebuild and redraw + m_batches.resetExistingMeshesButKeepPendingRemesh(); + m_diff.resetExistingMeshesAndIgnorePendingRemesh(); + graphicsSettingsChanged(); + + qInfo() << "Texture reload complete."; +} + // REVISIT: This function doesn't need to return a shared ptr. Consider refactoring InfomarkSelection? std::shared_ptr MapCanvas::getInfomarkSelection(const MouseSel &sel) { @@ -412,12 +461,14 @@ void MapCanvas::mousePressEvent(QMouseEvent *const event) { const bool hasLeftButton = (event->buttons() & Qt::LeftButton) != 0u; const bool hasRightButton = (event->buttons() & Qt::RightButton) != 0u; + const bool hasMiddleButton = (event->buttons() & Qt::MiddleButton) != 0u; const bool hasCtrl = (event->modifiers() & Qt::CTRL) != 0u; - MAYBE_UNUSED const bool hasAlt = (event->modifiers() & Qt::ALT) != 0u; + const bool hasAlt = (event->modifiers() & Qt::ALT) != 0u; m_sel1 = m_sel2 = getUnprojectedMouseSel(event); m_mouseLeftPressed = hasLeftButton; m_mouseRightPressed = hasRightButton; + m_mouseMiddlePressed = hasMiddleButton; if (event->button() == Qt::ForwardButton) { slot_layerUp(); @@ -425,6 +476,14 @@ void MapCanvas::mousePressEvent(QMouseEvent *const event) } else if (event->button() == Qt::BackButton) { slot_layerDown(); return event->accept(); + } else if (hasMiddleButton && hasAlt && !MapCanvasConfig::isAutoTilt()) { + // Alt + Middle Mouse: Camera rotation (only when auto-tilt is disabled) + auto &advanced = setConfig().canvas.advanced; + m_cameraRotation.emplace(CameraRotationState{getMouseCoords(event), + advanced.verticalAngle.getFloat(), + advanced.horizontalAngle.getFloat()}); + setCursor(Qt::SizeAllCursor); + return event->accept(); } else if (!m_mouseLeftPressed && m_mouseRightPressed) { if (m_canvasMouseMode == CanvasMouseModeEnum::MOVE && hasSel1()) { // Select the room under the cursor @@ -586,6 +645,31 @@ void MapCanvas::mousePressEvent(QMouseEvent *const event) void MapCanvas::mouseMoveEvent(QMouseEvent *const event) { + // Handle camera rotation with Alt + Middle Mouse + if (isCameraRotating() && m_mouseMiddlePressed) { + const glm::vec2 currentMousePos = getMouseCoords(event); + const glm::vec2 delta = currentMousePos - m_cameraRotation->initialMousePos; + + // Camera rotation sensitivity: 1.0 degree per pixel + constexpr float ROTATION_SENSITIVITY = 0.3f; + + auto &advanced = setConfig().canvas.advanced; + + // Horizontal mouse movement controls horizontal angle (yaw) + const float newHorizontalAngle = m_cameraRotation->initialHorizontalAngle + + (delta.x * ROTATION_SENSITIVITY); + advanced.horizontalAngle.setFloat(newHorizontalAngle); + + // Vertical mouse movement controls vertical angle (pitch) + // Inverted: moving mouse down should decrease pitch angle + const float newVerticalAngle = m_cameraRotation->initialVerticalAngle + + (delta.y * ROTATION_SENSITIVITY); + advanced.verticalAngle.setFloat(newVerticalAngle); + + slot_requestUpdate(); + return event->accept(); + } + const bool hasLeftButton = (event->buttons() & Qt::LeftButton) != 0u; if (m_canvasMouseMode != CanvasMouseModeEnum::MOVE) { @@ -723,6 +807,14 @@ void MapCanvas::mouseReleaseEvent(QMouseEvent *const event) m_mouseRightPressed = false; } + // Handle camera rotation release + if (event->button() == Qt::MiddleButton && isCameraRotating()) { + m_cameraRotation.reset(); + m_mouseMiddlePressed = false; + restoreCursorForMouseMode(); + return event->accept(); + } + switch (m_canvasMouseMode) { case CanvasMouseModeEnum::SELECT_INFOMARKS: setCursor(Qt::ArrowCursor); @@ -1017,6 +1109,12 @@ void MapCanvas::infomarksChanged() update(); } +void MapCanvas::mapBatchesChanged() +{ + m_batches.mapBatches.reset(); + update(); +} + void MapCanvas::layerChanged() { update(); diff --git a/src/display/mapcanvas.h b/src/display/mapcanvas.h index aa24f3341..1ccbe3e40 100644 --- a/src/display/mapcanvas.h +++ b/src/display/mapcanvas.h @@ -46,6 +46,7 @@ class QOpenGLDebugMessage; class QWheelEvent; class QWidget; class RoomSelFakeGL; +enum class MumeSeasonEnum : uint8_t; class NODISCARD_QOBJECT MapCanvas final : public QOpenGLWidget, private MapCanvasViewport, @@ -145,6 +146,8 @@ class NODISCARD_QOBJECT MapCanvas final : public QOpenGLWidget, GLFont m_glFont; Batches m_batches; MapCanvasTextures m_textures; + SharedMMTexture m_backgroundTexture; + QString m_backgroundImagePath; MapData &m_data; Mmapper2Group &m_groupManager; OptionStatus m_graphicsOptionsStatus; @@ -187,6 +190,7 @@ class NODISCARD_QOBJECT MapCanvas final : public QOpenGLWidget, private: void onMovement(); + void restoreCursorForMouseMode(); private: void reportGLVersion(); @@ -241,6 +245,8 @@ class NODISCARD_QOBJECT MapCanvas final : public QOpenGLWidget, void updateInfomarkBatches(); void actuallyPaintGL(); + void renderBackgroundImage(); + void loadBackgroundImageIfNeeded(); void paintMap(); void renderMapBatches(); void paintBatchedInfomarks(); @@ -259,6 +265,7 @@ class NODISCARD_QOBJECT MapCanvas final : public QOpenGLWidget, public: void slot_rebuildMeshes() { forceUpdateMeshes(); } void infomarksChanged(); + void mapBatchesChanged(); void layerChanged(); void slot_mapChanged(); void slot_requestUpdate(); @@ -292,6 +299,8 @@ class NODISCARD_QOBJECT MapCanvas final : public QOpenGLWidget, public slots: void slot_onForcedPositionChange(); void slot_createRoom(); + void slot_onSeasonChanged(MumeSeasonEnum newSeason); + void slot_reloadTextures(); void slot_setCanvasMouseMode(CanvasMouseModeEnum mode); diff --git a/src/global/ConfigEnums.h b/src/global/ConfigEnums.h index bbd585a91..339e3551a 100644 --- a/src/global/ConfigEnums.h +++ b/src/global/ConfigEnums.h @@ -9,3 +9,4 @@ enum class NODISCARD CharacterEncodingEnum { LATIN1, UTF8, ASCII }; enum class NODISCARD EnvironmentEnum { Unknown, Env32Bit, Env64Bit }; enum class NODISCARD MapModeEnum { PLAY, MAP, OFFLINE }; enum class NODISCARD PlatformEnum { Unknown, Windows, Mac, Linux }; +enum class NODISCARD TextureSetEnum { CLASSIC, MODERN, CUSTOM }; diff --git a/src/preferences/AdvancedGraphics.cpp b/src/preferences/AdvancedGraphics.cpp index 4f031390f..119cb36d6 100644 --- a/src/preferences/AdvancedGraphics.cpp +++ b/src/preferences/AdvancedGraphics.cpp @@ -14,6 +14,11 @@ #include #include +#include +#include +#include +#include +#include #include #include #include @@ -178,6 +183,136 @@ AdvancedGraphicsGroupBox::AdvancedGraphicsGroupBox(QGroupBox &groupBox) m_ssbs.emplace_back(std::make_unique(*this, *vertical, name, fp)); }; + // Background Image Controls (at top of Advanced Settings) + auto &advanced = setConfig().canvas.advanced; + + auto *bgImageCheckbox = new QCheckBox("Enable Background Image"); + bgImageCheckbox->setChecked(advanced.useBackgroundImage); + vertical->addWidget(bgImageCheckbox); + + auto *bgImageLayout = new QHBoxLayout(); + bgImageLayout->addSpacing(20); + + auto *bgImageButton = new QPushButton("Select Image..."); + bgImageLayout->addWidget(bgImageButton); + + auto *bgImageLabel = new QLabel(advanced.backgroundImagePath.isEmpty() + ? "No image selected" + : QFileInfo(advanced.backgroundImagePath).fileName()); + bgImageLabel->setWordWrap(true); + bgImageLayout->addWidget(bgImageLabel, 1); + + vertical->addLayout(bgImageLayout); + + // Fit mode dropdown + auto *fitModeLayout = new QHBoxLayout(); + fitModeLayout->addSpacing(20); + fitModeLayout->addWidget(new QLabel("Fit Mode:")); + + auto *fitModeCombo = new QComboBox(); + fitModeCombo->addItem("Fit (Letterbox)", 0); + fitModeCombo->addItem("Fill (Crop)", 1); + fitModeCombo->addItem("Stretch", 2); + fitModeCombo->addItem("Center", 3); + fitModeCombo->addItem("Tile", 4); + fitModeCombo->addItem("Focused (Follow Player)", 5); + fitModeCombo->setCurrentIndex(advanced.backgroundFitMode); + fitModeLayout->addWidget(fitModeCombo); + fitModeLayout->addStretch(); + + vertical->addLayout(fitModeLayout); + + // Opacity slider + auto *opacityLayout = new QHBoxLayout(); + opacityLayout->addSpacing(20); + opacityLayout->addWidget(new QLabel("Opacity:")); + + auto *opacitySlider = new QSlider(Qt::Horizontal); + opacitySlider->setRange(0, 100); + opacitySlider->setValue(static_cast(advanced.backgroundOpacity * 100.0f)); + opacitySlider->setTickPosition(QSlider::TicksBelow); + opacitySlider->setTickInterval(10); + opacityLayout->addWidget(opacitySlider); + + auto *opacityLabel = new QLabel(QString::number(static_cast(advanced.backgroundOpacity * 100.0f)) + "%"); + opacityLabel->setMinimumWidth(40); + opacityLayout->addWidget(opacityLabel); + + vertical->addLayout(opacityLayout); + + // Focused mode scale slider + auto *scaleLayout = new QHBoxLayout(); + scaleLayout->addSpacing(20); + scaleLayout->addWidget(new QLabel("Focus Scale:")); + + auto *scaleSlider = new QSlider(Qt::Horizontal); + scaleSlider->setRange(10, 10000); // 0.1x to 100.0x (stored as integer * 100) + scaleSlider->setValue(static_cast(advanced.backgroundFocusedScale * 100.0f)); + scaleSlider->setTickPosition(QSlider::TicksBelow); + scaleSlider->setTickInterval(1000); + scaleSlider->setSingleStep(10); // 0.1x increment for fine control + scaleLayout->addWidget(scaleSlider); + + auto *scaleSpinBox = new QDoubleSpinBox(); + scaleSpinBox->setRange(0.1, 100.0); + scaleSpinBox->setValue(advanced.backgroundFocusedScale); + scaleSpinBox->setDecimals(1); + scaleSpinBox->setSingleStep(0.1); + scaleSpinBox->setSuffix("x"); + scaleSpinBox->setMinimumWidth(80); + scaleLayout->addWidget(scaleSpinBox); + + vertical->addLayout(scaleLayout); + + // Focused mode X offset slider + auto *offsetXLayout = new QHBoxLayout(); + offsetXLayout->addSpacing(20); + offsetXLayout->addWidget(new QLabel("X Offset:")); + + auto *offsetXSlider = new QSlider(Qt::Horizontal); + offsetXSlider->setRange(-1000, 1000); // -1000 to 1000 + offsetXSlider->setValue(static_cast(advanced.backgroundFocusedOffsetX)); + offsetXSlider->setTickPosition(QSlider::TicksBelow); + offsetXSlider->setTickInterval(200); + offsetXSlider->setSingleStep(1); // Fine control with 1-unit steps + offsetXLayout->addWidget(offsetXSlider); + + auto *offsetXSpinBox = new QSpinBox(); + offsetXSpinBox->setRange(-1000, 1000); + offsetXSpinBox->setValue(static_cast(advanced.backgroundFocusedOffsetX)); + offsetXSpinBox->setMinimumWidth(70); + offsetXLayout->addWidget(offsetXSpinBox); + + vertical->addLayout(offsetXLayout); + + // Focused mode Y offset slider + auto *offsetYLayout = new QHBoxLayout(); + offsetYLayout->addSpacing(20); + offsetYLayout->addWidget(new QLabel("Y Offset:")); + + auto *offsetYSlider = new QSlider(Qt::Horizontal); + offsetYSlider->setRange(-1000, 1000); // -1000 to 1000 + offsetYSlider->setValue(static_cast(advanced.backgroundFocusedOffsetY)); + offsetYSlider->setTickPosition(QSlider::TicksBelow); + offsetYSlider->setTickInterval(200); + offsetYSlider->setSingleStep(1); // Fine control with 1-unit steps + offsetYLayout->addWidget(offsetYSlider); + + auto *offsetYSpinBox = new QSpinBox(); + offsetYSpinBox->setRange(-1000, 1000); + offsetYSpinBox->setValue(static_cast(advanced.backgroundFocusedOffsetY)); + offsetYSpinBox->setMinimumWidth(70); + offsetYLayout->addWidget(offsetYSpinBox); + + vertical->addLayout(offsetYLayout); + + // Initially hide all focused mode controls unless Focused mode is selected + scaleLayout->setEnabled(advanced.backgroundFitMode == 5); + offsetXLayout->setEnabled(advanced.backgroundFitMode == 5); + offsetYLayout->setEnabled(advanced.backgroundFitMode == 5); + + addLine(*vertical); // Separator line + auto *const checkboxDiag = new QCheckBox("Show Performance Stats"); checkboxDiag->setChecked(MapCanvasConfig::getShowPerfStats()); vertical->addWidget(checkboxDiag); @@ -191,6 +326,32 @@ AdvancedGraphicsGroupBox::AdvancedGraphicsGroupBox(QGroupBox &groupBox) autoTilt->setChecked(MapCanvasConfig::isAutoTilt()); vertical->addWidget(autoTilt); + // Layer Transparency slider + addLine(*vertical); + auto *layerTransLabel = new QLabel("Layer Transparency:"); + vertical->addWidget(layerTransLabel); + + auto *layerTransLayout = new QHBoxLayout(); + layerTransLayout->addSpacing(20); + + auto *layerTransSlider = new QSlider(Qt::Horizontal); + layerTransSlider->setRange(0, 100); + layerTransSlider->setValue(static_cast(getConfig().canvas.layerTransparency * 100.0f)); + layerTransSlider->setTickPosition(QSlider::TicksBelow); + layerTransSlider->setTickInterval(10); + layerTransLayout->addWidget(layerTransSlider); + + auto *layerTransValueLabel = new QLabel(QString::number(static_cast(getConfig().canvas.layerTransparency * 100.0f)) + "%"); + layerTransValueLabel->setMinimumWidth(40); + layerTransLayout->addWidget(layerTransValueLabel); + + vertical->addLayout(layerTransLayout); + + // Radial Transparency checkbox + auto *radialTransCheckbox = new QCheckBox("Radial Transparency (distance-based layer visibility)"); + radialTransCheckbox->setChecked(getConfig().canvas.enableRadialTransparency); + vertical->addWidget(radialTransCheckbox); + { // NOTE: This is a slight abuse of the interface, because we're taking a persistent reference. auto &advanced = setConfig().canvas.advanced; @@ -205,6 +366,105 @@ AdvancedGraphicsGroupBox::AdvancedGraphicsGroupBox(QGroupBox &groupBox) m_groupBox->setLayout(vertical); + // Background image connections + connect(bgImageCheckbox, &QCheckBox::stateChanged, this, [this, bgImageCheckbox](int) { + setConfig().canvas.advanced.useBackgroundImage = bgImageCheckbox->isChecked(); + graphicsSettingsChanged(); + }); + + connect(bgImageButton, &QPushButton::clicked, this, [this, bgImageLabel]() { + const QString filter = "Image Files (*.png *.jpg *.jpeg *.bmp *.gif *.tif *.tiff)"; + const QString currentPath = getConfig().canvas.advanced.backgroundImagePath; + const QString startDir = currentPath.isEmpty() + ? QDir::currentPath() + : QFileInfo(currentPath).absolutePath(); + + const QString fileName = QFileDialog::getOpenFileName( + m_groupBox, + "Select Background Image", + startDir, + filter); + + if (!fileName.isEmpty()) { + setConfig().canvas.advanced.backgroundImagePath = fileName; + bgImageLabel->setText(QFileInfo(fileName).fileName()); + graphicsSettingsChanged(); + } + }); + + connect(fitModeCombo, QOverload::of(&QComboBox::currentIndexChanged), + this, [this, scaleLayout, offsetXLayout, offsetYLayout](int index) { + setConfig().canvas.advanced.backgroundFitMode = index; + // Enable focused mode controls only when Focused mode (5) is selected + const bool isFocused = (index == 5); + scaleLayout->setEnabled(isFocused); + offsetXLayout->setEnabled(isFocused); + offsetYLayout->setEnabled(isFocused); + graphicsSettingsChanged(); + }); + + connect(opacitySlider, &QSlider::valueChanged, this, [this, opacityLabel](int value) { + const float opacity = static_cast(value) / 100.0f; + setConfig().canvas.advanced.backgroundOpacity = opacity; + opacityLabel->setText(QString::number(value) + "%"); + graphicsSettingsChanged(); + }); + + // Connect scale slider and spinbox + connect(scaleSlider, &QSlider::valueChanged, this, [this, scaleSpinBox](int value) { + const float scale = static_cast(value) / 100.0f; + scaleSpinBox->blockSignals(true); + scaleSpinBox->setValue(scale); + scaleSpinBox->blockSignals(false); + setConfig().canvas.advanced.backgroundFocusedScale = scale; + graphicsSettingsChanged(); + }); + + connect(scaleSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), + this, [this, scaleSlider](double value) { + scaleSlider->blockSignals(true); + scaleSlider->setValue(static_cast(value * 100.0f)); + scaleSlider->blockSignals(false); + setConfig().canvas.advanced.backgroundFocusedScale = static_cast(value); + graphicsSettingsChanged(); + }); + + // Connect X offset slider and spinbox + connect(offsetXSlider, &QSlider::valueChanged, this, [this, offsetXSpinBox](int value) { + offsetXSpinBox->blockSignals(true); + offsetXSpinBox->setValue(value); + offsetXSpinBox->blockSignals(false); + setConfig().canvas.advanced.backgroundFocusedOffsetX = static_cast(value); + graphicsSettingsChanged(); + }); + + connect(offsetXSpinBox, QOverload::of(&QSpinBox::valueChanged), + this, [this, offsetXSlider](int value) { + offsetXSlider->blockSignals(true); + offsetXSlider->setValue(value); + offsetXSlider->blockSignals(false); + setConfig().canvas.advanced.backgroundFocusedOffsetX = static_cast(value); + graphicsSettingsChanged(); + }); + + // Connect Y offset slider and spinbox + connect(offsetYSlider, &QSlider::valueChanged, this, [this, offsetYSpinBox](int value) { + offsetYSpinBox->blockSignals(true); + offsetYSpinBox->setValue(value); + offsetYSpinBox->blockSignals(false); + setConfig().canvas.advanced.backgroundFocusedOffsetY = static_cast(value); + graphicsSettingsChanged(); + }); + + connect(offsetYSpinBox, QOverload::of(&QSpinBox::valueChanged), + this, [this, offsetYSlider](int value) { + offsetYSlider->blockSignals(true); + offsetYSlider->setValue(value); + offsetYSlider->blockSignals(false); + setConfig().canvas.advanced.backgroundFocusedOffsetY = static_cast(value); + graphicsSettingsChanged(); + }); + connect(checkbox3d, &QCheckBox::stateChanged, this, [this, checkbox3d, autoTilt](int) { const bool is3d = checkbox3d->isChecked(); MapCanvasConfig::set3dMode(is3d); @@ -225,6 +485,18 @@ AdvancedGraphicsGroupBox::AdvancedGraphicsGroupBox(QGroupBox &groupBox) graphicsSettingsChanged(); }); + connect(layerTransSlider, &QSlider::valueChanged, this, [this, layerTransValueLabel](int value) { + const float transparency = static_cast(value) / 100.0f; + setConfig().canvas.layerTransparency = transparency; + layerTransValueLabel->setText(QString::number(value) + "%"); + graphicsSettingsChanged(); + }); + + connect(radialTransCheckbox, &QCheckBox::stateChanged, this, [this, radialTransCheckbox](int) { + setConfig().canvas.enableRadialTransparency = radialTransCheckbox->isChecked(); + graphicsSettingsChanged(); + }); + MapCanvasConfig::registerChangeCallback(m_lifetime, [this, checkboxDiag, checkbox3d, autoTilt]() -> void { SignalBlocker sb1{*checkboxDiag}; diff --git a/src/preferences/graphicspage.cpp b/src/preferences/graphicspage.cpp index 905eb8bda..78b7f5ac6 100644 --- a/src/preferences/graphicspage.cpp +++ b/src/preferences/graphicspage.cpp @@ -90,6 +90,15 @@ GraphicsPage::GraphicsPage(QWidget *parent) } }); + connect(ui->tileSetComboBox, + qOverload(&QComboBox::currentIndexChanged), + this, + &GraphicsPage::slot_textureSetChanged); + connect(ui->enableSeasonalTilesCheckBox, + &QCheckBox::stateChanged, + this, + &GraphicsPage::slot_enableSeasonalTexturesStateChanged); + connect(m_advanced.get(), &AdvancedGraphicsGroupBox::sig_graphicsSettingsChanged, this, @@ -119,8 +128,19 @@ void GraphicsPage::slot_loadConfig() ui->drawNeedsUpdate->setChecked(settings.showMissingMapId.get()); ui->drawNotMappedExits->setChecked(settings.showUnmappedExits.get()); ui->drawDoorNames->setChecked(settings.drawDoorNames); + ui->drawUpperLayersTextured->setChecked(settings.drawUpperLayersTextured); ui->resourceLineEdit->setText(settings.resourcesDirectory); + + // Block signals to prevent texture reload when just loading config + ui->tileSetComboBox->blockSignals(true); + ui->enableSeasonalTilesCheckBox->blockSignals(true); + + ui->tileSetComboBox->setCurrentIndex(static_cast(settings.textureSet)); + ui->enableSeasonalTilesCheckBox->setChecked(settings.enableSeasonalTextures); + + ui->tileSetComboBox->blockSignals(false); + ui->enableSeasonalTilesCheckBox->blockSignals(false); } void GraphicsPage::changeColorClicked(XNamedColor &namedColor, QPushButton *const pushButton) @@ -168,3 +188,31 @@ void GraphicsPage::slot_drawUpperLayersTexturedStateChanged(int /*unused*/) setConfig().canvas.drawUpperLayersTextured = ui->drawUpperLayersTextured->isChecked(); graphicsSettingsChanged(); } + +void GraphicsPage::slot_textureSetChanged(int index) +{ + auto &config = setConfig().canvas; + switch (index) { + case 0: + config.textureSet = TextureSetEnum::CLASSIC; + break; + case 1: + config.textureSet = TextureSetEnum::MODERN; + break; + case 2: + config.textureSet = TextureSetEnum::CUSTOM; + break; + default: + config.textureSet = TextureSetEnum::MODERN; + break; + } + graphicsSettingsChanged(); + emit sig_textureSettingsChanged(); +} + +void GraphicsPage::slot_enableSeasonalTexturesStateChanged(int /*unused*/) +{ + setConfig().canvas.enableSeasonalTextures = ui->enableSeasonalTilesCheckBox->isChecked(); + graphicsSettingsChanged(); + emit sig_textureSettingsChanged(); +} diff --git a/src/preferences/graphicspage.h b/src/preferences/graphicspage.h index 78719057d..19046dbce 100644 --- a/src/preferences/graphicspage.h +++ b/src/preferences/graphicspage.h @@ -37,6 +37,7 @@ class NODISCARD_QOBJECT GraphicsPage final : public QWidget signals: void sig_graphicsSettingsChanged(); + void sig_textureSettingsChanged(); public slots: void slot_loadConfig(); @@ -46,6 +47,8 @@ public slots: void slot_drawNotMappedExitsStateChanged(int); void slot_drawDoorNamesStateChanged(int); void slot_drawUpperLayersTexturedStateChanged(int); + void slot_textureSetChanged(int index); + void slot_enableSeasonalTexturesStateChanged(int state); // this slot just calls the signal... not useful void slot_graphicsSettingsChanged() { graphicsSettingsChanged(); } }; diff --git a/src/preferences/graphicspage.ui b/src/preferences/graphicspage.ui index 789f1ae28..d3d510ba3 100644 --- a/src/preferences/graphicspage.ui +++ b/src/preferences/graphicspage.ui @@ -300,17 +300,81 @@ - Modding + Tiles - - + + + 9 + + + 9 + + + 9 + + + 9 + + + 6 + + + + + Tile Set: + + + tileSetComboBox + + + + + + + + Classic + + + + + Modern + + + + + Custom + + + + + + + + Enable Seasonal Tiles + + + Automatically switch Tiles based on MUME in-game season + + + + + + + Custom Resource Path: + + + resourceLineEdit + + + + Path to resources - + Select diff --git a/src/resources/mmapper2.qrc b/src/resources/mmapper2.qrc index 843a3408b..23cc59f96 100644 --- a/src/resources/mmapper2.qrc +++ b/src/resources/mmapper2.qrc @@ -39,6 +39,7 @@ icons/generalcfg.png icons/graphicscfg.png icons/group-recolor.png + icons/hotkeys.png icons/infomarkcreate.png icons/infomarkdelete.png icons/infomarkedit.png @@ -80,136 +81,386 @@ icons/roommoveup.png icons/roomselection.png icons/save.png + icons/comms.png icons/terminal.png icons/viewmag+.png icons/viewmag-.png icons/viewmagfit.png - pixmaps/char-arrows.png - pixmaps/char-room-sel.png - pixmaps/door-down.png - pixmaps/door-east.png - pixmaps/door-north.png - pixmaps/door-south.png - pixmaps/door-up.png - pixmaps/door-west.png - pixmaps/exit-climb-down.png - pixmaps/exit-climb-up.png - pixmaps/exit-down.png - pixmaps/exit-up.png - pixmaps/load-armour.png - pixmaps/load-attention.png - pixmaps/load-boat.png - pixmaps/load-clock.png - pixmaps/load-coach.png - pixmaps/load-darkword.png - pixmaps/load-deathtrap.png - pixmaps/load-equipment.png - pixmaps/load-ferry.png - pixmaps/load-food.png - pixmaps/load-herb.png - pixmaps/load-horse.png - pixmaps/load-key.png - pixmaps/load-mail.png - pixmaps/load-mule.png - pixmaps/load-pack.png - pixmaps/load-rohirrim.png - pixmaps/load-stable.png - pixmaps/load-trained.png - pixmaps/load-treasure.png - pixmaps/load-warg.png - pixmaps/load-watch.png - pixmaps/load-water.png - pixmaps/load-weapon.png - pixmaps/load-whiteword.png - pixmaps/mellon.png - pixmaps/mob-aggmob.png - pixmaps/mob-armourshop.png - pixmaps/mob-clericguild.png - pixmaps/mob-elitemob.png - pixmaps/mob-foodshop.png - pixmaps/mob-guild.png - pixmaps/mob-mageguild.png - pixmaps/mob-milkable.png - pixmaps/mob-passivemob.png - pixmaps/mob-petshop.png - pixmaps/mob-questmob.png - pixmaps/mob-rangerguild.png - pixmaps/mob-rattlesnake.png - pixmaps/mob-rent.png - pixmaps/mob-scoutguild.png - pixmaps/mob-shop.png - pixmaps/mob-smob.png - pixmaps/mob-warriorguild.png - pixmaps/mob-weaponshop.png - pixmaps/no-ride.png - pixmaps/road-all.png - pixmaps/road-e.png - pixmaps/road-es.png - pixmaps/road-esw.png - pixmaps/road-ew.png - pixmaps/road-n.png - pixmaps/road-ne.png - pixmaps/road-nes.png - pixmaps/road-new.png - pixmaps/road-none.png - pixmaps/road-ns.png - pixmaps/road-nsw.png - pixmaps/road-nw.png - pixmaps/road-s.png - pixmaps/road-sw.png - pixmaps/road-w.png - pixmaps/room-highlight.png - pixmaps/room-sel-distant.png - pixmaps/room-sel-move-bad.png - pixmaps/room-sel-move-good.png - pixmaps/room-sel.png - pixmaps/stream-in-down.png - pixmaps/stream-in-east.png - pixmaps/stream-in-north.png - pixmaps/stream-in-south.png - pixmaps/stream-in-up.png - pixmaps/stream-in-west.png - pixmaps/stream-out-down.png - pixmaps/stream-out-east.png - pixmaps/stream-out-north.png - pixmaps/stream-out-south.png - pixmaps/stream-out-up.png - pixmaps/stream-out-west.png - pixmaps/terrain-brush.png - pixmaps/terrain-cavern.png - pixmaps/terrain-city.png - pixmaps/terrain-field.png - pixmaps/terrain-forest.png - pixmaps/terrain-hills.png - pixmaps/terrain-indoors.png - pixmaps/terrain-mountains.png - pixmaps/terrain-rapids.png - pixmaps/terrain-road.png - pixmaps/terrain-shallow.png - pixmaps/terrain-tunnel.png - pixmaps/terrain-undefined.png - pixmaps/terrain-underwater.png - pixmaps/terrain-water.png - pixmaps/trail-all.png - pixmaps/trail-e.png - pixmaps/trail-es.png - pixmaps/trail-esw.png - pixmaps/trail-ew.png - pixmaps/trail-n.png - pixmaps/trail-ne.png - pixmaps/trail-nes.png - pixmaps/trail-new.png - pixmaps/trail-none.png - pixmaps/trail-ns.png - pixmaps/trail-nsw.png - pixmaps/trail-nw.png - pixmaps/trail-s.png - pixmaps/trail-sw.png - pixmaps/trail-w.png - pixmaps/wall-east.png - pixmaps/wall-north.png - pixmaps/wall-south.png - pixmaps/wall-west.png + pixmaps/Classic/char-arrows.png + pixmaps/Classic/char-room-sel.png + pixmaps/Classic/door-down.png + pixmaps/Classic/door-east.png + pixmaps/Classic/door-north.png + pixmaps/Classic/door-south.png + pixmaps/Classic/door-up.png + pixmaps/Classic/door-west.png + pixmaps/Classic/exit-climb-down.png + pixmaps/Classic/exit-climb-up.png + pixmaps/Classic/exit-down.png + pixmaps/Classic/exit-up.png + pixmaps/Classic/load-armour.png + pixmaps/Classic/load-attention.png + pixmaps/Classic/load-boat.png + pixmaps/Classic/load-clock.png + pixmaps/Classic/load-coach.png + pixmaps/Classic/load-darkword.png + pixmaps/Classic/load-deathtrap.png + pixmaps/Classic/load-equipment.png + pixmaps/Classic/load-ferry.png + pixmaps/Classic/load-food.png + pixmaps/Classic/load-herb.png + pixmaps/Classic/load-horse.png + pixmaps/Classic/load-key.png + pixmaps/Classic/load-mail.png + pixmaps/Classic/load-mule.png + pixmaps/Classic/load-pack.png + pixmaps/Classic/load-rohirrim.png + pixmaps/Classic/load-stable.png + pixmaps/Classic/load-trained.png + pixmaps/Classic/load-treasure.png + pixmaps/Classic/load-warg.png + pixmaps/Classic/load-watch.png + pixmaps/Classic/load-water.png + pixmaps/Classic/load-weapon.png + pixmaps/Classic/load-whiteword.png + pixmaps/Classic/mellon.png + pixmaps/Classic/mob-aggmob.png + pixmaps/Classic/mob-armourshop.png + pixmaps/Classic/mob-clericguild.png + pixmaps/Classic/mob-elitemob.png + pixmaps/Classic/mob-foodshop.png + pixmaps/Classic/mob-guild.png + pixmaps/Classic/mob-mageguild.png + pixmaps/Classic/mob-milkable.png + pixmaps/Classic/mob-passivemob.png + pixmaps/Classic/mob-petshop.png + pixmaps/Classic/mob-questmob.png + pixmaps/Classic/mob-rangerguild.png + pixmaps/Classic/mob-rattlesnake.png + pixmaps/Classic/mob-rent.png + pixmaps/Classic/mob-scoutguild.png + pixmaps/Classic/mob-shop.png + pixmaps/Classic/mob-smob.png + pixmaps/Classic/mob-warriorguild.png + pixmaps/Classic/mob-weaponshop.png + pixmaps/Classic/no-ride.png + pixmaps/Classic/road-all.png + pixmaps/Classic/road-e.png + pixmaps/Classic/road-es.png + pixmaps/Classic/road-esw.png + pixmaps/Classic/road-ew.png + pixmaps/Classic/road-n.png + pixmaps/Classic/road-ne.png + pixmaps/Classic/road-nes.png + pixmaps/Classic/road-new.png + pixmaps/Classic/road-none.png + pixmaps/Classic/road-ns.png + pixmaps/Classic/road-nsw.png + pixmaps/Classic/road-nw.png + pixmaps/Classic/road-s.png + pixmaps/Classic/road-sw.png + pixmaps/Classic/road-w.png + pixmaps/Classic/room-highlight.png + pixmaps/Classic/room-sel-distant.png + pixmaps/Classic/room-sel-move-bad.png + pixmaps/Classic/room-sel-move-good.png + pixmaps/Classic/room-sel.png + pixmaps/Classic/stream-in-down.png + pixmaps/Classic/stream-in-east.png + pixmaps/Classic/stream-in-north.png + pixmaps/Classic/stream-in-south.png + pixmaps/Classic/stream-in-up.png + pixmaps/Classic/stream-in-west.png + pixmaps/Classic/stream-out-down.png + pixmaps/Classic/stream-out-east.png + pixmaps/Classic/stream-out-north.png + pixmaps/Classic/stream-out-south.png + pixmaps/Classic/stream-out-up.png + pixmaps/Classic/stream-out-west.png + pixmaps/Classic/terrain-brush.png + pixmaps/Classic/terrain-cavern.png + pixmaps/Classic/terrain-city.png + pixmaps/Classic/terrain-field.png + pixmaps/Classic/terrain-forest.png + pixmaps/Classic/terrain-hills.png + pixmaps/Classic/terrain-indoors.png + pixmaps/Classic/terrain-mountains.png + pixmaps/Classic/terrain-rapids.png + pixmaps/Classic/terrain-road.png + pixmaps/Classic/terrain-shallow.png + pixmaps/Classic/terrain-tunnel.png + pixmaps/Classic/terrain-undefined.png + pixmaps/Classic/terrain-underwater.png + pixmaps/Classic/terrain-water.png + pixmaps/Classic/trail-all.png + pixmaps/Classic/trail-e.png + pixmaps/Classic/trail-es.png + pixmaps/Classic/trail-esw.png + pixmaps/Classic/trail-ew.png + pixmaps/Classic/trail-n.png + pixmaps/Classic/trail-ne.png + pixmaps/Classic/trail-nes.png + pixmaps/Classic/trail-new.png + pixmaps/Classic/trail-none.png + pixmaps/Classic/trail-ns.png + pixmaps/Classic/trail-nsw.png + pixmaps/Classic/trail-nw.png + pixmaps/Classic/trail-s.png + pixmaps/Classic/trail-sw.png + pixmaps/Classic/trail-w.png + pixmaps/Classic/wall-east.png + pixmaps/Classic/wall-north.png + pixmaps/Classic/wall-south.png + pixmaps/Classic/wall-west.png + pixmaps/Modern/char-arrows.png + pixmaps/Modern/char-room-sel.png + pixmaps/Modern/door-down.png + pixmaps/Modern/door-east.png + pixmaps/Modern/door-north.png + pixmaps/Modern/door-south.png + pixmaps/Modern/door-up.png + pixmaps/Modern/door-west.png + pixmaps/Modern/exit-climb-down.png + pixmaps/Modern/exit-climb-up.png + pixmaps/Modern/exit-down.png + pixmaps/Modern/exit-up.png + pixmaps/Modern/load-armour.png + pixmaps/Modern/load-attention.png + pixmaps/Modern/load-boat.png + pixmaps/Modern/load-clock.png + pixmaps/Modern/load-coach.png + pixmaps/Modern/load-darkword.png + pixmaps/Modern/load-deathtrap.png + pixmaps/Modern/load-equipment.png + pixmaps/Modern/load-ferry.png + pixmaps/Modern/load-food.png + pixmaps/Modern/load-herb.png + pixmaps/Modern/load-horse.png + pixmaps/Modern/load-key.png + pixmaps/Modern/load-mail.png + pixmaps/Modern/load-mule.png + pixmaps/Modern/load-pack.png + pixmaps/Modern/load-rohirrim.png + pixmaps/Modern/load-stable.png + pixmaps/Modern/load-trained.png + pixmaps/Modern/load-treasure.png + pixmaps/Modern/load-warg.png + pixmaps/Modern/load-watch.png + pixmaps/Modern/load-water.png + pixmaps/Modern/load-weapon.png + pixmaps/Modern/load-whiteword.png + pixmaps/Modern/mellon.png + pixmaps/Modern/mob-aggmob.png + pixmaps/Modern/mob-armourshop.png + pixmaps/Modern/mob-clericguild.png + pixmaps/Modern/mob-elitemob.png + pixmaps/Modern/mob-foodshop.png + pixmaps/Modern/mob-guild.png + pixmaps/Modern/mob-mageguild.png + pixmaps/Modern/mob-milkable.png + pixmaps/Modern/mob-passivemob.png + pixmaps/Modern/mob-petshop.png + pixmaps/Modern/mob-questmob.png + pixmaps/Modern/mob-rangerguild.png + pixmaps/Modern/mob-rattlesnake.png + pixmaps/Modern/mob-rent.png + pixmaps/Modern/mob-scoutguild.png + pixmaps/Modern/mob-shop.png + pixmaps/Modern/mob-smob.png + pixmaps/Modern/mob-warriorguild.png + pixmaps/Modern/mob-weaponshop.png + pixmaps/Modern/no-ride.png + pixmaps/Modern/Spring/road-all.png + pixmaps/Modern/Spring/road-e.png + pixmaps/Modern/Spring/road-es.png + pixmaps/Modern/Spring/road-esw.png + pixmaps/Modern/Spring/road-ew.png + pixmaps/Modern/Spring/road-n.png + pixmaps/Modern/Spring/road-ne.png + pixmaps/Modern/Spring/road-nes.png + pixmaps/Modern/Spring/road-new.png + pixmaps/Modern/Spring/road-none.png + pixmaps/Modern/Spring/road-ns.png + pixmaps/Modern/Spring/road-nsw.png + pixmaps/Modern/Spring/road-nw.png + pixmaps/Modern/Spring/road-s.png + pixmaps/Modern/Spring/road-sw.png + pixmaps/Modern/Spring/road-w.png + pixmaps/Modern/room-highlight.png + pixmaps/Modern/room-sel-distant.png + pixmaps/Modern/room-sel-move-bad.png + pixmaps/Modern/room-sel-move-good.png + pixmaps/Modern/room-sel.png + pixmaps/Modern/stream-in-down.png + pixmaps/Modern/stream-in-east.png + pixmaps/Modern/stream-in-north.png + pixmaps/Modern/stream-in-south.png + pixmaps/Modern/stream-in-up.png + pixmaps/Modern/stream-in-west.png + pixmaps/Modern/stream-out-down.png + pixmaps/Modern/stream-out-east.png + pixmaps/Modern/stream-out-north.png + pixmaps/Modern/stream-out-south.png + pixmaps/Modern/stream-out-up.png + pixmaps/Modern/stream-out-west.png + pixmaps/Modern/terrain-cavern.png + pixmaps/Modern/terrain-tunnel.png + pixmaps/Modern/terrain-underwater.png + pixmaps/Modern/Spring/terrain-brush.png + pixmaps/Modern/Spring/terrain-city.png + pixmaps/Modern/Spring/terrain-field.png + pixmaps/Modern/Spring/terrain-forest.png + pixmaps/Modern/Spring/terrain-hills.png + pixmaps/Modern/terrain-indoors.png + pixmaps/Modern/Spring/terrain-mountains.png + pixmaps/Modern/Spring/terrain-rapids.png + pixmaps/Modern/Spring/terrain-road.png + pixmaps/Modern/Spring/terrain-shallow.png + pixmaps/Modern/terrain-undefined.png + pixmaps/Modern/Spring/terrain-water.png + pixmaps/Modern/Spring/trail-all.png + pixmaps/Modern/Spring/trail-e.png + pixmaps/Modern/Spring/trail-es.png + pixmaps/Modern/Spring/trail-esw.png + pixmaps/Modern/Spring/trail-ew.png + pixmaps/Modern/Spring/trail-n.png + pixmaps/Modern/Spring/trail-ne.png + pixmaps/Modern/Spring/trail-nes.png + pixmaps/Modern/Spring/trail-new.png + pixmaps/Modern/Spring/trail-none.png + pixmaps/Modern/Spring/trail-ns.png + pixmaps/Modern/Spring/trail-nsw.png + pixmaps/Modern/Spring/trail-nw.png + pixmaps/Modern/Spring/trail-s.png + pixmaps/Modern/Spring/trail-sw.png + pixmaps/Modern/Spring/trail-w.png + pixmaps/Modern/Summer/road-all.png + pixmaps/Modern/Summer/road-e.png + pixmaps/Modern/Summer/road-es.png + pixmaps/Modern/Summer/road-esw.png + pixmaps/Modern/Summer/road-ew.png + pixmaps/Modern/Summer/road-n.png + pixmaps/Modern/Summer/road-ne.png + pixmaps/Modern/Summer/road-nes.png + pixmaps/Modern/Summer/road-new.png + pixmaps/Modern/Summer/road-none.png + pixmaps/Modern/Summer/road-ns.png + pixmaps/Modern/Summer/road-nsw.png + pixmaps/Modern/Summer/road-nw.png + pixmaps/Modern/Summer/road-s.png + pixmaps/Modern/Summer/road-sw.png + pixmaps/Modern/Summer/road-w.png + pixmaps/Modern/Summer/terrain-brush.png + pixmaps/Modern/Summer/terrain-city.png + pixmaps/Modern/Summer/terrain-field.png + pixmaps/Modern/Summer/terrain-forest.png + pixmaps/Modern/Summer/terrain-hills.png + pixmaps/Modern/Summer/terrain-mountains.png + pixmaps/Modern/Summer/terrain-rapids.png + pixmaps/Modern/Summer/terrain-shallow.png + pixmaps/Modern/Summer/terrain-water.png + pixmaps/Modern/Summer/trail-all.png + pixmaps/Modern/Summer/trail-e.png + pixmaps/Modern/Summer/trail-es.png + pixmaps/Modern/Summer/trail-esw.png + pixmaps/Modern/Summer/trail-ew.png + pixmaps/Modern/Summer/trail-n.png + pixmaps/Modern/Summer/trail-ne.png + pixmaps/Modern/Summer/trail-nes.png + pixmaps/Modern/Summer/trail-new.png + pixmaps/Modern/Summer/trail-none.png + pixmaps/Modern/Summer/trail-ns.png + pixmaps/Modern/Summer/trail-nsw.png + pixmaps/Modern/Summer/trail-nw.png + pixmaps/Modern/Summer/trail-s.png + pixmaps/Modern/Summer/trail-sw.png + pixmaps/Modern/Summer/trail-w.png + pixmaps/Modern/Autumn/road-all.png + pixmaps/Modern/Autumn/road-e.png + pixmaps/Modern/Autumn/road-es.png + pixmaps/Modern/Autumn/road-esw.png + pixmaps/Modern/Autumn/road-ew.png + pixmaps/Modern/Autumn/road-n.png + pixmaps/Modern/Autumn/road-ne.png + pixmaps/Modern/Autumn/road-nes.png + pixmaps/Modern/Autumn/road-new.png + pixmaps/Modern/Autumn/road-none.png + pixmaps/Modern/Autumn/road-ns.png + pixmaps/Modern/Autumn/road-nsw.png + pixmaps/Modern/Autumn/road-nw.png + pixmaps/Modern/Autumn/road-s.png + pixmaps/Modern/Autumn/road-sw.png + pixmaps/Modern/Autumn/road-w.png + pixmaps/Modern/Autumn/terrain-brush.png + pixmaps/Modern/Autumn/terrain-city.png + pixmaps/Modern/Autumn/terrain-field.png + pixmaps/Modern/Autumn/terrain-forest.png + pixmaps/Modern/Autumn/terrain-hills.png + pixmaps/Modern/Autumn/terrain-mountains.png + pixmaps/Modern/Autumn/terrain-rapids.png + pixmaps/Modern/Autumn/terrain-shallow.png + pixmaps/Modern/Autumn/terrain-water.png + pixmaps/Modern/Autumn/trail-all.png + pixmaps/Modern/Autumn/trail-e.png + pixmaps/Modern/Autumn/trail-es.png + pixmaps/Modern/Autumn/trail-esw.png + pixmaps/Modern/Autumn/trail-ew.png + pixmaps/Modern/Autumn/trail-n.png + pixmaps/Modern/Autumn/trail-ne.png + pixmaps/Modern/Autumn/trail-nes.png + pixmaps/Modern/Autumn/trail-new.png + pixmaps/Modern/Autumn/trail-none.png + pixmaps/Modern/Autumn/trail-ns.png + pixmaps/Modern/Autumn/trail-nsw.png + pixmaps/Modern/Autumn/trail-nw.png + pixmaps/Modern/Autumn/trail-s.png + pixmaps/Modern/Autumn/trail-sw.png + pixmaps/Modern/Autumn/trail-w.png + pixmaps/Modern/Winter/road-all.png + pixmaps/Modern/Winter/road-e.png + pixmaps/Modern/Winter/road-es.png + pixmaps/Modern/Winter/road-esw.png + pixmaps/Modern/Winter/road-ew.png + pixmaps/Modern/Winter/road-n.png + pixmaps/Modern/Winter/road-ne.png + pixmaps/Modern/Winter/road-nes.png + pixmaps/Modern/Winter/road-new.png + pixmaps/Modern/Winter/road-none.png + pixmaps/Modern/Winter/road-ns.png + pixmaps/Modern/Winter/road-nsw.png + pixmaps/Modern/Winter/road-nw.png + pixmaps/Modern/Winter/road-s.png + pixmaps/Modern/Winter/road-sw.png + pixmaps/Modern/Winter/road-w.png + pixmaps/Modern/Winter/terrain-brush.png + pixmaps/Modern/Winter/terrain-city.png + pixmaps/Modern/Winter/terrain-field.png + pixmaps/Modern/Winter/terrain-forest.png + pixmaps/Modern/Winter/terrain-hills.png + pixmaps/Modern/Winter/terrain-mountains.png + pixmaps/Modern/Winter/terrain-rapids.png + pixmaps/Modern/Winter/terrain-shallow.png + pixmaps/Modern/Winter/terrain-water.png + pixmaps/Modern/Winter/trail-all.png + pixmaps/Modern/Winter/trail-e.png + pixmaps/Modern/Winter/trail-es.png + pixmaps/Modern/Winter/trail-esw.png + pixmaps/Modern/Winter/trail-ew.png + pixmaps/Modern/Winter/trail-n.png + pixmaps/Modern/Winter/trail-ne.png + pixmaps/Modern/Winter/trail-nes.png + pixmaps/Modern/Winter/trail-new.png + pixmaps/Modern/Winter/trail-none.png + pixmaps/Modern/Winter/trail-ns.png + pixmaps/Modern/Winter/trail-nsw.png + pixmaps/Modern/Winter/trail-nw.png + pixmaps/Modern/Winter/trail-s.png + pixmaps/Modern/Winter/trail-sw.png + pixmaps/Modern/Winter/trail-w.png + pixmaps/Modern/wall-east.png + pixmaps/Modern/wall-north.png + pixmaps/Modern/wall-south.png + pixmaps/Modern/wall-west.png shaders/legacy/font/frag.glsl shaders/legacy/font/vert.glsl shaders/legacy/plain/acolor/frag.glsl diff --git a/src/resources/pixmaps/Classic/char-arrows.png b/src/resources/pixmaps/Classic/char-arrows.png new file mode 100644 index 000000000..2a775c09a Binary files /dev/null and b/src/resources/pixmaps/Classic/char-arrows.png differ diff --git a/src/resources/pixmaps/Classic/char-room-sel.png b/src/resources/pixmaps/Classic/char-room-sel.png new file mode 100644 index 000000000..888423d24 Binary files /dev/null and b/src/resources/pixmaps/Classic/char-room-sel.png differ diff --git a/src/resources/pixmaps/Classic/door-down.png b/src/resources/pixmaps/Classic/door-down.png new file mode 100644 index 000000000..ec4c461c6 Binary files /dev/null and b/src/resources/pixmaps/Classic/door-down.png differ diff --git a/src/resources/pixmaps/Classic/door-east.png b/src/resources/pixmaps/Classic/door-east.png new file mode 100644 index 000000000..ae133dc8b Binary files /dev/null and b/src/resources/pixmaps/Classic/door-east.png differ diff --git a/src/resources/pixmaps/Classic/door-north.png b/src/resources/pixmaps/Classic/door-north.png new file mode 100644 index 000000000..88614ae2c Binary files /dev/null and b/src/resources/pixmaps/Classic/door-north.png differ diff --git a/src/resources/pixmaps/Classic/door-south.png b/src/resources/pixmaps/Classic/door-south.png new file mode 100644 index 000000000..f3af3fbfe Binary files /dev/null and b/src/resources/pixmaps/Classic/door-south.png differ diff --git a/src/resources/pixmaps/Classic/door-up.png b/src/resources/pixmaps/Classic/door-up.png new file mode 100644 index 000000000..d35184af5 Binary files /dev/null and b/src/resources/pixmaps/Classic/door-up.png differ diff --git a/src/resources/pixmaps/Classic/door-west.png b/src/resources/pixmaps/Classic/door-west.png new file mode 100644 index 000000000..c9cedf482 Binary files /dev/null and b/src/resources/pixmaps/Classic/door-west.png differ diff --git a/src/resources/pixmaps/Classic/exit-climb-down.png b/src/resources/pixmaps/Classic/exit-climb-down.png new file mode 100644 index 000000000..08d9cd7ab Binary files /dev/null and b/src/resources/pixmaps/Classic/exit-climb-down.png differ diff --git a/src/resources/pixmaps/Classic/exit-climb-up.png b/src/resources/pixmaps/Classic/exit-climb-up.png new file mode 100644 index 000000000..f2c95eb56 Binary files /dev/null and b/src/resources/pixmaps/Classic/exit-climb-up.png differ diff --git a/src/resources/pixmaps/Classic/exit-down.png b/src/resources/pixmaps/Classic/exit-down.png new file mode 100644 index 000000000..1f473ca2f Binary files /dev/null and b/src/resources/pixmaps/Classic/exit-down.png differ diff --git a/src/resources/pixmaps/Classic/exit-up.png b/src/resources/pixmaps/Classic/exit-up.png new file mode 100644 index 000000000..a2086bfae Binary files /dev/null and b/src/resources/pixmaps/Classic/exit-up.png differ diff --git a/src/resources/pixmaps/Classic/load-armour.png b/src/resources/pixmaps/Classic/load-armour.png new file mode 100644 index 000000000..317c2956a Binary files /dev/null and b/src/resources/pixmaps/Classic/load-armour.png differ diff --git a/src/resources/pixmaps/Classic/load-attention.png b/src/resources/pixmaps/Classic/load-attention.png new file mode 100644 index 000000000..48cd48465 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-attention.png differ diff --git a/src/resources/pixmaps/Classic/load-boat.png b/src/resources/pixmaps/Classic/load-boat.png new file mode 100644 index 000000000..6930e6f61 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-boat.png differ diff --git a/src/resources/pixmaps/Classic/load-clock.png b/src/resources/pixmaps/Classic/load-clock.png new file mode 100644 index 000000000..e21204bae Binary files /dev/null and b/src/resources/pixmaps/Classic/load-clock.png differ diff --git a/src/resources/pixmaps/Classic/load-coach.png b/src/resources/pixmaps/Classic/load-coach.png new file mode 100644 index 000000000..56d6dd87e Binary files /dev/null and b/src/resources/pixmaps/Classic/load-coach.png differ diff --git a/src/resources/pixmaps/Classic/load-darkword.png b/src/resources/pixmaps/Classic/load-darkword.png new file mode 100644 index 000000000..2fb6f1a10 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-darkword.png differ diff --git a/src/resources/pixmaps/Classic/load-deathtrap.png b/src/resources/pixmaps/Classic/load-deathtrap.png new file mode 100644 index 000000000..28c3746b0 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-deathtrap.png differ diff --git a/src/resources/pixmaps/Classic/load-equipment.png b/src/resources/pixmaps/Classic/load-equipment.png new file mode 100644 index 000000000..2ea2a0457 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-equipment.png differ diff --git a/src/resources/pixmaps/Classic/load-ferry.png b/src/resources/pixmaps/Classic/load-ferry.png new file mode 100644 index 000000000..4fcd5a666 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-ferry.png differ diff --git a/src/resources/pixmaps/Classic/load-food.png b/src/resources/pixmaps/Classic/load-food.png new file mode 100644 index 000000000..2b59965bc Binary files /dev/null and b/src/resources/pixmaps/Classic/load-food.png differ diff --git a/src/resources/pixmaps/Classic/load-herb.png b/src/resources/pixmaps/Classic/load-herb.png new file mode 100644 index 000000000..25b4a6911 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-herb.png differ diff --git a/src/resources/pixmaps/Classic/load-horse.png b/src/resources/pixmaps/Classic/load-horse.png new file mode 100644 index 000000000..00c9205aa Binary files /dev/null and b/src/resources/pixmaps/Classic/load-horse.png differ diff --git a/src/resources/pixmaps/Classic/load-key.png b/src/resources/pixmaps/Classic/load-key.png new file mode 100644 index 000000000..5577d5e9a Binary files /dev/null and b/src/resources/pixmaps/Classic/load-key.png differ diff --git a/src/resources/pixmaps/Classic/load-mail.png b/src/resources/pixmaps/Classic/load-mail.png new file mode 100644 index 000000000..a88c761fc Binary files /dev/null and b/src/resources/pixmaps/Classic/load-mail.png differ diff --git a/src/resources/pixmaps/Classic/load-mule.png b/src/resources/pixmaps/Classic/load-mule.png new file mode 100644 index 000000000..37592d4d4 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-mule.png differ diff --git a/src/resources/pixmaps/Classic/load-pack.png b/src/resources/pixmaps/Classic/load-pack.png new file mode 100644 index 000000000..7e323b165 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-pack.png differ diff --git a/src/resources/pixmaps/Classic/load-rohirrim.png b/src/resources/pixmaps/Classic/load-rohirrim.png new file mode 100644 index 000000000..2649db871 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-rohirrim.png differ diff --git a/src/resources/pixmaps/Classic/load-stable.png b/src/resources/pixmaps/Classic/load-stable.png new file mode 100644 index 000000000..b231508fd Binary files /dev/null and b/src/resources/pixmaps/Classic/load-stable.png differ diff --git a/src/resources/pixmaps/Classic/load-trained.png b/src/resources/pixmaps/Classic/load-trained.png new file mode 100644 index 000000000..67e09fa9d Binary files /dev/null and b/src/resources/pixmaps/Classic/load-trained.png differ diff --git a/src/resources/pixmaps/Classic/load-treasure.png b/src/resources/pixmaps/Classic/load-treasure.png new file mode 100644 index 000000000..006e6e25d Binary files /dev/null and b/src/resources/pixmaps/Classic/load-treasure.png differ diff --git a/src/resources/pixmaps/Classic/load-warg.png b/src/resources/pixmaps/Classic/load-warg.png new file mode 100644 index 000000000..751aa0462 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-warg.png differ diff --git a/src/resources/pixmaps/Classic/load-watch.png b/src/resources/pixmaps/Classic/load-watch.png new file mode 100644 index 000000000..12231bc13 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-watch.png differ diff --git a/src/resources/pixmaps/Classic/load-water.png b/src/resources/pixmaps/Classic/load-water.png new file mode 100644 index 000000000..44f2acd2c Binary files /dev/null and b/src/resources/pixmaps/Classic/load-water.png differ diff --git a/src/resources/pixmaps/Classic/load-weapon.png b/src/resources/pixmaps/Classic/load-weapon.png new file mode 100644 index 000000000..9e3541f47 Binary files /dev/null and b/src/resources/pixmaps/Classic/load-weapon.png differ diff --git a/src/resources/pixmaps/Classic/load-whiteword.png b/src/resources/pixmaps/Classic/load-whiteword.png new file mode 100644 index 000000000..d17b363fa Binary files /dev/null and b/src/resources/pixmaps/Classic/load-whiteword.png differ diff --git a/src/resources/pixmaps/Classic/mellon.png b/src/resources/pixmaps/Classic/mellon.png new file mode 100644 index 000000000..54ad7ea81 Binary files /dev/null and b/src/resources/pixmaps/Classic/mellon.png differ diff --git a/src/resources/pixmaps/Classic/mob-aggmob.png b/src/resources/pixmaps/Classic/mob-aggmob.png new file mode 100644 index 000000000..c91d1328c Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-aggmob.png differ diff --git a/src/resources/pixmaps/Classic/mob-armourshop.png b/src/resources/pixmaps/Classic/mob-armourshop.png new file mode 100644 index 000000000..e34b44b90 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-armourshop.png differ diff --git a/src/resources/pixmaps/Classic/mob-clericguild.png b/src/resources/pixmaps/Classic/mob-clericguild.png new file mode 100644 index 000000000..2eb1ca2e8 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-clericguild.png differ diff --git a/src/resources/pixmaps/Classic/mob-elitemob.png b/src/resources/pixmaps/Classic/mob-elitemob.png new file mode 100644 index 000000000..d77c0b93a Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-elitemob.png differ diff --git a/src/resources/pixmaps/Classic/mob-foodshop.png b/src/resources/pixmaps/Classic/mob-foodshop.png new file mode 100644 index 000000000..722afee9d Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-foodshop.png differ diff --git a/src/resources/pixmaps/Classic/mob-guild.png b/src/resources/pixmaps/Classic/mob-guild.png new file mode 100644 index 000000000..84319e145 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-guild.png differ diff --git a/src/resources/pixmaps/Classic/mob-mageguild.png b/src/resources/pixmaps/Classic/mob-mageguild.png new file mode 100644 index 000000000..c18410d43 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-mageguild.png differ diff --git a/src/resources/pixmaps/Classic/mob-milkable.png b/src/resources/pixmaps/Classic/mob-milkable.png new file mode 100644 index 000000000..801ab2a27 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-milkable.png differ diff --git a/src/resources/pixmaps/Classic/mob-passivemob.png b/src/resources/pixmaps/Classic/mob-passivemob.png new file mode 100644 index 000000000..3e1d84adc Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-passivemob.png differ diff --git a/src/resources/pixmaps/Classic/mob-petshop.png b/src/resources/pixmaps/Classic/mob-petshop.png new file mode 100644 index 000000000..0eb739adc Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-petshop.png differ diff --git a/src/resources/pixmaps/Classic/mob-questmob.png b/src/resources/pixmaps/Classic/mob-questmob.png new file mode 100644 index 000000000..bb5591e75 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-questmob.png differ diff --git a/src/resources/pixmaps/Classic/mob-rangerguild.png b/src/resources/pixmaps/Classic/mob-rangerguild.png new file mode 100644 index 000000000..535b5abc7 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-rangerguild.png differ diff --git a/src/resources/pixmaps/Classic/mob-rattlesnake.png b/src/resources/pixmaps/Classic/mob-rattlesnake.png new file mode 100644 index 000000000..606afa2fb Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-rattlesnake.png differ diff --git a/src/resources/pixmaps/Classic/mob-rent.png b/src/resources/pixmaps/Classic/mob-rent.png new file mode 100644 index 000000000..7c357ccd9 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-rent.png differ diff --git a/src/resources/pixmaps/Classic/mob-scoutguild.png b/src/resources/pixmaps/Classic/mob-scoutguild.png new file mode 100644 index 000000000..f65069059 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-scoutguild.png differ diff --git a/src/resources/pixmaps/Classic/mob-shop.png b/src/resources/pixmaps/Classic/mob-shop.png new file mode 100644 index 000000000..13c312822 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-shop.png differ diff --git a/src/resources/pixmaps/Classic/mob-smob.png b/src/resources/pixmaps/Classic/mob-smob.png new file mode 100644 index 000000000..e77b849cf Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-smob.png differ diff --git a/src/resources/pixmaps/Classic/mob-warriorguild.png b/src/resources/pixmaps/Classic/mob-warriorguild.png new file mode 100644 index 000000000..df21f6f98 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-warriorguild.png differ diff --git a/src/resources/pixmaps/Classic/mob-weaponshop.png b/src/resources/pixmaps/Classic/mob-weaponshop.png new file mode 100644 index 000000000..313840e61 Binary files /dev/null and b/src/resources/pixmaps/Classic/mob-weaponshop.png differ diff --git a/src/resources/pixmaps/Classic/no-ride.png b/src/resources/pixmaps/Classic/no-ride.png new file mode 100644 index 000000000..6c96d4e59 Binary files /dev/null and b/src/resources/pixmaps/Classic/no-ride.png differ diff --git a/src/resources/pixmaps/Classic/road-all.png b/src/resources/pixmaps/Classic/road-all.png new file mode 100644 index 000000000..cded9a396 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-all.png differ diff --git a/src/resources/pixmaps/Classic/road-e.png b/src/resources/pixmaps/Classic/road-e.png new file mode 100644 index 000000000..14ef4b142 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-e.png differ diff --git a/src/resources/pixmaps/Classic/road-es.png b/src/resources/pixmaps/Classic/road-es.png new file mode 100644 index 000000000..019d719a9 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-es.png differ diff --git a/src/resources/pixmaps/Classic/road-esw.png b/src/resources/pixmaps/Classic/road-esw.png new file mode 100644 index 000000000..6958a4f91 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-esw.png differ diff --git a/src/resources/pixmaps/Classic/road-ew.png b/src/resources/pixmaps/Classic/road-ew.png new file mode 100644 index 000000000..748dc673b Binary files /dev/null and b/src/resources/pixmaps/Classic/road-ew.png differ diff --git a/src/resources/pixmaps/Classic/road-n.png b/src/resources/pixmaps/Classic/road-n.png new file mode 100644 index 000000000..9709a879e Binary files /dev/null and b/src/resources/pixmaps/Classic/road-n.png differ diff --git a/src/resources/pixmaps/Classic/road-ne.png b/src/resources/pixmaps/Classic/road-ne.png new file mode 100644 index 000000000..5051c280b Binary files /dev/null and b/src/resources/pixmaps/Classic/road-ne.png differ diff --git a/src/resources/pixmaps/Classic/road-nes.png b/src/resources/pixmaps/Classic/road-nes.png new file mode 100644 index 000000000..2dbc31fba Binary files /dev/null and b/src/resources/pixmaps/Classic/road-nes.png differ diff --git a/src/resources/pixmaps/Classic/road-new.png b/src/resources/pixmaps/Classic/road-new.png new file mode 100644 index 000000000..608a2e854 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-new.png differ diff --git a/src/resources/pixmaps/Classic/road-none.png b/src/resources/pixmaps/Classic/road-none.png new file mode 100644 index 000000000..2cb1a52a4 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-none.png differ diff --git a/src/resources/pixmaps/Classic/road-ns.png b/src/resources/pixmaps/Classic/road-ns.png new file mode 100644 index 000000000..673192e61 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-ns.png differ diff --git a/src/resources/pixmaps/Classic/road-nsw.png b/src/resources/pixmaps/Classic/road-nsw.png new file mode 100644 index 000000000..2bce8b2a5 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-nsw.png differ diff --git a/src/resources/pixmaps/Classic/road-nw.png b/src/resources/pixmaps/Classic/road-nw.png new file mode 100644 index 000000000..cb2dd29ac Binary files /dev/null and b/src/resources/pixmaps/Classic/road-nw.png differ diff --git a/src/resources/pixmaps/Classic/road-s.png b/src/resources/pixmaps/Classic/road-s.png new file mode 100644 index 000000000..5d37a8933 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-s.png differ diff --git a/src/resources/pixmaps/Classic/road-sw.png b/src/resources/pixmaps/Classic/road-sw.png new file mode 100644 index 000000000..277481246 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-sw.png differ diff --git a/src/resources/pixmaps/Classic/road-w.png b/src/resources/pixmaps/Classic/road-w.png new file mode 100644 index 000000000..f4c50d809 Binary files /dev/null and b/src/resources/pixmaps/Classic/road-w.png differ diff --git a/src/resources/pixmaps/Classic/room-highlight.png b/src/resources/pixmaps/Classic/room-highlight.png new file mode 100644 index 000000000..f49628f5a Binary files /dev/null and b/src/resources/pixmaps/Classic/room-highlight.png differ diff --git a/src/resources/pixmaps/Classic/room-sel-distant.png b/src/resources/pixmaps/Classic/room-sel-distant.png new file mode 100644 index 000000000..5a1ed4dca Binary files /dev/null and b/src/resources/pixmaps/Classic/room-sel-distant.png differ diff --git a/src/resources/pixmaps/Classic/room-sel-move-bad.png b/src/resources/pixmaps/Classic/room-sel-move-bad.png new file mode 100644 index 000000000..ecbd57e07 Binary files /dev/null and b/src/resources/pixmaps/Classic/room-sel-move-bad.png differ diff --git a/src/resources/pixmaps/Classic/room-sel-move-good.png b/src/resources/pixmaps/Classic/room-sel-move-good.png new file mode 100644 index 000000000..38d4e2292 Binary files /dev/null and b/src/resources/pixmaps/Classic/room-sel-move-good.png differ diff --git a/src/resources/pixmaps/Classic/room-sel.png b/src/resources/pixmaps/Classic/room-sel.png new file mode 100644 index 000000000..58eafad6f Binary files /dev/null and b/src/resources/pixmaps/Classic/room-sel.png differ diff --git a/src/resources/pixmaps/Classic/splash-beta.png b/src/resources/pixmaps/Classic/splash-beta.png new file mode 100644 index 000000000..328f648a9 Binary files /dev/null and b/src/resources/pixmaps/Classic/splash-beta.png differ diff --git a/src/resources/pixmaps/Classic/splash-release.png b/src/resources/pixmaps/Classic/splash-release.png new file mode 100644 index 000000000..0dc2bc41c Binary files /dev/null and b/src/resources/pixmaps/Classic/splash-release.png differ diff --git a/src/resources/pixmaps/Classic/stream-in-down.png b/src/resources/pixmaps/Classic/stream-in-down.png new file mode 100644 index 000000000..e968b42b6 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-in-down.png differ diff --git a/src/resources/pixmaps/Classic/stream-in-east.png b/src/resources/pixmaps/Classic/stream-in-east.png new file mode 100644 index 000000000..32a26fc83 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-in-east.png differ diff --git a/src/resources/pixmaps/Classic/stream-in-north.png b/src/resources/pixmaps/Classic/stream-in-north.png new file mode 100644 index 000000000..2f6a50a3d Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-in-north.png differ diff --git a/src/resources/pixmaps/Classic/stream-in-south.png b/src/resources/pixmaps/Classic/stream-in-south.png new file mode 100644 index 000000000..316510300 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-in-south.png differ diff --git a/src/resources/pixmaps/Classic/stream-in-up.png b/src/resources/pixmaps/Classic/stream-in-up.png new file mode 100644 index 000000000..09cd85fc5 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-in-up.png differ diff --git a/src/resources/pixmaps/Classic/stream-in-west.png b/src/resources/pixmaps/Classic/stream-in-west.png new file mode 100644 index 000000000..0e3e0488c Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-in-west.png differ diff --git a/src/resources/pixmaps/Classic/stream-out-down.png b/src/resources/pixmaps/Classic/stream-out-down.png new file mode 100644 index 000000000..ea57c8a49 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-out-down.png differ diff --git a/src/resources/pixmaps/Classic/stream-out-east.png b/src/resources/pixmaps/Classic/stream-out-east.png new file mode 100644 index 000000000..6107664e0 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-out-east.png differ diff --git a/src/resources/pixmaps/Classic/stream-out-north.png b/src/resources/pixmaps/Classic/stream-out-north.png new file mode 100644 index 000000000..f788f469c Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-out-north.png differ diff --git a/src/resources/pixmaps/Classic/stream-out-south.png b/src/resources/pixmaps/Classic/stream-out-south.png new file mode 100644 index 000000000..09923afd2 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-out-south.png differ diff --git a/src/resources/pixmaps/Classic/stream-out-up.png b/src/resources/pixmaps/Classic/stream-out-up.png new file mode 100644 index 000000000..aebe70c50 Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-out-up.png differ diff --git a/src/resources/pixmaps/Classic/stream-out-west.png b/src/resources/pixmaps/Classic/stream-out-west.png new file mode 100644 index 000000000..be132f46c Binary files /dev/null and b/src/resources/pixmaps/Classic/stream-out-west.png differ diff --git a/src/resources/pixmaps/Classic/terrain-brush.png b/src/resources/pixmaps/Classic/terrain-brush.png new file mode 100644 index 000000000..fce7ef555 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-brush.png differ diff --git a/src/resources/pixmaps/Classic/terrain-cavern.png b/src/resources/pixmaps/Classic/terrain-cavern.png new file mode 100644 index 000000000..a31bb3f8c Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-cavern.png differ diff --git a/src/resources/pixmaps/Classic/terrain-city.png b/src/resources/pixmaps/Classic/terrain-city.png new file mode 100644 index 000000000..4148a9aa1 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-city.png differ diff --git a/src/resources/pixmaps/Classic/terrain-field.png b/src/resources/pixmaps/Classic/terrain-field.png new file mode 100644 index 000000000..6ff3ada99 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-field.png differ diff --git a/src/resources/pixmaps/Classic/terrain-forest.png b/src/resources/pixmaps/Classic/terrain-forest.png new file mode 100644 index 000000000..13603981e Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-forest.png differ diff --git a/src/resources/pixmaps/Classic/terrain-hills.png b/src/resources/pixmaps/Classic/terrain-hills.png new file mode 100644 index 000000000..29b34fe14 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-hills.png differ diff --git a/src/resources/pixmaps/Classic/terrain-indoors.png b/src/resources/pixmaps/Classic/terrain-indoors.png new file mode 100644 index 000000000..1b12ebb37 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-indoors.png differ diff --git a/src/resources/pixmaps/Classic/terrain-mountains.png b/src/resources/pixmaps/Classic/terrain-mountains.png new file mode 100644 index 000000000..4fe1f5b1b Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-mountains.png differ diff --git a/src/resources/pixmaps/Classic/terrain-rapids.png b/src/resources/pixmaps/Classic/terrain-rapids.png new file mode 100644 index 000000000..0a93ecfee Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-rapids.png differ diff --git a/src/resources/pixmaps/Classic/terrain-road.png b/src/resources/pixmaps/Classic/terrain-road.png new file mode 100644 index 000000000..cfc9d5c8b Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-road.png differ diff --git a/src/resources/pixmaps/Classic/terrain-shallow.png b/src/resources/pixmaps/Classic/terrain-shallow.png new file mode 100644 index 000000000..c4688f6b1 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-shallow.png differ diff --git a/src/resources/pixmaps/Classic/terrain-tunnel.png b/src/resources/pixmaps/Classic/terrain-tunnel.png new file mode 100644 index 000000000..98a8fbcf9 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-tunnel.png differ diff --git a/src/resources/pixmaps/Classic/terrain-undefined.png b/src/resources/pixmaps/Classic/terrain-undefined.png new file mode 100644 index 000000000..b82ce50ad Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-undefined.png differ diff --git a/src/resources/pixmaps/Classic/terrain-underwater.png b/src/resources/pixmaps/Classic/terrain-underwater.png new file mode 100644 index 000000000..223bba5d8 Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-underwater.png differ diff --git a/src/resources/pixmaps/Classic/terrain-water.png b/src/resources/pixmaps/Classic/terrain-water.png new file mode 100644 index 000000000..ff4de44ad Binary files /dev/null and b/src/resources/pixmaps/Classic/terrain-water.png differ diff --git a/src/resources/pixmaps/Classic/trail-all.png b/src/resources/pixmaps/Classic/trail-all.png new file mode 100644 index 000000000..a8bd6d035 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-all.png differ diff --git a/src/resources/pixmaps/Classic/trail-e.png b/src/resources/pixmaps/Classic/trail-e.png new file mode 100644 index 000000000..5e6805ff9 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-e.png differ diff --git a/src/resources/pixmaps/Classic/trail-es.png b/src/resources/pixmaps/Classic/trail-es.png new file mode 100644 index 000000000..694313335 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-es.png differ diff --git a/src/resources/pixmaps/Classic/trail-esw.png b/src/resources/pixmaps/Classic/trail-esw.png new file mode 100644 index 000000000..ba341d9aa Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-esw.png differ diff --git a/src/resources/pixmaps/Classic/trail-ew.png b/src/resources/pixmaps/Classic/trail-ew.png new file mode 100644 index 000000000..796d4c08c Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-ew.png differ diff --git a/src/resources/pixmaps/Classic/trail-n.png b/src/resources/pixmaps/Classic/trail-n.png new file mode 100644 index 000000000..e0315f002 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-n.png differ diff --git a/src/resources/pixmaps/Classic/trail-ne.png b/src/resources/pixmaps/Classic/trail-ne.png new file mode 100644 index 000000000..4b07d106a Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-ne.png differ diff --git a/src/resources/pixmaps/Classic/trail-nes.png b/src/resources/pixmaps/Classic/trail-nes.png new file mode 100644 index 000000000..c2a6d1954 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-nes.png differ diff --git a/src/resources/pixmaps/Classic/trail-new.png b/src/resources/pixmaps/Classic/trail-new.png new file mode 100644 index 000000000..765eda256 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-new.png differ diff --git a/src/resources/pixmaps/Classic/trail-none.png b/src/resources/pixmaps/Classic/trail-none.png new file mode 100644 index 000000000..e55fba0fe Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-none.png differ diff --git a/src/resources/pixmaps/Classic/trail-ns.png b/src/resources/pixmaps/Classic/trail-ns.png new file mode 100644 index 000000000..05697dbe1 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-ns.png differ diff --git a/src/resources/pixmaps/Classic/trail-nsw.png b/src/resources/pixmaps/Classic/trail-nsw.png new file mode 100644 index 000000000..c373a02f4 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-nsw.png differ diff --git a/src/resources/pixmaps/Classic/trail-nw.png b/src/resources/pixmaps/Classic/trail-nw.png new file mode 100644 index 000000000..2429cb0c4 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-nw.png differ diff --git a/src/resources/pixmaps/Classic/trail-s.png b/src/resources/pixmaps/Classic/trail-s.png new file mode 100644 index 000000000..35ac74056 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-s.png differ diff --git a/src/resources/pixmaps/Classic/trail-sw.png b/src/resources/pixmaps/Classic/trail-sw.png new file mode 100644 index 000000000..658567a14 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-sw.png differ diff --git a/src/resources/pixmaps/Classic/trail-w.png b/src/resources/pixmaps/Classic/trail-w.png new file mode 100644 index 000000000..150cbe024 Binary files /dev/null and b/src/resources/pixmaps/Classic/trail-w.png differ diff --git a/src/resources/pixmaps/Classic/wall-east.png b/src/resources/pixmaps/Classic/wall-east.png new file mode 100644 index 000000000..e150f029c Binary files /dev/null and b/src/resources/pixmaps/Classic/wall-east.png differ diff --git a/src/resources/pixmaps/Classic/wall-north.png b/src/resources/pixmaps/Classic/wall-north.png new file mode 100644 index 000000000..6ea5710f3 Binary files /dev/null and b/src/resources/pixmaps/Classic/wall-north.png differ diff --git a/src/resources/pixmaps/Classic/wall-south.png b/src/resources/pixmaps/Classic/wall-south.png new file mode 100644 index 000000000..a7e1771d8 Binary files /dev/null and b/src/resources/pixmaps/Classic/wall-south.png differ diff --git a/src/resources/pixmaps/Classic/wall-west.png b/src/resources/pixmaps/Classic/wall-west.png new file mode 100644 index 000000000..0728e5bed Binary files /dev/null and b/src/resources/pixmaps/Classic/wall-west.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-all.png b/src/resources/pixmaps/Modern/Autumn/road-all.png new file mode 100644 index 000000000..c2cc872c9 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-all.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-e.png b/src/resources/pixmaps/Modern/Autumn/road-e.png new file mode 100644 index 000000000..997cf2e9d Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-e.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-es.png b/src/resources/pixmaps/Modern/Autumn/road-es.png new file mode 100644 index 000000000..b47c541e3 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-es.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-esw.png b/src/resources/pixmaps/Modern/Autumn/road-esw.png new file mode 100644 index 000000000..f99a4d244 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-esw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-ew.png b/src/resources/pixmaps/Modern/Autumn/road-ew.png new file mode 100644 index 000000000..2ad2eb9de Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-ew.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-n.png b/src/resources/pixmaps/Modern/Autumn/road-n.png new file mode 100644 index 000000000..2d7053f92 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-n.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-ne.png b/src/resources/pixmaps/Modern/Autumn/road-ne.png new file mode 100644 index 000000000..29f79564d Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-ne.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-nes.png b/src/resources/pixmaps/Modern/Autumn/road-nes.png new file mode 100644 index 000000000..246ec7d9d Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-nes.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-new.png b/src/resources/pixmaps/Modern/Autumn/road-new.png new file mode 100644 index 000000000..4ddefbab5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-new.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-none.png b/src/resources/pixmaps/Modern/Autumn/road-none.png new file mode 100644 index 000000000..60d320650 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-none.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-ns.png b/src/resources/pixmaps/Modern/Autumn/road-ns.png new file mode 100644 index 000000000..72a03c5bf Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-ns.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-nsw.png b/src/resources/pixmaps/Modern/Autumn/road-nsw.png new file mode 100644 index 000000000..c19cab3bd Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-nw.png b/src/resources/pixmaps/Modern/Autumn/road-nw.png new file mode 100644 index 000000000..69ba23c6f Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-nw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-s.png b/src/resources/pixmaps/Modern/Autumn/road-s.png new file mode 100644 index 000000000..fc6a24c7c Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-s.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-sw.png b/src/resources/pixmaps/Modern/Autumn/road-sw.png new file mode 100644 index 000000000..8ca5611ff Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-sw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/road-w.png b/src/resources/pixmaps/Modern/Autumn/road-w.png new file mode 100644 index 000000000..6f6764e4a Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/road-w.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-brush.png b/src/resources/pixmaps/Modern/Autumn/terrain-brush.png new file mode 100644 index 000000000..7b351ac81 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-brush.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-city.png b/src/resources/pixmaps/Modern/Autumn/terrain-city.png new file mode 100644 index 000000000..a2f0fc32f Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-city.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-field.png b/src/resources/pixmaps/Modern/Autumn/terrain-field.png new file mode 100644 index 000000000..f3d5997c5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-field.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-forest.png b/src/resources/pixmaps/Modern/Autumn/terrain-forest.png new file mode 100644 index 000000000..c090fbd2b Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-forest.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-hills.png b/src/resources/pixmaps/Modern/Autumn/terrain-hills.png new file mode 100644 index 000000000..ad84ead83 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-hills.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-mountains.png b/src/resources/pixmaps/Modern/Autumn/terrain-mountains.png new file mode 100644 index 000000000..cb1de0e09 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-mountains.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-rapids.png b/src/resources/pixmaps/Modern/Autumn/terrain-rapids.png new file mode 100644 index 000000000..3ccf73660 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-rapids.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-shallow.png b/src/resources/pixmaps/Modern/Autumn/terrain-shallow.png new file mode 100644 index 000000000..ebec2200c Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-shallow.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/terrain-water.png b/src/resources/pixmaps/Modern/Autumn/terrain-water.png new file mode 100644 index 000000000..115c708e5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/terrain-water.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-all.png b/src/resources/pixmaps/Modern/Autumn/trail-all.png new file mode 100644 index 000000000..b328ff54a Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-all.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-e.png b/src/resources/pixmaps/Modern/Autumn/trail-e.png new file mode 100644 index 000000000..bd62b08c4 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-e.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-es.png b/src/resources/pixmaps/Modern/Autumn/trail-es.png new file mode 100644 index 000000000..fc64b0730 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-es.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-esw.png b/src/resources/pixmaps/Modern/Autumn/trail-esw.png new file mode 100644 index 000000000..a5fc55bb7 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-esw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-ew.png b/src/resources/pixmaps/Modern/Autumn/trail-ew.png new file mode 100644 index 000000000..ef5120ab4 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-ew.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-n.png b/src/resources/pixmaps/Modern/Autumn/trail-n.png new file mode 100644 index 000000000..452ddbc89 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-n.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-ne.png b/src/resources/pixmaps/Modern/Autumn/trail-ne.png new file mode 100644 index 000000000..ee6bc3695 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-ne.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-nes.png b/src/resources/pixmaps/Modern/Autumn/trail-nes.png new file mode 100644 index 000000000..2a216b863 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-nes.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-new.png b/src/resources/pixmaps/Modern/Autumn/trail-new.png new file mode 100644 index 000000000..6461aebb8 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-new.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-none.png b/src/resources/pixmaps/Modern/Autumn/trail-none.png new file mode 100644 index 000000000..ac226e3cb Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-none.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-ns.png b/src/resources/pixmaps/Modern/Autumn/trail-ns.png new file mode 100644 index 000000000..219cfbdcd Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-ns.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-nsw.png b/src/resources/pixmaps/Modern/Autumn/trail-nsw.png new file mode 100644 index 000000000..46078f0cb Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-nw.png b/src/resources/pixmaps/Modern/Autumn/trail-nw.png new file mode 100644 index 000000000..7e3fa76dc Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-nw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-s.png b/src/resources/pixmaps/Modern/Autumn/trail-s.png new file mode 100644 index 000000000..39efa7242 Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-s.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-sw.png b/src/resources/pixmaps/Modern/Autumn/trail-sw.png new file mode 100644 index 000000000..0ca7f782c Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-sw.png differ diff --git a/src/resources/pixmaps/Modern/Autumn/trail-w.png b/src/resources/pixmaps/Modern/Autumn/trail-w.png new file mode 100644 index 000000000..1ae9c7a0f Binary files /dev/null and b/src/resources/pixmaps/Modern/Autumn/trail-w.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-all.png b/src/resources/pixmaps/Modern/Spring/road-all.png new file mode 100644 index 000000000..9214fc961 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-all.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-e.png b/src/resources/pixmaps/Modern/Spring/road-e.png new file mode 100644 index 000000000..2d989710f Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-e.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-es.png b/src/resources/pixmaps/Modern/Spring/road-es.png new file mode 100644 index 000000000..36cd59537 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-es.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-esw.png b/src/resources/pixmaps/Modern/Spring/road-esw.png new file mode 100644 index 000000000..82bc82357 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-esw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-ew.png b/src/resources/pixmaps/Modern/Spring/road-ew.png new file mode 100644 index 000000000..ef196989b Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-ew.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-n.png b/src/resources/pixmaps/Modern/Spring/road-n.png new file mode 100644 index 000000000..2c3d207ed Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-n.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-ne.png b/src/resources/pixmaps/Modern/Spring/road-ne.png new file mode 100644 index 000000000..10a3ee154 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-ne.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-nes.png b/src/resources/pixmaps/Modern/Spring/road-nes.png new file mode 100644 index 000000000..38eaf806d Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-nes.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-new.png b/src/resources/pixmaps/Modern/Spring/road-new.png new file mode 100644 index 000000000..f8431ab33 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-new.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-none.png b/src/resources/pixmaps/Modern/Spring/road-none.png new file mode 100644 index 000000000..37e011ef2 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-none.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-ns.png b/src/resources/pixmaps/Modern/Spring/road-ns.png new file mode 100644 index 000000000..da2b7640c Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-ns.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-nsw.png b/src/resources/pixmaps/Modern/Spring/road-nsw.png new file mode 100644 index 000000000..3806eba6a Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-nw.png b/src/resources/pixmaps/Modern/Spring/road-nw.png new file mode 100644 index 000000000..181df21b2 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-nw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-s.png b/src/resources/pixmaps/Modern/Spring/road-s.png new file mode 100644 index 000000000..ec0216328 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-s.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-sw.png b/src/resources/pixmaps/Modern/Spring/road-sw.png new file mode 100644 index 000000000..b36772c3b Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-sw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/road-w.png b/src/resources/pixmaps/Modern/Spring/road-w.png new file mode 100644 index 000000000..327047e73 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/road-w.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-brush.png b/src/resources/pixmaps/Modern/Spring/terrain-brush.png new file mode 100644 index 000000000..bcb7d5086 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-brush.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-city.png b/src/resources/pixmaps/Modern/Spring/terrain-city.png new file mode 100644 index 000000000..81e0896c2 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-city.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-field.png b/src/resources/pixmaps/Modern/Spring/terrain-field.png new file mode 100644 index 000000000..a4b071437 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-field.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-forest.png b/src/resources/pixmaps/Modern/Spring/terrain-forest.png new file mode 100644 index 000000000..e99eb061a Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-forest.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-hills.png b/src/resources/pixmaps/Modern/Spring/terrain-hills.png new file mode 100644 index 000000000..9db278d41 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-hills.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-mountains.png b/src/resources/pixmaps/Modern/Spring/terrain-mountains.png new file mode 100644 index 000000000..80abfb9ba Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-mountains.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-rapids.png b/src/resources/pixmaps/Modern/Spring/terrain-rapids.png new file mode 100644 index 000000000..3ccf73660 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-rapids.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-road.png b/src/resources/pixmaps/Modern/Spring/terrain-road.png new file mode 100644 index 000000000..9214fc961 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-road.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-shallow.png b/src/resources/pixmaps/Modern/Spring/terrain-shallow.png new file mode 100644 index 000000000..492fb9d9f Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-shallow.png differ diff --git a/src/resources/pixmaps/Modern/Spring/terrain-water.png b/src/resources/pixmaps/Modern/Spring/terrain-water.png new file mode 100644 index 000000000..115c708e5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/terrain-water.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-all.png b/src/resources/pixmaps/Modern/Spring/trail-all.png new file mode 100644 index 000000000..cf3d1a856 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-all.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-e.png b/src/resources/pixmaps/Modern/Spring/trail-e.png new file mode 100644 index 000000000..ce9a2d7c6 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-e.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-es.png b/src/resources/pixmaps/Modern/Spring/trail-es.png new file mode 100644 index 000000000..d47fc7a3d Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-es.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-esw.png b/src/resources/pixmaps/Modern/Spring/trail-esw.png new file mode 100644 index 000000000..f2fc59e72 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-esw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-ew.png b/src/resources/pixmaps/Modern/Spring/trail-ew.png new file mode 100644 index 000000000..70f2d4fea Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-ew.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-n.png b/src/resources/pixmaps/Modern/Spring/trail-n.png new file mode 100644 index 000000000..aac34ed50 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-n.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-ne.png b/src/resources/pixmaps/Modern/Spring/trail-ne.png new file mode 100644 index 000000000..5ef81daa1 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-ne.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-nes.png b/src/resources/pixmaps/Modern/Spring/trail-nes.png new file mode 100644 index 000000000..dfce4c051 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-nes.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-new.png b/src/resources/pixmaps/Modern/Spring/trail-new.png new file mode 100644 index 000000000..07c057a0a Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-new.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-none.png b/src/resources/pixmaps/Modern/Spring/trail-none.png new file mode 100644 index 000000000..ca9d3f90b Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-none.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-ns.png b/src/resources/pixmaps/Modern/Spring/trail-ns.png new file mode 100644 index 000000000..3489d8f3d Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-ns.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-nsw.png b/src/resources/pixmaps/Modern/Spring/trail-nsw.png new file mode 100644 index 000000000..076c643f5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-nw.png b/src/resources/pixmaps/Modern/Spring/trail-nw.png new file mode 100644 index 000000000..80862452f Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-nw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-s.png b/src/resources/pixmaps/Modern/Spring/trail-s.png new file mode 100644 index 000000000..b96754606 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-s.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-sw.png b/src/resources/pixmaps/Modern/Spring/trail-sw.png new file mode 100644 index 000000000..65527ce62 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-sw.png differ diff --git a/src/resources/pixmaps/Modern/Spring/trail-w.png b/src/resources/pixmaps/Modern/Spring/trail-w.png new file mode 100644 index 000000000..05a456a17 Binary files /dev/null and b/src/resources/pixmaps/Modern/Spring/trail-w.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-all.png b/src/resources/pixmaps/Modern/Summer/road-all.png new file mode 100644 index 000000000..14d586c06 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-all.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-e.png b/src/resources/pixmaps/Modern/Summer/road-e.png new file mode 100644 index 000000000..1f94f04b8 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-e.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-es.png b/src/resources/pixmaps/Modern/Summer/road-es.png new file mode 100644 index 000000000..93b42eb3a Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-es.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-esw.png b/src/resources/pixmaps/Modern/Summer/road-esw.png new file mode 100644 index 000000000..8e3e1f38c Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-esw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-ew.png b/src/resources/pixmaps/Modern/Summer/road-ew.png new file mode 100644 index 000000000..201216c13 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-ew.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-n.png b/src/resources/pixmaps/Modern/Summer/road-n.png new file mode 100644 index 000000000..7a919df4a Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-n.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-ne.png b/src/resources/pixmaps/Modern/Summer/road-ne.png new file mode 100644 index 000000000..7329e829b Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-ne.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-nes.png b/src/resources/pixmaps/Modern/Summer/road-nes.png new file mode 100644 index 000000000..5b52d2bd9 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-nes.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-new.png b/src/resources/pixmaps/Modern/Summer/road-new.png new file mode 100644 index 000000000..eca668e0c Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-new.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-none.png b/src/resources/pixmaps/Modern/Summer/road-none.png new file mode 100644 index 000000000..16993ad80 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-none.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-ns.png b/src/resources/pixmaps/Modern/Summer/road-ns.png new file mode 100644 index 000000000..d7a396775 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-ns.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-nsw.png b/src/resources/pixmaps/Modern/Summer/road-nsw.png new file mode 100644 index 000000000..b8d39ab17 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-nw.png b/src/resources/pixmaps/Modern/Summer/road-nw.png new file mode 100644 index 000000000..7d1fde08c Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-nw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-s.png b/src/resources/pixmaps/Modern/Summer/road-s.png new file mode 100644 index 000000000..a9c91bac3 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-s.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-sw.png b/src/resources/pixmaps/Modern/Summer/road-sw.png new file mode 100644 index 000000000..e9da30234 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-sw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/road-w.png b/src/resources/pixmaps/Modern/Summer/road-w.png new file mode 100644 index 000000000..5f0ec0e11 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/road-w.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-brush.png b/src/resources/pixmaps/Modern/Summer/terrain-brush.png new file mode 100644 index 000000000..4adc837f4 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-brush.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-city.png b/src/resources/pixmaps/Modern/Summer/terrain-city.png new file mode 100644 index 000000000..2896cb154 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-city.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-field.png b/src/resources/pixmaps/Modern/Summer/terrain-field.png new file mode 100644 index 000000000..5668143ef Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-field.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-forest.png b/src/resources/pixmaps/Modern/Summer/terrain-forest.png new file mode 100644 index 000000000..75d9536f5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-forest.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-hills.png b/src/resources/pixmaps/Modern/Summer/terrain-hills.png new file mode 100644 index 000000000..fee377807 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-hills.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-mountains.png b/src/resources/pixmaps/Modern/Summer/terrain-mountains.png new file mode 100644 index 000000000..17c609593 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-mountains.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-rapids.png b/src/resources/pixmaps/Modern/Summer/terrain-rapids.png new file mode 100644 index 000000000..3ccf73660 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-rapids.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-shallow.png b/src/resources/pixmaps/Modern/Summer/terrain-shallow.png new file mode 100644 index 000000000..a8fefd190 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-shallow.png differ diff --git a/src/resources/pixmaps/Modern/Summer/terrain-water.png b/src/resources/pixmaps/Modern/Summer/terrain-water.png new file mode 100644 index 000000000..115c708e5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/terrain-water.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-all.png b/src/resources/pixmaps/Modern/Summer/trail-all.png new file mode 100644 index 000000000..cf3d1a856 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-all.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-e.png b/src/resources/pixmaps/Modern/Summer/trail-e.png new file mode 100644 index 000000000..ce9a2d7c6 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-e.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-es.png b/src/resources/pixmaps/Modern/Summer/trail-es.png new file mode 100644 index 000000000..d47fc7a3d Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-es.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-esw.png b/src/resources/pixmaps/Modern/Summer/trail-esw.png new file mode 100644 index 000000000..f2fc59e72 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-esw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-ew.png b/src/resources/pixmaps/Modern/Summer/trail-ew.png new file mode 100644 index 000000000..70f2d4fea Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-ew.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-n.png b/src/resources/pixmaps/Modern/Summer/trail-n.png new file mode 100644 index 000000000..aac34ed50 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-n.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-ne.png b/src/resources/pixmaps/Modern/Summer/trail-ne.png new file mode 100644 index 000000000..5ef81daa1 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-ne.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-nes.png b/src/resources/pixmaps/Modern/Summer/trail-nes.png new file mode 100644 index 000000000..dfce4c051 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-nes.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-new.png b/src/resources/pixmaps/Modern/Summer/trail-new.png new file mode 100644 index 000000000..07c057a0a Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-new.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-none.png b/src/resources/pixmaps/Modern/Summer/trail-none.png new file mode 100644 index 000000000..ca9d3f90b Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-none.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-ns.png b/src/resources/pixmaps/Modern/Summer/trail-ns.png new file mode 100644 index 000000000..3489d8f3d Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-ns.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-nsw.png b/src/resources/pixmaps/Modern/Summer/trail-nsw.png new file mode 100644 index 000000000..076c643f5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-nw.png b/src/resources/pixmaps/Modern/Summer/trail-nw.png new file mode 100644 index 000000000..80862452f Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-nw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-s.png b/src/resources/pixmaps/Modern/Summer/trail-s.png new file mode 100644 index 000000000..b96754606 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-s.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-sw.png b/src/resources/pixmaps/Modern/Summer/trail-sw.png new file mode 100644 index 000000000..65527ce62 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-sw.png differ diff --git a/src/resources/pixmaps/Modern/Summer/trail-w.png b/src/resources/pixmaps/Modern/Summer/trail-w.png new file mode 100644 index 000000000..05a456a17 Binary files /dev/null and b/src/resources/pixmaps/Modern/Summer/trail-w.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-all.png b/src/resources/pixmaps/Modern/Winter/road-all.png new file mode 100644 index 000000000..95dc9f188 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-all.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-e.png b/src/resources/pixmaps/Modern/Winter/road-e.png new file mode 100644 index 000000000..20617d9aa Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-e.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-es.png b/src/resources/pixmaps/Modern/Winter/road-es.png new file mode 100644 index 000000000..cee4db151 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-es.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-esw.png b/src/resources/pixmaps/Modern/Winter/road-esw.png new file mode 100644 index 000000000..5e52e4e20 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-esw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-ew.png b/src/resources/pixmaps/Modern/Winter/road-ew.png new file mode 100644 index 000000000..13e47593e Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-ew.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-n.png b/src/resources/pixmaps/Modern/Winter/road-n.png new file mode 100644 index 000000000..b4ca93f30 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-n.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-ne.png b/src/resources/pixmaps/Modern/Winter/road-ne.png new file mode 100644 index 000000000..0286f0886 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-ne.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-nes.png b/src/resources/pixmaps/Modern/Winter/road-nes.png new file mode 100644 index 000000000..dbe01b412 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-nes.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-new.png b/src/resources/pixmaps/Modern/Winter/road-new.png new file mode 100644 index 000000000..66913dab6 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-new.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-none.png b/src/resources/pixmaps/Modern/Winter/road-none.png new file mode 100644 index 000000000..ed83134b9 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-none.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-ns.png b/src/resources/pixmaps/Modern/Winter/road-ns.png new file mode 100644 index 000000000..d1ab0f870 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-ns.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-nsw.png b/src/resources/pixmaps/Modern/Winter/road-nsw.png new file mode 100644 index 000000000..f28e7cca7 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-nw.png b/src/resources/pixmaps/Modern/Winter/road-nw.png new file mode 100644 index 000000000..ad89f68c9 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-nw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-s.png b/src/resources/pixmaps/Modern/Winter/road-s.png new file mode 100644 index 000000000..71d165dae Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-s.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-sw.png b/src/resources/pixmaps/Modern/Winter/road-sw.png new file mode 100644 index 000000000..e758301f2 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-sw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/road-w.png b/src/resources/pixmaps/Modern/Winter/road-w.png new file mode 100644 index 000000000..e1ec636b4 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/road-w.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-brush.png b/src/resources/pixmaps/Modern/Winter/terrain-brush.png new file mode 100644 index 000000000..5dfa3ccb0 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-brush.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-city.png b/src/resources/pixmaps/Modern/Winter/terrain-city.png new file mode 100644 index 000000000..d2ddf084a Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-city.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-field.png b/src/resources/pixmaps/Modern/Winter/terrain-field.png new file mode 100644 index 000000000..e284362e5 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-field.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-forest.png b/src/resources/pixmaps/Modern/Winter/terrain-forest.png new file mode 100644 index 000000000..3493f46ee Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-forest.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-hills.png b/src/resources/pixmaps/Modern/Winter/terrain-hills.png new file mode 100644 index 000000000..3435a9459 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-hills.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-mountains.png b/src/resources/pixmaps/Modern/Winter/terrain-mountains.png new file mode 100644 index 000000000..cfd841f57 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-mountains.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-rapids.png b/src/resources/pixmaps/Modern/Winter/terrain-rapids.png new file mode 100644 index 000000000..3ccf73660 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-rapids.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-shallow.png b/src/resources/pixmaps/Modern/Winter/terrain-shallow.png new file mode 100644 index 000000000..a7b375f85 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-shallow.png differ diff --git a/src/resources/pixmaps/Modern/Winter/terrain-water.png b/src/resources/pixmaps/Modern/Winter/terrain-water.png new file mode 100644 index 000000000..1f46dfb86 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/terrain-water.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-all.png b/src/resources/pixmaps/Modern/Winter/trail-all.png new file mode 100644 index 000000000..17a0a990e Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-all.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-e.png b/src/resources/pixmaps/Modern/Winter/trail-e.png new file mode 100644 index 000000000..82365606a Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-e.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-es.png b/src/resources/pixmaps/Modern/Winter/trail-es.png new file mode 100644 index 000000000..9ff5d959b Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-es.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-esw.png b/src/resources/pixmaps/Modern/Winter/trail-esw.png new file mode 100644 index 000000000..33f7dc783 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-esw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-ew.png b/src/resources/pixmaps/Modern/Winter/trail-ew.png new file mode 100644 index 000000000..5906d29f4 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-ew.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-n.png b/src/resources/pixmaps/Modern/Winter/trail-n.png new file mode 100644 index 000000000..eabdc02c0 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-n.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-ne.png b/src/resources/pixmaps/Modern/Winter/trail-ne.png new file mode 100644 index 000000000..415a3f9e1 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-ne.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-nes.png b/src/resources/pixmaps/Modern/Winter/trail-nes.png new file mode 100644 index 000000000..48091099a Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-nes.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-new.png b/src/resources/pixmaps/Modern/Winter/trail-new.png new file mode 100644 index 000000000..384d5f2ac Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-new.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-none.png b/src/resources/pixmaps/Modern/Winter/trail-none.png new file mode 100644 index 000000000..c764fd398 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-none.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-ns.png b/src/resources/pixmaps/Modern/Winter/trail-ns.png new file mode 100644 index 000000000..81dc1575d Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-ns.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-nsw.png b/src/resources/pixmaps/Modern/Winter/trail-nsw.png new file mode 100644 index 000000000..1c9f3d00a Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-nsw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-nw.png b/src/resources/pixmaps/Modern/Winter/trail-nw.png new file mode 100644 index 000000000..aebe3af20 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-nw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-s.png b/src/resources/pixmaps/Modern/Winter/trail-s.png new file mode 100644 index 000000000..3dc290d6e Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-s.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-sw.png b/src/resources/pixmaps/Modern/Winter/trail-sw.png new file mode 100644 index 000000000..079520459 Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-sw.png differ diff --git a/src/resources/pixmaps/Modern/Winter/trail-w.png b/src/resources/pixmaps/Modern/Winter/trail-w.png new file mode 100644 index 000000000..5d8c757ce Binary files /dev/null and b/src/resources/pixmaps/Modern/Winter/trail-w.png differ diff --git a/src/resources/pixmaps/Modern/char-arrows.png b/src/resources/pixmaps/Modern/char-arrows.png new file mode 100644 index 000000000..2a775c09a Binary files /dev/null and b/src/resources/pixmaps/Modern/char-arrows.png differ diff --git a/src/resources/pixmaps/Modern/char-room-sel.png b/src/resources/pixmaps/Modern/char-room-sel.png new file mode 100644 index 000000000..39e485b41 Binary files /dev/null and b/src/resources/pixmaps/Modern/char-room-sel.png differ diff --git a/src/resources/pixmaps/Modern/door-down.png b/src/resources/pixmaps/Modern/door-down.png new file mode 100644 index 000000000..ec4c461c6 Binary files /dev/null and b/src/resources/pixmaps/Modern/door-down.png differ diff --git a/src/resources/pixmaps/Modern/door-east.png b/src/resources/pixmaps/Modern/door-east.png new file mode 100644 index 000000000..ae133dc8b Binary files /dev/null and b/src/resources/pixmaps/Modern/door-east.png differ diff --git a/src/resources/pixmaps/Modern/door-north.png b/src/resources/pixmaps/Modern/door-north.png new file mode 100644 index 000000000..88614ae2c Binary files /dev/null and b/src/resources/pixmaps/Modern/door-north.png differ diff --git a/src/resources/pixmaps/Modern/door-south.png b/src/resources/pixmaps/Modern/door-south.png new file mode 100644 index 000000000..f3af3fbfe Binary files /dev/null and b/src/resources/pixmaps/Modern/door-south.png differ diff --git a/src/resources/pixmaps/Modern/door-up.png b/src/resources/pixmaps/Modern/door-up.png new file mode 100644 index 000000000..d35184af5 Binary files /dev/null and b/src/resources/pixmaps/Modern/door-up.png differ diff --git a/src/resources/pixmaps/Modern/door-west.png b/src/resources/pixmaps/Modern/door-west.png new file mode 100644 index 000000000..c9cedf482 Binary files /dev/null and b/src/resources/pixmaps/Modern/door-west.png differ diff --git a/src/resources/pixmaps/Modern/exit-climb-down.png b/src/resources/pixmaps/Modern/exit-climb-down.png new file mode 100644 index 000000000..36420d87d Binary files /dev/null and b/src/resources/pixmaps/Modern/exit-climb-down.png differ diff --git a/src/resources/pixmaps/Modern/exit-climb-up.png b/src/resources/pixmaps/Modern/exit-climb-up.png new file mode 100644 index 000000000..7382c2f48 Binary files /dev/null and b/src/resources/pixmaps/Modern/exit-climb-up.png differ diff --git a/src/resources/pixmaps/Modern/exit-down.png b/src/resources/pixmaps/Modern/exit-down.png new file mode 100644 index 000000000..4a2fb9089 Binary files /dev/null and b/src/resources/pixmaps/Modern/exit-down.png differ diff --git a/src/resources/pixmaps/Modern/exit-up.png b/src/resources/pixmaps/Modern/exit-up.png new file mode 100644 index 000000000..3fb33a4c1 Binary files /dev/null and b/src/resources/pixmaps/Modern/exit-up.png differ diff --git a/src/resources/pixmaps/Modern/load-armour.png b/src/resources/pixmaps/Modern/load-armour.png new file mode 100644 index 000000000..bfab410c4 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-armour.png differ diff --git a/src/resources/pixmaps/Modern/load-attention.png b/src/resources/pixmaps/Modern/load-attention.png new file mode 100644 index 000000000..8e65d374f Binary files /dev/null and b/src/resources/pixmaps/Modern/load-attention.png differ diff --git a/src/resources/pixmaps/Modern/load-boat.png b/src/resources/pixmaps/Modern/load-boat.png new file mode 100644 index 000000000..b160d8db2 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-boat.png differ diff --git a/src/resources/pixmaps/Modern/load-clock.png b/src/resources/pixmaps/Modern/load-clock.png new file mode 100644 index 000000000..1caaa20a6 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-clock.png differ diff --git a/src/resources/pixmaps/Modern/load-coach.png b/src/resources/pixmaps/Modern/load-coach.png new file mode 100644 index 000000000..99e76393a Binary files /dev/null and b/src/resources/pixmaps/Modern/load-coach.png differ diff --git a/src/resources/pixmaps/Modern/load-darkword.png b/src/resources/pixmaps/Modern/load-darkword.png new file mode 100644 index 000000000..2fb6f1a10 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-darkword.png differ diff --git a/src/resources/pixmaps/Modern/load-deathtrap.png b/src/resources/pixmaps/Modern/load-deathtrap.png new file mode 100644 index 000000000..8380c8bc0 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-deathtrap.png differ diff --git a/src/resources/pixmaps/Modern/load-equipment.png b/src/resources/pixmaps/Modern/load-equipment.png new file mode 100644 index 000000000..1b51e7372 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-equipment.png differ diff --git a/src/resources/pixmaps/Modern/load-ferry.png b/src/resources/pixmaps/Modern/load-ferry.png new file mode 100644 index 000000000..76dc071af Binary files /dev/null and b/src/resources/pixmaps/Modern/load-ferry.png differ diff --git a/src/resources/pixmaps/Modern/load-food.png b/src/resources/pixmaps/Modern/load-food.png new file mode 100644 index 000000000..65c3e461c Binary files /dev/null and b/src/resources/pixmaps/Modern/load-food.png differ diff --git a/src/resources/pixmaps/Modern/load-herb.png b/src/resources/pixmaps/Modern/load-herb.png new file mode 100644 index 000000000..47aa1bdb2 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-herb.png differ diff --git a/src/resources/pixmaps/Modern/load-horse.png b/src/resources/pixmaps/Modern/load-horse.png new file mode 100644 index 000000000..60c16ff45 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-horse.png differ diff --git a/src/resources/pixmaps/Modern/load-key.png b/src/resources/pixmaps/Modern/load-key.png new file mode 100644 index 000000000..08fc6a7ed Binary files /dev/null and b/src/resources/pixmaps/Modern/load-key.png differ diff --git a/src/resources/pixmaps/Modern/load-mail.png b/src/resources/pixmaps/Modern/load-mail.png new file mode 100644 index 000000000..d98552054 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-mail.png differ diff --git a/src/resources/pixmaps/Modern/load-mule.png b/src/resources/pixmaps/Modern/load-mule.png new file mode 100644 index 000000000..de0c3364f Binary files /dev/null and b/src/resources/pixmaps/Modern/load-mule.png differ diff --git a/src/resources/pixmaps/Modern/load-pack.png b/src/resources/pixmaps/Modern/load-pack.png new file mode 100644 index 000000000..5f600217f Binary files /dev/null and b/src/resources/pixmaps/Modern/load-pack.png differ diff --git a/src/resources/pixmaps/Modern/load-rohirrim.png b/src/resources/pixmaps/Modern/load-rohirrim.png new file mode 100644 index 000000000..6c4707953 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-rohirrim.png differ diff --git a/src/resources/pixmaps/Modern/load-stable.png b/src/resources/pixmaps/Modern/load-stable.png new file mode 100644 index 000000000..4f4d15c1a Binary files /dev/null and b/src/resources/pixmaps/Modern/load-stable.png differ diff --git a/src/resources/pixmaps/Modern/load-trained.png b/src/resources/pixmaps/Modern/load-trained.png new file mode 100644 index 000000000..5eec1bb92 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-trained.png differ diff --git a/src/resources/pixmaps/Modern/load-treasure.png b/src/resources/pixmaps/Modern/load-treasure.png new file mode 100644 index 000000000..c32839bc1 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-treasure.png differ diff --git a/src/resources/pixmaps/Modern/load-warg.png b/src/resources/pixmaps/Modern/load-warg.png new file mode 100644 index 000000000..b9a71560c Binary files /dev/null and b/src/resources/pixmaps/Modern/load-warg.png differ diff --git a/src/resources/pixmaps/Modern/load-watch.png b/src/resources/pixmaps/Modern/load-watch.png new file mode 100644 index 000000000..8c84fbbd6 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-watch.png differ diff --git a/src/resources/pixmaps/Modern/load-water.png b/src/resources/pixmaps/Modern/load-water.png new file mode 100644 index 000000000..12211df97 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-water.png differ diff --git a/src/resources/pixmaps/Modern/load-weapon.png b/src/resources/pixmaps/Modern/load-weapon.png new file mode 100644 index 000000000..98ca002f5 Binary files /dev/null and b/src/resources/pixmaps/Modern/load-weapon.png differ diff --git a/src/resources/pixmaps/Modern/load-whiteword.png b/src/resources/pixmaps/Modern/load-whiteword.png new file mode 100644 index 000000000..d17b363fa Binary files /dev/null and b/src/resources/pixmaps/Modern/load-whiteword.png differ diff --git a/src/resources/pixmaps/Modern/mellon.png b/src/resources/pixmaps/Modern/mellon.png new file mode 100644 index 000000000..54ad7ea81 Binary files /dev/null and b/src/resources/pixmaps/Modern/mellon.png differ diff --git a/src/resources/pixmaps/Modern/mob-aggmob.png b/src/resources/pixmaps/Modern/mob-aggmob.png new file mode 100644 index 000000000..bf5685306 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-aggmob.png differ diff --git a/src/resources/pixmaps/Modern/mob-armourshop.png b/src/resources/pixmaps/Modern/mob-armourshop.png new file mode 100644 index 000000000..ea4571131 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-armourshop.png differ diff --git a/src/resources/pixmaps/Modern/mob-clericguild.png b/src/resources/pixmaps/Modern/mob-clericguild.png new file mode 100644 index 000000000..2cf36de4b Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-clericguild.png differ diff --git a/src/resources/pixmaps/Modern/mob-elitemob.png b/src/resources/pixmaps/Modern/mob-elitemob.png new file mode 100644 index 000000000..382f4b855 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-elitemob.png differ diff --git a/src/resources/pixmaps/Modern/mob-foodshop.png b/src/resources/pixmaps/Modern/mob-foodshop.png new file mode 100644 index 000000000..4fe237af4 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-foodshop.png differ diff --git a/src/resources/pixmaps/Modern/mob-guild.png b/src/resources/pixmaps/Modern/mob-guild.png new file mode 100644 index 000000000..98663e129 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-guild.png differ diff --git a/src/resources/pixmaps/Modern/mob-mageguild.png b/src/resources/pixmaps/Modern/mob-mageguild.png new file mode 100644 index 000000000..1b352b9b4 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-mageguild.png differ diff --git a/src/resources/pixmaps/Modern/mob-milkable.png b/src/resources/pixmaps/Modern/mob-milkable.png new file mode 100644 index 000000000..8a522017e Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-milkable.png differ diff --git a/src/resources/pixmaps/Modern/mob-passivemob.png b/src/resources/pixmaps/Modern/mob-passivemob.png new file mode 100644 index 000000000..03db6bb69 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-passivemob.png differ diff --git a/src/resources/pixmaps/Modern/mob-petshop.png b/src/resources/pixmaps/Modern/mob-petshop.png new file mode 100644 index 000000000..234b94f1d Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-petshop.png differ diff --git a/src/resources/pixmaps/Modern/mob-questmob.png b/src/resources/pixmaps/Modern/mob-questmob.png new file mode 100644 index 000000000..3cabae1d2 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-questmob.png differ diff --git a/src/resources/pixmaps/Modern/mob-rangerguild.png b/src/resources/pixmaps/Modern/mob-rangerguild.png new file mode 100644 index 000000000..a94b183d2 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-rangerguild.png differ diff --git a/src/resources/pixmaps/Modern/mob-rattlesnake.png b/src/resources/pixmaps/Modern/mob-rattlesnake.png new file mode 100644 index 000000000..c4f0b0229 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-rattlesnake.png differ diff --git a/src/resources/pixmaps/Modern/mob-rent.png b/src/resources/pixmaps/Modern/mob-rent.png new file mode 100644 index 000000000..133512cdb Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-rent.png differ diff --git a/src/resources/pixmaps/Modern/mob-scoutguild.png b/src/resources/pixmaps/Modern/mob-scoutguild.png new file mode 100644 index 000000000..00d15a6d6 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-scoutguild.png differ diff --git a/src/resources/pixmaps/Modern/mob-shop.png b/src/resources/pixmaps/Modern/mob-shop.png new file mode 100644 index 000000000..169d29bcb Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-shop.png differ diff --git a/src/resources/pixmaps/Modern/mob-smob.png b/src/resources/pixmaps/Modern/mob-smob.png new file mode 100644 index 000000000..fd43a9da2 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-smob.png differ diff --git a/src/resources/pixmaps/Modern/mob-warriorguild.png b/src/resources/pixmaps/Modern/mob-warriorguild.png new file mode 100644 index 000000000..e76bceb86 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-warriorguild.png differ diff --git a/src/resources/pixmaps/Modern/mob-weaponshop.png b/src/resources/pixmaps/Modern/mob-weaponshop.png new file mode 100644 index 000000000..4bfd592e3 Binary files /dev/null and b/src/resources/pixmaps/Modern/mob-weaponshop.png differ diff --git a/src/resources/pixmaps/Modern/no-ride.png b/src/resources/pixmaps/Modern/no-ride.png new file mode 100644 index 000000000..6c567753e Binary files /dev/null and b/src/resources/pixmaps/Modern/no-ride.png differ diff --git a/src/resources/pixmaps/Modern/room-highlight.png b/src/resources/pixmaps/Modern/room-highlight.png new file mode 100644 index 000000000..f49628f5a Binary files /dev/null and b/src/resources/pixmaps/Modern/room-highlight.png differ diff --git a/src/resources/pixmaps/Modern/room-sel-distant.png b/src/resources/pixmaps/Modern/room-sel-distant.png new file mode 100644 index 000000000..5a1ed4dca Binary files /dev/null and b/src/resources/pixmaps/Modern/room-sel-distant.png differ diff --git a/src/resources/pixmaps/Modern/room-sel-move-bad.png b/src/resources/pixmaps/Modern/room-sel-move-bad.png new file mode 100644 index 000000000..26c2d0d31 Binary files /dev/null and b/src/resources/pixmaps/Modern/room-sel-move-bad.png differ diff --git a/src/resources/pixmaps/Modern/room-sel-move-good.png b/src/resources/pixmaps/Modern/room-sel-move-good.png new file mode 100644 index 000000000..363ca342d Binary files /dev/null and b/src/resources/pixmaps/Modern/room-sel-move-good.png differ diff --git a/src/resources/pixmaps/Modern/room-sel.png b/src/resources/pixmaps/Modern/room-sel.png new file mode 100644 index 000000000..58eafad6f Binary files /dev/null and b/src/resources/pixmaps/Modern/room-sel.png differ diff --git a/src/resources/pixmaps/Modern/stream-in-down.png b/src/resources/pixmaps/Modern/stream-in-down.png new file mode 100644 index 000000000..f69a086a2 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-in-down.png differ diff --git a/src/resources/pixmaps/Modern/stream-in-east.png b/src/resources/pixmaps/Modern/stream-in-east.png new file mode 100644 index 000000000..c14be8a94 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-in-east.png differ diff --git a/src/resources/pixmaps/Modern/stream-in-north.png b/src/resources/pixmaps/Modern/stream-in-north.png new file mode 100644 index 000000000..96aa9a3f9 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-in-north.png differ diff --git a/src/resources/pixmaps/Modern/stream-in-south.png b/src/resources/pixmaps/Modern/stream-in-south.png new file mode 100644 index 000000000..c5724c6ca Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-in-south.png differ diff --git a/src/resources/pixmaps/Modern/stream-in-up.png b/src/resources/pixmaps/Modern/stream-in-up.png new file mode 100644 index 000000000..8c9c30d80 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-in-up.png differ diff --git a/src/resources/pixmaps/Modern/stream-in-west.png b/src/resources/pixmaps/Modern/stream-in-west.png new file mode 100644 index 000000000..0c7cc6f8c Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-in-west.png differ diff --git a/src/resources/pixmaps/Modern/stream-out-down.png b/src/resources/pixmaps/Modern/stream-out-down.png new file mode 100644 index 000000000..d7c7cb7f5 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-out-down.png differ diff --git a/src/resources/pixmaps/Modern/stream-out-east.png b/src/resources/pixmaps/Modern/stream-out-east.png new file mode 100644 index 000000000..2d60a6686 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-out-east.png differ diff --git a/src/resources/pixmaps/Modern/stream-out-north.png b/src/resources/pixmaps/Modern/stream-out-north.png new file mode 100644 index 000000000..d60496366 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-out-north.png differ diff --git a/src/resources/pixmaps/Modern/stream-out-south.png b/src/resources/pixmaps/Modern/stream-out-south.png new file mode 100644 index 000000000..7f0268ccd Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-out-south.png differ diff --git a/src/resources/pixmaps/Modern/stream-out-up.png b/src/resources/pixmaps/Modern/stream-out-up.png new file mode 100644 index 000000000..e3cec9fce Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-out-up.png differ diff --git a/src/resources/pixmaps/Modern/stream-out-west.png b/src/resources/pixmaps/Modern/stream-out-west.png new file mode 100644 index 000000000..7402155b3 Binary files /dev/null and b/src/resources/pixmaps/Modern/stream-out-west.png differ diff --git a/src/resources/pixmaps/Modern/terrain-cavern.png b/src/resources/pixmaps/Modern/terrain-cavern.png new file mode 100644 index 000000000..ccda82c87 Binary files /dev/null and b/src/resources/pixmaps/Modern/terrain-cavern.png differ diff --git a/src/resources/pixmaps/Modern/terrain-deathtrap.png b/src/resources/pixmaps/Modern/terrain-deathtrap.png new file mode 100644 index 000000000..8380c8bc0 Binary files /dev/null and b/src/resources/pixmaps/Modern/terrain-deathtrap.png differ diff --git a/src/resources/pixmaps/Modern/terrain-indoors.png b/src/resources/pixmaps/Modern/terrain-indoors.png new file mode 100644 index 000000000..1fbdb3ad2 Binary files /dev/null and b/src/resources/pixmaps/Modern/terrain-indoors.png differ diff --git a/src/resources/pixmaps/Modern/terrain-tunnel.png b/src/resources/pixmaps/Modern/terrain-tunnel.png new file mode 100644 index 000000000..7dc55486a Binary files /dev/null and b/src/resources/pixmaps/Modern/terrain-tunnel.png differ diff --git a/src/resources/pixmaps/Modern/terrain-undefined.png b/src/resources/pixmaps/Modern/terrain-undefined.png new file mode 100644 index 000000000..46c2f8cd5 Binary files /dev/null and b/src/resources/pixmaps/Modern/terrain-undefined.png differ diff --git a/src/resources/pixmaps/Modern/terrain-underwater.png b/src/resources/pixmaps/Modern/terrain-underwater.png new file mode 100644 index 000000000..35834eb24 Binary files /dev/null and b/src/resources/pixmaps/Modern/terrain-underwater.png differ diff --git a/src/resources/pixmaps/Modern/wall-east.png b/src/resources/pixmaps/Modern/wall-east.png new file mode 100644 index 000000000..e150f029c Binary files /dev/null and b/src/resources/pixmaps/Modern/wall-east.png differ diff --git a/src/resources/pixmaps/Modern/wall-north.png b/src/resources/pixmaps/Modern/wall-north.png new file mode 100644 index 000000000..6ea5710f3 Binary files /dev/null and b/src/resources/pixmaps/Modern/wall-north.png differ diff --git a/src/resources/pixmaps/Modern/wall-south.png b/src/resources/pixmaps/Modern/wall-south.png new file mode 100644 index 000000000..a7e1771d8 Binary files /dev/null and b/src/resources/pixmaps/Modern/wall-south.png differ diff --git a/src/resources/pixmaps/Modern/wall-west.png b/src/resources/pixmaps/Modern/wall-west.png new file mode 100644 index 000000000..0728e5bed Binary files /dev/null and b/src/resources/pixmaps/Modern/wall-west.png differ