Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 43 additions & 6 deletions NERODevelopment/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,41 @@
cmake_minimum_required(VERSION 3.21.1)

project(NEROApp LANGUAGES CXX)
project(NEROApp LANGUAGES CXX C)

# Find Qt6 first before version checks
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Quick Network Mqtt Protobuf)

qt_standard_project_setup(REQUIRES 6.8)

# ============================================================
# DOOM Integration — auto-download doomgeneric engine
# ============================================================
include(FetchContent)
FetchContent_Declare(
doomgeneric
GIT_REPOSITORY https://github.com/ozkl/doomgeneric.git
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(doomgeneric)

set(DOOMGENERIC_DIR ${doomgeneric_SOURCE_DIR}/doomgeneric)

file(GLOB DOOM_SOURCES ${DOOMGENERIC_DIR}/*.c)

# Remove platform backends we don't use (we provide our own in doomcontroller.cpp)
# Remove ALL platform backends (doomgeneric_*.c) — we provide our own in doomcontroller.cpp
# The core engine file is doomgeneric.c (no underscore) so it's kept
list(FILTER DOOM_SOURCES EXCLUDE REGEX "doomgeneric_[a-z].*\\.c$")

# Remove SDL and Allegro sound/music backends — we don't have those libraries
list(FILTER DOOM_SOURCES EXCLUDE REGEX "i_sdl.*\\.c$")
list(FILTER DOOM_SOURCES EXCLUDE REGEX "i_allegro.*\\.c$")

# Suppress warnings in third-party DOOM code
set_source_files_properties(${DOOM_SOURCES} PROPERTIES COMPILE_FLAGS "-w")

# ============================================================

# Consolidate all sources in one place
set(PROJECT_SOURCES
# Headers - Constants
Expand All @@ -24,6 +53,7 @@ set(PROJECT_SOURCES
src/controllers/speedcontroller.h
src/controllers/snakecontroller.h
src/controllers/tankcontroller.h
src/controllers/doomcontroller.h

# Headers - Models
src/models/model.h
Expand Down Expand Up @@ -51,6 +81,7 @@ set(PROJECT_SOURCES
src/controllers/speedcontroller.cpp
src/controllers/snakecontroller.cpp
src/controllers/tankcontroller.cpp
src/controllers/doomcontroller.cpp

# Implementation - Models
src/models/model.cpp
Expand All @@ -73,20 +104,19 @@ set(PROJECT_SOURCES

set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOMOC ON)
# Create executable with all sources consolidated
qt_add_executable(NEROApp ${PROJECT_SOURCES}


# Create executable with all sources + DOOM engine
qt_add_executable(NEROApp ${PROJECT_SOURCES} ${DOOM_SOURCES})

)
# Add doomgeneric headers to include path
target_include_directories(NEROApp PRIVATE ${DOOMGENERIC_DIR})

# Add protobuf
qt_add_protobuf(NEROApp
PROTO_FILES
src/proto/serverdata/serverdata.proto
)


# Link libraries
target_link_libraries(NEROApp PRIVATE
Qt6::Core
Expand All @@ -100,6 +130,13 @@ target_link_libraries(NEROApp PRIVATE

set(CMAKE_OBJECT_PATH_MAX 500)

# Copy WAD file to build directory if it exists
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/resources/doom/DOOM1.WAD)
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/resources/doom/DOOM1.WAD
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
message(STATUS "DOOM: WAD file copied to build directory")
endif()

# include the qml config
include(${CMAKE_CURRENT_SOURCE_DIR}/qmlmodules)
include(${CMAKE_CURRENT_SOURCE_DIR}/qmlcomponents)
Expand Down
1 change: 1 addition & 0 deletions NERODevelopment/content/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ qt6_add_qml_module(content
TorqueAdj.qml
SpeedMode.qml
Snake.qml
DoomView.qml
TimerDisplay.qml
MaxSpeedComparator.qml
MaxDrawGraph.qml
Expand Down
174 changes: 174 additions & 0 deletions NERODevelopment/content/DoomView.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
import QtQuick 2.15
import QtQuick.Controls 2.15

Item {
id: doomView
anchors.fill: parent
focus: doomView.isFocused
visible: true

property bool isFocused: false

readonly property int doomKeyUp: 0xAD
readonly property int doomKeyDown: 0xAF
readonly property int doomKeyLeft: 0xAC
readonly property int doomKeyRight: 0xAE
readonly property int doomKeyEnter: 0x0D
readonly property int doomKeyUse: 0xA2
readonly property int doomKeyFire: 0xA3
readonly property int doomKeyEscape: 0x1B

// Hold to exit
property bool escHeld: false

Timer {
id: escExitTimer
interval: 1000
repeat: false
onTriggered: {
doomView.escHeld = true
if (doomController.running) {
doomController.stopGame()
}
navigationController.goHome()
}
}

onIsFocusedChanged: {
if (isFocused) {
if (!doomController.running) {
doomController.startGame()
}
} else {
escExitTimer.stop()
escHeld = false
if (doomController.running) {
doomController.stopGame()
}
}
}

Rectangle {
anchors.fill: parent
color: "black"
}

Image {
id: doomFrame
anchors.centerIn: parent

width: {
var scaleX = parent.width / 320
var scaleY = parent.height / 200
var scale = Math.min(scaleX, scaleY)
return 320 * scale
}
height: {
var scaleX = parent.width / 320
var scaleY = parent.height / 200
var scale = Math.min(scaleX, scaleY)
return 200 * scale
}

source: doomController.running
? "image://doom/frame?" + doomController.frameCounter
: ""

smooth: false
fillMode: Image.Stretch
cache: false
visible: doomController.running
}

Keys.onPressed: function(event) {
if (event.isAutoRepeat) return

switch (event.key) {
case Qt.Key_Up:
doomController.sendKey(doomKeyUp, true)
event.accepted = true
break
case Qt.Key_Down:
doomController.sendKey(doomKeyDown, true)
event.accepted = true
break
case Qt.Key_Left:
doomController.sendKey(doomKeyLeft, true)
event.accepted = true
break
case Qt.Key_Right:
doomController.sendKey(doomKeyRight, true)
event.accepted = true
break
case Qt.Key_Space:
doomController.sendKey(doomKeyUse, true)
event.accepted = true
break
case Qt.Key_Return:
if (!doomController.running) {
doomController.startGame()
} else {
doomController.sendKey(doomKeyEnter, true)
doomController.sendKey(doomKeyFire, true)
}
event.accepted = true
break
case Qt.Key_Escape:
if (doomController.running) {
escExitTimer.start()
} else {
navigationController.goHome()
}
event.accepted = true
break
}
}

Keys.onReleased: function(event) {
if (event.isAutoRepeat) return

switch (event.key) {
case Qt.Key_Up:
doomController.sendKey(doomKeyUp, false)
event.accepted = true
break
case Qt.Key_Down:
doomController.sendKey(doomKeyDown, false)
event.accepted = true
break
case Qt.Key_Left:
doomController.sendKey(doomKeyLeft, false)
event.accepted = true
break
case Qt.Key_Right:
doomController.sendKey(doomKeyRight, false)
event.accepted = true
break
case Qt.Key_Space:
doomController.sendKey(doomKeyUse, false)
event.accepted = true
break
case Qt.Key_Return:
doomController.sendKey(doomKeyEnter, false)
doomController.sendKey(doomKeyFire, false)
event.accepted = true
break
case Qt.Key_Escape:
escExitTimer.stop()
if (!escHeld && doomController.running) {
doomController.sendKey(doomKeyEscape, true)
doomController.sendKey(doomKeyEscape, false)
}
escHeld = false
event.accepted = true
break
}
}

Component.onDestruction: {
escExitTimer.stop()
if (doomController.running) {
doomController.stopGame()
}
}
}
Binary file added NERODevelopment/resources/doom/DOOM1.WAD
Binary file not shown.
Loading