Remove privacy poll & other tweaks/fixes (#2863)

changes:

Removed the privacy poll as it is unused.
Observing no longer creates a new mannequin, instead fetching one from SSmobs.
Observer ghosts now have a description again.
Converted new_player.dm to absolute pathing.
Fixed a bad init on holomaps.
Removed a sleep from light fixture Initialize().
Added a queue length stat to the MC panel for Icon Smoothing.
Halved time taken to create lighting overlay objects.
Species & body marking lists are now sorted alphabetically.
Commented out calls to lighting profiler to remove overhead of string interpolation in some procs.
Blood dries instantly if present during mapload instead of setting a timer.
This commit is contained in:
Lohikar
2017-07-01 13:53:39 -05:00
committed by skull132
parent de2efd09ac
commit 42f91d8117
16 changed files with 451 additions and 503 deletions

View File

@@ -0,0 +1,6 @@
--
-- Implemented in PR #2863.
-- Removes unused privacy table.
--
DROP TABLE `ss13_privacy`;

View File

@@ -125,6 +125,8 @@ var/global/list/cloaking_devices = list()
var/datum/sprite_accessory/marking/M = new path()
body_marking_styles_list[M.name] = M
sortTim(body_marking_styles_list, /proc/cmp_text_asc)
//Surgery Steps - Initialize all /datum/surgery_step into a list
paths = subtypesof(/datum/surgery_step)
for(var/T in paths)
@@ -159,7 +161,13 @@ var/global/list/cloaking_devices = list()
S.race_key = rkey //Used in mob icon caching.
all_species[S.name] = S
if(!(S.spawn_flags & IS_RESTRICTED))
sortTim(all_species, /proc/cmp_text_asc)
// The other lists are generated *after* we sort the main one so they don't need sorting too.
for (var/thing in all_species)
var/datum/species/S = all_species[thing]
if (!(S.spawn_flags & IS_RESTRICTED))
playable_species += S.name
if(S.spawn_flags & IS_WHITELISTED)
whitelisted_species += S.name

View File

@@ -17,6 +17,9 @@ var/datum/controller/subsystem/icon_smooth/SSicon_smooth
/datum/controller/subsystem/icon_smooth/Recover()
smooth_queue = SSicon_smooth.smooth_queue
/datum/controller/subsystem/icon_smooth/stat_entry()
..("Q:[smooth_queue.len]")
/datum/controller/subsystem/icon_smooth/fire()
if (explosion_in_progress)
return

View File

@@ -49,9 +49,13 @@ var/datum/controller/subsystem/lighting/SSlighting
/datum/controller/subsystem/lighting/Initialize(timeofday)
var/overlaycount = 0
var/starttime = REALTIMEOFDAY
// Generate overlays.
var/turf/T
var/thing
for (var/zlevel = 1 to world.maxz)
for (var/turf/T in block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)))
for (thing in block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)))
T = thing
if (!T.dynamic_lighting)
continue
@@ -64,14 +68,16 @@ var/datum/controller/subsystem/lighting/SSlighting
CHECK_TICK
admin_notice(span("danger", "Created [overlaycount] lighting overlays."), R_DEBUG)
admin_notice(span("danger", "Created [overlaycount] lighting overlays in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG)
starttime = REALTIMEOFDAY
// Tick once to clear most lights.
fire(FALSE, TRUE)
admin_notice(span("danger", "Processed [processed_lights] light sources."), R_DEBUG)
admin_notice(span("danger", "Processed [processed_corners] light corners."), R_DEBUG)
admin_notice(span("danger", "Processed [processed_overlays] light overlays."), R_DEBUG)
admin_notice(span("danger", "Lighting pre-bake completed in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG)
log_ss("lighting", "NOv:[overlaycount] L:[processed_lights] C:[processed_corners] O:[processed_overlays]")

View File

@@ -34,6 +34,7 @@
return ..()
/obj/machinery/station_map/Initialize()
. = ..()
holomap_datum = new()
original_zLevel = loc.z
SSminimap.station_holomaps += src

View File

@@ -39,21 +39,23 @@
D.cure(0)
return ..()
/obj/effect/decal/cleanable/blood/Initialize()
/obj/effect/decal/cleanable/blood/Initialize(mapload)
. = ..()
update_icon()
if(istype(src, /obj/effect/decal/cleanable/blood/gibs))
return
if(src.type == /obj/effect/decal/cleanable/blood)
if(src.loc && isturf(src.loc))
if(type == /obj/effect/decal/cleanable/blood)
if (isturf(loc))
for(var/obj/effect/decal/cleanable/blood/B in src.loc)
if(B != src)
if (B.blood_DNA)
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
drytime = DRYING_TIME * (amount+1)
if (dries)
if (dries && !mapload)
addtimer(CALLBACK(src, /obj/effect/decal/cleanable/blood/.proc/dry), drytime)
else if (dries)
dry()
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]"

View File

@@ -9,7 +9,7 @@
luminosity = FALSE
/area/proc/set_dynamic_lighting(var/new_dynamic_lighting = TRUE)
L_PROF(src, "area_sdl")
//L_PROF(src, "area_sdl")
if (new_dynamic_lighting == dynamic_lighting)
return FALSE

View File

@@ -16,7 +16,7 @@
// The proc you should always use to set the light of this atom.
/atom/proc/set_light(var/l_range, var/l_power, var/l_color = NONSENSICAL_VALUE, var/uv = NONSENSICAL_VALUE, var/angle = NONSENSICAL_VALUE, var/no_update = FALSE)
L_PROF(src, "atom_setlight")
//L_PROF(src, "atom_setlight")
if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE)
l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players.
@@ -43,7 +43,7 @@
#undef NONSENSICAL_VALUE
/atom/proc/set_uv(var/intensity, var/no_update)
L_PROF(src, "atom_setuv")
//L_PROF(src, "atom_setuv")
if (intensity < 0 || intensity > 255)
intensity = min(max(intensity, 255), 0)
@@ -60,7 +60,7 @@
if (QDELING(src))
return
L_PROF(src, "atom_update")
//L_PROF(src, "atom_update")
if (!light_power || !light_range) // We won't emit light anyways, destroy the light source.
QDEL_NULL(light)
@@ -94,7 +94,7 @@
if (new_opacity == opacity)
return
L_PROF(src, "atom_setopacity")
//L_PROF(src, "atom_setopacity")
opacity = new_opacity
var/turf/T = loc

View File

@@ -16,9 +16,7 @@
transform = matrix(WORLD_ICON_SIZE / 32, 0, (WORLD_ICON_SIZE - 32) / 2, 0, WORLD_ICON_SIZE / 32, (WORLD_ICON_SIZE - 32) / 2)
#endif
/atom/movable/lighting_overlay/Initialize()
. = ..()
verbs.Cut()
/atom/movable/lighting_overlay/New()
SSlighting.lighting_overlays += src
var/turf/T = loc // If this runtimes atleast we'll know what's creating overlays in things that aren't turfs.
@@ -32,7 +30,7 @@
if (!force)
return QDEL_HINT_LETMELIVE // STOP DELETING ME
L_PROF(loc, "overlay_destroy")
//L_PROF(loc, "overlay_destroy")
SSlighting.lighting_overlays -= src
SSlighting.overlay_queue -= src
@@ -147,7 +145,7 @@
// Override here to prevent things accidentally moving around overlays.
/atom/movable/lighting_overlay/forceMove(atom/destination, no_tp = FALSE, harderforce = FALSE)
if(harderforce)
L_PROF(loc, "overlay_forcemove")
//L_PROF(loc, "overlay_forcemove")
. = ..()
/atom/movable/lighting_overlay/shuttle_move(turf/loc)

View File

@@ -65,13 +65,13 @@
update()
L_PROF(source_atom, "source_new([type])")
//L_PROF(source_atom, "source_new([type])")
return ..()
// Kill ourselves.
/datum/light_source/Destroy(force)
L_PROF(source_atom, "source_destroy")
//L_PROF(source_atom, "source_destroy")
remove_lum()
if (source_atom)
@@ -115,19 +115,19 @@
top_atom.light_sources += src // Add ourselves to the light sources of our new top atom.
L_PROF(source_atom, "source_update")
//L_PROF(source_atom, "source_update")
INTELLIGENT_UPDATE(LIGHTING_CHECK_UPDATE)
// Will force an update without checking if it's actually needed.
/datum/light_source/proc/force_update()
L_PROF(source_atom, "source_forceupdate")
//L_PROF(source_atom, "source_forceupdate")
INTELLIGENT_UPDATE(LIGHTING_FORCE_UPDATE)
// Will cause the light source to recalculate turfs that were removed or added to visibility only.
/datum/light_source/proc/vis_update()
L_PROF(source_atom, "source_visupdate")
//L_PROF(source_atom, "source_visupdate")
INTELLIGENT_UPDATE(LIGHTING_VIS_UPDATE)

View File

@@ -11,14 +11,18 @@
// Causes any affecting light sources to be queued for a visibility update, for example a door got opened.
/turf/proc/reconsider_lights()
L_PROF(src, "turf_reconsider")
for (var/datum/light_source/L in affecting_lights)
//L_PROF(src, "turf_reconsider")
var/datum/light_source/L
for (var/thing in affecting_lights)
L = thing
L.vis_update()
// Forces a lighting update. Reconsider lights is preferred when possible.
/turf/proc/force_update_lights()
L_PROF(src, "turf_forceupdate")
for (var/datum/light_source/L in affecting_lights)
//L_PROF(src, "turf_forceupdate")
var/datum/light_source/L
for (var/thing in affecting_lights)
L = thing
L.force_update()
/turf/proc/lighting_clear_overlay()
@@ -30,7 +34,7 @@
qdel(lighting_overlay, TRUE)
lighting_overlay = null
L_PROF(src, "turf_clear_overlay")
//L_PROF(src, "turf_clear_overlay")
for (var/datum/lighting_corner/C in corners)
C.update_active()
@@ -40,7 +44,7 @@
if (lighting_overlay)
return
L_PROF(src, "turf_build_overlay")
//L_PROF(src, "turf_build_overlay")
var/area/A = loc
if (A.dynamic_lighting && dynamic_lighting)

View File

@@ -42,7 +42,6 @@
new_player_panel()
spawn(40)
if(client)
handle_privacy_poll()
client.playtitlemusic()
/mob/new_player/proc/show_title()

View File

@@ -16,16 +16,15 @@
anchored = 1 // don't get pushed around
simulated = FALSE
New()
/mob/new_player/New()
..()
dead_mob_list -= src
verb/new_player_panel()
/mob/new_player/verb/new_player_panel()
set src = usr
new_player_panel_proc()
proc/new_player_panel_proc()
/mob/new_player/proc/new_player_panel_proc()
var/output = "<div align='center'><B>New Player Options</B>"
output +="<hr>"
output += "<p><a href='byond://?src=\ref[src];show_preferences=1'>Setup Character</A></p>"
@@ -64,9 +63,8 @@
output += "</div>"
src << browse(output,"window=playersetup;size=210x280;can_close=0")
return
Stat()
/mob/new_player/Stat()
..()
if(statpanel("Lobby"))
@@ -92,7 +90,7 @@
if(player.ready)
totalPlayersReady++
Topic(href, href_list[])
/mob/new_player/Topic(href, href_list[])
if(!client) return 0
if(href_list["show_preferences"])
@@ -139,13 +137,13 @@
observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly.
announce_ghost_joinleave(src)
var/mob/living/carbon/human/dummy/mannequin = new()
var/mob/living/carbon/human/dummy/mannequin = SSmob.get_mannequin(client.ckey)
client.prefs.dress_preview_mob(mannequin)
observer.appearance = mannequin
observer.alpha = 127
observer.layer = initial(observer.layer)
observer.invisibility = initial(observer.invisibility)
qdel(mannequin)
observer.desc = initial(observer.desc)
observer.real_name = client.prefs.real_name
observer.name = observer.real_name
@@ -204,44 +202,6 @@
AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint)
return
if(href_list["privacy_poll"])
establish_db_connection(dbcon)
if(!dbcon.IsConnected())
return
var/voted = 0
//First check if the person has not voted yet.
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM ss13_privacy WHERE ckey='[src.ckey]'")
query.Execute()
while(query.NextRow())
voted = 1
break
//This is a safety switch, so only valid options pass through
var/option = "UNKNOWN"
switch(href_list["privacy_poll"])
if("signed")
option = "SIGNED"
if("anonymous")
option = "ANONYMOUS"
if("nostats")
option = "NOSTATS"
if("later")
usr << browse(null,"window=privacypoll")
return
if("abstain")
option = "ABSTAIN"
if(option == "UNKNOWN")
return
if(!voted)
var/sql = "INSERT INTO ss13_privacy VALUES (null, Now(), '[src.ckey]', '[option]')"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
usr << "<b>Thank you for your vote!</b>"
usr << browse(null,"window=privacypoll")
if(!ready && href_list["preference"])
if(client)
client.prefs.process_link(src, href_list)
@@ -303,7 +263,7 @@
if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected
vote_on_poll(pollid, optionid, 1)
proc/IsJobAvailable(rank)
/mob/new_player/proc/IsJobAvailable(rank)
var/datum/job/job = SSjobs.GetJob(rank)
if(!job) return 0
if(!job.is_position_available()) return 0
@@ -311,7 +271,7 @@
return 1
proc/AttemptLateSpawn(rank,var/spawning_at)
/mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at)
if(src != usr)
return 0
if(SSticker.current_state != GAME_STATE_PLAYING)
@@ -356,7 +316,6 @@
qdel(C)
qdel(src)
return
//Find our spawning point.
var/join_message = SSjobs.LateSpawn(character, rank)
@@ -381,14 +340,14 @@
qdel(src)
proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message)
/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message)
if (SSticker.current_state == GAME_STATE_PLAYING)
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
// can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc.
global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
proc/LateChoices()
/mob/new_player/proc/LateChoices()
var/name = client.prefs.real_name
var/dat = "<html><body><center>"
@@ -418,7 +377,7 @@
src << browse(dat, "window=latechoices;size=300x640;can_close=1")
proc/create_character()
/mob/new_player/proc/create_character()
spawning = 1
close_spawn_windows()
@@ -487,24 +446,24 @@
return new_character
proc/ViewManifest()
/mob/new_player/proc/ViewManifest()
var/dat = "<html><body>"
dat += "<h4>Show Crew Manifest</h4>"
dat += data_core.get_manifest(OOC = 1)
src << browse(dat, "window=manifest;size=370x420;can_close=1")
Move()
/mob/new_player/Move()
return 0
proc/close_spawn_windows()
/mob/new_player/proc/close_spawn_windows()
src << browse(null, "window=latechoices") //closes late choices window
src << browse(null, "window=playersetup") //closes the player setup window
proc/has_admin_rights()
/mob/new_player/proc/has_admin_rights()
return check_rights(R_ADMIN, 0, src)
proc/is_species_whitelisted(datum/species/S)
/mob/new_player/proc/is_species_whitelisted(datum/species/S)
if(!S) return 1
return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(S.spawn_flags & IS_WHITELISTED)
@@ -537,5 +496,5 @@
/mob/new_player/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
return
mob/new_player/MayRespawn()
/mob/new_player/MayRespawn()
return 1

