From 48b0210064e80ca6227aea8dd79e4453500e396b Mon Sep 17 00:00:00 2001
From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
Date: Wed, 7 Jun 2023 21:09:16 +0100
Subject: [PATCH] [READY] Widescreen (#20861)
* TM Needed - Widescreen
* A lot of fixes
* TM notice
* Feedback thread
* Minor tweaks
* Expans silicon view stuff
* Fix viewmods
* The preferential option
* Why were these global
* Fix clickcatch sizing, fix parallax issues
* Maybe fixes the runtime
* READY
---
SQL/paradise_schema.sql | 1 +
SQL/updates/48-49.sql | 4 +
_maps/map_files/generic/centcomm.dmm | 189 +++++++++---------
code/__DEFINES/misc_defines.dm | 12 +-
code/_onclick/hud/hud_datum.dm | 9 -
code/_onclick/hud/parallax.dm | 21 +-
.../demons/slaughter demon/slaughter.dm | 2 +-
code/game/objects/items/blueprints.dm | 15 +-
.../objects/items/devices/lightreplacer.dm | 2 +-
code/game/objects/items/weapons/rpd.dm | 2 +-
.../game/objects/items/weapons/stock_parts.dm | 2 +-
code/game/turfs/turf.dm | 2 +
code/modules/client/client_defines.dm | 2 +-
code/modules/client/client_procs.dm | 16 +-
.../login_processing/10-load_preferences.dm | 3 +-
.../client/preference/link_processing.dm | 18 ++
code/modules/client/preference/preferences.dm | 5 +-
.../client/preference/preferences_mysql.dm | 5 +-
code/modules/client/view.dm | 12 +-
.../mining/lavaland/loot/ashdragon_loot.dm | 2 +-
code/modules/mob/living/carbon/brain/MMI.dm | 2 +-
code/modules/mob/living/living_life.dm | 2 +-
code/modules/point/point.dm | 2 +-
code/modules/projectiles/firing.dm | 10 +-
code/modules/shuttle/navigation_computer.dm | 2 +-
code/modules/tgui/states/default.dm | 2 +-
code/modules/tooltip/tooltip.dm | 3 +-
code/modules/tooltip/tooltip.html | 102 ++++++----
code/world_definition.dm | 2 +-
config/example/config.toml | 2 +-
30 files changed, 264 insertions(+), 189 deletions(-)
create mode 100644 SQL/updates/48-49.sql
diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index 90915cc5743..6047042d743 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -291,6 +291,7 @@ CREATE TABLE `player` (
`keybindings` LONGTEXT COLLATE 'utf8mb4_unicode_ci' DEFAULT NULL,
`server_region` VARCHAR(32) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`muted_adminsounds_ckeys` MEDIUMTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
+ `viewrange` VARCHAR(5) NOT NULL DEFAULT '19x15' COLLATE 'utf8mb4_general_ci',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`),
KEY `lastseen` (`lastseen`),
diff --git a/SQL/updates/48-49.sql b/SQL/updates/48-49.sql
new file mode 100644
index 00000000000..a7b4773bc32
--- /dev/null
+++ b/SQL/updates/48-49.sql
@@ -0,0 +1,4 @@
+# Updating SQL from 48 to 49 -AffectedArc07
+# Add new viewrange toggle
+ALTER TABLE `player`
+ ADD COLUMN `viewrange` VARCHAR(5) NOT NULL DEFAULT '19x15' AFTER `muted_adminsounds_ckeys`;
diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm
index b169f51d7d0..779f2802b21 100644
--- a/_maps/map_files/generic/centcomm.dmm
+++ b/_maps/map_files/generic/centcomm.dmm
@@ -4608,6 +4608,9 @@
},
/turf/simulated/floor/transparent/glass,
/area/centcom/specops)
+"qf" = (
+/turf/simulated/wall/r_wall,
+/area/space)
"qg" = (
/obj/item/twohanded/required/kirbyplants,
/obj/item/storage/secure/safe{
@@ -13471,21 +13474,21 @@ aN
aN
aN
aN
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-am
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
aN
aN
aN
@@ -13728,21 +13731,21 @@ aN
aN
aN
aN
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
-rE
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
aN
aN
aN
@@ -13999,7 +14002,7 @@ rE
rE
rE
rE
-rE
+am
aN
aN
aN
@@ -15277,7 +15280,7 @@ rE
rE
rE
rE
-ad
+rE
rE
rE
rE
@@ -15791,7 +15794,7 @@ rE
rE
rE
rE
-rE
+ad
rE
rE
rE
@@ -17326,21 +17329,21 @@ ck
ck
ck
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
aN
aN
aN
@@ -17583,21 +17586,21 @@ ck
ck
ck
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
+rE
aN
aN
aN
@@ -17840,21 +17843,21 @@ ck
ck
ck
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
aN
aN
aN
@@ -18097,21 +18100,21 @@ ck
ck
ck
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
+qf
aN
aN
aN
diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm
index 45402cba078..fb9df5b59e2 100644
--- a/code/__DEFINES/misc_defines.dm
+++ b/code/__DEFINES/misc_defines.dm
@@ -103,9 +103,12 @@
#define in_range(source, user) (get_dist(source, user) <= 1)
#define RANGE_TURFS(RADIUS, CENTER) \
+ RECT_TURFS(RADIUS, RADIUS, CENTER)
+
+#define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \
block( \
- locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \
- locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \
+ locate(max(CENTER.x-(H_RADIUS),1), max(CENTER.y-(V_RADIUS),1), CENTER.z), \
+ locate(min(CENTER.x+(H_RADIUS),world.maxx), min(CENTER.y+(V_RADIUS),world.maxy), CENTER.z) \
)
/// Returns the turfs on the edge of a square with CENTER in the middle and with the given RADIUS. If used near the edge of the map, will still work fine.
@@ -372,7 +375,7 @@
#define INVESTIGATE_BOMB "bombs"
// The SQL version required by this version of the code
-#define SQL_VERSION 48
+#define SQL_VERSION 49
// Vending machine stuff
#define CAT_NORMAL 1
@@ -531,6 +534,9 @@
#define REFLECTABILITY_PHYSICAL 1
#define REFLECTABILITY_ENERGY 2
+// This isnt in client_defines due to scoping issues
+#define DEFAULT_CLIENT_VIEWSIZE "19x15"
+
// Deadchat control defines
/// Will execute a single command after the cooldown based on player votes.
diff --git a/code/_onclick/hud/hud_datum.dm b/code/_onclick/hud/hud_datum.dm
index 8f28eef4da0..e3dbaf78b26 100644
--- a/code/_onclick/hud/hud_datum.dm
+++ b/code/_onclick/hud/hud_datum.dm
@@ -121,15 +121,6 @@
if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
display_hud_version = 1
- if(mymob.client.view < world.view)
- if(mymob.client.view < ARBITRARY_VIEWRANGE_NOHUD)
- to_chat(mymob, "HUD is unavailable with this view range.")
- display_hud_version = HUD_STYLE_NOHUD
- else
- if(display_hud_version == HUD_STYLE_STANDARD)
- to_chat(mymob, "Standard HUD mode is unavailable with a smaller-than-normal view range.")
- display_hud_version = HUD_STYLE_REDUCED
-
switch(display_hud_version)
if(HUD_STYLE_STANDARD) //Default HUD
hud_shown = TRUE //Governs behavior of other procs
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index eb45c09702a..54db7946baf 100644
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -248,17 +248,24 @@
/obj/screen/parallax_layer/proc/update_o(view)
if(!view)
view = world.view
- var/list/new_overlays = list()
- var/count = CEILING(view/(480/world.icon_size), 1)+1
- for(var/x in -count to count)
- for(var/y in -count to count)
+
+ var/static/parallax_scaler = world.icon_size / 480
+
+ // Turn the view size into a grid of correctly scaled overlays
+ var/list/viewscales = getviewsize(view)
+ var/countx = CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1
+ var/county = CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1
+ var/list/new_overlays = new
+ for(var/x in -countx to countx)
+ for(var/y in -county to county)
if(x == 0 && y == 0)
continue
var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state)
- texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480)
+ texture_overlay.transform = matrix(1, 0, x * 480, 0, 1, y * 480)
new_overlays += texture_overlay
-
- overlays = new_overlays
+ cut_overlays()
+ add_overlay(new_overlays)
+ // Cache this
view_sized = view
/obj/screen/parallax_layer/proc/update_status(mob/M)
diff --git a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm
index 461613f99e5..0540e5d280d 100644
--- a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm
+++ b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm
@@ -175,7 +175,7 @@
/datum/action/innate/demon/whisper/proc/choose_targets(mob/user = usr)//yes i am copying from telepathy..hush...
var/list/validtargets = list()
- for(var/mob/living/M in view(user.client.view, get_turf(user)))
+ for(var/mob/living/M in view(user.client.maxview(), get_turf(user)))
if(M && M.mind && M.stat != DEAD)
if(M == user)
continue
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 0a91b9be764..d6ff9c422d5 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -134,19 +134,22 @@
set_viewer(usr)
attack_self(usr)
-/obj/item/areaeditor/blueprints/proc/get_images(turf/T, viewsize)
+
+/obj/item/areaeditor/blueprints/proc/get_images(turf/central_turf, viewsize)
. = list()
- for(var/tt in RANGE_TURFS(viewsize, T))
- var/turf/TT = tt
- if(TT.blueprint_data)
- . += TT.blueprint_data
+ var/list/dimensions = getviewsize(viewsize)
+ var/horizontal_radius = dimensions[1] / 2
+ var/vertical_radius = dimensions[2] / 2
+ for(var/turf/nearby_turf as anything in RECT_TURFS(horizontal_radius, vertical_radius, central_turf))
+ if(nearby_turf.blueprint_data)
+ . += nearby_turf.blueprint_data
/obj/item/areaeditor/blueprints/proc/set_viewer(mob/user, message = "")
if(user && user.client)
if(viewing)
clear_viewer()
viewing = user.client
- showing = get_images(get_turf(user), viewing.view)
+ showing = get_images(get_turf(viewing.eye || user), viewing.view)
viewing.images |= showing
if(message)
to_chat(user, message)
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 07c2bb70bff..dd7b22349a3 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -233,7 +233,7 @@
return
if(!isturf(T))
return
- if(get_dist(src, T) >= (U.client.view + 2)) // To prevent people from using it over cameras
+ if(get_dist(src, T) >= (U.client.maxview() + 2)) // To prevent people from using it over cameras
return
var/used = FALSE
diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm
index 0cb28f2691d..55639bd8087 100644
--- a/code/game/objects/items/weapons/rpd.dm
+++ b/code/game/objects/items/weapons/rpd.dm
@@ -282,7 +282,7 @@
// If we get here, then we're effectively acting on the turf, probably placing a pipe.
if(ranged) //woosh beam if bluespaced at a distance
- if(get_dist(src, T) <= (user.client.view + 2))\
+ if(get_dist(src, T) <= (user.client.maxview() + 2))\
user.Beam(T, icon_state = "rped_upgrade", icon = 'icons/effects/effects.dmi', time = 5)
else
message_admins("\[EXPLOIT] [key_name_admin(user)] attempted to place pipes with a BRPD via a camera console. (Attempted range exploit)")
diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm
index 75627cf5c99..7e17d12bb77 100644
--- a/code/game/objects/items/weapons/stock_parts.dm
+++ b/code/game/objects/items/weapons/stock_parts.dm
@@ -24,7 +24,7 @@
/obj/item/storage/part_replacer/afterattack(obj/machinery/M, mob/user, flag, params)
if(!flag && works_from_distance && istype(M))
// Make sure its in range
- if(get_dist(src, M) <= (user.client.view + 2))
+ if(get_dist(src, M) <= (user.client.maxview() + 2))
if(M.component_parts)
M.exchange_parts(user, src)
user.Beam(M,icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 8112dae7a59..e1a4acb1c4a 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -503,6 +503,8 @@
/turf/proc/add_blueprints(atom/movable/AM)
var/image/I = new
+ I.plane = GAME_PLANE
+ I.layer = OBJ_LAYER
I.appearance = AM.appearance
I.appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM
I.loc = src
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 6f59c8656cf..686f2eae34c 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -56,7 +56,7 @@
preload_rsc = 0 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server.
- var/global/obj/screen/click_catcher/void
+ var/obj/screen/click_catcher/void
var/ip_intel = "Disabled"
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 30f8b8569e5..8bf2926bb32 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -322,6 +322,9 @@
// ToS accepted
tos_consent = TRUE
+ // Setup widescreen
+ view = prefs.viewrange
+
prefs.init_keybindings(prefs.keybindings_overrides) //The earliest sane place to do it where prefs are not null, if they are null you can't do crap at lobby
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
@@ -371,6 +374,10 @@
winset(src, null, "command=\".configure graphics-hwmode off\"")
winset(src, null, "command=\".configure graphics-hwmode on\"")
+ // Try doing this before mob login
+ generate_clickcatcher()
+ apply_clickcatcher()
+
. = ..() //calls mob.Login()
mob.update_client_colour(0) // Activate colourblind mode if they have one set
@@ -394,9 +401,6 @@
// activate_darkmode() calls the CL update button proc, so we dont want it double called
SSchangelog.UpdatePlayerChangelogButton(src)
- generate_clickcatcher()
- apply_clickcatcher()
-
if(show_update_prompt)
show_update_notice()
@@ -433,6 +437,7 @@
to_chat(src, "You are currently connected [prefs.server_region ? "via the [prefs.server_region] relay" : "directly"] to Paradise.")
to_chat(src, "You can change this using the Change Region verb in the OOC tab, as selecting a region closer to you may reduce latency.")
+
/client/proc/is_connecting_from_localhost()
var/static/list/localhost_addresses = list("127.0.0.1", "::1")
if((!address && !world.port) || (address in localhost_addresses))
@@ -1251,6 +1256,11 @@
winset(src, null, "command=\".configure graphics-hwmode off\"")
winset(src, null, "command=\".configure graphics-hwmode on\"")
+/// Returns the biggest number from client.view so we can do easier maths
+/client/proc/maxview()
+ var/list/screensize = getviewsize(view)
+ return max(screensize[1], screensize[2])
+
#undef LIMITER_SIZE
#undef CURRENT_SECOND
#undef SECOND_COUNT
diff --git a/code/modules/client/login_processing/10-load_preferences.dm b/code/modules/client/login_processing/10-load_preferences.dm
index e503a993d2b..94ff3027223 100644
--- a/code/modules/client/login_processing/10-load_preferences.dm
+++ b/code/modules/client/login_processing/10-load_preferences.dm
@@ -28,7 +28,8 @@
colourblind_mode,
keybindings,
server_region,
- muted_adminsounds_ckeys
+ muted_adminsounds_ckeys,
+ viewrange
FROM player
WHERE ckey=:ckey"}, list(
"ckey" = C.ckey
diff --git a/code/modules/client/preference/link_processing.dm b/code/modules/client/preference/link_processing.dm
index 6d7e18e5ffc..f8748353b30 100644
--- a/code/modules/client/preference/link_processing.dm
+++ b/code/modules/client/preference/link_processing.dm
@@ -937,6 +937,24 @@
if("winflash")
toggles2 ^= PREFTOGGLE_2_WINDOWFLASHING
+ if("setviewrange")
+ var/list/viewrange_options = list(
+ "15x15 (Classic)" = "15x15",
+ "17x15 (Wide)" = "17x15",
+ "19x15 (Ultrawide)" = "19x15"
+ )
+
+ var/new_range = input(user, "Select a view range") as anything in viewrange_options
+ var/actual_new_range = viewrange_options[new_range]
+
+ viewrange = actual_new_range
+
+ if(actual_new_range != parent.view)
+ parent.view = actual_new_range
+ // Update the size of the click catcher
+ var/list/actualview = getviewsize(parent.view)
+ parent.void.UpdateGreed(actualview[1],actualview[2])
+
if("afk_watch")
if(!(toggles2 & PREFTOGGLE_2_AFKWATCH))
to_chat(user, "You will now get put into cryo dorms after [GLOB.configuration.afk.auto_cryo_minutes] minutes. \
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 8216fffda1e..8697623348c 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -128,6 +128,8 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
var/server_region = null
/// List of admin ckeys this player wont hear sounds from
var/list/admin_sound_ckey_ignore = list()
+ /// View range preference for this client
+ var/viewrange = DEFAULT_CLIENT_VIEWSIZE
/datum/preferences/New(client/C, datum/db_query/Q) // Process our query
parent = C
@@ -431,6 +433,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
dat += "Play Lobby Music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
"
dat += "Randomized Character Slot: [toggles2 & PREFTOGGLE_2_RANDOMSLOT ? "Yes" : "No"]
"
dat += "Thought Bubble: [(toggles2 & PREFTOGGLE_2_THOUGHT_BUBBLE) ? "Yes" : "No"]
"
+ dat += "View Range: [viewrange]
"
dat += "Window Flashing: [(toggles2 & PREFTOGGLE_2_WINDOWFLASHING) ? "Yes" : "No"]
"
// RIGHT SIDE OF THE PAGE
dat += "