diff --git a/.gitignore b/.gitignore index 6b1fe13..0b1e8fe 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,5 @@ build/*.exp build/*.lib build/*.exe build/log.txt -build/maps/_quickload.doqm +build/maps/_quickload.dqm build/.doq_settings diff --git a/README.md b/README.md index 52f6f78..a93ae31 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ **currently work in progress!** # maps -#### Info for creating maps is in [DOQM file spec](doqm_format_spec.md) +#### Info for creating maps is in [DQM file spec](doqm_format_spec.md) Maps are a top-down, ascii view on the map, and different characters correspond to different tiles - this means anyone can edit maps with just a simple text editor. -`.doqm` file extension is used, even though the underlying file is just plain text. +`.dqm` file extension is used, even though the underlying file is just plain text. > The raw tile table is in [map.odin](/doq/map.odin) as `map_tileKind_t` @@ -32,9 +32,6 @@ health pickup `h` is translated to `empty` tile, and the pickup itself gets spaw # TODO -- settings: - - field of view - - background music volume - 3D audio - simple profiler, maybe with [chrome://tracing](chrome://tracing) - particles diff --git a/build/maps/README.md b/build/maps/README.md index 038f8a4..ecf9dd5 100644 --- a/build/maps/README.md +++ b/build/maps/README.md @@ -2,5 +2,5 @@ Maps with underscore `_` as a first character are hidden in the map selection menu. -You can use `_quickload.doqm` map file to instantly load a level, and bypass all the menu's. +You can use `_quickload.dqm` map file to instantly load a level, and bypass all the menu's. Subdirectories are supported in the map selection menu, but their name isn't relative to this folder, it's just the last folder in path. \ No newline at end of file diff --git a/build/maps/__quickload.doqm b/build/maps/__quickload.dqm similarity index 100% rename from build/maps/__quickload.doqm rename to build/maps/__quickload.dqm diff --git a/build/maps/dev/all_tiles.doqm b/build/maps/dev/all_tiles.dqm similarity index 100% rename from build/maps/dev/all_tiles.doqm rename to build/maps/dev/all_tiles.dqm diff --git a/build/maps/dev/empty.doqm b/build/maps/dev/empty.dqm similarity index 100% rename from build/maps/dev/empty.doqm rename to build/maps/dev/empty.dqm diff --git a/build/maps/dev/test0.doqm b/build/maps/dev/test0.dqm similarity index 100% rename from build/maps/dev/test0.doqm rename to build/maps/dev/test0.dqm diff --git a/build/maps/dev/test1.doqm b/build/maps/dev/test1.dqm similarity index 100% rename from build/maps/dev/test1.doqm rename to build/maps/dev/test1.dqm diff --git a/build/maps/dev/test2.doqm b/build/maps/dev/test2.dqm similarity index 100% rename from build/maps/dev/test2.doqm rename to build/maps/dev/test2.dqm diff --git a/build/maps/example0 - Copy.doqm b/build/maps/example0 - Copy.doqm deleted file mode 100644 index b5fc2fc..0000000 --- a/build/maps/example0 - Copy.doqm +++ /dev/null @@ -1,21 +0,0 @@ -{ - mapName: "example 0" - skyColor: 1.0 0.2 0.0 - fogStrength: 1.2 - startPlayerDir: 0.0 -1.0 - nextMapName: "parkour0.doqm" -} - -#######--####### -#O s o#--#ewFwe# -c c--c c -# o#--#Ok # -c c--c k c -#h h #--# # -##wew##--# o oO# -lcpww#---#wwwww# -##ppw#####wwwGw# -#Gpppppp-wwwwwww -#ppwKww###wwGww# -ccw#w###-##w#w## -e \ No newline at end of file diff --git a/build/maps/example0.doqm b/build/maps/example0.dqm similarity index 87% rename from build/maps/example0.doqm rename to build/maps/example0.dqm index dc7f019..72576ba 100644 --- a/build/maps/example0.doqm +++ b/build/maps/example0.dqm @@ -3,7 +3,7 @@ skyColor: 1.0 0.2 0.0 fogStrength: 1.2 startPlayerDir: 0.0 -1.0 - nextMapName: "parkour0.doqm" + nextMapName: "parkour0.dqm" } #######-------####### diff --git a/build/maps/parkour0.doqm b/build/maps/parkour0.dqm similarity index 100% rename from build/maps/parkour0.doqm rename to build/maps/parkour0.dqm diff --git a/build/models/shotgun.glb b/build/models/shotgun.glb index fdcd255..fd49680 100644 Binary files a/build/models/shotgun.glb and b/build/models/shotgun.glb differ diff --git a/build/shaders/postprocess.frag b/build/shaders/postprocess.frag index 3fded3b..852224a 100644 --- a/build/shaders/postprocess.frag +++ b/build/shaders/postprocess.frag @@ -149,8 +149,8 @@ void main() { //col = pow(col, vec3(1.0 / screengamma)); // gamma correction - col += dither(gl_FragCoord.xy)*0.3; - col = posterize(col, 8, 1.1); + col += dither(gl_FragCoord.xy)*0.25; + col = posterize(col, 12, 0.8); //col = gameboyColor(col); // if(gl_FragCoord.x < 30 && gl_FragCoord.y < 30) col = vec3(1,0,1); // debug diff --git a/build/shaders/tile.frag b/build/shaders/tile.frag index ba978b9..a1b082f 100644 --- a/build/shaders/tile.frag +++ b/build/shaders/tile.frag @@ -100,11 +100,11 @@ void main() { vec2 griduv = floor(uv*64.0)/64.0; //col += vec3(abs(fragNormal.x)*0.04 + fragNormal.y*0.04); vec3 gridpos = toGridPos(fragPosition*1.0001/TILE_WIDTH); - float gridnoise = simplex3d(gridpos*0.33); - gridnoise += sign(gridnoise)*0.25; + float gridnoise = simplex3d(gridpos*0.25); + gridnoise += sign(gridnoise)*0.2; gridnoise += simplex3d(gridpos); - gridnoise += sign(gridnoise)*0.25; - col += vec3(gridnoise*0.017); + gridnoise += sign(gridnoise)*0.2; + col += vec3(gridnoise*0.02); //float tileCenterDist = (pow(abs(mod(griduv.x,1.0) - 0.5)*2.0, 3.0)+pow(abs(mod(griduv.y,1.0) - 0.5)*2.0, 3.0))*0.5; //col = vec3(pow(tileCenterDist, 0.5)); //col *= vec3(1.0) + vec3(abs(gridnoise)*tileCenterDist*simplex3d(toGridPos(fragPosition/TILE_WIDTH)*0.4)*10.0); diff --git a/doq/doq.odin b/doq/doq.odin index 8c71189..c02fc9b 100644 --- a/doq/doq.odin +++ b/doq/doq.odin @@ -52,8 +52,12 @@ settings : struct { drawFPS : bool, debugIsEnabled : bool, audioMasterVolume : f32, + audioMusicVolume : f32, crosshairOpacity : f32, mouseSensitivity : f32, + FOV : f32, + viewmodelFOV : f32, + gunXOffset : f32, } @@ -80,10 +84,18 @@ _doq_main :: proc() { println("### frame =", framespassed, "deltatime =", deltatime) framespassed += 1 - settings.audioMasterVolume = clamp(settings.audioMasterVolume, 0.0, 1.0) - settings.crosshairOpacity = clamp(settings.crosshairOpacity, 0.0, 1.0) - settings.mouseSensitivity = clamp(settings.mouseSensitivity, 0.1, 5.0) + // fixup + settings.audioMasterVolume = clamp(settings.audioMasterVolume, 0.0, 1.0) + settings.audioMusicVolume = clamp(settings.audioMusicVolume, 0.0, 1.0) + settings.crosshairOpacity = clamp(settings.crosshairOpacity, 0.0, 1.0) + settings.mouseSensitivity = clamp(settings.mouseSensitivity, 0.1, 5.0) + settings.FOV = clamp(settings.FOV, 20.0, 170.0) + settings.viewmodelFOV = clamp(settings.viewmodelFOV, 80.0, 120.0) + settings.gunXOffset = clamp(settings.gunXOffset, -0.4, 0.4) rl.SetMasterVolume(settings.audioMasterVolume) + + camera.fovy = settings.FOV + viewmodelCamera.fovy = settings.viewmodelFOV rl.DisableCursor() @@ -92,6 +104,7 @@ _doq_main :: proc() { } + if app_updatePathKind != .GAME do gameStopSounds() switch app_updatePathKind { case .LOADSCREEN: @@ -286,14 +299,12 @@ _app_init :: proc() { camera.position = {0, 3, 0} camera.target = {} camera.up = vec3{0.0, 1.0, 0.0} - camera.fovy = PLAYER_FOV camera.projection = rl.CameraProjection.PERSPECTIVE rl.SetCameraMode(camera, rl.CameraMode.CUSTOM) viewmodelCamera.position = {0,0,0} viewmodelCamera.target = {0,0,1} viewmodelCamera.up = {0,1,0} - viewmodelCamera.fovy = PLAYER_VIEWMODEL_FOV viewmodelCamera.projection = rl.CameraProjection.PERSPECTIVE rl.SetCameraMode(viewmodelCamera, rl.CameraMode.CUSTOM) @@ -311,8 +322,8 @@ _app_init :: proc() { map_clearAll() map_data.bounds = {MAP_MAX_WIDTH, MAP_MAX_WIDTH} - if os.is_file(appendToAssetPath("maps", "_quickload.doqm")) { - map_loadFromFile("_quickload.doqm") + if os.is_file(appendToAssetPath("maps", "_quickload.dqm")) { + map_loadFromFile("_quickload.dqm") app_setUpdatePathKind(.GAME) } @@ -445,12 +456,19 @@ world_reset :: proc() { + settings_setDefault :: proc() { - settings.drawFPS = false - settings.debugIsEnabled = false - settings.audioMasterVolume = 0.5 - settings.crosshairOpacity = 0.2 - settings.mouseSensitivity = 1.0 + settings = { + drawFPS = false, + debugIsEnabled = false, + audioMasterVolume = 0.5, + audioMusicVolume = 0.4, + crosshairOpacity = 0.2, + mouseSensitivity = 1.0, + FOV = 100.0, + viewmodelFOV = 100.0, + gunXOffset = 0.1, + } } settings_getFilePath :: proc() -> string { @@ -463,8 +481,12 @@ settings_saveToFile :: proc() { "drawFPS", SERI_ATTRIB_SEPARATOR, " ", settings.drawFPS, "\n", "debugIsEnabled", SERI_ATTRIB_SEPARATOR, " ", settings.debugIsEnabled, "\n", "audioMasterVolume", SERI_ATTRIB_SEPARATOR, " ", settings.audioMasterVolume, "\n", + "audioMusicVolume", SERI_ATTRIB_SEPARATOR, " ", settings.audioMusicVolume, "\n", "crosshairOpacity", SERI_ATTRIB_SEPARATOR, " ", settings.crosshairOpacity, "\n", "mouseSensitivity", SERI_ATTRIB_SEPARATOR, " ", settings.mouseSensitivity, "\n", + "FOV", SERI_ATTRIB_SEPARATOR, " ", settings.FOV, "\n", + "viewmodelFOV", SERI_ATTRIB_SEPARATOR, " ", settings.viewmodelFOV, "\n", + "gunXOffset", SERI_ATTRIB_SEPARATOR, " ", settings.gunXOffset, "\n", }, sep="", ) @@ -487,13 +509,26 @@ settings_loadFromFile :: proc() { if seri_attribMatch(buf, &index, "drawFPS") do settings.drawFPS = seri_readBool(buf, &index) if seri_attribMatch(buf, &index, "debugIsEnabled") do settings.debugIsEnabled = seri_readBool(buf, &index) if seri_attribMatch(buf, &index, "audioMasterVolume") do settings.audioMasterVolume = seri_readF32 (buf, &index) + if seri_attribMatch(buf, &index, "audioMusicVolume") do settings.audioMusicVolume = seri_readF32 (buf, &index) if seri_attribMatch(buf, &index, "crosshairOpacity") do settings.crosshairOpacity = seri_readF32 (buf, &index) if seri_attribMatch(buf, &index, "mouseSensitivity") do settings.mouseSensitivity = seri_readF32 (buf, &index) + if seri_attribMatch(buf, &index, "FOV") do settings.FOV = seri_readF32 (buf, &index) + if seri_attribMatch(buf, &index, "viewmodelFOV") do settings.viewmodelFOV = seri_readF32 (buf, &index) + if seri_attribMatch(buf, &index, "gunXOffset") do settings.gunXOffset = seri_readF32 (buf, &index) } } +gameStopSounds :: proc() { + rl.StopSound(map_data.elevatorSound) + rl.StopSound(player_data.swooshSound) +} + + + + + // // BULLETS // diff --git a/doq/gui.odin b/doq/gui.odin index 5fbbbf1..8be9d5b 100644 --- a/doq/gui.odin +++ b/doq/gui.odin @@ -201,13 +201,18 @@ menu_updateAndDrawPauseMenu :: proc() { gui_menuButton_t{"exit to desktop", &app_shouldExitNextFrame}, gui_menuTitle_t{"settings"}, - gui_menuFloat_t{"audio volume", &settings.audioMasterVolume}, - gui_menuFloat_t{"mouse sensitivity", &settings.mouseSensitivity}, - gui_menuFloat_t{"crosshair visibility", &settings.crosshairOpacity}, - gui_menuBool_t{"show FPS", &settings.drawFPS}, - gui_menuBool_t{"enable debug mode", &settings.debugIsEnabled}, + gui_menuFloat_t{"audio volume", &settings.audioMasterVolume, 0.05}, + gui_menuFloat_t{"music volume", &settings.audioMusicVolume, 0.05}, + gui_menuFloat_t{"mouse sensitivity", &settings.mouseSensitivity, 0.05}, + gui_menuFloat_t{"crosshair visibility", &settings.crosshairOpacity, 0.1}, + gui_menuFloat_t{"gun X offset", &settings.gunXOffset, 0.025}, + gui_menuFloat_t{"fild of view", &settings.FOV, 10.0}, + gui_menuFloat_t{"viewmodel field of view", &settings.viewmodelFOV, 10.0}, + gui_menuBool_t{"show FPS", &settings.drawFPS}, + gui_menuBool_t{"enable debug mode", &settings.debugIsEnabled}, } + menu_drawNavTips() if gui_updateAndDrawElemBuf(elems[:]) { settings_saveToFile() } @@ -235,6 +240,7 @@ menu_updateAndDrawMainMenuUpdatePath :: proc() { rl.BeginDrawing() rl.ClearBackground(rl.ColorFromNormalized(MENU_BACKGROUND)) + menu_drawNavTips() menu_drawDebugUI() if menu_data.mapSelectIsOpen { @@ -264,11 +270,15 @@ menu_updateAndDrawMainMenuUpdatePath :: proc() { gui_menuButton_t{"exit to desktop", &app_shouldExitNextFrame}, gui_menuTitle_t{"settings"}, - gui_menuFloat_t{"audio volume", &settings.audioMasterVolume}, - gui_menuFloat_t{"mouse sensitivity", &settings.mouseSensitivity}, - gui_menuFloat_t{"crosshair visibility", &settings.crosshairOpacity}, - gui_menuBool_t{"show FPS", &settings.drawFPS}, - gui_menuBool_t{"enable debug mode", &settings.debugIsEnabled}, + gui_menuFloat_t{"audio volume", &settings.audioMasterVolume, 0.05}, + gui_menuFloat_t{"music volume", &settings.audioMusicVolume, 0.05}, + gui_menuFloat_t{"mouse sensitivity", &settings.mouseSensitivity, 0.05}, + gui_menuFloat_t{"crosshair visibility", &settings.crosshairOpacity, 0.1}, + gui_menuFloat_t{"gun size offset", &settings.gunXOffset, 0.025}, + gui_menuFloat_t{"fild of view", &settings.FOV, 10.0}, + gui_menuFloat_t{"viewmodel field of view", &settings.viewmodelFOV, 10.0}, + gui_menuBool_t{"show FPS", &settings.drawFPS}, + gui_menuBool_t{"enable debug mode", &settings.debugIsEnabled}, } if gui_updateAndDrawElemBuf(elems[:]) { @@ -315,7 +325,7 @@ menu_mainMenuFetchMapSelectFiles :: proc() { if fileinfo.name[0] == '_' do continue // hidden dotindex := strings.index_byte(fileinfo.name, '.') if dotindex == 0 do continue - if fileinfo.name[dotindex:] != ".doqm" do continue // check suffix + if fileinfo.name[dotindex:] != ".dqm" do continue // check suffix //menu_data.mapSelectFileElems[menu_data.mapSelectFileElemsCount] = gui_menuButton_t{fileinfo.name[:dotindex], &menu_data.mapSelectButtonBool} menu_data.mapSelectFileElems[menu_data.mapSelectFileElemsCount] = gui_menuFileButton_t{ fileinfo.name[:dotindex], fileinfo.fullpath, &menu_data.mapSelectButtonBool, @@ -353,6 +363,7 @@ menu_updateAndDrawLoadScreenUpdatePath :: proc() { rl.BeginDrawing() rl.ClearBackground(rl.ColorFromNormalized(linalg.lerp(vec4{0,0,0,0}, MENU_BACKGROUND, unfade))) + OFFS :: 200 STARTSCALE :: 12.0 scale := glsl.min( @@ -380,6 +391,17 @@ menu_updateAndDrawLoadScreenUpdatePath :: proc() { +// draw info about the menu navigation +menu_drawNavTips :: proc() { + SIZE :: 25.0 + + gui_drawText( + {SIZE*2.0, f32(windowSizeY)-SIZE*3}, SIZE, {200,200,200,120}, + "hold CTRL to skip to next title / edit values faster", + ) +} + + @@ -405,6 +427,7 @@ gui_menuBool_t :: struct { gui_menuFloat_t :: struct { name : string, val : ^f32, + step : f32, } gui_menuTitle_t :: struct { @@ -538,11 +561,14 @@ gui_updateAndDrawElemBuf :: proc(elems : []gui_menuElem_t) -> bool { isEdited = true } case gui_menuFloat_t: + step := elem.step + if rl.IsKeyDown(rl.KeyboardKey.LEFT_CONTROL) do step *= 5.0 + if rl.IsKeyPressed(rl.KeyboardKey.RIGHT) { - elem.val^ += 0.1 + elem.val^ += step isEdited = true } else if rl.IsKeyPressed(rl.KeyboardKey.LEFT) { - elem.val^ -= 0.1 + elem.val^ -= step isEdited = true } case gui_menuTitle_t: diff --git a/doq/player.odin b/doq/player.odin index 285388a..e00b781 100644 --- a/doq/player.odin +++ b/doq/player.odin @@ -128,10 +128,10 @@ _player_update :: proc() { right := linalg.vector_normalize(linalg.matrix_mul_vector(player_data.lookRotMat3, vec3{1, 0, 0}) * vec3{1, 0, 1}) movedir : vec2 = {} - if rl.IsKeyDown(rl.KeyboardKey.W) do movedir.y += 1.0 - if rl.IsKeyDown(rl.KeyboardKey.A) do movedir.x += 1.0 - if rl.IsKeyDown(rl.KeyboardKey.S) do movedir.y -= 1.0 - if rl.IsKeyDown(rl.KeyboardKey.D) do movedir.x -= 1.0 + if rl.IsKeyDown(rl.KeyboardKey.W) do movedir.y += 1.0 + if rl.IsKeyDown(rl.KeyboardKey.A) do movedir.x += 1.0 + if rl.IsKeyDown(rl.KeyboardKey.S) do movedir.y -= 1.0 + if rl.IsKeyDown(rl.KeyboardKey.D) do movedir.x -= 1.0 //if rl.IsKeyPressed(rl.KeyboardKey.C)do player_data.pos.y -= 2.0 tilepos := map_worldToTile(player_data.pos) @@ -140,11 +140,11 @@ _player_update :: proc() { player_data.vel.y -= PLAYER_GRAVITY * deltatime // * (player_data.isOnGround ? 0.25 : 1.0) - isJumpInputOn :: proc() -> bool { return rl.IsKeyPressed(PLAYER_KEY_JUMP) } + isJumpInputOn :: proc() -> bool { return rl.IsKeyDown(PLAYER_KEY_JUMP) } jumped := isJumpInputOn() && player_data.isOnGround if jumped { - player_data.vel = phy_applyFrictionToVelocity(player_data.vel, clamp(player_data.onGroundTimer*18.0, 0.0, 1.0)*42.0) + player_data.vel = phy_applyFrictionToVelocity(player_data.vel, (clamp(player_data.onGroundTimer*4.0, 0.0, 1.0)-0.08)*45.0) player_data.vel.y = PLAYER_JUMP_SPEED player_data.pos.y += PHY_BOXCAST_EPS*1.1 if isInElevatorTile do player_data.pos.y += 0.05 * PLAYER_SIZE.y @@ -154,6 +154,7 @@ _player_update :: proc() { } + player_accelerate :: proc(dir : vec3, wishspeed : f32, accel : f32) { currentspeed := linalg.dot(player_data.vel, dir) addspeed := wishspeed - currentspeed @@ -167,7 +168,7 @@ _player_update :: proc() { wishdir := forw*movedir.y + right*movedir.x player_accelerate(wishdir, PLAYER_SPEED, - player_data.isOnGround ? PLAYER_GROUND_ACCELERATION : PLAYER_AIR_ACCELERATION) + player_data.isOnGround ? PLAYER_GROUND_ACCELERATION : (linalg.dot(player_data.vel, wishdir) > 0.0 ? PLAYER_AIR_ACCELERATION : PLAYER_AIR_ACCELERATION*2.0)) wishpos := player_data.pos + player_data.vel * deltatime @@ -197,8 +198,8 @@ _player_update :: proc() { player_data.rotImpulse.x += 0.03 } - if prevIsOnGround && !player_data.isOnGround && !jumped { - player_data.vel = phy_applyFrictionToVelocity(player_data.vel, 40) + if prevIsOnGround && !player_data.isOnGround && !jumped && player_data.onGroundTimer>0.1 { + player_data.vel = phy_applyFrictionToVelocity(player_data.vel, 42) } @@ -312,6 +313,8 @@ _player_update :: proc() { println("depth", depth) } + + if player_data.isOnGround do player_data.onGroundTimer += deltatime else do player_data.onGroundTimer = 0.0 } @@ -408,7 +411,7 @@ gun_calcViewportPos :: proc() -> vec3 { s := math.sin(player_data.stepTimer < 0.0 ? timepassed*PLAYER_HEAD_SIN_TIME*0.5 : player_data.stepTimer*0.5) * clamp(linalg.length(player_data.vel) * 0.01, 0.1, 1.0) * 0.04 * (player_data.isOnGround ? 1.0 : 0.05) kick := clamp(gun_data.timer*0.5, 0.0, 1.0)*0.8 - return vec3{-GUN_POS_X + player_data.lookRotEuler.z*0.5,-0.2 + s + kick*0.15, 0.48 - kick} + return vec3{-settings.gunXOffset + player_data.lookRotEuler.z*0.5,-0.2 + s + kick*0.15, 0.48 - kick} } gun_getMuzzleOffset :: proc() -> vec3 { @@ -488,7 +491,7 @@ _gun_update :: proc() { bullet_shootRaycast(muzzlepos, linalg.normalize(player_data.lookDir + GUN_SHOTGUN_SPREAD*0.7*(-up + right)), GUN_SHOTGUN_DAMAGE, RAD, COL, DUR) bullet_shootRaycast(muzzlepos, linalg.normalize(player_data.lookDir + GUN_SHOTGUN_SPREAD*0.7*(-up - right)), GUN_SHOTGUN_DAMAGE, RAD, COL, DUR) - player_data.vel -= player_data.lookDir*cast(f32)(cl < PLAYER_SIZE.y*2.1 ? 66.0 : 6.0) + player_data.vel -= player_data.lookDir*60.0 player_data.rotImpulse.x -= 0.15 playSound(gun_data.shotgunSound) @@ -503,7 +506,7 @@ _gun_update :: proc() { case gun_kind_t.LASERRIFLE: bullet_shootRaycast(muzzlepos, player_data.lookDir, GUN_LASERRIFLE_DAMAGE, 2.5, {1,0.3,0.2, 1.0}, 1.6) player_data.vel /= 1.25 - player_data.vel -= player_data.lookDir * 50 + player_data.vel -= player_data.lookDir * 40 player_data.rotImpulse.x -= 0.2 player_data.rotImpulse.y += 0.04 playSound(gun_data.laserrifleSound) diff --git a/doqm_format_spec.md b/doqm_format_spec.md index e85af3d..97105cf 100644 --- a/doqm_format_spec.md +++ b/doqm_format_spec.md @@ -1,9 +1,9 @@ -# DOQM map file format specification +# DQM map file format specification ## general info -Maps are saved as a plain text, but use the `.doqm` file extension. This means you can edit these levels with any text editor. Maps can also be split into two floors, using certain tiles. +Maps are saved as a plain text, but use the `.dqm` file extension. This means you can edit these levels with any text editor. Maps can also be split into two floors, using certain tiles. > **WARNING:** Text editors don't really use fonts with sqare aspect ratio characters, so the resulting level might end up looking a little stretched in-game. In some text @@ -58,7 +58,7 @@ example attribute declarations: attribute name | value | note -------------- | -------------- | ---- mapName | `text` | name of the map -nextMapName | `text` | next map to load after this one is finished. Needs to include the `.doqm` extension. Subfolders are ok. +nextMapName | `text` | next map to load after this one is finished. Needs to include the `.dqm` extension. Subfolders are ok. startPlayerDir | `xy decimal` | which direction should the player be looking when the game starts skyColor | `rgb decimal` | color of the sky and fog fogStrength | `decimal` | strength/attenuation of fog diff --git a/misc/brickbackground.png b/misc/brickbackground.png new file mode 100644 index 0000000..d1f0756 Binary files /dev/null and b/misc/brickbackground.png differ diff --git a/misc/brickbackground.png-autosave.kra b/misc/brickbackground.png-autosave.kra new file mode 100644 index 0000000..97ee728 Binary files /dev/null and b/misc/brickbackground.png-autosave.kra differ diff --git a/misc/dungeon_of_quake_logo.png b/misc/dungeon_of_quake_logo.png new file mode 100644 index 0000000..37a7ce9 Binary files /dev/null and b/misc/dungeon_of_quake_logo.png differ diff --git a/misc/dungeon_of_quake_logo_lowres.png b/misc/dungeon_of_quake_logo_lowres.png new file mode 100644 index 0000000..b4da3a4 Binary files /dev/null and b/misc/dungeon_of_quake_logo_lowres.png differ