View File

@@ -1,47 +1,4 @@
/mob/new_player/proc/handle_privacy_poll()
establish_db_connection(dbcon)
if(!dbcon.IsConnected())
return
var/voted = 0
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM ss13_privacy WHERE ckey='[src.ckey]'")
query.Execute()
while(query.NextRow())
voted = 1
break
if(!voted)
privacy_poll()
/mob/new_player/proc/privacy_poll()
var/output = "<div align='center'><B>Player poll</B>"
output +="<hr>"
output += "<b>We would like to expand our stats gathering.</b>"
output += "<br>This however involves gathering data about player behavior, play styles, unique player numbers, play times, etc. Data like that cannot be gathered fully anonymously, which is why we're asking you how you'd feel if player-specific data was gathered. Prior to any of this actually happening, a privacy policy will be discussed, but before that can begin, we'd preliminarily like to know how you feel about the concept."
output +="<hr>"
output += "How do you feel about the game gathering player-specific statistics? This includes statistics about individual players as well as in-game polling/opinion requests."
output += "<p><a href='byond://?src=\ref[src];privacy_poll=signed'>Signed stats gathering</A>"
output += "<br>Pick this option if you think usernames should be logged with stats. This allows us to have personalized stats as well as polls."
output += "<p><a href='byond://?src=\ref[src];privacy_poll=anonymous'>Anonymous stats gathering</A>"
output += "<br>Pick this option if you think only hashed (indecipherable) usernames should be logged with stats. This doesn't allow us to have personalized stats, as we can't tell who is who (hashed values aren't readable), we can however have ingame polls."
output += "<p><a href='byond://?src=\ref[src];privacy_poll=nostats'>No stats gathering</A>"
output += "<br>Pick this option if you don't want player-specific stats gathered. This does not allow us to have player-specific stats or polls."
output += "<p><a href='byond://?src=\ref[src];privacy_poll=later'>Ask again later</A>"
output += "<br>This poll will be brought up again next round."
output += "<p><a href='byond://?src=\ref[src];privacy_poll=abstain'>Don't ask again</A>"
output += "<br>Only pick this if you are fine with whatever option wins."
output += "</div>"
src << browse(output,"window=privacypoll;size=600x500")
return
/datum/polloption
var/optionid
var/optiontext

View File

@@ -553,6 +553,7 @@
spark(src, 3)
status = LIGHT_BROKEN
update()
if (!skip_sound_and_sparks)
CHECK_TICK // For lights-out events.
/obj/machinery/light/proc/fix()

View File

@@ -0,0 +1,4 @@
author: Lohikar
delete-after: True
changes:
- rscdel: "Removed the privacy poll."