Merge branch 'master' into adminin

This commit is contained in:
Crazy Lemon
2017-03-03 21:45:41 -08:00
committed by Crazylemon64
244 changed files with 11181 additions and 6402 deletions
+7 -5
View File
@@ -8,7 +8,7 @@
var/new_ckey = ckey(input(usr,"Who would you like to add a note for?","Enter a ckey",null) as text|null)
if(!new_ckey)
return
new_ckey = sanitizeSQL(new_ckey)
new_ckey = ckey(new_ckey)
var/DBQuery/query_find_ckey = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'")
if(!query_find_ckey.Execute())
var/err = query_find_ckey.ErrorMsg()
@@ -19,7 +19,7 @@
return
else
target_ckey = new_ckey
var/target_sql_ckey = sanitizeSQL(target_ckey)
var/target_sql_ckey = ckey(target_ckey)
if(!notetext)
notetext = input(usr,"Write your note","Add Note") as message|null
if(!notetext)
@@ -31,6 +31,8 @@
adminckey = usr.ckey
if(!adminckey)
return
else if(usr && (usr.ckey == ckey(adminckey))) // Don't ckeyize special note sources
adminckey = ckey(adminckey)
var/admin_sql_ckey = sanitizeSQL(adminckey)
if(!server)
if(config && config.server_name)
@@ -86,7 +88,7 @@
return
note_id = text2num(note_id)
var/target_ckey
var/sql_ckey = sanitizeSQL(usr.ckey)
var/sql_ckey = usr.ckey
var/DBQuery/query_find_note_edit = dbcon.NewQuery("SELECT ckey, notetext, adminckey FROM [format_table_name("notes")] WHERE id = [note_id]")
if(!query_find_note_edit.Execute())
var/err = query_find_note_edit.ErrorMsg()
@@ -128,7 +130,7 @@
if(!linkless)
output = navbar
if(target_ckey)
var/target_sql_ckey = sanitizeSQL(target_ckey)
var/target_sql_ckey = ckey(target_ckey)
var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT id, timestamp, notetext, adminckey, last_editor, server FROM [format_table_name("notes")] WHERE ckey = '[target_sql_ckey]' ORDER BY timestamp")
if(!query_get_notes.Execute())
var/err = query_get_notes.ErrorMsg()
@@ -179,7 +181,7 @@
usr << browse(output, "window=show_notes;size=900x500")
/proc/show_player_info_irc(var/key as text)
var/target_sql_ckey = sanitizeSQL(key)
var/target_sql_ckey = ckey(key)
var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT timestamp, notetext, adminckey, server FROM [format_table_name("notes")] WHERE ckey = '[target_sql_ckey]' ORDER BY timestamp")
if(!query_get_notes.Execute())
var/err = query_get_notes.ErrorMsg()
+24 -3
View File
@@ -1741,33 +1741,42 @@
btypes += "Heal Over Time"
btypes += "Permanent Regeneration"
btypes += "Super Powers"
var/blessing = input(src.owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
var/blessing = input(owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
if(!(blessing in btypes))
return
var/logmsg = null
switch(blessing)
if("To Arrivals")
M.forceMove(pick(latejoin))
to_chat(M, "<span class='userdanger'>You are abruptly pulled through space!</span>")
logmsg = "a teleport to arrivals."
if("Moderate Heal")
M.adjustBruteLoss(-25)
M.adjustFireLoss(-25)
M.adjustToxLoss(-25)
M.adjustOxyLoss(-25)
to_chat(M,"<span class='userdanger'>You feel invigorated!</span>")
logmsg = "a moderate heal."
if("Heal Over Time")
H.reagents.add_reagent("salglu_solution", 30)
H.reagents.add_reagent("salbutamol", 20)
H.reagents.add_reagent("spaceacillin", 20)
logmsg = "a heal over time."
if("Permanent Regeneration")
H.dna.SetSEState(REGENERATEBLOCK, 1)
genemutcheck(H, REGENERATEBLOCK, null, MUTCHK_FORCED)
H.update_mutations()
logmsg = "permanent regeneration."
if("Super Powers")
var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
for(var/gene in default_genes)
H.dna.SetSEState(gene, 1)
genemutcheck(H, gene, null, MUTCHK_FORCED)
H.update_mutations()
logmsg = "superpowers."
if(logmsg)
log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]")
message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]")
else if(href_list["Smite"])
if(!check_rights(R_ADMIN))
return
@@ -1784,9 +1793,10 @@
ptypes += "Cluwne"
ptypes += "Mutagen Cookie"
ptypes += "Hellwater Cookie"
var/punishment = input(src.owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
if(!(punishment in ptypes))
return
var/logmsg = null
switch(punishment)
if("Lightning bolt")
M.electrocute_act(5, "Lightning Bolt", safety=1)
@@ -1794,20 +1804,25 @@
M.adjustFireLoss(75)
M.Weaken(5)
to_chat(M, "<span class='userdanger'>The gods have punished you for your sins!</span>")
logmsg = "a lightning bolt."
if("Brain Damage")
H.adjustBrainLoss(75)
logmsg = "75 brain damage."
if("Fire Death")
to_chat(M,"<span class='userdanger'>You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting?</span>")
var/turf/simulated/T = get_turf(M)
new /obj/effect/hotspot(T)
M.adjustFireLoss(150)
logmsg = "a firey death."
if("Honk Tumor")
if(!H.get_int_organ(/obj/item/organ/internal/honktumor))
var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor
to_chat(H, "<span class='userdanger'>Life seems funnier, somehow.</span>")
organ.insert(H)
logmsg = "a honk tumor."
if("Cluwne")
H.makeCluwne()
logmsg = "cluwned."
if("Mutagen Cookie")
var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
evilcookie.reagents.add_reagent("mutagen", 10)
@@ -1815,6 +1830,7 @@
evilcookie.bitesize = 100
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a mutagen cookie."
if("Hellwater Cookie")
var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
evilcookie.reagents.add_reagent("hell_water", 25)
@@ -1822,8 +1838,13 @@
evilcookie.bitesize = 100
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
if("Gib")
logmsg = "gibbed."
M.gib(FALSE)
if(logmsg)
log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a smiting: [logmsg]")
message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a smiting: [logmsg]")
else if(href_list["FaxReplyTemplate"])
if(!check_rights(R_ADMIN))
return
@@ -3132,7 +3153,7 @@
error_viewer.showTo(usr, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"])
else
error_viewer.showTo(usr, null, href_list["viewruntime_linear"])
else if(href_list["add_station_goal"])
if(!check_rights(R_EVENT))
return
+32 -723
View File
@@ -574,67 +574,35 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
alert("Invalid mob")
return
//log_admin("[key_name(src)] has alienized [M.key].")
var/list/dresspacks = list(
var/list/choices = list(
"strip",
"as job...",
"Engineer RIG",
"CE RIG",
"Mining RIG",
"Syndi RIG",
"Wizard RIG",
"Medical RIG",
"Atmos RIG",
"standard space gear",
"tournament standard red",
"tournament standard green",
"tournament gangster",
"tournament chef",
"tournament janitor",
"pirate",
"space pirate",
"soviet tourist",
"soviet soldier",
"soviet admiral",
"tunnel clown",
"mime assassin",
"survivor",
"greytide",
"greytide leader",
"greytide xeno",
"masked killer",
"singuloth knight",
"dark lord",
"assassin",
"spy",
"vox",
"death commando",
"syndicate agent",
"syndicate operative",
"syndicate bomber",
"syndicate strike team",
"syndicate officer",
"chrono legionnaire",
"blue wizard",
"red wizard",
"marisa wizard",
"emergency response team member",
"emergency response team leader",
"nt vip guest",
"nt navy officer", // now in jobs list
"nt navy captain",
"nt special ops officer", // now in jobs list
"nt special ops formal",
)
"emergency response team member",
"emergency response team leader"
)
var/admin_outfits = subtypesof(/datum/outfit/admin)
for(var/type in admin_outfits)
var/datum/outfit/O = type
var/name = initial(O.name)
if(name != "Naked")
choices[initial(O.name)] = type
var/dostrip = 0
switch(alert("Strip [M] before dressing?", "Strip?", "Yes", "No", "Cancel"))
if("Yes")
dostrip = 1
if("Cancel")
return
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in choices
if(isnull(dresscode))
return
var/datum/outfit/O
if(!(dresscode in list("strip", "as job...", "emergency response team member", "emergency response team leader")))
O = choices[dresscode]
var/datum/job/jobdatum
if(dresscode == "as job...")
var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs()
@@ -648,6 +616,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(istype(I, /obj/item/organ))
continue
qdel(I)
switch(dresscode)
if("strip")
//do nothing
@@ -657,495 +627,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(jobdatum)
dresscode = "[jobdatum.title]"
jobdatum.equip(M)
equip_special_id(M,jobdatum.get_access(),jobdatum.title, jobdatum.idtype)
if("standard space gear")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
M.equip_to_slot_or_del(J, slot_back)
J.turn_on()
M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
J.Topic(null, list("stat" = 1))
equip_special_id(M,get_all_accesses(), "Space Explorer", /obj/item/weapon/card/id)
if("Engineer RIG", "CE RIG", "Mining RIG", "Syndi RIG", "Wizard RIG", "Medical RIG", "Atmos RIG")
if(dresscode=="Engineer RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig(M), slot_head)
else if(dresscode=="CE RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/elite(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/elite(M), slot_head)
else if(dresscode=="Mining RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/mining(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/mining(M), slot_head)
else if(dresscode=="Syndi RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head)
else if(dresscode=="Wizard RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/wizard(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/wizard(M), slot_head)
else if(dresscode=="Medical RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/medical(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/medical(M), slot_head)
else if(dresscode=="Atmos RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/atmos(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/atmos(M), slot_head)
var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
M.equip_to_slot_or_del(J, slot_back)
J.turn_on()
M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
equip_special_id(M,get_all_accesses(), "RIG Tester", /obj/item/weapon/card/id)
J.Topic(null, list("stat" = 1))
if("tournament standard red", "tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0
if(dresscode=="tournament standard red")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
else
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
if("tournament gangster") //gangster are supposed to fight each other. --rastaf0
M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
if("tournament chef") //Steven Seagal FTW
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store)
if("tournament janitor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
var/obj/item/weapon/storage/backpack/backpack = new(M)
for(var/obj/item/I in backpack)
qdel(I)
M.equip_to_slot_or_del(backpack, slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand)
var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M)
bucket.reagents.add_reagent("water", 70)
M.equip_to_slot_or_del(bucket, slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
if("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
equip_special_id(M,list(access_maint_tunnels), "Pirate", /obj/item/weapon/card/id)
if("space pirate") // not spaceworthy, just has fancier coat.
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
equip_special_id(M,list(access_maint_tunnels), "Space Pirate", /obj/item/weapon/card/id)
if("tunnel clown")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(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/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/chaplain_hoodie(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
equip_special_id(M,list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown", /obj/item/weapon/card/id)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
if("mime assassin")
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/mime(M), slot_back)
if(M.gender == FEMALE)
M.equip_or_collect(new /obj/item/clothing/under/sexymime(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(M), slot_wear_mask)
else
M.equip_or_collect(new /obj/item/clothing/under/mime(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/mask/gas/mime(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/syndie_kit/caneshotgun, slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/toy/crayon/mime, slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
var/obj/item/device/pda/mime/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Mime"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_to_slot_or_del(pda, slot_wear_pda)
equip_special_id(M,list(access_mime, access_theatre, access_maint_tunnels), "Mime", /obj/item/weapon/card/id/syndicate)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
if("survivor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
equip_special_id(M,list(access_maint_tunnels), "Survivor", /obj/item/weapon/card/id)
for(var/obj/item/carried_item in M.contents)
if(!istype(carried_item, /obj/item/weapon/implant))
carried_item.add_blood(M)
if("greytide")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(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/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
equip_special_id(M,list(access_maint_tunnels), "Greytide", /obj/item/weapon/card/id)
if("greytide leader")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(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/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
equip_special_id(M,list(access_maint_tunnels), "Greytide Leader", /obj/item/weapon/card/id)
if("greytide xeno")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/xenos(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/xenos(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/toy/toy_xeno(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
equip_special_id(M,list(access_maint_tunnels), "Legit Xenomorph", /obj/item/weapon/card/id)
if("masked killer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(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/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
equip_special_id(M,list(access_maint_tunnels), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
for(var/obj/item/carried_item in M.contents)
if(!istype(carried_item, /obj/item/weapon/implant))
carried_item.add_blood(M)//Oh yes, there will be blood...
if("dark lord")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand)
var/obj/item/clothing/suit/hooded/chaplain_hoodie/robe = new /obj/item/clothing/suit/hooded/chaplain_hoodie(M)
robe.name = "dark lord robes"
robe.hood.name = "dark lord hood"
M.equip_to_slot_or_del(robe, slot_wear_suit)
equip_special_id(M,get_all_accesses(), "Dark Lord", /obj/item/weapon/card/id/syndicate, "syndie")
if("assassin")
M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
for(var/obj/item/briefcase_item in sec_briefcase)
qdel(briefcase_item)
for(var/i=3, i>0, i--)
sec_briefcase.handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1)
sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, 1)
sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba, 1)
sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357, 1)
sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/c4, 1)
// briefcase must be unlocked by setting the code.
M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
DUST.implant(M)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Reaper"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_to_slot_or_del(pda, slot_wear_pda)
equip_special_id(M,get_all_accesses(), "Reaper", /obj/item/weapon/card/id/syndicate, "syndie")
if("spy")
M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(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/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/chameleon(M), slot_glasses)
var/obj/item/clothing/gloves/combat/G = new /obj/item/clothing/gloves/combat(src)
G.name = "black gloves"
M.equip_to_slot_or_del(G, slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store)
var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
DUST.implant(M)
M.equip_to_slot_or_del(new /obj/item/weapon/implanter/storage(M), slot_in_backpack)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Spy"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
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)
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)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate, slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox, slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic, slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/vox, slot_r_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle, slot_glasses)
M.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs/cable/zipties, slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flash, slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/noisecannon, slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Vox Armalis", /obj/item/weapon/card/id/syndicate/vox, "syndie")
else
M.equip_vox_raider()
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_l_hand)
M.regenerate_icons()
if("death commando")
M.equip_death_commando()
if("syndicate agent")
M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Agent", /obj/item/weapon/card/id/syndicate, "syndie")
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
U.hidden_uplink.uplink_owner="[M.key]"
U.hidden_uplink.uses = 20
M.equip_to_slot_or_del(U, slot_r_store)
if("syndicate bomber")
M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/syndicatedetonator(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Bomber", /obj/item/weapon/card/id/syndicate, "syndie")
if("syndicate operative")
M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
R.set_frequency(SYND_FREQ)
M.equip_to_slot_or_del(R, slot_l_ear)
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
U.hidden_uplink.uplink_owner="[M.key]"
U.hidden_uplink.uses = 20
M.equip_to_slot_or_del(U, slot_r_store)
M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Operative", /obj/item/weapon/card/id/syndicate, "syndie")
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(M)
E.implant(M)
if("syndicate strike team")
M.equip_syndicate_commando()
if("syndicate officer")
M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(M), slot_head)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
R.set_frequency(SYND_FREQ)
M.equip_to_slot_or_del(R, slot_l_ear)
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
U.hidden_uplink.uplink_owner="[M.key]"
U.hidden_uplink.uses = 50
M.equip_to_slot_or_del(U, slot_r_store)
M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
equip_special_id(M,get_all_accesses() + get_syndicate_access("Syndicate Commando"), "Syndicate Officer", /obj/item/weapon/card/id/syndicate, "commander")
var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
DUST.implant(M)
if("nt vip guest")
M.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head)
M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda)
equip_special_id(M,get_centcom_access("VIP Guest"), "VIP Guest", /obj/item/weapon/card/id/centcom)
if("nt navy officer")
M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda)
M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
L.imp_in = M
L.implanted = 1
M.sec_hud_set_implants()
equip_special_id(M,get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer", /obj/item/weapon/card/id/centcom)
if("nt navy captain")
M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda)
M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
L.imp_in = M
L.implanted = 1
M.sec_hud_set_implants()
equip_special_id(M,get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain", /obj/item/weapon/card/id/centcom)
if("emergency response team member", "emergency response team leader")
var/datum/response_team/equip_team = null
@@ -1173,170 +654,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
else
to_chat(src, "Invalid ERT Loadout selected")
if("nt special ops officer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) // job has /obj/item/clothing/head/beret/centcom/officer/navy
M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_wear_pda)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
// The following items are unique to this outfit - the special ops officer job does not spawn with them.
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/implanter/loyalty(M), slot_in_backpack)
if("nt special ops formal")
M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // special
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack)
var/obj/item/device/pda/centcom/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Special Operations Officer"
pda.icon_state = "pda-syndi"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work."
M.equip_or_collect(pda, slot_wear_pda)
M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
if("singuloth knight")
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/singuloth(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/cyber(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/singuloth(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/claymore/ceremonial(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/knighthammer(M), slot_back)
equip_special_id(M,get_all_accesses(), "Singuloth Knight", /obj/item/weapon/card/id)
if("blue wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("red wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("marisa wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("soviet tourist")
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
equip_special_id(M,list(access_maint_tunnels), "Soviet Tourist", /obj/item/weapon/card/id)
if("soviet soldier")
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
equip_special_id(M,list(access_maint_tunnels), "Soviet Soldier", /obj/item/weapon/card/id)
if("soviet admiral")
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Soviet Admiral", /obj/item/weapon/card/id, "commander")
//W.icon_state = "commander"
if("chrono legionnaire")
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/chronos(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/chronos(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/chrono_eraser(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Chrono Legionnaire", /obj/item/weapon/card/id/syndicate, "syndie")
else // outfit datum
if(O)
M.equipOutfit(O, FALSE)
M.regenerate_icons()
@@ -1344,18 +665,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1)
return
/client/proc/equip_special_id(var/mob/living/carbon/human/H, var/list/theaccess = null, var/jobtext, var/obj/item/weapon/card/id/id_type = /obj/item/weapon/card/id, var/special_icon = null)
if(!check_rights(R_EVENT))
return
var/obj/item/weapon/card/id/W = new id_type(H)
if(special_icon)
W.icon_state = special_icon
W.name = "[H.real_name]'s ID Card ([jobtext])"
W.access = theaccess
W.assignment = "[jobtext]"
W.registered_name = H.real_name
H.equip_to_slot_or_del(W, slot_wear_id)
/client/proc/startSinglo()
set category = "Debug"
@@ -1474,15 +783,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 +814,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
+1 -1
View File
@@ -49,7 +49,7 @@
W.assignment = "Highlander"
W.registered_name = H.real_name
H.equip_to_slot_or_del(W, slot_wear_id)
H.species.equip(H)
H.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
+1 -1
View File
@@ -55,7 +55,7 @@
H.equip_to_slot_or_del(W, slot_wear_id)
team_toggle = !team_toggle
H.species.equip(H)
H.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used DODGEBAWWWWWWWL! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
+6 -2
View File
@@ -88,7 +88,7 @@
missing_ages = 1
continue
if(C.player_age < age)
if(check_rights(R_ADMIN))
if(check_rights(R_ADMIN, 0))
msg += "[key_name_admin(C.mob)]: [C.player_age] days old<br>"
else
msg += "[key_name_mentor(C.mob)]: [C.player_age] days old<br>"
@@ -899,7 +899,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(usr, "\red ERT has been <b>Disabled</b>.")
log_admin("Admin [key_name(src)] has disabled ERT calling.")
message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1)
/client/proc/modify_goals()
set category = "Event"
set name = "Modify Station Goals"
@@ -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>"
@@ -0,0 +1,257 @@
/area/awaymission/UO71
name = "UO71"
icon_state = "away"
report_alerts = 0
tele_proof = 1
/area/awaymission/UO71/plaza
name = "UO71 Plaza"
icon_state = "awaycontent1"
fire = 1
/area/awaymission/UO71/centralhall
name = "UO71 Central"
icon_state = "awaycontent2"
fire = 1
/area/awaymission/UO71/eng
name = "UO71 Engineering"
icon_state = "awaycontent3"
fire = 1
/area/awaymission/UO71/mining
name = "UO71 Mining"
icon_state = "awaycontent4"
fire = 1
/area/awaymission/UO71/science
name = "UO71 Science"
icon_state = "awaycontent5"
fire = 1
/area/awaymission/UO71/medical
name = "UO71 Medical"
icon_state = "awaycontent6"
fire = 1
/area/awaymission/UO71/gateway
name = "UO71 Gateway"
icon_state = "awaycontent7"
fire = 1
/area/awaymission/UO71/outside
name = "UO71 Outside"
icon_state = "awaycontent8"
/area/awaymission/UO71/bridge
name = "UO71 Bridge"
icon_state = "awaycontent21"
fire = 1
requires_power = 0
tele_proof = 1
/area/awaymission/UO71/queen
name = "UO71 Queen Lair"
icon_state = "awaycontent9"
fire = 1
requires_power = 0
tele_proof = 1
/area/awaymission/UO71/prince
name = "UO71 Prince Containment"
icon_state = "awaycontent10"
fire = 1
requires_power = 0
tele_proof = 1
/area/awaymission/UO71/mother
name = "UO71 Mother Containment"
icon_state = "awaycontent10"
fire = 1
requires_power = 0
tele_proof = 1
/area/awaymission/UO71/loot
name = "UO71 Loot Vault"
icon_state = "awaycontent11"
requires_power = 0
tele_proof = 1
/obj/item/weapon/paper/terrorspiders1
name = "paper - 'Sealed Facility'"
info = {"<b>SEALED FACILITY</b><br>
<br>
This facility is sealed shut by order of Commander Marquez. Do not enter.<br>
Terror spiders live here. We believe they are a weapon developed by the syndicate.<br>
Any surviving personnel are to evacuate immediately via the gateway.<br>
"}
/obj/item/weapon/paper/terrorspiders2
name = "paper - 'The Trio of Terror'"
info = {"<b>Status Report on the 'Terrors'</b><br>
<br>
All the spiders are deadly. We know this much already. Within an hour of their appearance, they have killed several staff.<br>
Three, however, bear particular mention, as they appear to be leading the spider hivemind.<br>
<br>
The Mother is held in containment 1. Advise leaving her alone.<br>
It is likely that the hundreds of tiny spiders swarming over her back would come to her defense if she was threatened.<br>
<br>
The Prince is held in containment 2. He appears very aggressive, incredibly fast, strong, and durable. Extreme force and agility would be required to neutralize him.<br>
It is likely the appearance of the prince was related to our initial aggression against the Queen. These things can THINK.<br>
<br>
The Queen cannot be contained. She lives in the old bar, south of mining. She continues to breed dangerous spiders at an alarming rate.<br>
Many of her offspring are already roaming the compound, traveling through the vents. Contact with the team sent to subdue her has been lost.<br>
<br>
<br>
Based on the situation, Commander, I advise immediate evacuation through the gateway.<br>
-Research Director Simons<br>
"}
/obj/item/weapon/paper/terrorspiders3
name = "paper - 'Final Report'"
info = {"FROM: Field Agent 0738<br>
TO: Syndicate #873589<br>
SUBJECT: Mission Success<br>
<br>
I have seeded the Terror Queen egg in a dingy looking bar that bored engineers constructed near the mining tunnels.<br>
No doubt she will grow soon.<br>
<br>
I have also placed the Mother and Prince eggs nearby, injected with sedative. Hopefully the dimwitted NT scientists bring them back for study.<br>
With any luck, the Queen will sense them telepathically, think NT is holding her children hostage, and attack.<br>
<br>
I am going to extract out of the gateway before this all goes down.<br>
I don't imagine the staff have very long to live once the Queen declares war on this place.<br>
"}
/obj/item/weapon/paper/terrorspiders4
name = "paper - 'Prescription for Jones, David'"
info = {"PRESCRIPTION FOR: David Jones<br>
RANK: Miner<br>
FOR: Haloperidol<br>
REASON FOR TREATMENT: Hallucinations, Paranoia<br>
CAUSE: Hallucinations caused by encounter with toxic spit of spider in the caves. Paranoia caused by disappearing staff and suspicions of syndicate infiltration.<br>
TREATMENT PLAN: Take as needed. See Dr. Phloxi in one week if symptoms persist. <br>
"}
/obj/item/weapon/paper/terrorspiders5
name = "paper - 'A Study in Terror'"
info = {"<b>Findings Overview</b><br>
<br>
<p>Gray Spiders<br>Stealthy predators that ambush prey from vents. Otherwise weak.</p>
<p>Red Spiders<br>Can kill anyone in melee, but slow.</p>
<p>Green<br>Will lay eggs on dead bodies, breeding more spiders.</p>
<p>Black<br>Even a single bite is enough to kill a humanoid, given time.</p>
<p>White<br>Injects a parasitic agent. Deemed to pose too great an infection risk to study.</p>
<p>Purple<br>Only seen guarding the nest of the Queen to the south. Appear to be territorial, and very dangerous.</p>
<p>Prince<br>Held in containment 2. Appears to be a sort of super-warrior. Fast, strong, and thickly armored.</p>
<p>Mother<br>Carries hordes of spiderlings on its back. Held in containment 1. </p>
<p>Queen<br>Unable to contain. Present south of Cargo before contact was lost. Presumed ruler of the local hive.</p>
"}
/obj/item/weapon/paper/terrorspiders6
name = "paper - 'A Study in Venom'"
info = {"<b>Initial Report - Black Widow Venom</b><br>
<br>
Even a single bite kills within a few minutes. Immediate charcoal is necessary for the victim to survive.<br>
The fascinating thing is that multiple bites actually cause rapid symptom onset. The victim quickly loses the ability to walk.<br>
One test monkey went from perfect health to death in under 60 seconds - from 3 bites.<br>
I am so very glad I'm not responsible for keeping these things contained."}
/obj/item/weapon/paper/terrorspiders7
name = "paper - 'Security Orders'"
info = {"<b>Directives for Officer James</b><br>
<br>
1. Find a way to lift the bridge lockdown.<br>
2. Kill any spiders you encounter.<br>
3. Once on the bridge, open a path to the Queen in the south, and find a way to kill her, ending the infestation. <br>
Good luck, Officer.<br>
"}
/obj/item/weapon/paper/terrorspiders8
name = "paper - 'Last Words'"
info = {"<b>The Last Words of Nurse Barnes</b><br>
<br>
It is too much. First Phil, then those damn spiders bite Mary too. Heaven help us. <br>
I'll be evacuating as soon as I've grabbed my supplies. I had to pay for those myself. Stupid budget cuts. <br>
The new world they've found for us isn't that hospitable, but at least there are no deadly spid---<br>
(the writing trails off, as if the writer was interrupted)<br>
"}
/obj/item/weapon/gun/energy/laser/awaymission_aeg
name = "Wireless Energy Gun"
desc = "An energy gun that recharges wirelessly during away missions. Does not work on the main station."
force = 10
origin_tech = null
selfcharge = 1
can_charge = 0
var/inawaymission = 1
/obj/item/weapon/gun/energy/laser/awaymission_aeg/process()
var/turf/my_loc = get_turf(src)
if(is_away_level(my_loc.z))
if(inawaymission)
return ..()
if(ismob(loc))
to_chat(loc, "<span class='notice'>Your [src] activates, starting to draw power from a nearby wireless power source.</span>")
inawaymission = 1
else
if(inawaymission)
if(ismob(loc))
to_chat(loc, "<span class='danger'>Your [src] deactivates, as it is out of range from its power source.</span>")
power_supply.charge = 0
inawaymission = 0
update_icon()
/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin
name = "beaker 'Black Terror Venom'"
/obj/item/weapon/reagent_containers/glass/beaker/terror_black_toxin/New()
..()
reagents.add_reagent("terror_black_toxin", 50)
update_icon()
/obj/machinery/computer/id_upgrader
name = "ID Upgrade Machine"
icon_state = "guest"
icon_screen = "pass"
var/list/access_to_give = list(access_away01)
var/beenused = 0
var/door_to_open = "UO71_Start"
/obj/machinery/computer/id_upgrader/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/D = I
if(!access_to_give.len)
to_chat(user, "<span class='notice'>This machine appears to be configured incorrectly.</span>")
return
var/did_upgrade = 0
var/list/id_access = D.GetAccess()
for(var/this_access in access_to_give)
if(!(this_access in id_access))
// don't have it - add it
D.access |= this_access
did_upgrade = 1
if(did_upgrade)
to_chat(user, "<span class='notice'>An access type was added to your ID card.</span>")
if(beenused)
return
spawn(1)
beenused = 1
var/unlocked_something = 0
for(var/obj/machinery/door/poddoor/P in airlocks)
if(P.density && P.id_tag == door_to_open && P.z == z)
P.open()
unlocked_something = 1
if(unlocked_something)
to_chat(user, "<span class='danger'>Activating the machine has unlocked a way forward!</span>")
else
to_chat(user, "<span class='notice'>Your ID card already has all the access this machine can give.</span>")
. = 1
+28
View File
@@ -111,6 +111,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Barber?", "Confirmation", "No", "Yes") != "Yes")
return
DB_job_unlock("Barber",5)
return
if("2")
@@ -118,6 +120,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Brig Physician?", "Confirmation", "No", "Yes") != "Yes")
return
DB_job_unlock("Brig Physician",5)
return
if("3")
@@ -125,6 +129,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Nanotrasen Representative?", "Confirmation", "No", "Yes") != "Yes")
return
DB_job_unlock("Nanotrasen Representative",30)
return
if("5")
@@ -132,6 +138,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Blueshield?", "Confirmation", "No", "Yes") != "Yes")
return
DB_job_unlock("Blueshield",30)
return
if("6")
@@ -139,6 +147,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Mechanic?", "Confirmation", "No", "Yes") != "Yes")
return
DB_job_unlock("Mechanic",30)
return
if("7")
@@ -146,6 +156,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Magistrate?", "Confirmation", "No", "Yes") != "Yes")
return
DB_job_unlock("Magistrate",45)
return
if("9")
@@ -153,6 +165,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Security Pod Pilot?", "Confirmation", "No", "Yes") != "Yes")
return
DB_job_unlock("Security Pod Pilot",30)
return
if(href_list["KarmaBuy2"])
@@ -163,6 +177,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Machine People?", "Confirmation", "No", "Yes") != "Yes")
return
DB_species_unlock("Machine",15)
return
if("2")
@@ -170,6 +186,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Kidan?", "Confirmation", "No", "Yes") != "Yes")
return
DB_species_unlock("Kidan",30)
return
if("3")
@@ -177,6 +195,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Grey?", "Confirmation", "No", "Yes") != "Yes")
return
DB_species_unlock("Grey",30)
return
if("4")
@@ -184,6 +204,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Vox?", "Confirmation", "No", "Yes") != "Yes")
return
DB_species_unlock("Vox",45)
return
if("5")
@@ -191,6 +213,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Slime People?", "Confirmation", "No", "Yes") != "Yes")
return
DB_species_unlock("Slime People",45)
return
if("6")
@@ -198,6 +222,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Plasmaman?", "Confirmation", "No", "Yes") != "Yes")
return
DB_species_unlock("Plasmaman",100)
return
if("7")
@@ -205,6 +231,8 @@
to_chat(usr, "You do not have enough karma!")
return
else
if(alert("Are you sure you want to unlock Drask?", "Confirmation", "No", "Yes") != "Yes")
return
DB_species_unlock("Drask",30)
return
if(href_list["KarmaRefund"])
@@ -108,7 +108,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/underwear = "Nude" //underwear type
var/undershirt = "Nude" //undershirt type
var/socks = "Nude" //socks type
var/backbag = 2 //backpack type
var/backbag = GBACKPACK //backpack type
var/ha_style = "None" //Head accessory style
var/r_headacc = 0 //Head accessory colour
var/g_headacc = 0 //Head accessory colour
@@ -414,7 +414,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<b>Underwear:</b> <a href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a><BR>"
dat += "<b>Undershirt:</b> <a href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a><BR>"
dat += "<b>Socks:</b> <a href ='?_src_=prefs;preference=socks;task=input'>[socks]</a><BR>"
dat += "<b>Backpack Type:</b> <a href ='?_src_=prefs;preference=bag;task=input'>[backbaglist[backbag]]</a><br>"
dat += "<b>Backpack Type:</b> <a href ='?_src_=prefs;preference=bag;task=input'>[backbag]</a><br>"
dat += "</td></tr></table>"
@@ -1240,7 +1240,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
g_skin = rand(0,255)
b_skin = rand(0,255)
if("bag")
backbag = rand(1,4)
backbag = pick(backbaglist)
/*if("skin_style")
h_style = random_skin_style(gender)*/
if("all")
@@ -1718,9 +1718,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
ooccolor = new_ooccolor
if("bag")
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
if(new_backbag)
backbag = backbaglist.Find(new_backbag)
backbag = new_backbag
if("nt_relation")
var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
@@ -2150,8 +2150,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
@@ -224,7 +224,7 @@
b_eyes = text2num(query.item[35])
underwear = query.item[36]
undershirt = query.item[37]
backbag = text2num(query.item[38])
backbag = query.item[38]
b_type = query.item[39]
@@ -312,7 +312,7 @@
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
underwear = sanitize_text(underwear, initial(underwear))
undershirt = sanitize_text(undershirt, initial(undershirt))
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
backbag = sanitize_text(backbag, initial(backbag))
b_type = sanitize_text(b_type, initial(b_type))
alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option))
+2 -1
View File
@@ -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
@@ -566,7 +567,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'
+13 -11
View File
@@ -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"
+24 -4
View File
@@ -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',
@@ -170,14 +170,14 @@
/obj/item/clothing/head/helmet/space/eva/mime
name = "mime eva helmet"
// icon = 'spaceciv.dmi'
desc = "An eva helmet specifically designed for the mime."
desc = ". . ."
icon_state = "spacemimehelmet"
item_state = "spacemimehelmet"
/obj/item/clothing/suit/space/eva/mime
name = "mime eva suit"
// icon = 'spaceciv.dmi'
desc = "An EVA suit specifically designed for the mime."
desc = ". . ."
icon_state = "spacemime_suit"
item_state = "spacemime_items"
+42 -8
View File
@@ -10,19 +10,19 @@
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
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
var/next_extinguish = 0
var/extinguish_cooldown = 10 SECONDS
var/extinguishes_left = 10 // Yeah yeah, reagents, blah blah blah. This should be simple.
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..(user)
to_chat(user, "<span class='info'>There are [extinguishes_left] extinguisher canisters left in this suit.</span>")
var/max_extinguishes = 5
var/extinguishes_left = 5 // Yeah yeah, reagents, blah blah blah. This should be simple.
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
var/mob/living/carbon/human/H=user
@@ -32,15 +32,49 @@
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
to_chat(H, "<span class='warning'>Your suit automatically extinguishes the fire.</span>")
to_chat(user, "<span class='warning'>You hear a soft click and a hiss from your suit as it automatically extinguishes the fire.</span>")
if(!extinguishes_left)
to_chat(user, "<span class='warning'>Onboard auto-extinguisher depleted, refill with a cartridge.</span>")
playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
H.ExtinguishMob()
/obj/item/clothing/suit/space/eva/plasmaman/attackby(var/obj/item/A as obj, mob/user as mob, params)
..()
if(istype(A, /obj/item/weapon/plasmensuit_cartridge)) //This suit can only be reloaded by the appropriate cartridges, and only if it's got no more extinguishes left.
if(!extinguishes_left)
extinguishes_left = max_extinguishes //Full replenishment from the cartridge.
to_chat(user, "<span class='notice'>You replenish \the [src] with the cartridge.</span>")
qdel(A)
else
to_chat(user, "<span class='notice'>The suit must be depleted before it can be refilled.</span>")
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..(user)
to_chat(user, "<span class='info'>There are [extinguishes_left] extinguisher canisters left in this suit.</span>")
/obj/item/weapon/plasmensuit_cartridge //Can be used to refill Plasmaman suits when they run out of autoextinguishes.
name = "auto-extinguisher cartridge"
desc = "A tiny and light fibreglass-framed auto-extinguisher cartridge."
icon = 'icons/obj/items.dmi'
icon_state = "miniFE0"
item_state = "miniFE"
hitsound = null //Ultralight and
flags = null //non-conductive
force = 0
throwforce = 0
w_class = 2 //Fits in boxes.
materials = list()
attack_verb = list("tapped")
/obj/item/clothing/head/helmet/space/eva/plasmaman
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"
+7 -8
View File
@@ -195,7 +195,7 @@
if(!piece) continue
piece.icon_state = "[initial(icon_state)]"
if(airtight)
piece.flags &= ~(STOPSPRESSUREDMAGE|AIRTIGHT)
piece.flags &= ~(STOPSPRESSUREDMAGE | AIRTIGHT)
update_icon(1)
/obj/item/weapon/rig/proc/seal(mob/living/user)
@@ -426,11 +426,9 @@
helmet.toggle_light(wearer)
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
if(!(flags & NODROP))
piece.flags &= ~STOPSPRESSUREDMAGE
piece.flags &= ~AIRTIGHT
piece.flags &= ~(STOPSPRESSUREDMAGE | AIRTIGHT)
else
piece.flags |= STOPSPRESSUREDMAGE
piece.flags |= AIRTIGHT
piece.flags |= STOPSPRESSUREDMAGE | AIRTIGHT
/obj/item/weapon/rig/process()
// If we've lost any parts, grab them back.
@@ -442,7 +440,7 @@
M.unEquip(piece)
piece.forceMove(src)
if(!istype(wearer) || loc != wearer || wearer.back != src || (!(flags & NODROP)) || !cell || cell.charge <= 0)
if(!istype(wearer) || loc != wearer || wearer.back != src || !(flags & NODROP) || !cell || cell.charge <= 0)
if(!cell || cell.charge <= 0)
if(electrified > 0)
electrified = 0
@@ -777,8 +775,9 @@
to_chat(wearer, "<span class='notice'>Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
else if(deploy_mode != ONLY_RETRACT)
if(check_slot && check_slot != use_obj)
to_chat(wearer, "<span class='danger'>You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.</span>")
if(check_slot)
if(check_slot != use_obj) //If use_obj is already in check_slot, silently bail. Otherwise, tell the user why the part didn't deploy.
to_chat(wearer, "<span class='danger'>You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.</span>")
return
use_obj.forceMove(wearer)
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
@@ -115,7 +115,7 @@
/obj/item/weapon/rig/verb/deploy_suit()
set name = "Deploy Hardsuit"
set desc = "Deploys helmet, gloves and boots."
set desc = "Deploys helmet, gloves and boots all at once."
set category = "Hardsuit"
set src = usr.contents
@@ -136,8 +136,8 @@
deploy(wearer, usr)
/obj/item/weapon/rig/verb/toggle_seals_verb()
set name = "Toggle Hardsuit"
set desc = "Activates or deactivates your rig."
set name = "Toggle Hardsuit Seals"
set desc = "Seals or unseals your rig."
set category = "Hardsuit"
set src = usr.contents
@@ -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'
)
+15 -7
View File
@@ -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"
+8 -3
View File
@@ -24,10 +24,11 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
if(is_away_level(user.z))
to_chat(user, "<span class='danger'>Unable to establish a connection</span>: You're too far away from the station!")
return
if(istype(module, /obj/item/weapon/aiModule))
var/turf/T = get_turf(current)
if(!atoms_share_level(T, src))
to_chat(user, "<span class='danger'>Unable to establish a connection</span>: You're too far away from the target silicon!")
return
module.install(src)
else
return ..()
@@ -60,6 +61,10 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
if(istype(module, /obj/item/weapon/aiModule))
var/turf/T = get_turf(current)
if(!atoms_share_level(T, src))
to_chat(user, "<span class='danger'>Unable to establish a connection</span>: You're too far away from the target silicon!")
return
module.install(src)
else
return ..()
+9
View File
@@ -552,6 +552,15 @@
desc = "It's a worn-out bandana in camo paint"
icon_state = "bandcamo"
/obj/item/clothing/mask/gas/sechailer/fluff/spartan //LP Spartan: Kaskreyarawkta
name = "minimal gasmask"
desc = "Designed to cover as little of face as possible while still being a functional gasmask."
icon = 'icons/obj/custom_items.dmi'
icon_state = "spartan_mask"
item_state = "spartan_mask"
species_restricted = list("Vox")
//////////// Shoes ////////////
//////////// Sets ////////////
+80 -143
View File
@@ -46,11 +46,11 @@ log transactions
if(stat & NOPOWER)
return
if(linked_db && ( (linked_db.stat & NOPOWER) || !linked_db.activated ) )
if(linked_db && ((linked_db.stat & NOPOWER) || !linked_db.activated))
linked_db = null
authenticated_account = null
src.visible_message("\red [bicon(src)] [src] buzzes rudely, \"Connection to remote database lost.\"")
updateDialog()
visible_message("[bicon(src)]<span class='warning'>[src] buzzes rudely, \"Connection to remote database lost.\"</span>")
nanomanager.update_uis(src)
if(ticks_left_timeout > 0)
ticks_left_timeout--
@@ -66,41 +66,35 @@ log transactions
if(istype(T) && locate(/obj/item/weapon/spacecash) in T)
var/list/cash_found = list()
for(var/obj/item/weapon/spacecash/S in T)
cash_found+=S
if(cash_found.len>0)
if(prob(50))
playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
else
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
cash_found += S
if(cash_found.len > 0)
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
var/amount = count_cash(cash_found)
for(var/obj/item/weapon/spacecash/S in cash_found)
qdel(S)
authenticated_account.charge(-amount,null,"Credit deposit",terminal_id=machine_id,dest_name = "Terminal")
authenticated_account.charge(-amount, null, "Credit deposit", terminal_id = machine_id, dest_name = "Terminal")
/obj/machinery/atm/proc/reconnect_database()
for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
if( DB.z == src.z && !(DB.stat & NOPOWER) && DB.activated )
for(var/obj/machinery/computer/account_database/DB in machines)
if(DB.z == z && !(DB.stat & NOPOWER) && DB.activated)
linked_db = DB
break
/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob, params)
/obj/machinery/atm/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card))
var/obj/item/weapon/card/id/idcard = I
if(!held_card)
usr.drop_item()
idcard.loc = src
held_card = idcard
user.drop_item()
I.forceMove(src)
held_card = I
if(authenticated_account && held_card.associated_account_number != authenticated_account.account_number)
authenticated_account = null
nanomanager.update_uis(src)
else if(authenticated_account)
if(istype(I,/obj/item/weapon/spacecash))
if(istype(I, /obj/item/weapon/spacecash))
//consume the money
var/obj/item/weapon/spacecash/C = I
authenticated_account.money += C.get_total()
if(prob(50))
playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
else
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
//create a transaction log entry
var/datum/transaction/T = new()
@@ -113,108 +107,55 @@ log transactions
authenticated_account.transaction_log.Add(T)
to_chat(user, "<span class='info'>You insert [C] into [src].</span>")
src.attack_hand(user)
nanomanager.update_uis(src)
qdel(I)
else
..()
/obj/machinery/atm/attack_hand(mob/user as mob)
if(istype(user, /mob/living/silicon))
to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.")
/obj/machinery/atm/attack_hand(mob/user)
if(..())
return 1
if(issilicon(user))
to_chat(user, "<span class='warning'>Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.</span>")
return
if(get_dist(src,user) <= 1)
add_fingerprint(user)
ui_interact(user)
//js replicated from obj/machinery/computer/card
var/dat = {"<h1>Nanotrasen Automatic Teller Machine</h1>
For all your monetary needs!<br>
<i>This terminal is</i> [machine_id]. <i>Report this code when contacting Nanotrasen IT Support</i><br/>
Card: <a href='?src=[UID()];choice=insert_card'>[held_card ? held_card.name : "------"]</a><br><br>"}
/obj/machinery/atm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
user.set_machine(src)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if (!ui)
ui = new(user, src, ui_key, "atm.tmpl", name, 550, 650)
ui.open()
if(ticks_left_locked_down > 0)
dat += "<span class='alert'>Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled.</span>"
else if(authenticated_account)
switch(view_screen)
if(CHANGE_SECURITY_LEVEL)
dat += "Select a new security level for this account:<br><hr>"
var/text = "Zero - Either the account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct."
if(authenticated_account.security_level != 0)
text = "<A href='?src=[UID()];choice=change_security_level;new_security_level=0'>[text]</a>"
dat += "[text]<hr>"
text = "One - An account number and pin must be manually entered to access this account and process transactions."
if(authenticated_account.security_level != 1)
text = "<A href='?src=[UID()];choice=change_security_level;new_security_level=1'>[text]</a>"
dat += "[text]<hr>"
text = "Two - In addition to account number and pin, a card is required to access this account and process transactions."
if(authenticated_account.security_level != 2)
text = "<A href='?src=[UID()];choice=change_security_level;new_security_level=2'>[text]</a>"
dat += {"[text]<hr><br>
<A href='?src=[UID()];choice=view_screen;view_screen=0'>Back</a>"}
if(VIEW_TRANSACTION_LOGS)
dat += {"<b>Transaction logs</b><br>
<A href='?src=[UID()];choice=view_screen;view_screen=0'>Back</a>
<table border=1 style='width:100%'>
<tr>
<td><b>Date</b></td>
<td><b>Time</b></td>
<td><b>Target</b></td>
<td><b>Purpose</b></td>
<td><b>Value</b></td>
<td><b>Source terminal ID</b></td>
</tr>"}
for(var/datum/transaction/T in authenticated_account.transaction_log)
dat += {"<tr>
<td>[T.date]</td>
<td>[T.time]</td>
<td>[T.target_name]</td>
<td>[T.purpose]</td>
<td>$[T.amount]</td>
<td>[T.source_terminal]</td>
</tr>"}
dat += "</table>"
if(TRANSFER_FUNDS)
dat += {"<b>Account balance:</b> $[authenticated_account.money]<br>
<A href='?src=[UID()];choice=view_screen;view_screen=0'>Back</a><br><br>
<form name='transfer' action='?src=[UID()]' method='get'>
<input type='hidden' name='src' value='[UID()]'>
<input type='hidden' name='choice' value='transfer'>
Target account number: <input type='text' name='target_acc_number' value='' style='width:200px; background-color:white;'><br>
Funds to transfer: <input type='text' name='funds_amount' value='' style='width:200px; background-color:white;'><br>
Transaction purpose: <input type='text' name='purpose' value='Funds transfer' style='width:200px; background-color:white;'><br>
<input type='submit' value='Transfer funds'><br>
</form>"}
else
dat += {"Welcome, <b>[authenticated_account.owner_name].</b><br/>
<b>Account balance:</b> $[authenticated_account.money]
<form name='withdrawal' action='?src=[UID()]' method='get'>
<input type='hidden' name='src' value='[UID()]'>
<input type='hidden' name='choice' value='withdrawal'>
<input type='text' name='funds_amount' value='' style='width:200px; background-color:white;'><input type='submit' value='Withdraw funds'><br>
</form>
<A href='?src=[UID()];choice=view_screen;view_screen=1'>Change account security level</a><br>
<A href='?src=[UID()];choice=view_screen;view_screen=2'>Make transfer</a><br>
<A href='?src=[UID()];choice=view_screen;view_screen=3'>View transaction log</a><br>
<A href='?src=[UID()];choice=balance_statement'>Print balance statement</a><br>
<A href='?src=[UID()];choice=logout'>Logout</a><br>"}
else if(linked_db)
dat += {"<form name='atm_auth' action='?src=[UID()]' method='get'>
<input type='hidden' name='src' value='[UID()]'>
<input type='hidden' name='choice' value='attempt_auth'>
<b>Account:</b> <input type='text' id='account_num' name='account_num' style='width:250px; background-color:white;'><br>
<b>PIN:</b> <input type='text' id='account_pin' name='account_pin' style='width:250px; background-color:white;'><br>
<input type='submit' value='Submit'><br>
</form>"}
else
dat += "<span class='warning'>Unable to connect to accounts database, please retry and if the issue persists contact Nanotrasen IT support.</span>"
reconnect_database()
/obj/machinery/atm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["src"] = UID()
data["view_screen"] = view_screen
data["machine_id"] = machine_id
data["held_card_name"] = held_card ? held_card.name : "------"
data["ticks_left_locked_down"] = ticks_left_locked_down
data["linked_db"] = linked_db
var/datum/browser/popup = new(user, "atm", name, 550, 650)
popup.set_content(dat)
popup.open(0)
else
user << browse(null,"window=atm")
data["authenticated_account"] = authenticated_account
if(authenticated_account)
data["owner_name"] = authenticated_account.owner_name
data["money"] = authenticated_account.money
data["security_level"] = authenticated_account.security_level
/obj/machinery/atm/Topic(var/href, var/href_list)
var/list/trx = list()
for(var/datum/transaction/T in authenticated_account.transaction_log)
trx[++trx.len] = list(
"date" = T.date,
"time" = T.time,
"target_name" = T.target_name,
"purpose" = T.purpose,
"amount" = T.amount,
"source_terminal" = T.source_terminal)
data["transaction_log"] = trx
return data
/obj/machinery/atm/Topic(href, list/href_list)
if(href_list["choice"])
switch(href_list["choice"])
if("transfer")
@@ -253,7 +194,7 @@ log transactions
if(linked_db)
// check if they have low security enabled
scan_user(usr)
if(!ticks_left_locked_down && held_card)
var/tried_account_num = text2num(href_list["account_num"])
if(!tried_account_num)
@@ -280,11 +221,11 @@ log transactions
T.time = worldtime2text()
failed_account.transaction_log.Add(T)
else
to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
to_chat(usr, "[bicon(src)]<span class='warning'>Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.</span>")
previous_account_number = tried_account_num
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
else
to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
to_chat(usr, "[bicon(src)]<span class='warning'>Incorrect pin/account combination entered.</span>")
number_incorrect_tries = 0
else
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
@@ -300,7 +241,7 @@ log transactions
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
to_chat(usr, "[bicon(src)]<span class='notice'>Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
previous_account_number = tried_account_num
if("withdrawal")
@@ -313,7 +254,7 @@ log transactions
//remove the money
if(amount > 10000) // prevent crashes
to_chat(usr, "\blue The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'")
to_chat(usr, "<span class='notice'>The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'</span>")
amount = 10000
authenticated_account.money -= amount
withdraw_arbitrary_sum(amount)
@@ -332,11 +273,11 @@ log transactions
if("balance_statement")
if(authenticated_account)
if(world.timeofday < lastprint + PRINT_DELAY)
to_chat(usr, "<span class='notice'>The [src.name] flashes an error on its display.</span>")
to_chat(usr, "<span class='notice'>The [name] flashes an error on its display.</span>")
return
lastprint = world.timeofday
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/weapon/paper/R = new(src.loc)
var/obj/item/weapon/paper/R = new(loc)
R.name = "Account balance: [authenticated_account.owner_name]"
R.info = {"<b>NT Automated Teller Account Statement</b><br><br>
<i>Account holder:</i> [authenticated_account.owner_name]<br>
@@ -349,54 +290,49 @@ log transactions
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!R.stamped)
R.stamped = new
R.stamped = new()
R.stamped += /obj/item/weapon/stamp
R.overlays += stampoverlay
R.stamps += "<HR><i>This paper has been stamped by the Automatic Teller Machine.</i>"
if(prob(50))
playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
else
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
if("insert_card")
if(held_card)
held_card.loc = src.loc
held_card.forceMove(loc)
authenticated_account = null
if(ishuman(usr) && !usr.get_active_hand())
usr.put_in_hands(held_card)
held_card = null
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
I.forceMove(src)
held_card = I
if("logout")
authenticated_account = null
//usr << browse(null,"window=atm")
src.attack_hand(usr)
nanomanager.update_uis(src)
return 1
//create the most effective combination of notes to make up the requested amount
/obj/machinery/atm/proc/withdraw_arbitrary_sum(var/arbitrary_sum)
dispense_cash(arbitrary_sum,get_step(get_turf(src),turn(dir,180))) // Spawn on the ATM.
/obj/machinery/atm/proc/withdraw_arbitrary_sum(arbitrary_sum)
dispense_cash(arbitrary_sum, get_step(get_turf(src), turn(dir, 180))) // Spawn on the ATM.
//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri
/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user as mob)
/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/H)
if(!authenticated_account && linked_db)
if(human_user.wear_id)
if(H.wear_id)
var/obj/item/weapon/card/id/I
if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
I = human_user.wear_id
else if(istype(human_user.wear_id, /obj/item/device/pda) )
var/obj/item/device/pda/P = human_user.wear_id
if(istype(H.wear_id, /obj/item/weapon/card/id) )
I = H.wear_id
else if(istype(H.wear_id, /obj/item/device/pda) )
var/obj/item/device/pda/P = H.wear_id
I = P.id
if(I)
authenticated_account = attempt_account_access(I.associated_account_number)
if(authenticated_account)
to_chat(human_user, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
to_chat(H, "[bicon(src)]<span class='notice'>Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
//create a transaction log entry
var/datum/transaction/T = new()
@@ -406,5 +342,6 @@ log transactions
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
view_screen = NO_SCREEN
nanomanager.update_uis(src)
+45 -63
View File
@@ -27,7 +27,7 @@
/obj/item/device/eftpos/proc/print_reference()
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/weapon/paper/R = new(src.loc)
var/obj/item/weapon/paper/R = new(loc)
R.name = "Reference: [eftpos_name]"
// AUTOFIXED BY fix_string_idiocy.py
@@ -45,7 +45,7 @@
R.overlays += stampoverlay
R.stamps += "<HR><i>This paper has been stamped by the EFTPOS device.</i>"
var/obj/item/smallDelivery/D = new(R.loc)
R.loc = D
R.forceMove(D)
D.wrapped = R
D.name = "small parcel - 'EFTPOS access code'"
@@ -54,70 +54,51 @@
if(!location)
return
for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
for(var/obj/machinery/computer/account_database/DB in machines)
if(DB.z == location.z)
linked_db = DB
break
/obj/item/device/eftpos/attack_self(mob/user as mob)
if(get_dist(src,user) <= 1)
/obj/item/device/eftpos/attack_self(mob/user)
ui_interact(user)
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: var/dat = "<b>[eftpos_name]</b><br>"
var/dat = {"<b>[eftpos_name]</b><br>
<i>This terminal is</i> [machine_id]. <i>Report this code when contacting Nanotrasen IT Support</i><br>"}
// END AUTOFIX
if(transaction_locked)
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: dat += "<a href='?src=[UID()];choice=toggle_lock'>Reset[transaction_paid ? "" : " (authentication required)"]</a><br><br>"
dat += {"<a href='?src=[UID()];choice=toggle_lock'>Reset[transaction_paid ? "" : " (authentication required)"]</a><br><br>
Transaction purpose: <b>[transaction_purpose]</b><br>
Value: <b>$[transaction_amount]</b><br>
Linked account: <b>[linked_account ? linked_account.owner_name : "None"]</b><hr>"}
// END AUTOFIX
if(transaction_paid)
dat += "<i>This transaction has been processed successfully.</i><hr>"
else
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:67: dat += "<i>Swipe your card below the line to finish this transaction.</i><hr>"
dat += {"<i>Swipe your card below the line to finish this transaction.</i><hr>
<a href='?src=[UID()];choice=scan_card'>\[------\]</a>"}
// END AUTOFIX
else
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:70: dat += "<a href='?src=[UID()];choice=toggle_lock'>Lock in new transaction</a><br><br>"
dat += {"<a href='?src=[UID()];choice=toggle_lock'>Lock in new transaction</a><br><br>
Transaction purpose: <a href='?src=[UID()];choice=trans_purpose'>[transaction_purpose]</a><br>
Value: <a href='?src=[UID()];choice=trans_value'>$[transaction_amount]</a><br>
Linked account: <a href='?src=[UID()];choice=link_account'>[linked_account ? linked_account.owner_name : "None"]</a><hr>
<a href='?src=[UID()];choice=change_code'>Change access code</a><br>
<a href='?src=[UID()];choice=change_id'>Change EFTPOS ID</a><br>
Scan card to reset access code <a href='?src=[UID()];choice=reset'>\[------\]</a>"}
// END AUTOFIX
user << browse(dat,"window=eftpos")
else
user << browse(null,"window=eftpos")
/obj/item/device/eftpos/attackby(O as obj, user as mob, params)
/obj/item/device/eftpos/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/weapon/card))
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
reconnect_database()
if(linked_db)
if(linked_account)
var/obj/item/weapon/card/I = O
scan_card(I)
scan_card(O, user)
nanomanager.update_uis(src)
else
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to connect to linked account.</span>")
to_chat(user, "[bicon(src)]<span class='warning'>Unable to connect to linked account.</span>")
else
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to connect to accounts database.</span>")
to_chat(user, "[bicon(src)]<span class='warning'>Unable to connect to accounts database.</span>")
else
..()
/obj/item/device/eftpos/Topic(var/href, var/href_list)
/obj/item/device/eftpos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "eftpos.tmpl", name, 790, 310)
ui.open()
/obj/item/device/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["eftpos_name"] = eftpos_name
data["machine_id"] = machine_id
data["transaction_locked"] = transaction_locked
data["transaction_paid"] = transaction_paid
data["transaction_purpose"] = transaction_purpose
data["transaction_amount"] = transaction_amount
data["linked_account"] = linked_account ? linked_account.owner_name : null
return data
/obj/item/device/eftpos/Topic(href, list/href_list)
if(..())
return 1
if(href_list["choice"])
switch(href_list["choice"])
if("change_code")
@@ -134,9 +115,9 @@
if("change_id")
var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
if(attempt_code == access_code)
var name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
var/name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
if(name)
eftpos_name = name + " EFTPOS scanner"
eftpos_name = "[name] EFTPOS scanner"
print_reference()
else
to_chat(usr, "[bicon(src)]<span class='warning'>Incorrect code entered.</span>")
@@ -150,11 +131,11 @@
else
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to connect to accounts database.</span>")
if("trans_purpose")
var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null
var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose", transaction_purpose) as text|null
if(purpose)
transaction_purpose = purpose
if("trans_value")
var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount") as num
var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount", transaction_amount) as num
if(try_num < 0)
alert("That is not a valid amount!")
else
@@ -168,7 +149,7 @@
else if(linked_account)
transaction_locked = 1
else
to_chat(usr, "[bicon(src)] <span class='warning'>No account connected to send transactions to.</span>")
to_chat(usr, "[bicon(src)]<span class='warning'>No account connected to send transactions to.</span>")
if("scan_card")
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
@@ -176,7 +157,7 @@
if(linked_db && linked_account)
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card))
scan_card(I)
scan_card(I, usr)
else
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to link accounts.</span>")
if("reset")
@@ -191,12 +172,13 @@
access_code = 0
to_chat(usr, "[bicon(src)]<span class='info'>Access code reset to 0.</span>")
src.attack_self(usr)
nanomanager.update_uis(src)
return 1
/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I)
/obj/item/device/eftpos/proc/scan_card(obj/item/weapon/card/I, mob/user)
if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("<span class='info'>[usr] swipes a card through [src].</span>")
visible_message("<span class='info'>[user] swipes a card through [src].</span>")
if(transaction_locked && !transaction_paid)
if(linked_account)
var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num
@@ -204,7 +186,7 @@
if(D)
if(transaction_amount <= D.money)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("[bicon(src)] The [src] chimes.")
visible_message("[bicon(src)] The [src] chimes.")
transaction_paid = 1
//transfer the money
@@ -233,11 +215,11 @@
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
else
to_chat(usr, "[bicon(src)]<span class='warning'>You don't have that much money!</span>")
to_chat(user, "[bicon(src)]<span class='warning'>You don't have that much money!</span>")
else
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to access account. Check security settings and try again.</span>")
to_chat(user, "[bicon(src)]<span class='warning'>Unable to access account. Check security settings and try again.</span>")
else
to_chat(usr, "[bicon(src)]<span class='warning'>EFTPOS is not connected to an account.</span>")
to_chat(user, "[bicon(src)]<span class='warning'>EFTPOS is not connected to an account.</span>")
else
..()
+10 -4
View File
@@ -1,5 +1,5 @@
/datum/event/blob
announceWhen = 12
announceWhen = 60
endWhen = 120
var/obj/effect/blob/core/Blob
@@ -10,9 +10,15 @@
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, new_overmind=C.client)
for(var/i in 1 to 5)
Blob.process()
else
return kill()
/datum/event/blob/tick()
if(!Blob)
+1 -1
View File
@@ -191,7 +191,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1)
)
+15 -9
View File
@@ -17,7 +17,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
var/startside = pick(cardinal)
var/turf/startT = spaceDebrisStartLoc(startside, 1)
var/turf/endT = spaceDebrisFinishLoc(startside, 1)
new /obj/effect/immovablerod(startT, endT)
new /obj/effect/immovablerod/event(startT, endT)
/obj/effect/immovablerod
name = "Immovable Rod"
@@ -30,18 +30,20 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
var/z_original = 0
var/destination
var/notify = TRUE
var/move_delay = 1
/obj/effect/immovablerod/New(atom/start, atom/end)
/obj/effect/immovablerod/New(atom/start, atom/end, delay)
loc = start
z_original = z
destination = end
move_delay = delay
if(notify)
notify_ghosts("\A [src] is inbound!",
enter_link="<a href=?src=[UID()];follow=1>(Click to follow)</a>",
source=src, action=NOTIFY_FOLLOW)
poi_list |= src
if(end && end.z==z_original)
walk_towards(src, destination, 1)
walk_towards(src, destination, move_delay)
/obj/effect/immovablerod/Topic(href, href_list)
if(href_list["follow"])
@@ -53,11 +55,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
poi_list.Remove(src)
return ..()
/obj/effect/immovablerod/Move()
if(z != z_original || loc == destination)
qdel(src)
return ..()
/obj/effect/immovablerod/ex_act(test)
return 0
@@ -81,4 +78,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
H.adjustBruteLoss(160)
if(clong.density || prob(10))
clong.ex_act(2)
return
/obj/effect/immovablerod/event
var/tiles_moved = 0
/obj/effect/immovablerod/event/Move()
var/atom/oldloc = loc
. = ..()
tiles_moved++
if(get_dist(oldloc, loc) > 2 && tiles_moved > 10) // We went on a journey, commit sudoku
qdel(src)
+73 -13
View File
@@ -45,6 +45,9 @@
/datum/spacevine_mutation/proc/on_death(obj/effect/spacevine/holder)
return
/datum/spacevine_mutation/proc/on_deletion(obj/effect/spacevine/holder)
return
/datum/spacevine_mutation/proc/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
. = expected_damage
@@ -115,7 +118,7 @@
. = ..()
//Do this *after* the turf has changed as qdel in spacevines will call changeturf again if it hasn't
for(var/obj/effect/spacevine/SV in src)
qdel(SV)
SV.wither()
/datum/spacevine_mutation/space_covering
var/static/list/coverable_turfs
@@ -140,7 +143,7 @@
T.ChangeTurf(/turf/simulated/floor/vines)
T.baseturf = currtype
/datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder)
/datum/spacevine_mutation/space_covering/on_deletion(obj/effect/spacevine/holder)
var/turf/T = get_turf(holder)
if(istype(T, /turf/simulated/floor/vines))
T.ChangeTurf(T.baseturf)
@@ -194,7 +197,7 @@
else
. = 1
spawn(5)
qdel(holder)
holder.wither()
/datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
explosion(holder.loc, 0, 0, severity, 0, 0)
@@ -221,7 +224,7 @@
/datum/spacevine_mutation/vine_eating/on_spread(obj/effect/spacevine/holder, turf/target)
var/obj/effect/spacevine/prey = locate() in target
if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin
qdel(prey)
prey.wither()
. = TRUE
/datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently
@@ -305,6 +308,56 @@
/datum/spacevine_mutation/virulent_spread/on_search(obj/effect/spacevine/holder)
return 1
// Sure, let's encourage crew members to deliberately breed a highly dangerous
// threat. What could *possibly* go wrong? ;)
/datum/spacevine_mutation/mineral
name = "metallic"
hue = "#444444"
quality = POSITIVE
severity = 3
var/drop_rate = 20
var/list/mineral_results = list(
/obj/item/stack/sheet/metal = 1
)
/datum/spacevine_mutation/mineral/on_death(obj/effect/spacevine/holder)
if(!prob(drop_rate))
return
var/itemtype = pickweight(mineral_results)
var/turf/pos = get_turf(holder)
new itemtype(pos, severity)
/datum/spacevine_mutation/mineral/valuables
name = "glimmering"
hue = "#888800"
drop_rate = 10
mineral_results = list(
/obj/item/stack/sheet/mineral/silver = 4,
/obj/item/stack/sheet/mineral/gold = 2,
/obj/item/stack/sheet/mineral/diamond = 1
)
/datum/spacevine_mutation/mineral/glass
name = "glassy"
hue = "#8888FF"
mineral_results = list(
/obj/item/stack/sheet/glass = 1
)
/datum/spacevine_mutation/mineral/plastic
name = "plasticine"
hue = "#222288"
mineral_results = list(
/obj/item/stack/sheet/mineral/plastic = 1
)
/datum/spacevine_mutation/mineral/wood
name = "wooden"
hue = "#442200"
mineral_results = list(
/obj/item/stack/sheet/wood = 1
)
// SPACE VINES (Note that this code is very similar to Biomass code)
/obj/effect/spacevine
name = "space vines"
@@ -338,9 +391,15 @@
text += " vine."
to_chat(user, text)
/obj/effect/spacevine/Destroy()
/obj/effect/spacevine/proc/wither()
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_death(src)
qdel(src)
/obj/effect/spacevine/Destroy()
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_deletion(src)
if(master)
master.vines -= src
master.growth_queue -= src
@@ -349,6 +408,7 @@
KZ.mutations |= mutations
KZ.set_potency(master.mutativeness * 10)
KZ.set_production((master.spread_cap / initial(master.spread_cap)) * 5)
qdel(master)
master = null
mutations.Cut()
set_opacity(0)
@@ -366,7 +426,7 @@
override += SM.on_chem(src, R)
if(!override && istype(R, /datum/reagent/glyphosate))
if(prob(50))
qdel(src)
wither()
/obj/effect/spacevine/proc/eat(mob/eater)
var/override = 0
@@ -375,7 +435,7 @@
if(!override)
if(prob(10))
eater.say("Nom")
qdel(src)
wither()
/obj/effect/spacevine/attackby(obj/item/weapon/W, mob/user, params)
if (!W || !user || !W.type)
@@ -388,12 +448,12 @@
for(var/obj/effect/spacevine/B in orange(1,src))
B.health = health - force
if(B.health < 1)
qdel(B)
wither()
health = health - force
if(health < 1)
qdel(src)
wither()
return
@@ -408,7 +468,7 @@
health = health - force
if(health < 1)
qdel(src)
wither()
..()
@@ -482,7 +542,7 @@
SM.on_birth(SV)
/obj/effect/spacevine_controller/process()
if(!vines)
if(!vines || !vines.len)
qdel(src) //space vines exterminated. Remove the controller
return
if(!growth_queue)
@@ -570,14 +630,14 @@
for(var/datum/spacevine_mutation/SM in mutations)
i += SM.on_explosion(severity, src)
if(!i && prob(100/severity))
qdel(src)
wither()
/obj/effect/spacevine/temperature_expose(null, temp, volume)
var/override = 0
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.process_temperature(src, temp, volume)
if(!override)
qdel(src)
wither()
/obj/effect/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
if(isvineimmune(mover))
+10 -9
View File
@@ -1,14 +1,14 @@
/datum/event/spider_terror
announceWhen = 400
announceWhen = 240
var/spawncount = 1
/datum/event/spider_terror/setup()
announceWhen = rand(announceWhen, announceWhen + 50)
announceWhen = rand(announceWhen, announceWhen + 30)
spawncount = 1
/datum/event/spider_infestation/announce()
command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren.ogg')
/datum/event/spider_terror/announce()
command_announcement.Announce("Confirmed outbreak of level 3 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren-spooky.ogg')
/datum/event/spider_terror/start()
@@ -17,23 +17,24 @@
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
var/spider_type
var/infestation_type = pick(1, 2, 3, 4)
var/infestation_type = pick(1, 2, 3, 4, 5)
switch(infestation_type)
if(1)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green
spawncount = pick(2,3)
spawncount = 4
if(2)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white
spawncount = 1
spawncount = 2
if(3)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince
spawncount = 1
if(4)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen
spawncount = 1
if(5)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/mother
spawncount = 1
while(spawncount >= 1 && vents.len)
var/obj/vent = pick(vents)
var/obj/effect/spider/spiderling/terror_spiderling/S = new(vent.loc)
@@ -76,7 +76,7 @@
output = /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp
/datum/deepfryer_special/banana
input = "banana"
input = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
output = /obj/item/weapon/reagent_containers/food/snacks/friedbanana
/datum/deepfryer_special/potato_chips
@@ -84,7 +84,7 @@
output = /obj/item/weapon/reagent_containers/food/snacks/chips
/datum/deepfryer_special/corn_chips
input = "corn"
input = /obj/item/weapon/reagent_containers/food/snacks/grown/corn
output = /obj/item/weapon/reagent_containers/food/snacks/cornchips
/datum/deepfryer_special/fried_tofu
@@ -93,4 +93,8 @@
/datum/deepfryer_special/chimichanga
input = /obj/item/weapon/reagent_containers/food/snacks/burrito
output = /obj/item/weapon/reagent_containers/food/snacks/chimichanga
output = /obj/item/weapon/reagent_containers/food/snacks/chimichanga
/datum/deepfryer_special/fries
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges
output = /obj/item/weapon/reagent_containers/food/snacks/fries
@@ -71,10 +71,6 @@
input = /obj/item/weapon/reagent_containers/food/snacks/meat
output = /obj/item/weapon/reagent_containers/food/snacks/meatball
/datum/food_processor_process/potatowedges
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/wedges
output = /obj/item/weapon/reagent_containers/food/snacks/fries
/datum/food_processor_process/sweetpotato
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet
output = /obj/item/weapon/reagent_containers/food/snacks/yakiimo
+31 -2
View File
@@ -1,3 +1,5 @@
#define HYDRO_CYCLES_PER_AGE 2 //Adjust this to adjust how many hydroponics cycles it takes to increase age. Positive integers only.
/obj/machinery/hydroponics
name = "hydroponics tray"
icon = 'icons/obj/hydroponics/equipment.dmi'
@@ -20,10 +22,12 @@
var/lastproduce = 0 //Last time it was harvested
var/lastcycle = 0 //Used for timing of cycles.
var/cycledelay = 200 //About 10 seconds / cycle
var/current_cycle = 0 //Used for tracking when to age
var/harvest = 0 //Ready to harvest?
var/obj/item/seeds/myseed = null //The currently planted seed
var/rating = 1
var/wrenchable = 1
var/lid_state = 0
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
@@ -108,6 +112,20 @@
return connected
/obj/machinery/hydroponics/AltClick()
if(wrenchable && !usr.stat && !usr.lying && Adjacent(usr))
toggle_lid(usr)
return
return ..()
/obj/machinery/hydroponics/proc/toggle_lid(mob/living/user)
if(!user || user.stat || user.restrained())
return
lid_state = !lid_state
to_chat(user, "<span class='notice'>You [lid_state ? "close" : "open"] the tray's lid.</span>")
update_icon()
/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(!myseed)
@@ -136,7 +154,10 @@
lastcycle = world.time
if(myseed && !dead)
// Advance age
age++
current_cycle++
if(current_cycle == HYDRO_CYCLES_PER_AGE)
age++
current_cycle = 0
if(age < myseed.maturation)
lastproduce = age
@@ -267,6 +288,9 @@
overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "gaia_blessing")
set_light(3)
if(lid_state)
overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "hydrocover")
update_icon_hoses()
if(myseed)
@@ -904,6 +928,9 @@
/obj/machinery/hydroponics/attack_hand(mob/user)
if(issilicon(user)) //How does AI know what plant is?
return
if(lid_state)
to_chat(user, "<span class='warning'>You can't reach the plant through the cover.</span>")
return
if(harvest)
myseed.harvest(user)
else if(dead)
@@ -1013,4 +1040,6 @@
to_chat(user, "<span class='notice'>You clear up [src]!</span>")
qdel(src)
else
..()
..()
#undef HYDRO_CYCLES_PER_AGE
+16 -16
View File
@@ -1,8 +1,8 @@
proc/sql_report_karma(var/mob/spender, var/mob/receiver)
var/sqlspendername = sanitizeSQL(spender.name)
var/sqlspenderkey = spender.key
var/sqlspenderkey = spender.ckey
var/sqlreceivername = sanitizeSQL(receiver.name)
var/sqlreceiverkey = receiver.key
var/sqlreceiverkey = receiver.ckey
var/sqlreceiverrole = "None"
var/sqlreceiverspecial = "None"
@@ -24,7 +24,7 @@ proc/sql_report_karma(var/mob/spender, var/mob/receiver)
log_game("SQL ERROR during karma logging. Error : \[[err]\]\n")
query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[receiver.key]'")
query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[receiver.ckey]'")
query.Execute()
var/karma
@@ -34,7 +34,7 @@ proc/sql_report_karma(var/mob/spender, var/mob/receiver)
karma = text2num(query.item[3])
if(karma == null)
karma = 1
query = dbcon.NewQuery("INSERT INTO [format_table_name("karmatotals")] (byondkey, karma) VALUES ('[receiver.key]', [karma])")
query = dbcon.NewQuery("INSERT INTO [format_table_name("karmatotals")] (byondkey, karma) VALUES ('[receiver.ckey]', [karma])")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during karmatotal logging (adding new key). Error : \[[err]\]\n")
@@ -55,7 +55,7 @@ var/list/karma_spenders = list()
if(!ticker || !player_list.len || (ticker.current_state == GAME_STATE_PREGAME))
to_chat(src, "<span class='warning'>You can't award karma until the game has started.</span>")
return 0
if(client.karma_spent || (key in karma_spenders))
if(client.karma_spent || (ckey in karma_spenders))
to_chat(src, "<span class='warning'>You've already spent your karma for the round.</span>")
return 0
return 1
@@ -70,7 +70,7 @@ var/list/karma_spenders = list()
if(!M.client)
to_chat(src, "<span class='warning'>That mob has no client connected at the moment.</span>")
return 0
if(key == M.key)
if(ckey == M.ckey)
to_chat(src, "<span class='warning'>You can't spend karma on yourself!</span>")
return 0
if(client.address == M.client.address)
@@ -128,7 +128,7 @@ var/list/karma_spenders = list()
M.client.karma += 1
to_chat(usr, "Good karma spent on [M.name].")
client.karma_spent = 1
karma_spenders += key
karma_spenders += ckey
var/special_role = "None"
var/assigned_role = "None"
@@ -157,7 +157,7 @@ var/list/karma_spenders = list()
to_chat(usr, "\red Unable to connect to karma database. Please try again later.<br>")
return
else
var/DBQuery/query = dbcon.NewQuery("SELECT karma, karmaspent FROM [format_table_name("karmatotals")] WHERE byondkey='[src.key]'")
var/DBQuery/query = dbcon.NewQuery("SELECT karma, karmaspent FROM [format_table_name("karmatotals")] WHERE byondkey='[src.ckey]'")
query.Execute()
var/totalkarma
@@ -258,7 +258,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
return
/client/proc/DB_job_unlock(var/job,var/cost)
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbjob
@@ -267,7 +267,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
dbckey = query.item[2]
dbjob = query.item[3]
if(!dbckey)
query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, job) VALUES ('[usr.key]','[job]')")
query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, job) VALUES ('[usr.ckey]','[job]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n")
@@ -298,7 +298,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
return
/client/proc/DB_species_unlock(var/species,var/cost)
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbspecies
@@ -307,7 +307,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
dbckey = query.item[2]
dbspecies = query.item[4]
if(!dbckey)
query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, species) VALUES ('[usr.key]','[species]')")
query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, species) VALUES ('[usr.ckey]','[species]')")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n")
@@ -338,7 +338,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
return
/client/proc/karmacharge(var/cost,var/refund = 0)
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[usr.key]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[usr.ckey]'")
query.Execute()
while(query.NextRow())
@@ -347,7 +347,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
spent -= cost
else
spent += cost
query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karmaspent=[spent] WHERE byondkey='[usr.key]'")
query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karmaspent=[spent] WHERE byondkey='[usr.ckey]'")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n")
@@ -383,7 +383,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
to_chat(usr, "\red That job is not refundable.")
return
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbjob
@@ -423,7 +423,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
to_chat(usr, "\red Your ckey ([dbckey]) was not found.")
/client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
var/dbjob
+2 -2
View File
@@ -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
+3 -3
View File
@@ -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
+3 -3
View File
@@ -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)
+4
View File
@@ -114,6 +114,10 @@
if(istype(W, /obj/item/weapon/crowbar))
empty_content()
default_deconstruction_crowbar(W)
if(ismultitool(W))
input_dir = turn(input_dir, -90)
output_dir = turn(output_dir, -90)
to_chat(user, "<span class='notice'>You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].</span>")
return
if(default_unfasten_wrench(user, W))
return
+1 -1
View File
@@ -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
@@ -82,6 +82,17 @@ I'm using this for Stat to give it a more nifty interface to work with
/mob/living/carbon/brain/proc/has_synthetic_assistance()
return (container && istype(container, /obj/item/device/mmi)) || in_contents_of(/obj/mecha)
/mob/living/carbon/brain/proc/get_race()
if(container)
var/obj/item/device/mmi/M = container
if(istype(M) && M.held_brain)
return M.held_brain.dna.get_species_name()
else
return "Artificial Life"
if(istype(loc, /obj/item/organ/internal/brain))
var/obj/item/organ/internal/brain/B = loc
return B.dna.get_species_name()
/mob/living/carbon/brain/Stat()
..()
if(has_synthetic_assistance())
+1 -1
View File
@@ -149,7 +149,7 @@
return 0
if(reagents.has_reagent("teslium"))
shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging!
take_overall_damage(0,shock_damage)
take_overall_damage(0,shock_damage, used_weapon = "Electrocution")
//src.burn_skin(shock_damage)
//src.adjustFireLoss(shock_damage) //burn_skin will do this for us
//src.updatehealth()
@@ -494,7 +494,8 @@
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=[UID()];medrecord=`'>\[View\]</a> <a href='?src=[UID()];medrecordadd=`'>\[Add comment\]</a>\n"
if(print_flavor_text()) msg += "[print_flavor_text()]\n"
if(print_flavor_text() && !skipface)
msg += "[print_flavor_text()]\n"
msg += "*---------*</span>"
if(pose)
+24 -32
View File
@@ -923,12 +923,11 @@
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
counter++
if(counter == 1)
to_chat(usr, "No comment found")
if(length(R.fields["comments"]))
for(var/c in R.fields["comments"])
to_chat(usr, c)
else
to_chat(usr, "<span class='warning'>No comment found</span>")
to_chat(usr, "<a href='?src=[UID()];secrecordadd=`'>\[Add comment\]</a>")
if(!read)
@@ -950,21 +949,18 @@
for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
var/t1 = sanitize(copytext(input("Add Comment:", "Sec. records", null, null) as message,1,MAX_MESSAGE_LEN))
if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
var/t1 = copytext(trim(sanitize(input("Add Comment:", "Sec. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
if(!t1 || usr.stat || usr.restrained() || !hasHUD(usr, "security"))
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
if(istype(usr,/mob/living/carbon/human))
if(ishuman(usr))
var/mob/living/carbon/human/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
if(istype(usr,/mob/living/silicon/robot))
R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()]<BR>[t1]"
if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
if(istype(usr,/mob/living/silicon/ai))
R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()]<BR>[t1]"
if(isAI(usr))
var/mob/living/silicon/ai/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.name] (artificial intelligence) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
R.fields["comments"] += "Made by [U.name] (artificial intelligence) on [current_date_string] [worldtime2text()]<BR>[t1]"
if(href_list["medical"])
if(hasHUD(usr,"medical"))
@@ -1049,12 +1045,11 @@
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
counter++
if(counter == 1)
to_chat(usr, "No comment found")
if(length(R.fields["comments"]))
for(var/c in R.fields["comments"])
to_chat(usr, c)
else
to_chat(usr, "<span class='warning'>No comment found</span>")
to_chat(usr, "<a href='?src=[UID()];medrecordadd=`'>\[Add comment\]</a>")
if(!read)
@@ -1076,18 +1071,15 @@
for(var/datum/data/record/R in data_core.medical)
if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
if(!t1 || usr.stat || usr.restrained() || !hasHUD(usr, "medical"))
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
if(istype(usr,/mob/living/carbon/human))
if(ishuman(usr))
var/mob/living/carbon/human/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
if(istype(usr,/mob/living/silicon/robot))
R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()]<BR>[t1]"
if(isrobot(usr))
var/mob/living/silicon/robot/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()]<BR>[t1]"
if(href_list["lookitem"])
var/obj/item/I = locate(href_list["lookitem"])
@@ -88,19 +88,19 @@
return amount
/mob/living/carbon/human/adjustBruteLoss(amount)
/mob/living/carbon/human/adjustBruteLoss(amount, damage_source)
if(species)
amount = amount * species.brute_mod
if(amount > 0)
take_overall_damage(amount, 0)
take_overall_damage(amount, 0, used_weapon = damage_source)
else
heal_overall_damage(-amount, 0)
/mob/living/carbon/human/adjustFireLoss(amount)
/mob/living/carbon/human/adjustFireLoss(amount, damage_source)
if(species)
amount = amount * species.burn_mod
if(amount > 0)
take_overall_damage(0, amount)
take_overall_damage(0, amount, used_weapon = damage_source)
else
heal_overall_damage(0, -amount)
@@ -394,4 +394,4 @@ This function restores all organs.
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
updatehealth()
return 1
return 1
@@ -132,7 +132,6 @@
job = myjob.title
mind.assigned_role = job
myjob.equip(src)
myjob.apply_fingerprints(T)
/mob/living/carbon/human/interactive/proc/reset()
walk(src, 0)
@@ -193,7 +192,6 @@
for(var/obj/item/W in T)
qdel(W)
T.myjob.equip(T)
T.myjob.apply_fingerprints(T)
T.doSetup(alt_title)
var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as anything in list("Yes", "No")
@@ -615,3 +615,17 @@
return 1
return 0 //Unsupported slot
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
var/datum/outfit/O = null
if(ispath(outfit))
O = new outfit
else
O = outfit
if(!istype(O))
return 0
if(!O)
return 0
return O.equip(src, visualsOnly)
@@ -15,6 +15,7 @@
butt_sprite = "plasma"
breath_type = "plasma"
poison_type = null //Certainly isn't plasma.
heat_level_1 = 350 // Heat damage level 1 above this point.
heat_level_2 = 400 // Heat damage level 2 above this point.
@@ -33,20 +34,21 @@
message = replacetext(message, "s", stutter("ss"))
return message
/datum/species/plasmaman/equip(var/mob/living/carbon/human/H)
/datum/species/plasmaman/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/assigned_role = H.mind && H.mind.assigned_role ? H.mind.assigned_role : "Civilian"
// Unequip existing suits and hats.
H.unEquip(H.wear_suit)
H.unEquip(H.head)
if(H.mind.assigned_role != "Clown")
if(assigned_role != "Clown")
H.unEquip(H.wear_mask)
H.equip_or_collect(new /obj/item/clothing/mask/breath(H), slot_wear_mask)
var/suit=/obj/item/clothing/suit/space/eva/plasmaman
var/helm=/obj/item/clothing/head/helmet/space/eva/plasmaman
var/suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
var/helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
var/tank_slot = slot_s_store
var/tank_slot_name = "suit storage"
switch(H.mind.assigned_role)
switch(assigned_role)
if("Scientist","Geneticist","Roboticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
@@ -54,8 +56,8 @@
suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
if("Station Engineer", "Mechanic")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
if("Chief Engineer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
@@ -63,11 +65,11 @@
suit=/obj/item/clothing/suit/space/eva/plasmaman/atmostech
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
if("Detective")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
suit=/obj/item/clothing/suit/space/eva/plasmaman/security
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
if("Warden","Security Officer","Security Pod Pilot")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
suit=/obj/item/clothing/suit/space/eva/plasmaman/security
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_in_backpack)
if("Internal Affairs Agent")
suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer
@@ -127,8 +129,10 @@
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
H.equip_or_collect(new suit(H), slot_wear_suit)
H.equip_or_collect(new helm(H), slot_head)
H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
to_chat(H, "<span class='notice'>You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.</span>")
H.equip_or_collect(new /obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack)
H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
to_chat(H, "<span class='notice'>You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.</span>")
H.internal = H.get_item_by_slot(tank_slot)
H.update_internals_hud_icon(1)
@@ -235,10 +239,29 @@
if(heat_level_3 to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
to_chat(H, "<span class='warning'>Your body reacts with the atmosphere and bursts into flame!</span>")
H.adjust_fire_stacks(0.5)
H.IgniteMob()
return 1
/datum/species/plasmaman/handle_life(var/mob/living/carbon/human/H)
if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
var/datum/gas_mixture/environment = H.loc.return_air()
if(environment && environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Plasmamen so long as there's enough oxygen (0.5 moles, same as it takes to burn gaseous plasma).
H.adjust_fire_stacks(0.5)
if(!H.on_fire && H.fire_stacks > 0)
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
H.IgniteMob()
else
if(H.on_fire && H.fire_stacks > 0)
var/obj/item/clothing/suit/space/eva/plasmaman/P = H.wear_suit
if(istype(P))
P.Extinguish(H)
H.update_fire()
/datum/species/plasmaman/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
if(R.id == "plasma")
H.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
H.adjustPlasma(20)
H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
return 0 //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen.
return ..()
@@ -439,7 +439,10 @@
/datum/species/proc/say_filter(mob/M, message, datum/language/speaking)
return message
/datum/species/proc/equip(var/mob/living/carbon/human/H)
/datum/species/proc/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
return
/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
return
/datum/species/proc/can_understand(var/mob/other)
@@ -343,13 +343,13 @@
newname += pick(vox_name_syllables)
return capitalize(newname)
/datum/species/vox/equip(var/mob/living/carbon/human/H)
if(H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H)
if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
H.unEquip(H.wear_mask)
H.unEquip(H.l_hand)
H.equip_or_collect(new /obj/item/clothing/mask/breath/vox(H), slot_wear_mask)
var/tank_pref = H.client.prefs.speciesprefs
var/tank_pref = H.client && H.client.prefs ? H.client.prefs.speciesprefs : null
if(tank_pref)//Diseasel, here you go
H.equip_or_collect(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand)
else
@@ -365,7 +365,7 @@
..()
/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race.
if(H.species.name == "Vox") //Making sure we don't break Armalis.
if(H.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox.
var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox.
switch(H.s_tone)
@@ -395,6 +395,14 @@
H.change_icobase(new_icobase, new_deform, owner_sensitive) //Update the icobase/deform of all our organs, but make sure we don't mess with frankenstein limbs in doing so.
H.update_dna()
/datum/species/vox/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
if(R.id == "oxygen") //Armalis are above such petty things.
H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma.
H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
return 0 //Handling reagent removal on our own.
return ..()
/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
H.verbs += /mob/living/carbon/human/proc/leap
H.verbs += /mob/living/carbon/human/proc/gut
@@ -427,7 +435,8 @@
breath_type = "nitrogen"
poison_type = "oxygen"
flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED
flags = NO_SCAN | NO_BLOOD | NO_PAIN | IS_WHITELISTED
bodyflags = HAS_TAIL
dietflags = DIET_OMNI //should inherit this from vox, this is here just in case
blood_color = "#2299FC"
@@ -455,6 +464,9 @@
"is holding their breath!",
"is huffing oxygen!")
/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things.
return 1
/datum/species/kidan
name = "Kidan"
name_plural = "Kidan"
@@ -728,7 +740,7 @@
genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
..()
/datum/species/grey/equip(var/mob/living/carbon/human/H)
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/speech_pref = H.client.prefs.speciesprefs
if(speech_pref)
H.mind.speech_span = "wingdings"
@@ -289,6 +289,7 @@ var/list/robot_verbs_default = list(
module_sprites["Basic"] = "robot_old"
module_sprites["Android"] = "droid"
module_sprites["Default"] = "robot"
module_sprites["Noble-STD"] = "Noble-STD"
if("Service")
module = new /obj/item/weapon/robot_module/butler(src)
@@ -299,6 +300,7 @@ var/list/robot_verbs_default = list(
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
module_sprites["Standard"] = "robotServ"
module_sprites["Noble-SRV"] = "Noble-SRV"
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
@@ -309,6 +311,7 @@ var/list/robot_verbs_default = list(
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
module_sprites["Standard"] = "robotMine"
module_sprites["Noble-DIG"] = "Noble-DIG"
if("Medical")
module = new /obj/item/weapon/robot_module/medical(src)
@@ -320,6 +323,7 @@ var/list/robot_verbs_default = list(
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
module_sprites["Standard"] = "robotMedi"
module_sprites["Noble-MED"] = "Noble-MED"
status_flags &= ~CANPUSH
if("Security")
@@ -330,6 +334,7 @@ var/list/robot_verbs_default = list(
module_sprites["Black Knight"] = "securityrobot"
module_sprites["Bloodhound"] = "bloodhound"
module_sprites["Standard"] = "robotSecy"
module_sprites["Noble-SEC"] = "Noble-SEC"
status_flags &= ~CANPUSH
if("Engineering")
@@ -341,6 +346,7 @@ var/list/robot_verbs_default = list(
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
module_sprites["Standard"] = "robotEngi"
module_sprites["Noble-ENG"] = "Noble-ENG"
magpulse = 1
if("Janitor")
@@ -350,6 +356,7 @@ var/list/robot_verbs_default = list(
module_sprites["Mopbot"] = "janitorrobot"
module_sprites["Mop Gear Rex"] = "mopgearrex"
module_sprites["Standard"] = "robotJani"
module_sprites["Noble-CLN"] = "Noble-CLN"
if("Combat")
module = new /obj/item/weapon/robot_module/combat(src)
@@ -161,8 +161,8 @@
/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A)
if(istype(A, /obj/machinery/hydroponics))
var/obj/machinery/hydroponics/Hydro = A
if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit)
wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state)
wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
return 1
..()
@@ -188,12 +188,12 @@
..()
/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro)
if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit)
if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state)
target = null
return
target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
Hydro.recent_bee_visit = TRUE
spawn(BEE_TRAY_RECENT_VISIT)
if(Hydro)
@@ -4,6 +4,13 @@
#define MOVING_TO_TARGET 3
#define SPINNING_COCOON 4
#define TS_AI_AGGRESSIVE 0
#define TS_AI_DEFENSIVE 1
#define TS_DAMAGE_SIMPLE 0
#define TS_DAMAGE_POISON 1
#define TS_DAMAGE_BRUTE 2
#define TS_DESC_RED "Red - Assault"
#define TS_DESC_GRAY "Gray - Ambush"
#define TS_DESC_GREEN "Green - Nurse"
@@ -7,7 +7,7 @@
/datum/action/innate/terrorspider/web/Activate()
var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
user.Web()
user.Web(0)
/datum/action/innate/terrorspider/wrap
name = "Wrap"
@@ -32,14 +32,25 @@
// ---------- PRINCE ACTIONS
/datum/action/innate/terrorspider/princesmash
/datum/action/innate/terrorspider/thickweb
name = "Thick Web"
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "stickyweb2"
/datum/action/innate/terrorspider/thickweb/Activate()
var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
user.Web(1)
// ---------- BOSS ACTIONS
/datum/action/innate/terrorspider/ventsmash
name = "Smash Welded Vent"
icon_icon = 'icons/atmos/vent_pump.dmi'
button_icon_state = "map_vent"
/datum/action/innate/terrorspider/princesmash/Activate()
var/mob/living/simple_animal/hostile/poison/terror_spider/prince/user = owner
user.DoPrinceSmash()
/datum/action/innate/terrorspider/ventsmash/Activate()
var/mob/living/simple_animal/hostile/poison/terror_spider/user = owner
user.DoVentSmash()
// ---------- QUEEN ACTIONS
@@ -50,7 +61,7 @@
/datum/action/innate/terrorspider/queen/queennest/Activate()
var/mob/living/simple_animal/hostile/poison/terror_spider/queen/user = owner
user.NestMode()
user.NestPrompt()
/datum/action/innate/terrorspider/queen/queensense
name = "Hive Sense"
@@ -81,10 +92,10 @@
// ---------- WEB
/mob/living/simple_animal/hostile/poison/terror_spider/proc/Web()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/Web(var/thick = 0)
var/turf/mylocation = loc
visible_message("<span class='notice'>[src] begins to secrete a sticky substance.</span>")
if(do_after(src, 40, target = loc))
if(do_after(src, delay_web, target = loc))
if(loc != mylocation)
return
else if(istype(loc, /turf/space))
@@ -96,6 +107,8 @@
else
var/obj/effect/spider/terrorweb/W = new /obj/effect/spider/terrorweb(loc)
W.creator_ckey = ckey
if(thick)
W.opacity = 1
/obj/effect/spider/terrorweb
name = "terror web"
@@ -112,20 +125,30 @@
if(prob(50))
icon_state = "stickyweb2"
/obj/effect/spider/terrorweb/proc/DeCloakNearby()
for(var/mob/living/simple_animal/hostile/poison/terror_spider/gray/G in view(6,src))
if(!G.ckey && G.stat != DEAD)
G.GrayDeCloak()
G.Aggro()
/obj/effect/spider/terrorweb/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /mob/living/simple_animal/hostile/poison/terror_spider))
return 1
if(istype(mover, /obj/item/projectile/terrorqueenspit))
return 1
if(isliving(mover))
var/mob/living/M = mover
if(M.lying)
return 1
if(prob(80))
to_chat(mover, "<span class='danger'>You get stuck in [src] for a moment.</span>")
var/mob/living/M = mover
M.Stun(4) // 8 seconds.
M.Weaken(4) // 8 seconds.
DeCloakNearby()
if(iscarbon(mover))
spawn(70)
qdel(src)
if(mover.loc == loc)
qdel(src)
return 1
else
return 0
@@ -188,12 +211,15 @@
if(iscarbon(L))
regen_points += regen_points_per_kill
fed++
visible_message("<span class='danger'>[src] sticks a proboscis into [L] and sucks a viscous substance out.</span>")
to_chat(src, "<span class='notice'>You feel invigorated!</span>")
else
visible_message("<span class='danger'>[src] wraps [L] in a web.</span>")
large_cocoon = 1
last_cocoon_object = 0
L.loc = C
C.pixel_x = L.pixel_x
C.pixel_y = L.pixel_y
visible_message("<span class='danger'>[src] sticks a proboscis into [L] and sucks a viscous substance out.</span>")
break
if(large_cocoon)
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
@@ -201,7 +227,7 @@
busy = 0
stop_automated_movement = 0
/mob/living/simple_animal/hostile/poison/terror_spider/prince/proc/DoPrinceSmash()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/DoVentSmash()
for(var/obj/machinery/atmospherics/unary/vent_pump/P in view(1,src))
if(P.welded)
P.welded = 0
@@ -12,6 +12,7 @@
name = "Black Terror spider"
desc = "An ominous-looking spider, black as the darkest night. It has merciless eyes, and a blood-red hourglass pattern on its back."
spider_role_summary = "Hit-and-run attacker with extremely venomous bite."
ai_target_method = TS_DAMAGE_POISON
icon_state = "terror_widow"
icon_living = "terror_widow"
@@ -37,3 +38,10 @@
else
visible_message("<span class='danger'>[src] bites [target], but cannot inject venom into their [inject_target]!</span>")
L.attack_animal(src)
if(!ckey && (!(target in enemies) || L.reagents.has_reagent("terror_black_toxin", 60)))
step_away(src,L)
step_away(src,L)
LoseTarget()
for(var/i in 0 to 3)
step_away(src, L)
visible_message("<span class='notice'>[src] warily eyes [L] from a distance.</span>")
@@ -0,0 +1,92 @@
// --------------------------------------------------------------------------------
// ----------------- TERROR SPIDERS: T5 EMPRESS OF TERROR -------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: ruling over planets of uncountable spiders, like Xenomorph Empresses.
// -------------: AI: none - this is strictly adminspawn-only and intended for RP events, coder testing, and teaching people 'how to queen'
// -------------: SPECIAL: Lay Eggs ability that allows laying queen-level eggs.
// -------------: TO FIGHT IT: run away screaming?
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress
name = "Empress of Terror"
desc = "The unholy offspring of spiders, nightmares, and lovecraft fiction."
spider_role_summary = "Adminbus spider"
ai_target_method = TS_DAMAGE_SIMPLE
maxHealth = 1000
health = 1000
melee_damage_lower = 30
melee_damage_upper = 60
move_to_delay = 5
ventcrawler = 1
idle_ventcrawl_chance = 0
ai_playercontrol_allowtype = 0
ai_type = TS_AI_AGGRESSIVE
rapid = 1
canlay = 1000
spider_tier = TS_TIER_5
var/datum/action/innate/terrorspider/queen/empress/empresslings/empresslings_action
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/handle_automated_action()
return
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/NestMode()
..()
queeneggs_action.button.name = "Empress Eggs"
queenfakelings_action.button.name = "Empress Lings"
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/LayQueenEggs()
var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE)
var/numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50)
if(eggtype == null || numlings == null)
to_chat(src, "<span class='danger'>Cancelled.</span>")
return
switch(eggtype)
if(TS_DESC_RED)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red,numlings,1)
if(TS_DESC_GRAY)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray,numlings,1)
if(TS_DESC_GREEN)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green,numlings,1)
if(TS_DESC_BLACK)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black,numlings,1)
if(TS_DESC_PURPLE)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple,numlings,0)
if(TS_DESC_WHITE)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/white,numlings,0)
if(TS_DESC_PRINCE)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince,numlings,1)
if(TS_DESC_MOTHER)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/mother,numlings,1)
if(TS_DESC_QUEEN)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/queen,numlings,1)
else
to_chat(src, "<span class='danger'>Unrecognized egg type.</span>")
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/QueenFakeLings()
var/numlings = input("How many?") as null|anything in list(10, 20, 30, 40, 50)
var/sbpc = input("%chance to be stillborn?") as null|anything in list(0, 25, 50, 75, 100)
for(var/i=0, i<numlings, i++)
var/obj/effect/spider/spiderling/terror_spiderling/S = new /obj/effect/spider/spiderling/terror_spiderling(get_turf(src))
S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/red, \
/mob/living/simple_animal/hostile/poison/terror_spider/gray, \
/mob/living/simple_animal/hostile/poison/terror_spider/green, \
/mob/living/simple_animal/hostile/poison/terror_spider/white, \
/mob/living/simple_animal/hostile/poison/terror_spider/black)
S.spider_myqueen = spider_myqueen
if(prob(sbpc))
S.stillborn = 1
if(spider_growinstantly)
S.amount_grown = 250
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/proc/EraseBrood()
for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
if(T.spider_tier < spider_tier)
T.degenerate = 1
to_chat(T, "<span class='userdanger'>Through the hivemind, the raw power of [src] floods into your body, burning it from the inside out!</span>")
for(var/obj/effect/spider/eggcluster/terror_eggcluster/T in ts_egg_list)
qdel(T)
for(var/obj/effect/spider/spiderling/terror_spiderling/T in ts_spiderling_list)
T.stillborn = 1
to_chat(src, "<span class='userdanger'>Brood will die off shortly.</span>")
@@ -2,24 +2,30 @@
// --------------------------------------------------------------------------------
// ----------------- TERROR SPIDERS: T1 GRAY TERROR -------------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: fast, weak terror spider
// -------------: SPECIAL: silences targets
// -------------: TO FIGHT IT: shoot it!
// -------------: ROLE: ambusher
// -------------: AI: hides in vents, emerges when prey is near to kill it, then hides again. Intended to scare normal crew.
// -------------: SPECIAL: invisible when on top of a vent, emerges when prey approaches or gets trapped in webs. Bite silences targets.
// -------------: TO FIGHT IT: shoot it through a window, or make it regret ambushing you
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
/mob/living/simple_animal/hostile/poison/terror_spider/gray
name = "Gray Terror spider"
desc = "An ominous-looking gray spider, it seems jittery."
spider_role_summary = "Fast-moving but weak spider."
desc = "An ominous-looking gray spider. It twitches occasionally, always seeming ready to pounce."
spider_role_summary = "Stealth spider that ambushes weak humans from vents."
ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_gray"
icon_living = "terror_gray"
icon_dead = "terror_gray_dead"
maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but silences its targets
maxHealth = 120 // same health as hunter spider, aka, pretty weak.. but its almost invisible.
health = 120
melee_damage_lower = 10
melee_damage_upper = 20
move_to_delay = 5 // normal speed
regen_points_per_hp = 2 // 50% higher regen speed
move_to_delay = 5 // slightly faster than normal
stat_attack = 1 // ensures they will target people in crit, too!
wander = 0 // wandering defeats the purpose of stealth
idle_vision_range = 3 // very low idle vision range
delay_web = 20 // double speed
/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_specialattack(mob/living/carbon/human/L, poisonable)
@@ -35,4 +41,102 @@
visible_message("<span class='danger'>[src] buries grey fangs deep into the [inject_target] of [target]!</span>")
else
visible_message("<span class='danger'>[src] bites [target], but cannot inject venom into their [inject_target]!</span>")
L.attack_animal(src)
L.attack_animal(src)
/mob/living/simple_animal/hostile/poison/terror_spider/gray/adjustBruteLoss(damage)
..(damage)
if(invisibility > 0)
GrayDeCloak()
/mob/living/simple_animal/hostile/poison/terror_spider/gray/adjustFireLoss(damage)
..(damage)
if(invisibility > 0)
GrayDeCloak()
/mob/living/simple_animal/hostile/poison/terror_spider/gray/Aggro()
GrayDeCloak()
..()
/mob/living/simple_animal/hostile/poison/terror_spider/gray/AttackingTarget()
if(invisibility > 0)
GrayDeCloak()
else
..()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/GrayCloak()
visible_message("<span class='notice'>[src] hides in the vent.</span>")
invisibility = SEE_INVISIBLE_LEVEL_ONE
icon_state = "terror_gray_cloaked"
icon_living = "terror_gray_cloaked"
if(!ckey)
vision_range = 3
idle_vision_range = 3
// Bugged, does not work yet. Also spams webs. Also doesn't look great. But... planned.
move_to_delay = 15 // while invisible, slow.
/mob/living/simple_animal/hostile/poison/terror_spider/proc/GrayDeCloak()
invisibility = 0
icon_state = "terror_gray"
icon_living = "terror_gray"
vision_range = 9
idle_vision_range = 9
move_to_delay = 5
prob_ai_hides_in_vents = 10
/mob/living/simple_animal/hostile/poison/terror_spider/gray/spider_special_action()
if(prob(prob_ai_hides_in_vents))
var/obj/machinery/atmospherics/unary/vent_pump/e = locate() in get_turf(src)
if(e)
if(!e.welded || spider_awaymission)
if(invisibility != SEE_INVISIBLE_LEVEL_ONE) // aka: 35. ghosts have 15 with no darkness, 60 with darkness. Weird...
var/list/g_turfs_webbed = ListWebbedTurfs()
var/webcount = g_turfs_webbed.len
if(webcount >= 4)
// if there are already at least 4 webs around us, then we have a good web setup already. Cloak.
GrayCloak()
// I wonder if we should settle down here forever?
var/foundqueen = 0
for(var/mob/living/H in view(src, 10))
if(istype(H, /mob/living/simple_animal/hostile/poison/terror_spider/queen))
foundqueen = 1
break
if(!foundqueen)
var/list/g_turfs_visible = ListVisibleTurfs()
if(g_turfs_visible.len >= 12)
// So long as the room isn't tiny, and it has no queen in it, sure, settle there
// since we are settled now, disable most AI behaviors so we don't waste CPU.
ai_ventcrawls = 0
ai_spins_webs = 0
ai_break_lights = 0
prob_ai_hides_in_vents = 3
visible_message("<span class='notice'>[src] finishes setting up its trap in [get_area(src)].</span>")
else
var/list/g_turfs_valid = ListValidTurfs()
var/turfcount = g_turfs_valid.len
if(turfcount == 0)
// if there is literally nowhere else we could put a web, cloak.
GrayCloak()
else
// otherwise, pick one of the valid turfs with no web to create a web there.
new /obj/effect/spider/terrorweb(pick(g_turfs_valid))
visible_message("<span class='notice'>[src] spins a web.</span>")
else
if(invisibility == SEE_INVISIBLE_LEVEL_ONE)
// if our vent is welded, decloak
GrayDeCloak()
else
if(invisibility == SEE_INVISIBLE_LEVEL_ONE)
// if there is no vent under us, and we are cloaked, decloak
GrayDeCloak()
var/vdistance = 99
var/temp_vent = null
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
if(!v.welded)
if(get_dist(src,v) < vdistance)
temp_vent = v
vdistance = get_dist(src,v)
if(temp_vent)
if(get_dist(src,temp_vent) > 0 && get_dist(src,temp_vent) < 5)
step_to(src,temp_vent)
// if you're bumped off your vent, try to get back to it
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T1 GREEN TERROR ------------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: reproduction
// -------------: AI: after it kills you, it webs you and lays new terror eggs on your body
// -------------: SPECIAL: can also create webs, web normal objects, etc
// -------------: TO FIGHT IT: kill it however you like - just don't die to it!
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,7 +12,7 @@
name = "Green Terror spider"
desc = "An ominous-looking green spider. It has a small egg-sac attached to it, and dried blood stains on its carapace."
spider_role_summary = "Average melee spider that webs its victims and lays more spider eggs"
ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_green"
icon_living = "terror_green"
icon_dead = "terror_green_dead"
@@ -20,7 +21,6 @@
melee_damage_lower = 10
melee_damage_upper = 20
var/feedings_to_lay = 2
var/datum/action/innate/terrorspider/greeneggs/greeneggs_action
@@ -34,7 +34,7 @@
if(E)
to_chat(src, "<span class='notice'>There is already a cluster of eggs here!</span>")
else if(fed < feedings_to_lay)
to_chat(src, "<span class='warning'>You must wrap more prey before you can do this!</span>")
to_chat(src, "<span class='warning'>You must wrap more humanoid prey before you can do this!</span>")
else
visible_message("<span class='notice'>[src] begins to lay a cluster of eggs.</span>")
if(prob(33))
@@ -45,6 +45,43 @@
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 1, 1)
fed -= feedings_to_lay
/mob/living/simple_animal/hostile/poison/terror_spider/green/spider_special_action()
if(cocoon_target)
if(get_dist(src, cocoon_target) <= 1)
spider_steps_taken = 0
DoWrap()
else
if(spider_steps_taken > spider_max_steps)
spider_steps_taken = 0
cocoon_target = null
busy = 0
stop_automated_movement = 0
else
spider_steps_taken++
CreatePath(cocoon_target)
step_to(src,cocoon_target)
if(spider_debug)
visible_message("<span class='notice'>[src] moves towards [cocoon_target] to cocoon it.</span>")
else if(fed >= feedings_to_lay)
DoLayGreenEggs()
else if(world.time > (last_cocoon_object + freq_cocoon_object))
last_cocoon_object = world.time
var/list/can_see = view(src, 10)
for(var/mob/living/C in can_see)
if(C.stat == DEAD && !isterrorspider(C) && !C.anchored)
spider_steps_taken = 0
cocoon_target = C
return
for(var/obj/O in can_see)
if(O.anchored)
continue
if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
if(!istype(O, /obj/item/weapon/paper))
cocoon_target = O
stop_automated_movement = 1
spider_steps_taken = 0
return
/mob/living/simple_animal/hostile/poison/terror_spider/green/spider_specialattack(mob/living/carbon/human/L, poisonable)
if(!poisonable)
..()
@@ -18,6 +18,21 @@
hsline += " AI "
to_chat(src,hsline)
/mob/living/simple_animal/hostile/poison/terror_spider/proc/SetHiveCommand(set_ai, set_ventcrawl)
var/numspiders = 0
for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
if(spider_awaymission && !T.spider_awaymission)
continue
else if(!spider_awaymission && T.spider_awaymission)
continue
numspiders += 1
if(spider_tier >= T.spider_tier)
if(T.ai_type != set_ai)
T.ai_type = set_ai
if(T.idle_ventcrawl_chance != set_ventcrawl)
T.idle_ventcrawl_chance = set_ventcrawl
return numspiders
/mob/living/simple_animal/hostile/poison/terror_spider/proc/CountSpiders()
var/numspiders = 0
for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T3 MOTHER OF TERROR --------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: living schmuck bait
// -------------: AI: no special ai
// -------------: SPECIAL: spawns an ungodly number of spiderlings when killed
// -------------: TO FIGHT IT: don't! Just leave it alone! It is harmless by itself... but god help you if you aggro it.
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,7 +12,7 @@
name = "Mother of Terror spider"
desc = "An enormous spider. Hundreds of tiny spiderlings are crawling all over it. Their beady little eyes all stare at you. The horror!"
spider_role_summary = "Schmuck bait. Extremely weak in combat, but spawns many spiderlings when it dies."
ai_target_method = TS_DAMAGE_SIMPLE
icon_state = "terror_gray2"
icon_living = "terror_gray2"
icon_dead = "terror_gray2_dead"
@@ -20,12 +21,16 @@
melee_damage_lower = 10
melee_damage_upper = 20
move_to_delay = 5
idle_ventcrawl_chance = 5
spider_tier = TS_TIER_3
spider_opens_doors = 2
var/canspawn = 1
var/datum/action/innate/terrorspider/ventsmash/ventsmash_action
/mob/living/simple_animal/hostile/poison/terror_spider/mother/New()
..()
ventsmash_action = new()
ventsmash_action.Grant(src)
/mob/living/simple_animal/hostile/poison/terror_spider/mother/death(gibbed)
if(canspawn)
@@ -37,6 +42,8 @@
S.stillborn = 1
else if(prob(10))
S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/black, /mob/living/simple_animal/hostile/poison/terror_spider/green)
S.amount_grown = 50 // double speed growth
S.immediate_ventcrawl = 1
visible_message("<span class='userdanger'>[src] breaks apart, the many spiders on its back scurrying everywhere!</span>")
degenerate = 1
..()
@@ -12,33 +12,35 @@
name = "Prince of Terror spider"
desc = "An enormous, terrifying spider. It looks like it is judging everything it sees. Its hide seems armored, and it bears the scars of many battles."
spider_role_summary = "Miniboss terror spider. Lightning bruiser."
ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_allblack"
icon_living = "terror_allblack"
icon_dead = "terror_allblack_dead"
maxHealth = 600 // 30 laser shots
health = 600
regen_points_per_hp = 6 // double the normal - IE halved regen speed
melee_damage_lower = 20
melee_damage_upper = 30
melee_damage_lower = 30
melee_damage_upper = 40
move_to_delay = 4 // faster than normal
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
loot = list(/obj/item/clothing/accessory/medal)
idle_ventcrawl_chance = 0
spider_tier = TS_TIER_3
spider_opens_doors = 2
var/datum/action/innate/terrorspider/princesmash/princesmash_action
var/datum/action/innate/terrorspider/thickweb/thickweb_action
/mob/living/simple_animal/hostile/poison/terror_spider/prince/New()
..()
princesmash_action = new()
princesmash_action.Grant(src)
thickweb_action = new()
thickweb_action.Grant(src)
/mob/living/simple_animal/hostile/poison/terror_spider/prince/death(gibbed)
if(!hasdied)
if(spider_uo71)
UnlockBlastDoors("UO71_SciStorage")
..()
/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(mob/living/carbon/human/L)
if(prob(15))
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T2 PURPLE TERROR -----------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: guarding queen nests
// -------------: AI: dies if too far from queen
// -------------: SPECIAL: chance to stun on hit
// -------------: TO FIGHT IT: shoot it from range, bring friends!
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,7 +12,7 @@
name = "Purple Terror spider"
desc = "An ominous-looking purple spider. It looks about warily, as if waiting for something."
spider_role_summary = "Guards the nest of the Queen of Terror."
ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_purple"
icon_living = "terror_purple"
icon_dead = "terror_purple_dead"
@@ -20,17 +21,28 @@
melee_damage_lower = 15
melee_damage_upper = 25
move_to_delay = 6
spider_tier = TS_TIER_2
spider_opens_doors = 2
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
idle_ventcrawl_chance = 0 // stick to the queen!
var/dcheck_counter = 0
var/queen_visible = 1
var/cycles_noqueen = 0
/mob/living/simple_animal/hostile/poison/terror_spider/purple/death(gibbed)
if(spider_myqueen)
var/mob/living/simple_animal/hostile/poison/terror_spider/queen/Q = spider_myqueen
if(Q.stat != DEAD && !Q.ckey)
if(get_dist(src,Q) > 20)
if(!degenerate && !Q.degenerate)
degenerate = 1
Q.DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple,1,0)
visible_message("<span class='notice'>[src] chitters in the direction of [Q]!</span>")
. = ..()
/mob/living/simple_animal/hostile/poison/terror_spider/purple/spider_specialattack(mob/living/carbon/human/L, poisonable)
if(cycles_noqueen < 6 && prob(10))
visible_message("<span class='danger'>[src] rams into [L], knocking them to the floor!</span>")
@@ -3,6 +3,7 @@
// ----------------- TERROR SPIDERS: T4 QUEEN OF TERROR ---------------------------
// --------------------------------------------------------------------------------
// -------------: ROLE: gamma-level threat to the whole station, like a blob
// -------------: AI: builds a nest, lays many eggs, attempts to take over the station
// -------------: SPECIAL: spins webs, breaks lights, breaks cameras, webs objects, lays eggs, commands other spiders...
// -------------: TO FIGHT IT: bring an army, and take no prisoners. Mechs and/or decloner guns are a very good idea.
// -------------: SPRITES FROM: FoS, http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
@@ -11,12 +12,13 @@
name = "Queen of Terror spider"
desc = "An enormous, terrifying spider. Its egg sac is almost as big as its body, and teeming with spider eggs!"
spider_role_summary = "Commander of the spider forces. Lays eggs, directs the brood."
ai_target_method = TS_DAMAGE_SIMPLE
icon_state = "terror_queen"
icon_living = "terror_queen"
icon_dead = "terror_queen_dead"
maxHealth = 200
health = 200
regen_points_per_tick = 3
melee_damage_lower = 10
melee_damage_upper = 20
move_to_delay = 15 // yeah, this is very slow, but
@@ -29,32 +31,31 @@
var/neststep = 0
var/hasnested = 0
var/spider_max_per_nest = 20 // above this, queen stops spawning more, and declares war.
var/canlay = 0 // main counter for egg-laying ability! # = num uses, incremented at intervals
var/canlay = 4 // main counter for egg-laying ability! # = num uses, incremented at intervals
var/eggslaid = 0
var/spider_can_fakelings = 3 // spawns defective spiderlings that don't grow up, used to freak out crew, atmosphere
idle_ventcrawl_chance = 0
force_threshold = 18 // outright immune to anything of force under 18, this means welders can't hurt it, only guns can
ranged = 1
retreat_distance = 5
minimum_distance = 5
projectilesound = 'sound/weapons/pierce.ogg'
projectiletype = /obj/item/projectile/terrorqueenspit
spider_tier = TS_TIER_4
spider_opens_doors = 2
loot = list(/obj/item/clothing/accessory/medal)
var/datum/action/innate/terrorspider/queen/queennest/queennest_action
var/datum/action/innate/terrorspider/queen/queensense/queensense_action
var/datum/action/innate/terrorspider/queen/queeneggs/queeneggs_action
var/datum/action/innate/terrorspider/queen/queenfakelings/queenfakelings_action
var/datum/action/innate/terrorspider/ventsmash/ventsmash_action
/mob/living/simple_animal/hostile/poison/terror_spider/queen/New()
..()
queennest_action = new()
queennest_action.Grant(src)
ventsmash_action = new()
ventsmash_action.Grant(src)
spider_myqueen = src
if(spider_awaymission)
spider_growinstantly = 1
@@ -65,10 +66,15 @@
if(.) // if mob is NOT dead
if(ckey && canlay < 12 && hasnested) // max 12 eggs worth stored at any one time, realistically that's tons.
if(world.time > (spider_lastspawn + spider_spawnfrequency))
canlay++
if(eggslaid >= 20)
canlay += 3
else if(eggslaid >= 10)
canlay += 2
else
canlay++
spider_lastspawn = world.time
if(canlay == 1)
to_chat(src, "<span class='notice'>You are able to lay eggs again.</span>")
to_chat(src, "<span class='notice'>You have an egg available to lay.</span>")
else if(canlay == 12)
to_chat(src, "<span class='notice'>You have [canlay] eggs available to lay. You won't grow any more eggs until you lay some of your existing ones.</span>")
else
@@ -76,6 +82,9 @@
/mob/living/simple_animal/hostile/poison/terror_spider/queen/death(gibbed)
if(!hasdied)
SetHiveCommand(0, 15) // Hive becomes very aggressive.
if(spider_uo71)
UnlockBlastDoors("UO71_Caves")
// When a queen dies, so do her player-controlled purple-type guardians. Intended as a motivator for purples to ensure they guard her.
for(var/mob/living/simple_animal/hostile/poison/terror_spider/purple/P in ts_spiderlist)
if(ckey)
@@ -84,6 +93,134 @@
P.degenerate = 1
..()
/mob/living/simple_animal/hostile/poison/terror_spider/queen/Retaliate()
..()
for(var/mob/living/simple_animal/hostile/poison/terror_spider/T in ts_spiderlist)
T.enemies |= enemies
/mob/living/simple_animal/hostile/poison/terror_spider/queen/handle_automated_action()
..()
if(!stat && !ckey && AIStatus != AI_OFF && !target && !path_to_vent)
switch(neststep)
if(0)
// we have no nest :(
var/ok_to_nest = 1
var/area/new_area = get_area(loc)
if(new_area)
if(findtext(new_area.name, "hall"))
ok_to_nest = 0
// nesting in a hallway would be very stupid - crew would find and kill you almost instantly
var/numhostiles = 0
for(var/mob/living/H in oview(10, src))
if(!istype(H, /mob/living/simple_animal/hostile/poison/terror_spider))
if(H.stat != DEAD)
numhostiles += 1
// nesting RIGHT NEXT TO SOMEONE is even worse
if(numhostiles > 0)
ok_to_nest = 0
var/vdistance = 99
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(10, src))
if(!v.welded)
if(get_dist(src, v) < vdistance)
entry_vent = v
vdistance = get_dist(src, v)
if(!entry_vent)
ok_to_nest = 0
// don't nest somewhere with no vent - your brood won't be able to get out!
if(ok_to_nest && entry_vent)
nest_vent = entry_vent
neststep = 1
visible_message("<span class='danger'>\The [src] settles down, starting to build a nest.</span>")
else if(entry_vent)
if(!path_to_vent)
visible_message("<span class='danger'>\The [src] looks around warily - then seeks a better nesting ground.</span>")
path_to_vent = 1
else
visible_message("<span class='danger'>\The [src] looks around, searching for the vent that should be there, but isn't. A bluespace portal forms on her, and she is gone.</span>")
qdel(src)
new /obj/effect/portal(get_turf(loc))
if(1)
if(world.time > (lastnestsetup + nestfrequency))
lastnestsetup = world.time
neststep = 2
NestMode()
if(2)
if(world.time > (lastnestsetup + nestfrequency))
lastnestsetup = world.time
spider_lastspawn = world.time
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, 2, 0)
neststep = 3
if(3)
if(world.time > (spider_lastspawn + spider_spawnfrequency))
if(prob(20))
var/obj/effect/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
if(!N)
spider_lastspawn = world.time
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 0)
neststep = 4
if(4)
if(world.time > (spider_lastspawn + spider_spawnfrequency))
if(prob(20))
var/obj/effect/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
if(!N)
spider_lastspawn = world.time
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 1)
neststep = 5
if(5)
if(world.time > (spider_lastspawn + spider_spawnfrequency))
if(prob(20))
var/obj/effect/spider/eggcluster/terror_eggcluster/N = locate() in get_turf(src)
if(!N)
if(!spider_awaymission)
QueenFakeLings()
spider_lastspawn = world.time
if(prob(33))
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/gray, 2, 1)
else if(prob(50))
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 1)
else
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
var/spidercount = CountSpiders()
if(spidercount >= spider_max_per_nest) // station overwhelmed!
neststep = 6
if(6)
if(world.time > (spider_lastspawn + spider_spawnfrequency))
spider_lastspawn = world.time
// go hostile, EXTERMINATE MODE.
SetHiveCommand(0, 15) // AI=0 (attack everyone), ventcrawl=15%/tick
var/numspiders = CountSpiders()
if(numspiders < spider_max_per_nest)
if(prob(33))
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, 2, 1)
else if(prob(50))
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 0)
else
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
else if(spider_awaymission)
neststep = 7
spider_spawnfrequency = spider_spawnfrequency_stable
// if we're an away mission queen... don't keep spawning spiders at high rates. Away team should have a chance.
if(7)
if(world.time > (spider_lastspawn + spider_spawnfrequency))
spider_lastspawn = world.time
var/numspiders = CountSpiders()
if(numspiders < spider_max_per_nest)
// someone is killing my children...
if(prob(25))
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/black, 2, 1)
else if(prob(33))
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, 2, 0)
else if(prob(50))
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/green, 2, 1)
else
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, 2, 0)
neststep = 6
/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/NestPrompt()
var/confirm = alert(src, "Are you sure you want to nest? You will be able to lay eggs, and smash walls, but not ventcrawl.","Nest?","Yes","No")
if(confirm == "Yes")
NestMode()
/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/NestMode()
queeneggs_action = new()
queeneggs_action.Grant(src)
@@ -94,6 +231,7 @@
queennest_action.Remove(src)
hasnested = 1
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
DoQueenScreech(8, 100, 8, 100)
MassFlicker()
@@ -159,8 +297,8 @@
if(eggtype == null || numlings == null)
to_chat(src, "<span class='danger'>Cancelled.</span>")
return
//spider_lastspawn = world.time // don't think we actually need this, if queen is laying manually canlay controls her rate.
canlay -= numlings
eggslaid += numlings
if(eggtype == TS_DESC_RED)
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/red, numlings, 1)
else if(eggtype == TS_DESC_GRAY)
@@ -184,6 +322,9 @@
C.toggle_cam(src, 0)
/mob/living/simple_animal/hostile/poison/terror_spider/queen/proc/QueenFakeLings()
if(eggslaid < 10)
to_chat(src, "<span class='danger'>You must lay at least 10 eggs before doing this.</span>")
return
if(spider_can_fakelings)
spider_can_fakelings--
var/numlings = 15
@@ -210,5 +351,5 @@
if(L.reagents)
if(L.can_inject(null, 0, "chest", 0))
L.reagents.add_reagent("terror_queen_toxin", 15)
if(!istype(L, /mob/living/simple_animal/hostile/poison/terror_spider))
if(!isterrorspider(L))
L.adjustToxLoss(30)
@@ -12,9 +12,8 @@
/mob/living/simple_animal/hostile/poison/terror_spider/red
name = "Red Terror spider"
desc = "An ominous-looking red spider, it has eight beady red eyes, and nasty, big, pointy fangs! It looks like it has a vicious streak a mile wide."
spider_role_summary = "High health, high damage, very slow, melee juggernaut"
ai_target_method = TS_DAMAGE_BRUTE
icon_state = "terror_red"
icon_living = "terror_red"
icon_dead = "terror_red_dead"
@@ -14,6 +14,8 @@
faction = list("terrorspiders")
var/spider_myqueen = null
var/use_vents = 1
var/list/enemies = list()
var/immediate_ventcrawl = 0
/obj/effect/spider/spiderling/terror_spiderling/New()
..()
@@ -72,8 +74,10 @@
var/list/nearby = oview(10, src)
if(nearby.len)
var/target_atom = pick(nearby)
walk_to(src, target_atom)
else if(prob(10) && use_vents)
if(!istype(get_turf(target_atom),/turf/space))
walk_to(src, target_atom)
else if(immediate_ventcrawl || (prob(10) && use_vents))
immediate_ventcrawl = 0
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
if(!v.welded)
entry_vent = v
@@ -91,6 +95,7 @@
S.faction = faction
S.spider_myqueen = spider_myqueen
S.master_commander = master_commander
S.enemies = enemies
qdel(src)
// --------------------------------------------------------------------------------
@@ -106,6 +111,7 @@
C.faction = faction
C.spider_myqueen = spider_myqueen
C.master_commander = master_commander
C.enemies = enemies
if(spider_growinstantly)
C.amount_grown = 250
C.spider_growinstantly = 1
@@ -122,6 +128,7 @@
var/spiderling_type = null
var/spiderling_number = 1
var/spiderling_ventcrawl = 1
var/list/enemies = list()
/obj/effect/spider/eggcluster/terror_eggcluster/New()
..()
@@ -162,6 +169,7 @@
S.faction = faction
S.spider_myqueen = spider_myqueen
S.master_commander = master_commander
S.enemies = enemies
if(spider_growinstantly)
S.amount_grown = 250
var/rnum = 5 - spiderling_number
@@ -0,0 +1,310 @@
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: TARGETING CODE -----------------------
// --------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/poison/terror_spider/ListTargets()
var/list/targets1 = list()
var/list/targets2 = list()
var/list/targets3 = list()
for(var/mob/living/H in view(src, vision_range))
if(H.stat == DEAD)
continue
if(H.flags & GODMODE)
continue
if(H.stat == UNCONSCIOUS && !stat_attack)
continue
if(ai_type == TS_AI_DEFENSIVE && !(H in enemies))
continue
if(isterrorspider(H))
if(H in enemies)
targets3 += H
continue
if(iscarbon(H))
var/mob/living/carbon/C = H
if(IsInfected(C)) // only target the infected if they're attacking us. Even then, lowest priority.
if(C in enemies)
targets3 += C
continue
else if(C.reagents.has_reagent("terror_black_toxin",60))
// only target those dying of black spider venom if they are close, or our enemy
if(get_dist(src,C) <= 2 || (C in enemies))
targets2 += C
else
// Target prioritization by spider type. BRUTE spiders prioritize lower armor values, POISON spiders prioritize poisonable targets
if(ai_target_method == TS_DAMAGE_BRUTE)
var/theirarmor = C.getarmor(type = "melee")
// Example values: Civilian: 2, Engineer w/ Hardsuit: 10, Sec Officer with armor: 19, HoS: 48, Deathsquad: 80
if(theirarmor < 10)
targets1 += C
else if(C in enemies)
if(theirarmor < 30)
targets2 += C
else
targets3 += C
else
targets3 += C
else if(ai_target_method == TS_DAMAGE_POISON)
if(C.can_inject(null,0,"chest",0))
targets1 += C
else if(C in enemies)
targets2 += C
else
targets3 += C
else
// TS_DAMAGE_SIMPLE
if(C in enemies)
targets2 += C
else
targets3 += C
else
if(istype(H,/mob/living/simple_animal))
var/mob/living/simple_animal/S = H
if(S.force_threshold > melee_damage_upper)
continue
if(H in enemies)
targets2 += H
else
targets3 += H
if(health < maxHealth)
// if we're hurt, and ONLY if we're hurt, do the additional check for mechs/space pods. Save processing time.
for(var/obj/mecha/M in view(src, vision_range))
if(get_dist(M, src) <= 2)
targets2 += M
else
targets3 += M
for(var/obj/spacepod/S in view(src, vision_range))
targets3 += S
if(targets1.len)
return targets1
if(targets2.len)
return targets2
return targets3
/mob/living/simple_animal/hostile/poison/terror_spider/LoseTarget()
if(target && isliving(target))
var/mob/living/T = target
if(T.stat > 0)
killcount++
regen_points += regen_points_per_kill
attackstep = 0
attackcycles = 0
..()
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: AI BEHAVIOR CODE -------------------------
// --------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/poison/terror_spider/handle_automated_action()
if (stat || ckey)
return ..()
if(AIStatus != AI_OFF && !target)
var/my_ventcrawl_freq = freq_ventcrawl_idle
if(ts_count_dead > 0)
if(world.time < (ts_death_last + ts_death_window))
my_ventcrawl_freq = freq_ventcrawl_combat
// First, check for general actions that any spider could take.
if(path_to_vent)
if(entry_vent)
if(spider_steps_taken > spider_max_steps)
path_to_vent = 0
stop_automated_movement = 0
spider_steps_taken = 0
path_to_vent = 0
entry_vent = null
else if(get_dist(src, entry_vent) <= 1)
path_to_vent = 0
stop_automated_movement = 1
spider_steps_taken = 0
spawn(50)
stop_automated_movement = 0
TSVentCrawlRandom(entry_vent)
else
spider_steps_taken++
CreatePath(entry_vent)
step_to(src,entry_vent)
if(spider_debug > 0)
visible_message("<span class='notice'>[src] moves towards the vent [entry_vent].</span>")
else
path_to_vent = 0
else if(ai_break_lights && world.time > (last_break_light + freq_break_light))
last_break_light = world.time
for(var/obj/machinery/light/L in range(1, src))
if(!L.status)
step_to(src,L)
L.on = 1
L.broken()
L.do_attack_animation(src)
visible_message("<span class='danger'>[src] smashes the [L.name].</span>")
break
else if(ai_spins_webs && world.time > (last_spins_webs + freq_spins_webs))
last_spins_webs = world.time
var/obj/effect/spider/terrorweb/T = locate() in get_turf(src)
if(!T)
new /obj/effect/spider/terrorweb(get_turf(src))
visible_message("<span class='notice'>[src] puts up some spider webs.</span>")
else if(ai_ventcrawls && world.time > (last_ventcrawl_time + my_ventcrawl_freq))
if(prob(idle_ventcrawl_chance))
last_ventcrawl_time = world.time
var/vdistance = 99
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(10, src))
if(!v.welded)
if(get_dist(src,v) < vdistance)
entry_vent = v
vdistance = get_dist(src,v)
if(entry_vent)
path_to_vent = 1
else
// If none of the general actions apply, check for class-specific actions.
spider_special_action()
else if(AIStatus != AI_OFF && target)
CreatePath(target)
..()
/mob/living/simple_animal/hostile/poison/terror_spider/adjustBruteLoss(damage)
..(damage)
Retaliate()
/mob/living/simple_animal/hostile/poison/terror_spider/adjustFireLoss(damage)
..(damage)
Retaliate()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/Retaliate()
var/list/around = oview(src, 7)
var/list/ts_nearby = list()
for(var/atom/movable/A in around)
if(A in enemies)
continue
if(isterrorspider(A))
ts_nearby += A
continue
if(isliving(A))
var/mob/living/M = A
if(!("terrorspiders" in M.faction))
enemies |= M
visible_message("<span class='danger'>[src] glares at [M]!</span>")
else if(istype(A, /obj/mecha))
var/obj/mecha/M = A
if(M.occupant)
enemies |= M
enemies |= M.occupant
else if(istype(A, /obj/spacepod))
var/obj/spacepod/M = A
if(M.pilot)
enemies |= M
enemies |= M.pilot
for(var/mob/living/simple_animal/hostile/poison/terror_spider/H in ts_nearby)
var/retaliate_faction_check = 0
for(var/F in faction)
if(F in H.faction)
retaliate_faction_check = 1
break
if(retaliate_faction_check && !attack_same && !H.attack_same)
H.enemies |= enemies
return 0
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: PATHING CODE -----------------------------
// --------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/poison/terror_spider/proc/CreatePath(mygoal)
var/m2 = get_turf(src)
if(m2 == mylocation)
chasecycles++
ClearObstacle(get_turf(mygoal))
if(chasecycles >= 2)
chasecycles = 0
if(spider_opens_doors)
var/tgt_dir = get_dir(src,mygoal)
for(var/obj/machinery/door/airlock/A in view(1, src))
if(A.density)
try_open_airlock(A)
for(var/obj/machinery/door/firedoor/F in view(1, src))
if(tgt_dir == get_dir(src,F) && F.density && !F.welded)
visible_message("<span class='danger'>[src] pries open the firedoor!</span>")
F.open()
else
mylocation = m2
chasecycles = 0
/mob/living/simple_animal/hostile/poison/terror_spider/proc/ClearObstacle(turf/target_turf)
var/list/valid_obstacles = list(/obj/structure/window, /obj/structure/closet, /obj/structure/table, /obj/structure/grille, /obj/structure/rack, /obj/machinery/door/window)
for(var/dir in cardinal) // North, South, East, West
var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
if(is_type_in_list(obstacle, valid_obstacles))
obstacle.attack_animal(src)
/mob/living/simple_animal/hostile/poison/terror_spider/proc/TSVentCrawlRandom(/var/entry_vent)
if(entry_vent)
if(get_dist(src, entry_vent) <= 2)
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.parent.other_atmosmch)
vents.Add(temp_vent)
if(!vents.len)
entry_vent = null
return
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
visible_message("<B>[src] scrambles into the ventillation ducts!</B>", "<span class='notice'>You hear something squeezing through the ventilation ducts.</span>")
spawn(rand(20,60))
var/original_location = loc
forceMove(exit_vent)
var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
spawn(travel_time)
if(!exit_vent || exit_vent.welded)
forceMove(original_location)
entry_vent = null
return
if(prob(50))
audible_message("<span class='notice'>You hear something squeezing through the ventilation ducts.</span>")
spawn(travel_time)
if(!exit_vent || exit_vent.welded)
forceMove(original_location)
entry_vent = null
return
forceMove(exit_vent.loc)
entry_vent = null
var/area/new_area = get_area(loc)
if(new_area)
new_area.Entered(src)
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: ENVIRONMENT CODE -------------------------
// --------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListValidTurfs()
var/list/potentials = list()
for(var/turf/simulated/T in oview(3,get_turf(src)))
if(T.density == 0 && get_dist(get_turf(src),T) == 3)
var/obj/effect/spider/terrorweb/W = locate() in T
if(!W)
var/obj/structure/grille/G = locate() in T
if(!G)
var/obj/structure/window/O = locate() in T
if(!O)
potentials += T
return potentials
/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListWebbedTurfs()
var/list/webbed = list()
for(var/turf/simulated/T in oview(3,get_turf(src)))
if(T.density == 0 && get_dist(get_turf(src),T) == 3)
var/obj/effect/spider/terrorweb/W = locate() in T
if(W)
webbed += T
return webbed
/mob/living/simple_animal/hostile/poison/terror_spider/proc/ListVisibleTurfs()
var/list/vturfs = list()
for(var/turf/simulated/T in oview(7,get_turf(src)))
if(T.density == 0)
vturfs += T
return vturfs
// --------------------------------------------------------------------------------
// --------------------- TERROR SPIDERS: MISC AI CODE -----------------------------
// --------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/poison/terror_spider/proc/UnlockBlastDoors(target_id_tag)
for(var/obj/machinery/door/poddoor/P in airlocks)
if(P.density && P.id_tag == target_id_tag && P.z == z && !P.operating)
P.open()
@@ -1,4 +1,3 @@
var/global/list/ts_ckey_blacklist = list()
var/global/ts_count_dead = 0
var/global/ts_count_alive_awaymission = 0
@@ -43,6 +42,15 @@ var/global/list/ts_spiderling_list = list()
// Ventcrawling
ventcrawler = 1 // allows player ventcrawling
var/ai_ventcrawls = 1
var/idle_ventcrawl_chance = 3 // default 3% chance to ventcrawl when not in combat to a random exit vent
var/freq_ventcrawl_combat = 1800 // 3 minutes
var/freq_ventcrawl_idle = 9000 // 15 minutes
var/last_ventcrawl_time = -9000 // Last time the spider crawled. Used to prevent excessive crawling. Setting to freq*-1 ensures they can crawl once on spawn.
// AI movement tracking
var/spider_steps_taken = 0 // leave at 0, its a counter for ai steps taken.
var/spider_max_steps = 15 // after we take X turns trying to do something, give up!
// Speech
speak_chance = 0 // quiet but deadly
@@ -71,15 +79,35 @@ var/global/list/ts_spiderling_list = list()
aggro_vision_range = 10
see_in_dark = 10
nightvision = 1
vision_type = new /datum/vision_override/nightvision/thermals/ling_augmented_eyesight
see_invisible = 5
sight = SEE_MOBS
// AI aggression settings
var/ai_type = TS_AI_AGGRESSIVE // 0 = aggressive to everyone, 1 = defends self only
var/ai_target_method = TS_DAMAGE_SIMPLE
// AI player control by ghosts
var/ai_playercontrol_allowtype = 1 // if 0, this specific class of spider is not player-controllable. Default set in code for each class, cannot be changed.
var/ai_break_lights = 1 // AI lightbreaking behavior
var/freq_break_light = 600
var/last_break_light = 0 // leave this, changed by procs.
var/ai_spins_webs = 1 // AI web-spinning behavior
var/freq_spins_webs = 600
var/last_spins_webs = 0 // leave this, changed by procs.
var/delay_web = 40 // delay between starting to spin web, and finishing
var/freq_cocoon_object = 1200 // two minutes between each attempt
var/last_cocoon_object = 0 // leave this, changed by procs.
var/prob_ai_hides_in_vents = 15 // probabily of a gray spider hiding in a vent
var/spider_opens_doors = 1 // all spiders can open firedoors (they have no security). 1 = can open depowered doors. 2 = can open powered doors
faction = list("terrorspiders")
var/spider_awaymission = 0 // if 1, limits certain behavior in away missions
var/spider_uo71 = 0 // if 1, spider is in the UO71 away mission
var/spider_unlock_id_tag = "" // if defined, unlock awaymission blast doors with this tag on death
var/spider_role_summary = "UNDEFINED"
var/spider_placed = 0
@@ -90,16 +118,18 @@ var/global/list/ts_spiderling_list = list()
var/obj/machinery/atmospherics/unary/vent_pump/nest_vent // home vent, usually used by queens
var/fed = 0
var/travelling_in_vent = 0
var/list/enemies = list()
var/path_to_vent = 0
var/killcount = 0
var/busy = 0 // leave this alone!
var/spider_tier = TS_TIER_1 // 1 for red,gray,green. 2 for purple,black,white, 3 for prince, mother. 4 for queen
var/hasdied = 0
var/list/spider_special_drops = list()
var/attackstep = 0
var/attackcycles = 0
var/spider_myqueen = null
var/mylocation = null
var/chasecycles = 0
var/last_cocoon_object = 0 // leave this, changed by procs.
var/datum/action/innate/terrorspider/web/web_action
var/datum/action/innate/terrorspider/wrap/wrap_action
@@ -124,13 +154,15 @@ var/global/list/ts_spiderling_list = list()
/mob/living/simple_animal/hostile/poison/terror_spider/AttackingTarget()
if(isterrorspider(target))
if(target in enemies)
enemies -= target
var/mob/living/simple_animal/hostile/poison/terror_spider/T = target
if(T.spider_tier > spider_tier)
visible_message("<span class='notice'>[src] bows in respect for the terrifying presence of [target].</span>")
visible_message("<span class='notice'>[src] cowers before [target].</span>")
else if(T.spider_tier == spider_tier)
visible_message("<span class='notice'>[src] nuzzles [target].</span>")
else if(T.spider_tier < spider_tier && spider_tier >= 4)
visible_message("<span class='notice'>[src] gives [target] a stern look.</span>")
target.attack_animal(src)
else
visible_message("<span class='notice'>[src] harmlessly nuzzles [target].</span>")
T.CheckFaction()
@@ -223,6 +255,15 @@ var/global/list/ts_spiderling_list = list()
if(is_away_level(z))
spider_awaymission = 1
ts_count_alive_awaymission++
if(spider_tier >= 3)
ai_ventcrawls = 0 // means that pre-spawned bosses on away maps won't ventcrawl. Necessary to keep prince/mother in one place.
if(istype(get_area(src), /area/awaymission/UO71)) // if we are playing the away mission with our special spiders...
spider_uo71 = 1
if(world.time < 600)
// these are static spiders, specifically for the UO71 away mission, make them stay in place
ai_ventcrawls = 0
spider_placed = 1
wander = 0
else
ts_count_alive_station++
// after 30 seconds, assuming nobody took control of it yet, offer it to ghosts.
@@ -1,4 +1,3 @@
// --------------------------------------------------------------------------------
// ----------------- TERROR SPIDERS: T2 WHITE TERROR ------------------------------
// --------------------------------------------------------------------------------
@@ -12,12 +11,12 @@
name = "White Terror spider"
desc = "An ominous-looking white spider, its ghostly eyes and vicious-looking fangs are the stuff of nightmares."
spider_role_summary = "Rare, bite-and-run spider that infects hosts with spiderlings"
ai_target_method = TS_DAMAGE_POISON
icon_state = "terror_white"
icon_living = "terror_white"
icon_dead = "terror_white_dead"
maxHealth = 100
health = 100
maxHealth = 200
health = 200
melee_damage_lower = 5
melee_damage_upper = 15
move_to_delay = 4
@@ -25,6 +24,18 @@
loot = list(/obj/item/clothing/accessory/medal)
/mob/living/simple_animal/hostile/poison/terror_spider/white/LoseTarget()
stop_automated_movement = 0
attackstep = 0
attackcycles = 0
..()
/mob/living/simple_animal/hostile/poison/terror_spider/white/death(gibbed)
if(!hasdied)
if(spider_uo71)
UnlockBlastDoors("UO71_Bridge")
..()
/mob/living/simple_animal/hostile/poison/terror_spider/white/spider_specialattack(mob/living/carbon/human/L, poisonable)
if(!poisonable)
..()
@@ -35,6 +46,13 @@
if(!IsInfected(L))
visible_message("<span class='danger'>[src] buries its long fangs deep into the [inject_target] of [L]!</span>")
new /obj/item/organ/internal/body_egg/terror_eggs(L)
if(!ckey)
LoseTarget()
walk_away(src,L,2,1)
else if(prob(25))
visible_message("<span class='danger'>[src] pounces on [L]!</span>")
L.Weaken(5)
L.Stun(5)
/mob/living/simple_animal/hostile/poison/terror_spider/proc/IsInfected(mob/living/carbon/C) // Terror AI requires this
if(C.get_int_organ(/obj/item/organ/internal/body_egg))
+2
View File
@@ -140,12 +140,14 @@
/mob/living/proc/StartResting(updating = 1)
var/val_change = !resting
resting = TRUE
if(updating && val_change)
update_canmove()
/mob/living/proc/StopResting(updating = 1)
var/val_change = !!resting
resting = FALSE
if(updating && val_change)
update_canmove()
+12 -16
View File
@@ -231,22 +231,18 @@
//Mob can equip. Equip it.
equip_to_slot_or_del(W, slot)
else
//Mob can't equip it. Put it in a bag B.
// Do I have a backpack?
var/obj/item/weapon/storage/B
if(istype(back,/obj/item/weapon/storage))
//Mob is wearing backpack
B = back
else
//not wearing backpack. Check if player holding plastic bag
B=is_in_hands(/obj/item/weapon/storage/bag/plasticbag)
if(!B) //If not holding plastic bag, give plastic bag
B=new /obj/item/weapon/storage/bag/plasticbag(null) // Null in case of failed equip.
if(!put_in_hands(B))
return // Bag could not be placed in players hands. I don't know what to do here...
//Now, B represents a container we can insert W into.
B.handle_item_insertion(W,1)
return B
//Mob can't equip it. Put it their backpack or toss it on the floor
if(istype(back, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = back
//Now, B represents a container we can insert W into.
S.handle_item_insertion(W,1)
return S
var/turf/T = get_turf(src)
if(istype(T))
W.forceMove(T)
return T
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \
+10 -3
View File
@@ -380,9 +380,16 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
set name = "Rest"
set category = "IC"
resting = !resting
update_canmove()
to_chat(src, "<span class='notice'>You are now [resting ? "resting" : "getting up"].</span>")
if(world.time < client.move_delay)
return
if(!resting)
client.move_delay = world.time + 20
to_chat(src, "<span class='notice'>You are now resting.</span>")
StartResting()
else if(resting)
to_chat(src, "<span class='notice'>You are now getting up.</span>")
StopResting()
/proc/is_blind(A)
if(iscarbon(A))
@@ -470,7 +470,7 @@
if(CHEF)
clothes_s = new /icon(uniform_dmi, "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "chefhat"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY)
if(prob(1))
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY)
switch(backbag)
+2 -2
View File
@@ -25,7 +25,7 @@
if(ui_ref)
var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : machines)
if(alarm)
var/datum/topic_state/TS = generate_state(alarm)
var/datum/topic_state/air_alarm/TS = generate_state(alarm)
alarm.ui_interact(usr, master_ui = ui_ref, state = TS)
/datum/nano_module/atmos_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
@@ -63,7 +63,7 @@
/datum/topic_state/air_alarm/href_list(var/mob/user)
var/list/extra_href = list()
extra_href["remote_connection"] = 1
extra_href["remote_connection"] = TRUE
extra_href["remote_access"] = has_access(user)
return extra_href
+38 -18
View File
@@ -18,8 +18,10 @@ var/list/alldepartments = list()
active_power_usage = 200
var/obj/item/weapon/card/id/scan = null // identification
var/authenticated = 0
var/sendcooldown = 0 // to avoid spamming fax messages
var/cooldown_time = 1800
var/department = "Unknown" // our department
@@ -52,7 +54,7 @@ var/list/alldepartments = list()
else
return ..()
/obj/machinery/photocopier/faxmachine/emag_act(user as mob)
/obj/machinery/photocopier/faxmachine/emag_act(mob/user)
if(!emagged)
emagged = 1
to_chat(user, "<span class='notice'>The transmitters realign to an unknown source!</span>")
@@ -123,7 +125,7 @@ var/list/alldepartments = list()
if(copyitem)
copyitem.forceMove(get_turf(src))
if(ishuman(usr))
if(!usr.get_active_hand())
if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(copyitem)
to_chat(usr, "<span class='notice'>You eject \the [copyitem] from \the [src].</span>")
copyitem = null
@@ -154,10 +156,10 @@ var/list/alldepartments = list()
destination = lastdestination
if(href_list["auth"])
if((!authenticated) && scan)
if(!is_authenticated && scan)
if(check_access(scan))
authenticated = 1
else if(!authenticated)
else if(is_authenticated)
authenticated = 0
if(href_list["rename"])
@@ -177,26 +179,42 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/proc/scan(var/obj/item/weapon/card/id/card = null)
if(scan) // Card is in machine
if(ishuman(usr))
scan.forceMove(get_turf(usr))
if(!usr.get_active_hand())
scan.forceMove(get_turf(src))
if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(scan)
scan = null
else
scan.forceMove(get_turf(src))
scan = null
else
else if(Adjacent(usr))
if(!card)
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.forceMove(src)
scan = I
else
if(istype(card))
usr.drop_item()
card.forceMove(src)
scan = card
else if(istype(card))
usr.drop_item()
card.forceMove(src)
scan = card
nanomanager.update_uis(src)
/obj/machinery/photocopier/faxmachine/verb/eject_id()
set category = null
set name = "Eject ID Card"
set src in oview(1)
if(usr.restrained())
return
if(scan)
to_chat(usr, "You remove \the [scan] from \the [src].")
scan.forceMove(get_turf(src))
if(!usr.get_active_hand() && Adjacent(usr))
usr.put_in_hands(scan)
scan = null
else
to_chat(usr, "There is nothing to remove from \the [src].")
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination,var/mob/sender)
if(stat & (BROKEN|NOPOWER))
@@ -220,7 +238,6 @@ var/list/alldepartments = list()
F.sent_at = world.time
visible_message("[src] beeps, \"Message transmitted successfully.\"")
//sendcooldown = 600
else
visible_message("[src] beeps, \"Error transmitting message.\"")
@@ -253,6 +270,9 @@ var/list/alldepartments = list()
/obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination)
if(stat & (BROKEN|NOPOWER))
return
if(sendcooldown)
return
use_power(200)
@@ -284,15 +304,15 @@ var/list/alldepartments = list()
message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100")
if("Syndicate")
message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C")
sendcooldown = 1800
sleep(50)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
sendcooldown = cooldown_time
spawn(50)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#9A04D1")
var/msg = "<span class='boldnotice'><font color='[font_colour]'>[faxname]: </font>[key_name(sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=[sender.UID()]'>VV</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([admin_jump_link(sender)]) | REPLY: (<A HREF='?_src_=holder;CentcommReply=\ref[sender]'>RADIO</A>) (<a href='?_src_=holder;AdminFaxCreate=\ref[sender];originfax=\ref[src];faxtype=[faxtype];replyto=\ref[sent]'>FAX</a>) (<A HREF='?_src_=holder;subtlemessage=\ref[sender]'>SM</A>) | REJECT: (<A HREF='?_src_=holder;FaxReplyTemplate=\ref[sender];originfax=\ref[src]'>TEMPLATE</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[sender]'>BSA</A>) (<A HREF='?_src_=holder;EvilFax=\ref[sender];originfax=\ref[src]'>EVILFAX</A>) </span>: Receiving '[sent.name]' via secure connection... <a href='?_src_=holder;AdminFaxView=\ref[sent]'>view message</a>"
var/msg = "<span class='boldnotice'><font color='[font_colour]'>[faxname]: </font> [key_name_admin(sender)] | REPLY: (<A HREF='?_src_=holder;CentcommReply=\ref[sender]'>RADIO</A>) (<a href='?_src_=holder;AdminFaxCreate=\ref[sender];originfax=\ref[src];faxtype=[faxtype];replyto=\ref[sent]'>FAX</a>) (<A HREF='?_src_=holder;subtlemessage=\ref[sender]'>SM</A>) | REJECT: (<A HREF='?_src_=holder;FaxReplyTemplate=\ref[sender];originfax=\ref[src]'>TEMPLATE</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[sender]'>BSA</A>) (<A HREF='?_src_=holder;EvilFax=\ref[sender];originfax=\ref[src]'>EVILFAX</A>) </span>: Receiving '[sent.name]' via secure connection... <a href='?_src_=holder;AdminFaxView=\ref[sent]'>view message</a>"
for(var/client/C in admins)
if(R_EVENT & C.holder.rights)
if(check_rights(R_EVENT, 0, C.mob))
to_chat(C, msg)
if(C.prefs.sound & SOUND_ADMINHELP)
C << 'sound/effects/adminhelp.ogg'
+6 -10
View File
@@ -110,17 +110,15 @@
for(var/datum/data/record/G in data_core.general)
var/datum/data/record/S
for(var/datum/data/record/R in data_core.security)
if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
if(R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])
S = R
break
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
P.info = "<CENTER><B>Security Record</B></CENTER><BR>"
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nSex: [G.fields["sex"]]<BR>\nAge: [G.fields["age"]]<BR>\nFingerprint: [G.fields["fingerprint"]]<BR>\nPhysical Status: [G.fields["p_stat"]]<BR>\nMental Status: [G.fields["m_stat"]]<BR>"
P.info += "<BR>\n<CENTER><B>Security Data</B></CENTER><BR>\nCriminal Status: [S.fields["criminal"]]<BR>\n<BR>\nMinor Crimes: [S.fields["mi_crim"]]<BR>\nDetails: [S.fields["mi_crim_d"]]<BR>\n<BR>\nMajor Crimes: [S.fields["ma_crim"]]<BR>\nDetails: [S.fields["ma_crim_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[S.fields["notes"]]<BR>\n<BR>\n<CENTER><B>Comments/Log</B></CENTER><BR>"
var/counter = 1
while(S.fields["com_[counter]"])
P.info += "[S.fields["com_[counter]"]]<BR>"
counter++
for(var/c in S.fields["comments"])
P.info += "[c]<BR>"
P.info += "</TT>"
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
@@ -146,17 +144,15 @@
for(var/datum/data/record/G in data_core.general)
var/datum/data/record/M
for(var/datum/data/record/R in data_core.medical)
if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
if(R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])
M = R
break
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
P.info = "<CENTER><B>Medical Record</B></CENTER><BR>"
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nSex: [G.fields["sex"]]<BR>\nAge: [G.fields["age"]]<BR>\nFingerprint: [G.fields["fingerprint"]]<BR>\nPhysical Status: [G.fields["p_stat"]]<BR>\nMental Status: [G.fields["m_stat"]]<BR>"
P.info += "<BR>\n<CENTER><B>Medical Data</B></CENTER><BR>\nBlood Type: [M.fields["b_type"]]<BR>\nDNA: [M.fields["b_dna"]]<BR>\n<BR>\nMinor Disabilities: [M.fields["mi_dis"]]<BR>\nDetails: [M.fields["mi_dis_d"]]<BR>\n<BR>\nMajor Disabilities: [M.fields["ma_dis"]]<BR>\nDetails: [M.fields["ma_dis_d"]]<BR>\n<BR>\nAllergies: [M.fields["alg"]]<BR>\nDetails: [M.fields["alg_d"]]<BR>\n<BR>\nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section)<BR>\nDetails: [M.fields["cdi_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[M.fields["notes"]]<BR>\n<BR>\n<CENTER><B>Comments/Log</B></CENTER><BR>"
var/counter = 1
while(M.fields["com_[counter]"])
P.info += "[M.fields["com_[counter]"]]<BR>"
counter++
for(var/c in M.fields["comments"])
P.info += "[c]<BR>"
P.info += "</TT>"
P.name = "paper - '[G.fields["name"]]'"
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
@@ -179,6 +179,17 @@
var/mob_aoe = FALSE
var/list/hit_overlays = list()
/obj/item/projectile/kinetic/pod
range = 4
/obj/item/projectile/kinetic/pod/regular
damage = 50
pressure_decrease = 0.5
/obj/item/projectile/kinetic/pod/enhanced
turf_aoe = TRUE
mob_aoe = TRUE
/obj/item/projectile/kinetic/on_range()
strike_thing()
..()
@@ -40,6 +40,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0),
/obj/item/weapon/reagent_containers/food/snacks/egg = list("egg" = -5),
/obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5),
//Grinder stuff, but only if dry
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "morphine" = 0),
@@ -39,7 +39,6 @@
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
/datum/reagent/nitrogen
name = "Nitrogen"
id = "nitrogen"
@@ -1,11 +1,13 @@
/obj/item/weapon/reagent_containers/blood
name = "BloodPack"
var/base_name = "BloodPack"
desc = "Contains blood used for transfusion."
icon = 'icons/obj/bloodpack.dmi'
icon_state = "empty"
volume = 200
var/blood_type = null
var/label_text = ""
/obj/item/weapon/reagent_containers/blood/New()
..()
@@ -16,6 +18,7 @@
/obj/item/weapon/reagent_containers/blood/on_reagent_change()
update_icon()
update_name_label()
/obj/item/weapon/reagent_containers/blood/update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
@@ -27,27 +30,55 @@
if(51 to INFINITY)
icon_state = "full"
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen))
var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text))
if(length(tmp_label) > MAX_NAME_LEN)
to_chat(user, "<span class='warning'>The label can be at most [MAX_NAME_LEN] characters long.</span>")
else
to_chat(user, "<span class='notice'>You set the label to \"[tmp_label]\".</span>")
label_text = tmp_label
update_name_label()
/obj/item/weapon/reagent_containers/blood/proc/update_name_label()
if(reagents.total_volume == 0)
base_name = "Empty BloodPack"
desc = "Seems pretty useless... Maybe if there were a way to fill it?"
else
base_name = "BloodPack"
desc = "Contains blood used for transfusion."
if(label_text == "")
name = base_name
else
name = "[base_name] ([label_text])"
/obj/item/weapon/reagent_containers/blood/random/New()
blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-")
..()
/obj/item/weapon/reagent_containers/blood/APlus
blood_type = "A+"
label_text = "A+"
/obj/item/weapon/reagent_containers/blood/AMinus
blood_type = "A-"
label_text = "A-"
/obj/item/weapon/reagent_containers/blood/BPlus
blood_type = "B+"
label_text = "B+"
/obj/item/weapon/reagent_containers/blood/BMinus
blood_type = "B-"
label_text = "B-"
/obj/item/weapon/reagent_containers/blood/OPlus
blood_type = "O+"
label_text = "O+"
/obj/item/weapon/reagent_containers/blood/OMinus
blood_type = "O-"
label_text = "O-"
/obj/item/weapon/reagent_containers/blood/empty
name = "Empty BloodPack"
@@ -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
@@ -321,6 +321,7 @@
newsign.data["mob"] = null
newsign.data["mobtype"] = /mob/living/carbon/human
newsign.data["race"] = "Automated Signal"
newsign.data["name"] = source
newsign.data["realname"] = newsign.data["name"]
newsign.data["job"] = "[job]"
@@ -343,4 +344,4 @@
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
if(!pass)
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
+9 -10
View File
@@ -28,9 +28,8 @@
firstloc = get_turf(my_atom)
secondloc = get_step(firstloc,NORTH)
olddir = dir
var/proj_type = text2path(projectile_type)
var/obj/item/projectile/projone = new proj_type(firstloc)
var/obj/item/projectile/projtwo = new proj_type(secondloc)
var/obj/item/projectile/projone = new projectile_type(firstloc)
var/obj/item/projectile/projtwo = new projectile_type(secondloc)
projone.starting = get_turf(my_atom)
projone.firer = usr
projone.def_zone = "chest"
@@ -79,7 +78,7 @@
desc = "You shouldn't be seeing this"
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "blank"
var/projectile_type
var/obj/item/projectile/projectile_type
var/shot_cost = 0
var/shots_per = 1
var/fire_sound
@@ -89,7 +88,7 @@
name = "disabler system"
desc = "A weak taser system for space pods, fires disabler beams."
icon_state = "weapon_taser"
projectile_type = "/obj/item/projectile/beam/disabler"
projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 400
fire_sound = 'sound/weapons/Taser.ogg'
@@ -97,7 +96,7 @@
name = "burst taser system"
desc = "A weak taser system for space pods, this one fires 3 at a time."
icon_state = "weapon_burst_taser"
projectile_type = "/obj/item/projectile/beam/disabler"
projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 1200
shots_per = 3
fire_sound = 'sound/weapons/Taser.ogg'
@@ -107,7 +106,7 @@
name = "laser system"
desc = "A weak laser system for space pods, fires concentrated bursts of energy"
icon_state = "weapon_laser"
projectile_type = "/obj/item/projectile/beam"
projectile_type = /obj/item/projectile/beam
shot_cost = 600
fire_sound = 'sound/weapons/Laser.ogg'
@@ -117,7 +116,7 @@
desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_taser"
projectile_type = "/obj/item/projectile/kinetic"
projectile_type = /obj/item/projectile/kinetic/pod
shot_cost = 300
fire_delay = 14
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
@@ -127,7 +126,7 @@
desc = "A mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_m_laser"
projectile_type = "/obj/item/projectile/kinetic/super"
projectile_type = /obj/item/projectile/kinetic/pod/regular
shot_cost = 250
fire_delay = 10
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
@@ -137,7 +136,7 @@
desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_w_laser"
projectile_type = "/obj/item/projectile/kinetic/hyper"
projectile_type = /obj/item/projectile/kinetic/pod/enhanced
shot_cost = 200
fire_delay = 8
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
+1 -1
View File
@@ -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>
+6 -6
View File
@@ -63,19 +63,19 @@
to_chat(owner,"<span class='danger'>Your spider bite wound hurts horribly! </span>")
if(istype(get_area(owner), /area/awaycontent) || istype(get_area(owner), /area/awaymission))
awaymission_infection = 1
if(15) // 30 seconds... enough time for the nerve agent to kick in, the pain to be blocked, and healing to begin
if(15) // 30s... enough time for the nerve agent to kick in, the pain to be blocked, and healing to begin
to_chat(owner,"<span class='notice'>The pain has faded, and stopped bleeding, though the skin around it has turned black.</span>")
owner.adjustBruteLoss(-10)
if(60) // 2 minutes... the point where the venom uses and accellerates the healing process, to feed the eggs
if(30) // 1m... the point where the venom uses and accellerates the healing process, to feed the eggs
to_chat(owner,"<span class='notice'>Your bite wound has completely sealed up, though the skin is still black. You feel significantly better.</span>")
owner.adjustBruteLoss(-20)
if(120) // 4 minutes... where the eggs are developing, and the wound is turning into a hatching site, but invisibly
if(90) // 3m... where the eggs are developing, and the wound is turning into a hatching site, but invisibly
to_chat(owner,"<span class='notice'>The black flesh around your old spider bite wound has started to peel off.</span>")
if(150) // 5 minutes... where the victim realizes something is wrong - this is not a normal wound
if(100) // 3m20s... where the victim realizes something is wrong - this is not a normal wound
to_chat(owner,"<span class='danger'>The black flesh around your spider bite wound has cracked, and started to split open!</span>")
if(165) // 5m 30s
if(110) // 3m40s...
to_chat(owner,"<span class='danger'>The black flesh splits open completely, revealing a cluster of small black oval shapes inside you, shapes that seem to be moving!</span>")
if(180) // 6m
if(120) // 4m...
if(awaymission_infection && is_away_level(owner.z))
// we started in the awaymission, we ended on the station.
// To prevent someone bringing an infection back, we're going to trigger an alternate, equally-bad result here.
+2
View File
@@ -31,6 +31,8 @@
/obj/vehicle/ambulance/Move(newloc, Dir)
var/oldloc = loc
if(bed && !Adjacent(bed))
bed = null
. = ..()
if(bed && get_dist(oldloc, loc) <= 2)
bed.Move(oldloc)