From b6ea2fb5fac6e23deac58925a4ea5cc32d0233a5 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Wed, 20 May 2026 12:44:52 -0700 Subject: [PATCH] Added multiplayer page. Fixed numerous bugs with the alpha. --- base/guis/mainmenu.gui | 936 ++++++++++++++++++++++++++- neo/doom3/game/Game_local.cpp | 2 +- neo/engine/doomdll.vcxproj.user | 4 +- neo/engine/framework/DeclManager.cpp | 86 ++- neo/engine/framework/DeclTable.cpp | 46 ++ neo/engine/renderer/Material.cpp | 38 ++ neo/engine/renderer/Material.h | 3 +- 7 files changed, 1077 insertions(+), 38 deletions(-) diff --git a/base/guis/mainmenu.gui b/base/guis/mainmenu.gui index bc469786..5893250d 100644 --- a/base/guis/mainmenu.gui +++ b/base/guis/mainmenu.gui @@ -3,6 +3,10 @@ windowDef Desktop { backcolor 0, 0, 0, 1 float Button "0" float Menugui "1" + float MPPage "0" + float server_type "0" + float dedicated "0" + float lanSet "0" onESC { set "cmd" "close" ; @@ -90,7 +94,7 @@ windowDef Desktop { resetTime "Anim" "0" ; resetTime "Click1" "0" ; set "Button1o::visible" "0" ; - transition "Button2::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; + transition "Button2::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ; transition "Button3::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; transition "Button4::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; transition "Button5::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ; @@ -100,9 +104,9 @@ windowDef Desktop { windowDef Button2 { rect 380, 465, 512, 48 background "guis/assets/mainmenu/2" - matcolor 1 ,1, 1, 0.4 + matcolor 1 ,1, 1, 0.9 visible 1 -/* + onMouseEnter { set "Button2o::visible" "1" ; } @@ -110,15 +114,17 @@ windowDef Desktop { set "Button2o::visible" "0" ; } onAction { + set "cmd" "play guisounds_click" ; set "Desktop::Button" "2" ; + set "Desktop::MPPage" "0" ; resetTime "Anim" "0" ; + resetTime "Click2" "0" ; set "Button2o::visible" "0" ; transition "Button1::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ; transition "Button3::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; transition "Button4::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; transition "Button5::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ; } -*/ } windowDef Button3 { @@ -154,7 +160,7 @@ windowDef Desktop { resetTime "Click5" "0" ; set "Button5o::visible" "0" ; transition "Button1::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ; - transition "Button2::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; + transition "Button2::matcolor" "1 1 1 0.9" "1 1 1 0" "200" ; transition "Button3::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; transition "Button4::matcolor" "1 1 1 0.4" "1 1 1 0" "200" ; } @@ -226,6 +232,611 @@ windowDef Desktop { } } + + windowDef Text2a { + rect 354, 426, -572, 60 + text "Start Server" + font "fonts/chain" + textscale 0.75 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + resetTime "HideMPRoot" "0" ; + resetTime "ShowMPStart" "0" ; + } + } + windowDef Text2b { + rect 354, 471, -572, 60 + text "Join Server" + font "fonts/chain" + textscale 0.75 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + resetTime "HideMPRoot" "0" ; + resetTime "ShowMPJoin" "0" ; + } + } + windowDef Text2c { + rect 354, 516, -572, 60 + text "Server Browser" + font "fonts/chain" + textscale 0.75 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "Desktop::lanSet" "0" ; + resetTime "HideMPRoot" "0" ; + resetTime "ShowMPBrowser" "0" ; + set "cmd" "exec \"seta gui_filter_gameType 1\"" ; + set "cmd" "exec \"seta gui_filter_game 1\"" ; + resetTime "MPBrowserDelayedMasterRefresh" "0" ; + } + } + windowDef Text2d { + rect 354, 561, -572, 60 + text "Main Menu" + font "fonts/chain" + textscale 0.75 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_close" ; + resetTime "Main2" "0" ; + } + } + + // Multiplayer - Start Server page + windowDef MPStartTitle { + rect 354, 420, 572, 36 + text "Start Server" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + windowDef MPStartPlayerLabel { + rect 390, 457, 190, 24 + text "Player Name" + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + editDef MPStartPlayerName { + rect 590, 457, 300, 24 + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + hovercolor 1, 0.4, 0, 1 + backcolor 0, 0, 0, 0.25 + bordercolor 1, 0.1, 0.1, 0.5 + cvar "ui_name" + maxchars 24 + visible 0 + noevents 1 + } + windowDef MPStartServerLabel { + rect 390, 489, 190, 24 + text "Server Name" + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + editDef MPStartServerName { + rect 590, 489, 300, 24 + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + hovercolor 1, 0.4, 0, 1 + backcolor 0, 0, 0, 0.25 + bordercolor 1, 0.1, 0.1, 0.5 + cvar "si_name" + maxchars 32 + visible 0 + noevents 1 + } + windowDef MPStartMapLabel { + rect 390, 521, 190, 24 + text "Map" + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + choiceDef MPStartMapValue { + rect 590, 521, 300, 24 + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + choices "game/mp/d3dm3" + values "game/mp/d3dm3" + choiceType 1 + cvar "si_map" + visible 0 + noevents 1 + } + windowDef MPStartTypeLabel { + rect 390, 553, 190, 24 + text "Server Type" + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + choiceDef MPStartServerType { + rect 590, 553, 300, 24 + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + hovercolor 1, 0.4, 0, 1 + choices "Internet;LAN" + values "0;1" + choiceType 1 + gui "server_type" + visible 0 + noevents 1 + } + windowDef MPStartDedicatedLabel { + rect 390, 585, 190, 24 + text "Dedicated" + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + choiceDef MPStartDedicated { + rect 590, 585, 300, 24 + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + hovercolor 1, 0.4, 0, 1 + choices "Listen;Dedicated" + values "0;1" + choiceType 1 + gui "dedicated" + visible 0 + noevents 1 + } + windowDef MPStartPlayersLabel { + rect 390, 617, 190, 24 + text "Max Players" + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + editDef MPStartPlayers { + rect 590, 617, 80, 24 + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + hovercolor 1, 0.4, 0, 1 + backcolor 0, 0, 0, 0.25 + bordercolor 1, 0.1, 0.1, 0.5 + cvar "si_maxPlayers" + maxchars 2 + numeric 1 + visible 0 + noevents 1 + } + windowDef MPStartGameType { + rect 690, 617, 200, 24 + font "fonts/chain" + textscale 0.42 + forecolor 1, 0.1, 0.1, 0 + text "Deathmatch only" + visible 0 + noevents 1 + } + choiceDef MPStartGameTypeValue { + rect 0, 0, 1, 1 + choices "deathmatch" + values "deathmatch" + choiceType 1 + cvar "si_gameType" + visible 0 + noevents 1 + } + + choiceDef MPBrowserGameTypeFilterValue { + rect 0, 0, 1, 1 + choices "Deathmatch" + values "1" + choiceType 1 + cvar "gui_filter_gameType" + visible 0 + noevents 1 + } + choiceDef MPBrowserGameFilterValue { + rect 0, 0, 1, 1 + choices "Doom 3" + values "1" + choiceType 1 + cvar "gui_filter_game" + visible 0 + noevents 1 + } + windowDef MPStartLaunch { + rect 390, 657, 250, 40 + text "Start Server" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "cmd" "exec \"seta si_gameType deathmatch\"" ; + set "cmd" "exec \"seta si_map game/mp/d3dm3\"" ; + resetTime "MPStartDelayedStart" "0" ; + } + } + windowDef MPStartBack { + rect 650, 657, 250, 40 + text "Back" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_close" ; + resetTime "HideMPStart" "0" ; + resetTime "Click2" "0" ; + } + } + + // Multiplayer - Join Server page + windowDef MPJoinTitle { + rect 354, 420, 572, 40 + text "Join Server" + font "fonts/chain" + textscale 0.6 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + windowDef MPJoinAddressLabel { + rect 390, 477, 180, 30 + text "Direct IP" + font "fonts/chain" + textscale 0.5 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + editDef inetGame { + rect 560, 477, 310, 30 + text "gui::inetGame" + font "fonts/chain" + textscale 0.5 + forecolor 1, 0.1, 0.1, 0 + hovercolor 1, 0.4, 0, 1 + backcolor 0, 0, 0, 0.25 + bordercolor 1, 0.1, 0.1, 0.5 + maxchars 64 + visible 0 + noevents 1 + + onEnter { + set "cmd" "inetConnect" ; + } + } + windowDef MPJoinDirectConnect { + rect 390, 528, 250, 40 + text "Connect" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "cmd" "inetConnect" ; + } + } + windowDef MPJoinInternetBrowser { + rect 650, 528, 250, 40 + text "Master Servers" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "Desktop::lanSet" "0" ; + resetTime "HideMPJoin" "0" ; + resetTime "ShowMPBrowser" "0" ; + set "cmd" "exec \"seta gui_filter_gameType 1\"" ; + set "cmd" "exec \"seta gui_filter_game 1\"" ; + resetTime "MPBrowserDelayedMasterRefresh" "0" ; + } + } + windowDef MPJoinLANBrowser { + rect 390, 585, 250, 40 + text "LAN Servers" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "Desktop::lanSet" "1" ; + resetTime "HideMPJoin" "0" ; + resetTime "ShowMPBrowser" "0" ; + set "cmd" "exec \"seta gui_filter_gameType 1\"" ; + set "cmd" "exec \"seta gui_filter_game 1\"" ; + resetTime "MPBrowserDelayedLANRefresh" "0" ; + } + } + windowDef MPJoinBack { + rect 650, 585, 250, 40 + text "Back" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_close" ; + resetTime "HideMPJoin" "0" ; + resetTime "Click2" "0" ; + } + } + + // Multiplayer - Server Browser / master server selection page + windowDef MPBrowserTitle { + rect 354, 420, 572, 30 + text "Server Selection" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + windowDef MPBrowserNote { + rect 374, 452, 532, 24 + text "Master/LAN list - d3dm3 deathmatch only" + font "fonts/chain" + textscale 0.36 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + } + listDef serverList { + rect 374, 480, 532, 104 + font "fonts/chain" + textscale 0.28 + forecolor 1, 0.1, 0.1, 0 + hovercolor 1, 0.4, 0, 1 + backcolor 0, 0, 0, 0.25 + bordercolor 1, 0.1, 0.1, 0.5 + listname "serverlist" + tabstops "0,170,245,315,395" + tabaligns "0,0,0,0,0" + visible 0 + noevents 1 + + onAction { + set "cmd" "serverList" ; + } + onEnter { + set "cmd" "serverList" ; + set "cmd" "LANConnect" ; + } + } + windowDef MPBrowserRefreshMaster { + rect 370, 596, 170, 32 + text "Refresh Master" + font "fonts/chain" + textscale 0.38 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "Desktop::lanSet" "0" ; + set "cmd" "exec \"seta gui_filter_gameType 1\"" ; + set "cmd" "exec \"seta gui_filter_game 1\"" ; + resetTime "MPBrowserDelayedMasterRefresh" "0" ; + } + } + windowDef MPBrowserRefreshLAN { + rect 550, 596, 130, 32 + text "Refresh LAN" + font "fonts/chain" + textscale 0.38 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "Desktop::lanSet" "1" ; + set "cmd" "exec \"seta gui_filter_gameType 1\"" ; + set "cmd" "exec \"seta gui_filter_game 1\"" ; + resetTime "MPBrowserDelayedLANRefresh" "0" ; + } + } + windowDef MPBrowserSortMap { + rect 690, 596, 110, 32 + text "Sort Map" + font "fonts/chain" + textscale 0.38 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "cmd" "sortMap" ; + } + } + windowDef MPBrowserJoinSelected { + rect 810, 596, 110, 32 + text "Join" + font "fonts/chain" + textscale 0.38 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_click" ; + set "cmd" "serverList" ; + set "cmd" "LANConnect" ; + } + } + windowDef MPBrowserBack { + rect 354, 642, 572, 40 + text "Back" + font "fonts/chain" + textscale 0.55 + textalign 1 + forecolor 1, 0.1, 0.1, 0 + visible 0 + noevents 1 + + onMouseEnter { + set "forecolor" "1 0.4 0 1" ; + } + onMouseExit { + set "forecolor" "1 0.1 0.1 1" ; + } + onAction { + set "cmd" "play guisounds_close" ; + resetTime "HideMPBrowser" "0" ; + resetTime "Click2" "0" ; + } + } + windowDef Text5a { rect 352, 450, -572, 120 text "Are you sure you\nwant to exit?" @@ -356,7 +967,7 @@ windowDef Desktop { set "Text1c::rect" "354 516 -572 60" ; set "Text1d::rect" "354 561 -572 60" ; set "Text1e::rect" "354 606 -572 60" ; - transition "Button2::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ; + transition "Button2::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ; } onTime 125 { transition "Button3::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ; @@ -376,6 +987,317 @@ windowDef Desktop { } } + + windowDef Click2 { + notime 1 + + onTime 0 { + set "MPStartTitle::visible" "0" ; + set "MPJoinTitle::visible" "0" ; + set "MPBrowserTitle::visible" "0" ; + } + onTime 200 { + set "Text2a::rect" "354 426 572 60" ; + set "Text2a::noevents" "0" ; + transition "Text2a::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + } + onTime 250 { + set "Text2b::rect" "354 471 572 60" ; + set "Text2b::noevents" "0" ; + transition "Text2b::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + } + onTime 300 { + set "Text2c::rect" "354 516 572 60" ; + set "Text2c::noevents" "0" ; + transition "Text2c::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + } + onTime 350 { + set "Text2d::rect" "354 561 572 60" ; + set "Text2d::noevents" "0" ; + transition "Text2d::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + } + } + + windowDef HideMPRoot { + notime 1 + + onTime 0 { + set "Text2a::noevents" "1" ; + set "Text2b::noevents" "1" ; + set "Text2c::noevents" "1" ; + set "Text2d::noevents" "1" ; + transition "Text2a::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + transition "Text2b::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + transition "Text2c::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + transition "Text2d::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + } + onTime 50 { + set "Text2a::rect" "354 426 -572 60" ; + set "Text2b::rect" "354 471 -572 60" ; + set "Text2c::rect" "354 516 -572 60" ; + set "Text2d::rect" "354 561 -572 60" ; + } + } + + windowDef ShowMPStart { + notime 1 + + onTime 50 { + set "Desktop::MPPage" "1" ; + set "MPStartTitle::visible" "1" ; + set "MPStartPlayerLabel::visible" "1" ; + set "MPStartPlayerName::visible" "1" ; + set "MPStartPlayerName::noevents" "0" ; + set "MPStartServerLabel::visible" "1" ; + set "MPStartServerName::visible" "1" ; + set "MPStartServerName::noevents" "0" ; + set "MPStartMapLabel::visible" "1" ; + set "MPStartMapValue::visible" "1" ; + set "MPStartTypeLabel::visible" "1" ; + set "MPStartServerType::visible" "1" ; + set "MPStartServerType::noevents" "0" ; + set "MPStartDedicatedLabel::visible" "1" ; + set "MPStartDedicated::visible" "1" ; + set "MPStartDedicated::noevents" "0" ; + set "MPStartPlayersLabel::visible" "1" ; + set "MPStartPlayers::visible" "1" ; + set "MPStartPlayers::noevents" "0" ; + set "MPStartGameType::visible" "1" ; + set "MPStartGameTypeValue::visible" "1" ; + set "MPStartLaunch::visible" "1" ; + set "MPStartLaunch::noevents" "0" ; + set "MPStartBack::visible" "1" ; + set "MPStartBack::noevents" "0" ; + transition "MPStartTitle::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartPlayerLabel::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartPlayerName::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartServerLabel::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartServerName::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartMapLabel::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartMapValue::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartTypeLabel::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartServerType::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartDedicatedLabel::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartDedicated::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartPlayersLabel::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartPlayers::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartGameType::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartLaunch::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPStartBack::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + } + } + + windowDef HideMPStart { + notime 1 + + onTime 0 { + set "MPStartPlayerName::noevents" "1" ; + set "MPStartServerName::noevents" "1" ; + set "MPStartServerType::noevents" "1" ; + set "MPStartDedicated::noevents" "1" ; + set "MPStartPlayers::noevents" "1" ; + set "MPStartLaunch::noevents" "1" ; + set "MPStartBack::noevents" "1" ; + set "MPStartTitle::visible" "0" ; + set "MPStartPlayerLabel::visible" "0" ; + set "MPStartPlayerName::visible" "0" ; + set "MPStartServerLabel::visible" "0" ; + set "MPStartServerName::visible" "0" ; + set "MPStartMapLabel::visible" "0" ; + set "MPStartMapValue::visible" "0" ; + set "MPStartTypeLabel::visible" "0" ; + set "MPStartServerType::visible" "0" ; + set "MPStartDedicatedLabel::visible" "0" ; + set "MPStartDedicated::visible" "0" ; + set "MPStartPlayersLabel::visible" "0" ; + set "MPStartPlayers::visible" "0" ; + set "MPStartGameType::visible" "0" ; + set "MPStartGameTypeValue::visible" "0" ; + set "MPStartLaunch::visible" "0" ; + set "MPStartBack::visible" "0" ; + } + } + + windowDef ShowMPJoin { + notime 1 + + onTime 50 { + set "Desktop::MPPage" "2" ; + set "MPJoinTitle::visible" "1" ; + set "MPJoinAddressLabel::visible" "1" ; + set "inetGame::visible" "1" ; + set "inetGame::noevents" "0" ; + set "MPJoinDirectConnect::visible" "1" ; + set "MPJoinDirectConnect::noevents" "0" ; + set "MPJoinInternetBrowser::visible" "1" ; + set "MPJoinInternetBrowser::noevents" "0" ; + set "MPJoinLANBrowser::visible" "1" ; + set "MPJoinLANBrowser::noevents" "0" ; + set "MPJoinBack::visible" "1" ; + set "MPJoinBack::noevents" "0" ; + transition "MPJoinTitle::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPJoinAddressLabel::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "inetGame::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPJoinDirectConnect::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPJoinInternetBrowser::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPJoinLANBrowser::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPJoinBack::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + } + } + + windowDef HideMPJoin { + notime 1 + + onTime 0 { + set "inetGame::noevents" "1" ; + set "MPJoinDirectConnect::noevents" "1" ; + set "MPJoinInternetBrowser::noevents" "1" ; + set "MPJoinLANBrowser::noevents" "1" ; + set "MPJoinBack::noevents" "1" ; + set "MPJoinTitle::visible" "0" ; + set "MPJoinAddressLabel::visible" "0" ; + set "inetGame::visible" "0" ; + set "MPJoinDirectConnect::visible" "0" ; + set "MPJoinInternetBrowser::visible" "0" ; + set "MPJoinLANBrowser::visible" "0" ; + set "MPJoinBack::visible" "0" ; + } + } + + windowDef ShowMPBrowser { + notime 1 + + onTime 50 { + set "Desktop::MPPage" "3" ; + set "MPBrowserTitle::visible" "1" ; + set "MPBrowserNote::visible" "1" ; + set "serverList::visible" "1" ; + set "serverList::noevents" "0" ; + set "MPBrowserRefreshMaster::visible" "1" ; + set "MPBrowserRefreshMaster::noevents" "0" ; + set "MPBrowserRefreshLAN::visible" "1" ; + set "MPBrowserRefreshLAN::noevents" "0" ; + set "MPBrowserSortMap::visible" "1" ; + set "MPBrowserSortMap::noevents" "0" ; + set "MPBrowserJoinSelected::visible" "1" ; + set "MPBrowserJoinSelected::noevents" "0" ; + set "MPBrowserBack::visible" "1" ; + set "MPBrowserBack::noevents" "0" ; + transition "MPBrowserTitle::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPBrowserNote::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "serverList::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPBrowserRefreshMaster::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPBrowserRefreshLAN::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPBrowserSortMap::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPBrowserJoinSelected::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + transition "MPBrowserBack::forecolor" "1 0.1 0.1 0" "1 0.1 0.1 1" "50" ; + } + } + + windowDef HideMPBrowser { + notime 1 + + onTime 0 { + set "serverList::noevents" "1" ; + set "MPBrowserRefreshMaster::noevents" "1" ; + set "MPBrowserRefreshLAN::noevents" "1" ; + set "MPBrowserSortMap::noevents" "1" ; + set "MPBrowserJoinSelected::noevents" "1" ; + set "MPBrowserBack::noevents" "1" ; + set "MPBrowserTitle::visible" "0" ; + set "MPBrowserNote::visible" "0" ; + set "serverList::visible" "0" ; + set "MPBrowserRefreshMaster::visible" "0" ; + set "MPBrowserRefreshLAN::visible" "0" ; + set "MPBrowserSortMap::visible" "0" ; + set "MPBrowserJoinSelected::visible" "0" ; + set "MPBrowserBack::visible" "0" ; + } + } + + + + windowDef MPBrowserDelayedMasterRefresh { + notime 1 + + onTime 100 { + set "Desktop::lanSet" "0" ; + set "cmd" "UpdateServers" ; + set "cmd" "sortMap" ; + set "cmd" "FilterServers" ; + } + } + + windowDef MPBrowserDelayedLANRefresh { + notime 1 + + onTime 100 { + set "Desktop::lanSet" "1" ; + set "cmd" "UpdateServers" ; + set "cmd" "sortMap" ; + set "cmd" "FilterServers" ; + } + } + + windowDef MPStartDelayedStart { + notime 1 + + onTime 100 { + set "cmd" "startMultiplayer" ; + } + } + + windowDef Main2 { + notime 1 + + onTime 0 { + set "Text2a::noevents" "1" ; + set "Text2b::noevents" "1" ; + set "Text2c::noevents" "1" ; + set "Text2d::noevents" "1" ; + resetTime "HideMPStart" "0" ; + resetTime "HideMPJoin" "0" ; + resetTime "HideMPBrowser" "0" ; + transition "Text2a::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + transition "Text2b::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + transition "Text2c::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + transition "Text2d::forecolor" "1 0.1 0.1 1" "1 0.1 0.1 0" "50" ; + } + onTime 0 { + transition "Button1::rect" "380 675 512 48" "380 405 512 48" "300" ; + transition "Button2::rect" "380 675 512 48" "380 465 512 48" "300" ; + transition "Button3::rect" "500 675 278 48" "500 525 278 48" "300" ; + transition "Button4::rect" "506 675 256 48" "506 585 256 48" "300" ; + transition "Button5::rect" "506 675 256 48" "506 645 256 48" "300" ; + transition "PopUp::matcolor" "1 1 1 1" "1 1 1 0" "100" ; + transition "PopUp::rect" "354 406.5 572 313.5" "354 660 572 60" "200" ; + } + onTime 50 { + set "Text2a::rect" "354 426 -572 60" ; + set "Text2b::rect" "354 471 -572 60" ; + set "Text2c::rect" "354 516 -572 60" ; + set "Text2d::rect" "354 561 -572 60" ; + transition "Button1::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ; + } + onTime 125 { + transition "Button2::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ; + } + onTime 200 { + transition "Button3::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ; + } + onTime 275 { + transition "Button4::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ; + } + onTime 300 { + transition "Button5::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ; + set "Button1::noevents" "0" ; + set "Button2::noevents" "0" ; + set "Button3::noevents" "0" ; + set "Button4::noevents" "0" ; + set "Button5::noevents" "0" ; + } + } + windowDef Click5 { notime 1 @@ -421,7 +1343,7 @@ windowDef Desktop { transition "Button1::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ; } onTime 125 { - transition "Button2::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ; + transition "Button2::matcolor" "1 1 1 0" "1 1 1 0.9" "100" ; } onTime 200 { transition "Button3::matcolor" "1 1 1 0" "1 1 1 0.4" "100" ; diff --git a/neo/doom3/game/Game_local.cpp b/neo/doom3/game/Game_local.cpp index fc588f8c..4f1f6e4c 100644 --- a/neo/doom3/game/Game_local.cpp +++ b/neo/doom3/game/Game_local.cpp @@ -320,7 +320,7 @@ void idGameLocal::Init( void ) { botItemTable = FindEntityDef("bot_itemtable", false); if (botItemTable == NULL) { - common->FatalError("Failed to find bot_itemtable decl!\n"); + common->Warning("Failed to find bot_itemtable decl!\n"); } // init all the bot systems. diff --git a/neo/engine/doomdll.vcxproj.user b/neo/engine/doomdll.vcxproj.user index 6cbc4a14..a9def5c9 100644 --- a/neo/engine/doomdll.vcxproj.user +++ b/neo/engine/doomdll.vcxproj.user @@ -15,9 +15,9 @@ D:\projects\Doom3\Doom3.exe WindowsLocalDebugger - +set r_fullscreen 0 +set r_mode 9 +set sv_pure 0 + +set r_fullscreen 0 +set r_mode 9 +set sv_pure 0 +set fs_game e3 D:\projects\Doom3 - +set r_fullscreen 1 +set r_mode 9|+set r_fullscreen 1 +set r_mode 11|+set r_fullscreen0 +set r_mode 9|+set r_fullscreen 0 +set r_mode 9|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0| + +set r_fullscreen 1 +set r_mode 11|+set r_fullscreen0 +set r_mode 9|+set r_fullscreen 0 +set r_mode 9|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0|+set r_fullscreen 0 +set r_mode 9 +set sv_pure 0 +set fs_game e3| D:\projects\Doom3\Quake4.exe diff --git a/neo/engine/framework/DeclManager.cpp b/neo/engine/framework/DeclManager.cpp index fa5890c3..1a03dd13 100644 --- a/neo/engine/framework/DeclManager.cpp +++ b/neo/engine/framework/DeclManager.cpp @@ -257,6 +257,7 @@ public: public: static void MakeNameCanonical(const char* name, char* result, int maxLength); idDeclLocal* FindTypeWithoutParsing(declType_t type, const char* name, bool makeDefault = true); + int GetDeclFilePriority(const idDeclFile* declFile) const; idDeclType* GetDeclType(int type) const { return declTypes[type]; } const idDeclFile* GetImplicitDeclFile(void) const { return &implicitDecls; } @@ -716,15 +717,24 @@ int idDeclFile::LoadAndParse() { declType_t identifiedType = DECL_MAX_TYPES; + if ( token.Icmp( "clampTable" ) == 0 || token.Icmp( "snapTable" ) == 0 || token.Icmp( "soundtable" ) == 0 ) { + identifiedType = DECL_TABLE; + } + // get the decl type from the type name numTypes = declManagerLocal.GetNumDeclTypes(); - for (i = 0; i < numTypes; i++) { - idDeclType* typeInfo = declManagerLocal.GetDeclType(i); - if (typeInfo && typeInfo->typeName.Icmp(token) == 0) { - identifiedType = (declType_t)typeInfo->type; - break; + if ( identifiedType == DECL_MAX_TYPES ) { + for (i = 0; i < numTypes; i++) { + idDeclType* typeInfo = declManagerLocal.GetDeclType(i); + if (typeInfo && typeInfo->typeName.Icmp(token) == 0) { + identifiedType = (declType_t)typeInfo->type; + break; + } } } + else { + i = 0; + } if (i >= numTypes) { @@ -813,11 +823,29 @@ int idDeclFile::LoadAndParse() { newDecl = declManagerLocal.FindTypeWithoutParsing(identifiedType, name, false); if (newDecl) { // update the existing copy - if (newDecl->sourceFile != this || newDecl->redefinedInReload) { + if (newDecl->sourceFile == this && newDecl->redefinedInReload) { src.Warning("%s '%s' previously defined at %s:%i", declManagerLocal.GetDeclNameFromType(identifiedType), name.c_str(), newDecl->sourceFile->fileName.c_str(), newDecl->sourceLine); continue; } + if (newDecl->sourceFile != this) { + if (declManagerLocal.GetDeclFilePriority(this) < declManagerLocal.GetDeclFilePriority(newDecl->sourceFile)) { + src.Warning("%s '%s' previously defined at %s:%i", declManagerLocal.GetDeclNameFromType(identifiedType), + name.c_str(), newDecl->sourceFile->fileName.c_str(), newDecl->sourceLine); + continue; + } + + idDeclLocal** prev = &newDecl->sourceFile->decls; + while (*prev) { + if (*prev == newDecl) { + *prev = newDecl->nextInFile; + break; + } + prev = &(*prev)->nextInFile; + } + newDecl->nextInFile = this->decls; + this->decls = newDecl; + } if (newDecl->declState != DS_UNPARSED) { reparse = true; } @@ -1364,30 +1392,15 @@ void idDeclManagerLocal::RegisterDeclType(const char* typeName, declType_t type, RegisterDeclSubFolder =================== */ -// jmarshall void idDeclManagerLocal::RegisterDeclSubFolder(const char* folder, const char* extension, idList& fileList) { - // Find all - { - idFileList* list = fileSystem->ListFiles(folder, extension, true); + idFileList* list = fileSystem->ListFilesTree(folder, extension, false); - for (int d = 0; d < list->GetNumFiles(); d++) - { - fileList.Append(va("%s/%s", folder, list->GetFile(d))); - } - - fileSystem->FreeFileList(list); + for (int i = 0; i < list->GetNumFiles(); i++) { + fileList.Append(list->GetFile(i)); } - idFileList* dirList = fileSystem->ListFiles(folder, "/", true); - for (int i = 0; i < dirList->GetNumFiles(); i++) - { - idStr dir = va("%s/%s", folder, dirList->GetFile(i)); - RegisterDeclSubFolder(dir, extension, fileList); - } - - fileSystem->FreeFileList(dirList); + fileSystem->FreeFileList(list); } -// jmarshall end /* =================== @@ -1425,7 +1438,7 @@ void idDeclManagerLocal::RegisterDeclFolder(const char* folder, const char* exte // jmarshall end // load and parse decl files - for (i = 0; i < fileList.Num(); i++) { + for (i = fileList.Num() - 1; i >= 0; i--) { // jmarshall //fileName = declFolder->folder + "/" + fileList[ i ]; fileName = fileList[i]; @@ -1448,6 +1461,25 @@ void idDeclManagerLocal::RegisterDeclFolder(const char* folder, const char* exte } } +/* +=================== +idDeclManagerLocal::GetDeclFilePriority +=================== +*/ +int idDeclManagerLocal::GetDeclFilePriority(const idDeclFile* declFile) const { + if (declFile == &implicitDecls) { + return -1; + } + + for (int i = 0; i < loadedFiles.Num(); i++) { + if (loadedFiles[i] == declFile) { + return i; + } + } + + return -1; +} + /* =================== idDeclManagerLocal::GetChecksum @@ -3124,4 +3156,4 @@ const rvDeclEffect* idDeclManagerLocal::EffectByIndex(int index, bool forceParse return (const rvDeclEffect*)DeclByIndex(DECL_EFFECT, index, forceParse); } -#endif \ No newline at end of file +#endif diff --git a/neo/engine/framework/DeclTable.cpp b/neo/engine/framework/DeclTable.cpp index 4a9bd611..c646b802 100644 --- a/neo/engine/framework/DeclTable.cpp +++ b/neo/engine/framework/DeclTable.cpp @@ -121,6 +121,13 @@ bool idDeclTable::Parse(const char* text, const int textLength) { snap = false; clamp = false; + if ( !idStr::Icmpn( text, "snapTable", 9 ) ) { + snap = true; + } + else if ( !idStr::Icmpn( text, "clampTable", 10 ) ) { + clamp = true; + } + #ifdef QUAKE4 minValue = idMath::INFINITY; maxValue = -1.0e30f; @@ -179,6 +186,45 @@ bool idDeclTable::Parse(const char* text, const int textLength) { } } + else if ( token.type == TT_NUMBER || token == "." || token == "-" ) { + src.UnreadToken( &token ); + + while ( 1 ) { + bool errorFlag; + + v = src.ParseFloat( &errorFlag ); + if ( errorFlag ) { + MakeDefault(); + return false; + } + + values.Append( v ); + +#ifdef QUAKE4 + if ( v < minValue ) { + minValue = v; + } + if ( v > maxValue ) { + maxValue = v; + } +#endif + + if ( !src.ReadToken( &token ) ) { + break; + } + if ( token == "}" ) { + break; + } + if ( token == "," ) { + continue; + } + src.Warning( "expected comma or brace" ); + MakeDefault(); + return false; + } + + break; + } else { src.Warning("unknown token '%s'", token.c_str()); MakeDefault(); diff --git a/neo/engine/renderer/Material.cpp b/neo/engine/renderer/Material.cpp index e24a24b0..5ead2ab8 100644 --- a/neo/engine/renderer/Material.cpp +++ b/neo/engine/renderer/Material.cpp @@ -487,6 +487,23 @@ static infoParm_t infoParms[] = { static const int numInfoParms = sizeof(infoParms) / sizeof(infoParms[0]); +/* +=============== +idMaterial::ApplySurfaceParm + +Alpha E3 materials commonly use the Quake/id Tech 3-style +"surfaceparm " wrapper instead of Doom 3's direct material flags. +=============== +*/ +static bool ApplySurfaceParm( idMaterial *material, idToken *token, materialCoverage_t &coverage ) { + if ( !token->Icmp( "trans" ) ) { + coverage = MC_TRANSLUCENT; + return true; + } + + return material->CheckSurfaceParm( token ); +} + /* =============== @@ -2797,16 +2814,37 @@ void idMaterial::ParseMaterial(idLexer& src) { src.SkipRestOfLine(); continue; } + else if ( !token.Icmp( "qer_trans" ) ) { + src.SkipRestOfLine(); + continue; + } // description else if (!token.Icmp("description")) { src.ReadTokenOnLine(&token); desc = token.c_str(); continue; } + else if ( !token.Icmp( "surfaceparm" ) ) { + if ( src.ReadTokenOnLine( &token ) && ApplySurfaceParm( this, &token, coverage ) ) { + src.SkipRestOfLine(); + continue; + } + src.Warning( "unknown surfaceparm '%s' in '%s'", token.c_str(), GetName() ); + src.SkipRestOfLine(); + continue; + } // check for the surface / content bit flags else if (CheckSurfaceParm(&token)) { continue; } + else if ( !token.Icmp( "nodraw" ) ) { + SetMaterialFlag( MF_NOSHADOWS ); + continue; + } + else if ( !token.Icmp( "trans" ) ) { + coverage = MC_TRANSLUCENT; + continue; + } // polygonOffset diff --git a/neo/engine/renderer/Material.h b/neo/engine/renderer/Material.h index c0605a1a..d2873d08 100644 --- a/neo/engine/renderer/Material.h +++ b/neo/engine/renderer/Material.h @@ -563,6 +563,8 @@ public: //BSM Nerve: Added for material editor bool Save(const char* fileName = NULL); + bool CheckSurfaceParm(idToken* token); + // returns the internal image name for stage 0, which can be used // for the renderer CaptureRenderToImage() call // I'm not really sure why this needs to be virtual... @@ -899,7 +901,6 @@ private: void ParseStage(idLexer& src, const textureRepeat_t trpDefault = TR_REPEAT); void ParseDeform(idLexer& src); void ParseDecalInfo(idLexer& src); - bool CheckSurfaceParm(idToken* token); int GetExpressionConstant(float f); int GetExpressionTemporary(void); expOp_t* GetExpressionOp(void);