mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 21:48:21 +01:00
Merge branch 'bleeding-edge-freeze' into vials
This commit is contained in:
@@ -1003,18 +1003,39 @@ proc/process_ghost_teleport_locs()
|
||||
//MedBay
|
||||
|
||||
/area/medical/medbay
|
||||
name = "Medbay"
|
||||
name = "\improper Medbay"
|
||||
icon_state = "medbay"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
//Medbay is a large area, these additional areas help level out APC load.
|
||||
/area/medical/medbay2
|
||||
name = "Medbay"
|
||||
name = "\improper Medbay"
|
||||
icon_state = "medbay2"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/medbay3
|
||||
name = "Medbay"
|
||||
name = "\improper Medbay"
|
||||
icon_state = "medbay3"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
|
||||
/area/medical/biostorage
|
||||
name = "\improper Secondary Storage"
|
||||
icon_state = "medbay2"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/reception
|
||||
name = "\improper Medbay Reception"
|
||||
icon_state = "medbay"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/psych
|
||||
name = "\improper Psych Room"
|
||||
icon_state = "medbay3"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
/area/medical/medbreak
|
||||
name = "\improper Break Room"
|
||||
icon_state = "medbay3"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
|
||||
@@ -1022,20 +1043,44 @@ proc/process_ghost_teleport_locs()
|
||||
name = "\improper Patient's Rooms"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/ward
|
||||
name = "\improper Medbay Patient Ward"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/patient_a
|
||||
name = "\improper Isolation A"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/patient_b
|
||||
name = "\improper Isolation B"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/patient_c
|
||||
name = "\improper Isolation C"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/iso_access
|
||||
name = "\improper Isolation Access"
|
||||
icon_state = "patients"
|
||||
|
||||
/area/medical/cmo
|
||||
name = "\improper Chief Medical Officer's office"
|
||||
icon_state = "CMO"
|
||||
|
||||
/area/medical/cmostore
|
||||
name = "\improper Secure Storage"
|
||||
icon_state = "CMO"
|
||||
|
||||
/area/medical/robotics
|
||||
name = "Robotics"
|
||||
name = "\improper Robotics"
|
||||
icon_state = "medresearch"
|
||||
|
||||
/area/medical/research
|
||||
name = "Medical Research"
|
||||
name = "\improper Medical Research"
|
||||
icon_state = "medresearch"
|
||||
|
||||
/area/medical/virology
|
||||
name = "Virology"
|
||||
name = "\improper Virology"
|
||||
icon_state = "virology"
|
||||
|
||||
/area/medical/morgue
|
||||
@@ -1043,15 +1088,19 @@ proc/process_ghost_teleport_locs()
|
||||
icon_state = "morgue"
|
||||
|
||||
/area/medical/chemistry
|
||||
name = "Chemistry"
|
||||
name = "\improper Chemistry"
|
||||
icon_state = "chem"
|
||||
|
||||
/area/medical/surgery
|
||||
name = "Surgery"
|
||||
name = "\improper Surgery"
|
||||
icon_state = "surgery"
|
||||
|
||||
/area/medical/surgeryobs
|
||||
name = "\improper Surgery Observation"
|
||||
icon_state = "surgery"
|
||||
|
||||
/area/medical/cryo
|
||||
name = "Cryogenics"
|
||||
name = "\improper Cryogenics"
|
||||
icon_state = "cryo"
|
||||
|
||||
/area/medical/exam_room
|
||||
@@ -1059,15 +1108,15 @@ proc/process_ghost_teleport_locs()
|
||||
icon_state = "exam_room"
|
||||
|
||||
/area/medical/genetics
|
||||
name = "Genetics Lab"
|
||||
name = "\improper Genetics Lab"
|
||||
icon_state = "genetics"
|
||||
|
||||
/area/medical/genetics_cloning
|
||||
name = "Cloning Lab"
|
||||
name = "\improper Cloning Lab"
|
||||
icon_state = "cloning"
|
||||
|
||||
/area/medical/sleeper
|
||||
name = "Medbay Treatment Center"
|
||||
name = "\improper Emergency"
|
||||
icon_state = "exam_room"
|
||||
|
||||
//Security
|
||||
|
||||
+3
-3
@@ -21,10 +21,10 @@
|
||||
//Detective Work, used for the duplicate data points kept in the scanners
|
||||
var/list/original_atom
|
||||
|
||||
/atom/proc/throw_impact(atom/hit_atom)
|
||||
/atom/proc/throw_impact(atom/hit_atom, var/speed)
|
||||
if(istype(hit_atom,/mob/living))
|
||||
var/mob/living/M = hit_atom
|
||||
M.hitby(src)
|
||||
M.hitby(src,speed)
|
||||
|
||||
log_attack("<font color='red'>[hit_atom] ([M.ckey]) was hit by [src] thrown by ([src.fingerprintslast])</font>")
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/obj/O = hit_atom
|
||||
if(!O.anchored)
|
||||
step(O, src.dir)
|
||||
O.hitby(src)
|
||||
O.hitby(src,speed)
|
||||
|
||||
else if(isturf(hit_atom))
|
||||
var/turf/T = hit_atom
|
||||
|
||||
@@ -44,18 +44,18 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/atom/movable/proc/hit_check()
|
||||
/atom/movable/proc/hit_check(var/speed)
|
||||
if(src.throwing)
|
||||
for(var/atom/A in get_turf(src))
|
||||
if(A == src) continue
|
||||
if(istype(A,/mob/living))
|
||||
if(A:lying) continue
|
||||
src.throw_impact(A)
|
||||
src.throw_impact(A,speed)
|
||||
if(src.throwing == 1)
|
||||
src.throwing = 0
|
||||
if(isobj(A))
|
||||
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
|
||||
src.throw_impact(A)
|
||||
src.throw_impact(A,speed)
|
||||
src.throwing = 0
|
||||
|
||||
/atom/movable/proc/throw_at(atom/target, range, speed)
|
||||
@@ -97,7 +97,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error += dist_x
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -109,7 +109,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error -= dist_y
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -126,7 +126,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error += dist_y
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -138,7 +138,7 @@
|
||||
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
|
||||
break
|
||||
src.Move(step)
|
||||
hit_check()
|
||||
hit_check(speed)
|
||||
error -= dist_x
|
||||
dist_travelled++
|
||||
dist_since_sleep++
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
//done throwing, either because it hit something or it finished moving
|
||||
src.throwing = 0
|
||||
if(isobj(src)) src:throw_impact(get_turf(src))
|
||||
if(isobj(src)) src:throw_impact(get_turf(src),speed)
|
||||
|
||||
|
||||
//Overlays
|
||||
|
||||
+11
-1
@@ -548,7 +548,17 @@
|
||||
sleep(48)
|
||||
del(animation)
|
||||
|
||||
var/mob/living/carbon/monkey/O = new(src)
|
||||
|
||||
var/mob/living/carbon/monkey/O = null
|
||||
switch(M.dna.mutantrace)
|
||||
if("tajaran")
|
||||
O = new /mob/living/carbon/monkey/tajara(src)
|
||||
if("lizard")
|
||||
O = new /mob/living/carbon/monkey/unathi(src)
|
||||
if("skrell")
|
||||
O = new /mob/living/carbon/monkey/skrell(src)
|
||||
else
|
||||
O = new /mob/living/carbon/monkey(src)
|
||||
|
||||
if(M)
|
||||
if (M.dna)
|
||||
|
||||
@@ -157,10 +157,10 @@
|
||||
|
||||
|
||||
/datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code)
|
||||
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
|
||||
// var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
|
||||
spawn(1)
|
||||
NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
|
||||
synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
|
||||
// NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
|
||||
synd_mind.current.real_name = "[pick(first_names_male)] [pick(last_names)]"
|
||||
if (nuke_code)
|
||||
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
|
||||
synd_mind.current << "The nuclear authorization code is: <B>[nuke_code]</B>"
|
||||
@@ -330,7 +330,7 @@
|
||||
return 1
|
||||
|
||||
|
||||
/proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho.
|
||||
/*/proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho.
|
||||
var/randomname = pick(last_names)
|
||||
var/newname = copytext(sanitize(input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname)),1,MAX_NAME_LEN)
|
||||
|
||||
@@ -343,13 +343,13 @@
|
||||
return nukelastname(M)
|
||||
|
||||
return newname
|
||||
|
||||
*/
|
||||
/proc/NukeNameAssign(var/lastname,var/list/syndicates)
|
||||
for(var/datum/mind/synd_mind in syndicates)
|
||||
switch(synd_mind.current.gender)
|
||||
if(MALE)
|
||||
synd_mind.name = "[pick(first_names_male)] [lastname]"
|
||||
synd_mind.name = "[pick(first_names_male)] [pick(last_names)]"
|
||||
if(FEMALE)
|
||||
synd_mind.name = "[pick(first_names_female)] [lastname]"
|
||||
synd_mind.name = "[pick(first_names_female)] [pick(last_names)]"
|
||||
synd_mind.current.real_name = synd_mind.name
|
||||
return
|
||||
@@ -47,6 +47,8 @@
|
||||
dat += "<HR>"
|
||||
dat += "<A href='byond://?src=\ref[src];spell_choice=staffchange'>Staff of Change</A><BR>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='byond://?src=\ref[src];spell_choice=mentalfocus'>Mental Focus</A><BR>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='byond://?src=\ref[src];spell_choice=soulstone'>Six Soul Stone Shards and the spell Artificer</A><BR>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='byond://?src=\ref[src];spell_choice=armor'>Mastercrafted Armor Set</A><BR>"
|
||||
@@ -84,7 +86,7 @@
|
||||
uses--
|
||||
/*
|
||||
*/
|
||||
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", summonguns = "Summon Guns", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation")
|
||||
var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", summonguns = "Summon Guns", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation")
|
||||
var/already_knows = 0
|
||||
for(var/obj/effect/proc_holder/spell/aspell in H.spell_list)
|
||||
if(available_spells[href_list["spell_choice"]] == aspell.name)
|
||||
@@ -162,6 +164,11 @@
|
||||
new /obj/item/weapon/gun/energy/staff(get_turf(H))
|
||||
temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
|
||||
max_uses--
|
||||
if("mentalfocus")
|
||||
feedback_add_details("wizard_spell_learned","MF") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
new /obj/item/weapon/gun/energy/staff/focus(get_turf(H))
|
||||
temp = "An artefact that channels the will of the user into destructive bolts of force."
|
||||
max_uses--
|
||||
if("soulstone")
|
||||
feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
|
||||
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H))
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist")
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher")
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -63,6 +63,32 @@
|
||||
|
||||
|
||||
|
||||
/datum/job/xenobiologist
|
||||
title = "Xenobiologist"
|
||||
flag = XENOBIOLOGIST
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
minimal_access = list(access_research, access_xenobiology)
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_ears)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit)
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
|
||||
return 1
|
||||
|
||||
|
||||
/datum/job/roboticist
|
||||
title = "Roboticist"
|
||||
flag = ROBOTICIST
|
||||
|
||||
@@ -134,7 +134,40 @@ var/global/datum/controller/occupations/job_master
|
||||
if(!job) continue
|
||||
var/list/candidates = FindOccupationCandidates(job, level)
|
||||
if(!candidates.len) continue
|
||||
var/mob/new_player/candidate = pick(candidates)
|
||||
|
||||
// Build a weighted list, weight by age.
|
||||
var/list/weightedCandidates = list()
|
||||
|
||||
// Different head positions have different good ages.
|
||||
var/good_age_minimal = 25
|
||||
var/good_age_maximal = 60
|
||||
if(command_position == "Captain")
|
||||
good_age_minimal = 30
|
||||
good_age_maximal = 70 // Old geezer captains ftw
|
||||
|
||||
for(var/mob/V in candidates)
|
||||
// Log-out during round-start? What a bad boy, no head position for you!
|
||||
if(!V.client) continue
|
||||
var/age = V.client.prefs.age
|
||||
switch(age)
|
||||
if(good_age_minimal - 10 to good_age_minimal)
|
||||
weightedCandidates[V] = 3 // Still a bit young.
|
||||
if(good_age_minimal to good_age_minimal + 10)
|
||||
weightedCandidates[V] = 6 // Better.
|
||||
if(good_age_minimal + 10 to good_age_maximal - 10)
|
||||
weightedCandidates[V] = 10 // Great.
|
||||
if(good_age_maximal - 10 to good_age_maximal)
|
||||
weightedCandidates[V] = 6 // Still good.
|
||||
if(good_age_maximal to good_age_maximal + 10)
|
||||
weightedCandidates[V] = 6 // Bit old, don't you think?
|
||||
if(good_age_maximal to good_age_maximal + 50)
|
||||
weightedCandidates[V] = 3 // Geezer.
|
||||
else
|
||||
// If there's ABSOLUTELY NOBODY ELSE
|
||||
if(candidates.len == 1) weightedCandidates[V] = 1
|
||||
|
||||
|
||||
var/mob/new_player/candidate = pickweight(weightedCandidates)
|
||||
if(AssignRole(candidate, command_position))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -9,9 +9,8 @@ var/const/OFFICER =(1<<4)
|
||||
var/const/CHIEF =(1<<5)
|
||||
var/const/ENGINEER =(1<<6)
|
||||
var/const/ATMOSTECH =(1<<7)
|
||||
var/const/ROBOTICIST =(1<<8)
|
||||
var/const/AI =(1<<9)
|
||||
var/const/CYBORG =(1<<10)
|
||||
var/const/AI =(1<<8)
|
||||
var/const/CYBORG =(1<<9)
|
||||
|
||||
|
||||
var/const/MEDSCI =(1<<1)
|
||||
@@ -24,6 +23,8 @@ var/const/DOCTOR =(1<<4)
|
||||
var/const/GENETICIST =(1<<5)
|
||||
var/const/VIROLOGIST =(1<<6)
|
||||
var/const/PSYCHIATRIST =(1<<7)
|
||||
var/const/ROBOTICIST =(1<<8)
|
||||
var/const/XENOBIOLOGIST =(1<<9)
|
||||
|
||||
|
||||
var/const/CIVILIAN =(1<<2)
|
||||
@@ -78,7 +79,8 @@ var/list/science_positions = list(
|
||||
"Research Director",
|
||||
"Scientist",
|
||||
"Geneticist", //Part of both medical and science
|
||||
"Roboticist"
|
||||
"Roboticist",
|
||||
"Xenobiologist"
|
||||
)
|
||||
|
||||
//BS12 EDIT
|
||||
|
||||
@@ -284,10 +284,10 @@
|
||||
var/internal_bleeding = ""
|
||||
var/lung_ruptured = ""
|
||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||
internal_bleeding = "<br>Internal Bleeding"
|
||||
internal_bleeding = "<br>Internal bleeding"
|
||||
break
|
||||
if(istype(e, /datum/organ/external/chest) && occupant.is_lung_ruptured())
|
||||
lung_ruptured = "Lung Ruptured:"
|
||||
lung_ruptured = "Lung ruptured:"
|
||||
if(e.status & ORGAN_SPLINTED)
|
||||
splint = "Splinted:"
|
||||
if(e.status & ORGAN_BLEEDING)
|
||||
@@ -297,7 +297,7 @@
|
||||
if(e.open)
|
||||
open = "Open:"
|
||||
if(e.implants.len)
|
||||
imp = "Implanted:"
|
||||
imp = "Unknown body present:"
|
||||
if(!AN && !open && !infected & !imp)
|
||||
AN = "None:"
|
||||
if(!(e.status & ORGAN_DESTROYED))
|
||||
|
||||
@@ -37,7 +37,7 @@ var/global/list/autolathe_recipes = list( \
|
||||
new /obj/item/device/assembly/igniter(), \
|
||||
new /obj/item/device/assembly/signaler(), \
|
||||
new /obj/item/device/radio/headset(), \
|
||||
new /obj/item/device/radio(), \
|
||||
new /obj/item/device/radio/off(), \
|
||||
new /obj/item/device/assembly/infra(), \
|
||||
new /obj/item/device/assembly/timer(), \
|
||||
new /obj/item/weapon/light/tube(), \
|
||||
|
||||
@@ -2,6 +2,342 @@
|
||||
#define SPECOPS_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves.
|
||||
#define SPECOPS_STATION_AREATYPE "/area/shuttle/specops/station" //Type of the spec ops shuttle area for station
|
||||
#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock
|
||||
#define SPECOPS_RETURN_DELAY 6000 //Time between the shuttle is capable of moving.
|
||||
|
||||
var/specops_shuttle_moving_to_station = 0
|
||||
var/specops_shuttle_moving_to_centcom = 0
|
||||
var/specops_shuttle_at_station = 0
|
||||
var/specops_shuttle_can_send = 1
|
||||
var/specops_shuttle_time = 0
|
||||
var/specops_shuttle_timeleft = 0
|
||||
|
||||
/obj/machinery/computer/specops_shuttle
|
||||
name = "Spec. Ops. Shuttle Console"
|
||||
icon = 'computer.dmi'
|
||||
icon_state = "shuttle"
|
||||
req_access = list(access_cent_specops)
|
||||
// req_access = list(ACCESS_CENT_SPECOPS)
|
||||
var/temp = null
|
||||
var/hacked = 0
|
||||
var/allowedtocall = 0
|
||||
var/specops_shuttle_timereset = 0
|
||||
|
||||
/proc/specops_return()
|
||||
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
announcer.config(list("Response Team" = 0))
|
||||
|
||||
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
|
||||
var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING TO RETURN\""//Initial message shown.
|
||||
if(announcer)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
|
||||
while(specops_shuttle_time - world.timeofday > 0)
|
||||
var/ticksleft = specops_shuttle_time - world.timeofday
|
||||
|
||||
if(ticksleft > 1e5)
|
||||
specops_shuttle_time = world.timeofday + 10 // midnight rollover
|
||||
specops_shuttle_timeleft = (ticksleft / 10)
|
||||
|
||||
//All this does is announce the time before launch.
|
||||
if(announcer)
|
||||
var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
|
||||
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
|
||||
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
|
||||
if(rounded_time_left==0)
|
||||
message = "\"ALERT: TAKEOFF\""
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
|
||||
//Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
|
||||
|
||||
sleep(5)
|
||||
|
||||
specops_shuttle_moving_to_station = 0
|
||||
specops_shuttle_moving_to_centcom = 0
|
||||
|
||||
specops_shuttle_at_station = 1
|
||||
|
||||
var/area/start_location = locate(/area/shuttle/specops/station)
|
||||
var/area/end_location = locate(/area/shuttle/specops/centcom)
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in end_location)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
// hey you, get out of the way!
|
||||
for(var/turf/T in dstturfs)
|
||||
// find the turf to move things to
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
//var/turf/E = get_step(D, SOUTH)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
start_location.move_contents_to(end_location)
|
||||
|
||||
for(var/turf/T in get_area_turfs(end_location) )
|
||||
var/mob/M = locate(/mob) in T
|
||||
M << "\red You have arrived at Central Command. Operation has ended!"
|
||||
|
||||
specops_shuttle_at_station = 0
|
||||
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
|
||||
|
||||
del(announcer)
|
||||
|
||||
/proc/specops_process()
|
||||
var/area/centcom/specops/special_ops = locate()//Where is the specops area located?
|
||||
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky.
|
||||
announcer.config(list("Response Team" = 0))
|
||||
|
||||
var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values.
|
||||
var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH\""//Initial message shown.
|
||||
if(announcer)
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
// message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD"
|
||||
// announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
|
||||
while(specops_shuttle_time - world.timeofday > 0)
|
||||
var/ticksleft = specops_shuttle_time - world.timeofday
|
||||
|
||||
if(ticksleft > 1e5)
|
||||
specops_shuttle_time = world.timeofday + 10 // midnight rollover
|
||||
specops_shuttle_timeleft = (ticksleft / 10)
|
||||
|
||||
//All this does is announce the time before launch.
|
||||
if(announcer)
|
||||
var/rounded_time_left = round(specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions.
|
||||
if(rounded_time_left in message_tracker)//If that time is in the list for message announce.
|
||||
message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\""
|
||||
if(rounded_time_left==0)
|
||||
message = "\"ALERT: TAKEOFF\""
|
||||
announcer.autosay(message, "A.L.I.C.E.", "Response Team")
|
||||
message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle.
|
||||
//Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that.
|
||||
|
||||
sleep(5)
|
||||
|
||||
specops_shuttle_moving_to_station = 0
|
||||
specops_shuttle_moving_to_centcom = 0
|
||||
|
||||
specops_shuttle_at_station = 1
|
||||
if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\red The Special Operations shuttle is unable to leave."
|
||||
return
|
||||
|
||||
//Begin Marauder launchpad.
|
||||
spawn(0)//So it parallel processes it.
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)//1 second delay between each.
|
||||
M.open()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.open()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.open()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.open()
|
||||
|
||||
sleep(10)
|
||||
|
||||
var/spawn_marauder[] = new()
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
if(L.name == "Marauder Entry")
|
||||
spawn_marauder.Add(L)
|
||||
for(var/obj/effect/landmark/L in world)
|
||||
if(L.name == "Marauder Exit")
|
||||
var/obj/effect/portal/P = new(L.loc)
|
||||
P.invisibility = 101//So it is not seen by anyone.
|
||||
P.failchance = 0//So it has no fail chance when teleporting.
|
||||
P.target = pick(spawn_marauder)//Where the marauder will arrive.
|
||||
spawn_marauder.Remove(P.target)
|
||||
|
||||
sleep(10)
|
||||
|
||||
for(var/obj/machinery/mass_driver/M in special_ops)
|
||||
switch(M.id)
|
||||
if("ASSAULT0")
|
||||
spawn(10)
|
||||
M.drive()
|
||||
if("ASSAULT1")
|
||||
spawn(20)
|
||||
M.drive()
|
||||
if("ASSAULT2")
|
||||
spawn(30)
|
||||
M.drive()
|
||||
if("ASSAULT3")
|
||||
spawn(40)
|
||||
M.drive()
|
||||
|
||||
sleep(50)//Doors remain open for 5 seconds.
|
||||
|
||||
for(var/obj/machinery/door/poddoor/M in special_ops)
|
||||
switch(M.id)//Doors close at the same time.
|
||||
if("ASSAULT0")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT1")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT2")
|
||||
spawn(0)
|
||||
M.close()
|
||||
if("ASSAULT3")
|
||||
spawn(0)
|
||||
M.close()
|
||||
special_ops.readyreset()//Reset firealarm after the team launched.
|
||||
//End Marauder launchpad.
|
||||
|
||||
var/area/start_location = locate(/area/shuttle/specops/centcom)
|
||||
var/area/end_location = locate(/area/shuttle/specops/station)
|
||||
|
||||
var/list/dstturfs = list()
|
||||
var/throwy = world.maxy
|
||||
|
||||
for(var/turf/T in end_location)
|
||||
dstturfs += T
|
||||
if(T.y < throwy)
|
||||
throwy = T.y
|
||||
|
||||
// hey you, get out of the way!
|
||||
for(var/turf/T in dstturfs)
|
||||
// find the turf to move things to
|
||||
var/turf/D = locate(T.x, throwy - 1, 1)
|
||||
//var/turf/E = get_step(D, SOUTH)
|
||||
for(var/atom/movable/AM as mob|obj in T)
|
||||
AM.Move(D)
|
||||
if(istype(T, /turf/simulated))
|
||||
del(T)
|
||||
|
||||
start_location.move_contents_to(end_location)
|
||||
|
||||
for(var/turf/T in get_area_turfs(end_location) )
|
||||
var/mob/M = locate(/mob) in T
|
||||
M << "\red You have arrived to [station_name]. Commence operation!"
|
||||
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY
|
||||
|
||||
del(announcer)
|
||||
|
||||
/proc/specops_can_move()
|
||||
if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom)
|
||||
return 0
|
||||
for(var/obj/machinery/computer/specops_shuttle/S in world)
|
||||
if(world.timeofday <= S.specops_shuttle_timereset)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_paw(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob)
|
||||
if(istype(I,/obj/item/weapon/card/emag))
|
||||
user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals."
|
||||
else
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied."
|
||||
return
|
||||
|
||||
//Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle.
|
||||
// if (sent_strike_team == 0 && send_emergency_team == 0)
|
||||
// usr << "\red The strike team has not yet deployed."
|
||||
// return
|
||||
|
||||
if(..())
|
||||
return
|
||||
|
||||
user.machine = src
|
||||
var/dat
|
||||
if (temp)
|
||||
dat = temp
|
||||
else
|
||||
dat += {"<BR><B>Special Operations Shuttle</B><HR>
|
||||
\nLocation: [specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "Departing for [station_name] in ([specops_shuttle_timeleft] seconds.)":specops_shuttle_at_station ? "Station":"Dock"]<BR>
|
||||
[specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.*<BR>\n<BR>":specops_shuttle_at_station ? "\n<A href='?src=\ref[src];sendtodock=1'>Shuttle standing by...</A><BR>\n<BR>":"\n<A href='?src=\ref[src];sendtostation=1'>Depart to [station_name]</A><BR>\n<BR>"]
|
||||
\n<A href='?src=\ref[user];mach_close=computer'>Close</A>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/specops_shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
|
||||
usr.machine = src
|
||||
|
||||
if (href_list["sendtodock"])
|
||||
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\blue Central Command will not allow the Special Operations shuttle to return yet."
|
||||
if(world.timeofday <= specops_shuttle_timereset)
|
||||
if (((world.timeofday - specops_shuttle_timereset)/10) > 60)
|
||||
usr << "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!"
|
||||
usr << "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!"
|
||||
return
|
||||
|
||||
usr << "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds."
|
||||
|
||||
temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
updateUsrDialog()
|
||||
|
||||
specops_shuttle_moving_to_centcom = 1
|
||||
specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
|
||||
spawn(0)
|
||||
specops_return()
|
||||
|
||||
else if (href_list["sendtostation"])
|
||||
if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
|
||||
|
||||
if (!specops_can_move())
|
||||
usr << "\red The Special Operations shuttle is unable to leave."
|
||||
return
|
||||
|
||||
usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds."
|
||||
|
||||
temp += "Shuttle departing.<BR><BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
|
||||
updateUsrDialog()
|
||||
|
||||
var/area/centcom/specops/special_ops = locate()
|
||||
if(special_ops)
|
||||
special_ops.readyalert()//Trigger alarm for the spec ops area.
|
||||
specops_shuttle_moving_to_station = 1
|
||||
|
||||
specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME
|
||||
spawn(0)
|
||||
specops_process()
|
||||
|
||||
else if (href_list["mainmenu"])
|
||||
temp = null
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/*//Config stuff
|
||||
#define SPECOPS_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves.
|
||||
#define SPECOPS_STATION_AREATYPE "/area/shuttle/specops/station" //Type of the spec ops shuttle area for station
|
||||
#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock
|
||||
|
||||
var/specops_shuttle_moving_to_station = 0
|
||||
var/specops_shuttle_moving_to_centcom = 0
|
||||
@@ -179,9 +515,9 @@ var/specops_shuttle_timeleft = 0
|
||||
user << "\red Access Denied."
|
||||
return
|
||||
|
||||
if (sent_strike_team == 0)
|
||||
usr << "\red The strike team has not yet deployed."
|
||||
return
|
||||
// if (sent_strike_team == 0)
|
||||
// usr << "\red The strike team has not yet deployed."
|
||||
// return
|
||||
|
||||
if(..())
|
||||
return
|
||||
@@ -239,4 +575,5 @@ var/specops_shuttle_timeleft = 0
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
return
|
||||
return
|
||||
*/
|
||||
@@ -84,7 +84,7 @@
|
||||
if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood))
|
||||
// speed up transfer on blood packs
|
||||
transfer_amount = 4
|
||||
attached.inject_blood(beaker,transfer_amount)
|
||||
src.beaker.reagents.trans_to(src.attached, transfer_amount)
|
||||
update_icon()
|
||||
|
||||
// Take blood
|
||||
|
||||
@@ -368,7 +368,7 @@
|
||||
src.desc = initial(src.desc)
|
||||
if(being_built)
|
||||
src.being_built.Move(get_step(src,SOUTH))
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps, \"The [src.being_built] is complete\".")
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps, \"The following has been completed: [src.being_built] is built\".")
|
||||
src.being_built = null
|
||||
src.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
@@ -808,4 +808,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if(radio_controller)
|
||||
for (var/ch_name in op)
|
||||
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/device/radio/off
|
||||
listening = 0
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R)
|
||||
if(R.stat == DEAD)
|
||||
usr << "/red The [src] will not function on a deceased robot."
|
||||
usr << "\red The [src] will not function on a deceased robot."
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -277,7 +277,41 @@
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src)
|
||||
/obj/item/weapon/storage/box/farwacubes
|
||||
name = "farwa cube box"
|
||||
desc = "Drymate brand farwa cubes. Just add water!"
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "monkeycubebox"
|
||||
storage_slots = 7
|
||||
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/farwacube")
|
||||
New()
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/farwacube/wrapped(src)
|
||||
|
||||
/obj/item/weapon/storage/box/stokcubes
|
||||
name = "stok cube box"
|
||||
desc = "Drymate brand stok cubes. Just add water!"
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "monkeycubebox"
|
||||
storage_slots = 7
|
||||
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/stokcube")
|
||||
New()
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/stokcube/wrapped(src)
|
||||
|
||||
/obj/item/weapon/storage/box/neaeracubes
|
||||
name = "neaera cube box"
|
||||
desc = "Drymate brand neaera cubes. Just add water!"
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "monkeycubebox"
|
||||
storage_slots = 7
|
||||
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/stokcube")
|
||||
New()
|
||||
..()
|
||||
for(var/i = 1; i <= 5; i++)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/neaeracube/wrapped(src)
|
||||
|
||||
/obj/item/weapon/storage/box/ids
|
||||
name = "spare IDs"
|
||||
|
||||
@@ -365,8 +365,8 @@ LOOK FOR SURGERY.DM*/
|
||||
attack_verb = list("drilled")
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << pick("/red <b>[user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.</b>", \
|
||||
"/red <b>[user] is pressing [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.</b>")
|
||||
viewers(user) << pick("\red <b>[user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.</b>", \
|
||||
"\red <b>[user] is pressing [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.</b>")
|
||||
return (BRUTELOSS)
|
||||
|
||||
/*
|
||||
|
||||
@@ -162,3 +162,28 @@
|
||||
name = "double emergency oxygen tank"
|
||||
icon_state = "emergency_double"
|
||||
volume = 10
|
||||
|
||||
/*
|
||||
* Nitrogen
|
||||
*/
|
||||
/obj/item/weapon/tank/nitrogen
|
||||
name = "nitrogen tank"
|
||||
desc = "A tank of nitrogen."
|
||||
icon_state = "oxygen_fr"
|
||||
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
|
||||
|
||||
|
||||
/obj/item/weapon/tank/nitrogen/New()
|
||||
..()
|
||||
|
||||
src.air_contents.nitrogen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
//
|
||||
src.air_contents.update_values()
|
||||
return
|
||||
|
||||
/obj/item/weapon/tank/nitrogen/examine()
|
||||
set src in usr
|
||||
..()
|
||||
if(air_contents.nitrogen < 10)
|
||||
usr << text("\red <B>The meter on the [src.name] indicates you are almost out of air!</B>")
|
||||
playsound(usr, 'sound/effects/alert.ogg', 50, 1)
|
||||
@@ -136,4 +136,15 @@
|
||||
|
||||
/obj/item/weapon/katana/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/harpoon
|
||||
name = "harpoon"
|
||||
sharp = 1
|
||||
desc = "Tharr she blows!"
|
||||
icon_state = "harpoon"
|
||||
item_state = "harpoon"
|
||||
force = 20
|
||||
throwforce = 15
|
||||
w_class = 2
|
||||
attack_verb = list("jabbed","stabbed","ripped")
|
||||
@@ -0,0 +1,104 @@
|
||||
/obj/random
|
||||
name = "Random Object"
|
||||
desc = "This item type is used to spawn random objects at round-start"
|
||||
icon = 'icons/misc/mark.dmi'
|
||||
icon_state = "rup"
|
||||
var/spawn_nothing_percentage = 0 // this variable determines the likelyhood that this random object will not spawn anything
|
||||
|
||||
|
||||
// creates a new object and deletes itself
|
||||
/obj/random/New()
|
||||
..()
|
||||
if (!prob(spawn_nothing_percentage))
|
||||
spawn_item()
|
||||
del src
|
||||
|
||||
|
||||
// this function should return a specific item to spawn
|
||||
/obj/random/proc/item_to_spawn()
|
||||
return 0
|
||||
|
||||
|
||||
// creates the random item
|
||||
/obj/random/proc/spawn_item()
|
||||
var/build_path = item_to_spawn()
|
||||
return (new build_path(src.loc))
|
||||
|
||||
|
||||
/obj/random/tool
|
||||
name = "Random Tool"
|
||||
desc = "This is a random tool"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "welder"
|
||||
item_to_spawn()
|
||||
return pick(/obj/item/weapon/screwdriver,\
|
||||
/obj/item/weapon/wirecutters,\
|
||||
/obj/item/weapon/weldingtool,\
|
||||
/obj/item/weapon/crowbar,\
|
||||
/obj/item/weapon/wrench,\
|
||||
/obj/item/device/flashlight)
|
||||
|
||||
|
||||
/obj/random/technology_scanner
|
||||
name = "Random Scanner"
|
||||
desc = "This is a random technology scanner."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "atmos"
|
||||
item_to_spawn()
|
||||
return pick(prob(5);/obj/item/device/t_scanner,\
|
||||
prob(2);/obj/item/device/radio/intercom,\
|
||||
prob(5);/obj/item/device/analyzer)
|
||||
|
||||
|
||||
/obj/random/powercell
|
||||
name = "Random Powercell"
|
||||
desc = "This is a random powercell."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
item_to_spawn()
|
||||
return pick(prob(10);/obj/item/weapon/cell/crap,\
|
||||
prob(40);/obj/item/weapon/cell,\
|
||||
prob(40);/obj/item/weapon/cell/high,\
|
||||
prob(9);/obj/item/weapon/cell/super,\
|
||||
prob(1);/obj/item/weapon/cell/hyper)
|
||||
|
||||
|
||||
/obj/random/bomb_supply
|
||||
name = "Bomb Supply"
|
||||
desc = "This is a random bomb supply."
|
||||
icon = 'icons/obj/assemblies/new_assemblies.dmi'
|
||||
icon_state = "signaller"
|
||||
item_to_spawn()
|
||||
return pick(/obj/item/device/assembly/igniter,\
|
||||
/obj/item/device/assembly/prox_sensor,\
|
||||
/obj/item/device/assembly/signaler)
|
||||
|
||||
|
||||
/obj/random/toolbox
|
||||
name = "Random Toolbox"
|
||||
desc = "This is a random toolbox."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "red"
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/storage/toolbox/mechanical,\
|
||||
prob(2);/obj/item/weapon/storage/toolbox/electrical,\
|
||||
prob(1);/obj/item/weapon/storage/toolbox/emergency)
|
||||
|
||||
|
||||
/obj/random/tech_supply
|
||||
name = "Random Tech Supply"
|
||||
desc = "This is a random piece of technology supplies."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
spawn_nothing_percentage = 50
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/random/powercell,\
|
||||
prob(2);/obj/random/technology_scanner,\
|
||||
prob(1);/obj/item/weapon/packageWrap,\
|
||||
prob(2);/obj/random/bomb_supply,\
|
||||
prob(1);/obj/item/weapon/extinguisher,\
|
||||
prob(1);/obj/item/clothing/gloves/fyellow,\
|
||||
prob(3);/obj/item/weapon/cable_coil,\
|
||||
prob(2);/obj/random/toolbox,\
|
||||
prob(2);/obj/item/weapon/storage/belt/utility,\
|
||||
prob(5);/obj/random/tool)
|
||||
@@ -104,6 +104,10 @@
|
||||
new /obj/item/weapon/storage/backpack/industrial(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel_eng(src)
|
||||
if (prob(70))
|
||||
new /obj/item/clothing/tie/storage/brown_vest(src)
|
||||
else
|
||||
new /obj/item/clothing/tie/storage/webbing(src)
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
new /obj/item/clothing/shoes/orange(src)
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(src)
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/leather(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -187,6 +188,7 @@
|
||||
new /obj/item/clothing/glasses/sunglasses/sechud(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
new /obj/item/device/hailer(src)
|
||||
new /obj/item/clothing/tie/storage/black_vest(src)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -13,6 +13,12 @@
|
||||
icon_state = "bed"
|
||||
var/mob/living/buckled_mob
|
||||
|
||||
/obj/structure/stool/psychbed
|
||||
name = "psych bed"
|
||||
desc = "For prime comfort during psychiatric evaluations."
|
||||
icon_state = "psychbed"
|
||||
var/mob/living/buckled_mob
|
||||
|
||||
/obj/structure/stool/bed/alien
|
||||
name = "resting contraption"
|
||||
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
|
||||
|
||||
@@ -37,11 +37,12 @@
|
||||
/obj/structure/stool/MouseDrop(atom/over_object)
|
||||
if (istype(over_object, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = over_object
|
||||
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
|
||||
S.origin = src
|
||||
src.loc = S
|
||||
H.put_in_hands(S)
|
||||
H.visible_message("\red [H] grabs [src] from the floor!", "\red You grab [src] from the floor!")
|
||||
if (!H.restrained() && !H.stat && in_range(src, over_object))
|
||||
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
|
||||
S.origin = src
|
||||
src.loc = S
|
||||
H.put_in_hands(S)
|
||||
H.visible_message("\red [H] grabs [src] from the floor!", "\red You grab [src] from the floor!")
|
||||
|
||||
/obj/item/weapon/stool
|
||||
name = "stool"
|
||||
|
||||
+46
-17
@@ -1,7 +1,7 @@
|
||||
//STRIKE TEAMS
|
||||
|
||||
var/list/response_team_members = list()
|
||||
var/send_emergency_team = 0
|
||||
var/global/send_emergency_team = 0
|
||||
|
||||
client/verb/JoinResponseTeam()
|
||||
set category = "IC"
|
||||
@@ -81,7 +81,7 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
|
||||
send_emergency_team = 1
|
||||
|
||||
var/area/security/nuke_storage/nukeloc = locate()//To find the nuke in the vault
|
||||
/* var/area/security/nuke_storage/nukeloc = locate()//To find the nuke in the vault
|
||||
var/obj/machinery/nuclearbomb/nuke = locate() in nukeloc
|
||||
if(!nuke)
|
||||
nuke = locate() in world
|
||||
@@ -93,18 +93,19 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
P.loc = A.loc
|
||||
del(A)
|
||||
continue
|
||||
*/
|
||||
|
||||
/client/proc/create_response_team(obj/spawn_location, leader_selected = 0, commando_name)
|
||||
|
||||
usr << "\red ERT has been temporarily disabled. Talk to a coder."
|
||||
return
|
||||
//usr << "\red ERT has been temporarily disabled. Talk to a coder."
|
||||
//return
|
||||
|
||||
var/mob/living/carbon/human/M = new(null)
|
||||
response_team_members |= M
|
||||
|
||||
//todo: god damn this.
|
||||
//make it a panel, like in character creation
|
||||
/*var/new_facial = input("Please select facial hair color.", "Character Generation") as color
|
||||
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
|
||||
if(new_facial)
|
||||
M.r_facial = hex2num(copytext(new_facial, 2, 4))
|
||||
M.g_facial = hex2num(copytext(new_facial, 4, 6))
|
||||
@@ -139,16 +140,25 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
hairs.Add(H.name) // add hair name to hairs
|
||||
del(H) // delete the hair after it's all done
|
||||
|
||||
var/new_style = input("Please select hair style", "Character Generation") as null|anything in hairs
|
||||
// var/new_style = input("Please select hair style", "Character Generation") as null|anything in hairs
|
||||
//hair
|
||||
var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list
|
||||
if(new_hstyle)
|
||||
M.h_style = new_hstyle
|
||||
|
||||
// facial hair
|
||||
var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list
|
||||
if(new_fstyle)
|
||||
M.f_style = new_fstyle
|
||||
|
||||
// if new style selected (not cancel)
|
||||
if (new_style)
|
||||
/* if (new_style)
|
||||
M.h_style = new_style
|
||||
|
||||
for(var/x in all_hairs) // loop through all_hairs again. Might be slightly CPU expensive, but not significantly.
|
||||
var/datum/sprite_accessory/hair/H = new x // create new hair datum
|
||||
if(H.name == new_style)
|
||||
M.hair_style = H // assign the hair_style variable a new hair datum
|
||||
M.h_style = H // assign the hair_style variable a new hair datum
|
||||
break
|
||||
else
|
||||
del(H) // if hair H not used, delete. BYOND can garbage collect, but better safe than sorry
|
||||
@@ -169,19 +179,21 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
for(var/x in all_fhairs)
|
||||
var/datum/sprite_accessory/facial_hair/H = new x
|
||||
if(H.name == new_style)
|
||||
M.facial_hair_style = H
|
||||
M.f_style = H
|
||||
break
|
||||
else
|
||||
del(H)
|
||||
|
||||
*/
|
||||
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
|
||||
if (new_gender)
|
||||
if(new_gender == "Male")
|
||||
M.gender = MALE
|
||||
else
|
||||
M.gender = FEMALE
|
||||
M.rebuild_appearance()
|
||||
M.update_body()*/
|
||||
//M.rebuild_appearance()
|
||||
M.update_hair()
|
||||
M.update_body()
|
||||
M.check_dna(M)
|
||||
|
||||
M.real_name = commando_name
|
||||
M.name = commando_name
|
||||
@@ -212,6 +224,16 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
camera.network = "CREED"
|
||||
camera.c_tag = real_name
|
||||
|
||||
//Replaced with new ERT uniform
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
|
||||
equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_ears)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(src), slot_back)
|
||||
/*
|
||||
|
||||
//Old ERT Uniform
|
||||
//Basic Uniform
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/tacticool(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_l_store)
|
||||
@@ -233,21 +255,28 @@ proc/trigger_armed_response_team(var/force = 0)
|
||||
//Backpack
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(src), slot_in_backpack)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
|
||||
*/
|
||||
var/obj/item/weapon/card/id/W = new(src)
|
||||
W.name = "[real_name]'s ID Card (Emergency Response Team)"
|
||||
W.icon_state = "centcom"
|
||||
if(leader_selected)
|
||||
W.name = "[real_name]'s ID Card (Emergency Response Team Leader)"
|
||||
W.access = get_access("Captain")
|
||||
W.access += list(access_cent_teleporter)
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Emergency Response Team Leader"
|
||||
else
|
||||
W.access = get_access("Head of Personnel")
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Emergency Response Team"
|
||||
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)//Let's add their alloted CentCom access.
|
||||
W.registered_name = real_name
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
return 1
|
||||
|
||||
//debug verb (That is horribly coded, LEAVE THIS OFF UNLESS PRIVATELY TESTING. Seriously.
|
||||
/*client/verb/ResponseTeam()
|
||||
set category = "Admin"
|
||||
if(!send_emergency_team)
|
||||
send_emergency_team = 1*/
|
||||
@@ -574,7 +574,7 @@ var/list/mechtoys = list(
|
||||
temp += "<b>Request from: [last_viewed_group]</b><BR><BR>"
|
||||
for(var/supply_name in supply_shuttle.supply_packs )
|
||||
var/datum/supply_packs/N = supply_shuttle.supply_packs[supply_name]
|
||||
if(N.hidden || (N.contraband && !can_order_contraband) || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
|
||||
if((N.hidden && !hacked) || (N.contraband && !can_order_contraband) || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
|
||||
temp += "<A href='?src=\ref[src];doorder=[supply_name]'>[supply_name]</A> Cost: [N.cost]<BR>" //the obj because it would get caught by the garbage
|
||||
|
||||
/*temp = "Supply points: [supply_shuttle.points]<BR><HR><BR>Request what?<BR><BR>"
|
||||
|
||||
@@ -84,3 +84,65 @@ var/global/normal_ooc_colour = "#002eb8"
|
||||
set desc = "Set to yellow for eye burning goodness."
|
||||
set category = "Fun"
|
||||
normal_ooc_colour = newColor
|
||||
|
||||
|
||||
/client/verb/looc(msg as text)
|
||||
set name = "LOOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite
|
||||
set desc = "Local OOC, seen only by those in view."
|
||||
set category = "OOC"
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
usr << "\red Speech is currently admin-disabled."
|
||||
return
|
||||
|
||||
if(!mob) return
|
||||
if(IsGuestKey(key))
|
||||
src << "Guests may not use OOC."
|
||||
return
|
||||
|
||||
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
|
||||
if(!msg) return
|
||||
|
||||
if(!(prefs.toggles & CHAT_OOC))
|
||||
src << "\red You have OOC muted."
|
||||
return
|
||||
|
||||
if(!holder)
|
||||
if(!ooc_allowed)
|
||||
src << "\red OOC is globally muted"
|
||||
return
|
||||
if(!dooc_allowed && (mob.stat == DEAD))
|
||||
usr << "\red OOC for dead mobs has been turned off."
|
||||
return
|
||||
if(prefs.muted & MUTE_OOC)
|
||||
src << "\red You cannot use OOC (muted)."
|
||||
return
|
||||
if(handle_spam_prevention(msg,MUTE_OOC))
|
||||
return
|
||||
if(findtext(msg, "byond://"))
|
||||
src << "<B>Advertising other servers is not allowed.</B>"
|
||||
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
|
||||
return
|
||||
|
||||
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
|
||||
|
||||
for(var/mob/M in hearers())
|
||||
if(!M.client)
|
||||
continue
|
||||
var/client/C = M.client
|
||||
if (C in admins)
|
||||
continue //they are handled after that
|
||||
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
var/display_name = src.key
|
||||
if(holder)
|
||||
if(holder.fakekey)
|
||||
if(C.holder)
|
||||
display_name = "[holder.fakekey]/([src.key])"
|
||||
else
|
||||
display_name = holder.fakekey
|
||||
C << "<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
for(var/client/C in admins)
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
C << "<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[src.key]:</EM> <span class='message'>[msg]</span></span></font>"
|
||||
Reference in New Issue
Block a user