mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-27 22:17:32 +01:00
Conflict resolution
Unironically conflicting with another one of my PRs
This commit is contained in:
@@ -463,7 +463,7 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time =
|
||||
G << 'sound/misc/notice2.ogg'//Alerting them to their consideration
|
||||
if(flashwindow)
|
||||
window_flash(G.client)
|
||||
switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Not This Round"))
|
||||
switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","No","Yes","Not This Round"))
|
||||
if("Yes")
|
||||
to_chat(G, "<span class='notice'>Choice registered: Yes.</span>")
|
||||
if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed.
|
||||
|
||||
@@ -110,3 +110,9 @@ var/gaussian_next
|
||||
if(new_val < bound_lower)
|
||||
new_val = min(orig_val, bound_lower)
|
||||
return new_val
|
||||
|
||||
// sqrt, but if you give it a negative number, you get 0 instead of a runtime
|
||||
/proc/sqrtor0(num)
|
||||
if(num < 0)
|
||||
return 0
|
||||
return sqrt(num)
|
||||
|
||||
@@ -1,9 +1,3 @@
|
||||
// Solves problems with lighting updates lagging shit
|
||||
// Max constraints on number of updates per doWork():
|
||||
#define MAX_LIGHT_UPDATES_PER_WORK 100
|
||||
#define MAX_CORNER_UPDATES_PER_WORK 1000
|
||||
#define MAX_OVERLAY_UPDATES_PER_WORK 2000
|
||||
|
||||
/var/lighting_overlays_initialised = FALSE
|
||||
|
||||
/var/list/lighting_update_lights = list() // List of lighting sources queued for update.
|
||||
@@ -16,10 +10,22 @@
|
||||
|
||||
|
||||
/datum/controller/process/lighting
|
||||
// Queues of update counts, waiting to be rolled into stats lists
|
||||
var/list/stats_queues = list(
|
||||
"Source" = list(), "Corner" = list(), "Overlay" = list())
|
||||
// Stats lists
|
||||
var/list/stats_lists = list(
|
||||
"Source" = list(), "Corner" = list(), "Overlay" = list())
|
||||
var/update_stats_every = (1 SECONDS)
|
||||
var/next_stats_update = 0
|
||||
var/stat_updates_to_keep = 5
|
||||
|
||||
/datum/controller/process/lighting/setup()
|
||||
name = "lighting"
|
||||
|
||||
schedule_interval = world.tick_lag // run as fast as you possibly can
|
||||
schedule_interval = 0 // run as fast as you possibly can
|
||||
sleep_interval = 10 // Yield every 10% of a tick
|
||||
defer_usage = 80 // Defer at 80% of a tick
|
||||
create_all_lighting_overlays()
|
||||
lighting_overlays_initialised = TRUE
|
||||
|
||||
@@ -28,17 +34,10 @@
|
||||
doWork(1)
|
||||
|
||||
/datum/controller/process/lighting/doWork(roundstart)
|
||||
// Counters
|
||||
var/light_updates = 0
|
||||
var/corner_updates = 0
|
||||
var/overlay_updates = 0
|
||||
|
||||
lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated.
|
||||
lighting_update_lights = list()
|
||||
for(var/datum/light_source/L in lighting_update_lights_old)
|
||||
if(light_updates >= MAX_LIGHT_UPDATES_PER_WORK && !roundstart)
|
||||
lighting_update_lights += L
|
||||
continue // DON'T break, we're adding stuff back into the update queue.
|
||||
|
||||
if(L.check() || L.destroyed || L.force_update)
|
||||
L.remove_lum()
|
||||
@@ -52,52 +51,48 @@
|
||||
L.force_update = FALSE
|
||||
L.needs_update = FALSE
|
||||
|
||||
light_updates++
|
||||
|
||||
SCHECK
|
||||
|
||||
lighting_update_corners_old = lighting_update_corners //Same as above.
|
||||
lighting_update_corners = list()
|
||||
for(var/A in lighting_update_corners_old)
|
||||
if(corner_updates >= MAX_CORNER_UPDATES_PER_WORK && !roundstart)
|
||||
lighting_update_corners += A
|
||||
continue // DON'T break, we're adding stuff back into the update queue.
|
||||
|
||||
var/datum/lighting_corner/C = A
|
||||
|
||||
C.update_overlays()
|
||||
|
||||
C.needs_update = FALSE
|
||||
|
||||
corner_updates++
|
||||
|
||||
SCHECK
|
||||
|
||||
lighting_update_overlays_old = lighting_update_overlays //Same as above.
|
||||
lighting_update_overlays = list()
|
||||
|
||||
for(var/atom/movable/lighting_overlay/O in lighting_update_overlays_old)
|
||||
if(overlay_updates >= MAX_OVERLAY_UPDATES_PER_WORK && !roundstart)
|
||||
lighting_update_overlays += O
|
||||
continue // DON'T break, we're adding stuff back into the update queue.
|
||||
|
||||
for(var/A in lighting_update_overlays_old)
|
||||
var/atom/movable/lighting_overlay/O = A
|
||||
O.update_overlay()
|
||||
O.needs_update = 0
|
||||
overlay_updates++
|
||||
SCHECK
|
||||
|
||||
stats_queues["Source"] += lighting_update_lights_old.len
|
||||
stats_queues["Corner"] += lighting_update_corners_old.len
|
||||
stats_queues["Overlay"] += lighting_update_overlays_old.len
|
||||
|
||||
if(next_stats_update <= world.time)
|
||||
next_stats_update = world.time + update_stats_every
|
||||
for(var/stat_name in stats_queues)
|
||||
var/stat_sum = 0
|
||||
var/list/stats_queue = stats_queues[stat_name]
|
||||
for(var/count in stats_queue)
|
||||
stat_sum += count
|
||||
stats_queue.Cut()
|
||||
|
||||
var/list/stats_list = stats_lists[stat_name]
|
||||
stats_list.Insert(1, stat_sum)
|
||||
if(stats_list.len > stat_updates_to_keep)
|
||||
stats_list.Cut(stats_list.len)
|
||||
|
||||
/datum/controller/process/lighting/statProcess()
|
||||
..()
|
||||
stat(null, "[all_lighting_sources.len] light sources exist")
|
||||
stat(null, "[all_lighting_corners.len] light corners exist")
|
||||
stat(null, "[global.all_lighting_overlays.len] light overlays exist")
|
||||
stat(null, "[lighting_update_lights.len] lighting sources queued")
|
||||
stat(null, "[lighting_update_corners.len] lighting corners queued")
|
||||
stat(null, "[lighting_update_overlays.len] lighting overlays queued")
|
||||
|
||||
#undef MAX_LIGHT_UPDATES_PER_WORK
|
||||
#undef MAX_CORNER_UPDATES_PER_WORK
|
||||
#undef MAX_OVERLAY_UPDATES_PER_WORK
|
||||
stat(null, "[total_lighting_sources] sources, [total_lighting_corners] corners, [total_lighting_overlays] overlays")
|
||||
for(var/stat_type in stats_lists)
|
||||
stat(null, "[stat_type] updates: [jointext(stats_lists[stat_type], " | ")]")
|
||||
|
||||
@@ -43,11 +43,11 @@ Bonus
|
||||
return
|
||||
|
||||
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
|
||||
var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth())
|
||||
var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth())
|
||||
M.adjustOxyLoss(get_damage)
|
||||
return 1
|
||||
|
||||
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
|
||||
var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5)
|
||||
var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5)
|
||||
M.adjustOxyLoss(get_damage)
|
||||
return 1
|
||||
@@ -36,6 +36,6 @@ Bonus
|
||||
return
|
||||
|
||||
/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A)
|
||||
var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3))
|
||||
var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
|
||||
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
|
||||
return 1
|
||||
@@ -45,13 +45,13 @@ Bonus
|
||||
return
|
||||
|
||||
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
|
||||
var/get_stacks = (sqrt(20+A.totalStageSpeed()*2))-(sqrt(16+A.totalStealth()))
|
||||
var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*2))-(sqrtor0(16+A.totalStealth()))
|
||||
M.adjust_fire_stacks(get_stacks)
|
||||
M.adjustFireLoss(get_stacks/2)
|
||||
return 1
|
||||
|
||||
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
|
||||
var/get_stacks = (sqrt(20+A.totalStageSpeed()*3))-(sqrt(16+A.totalStealth()))
|
||||
var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*3))-(sqrtor0(16+A.totalStealth()))
|
||||
M.adjust_fire_stacks(get_stacks)
|
||||
M.adjustFireLoss(get_stacks)
|
||||
return 1
|
||||
@@ -38,6 +38,6 @@ Bonus
|
||||
return
|
||||
|
||||
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
|
||||
var/get_damage = ((sqrt(16-A.totalStealth()))*5)
|
||||
var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
|
||||
M.adjustBruteLoss(get_damage)
|
||||
return 1
|
||||
@@ -34,7 +34,7 @@ Bonus
|
||||
return
|
||||
|
||||
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
|
||||
var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand()))
|
||||
var/get_damage = (sqrtor0(20+A.totalStageSpeed())*(1+rand()))
|
||||
M.adjustToxLoss(-get_damage)
|
||||
return 1
|
||||
|
||||
@@ -148,7 +148,7 @@ Bonus
|
||||
level = 5
|
||||
|
||||
/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A)
|
||||
var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand()))
|
||||
var/amt_healed = (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand()))
|
||||
M.adjustBrainLoss(-amt_healed)
|
||||
//Non-power mutations, excluding race, so the virus does not force monkey -> human transformations.
|
||||
var/list/unclean_mutations = (not_good_mutations|bad_mutations) - mutations_list[RACEMUT]
|
||||
|
||||
@@ -35,6 +35,6 @@ Bonus
|
||||
return
|
||||
|
||||
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
|
||||
var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2))
|
||||
var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
|
||||
M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
|
||||
return 1
|
||||
@@ -18,11 +18,6 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/wires/autolathe/Interact(var/mob/living/user)
|
||||
if(CanUse(user))
|
||||
var/obj/machinery/autolathe/V = holder
|
||||
V.attack_hand(user)
|
||||
|
||||
/datum/wires/autolathe/UpdateCut(index, mended)
|
||||
var/obj/machinery/autolathe/A = holder
|
||||
switch(index)
|
||||
@@ -55,4 +50,4 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4
|
||||
spawn(50)
|
||||
if(A && !IsIndexCut(index))
|
||||
A.disabled = 0
|
||||
Interact(usr)
|
||||
Interact(usr)
|
||||
|
||||
@@ -22,27 +22,27 @@
|
||||
|
||||
// Give Random Bad Mutation to M
|
||||
/proc/randmutb(var/mob/living/M)
|
||||
if(!M) return
|
||||
if(!M || !M.dna) return
|
||||
M.dna.check_integrity()
|
||||
var/block = pick(bad_blocks)
|
||||
M.dna.SetSEState(block, 1)
|
||||
|
||||
// Give Random Good Mutation to M
|
||||
/proc/randmutg(var/mob/living/M)
|
||||
if(!M) return
|
||||
if(!M || !M.dna) return
|
||||
M.dna.check_integrity()
|
||||
var/block = pick(good_blocks)
|
||||
M.dna.SetSEState(block, 1)
|
||||
|
||||
// Random Appearance Mutation
|
||||
/proc/randmuti(var/mob/living/M)
|
||||
if(!M) return
|
||||
if(!M || !M.dna) return
|
||||
M.dna.check_integrity()
|
||||
M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095))
|
||||
|
||||
// Scramble UI or SE.
|
||||
/proc/scramble(var/UI, var/mob/M, var/prob)
|
||||
if(!M) return
|
||||
if(!M || !M.dna) return
|
||||
M.dna.check_integrity()
|
||||
if(UI)
|
||||
for(var/i = 1, i <= DNA_UI_LENGTH-1, i++)
|
||||
|
||||
@@ -965,7 +965,7 @@ var/list/teleport_runes = list()
|
||||
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
|
||||
ghosts_on_rune |= O
|
||||
var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune)
|
||||
var/mob/living/carbon/human/new_human = new(get_turf(src))
|
||||
var/mob/living/carbon/human/dummy/new_human = new(get_turf(src))
|
||||
new_human.real_name = ghost_to_spawn.real_name
|
||||
new_human.alpha = 150 //Makes them translucent
|
||||
new_human.color = "grey" //heh..cult greytide...litterly...
|
||||
|
||||
@@ -496,7 +496,7 @@
|
||||
melee_damage_upper = 10
|
||||
damage_transfer = 0.9
|
||||
projectiletype = /obj/item/projectile/guardian
|
||||
ranged_cooldown_time = 1
|
||||
ranged_cooldown_time = 10
|
||||
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/jtext
|
||||
for(var/client/C in clients)
|
||||
jtext = "No Job"
|
||||
if(C.mob.mind.assigned_role)
|
||||
if(C.mob.mind && C.mob.mind.assigned_role)
|
||||
theirjob = job_master.GetJob(C.mob.mind.assigned_role)
|
||||
if(theirjob)
|
||||
jtext = theirjob.title
|
||||
|
||||
@@ -75,11 +75,11 @@
|
||||
|
||||
/obj/machinery/autolathe/interact(mob/user)
|
||||
if(shocked && !(stat & NOPOWER))
|
||||
shock(user, 50)
|
||||
return
|
||||
if(shock(user, 50))
|
||||
return
|
||||
|
||||
if(panel_open)
|
||||
wires.Interact()
|
||||
wires.Interact(user)
|
||||
else
|
||||
ui_interact(user)
|
||||
|
||||
@@ -451,4 +451,4 @@
|
||||
else
|
||||
for(var/datum/design/D in files.known_designs)
|
||||
if("hacked" in D.category)
|
||||
files.known_designs -= D.id
|
||||
files.known_designs -= D.id
|
||||
|
||||
@@ -192,8 +192,8 @@
|
||||
// Engineering
|
||||
if(istype(O,/obj/item/stack/sheet))
|
||||
var/obj/item/stack/sheet/S = O
|
||||
if(S.amount < 50)
|
||||
S.amount += 1 * coeff
|
||||
if(S.amount < S.max_amount)
|
||||
S.amount += round(min(1 * coeff, S.max_amount - S.amount))
|
||||
// Security
|
||||
if(istype(O,/obj/item/device/flash))
|
||||
var/obj/item/device/flash/F = O
|
||||
|
||||
@@ -12,24 +12,22 @@
|
||||
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!")
|
||||
|
||||
/obj/item/device/megaphone/attack_self(mob/living/user as mob)
|
||||
if(user.client)
|
||||
if(user.client.prefs.muted & MUTE_IC)
|
||||
to_chat(src, "\red You cannot speak in IC (muted).")
|
||||
return
|
||||
if(!ishuman(user))
|
||||
to_chat(user, "\red You don't know how to use this!")
|
||||
if(user.client && (user.client.prefs.muted & MUTE_IC))
|
||||
to_chat(src, "<span class='warning'>You cannot speak in IC (muted).</span>")
|
||||
return
|
||||
if(user.silent)
|
||||
if(!ishuman(user))
|
||||
to_chat(user, "<span class='warning'>You don't know how to use this!</span>")
|
||||
return
|
||||
if(!user.can_speak())
|
||||
to_chat(user, "<span class='warning'>You find yourself unable to speak at all.</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H && H.mind)
|
||||
if(H.mind.miming)
|
||||
to_chat(user, "<span class='warning'>Your vow of silence prevents you from speaking.</span>")
|
||||
return
|
||||
if(H && H.mind && H.mind.miming)
|
||||
to_chat(user, "<span class='warning'>Your vow of silence prevents you from speaking.</span>")
|
||||
return
|
||||
if(spamcheck)
|
||||
to_chat(user, "\red \The [src] needs to recharge!")
|
||||
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
|
||||
return
|
||||
|
||||
var/message = input(user, "Shout a message:", "Megaphone") as text|null
|
||||
@@ -39,28 +37,27 @@
|
||||
if(!message)
|
||||
return
|
||||
message = capitalize(message)
|
||||
if((src.loc == user && usr.stat == 0))
|
||||
if((loc == user && !user.incapacitated()))
|
||||
if(emagged)
|
||||
if(insults)
|
||||
saymsg(user, pick(insultmsg))
|
||||
insults--
|
||||
else
|
||||
to_chat(user, "\red *BZZZZzzzzzt*")
|
||||
to_chat(user, "<span class='warning'>*BZZZZzzzzzt*</span>")
|
||||
else
|
||||
saymsg(user, message)
|
||||
|
||||
spamcheck = 1
|
||||
spawn(20)
|
||||
spamcheck = 0
|
||||
return
|
||||
|
||||
/obj/item/device/megaphone/proc/saymsg(mob/living/user as mob, message)
|
||||
audible_message("<span class='game say'><span class='name'>[user]</span> broadcasts, <FONT size=3>\"[message]\"</FONT></span>", hearing_distance = 14)
|
||||
audible_message("<span class='game say'><span class='name'>[user]</span> broadcasts, <span class='reallybig'>\"[message]\"</span></span>", hearing_distance = 14)
|
||||
for(var/obj/O in oview(14, get_turf(src)))
|
||||
O.hear_talk(user, "<FONT size=3>[message]</FONT>")
|
||||
O.hear_talk(user, "<span class='reallybig'>[message]</span>")
|
||||
|
||||
/obj/item/device/megaphone/emag_act(user as mob)
|
||||
if(!emagged)
|
||||
to_chat(user, "\red You overload \the [src]'s voice synthesizer.")
|
||||
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
|
||||
emagged = 1
|
||||
insults = rand(1, 3)//to prevent dickflooding
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
..()
|
||||
var/datum/space_level/S = space_manager.get_zlev(z)
|
||||
S.remove_from_transit(src)
|
||||
if(light_sources) // Turn off starlight, if present
|
||||
set_light(0)
|
||||
|
||||
/turf/space/AfterChange(ignore_air, keep_cabling = FALSE)
|
||||
..()
|
||||
|
||||
@@ -976,14 +976,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_to_slot_or_del(pda, slot_belt)
|
||||
equip_special_id(M,list(access_maint_tunnels), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
|
||||
|
||||
|
||||
if("vox")
|
||||
if(istype(M, /mob/living/carbon/human/voxarmalis)) // have to do this, they cannot wear normal vox gear!
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/vox_grey(M), slot_w_uniform)
|
||||
if(M.species.name == "Vox Armalis") // have to do this, they cannot wear normal vox gear!
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes(M), slot_w_uniform)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(M), slot_head)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes (M), slot_w_uniform)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate/vox(M), slot_shoes)
|
||||
@@ -1474,15 +1472,15 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
return
|
||||
|
||||
error_cache.showTo(usr)
|
||||
|
||||
|
||||
/client/proc/jump_to_ruin()
|
||||
set category = "Debug"
|
||||
set name = "Jump to Ruin"
|
||||
set desc = "Displays a list of all placed ruins to teleport to."
|
||||
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
|
||||
var/list/names = list()
|
||||
for(var/i in ruin_landmarks)
|
||||
var/obj/effect/landmark/ruin/ruin_landmark = i
|
||||
@@ -1505,21 +1503,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if(istype(landmark))
|
||||
var/datum/map_template/ruin/template = landmark.ruin_template
|
||||
admin_forcemove(usr, get_turf(landmark))
|
||||
|
||||
|
||||
to_chat(usr, "<span class='name'>[template.name]</span>")
|
||||
to_chat(usr, "<span class='italics'>[template.description]</span>")
|
||||
|
||||
|
||||
log_admin("[key_name(usr)] jumped to ruin [ruinname]")
|
||||
if(!isobserver(usr))
|
||||
message_admins("[key_name_admin(usr)] jumped to ruin [ruinname]", 1)
|
||||
|
||||
|
||||
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/client/proc/toggle_medal_disable()
|
||||
set category = "Debug"
|
||||
set name = "Toggle Medal Disable"
|
||||
set desc = "Toggles the safety lock on trying to contact the medal hub."
|
||||
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
|
||||
@@ -910,6 +910,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
holder.modify_goals()
|
||||
|
||||
/datum/admins/proc/modify_goals()
|
||||
if(!ticker || !ticker.mode)
|
||||
to_chat(usr, "<span class='warning'>This verb can only be used if the round has started.</span>")
|
||||
return
|
||||
|
||||
var/dat = ""
|
||||
for(var/datum/station_goal/S in ticker.mode.station_goals)
|
||||
dat += "[S.name] - <a href='?src=[S.UID()];announce=1'>Announce</a> | <a href='?src=[S.UID()];remove=1'>Remove</a><br>"
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
var/toggle_message = null
|
||||
var/alt_toggle_message = null
|
||||
var/active_sound = null
|
||||
var/toggle_sound = null
|
||||
var/toggle_cooldown = null
|
||||
var/cooldown = 0
|
||||
var/species_disguise = null
|
||||
@@ -573,7 +574,7 @@ BLIND // can't see anything
|
||||
permeability_coefficient = 0.90
|
||||
slot_flags = SLOT_ICLOTHING
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Drask")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/uniform.dmi'
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
|
||||
strip_delay = 60
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Drask")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
@@ -34,6 +34,8 @@
|
||||
while(up)
|
||||
playsound(src.loc, "[active_sound]", 100, 0, 4)
|
||||
sleep(15)
|
||||
if(toggle_sound)
|
||||
playsound(src.loc, "[toggle_sound]", 100, 0, 4)
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/visor
|
||||
@@ -71,11 +73,6 @@
|
||||
icon_state = "swat"
|
||||
item_state = "swat-alt"
|
||||
armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/riot
|
||||
name = "riot helmet"
|
||||
@@ -127,11 +124,6 @@
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
|
||||
strip_delay = 80
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/swat/syndicate
|
||||
name = "blood-red helmet"
|
||||
@@ -174,6 +166,12 @@
|
||||
flags = HEADCOVERSEYES | BLOCKHAIR
|
||||
item_state = "gladiator"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
toggle_message = "You attach the face shield to the"
|
||||
alt_toggle_message = "You remove the face shield from the"
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
|
||||
can_toggle = 1
|
||||
toggle_cooldown = 20
|
||||
toggle_sound = 'sound/items/ZippoClose.ogg'
|
||||
|
||||
obj/item/clothing/head/helmet/redtaghelm
|
||||
name = "red laser tag helmet"
|
||||
@@ -202,6 +200,10 @@ obj/item/clothing/head/blob
|
||||
item_state = "blobhat"
|
||||
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/riot/knight/blue
|
||||
icon_state = "knight_blue"
|
||||
|
||||
@@ -31,17 +31,25 @@
|
||||
|
||||
//Unathi space gear. Huge and restrictive.
|
||||
/obj/item/clothing/head/helmet/space/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/hats.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
|
||||
name = "NT breacher helmet"
|
||||
desc = "Hey! Watch it with that thing! It's a knock-off of a Unathi battle-helm, and that spike could put someone's eye out."
|
||||
desc = "Hey! Watch it with that thing! It's a knock-off of an Unathi battle-helm, and that spike could put someone's eye out."
|
||||
icon_state = "unathi_helm_cheap"
|
||||
item_state = "unathi_helm_cheap"
|
||||
item_color = "unathi_helm_cheap"
|
||||
|
||||
/obj/item/clothing/suit/space/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/suits.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/space/unathi/rig_cheap
|
||||
name = "NT breacher chassis"
|
||||
@@ -71,6 +79,7 @@
|
||||
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
icon = 'icons/obj/clothing/species/vox/suits.dmi'
|
||||
species_restricted = list("Vox", "Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
@@ -80,6 +89,7 @@
|
||||
/obj/item/clothing/head/helmet/space/vox
|
||||
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE
|
||||
icon = 'icons/obj/clothing/species/vox/hats.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
@@ -137,6 +147,7 @@
|
||||
|
||||
/obj/item/clothing/under/vox
|
||||
has_sensor = 0
|
||||
icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
|
||||
species_restricted = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi'
|
||||
@@ -150,12 +161,17 @@
|
||||
item_state = "vox-casual-1"
|
||||
body_parts_covered = LEGS
|
||||
|
||||
/obj/item/clothing/under/vox/vox_robes
|
||||
/obj/item/clothing/under/vox/vox_robes //This will be invisible on Armalis for lack of a proper sprite. They wear a carapace suit anyway, and this is more just to let them use IDs and such.
|
||||
name = "alien robes"
|
||||
desc = "Weird and flowing!"
|
||||
icon_state = "vox-casual-2"
|
||||
item_color = "vox-casual-2"
|
||||
item_state = "vox-casual-2"
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/vox
|
||||
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
|
||||
@@ -165,20 +181,22 @@
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
item_color = "gloves-vox"
|
||||
icon = 'icons/obj/clothing/species/vox/gloves.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/gloves.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/gloves.dmi',
|
||||
)
|
||||
/obj/item/clothing/shoes/magboots/vox
|
||||
|
||||
/obj/item/clothing/shoes/magboots/vox
|
||||
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
|
||||
name = "vox magclaws"
|
||||
item_state = "boots-vox"
|
||||
icon_state = "boots-vox"
|
||||
|
||||
icon = 'icons/obj/clothing/species/vox/shoes.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/feet.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/feet.dmi'
|
||||
)
|
||||
|
||||
@@ -223,6 +241,7 @@
|
||||
name = "Vox EVA Suit"
|
||||
icon_state = "voxspace"
|
||||
item_state = "voxspace"
|
||||
icon = 'icons/obj/clothing/species/vox/suits.dmi'
|
||||
species_restricted = list("Vox", "Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
@@ -233,6 +252,7 @@
|
||||
name = "Vox EVA Suit"
|
||||
icon_state = "voxspace"
|
||||
item_state = "voxspace"
|
||||
icon = 'icons/obj/clothing/species/vox/hats.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
|
||||
@@ -10,7 +10,11 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
flags_inv = HIDEGLOVES|HIDESHOES
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
icon = 'icons/obj/clothing/species/plasmaman/suits.dmi'
|
||||
species_restricted = list("Plasmaman")
|
||||
sprite_sheets = list(
|
||||
"Plasmaman" = 'icons/mob/species/plasmaman/suit.dmi'
|
||||
)
|
||||
flags = STOPSPRESSUREDMAGE
|
||||
autoextinguish = 1
|
||||
|
||||
@@ -95,8 +99,11 @@
|
||||
name = "plasmaman helmet"
|
||||
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
|
||||
flags = STOPSPRESSUREDMAGE
|
||||
icon = 'icons/obj/clothing/species/plasmaman/hats.dmi'
|
||||
species_restricted = list("Plasmaman")
|
||||
|
||||
sprite_sheets = list(
|
||||
"Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi'
|
||||
)
|
||||
icon_state = "plasmaman_helmet0"
|
||||
item_state = "plasmaman_helmet0"
|
||||
var/base_state = "plasmaman_helmet"
|
||||
|
||||
@@ -10,8 +10,9 @@
|
||||
vision_restriction = 1
|
||||
offline_vision_restriction = 2
|
||||
|
||||
chest_type = /obj/item/clothing/suit/space/new_rig
|
||||
chest_type = /obj/item/clothing/suit/space/new_rig/unathi
|
||||
helm_type = /obj/item/clothing/head/helmet/space/new_rig/unathi
|
||||
glove_type = /obj/item/clothing/gloves/rig/unathi
|
||||
boot_type = /obj/item/clothing/shoes/magboots/rig/unathi
|
||||
|
||||
/obj/item/weapon/rig/unathi/fancy
|
||||
@@ -23,10 +24,23 @@
|
||||
vision_restriction = 0
|
||||
|
||||
/obj/item/clothing/head/helmet/space/new_rig/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/hats.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
|
||||
/obj/item/clothing/suit/space/new_rig/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/suits.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
|
||||
/obj/item/clothing/gloves/rig/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/gloves.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/gloves.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/unathi
|
||||
species_restricted = list("Unathi")
|
||||
icon = 'icons/obj/clothing/species/unathi/shoes.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/feet.dmi'
|
||||
)
|
||||
@@ -565,35 +565,43 @@
|
||||
item_state = "bane"
|
||||
item_color = "bane"
|
||||
|
||||
/obj/item/clothing/under/vox_grey
|
||||
/obj/item/clothing/under/vox
|
||||
name = "Ripped Jumpsuit"
|
||||
desc = "A jumpsuit that looks like it's been shredded by some talons. Who could wear this now?"
|
||||
icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
|
||||
icon_state = "vgrey"
|
||||
item_state = "vgrey"
|
||||
item_color = "vgrey"
|
||||
|
||||
/obj/item/clothing/under/vox/grey
|
||||
name = "Grey Vox Jumpsuit"
|
||||
desc = "An assistant's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vgrey"
|
||||
item_state = "vgrey"
|
||||
item_color = "vgrey"
|
||||
|
||||
/obj/item/clothing/under/vox_robotics
|
||||
/obj/item/clothing/under/vox/robotics
|
||||
name = "Vox Robotics Jumpsuit"
|
||||
desc = "A roboticist's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vrobotics"
|
||||
item_state = "vrobotics"
|
||||
item_color = "vrobotics"
|
||||
|
||||
/obj/item/clothing/under/vox_toxins
|
||||
/obj/item/clothing/under/vox/toxins
|
||||
name = "Vox Toxins Jumpsuit"
|
||||
desc = "A Toxin Researcher's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vtoxinswhite"
|
||||
item_state = "vtoxinswhite"
|
||||
item_color = "vtoxinswhite"
|
||||
|
||||
/obj/item/clothing/under/vox_atmos
|
||||
/obj/item/clothing/under/vox/atmos
|
||||
name = "Vox Atmos Jumpsuit"
|
||||
desc = "An Atmos Tech's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vatmos"
|
||||
item_state = "vatmos"
|
||||
item_color = "vatmos"
|
||||
|
||||
/obj/item/clothing/under/vox_engi
|
||||
/obj/item/clothing/under/vox/engi
|
||||
name = "Vox Engineer Jumpsuit"
|
||||
desc = "An Engineer's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vengine"
|
||||
@@ -601,7 +609,7 @@
|
||||
item_color = "vengine"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
|
||||
|
||||
/obj/item/clothing/under/vox_sec
|
||||
/obj/item/clothing/under/vox/sec
|
||||
name = "Vox Security Jumpsuit"
|
||||
desc = "A Security officer's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vred"
|
||||
@@ -609,7 +617,7 @@
|
||||
item_color = "vred"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/under/vox_chem
|
||||
/obj/item/clothing/under/vox/chem
|
||||
name = "Vox Chemist Jumpsuit"
|
||||
desc = "A Chemist's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vchem"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/event/blob
|
||||
announceWhen = 12
|
||||
announceWhen = 60
|
||||
endWhen = 120
|
||||
var/obj/effect/blob/core/Blob
|
||||
|
||||
@@ -10,9 +10,17 @@
|
||||
var/turf/T = pick(blobstart)
|
||||
if(!T)
|
||||
return kill()
|
||||
Blob = new /obj/effect/blob/core(T, 200)
|
||||
for(var/i = 1; i < rand(3, 6), i++)
|
||||
Blob.process()
|
||||
var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
|
||||
var/mob/C
|
||||
if(candidates.len)
|
||||
C = pick(candidates)
|
||||
Blob = new /obj/effect/blob/core(T, 200)
|
||||
Blob.create_overmind(C.client, 1)
|
||||
spawn(30)
|
||||
for(var/i = 1; i < rand(3, 6), i++)
|
||||
Blob.process()
|
||||
else
|
||||
return kill()
|
||||
|
||||
/datum/event/blob/tick()
|
||||
if(!Blob)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/var/list/datum/lighting_corner/all_lighting_corners = list()
|
||||
/var/total_lighting_corners = 0
|
||||
/var/datum/lighting_corner/dummy/dummy_lighting_corner = new
|
||||
// Because we can control each corner of every lighting overlay.
|
||||
// And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't).
|
||||
@@ -32,7 +32,7 @@
|
||||
/datum/lighting_corner/New(var/turf/new_turf, var/diagonal)
|
||||
. = ..()
|
||||
|
||||
all_lighting_corners += src
|
||||
total_lighting_corners++
|
||||
|
||||
masters[new_turf] = turn(diagonal, 180)
|
||||
z = new_turf.z
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var/list/all_lighting_overlays = list() // Global list of lighting overlays.
|
||||
/var/total_lighting_overlays = 0
|
||||
/atom/movable/lighting_overlay
|
||||
name = ""
|
||||
mouse_opacity = 0
|
||||
@@ -21,7 +21,7 @@ var/list/all_lighting_overlays = list() // Global list of lighting overlays.
|
||||
/atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE)
|
||||
. = ..()
|
||||
verbs.Cut()
|
||||
global.all_lighting_overlays += src
|
||||
total_lighting_overlays++
|
||||
|
||||
var/turf/T = loc //If this runtimes atleast we'll know what's creating overlays outside of turfs.
|
||||
T.lighting_overlay = src
|
||||
@@ -77,7 +77,7 @@ var/list/all_lighting_overlays = list() // Global list of lighting overlays.
|
||||
return
|
||||
|
||||
/atom/movable/lighting_overlay/Destroy()
|
||||
global.all_lighting_overlays -= src
|
||||
total_lighting_overlays--
|
||||
global.lighting_update_overlays -= src
|
||||
global.lighting_update_overlays_old -= src
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/var/list/datum/light_source/all_lighting_sources = list()
|
||||
/var/total_lighting_sources = 0
|
||||
// This is where the fun begins.
|
||||
// These are the main datums that emit light.
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/force_update
|
||||
|
||||
/datum/light_source/New(var/atom/owner, var/atom/top)
|
||||
all_lighting_sources += src
|
||||
total_lighting_sources++
|
||||
source_atom = owner // Set our new owner.
|
||||
if(!source_atom.light_sources)
|
||||
source_atom.light_sources = list()
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
// Kill ourselves.
|
||||
/datum/light_source/proc/destroy()
|
||||
all_lighting_sources -= src
|
||||
total_lighting_sources--
|
||||
destroyed = TRUE
|
||||
force_update()
|
||||
if(source_atom)
|
||||
|
||||
@@ -169,7 +169,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
else
|
||||
var/response
|
||||
var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)"
|
||||
response = alert(src, alertmsg,"Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
response = alert(src, alertmsg,"Are you sure you want to ghost?","Stay in body","Ghost")
|
||||
if(response != "Ghost")
|
||||
return //didn't want to ghost after-all
|
||||
resting = 1
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
id = "s_holster"
|
||||
build_type = BIOGENERATOR
|
||||
materials = list(MAT_BIOMASS = 400)
|
||||
build_path = /obj/item/weapon/storage/belt/holster
|
||||
build_path = /obj/item/clothing/accessory/holster
|
||||
category = list("initial","Leather and Cloth")
|
||||
|
||||
/datum/design/leather_satchel
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// Satellites be actived to generate a shield that will block unorganic matter from passing it.
|
||||
/datum/station_goal/station_shield
|
||||
name = "Station Shield"
|
||||
var/coverage_goal = 500
|
||||
var/coverage_goal = 5000
|
||||
|
||||
/datum/station_goal/station_shield/get_report()
|
||||
return {"<b>Station Shield construction</b><br>
|
||||
|
||||
Reference in New Issue
Block a user