April sync (#360)

* Maps and things no code/icons

* helpers defines globalvars

* Onclick world.dm orphaned_procs

* subsystems

Round vote and shuttle autocall done here too

* datums

* Game folder

* Admin - chatter modules

* clothing - mining

* modular computers - zambies

* client

* mob level 1

* mob stage 2 + simple_animal

* silicons n brains

* mob stage 3 + Alien/Monkey

* human mobs

* icons updated

* some sounds

* emitter y u no commit

* update tgstation.dme

* compile fixes

* travis fixes

Also removes Fast digest mode, because reasons.

* tweaks for travis Mentors are broke again

Also fixes Sizeray guns

* oxygen loss fix for vore code.

* removes unused code

* some code updates

* bulk fixes

* further fixes

* outside things

* whoops.

* Maint bar ported

* GLOBs.
This commit is contained in:
Poojawa
2017-04-13 23:37:00 -05:00
committed by GitHub
parent cdc32c98fa
commit 7e9b96a00f
1322 changed files with 174827 additions and 23888 deletions
@@ -2,96 +2,45 @@
name = "bomb"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x"
var/btype = 0 // 0=radio, 1=prox, 2=time
var/btemp1 = 1500
var/btemp2 = 1000 // tank temperatures
var/assembly_type
/obj/effect/spawner/newbomb/Initialize()
..()
var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/weapon/tank/internals/plasma/full/PT = new(V)
var/obj/item/weapon/tank/internals/oxygen/OT = new(V)
PT.air_contents.temperature = btemp1 + T0C
OT.air_contents.temperature = btemp2 + T0C
V.tank_one = PT
V.tank_two = OT
PT.master = V
OT.master = V
if(assembly_type)
var/obj/item/device/assembly/A = new assembly_type(V)
V.attached_device = A
A.holder = V
A.toggle_secure()
V.update_icon()
qdel(src)
/obj/effect/spawner/newbomb/timer
btype = 2
assembly_type = /obj/item/device/assembly/timer
syndicate
btemp1 = 150
btemp2 = 20
/obj/effect/spawner/newbomb/timer/syndicate
btemp1 = 150
btemp2 = 20
/obj/effect/spawner/newbomb/proximity
btype = 1
assembly_type = /obj/item/device/assembly/prox_sensor
/obj/effect/spawner/newbomb/radio
btype = 0
assembly_type = /obj/item/device/assembly/signaler
/obj/effect/spawner/newbomb/New()
..()
switch (src.btype)
// radio
if (0)
var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/weapon/tank/internals/plasma/PT = new(V)
var/obj/item/weapon/tank/internals/oxygen/OT = new(V)
var/obj/item/device/assembly/signaler/S = new(V)
V.tank_one = PT
V.tank_two = OT
V.attached_device = S
S.holder = V
S.toggle_secure()
PT.master = V
OT.master = V
PT.air_contents.temperature = btemp1 + T0C
OT.air_contents.temperature = btemp2 + T0C
V.update_icon()
// proximity
if (1)
var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/weapon/tank/internals/plasma/PT = new(V)
var/obj/item/weapon/tank/internals/oxygen/OT = new(V)
var/obj/item/device/assembly/prox_sensor/P = new(V)
V.tank_one = PT
V.tank_two = OT
V.attached_device = P
P.holder = V
P.toggle_secure()
PT.master = V
OT.master = V
PT.air_contents.temperature = btemp1 + T0C
OT.air_contents.temperature = btemp2 + T0C
V.update_icon()
// timer
if (2)
var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/weapon/tank/internals/plasma/PT = new(V)
var/obj/item/weapon/tank/internals/oxygen/OT = new(V)
var/obj/item/device/assembly/timer/T = new(V)
V.tank_one = PT
V.tank_two = OT
V.attached_device = T
T.holder = V
T.toggle_secure()
PT.master = V
OT.master = V
T.time = 30
PT.air_contents.temperature = btemp1 + T0C
OT.air_contents.temperature = btemp2 + T0C
V.update_icon()
qdel(src)
@@ -0,0 +1,170 @@
/obj/effect/spawner/bundle
name = "bundle spawner"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
color = "#00FF00"
var/list/items
/obj/effect/spawner/bundle/Initialize(mapload)
..()
if(items && items.len)
var/turf/T = get_turf(src)
for(var/path in items)
new path(T)
qdel(src)
/obj/effect/spawner/bundle/costume/chicken
name = "chicken costume spawner"
items = list(
/obj/item/clothing/suit/chickensuit,
/obj/item/clothing/head/chicken,
/obj/item/weapon/reagent_containers/food/snacks/egg)
/obj/effect/spawner/bundle/costume/gladiator
name = "gladitator costume spawner"
items = list(
/obj/item/clothing/under/gladiator,
/obj/item/clothing/head/helmet/gladiator)
/obj/effect/spawner/bundle/costume/madscientist
name = "mad scientist costume spawner"
items = list(
/obj/item/clothing/under/gimmick/rank/captain/suit,
/obj/item/clothing/head/flatcap,
/obj/item/clothing/suit/toggle/labcoat/mad)
/obj/effect/spawner/bundle/costume/elpresidente
name = "el presidente costume spawner"
items = list(
/obj/item/clothing/under/gimmick/rank/captain/suit,
/obj/item/clothing/head/flatcap,
/obj/item/clothing/mask/cigarette/cigar/havana,
/obj/item/clothing/shoes/jackboots)
/obj/effect/spawner/bundle/costume/nyangirl
name = "nyangirl costume spawner"
items = list(
/obj/item/clothing/under/schoolgirl,
/obj/item/clothing/head/kitty,
/obj/item/clothing/glasses/sunglasses/blindfold)
/obj/effect/spawner/bundle/costume/maid
name = "maid costume spawner"
items = list(
/obj/item/clothing/under/skirt/black,
/obj/effect/spawner/lootdrop/minor/beret_or_rabbitears,
/obj/item/clothing/glasses/sunglasses/blindfold)
/obj/effect/spawner/bundle/costume/butler
name = "butler costume spawner"
items = list(
/obj/item/clothing/tie/waistcoat,
/obj/item/clothing/under/suit_jacket,
/obj/item/clothing/head/that)
/obj/effect/spawner/bundle/costume/highlander
name = "highlander costume spawner"
items = list(
/obj/item/clothing/under/kilt,
/obj/item/clothing/head/beret)
/obj/effect/spawner/bundle/costume/prig
name = "prig costume spawner"
items = list(
/obj/item/clothing/tie/waistcoat,
/obj/item/clothing/glasses/monocle,
/obj/effect/spawner/lootdrop/minor/bowler_or_that,
/obj/item/clothing/shoes/sneakers/black,
/obj/item/weapon/cane,
/obj/item/clothing/under/sl_suit,
/obj/item/clothing/mask/fakemoustache)
/obj/effect/spawner/bundle/costume/plaguedoctor
name = "plague doctor costume spawner"
items = list(
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit,
/obj/item/clothing/head/plaguedoctorhat,
/obj/item/clothing/mask/gas/plaguedoctor)
/obj/effect/spawner/bundle/costume/nightowl
name = "night owl costume spawner"
items = list(
/obj/item/clothing/suit/toggle/owlwings,
/obj/item/clothing/under/owl,
/obj/item/clothing/mask/gas/owl_mask)
/obj/effect/spawner/bundle/costume/griffin
name = "griffin costume spawner"
items = list(
/obj/item/clothing/suit/toggle/owlwings/griffinwings,
/obj/item/clothing/shoes/griffin,
/obj/item/clothing/under/griffin,
/obj/item/clothing/head/griffin)
/obj/effect/spawner/bundle/costume/waiter
name = "waiter costume spawner"
items = list(
/obj/item/clothing/under/waiter,
/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears,
/obj/item/clothing/suit/apron)
/obj/effect/spawner/bundle/costume/pirate
name = "pirate costume spawner"
items = list(
/obj/item/clothing/under/pirate,
/obj/item/clothing/suit/pirate,
/obj/effect/spawner/lootdrop/minor/pirate_or_bandana,
/obj/item/clothing/glasses/eyepatch)
/obj/effect/spawner/bundle/costume/commie
name = "commie costume spawner"
items = list(
/obj/item/clothing/under/soviet,
/obj/item/clothing/head/ushanka)
/obj/effect/spawner/bundle/costume/imperium_monk
name = "imperium monk costume spawner"
items = list(
/obj/item/clothing/suit/imperium_monk,
/obj/effect/spawner/lootdrop/minor/twentyfive_percent_cyborg_mask)
/obj/effect/spawner/bundle/costume/holiday_priest
name = "holiday priest costume spawner"
items = list(
/obj/item/clothing/suit/holidaypriest)
/obj/effect/spawner/bundle/costume/marisawizard
name = "marisa wizard costume spawner"
items = list(
/obj/item/clothing/shoes/sandal/marisa,
/obj/item/clothing/head/wizard/marisa/fake,
/obj/item/clothing/suit/wizrobe/marisa/fake)
/obj/effect/spawner/bundle/costume/cutewitch
name = "cute witch costume spawner"
items = list(
/obj/item/clothing/under/sundress,
/obj/item/clothing/head/witchwig,
/obj/item/weapon/staff/broom)
/obj/effect/spawner/bundle/costume/wizard
name = "wizard costume spawner"
items = list(
/obj/item/clothing/shoes/sandal,
/obj/item/clothing/suit/wizrobe/fake,
/obj/item/clothing/head/wizard/fake,
/obj/item/weapon/staff)
/obj/effect/spawner/bundle/costume/sexyclown
name = "sexy clown costume spawner"
items = list(
/obj/item/clothing/mask/gas/sexyclown,
/obj/item/clothing/under/rank/clown/sexy)
/obj/effect/spawner/bundle/costume/sexymime
name = "sexy mime costume spawner"
items = list(
/obj/item/clothing/mask/gas/sexymime,
/obj/item/clothing/under/sexymime)
@@ -6,7 +6,7 @@
var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn.
var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards.
/obj/effect/gibspawner/New(location, list/viruses, datum/dna/MobDNA)
/obj/effect/gibspawner/Initialize(mapload, list/viruses, datum/dna/MobDNA)
..()
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
@@ -17,16 +17,16 @@
if(sparks)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, location)
s.set_up(2, 1, loc)
s.start()
for(var/i = 1, i<= gibtypes.len, i++)
if(gibamounts[i])
for(var/j = 1, j<= gibamounts[i], j++)
var/gibType = gibtypes[i]
gib = new gibType(location)
if(istype(location,/mob/living/carbon))
var/mob/living/carbon/digester = location
gib = new gibType(loc)
if(istype(loc,/mob/living/carbon))
var/mob/living/carbon/digester = loc
digester.stomach_contents += gib
if(viruses && viruses.len > 0)
@@ -53,7 +53,7 @@
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
gibamounts = list(2,2,1)
/obj/effect/gibspawner/generic/New()
/obj/effect/gibspawner/generic/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
..()
@@ -62,9 +62,9 @@
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core)
gibamounts = list(1,1,1,1,1,1,1)
/obj/effect/gibspawner/human/New()
/obj/effect/gibspawner/human/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 50, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
..()
@@ -72,9 +72,9 @@
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core,/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
/obj/effect/gibspawner/humanbodypartless/New()
/obj/effect/gibspawner/humanbodypartless/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 50, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, list())
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
..()
@@ -82,9 +82,9 @@
gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up,/obj/effect/decal/cleanable/xenoblood/xgibs/down,/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core)
gibamounts = list(1,1,1,1,1,1,1)
/obj/effect/gibspawner/xeno/New()
/obj/effect/gibspawner/xeno/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
..()
@@ -93,25 +93,25 @@
gibamounts = list(1, 1, 1, 1, 1, 1)
/obj/effect/gibspawner/xenobodypartless/New()
/obj/effect/gibspawner/xenobodypartless/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, list())
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
..()
/obj/effect/gibspawner/larva
gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body)
gibamounts = list(1, 1, 1, 1)
/obj/effect/gibspawner/larva/New()
/obj/effect/gibspawner/larva/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), alldirs)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs)
..()
/obj/effect/gibspawner/larvabodypartless
gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva)
gibamounts = list(1, 1, 1)
/obj/effect/gibspawner/larvabodypartless/New()
/obj/effect/gibspawner/larvabodypartless/Initialize()
playsound(src, 'sound/effects/blobattack.ogg', 60, 1)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list())
..()
@@ -121,7 +121,7 @@
gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up,/obj/effect/decal/cleanable/robot_debris/down,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris/limb)
gibamounts = list(1,1,1,1,1,1)
/obj/effect/gibspawner/robot/New()
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
/obj/effect/gibspawner/robot/Initialize()
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs)
gibamounts[6] = pick(0,1,2)
..()
..()
+55 -11
View File
@@ -3,24 +3,27 @@
icon_state = "x2"
color = "#00FF00"
var/lootcount = 1 //how many items will be spawned
var/lootdoubles = 1 //if the same item can be spawned twice
var/lootdoubles = TRUE //if the same item can be spawned twice
var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect)
/obj/effect/spawner/lootdrop/New()
/obj/effect/spawner/lootdrop/Initialize(mapload)
..()
if(loot && loot.len)
for(var/i = lootcount, i > 0, i--)
if(!loot.len) break
var/turf/T = get_turf(src)
while(lootcount && loot.len)
var/lootspawn = pickweight(loot)
if(!lootdoubles)
loot.Remove(lootspawn)
if(lootspawn)
new lootspawn(get_turf(src))
new lootspawn(T)
lootcount--
qdel(src)
/obj/effect/spawner/lootdrop/armory_contraband
name = "armory contraband gun spawner"
lootdoubles = 0
lootdoubles = FALSE
loot = list(
/obj/item/weapon/gun/ballistic/automatic/pistol = 8,
@@ -87,7 +90,7 @@
/obj/item/clothing/gloves/color/fyellow = 1,
/obj/item/clothing/head/hardhat = 1,
/obj/item/clothing/head/hardhat/red = 1,
/obj/item/clothing/head/that{throwforce = 1;} = 1,
/obj/item/clothing/head/that = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/head/welding = 1,
/obj/item/clothing/mask/gas = 15,
@@ -102,8 +105,8 @@
/obj/item/device/radio/off = 2,
/obj/item/device/t_scanner = 5,
/obj/item/weapon/airlock_painter = 1,
/obj/item/stack/cable_coil = 4,
/obj/item/stack/cable_coil{amount = 5} = 6,
/obj/item/stack/cable_coil/random = 4,
/obj/item/stack/cable_coil/random{amount = 5} = 6,
/obj/item/stack/medical/bruise_pack = 1,
/obj/item/stack/rods{amount = 10} = 9,
/obj/item/stack/rods{amount = 23} = 1,
@@ -144,7 +147,7 @@
/obj/item/weapon/wirecutters = 1,
/obj/item/weapon/wrench = 4,
/obj/item/weapon/relic = 3,
/obj/item/weaponcrafting/reciever = 2,
/obj/item/weaponcrafting/receiver = 2,
/obj/item/clothing/head/cone = 2,
/obj/item/weapon/grenade/smokebomb = 2,
/obj/item/device/geiger_counter = 3,
@@ -165,7 +168,7 @@
/obj/effect/spawner/lootdrop/crate_spawner
name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF!
lootdoubles = 0
lootdoubles = FALSE
loot = list(
/obj/structure/closet/crate/secure/loot = 20,
@@ -194,3 +197,44 @@
loot = list(
/obj/effect/decal/remains/xeno = 49,
/obj/effect/spawner/xeno_egg_delivery = 1)
/obj/effect/spawner/lootdrop/costume
name = "random costume spawner"
/obj/effect/spawner/lootdrop/costume/Initialize()
loot = list()
for(var/path in subtypesof(/obj/effect/spawner/bundle/costume))
loot[path] = TRUE
..()
// Minor lootdrops follow
/obj/effect/spawner/lootdrop/minor/beret_or_rabbitears
name = "beret or rabbit ears spawner"
loot = list(
/obj/item/clothing/head/beret = 1,
/obj/item/clothing/head/rabbitears = 1)
/obj/effect/spawner/lootdrop/minor/bowler_or_that
name = "bowler or top hat spawner"
loot = list(
/obj/item/clothing/head/bowler = 1,
/obj/item/clothing/head/that = 1)
/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears
name = "kitty ears or rabbit ears spawner"
loot = list(
/obj/item/clothing/head/kitty = 1,
/obj/item/clothing/head/rabbitears = 1)
/obj/effect/spawner/lootdrop/minor/pirate_or_bandana
name = "pirate hat or bandana spawner"
loot = list(
/obj/item/clothing/head/pirate = 1,
/obj/item/clothing/head/bandana = 1)
/obj/effect/spawner/lootdrop/minor/twentyfive_percent_cyborg_mask
name = "25% cyborg mask spawner"
loot = list(
/obj/item/clothing/mask/gas/cyborg = 25,
"" = 75)
@@ -11,9 +11,8 @@ again.
/obj/effect/spawner/structure/Initialize()
..()
if(spawn_list && spawn_list.len)
for(var/i = 1, i <= spawn_list.len, i++)
var/to_spawn = spawn_list[i]
new to_spawn(get_turf(src))
for(var/I in spawn_list)
new I(get_turf(src))
qdel(src)
/obj/effect/spawner/structure/window
@@ -31,4 +30,4 @@ again.
spawn_list = list(
/obj/structure/grille,
/obj/structure/window/reinforced/fulltile
)
)
@@ -16,5 +16,5 @@
message_admins("An alien egg has been delivered to [A] at [ADMIN_COORDJMP(T)].")
log_game("An alien egg has been delivered to [A] at [COORD(T)]")
var/message = "Attention [station_name()], we have entrusted you with a research specimen in [A]. Remember to follow all safety precautions when dealing with the specimen."
addtimer(CALLBACK(GLOBAL_PROC, /.proc/print_command_report, message), announcement_time)
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, /proc/addtimer, CALLBACK(GLOBAL_PROC, /.proc/print_command_report, message), announcement_time))
qdel(src)