merge maybe fix
This commit is contained in:
@@ -222,18 +222,23 @@
|
||||
|
||||
/obj/effect/vr_clean_master/Initialize()
|
||||
. = ..()
|
||||
vr_area = get_area(src)
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
vr_area = get_base_area(src)
|
||||
if(!vr_area)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES, TIMER_LOOP)
|
||||
|
||||
/obj/effect/vr_clean_master/proc/clean_up()
|
||||
if (vr_area)
|
||||
for (var/obj/item/ammo_casing/casing in vr_area)
|
||||
qdel(casing)
|
||||
for(var/obj/effect/decal/cleanable/C in vr_area)
|
||||
qdel(C)
|
||||
for (var/A in corpse_party)
|
||||
var/mob/M = A
|
||||
if(M && M.stat == DEAD && get_area(M) == vr_area)
|
||||
qdel(M)
|
||||
corpse_party -= M
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
if (!vr_area)
|
||||
qdel(src)
|
||||
return
|
||||
var/list/contents = get_sub_areas_contents(vr_area)
|
||||
for (var/obj/item/ammo_casing/casing in contents)
|
||||
qdel(casing)
|
||||
for(var/obj/effect/decal/cleanable/C in contents)
|
||||
qdel(C)
|
||||
for (var/A in corpse_party)
|
||||
var/mob/M = A
|
||||
if(!QDELETED(M) && (M in contents) && M.stat == DEAD)
|
||||
qdel(M)
|
||||
corpse_party -= M
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
|
||||
@@ -408,7 +408,7 @@
|
||||
var/obj/item/organ/tail/cat/tail = new
|
||||
ears.Insert(H, drop_if_replaced=FALSE)
|
||||
tail.Insert(H, drop_if_replaced=FALSE)
|
||||
var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san")) //John Robust -> Robust-kun
|
||||
var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san"), "[PLURAL]" = list("san")) //John Robust -> Robust-kun
|
||||
var/list/names = splittext(H.real_name," ")
|
||||
var/forename = names.len > 1 ? names[2] : names[1]
|
||||
var/newname = "[forename]-[pick(honorifics["[H.gender]"])]"
|
||||
|
||||
@@ -845,7 +845,11 @@
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_LAVALAND];jobban4=[REF(M)]'><font color=red>Lavaland</font></a></td>"
|
||||
else
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_LAVALAND];jobban4=[REF(M)]'>Lavaland</a></td>"
|
||||
|
||||
// Ghost cafe
|
||||
if(jobban_isbanned(M,ROLE_GHOSTCAFE))
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_GHOSTCAFE];jobban4=[REF(M)]'><font color=red>Lavaland</font></a></td>"
|
||||
else
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_GHOSTCAFE];jobban4=[REF(M)]'>Lavaland</a></td>"
|
||||
dat += "</tr></table>"
|
||||
|
||||
//Antagonist (Orange)
|
||||
@@ -2878,6 +2882,8 @@
|
||||
return
|
||||
if(SSdbcore.Connect())
|
||||
var/datum/DBQuery/query_get_mentor = SSdbcore.NewQuery("SELECT id FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'")
|
||||
if(!query_get_mentor.warn_execute())
|
||||
return
|
||||
if(query_get_mentor.NextRow())
|
||||
to_chat(usr, "<span class='danger'>[ckey] is already a mentor.</span>")
|
||||
return
|
||||
|
||||
@@ -541,7 +541,9 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
var/list/areas_all = list()
|
||||
var/list/areas_with_APC = list()
|
||||
var/list/areas_with_multiple_APCs = list()
|
||||
var/list/sub_areas_APC = list()
|
||||
var/list/areas_with_air_alarm = list()
|
||||
var/list/sub_areas_air_alarm = list()
|
||||
var/list/areas_with_RC = list()
|
||||
var/list/areas_with_light = list()
|
||||
var/list/areas_with_LS = list()
|
||||
@@ -578,6 +580,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
if(!A)
|
||||
dat += "Skipped over [APC] in invalid location, [APC.loc]."
|
||||
continue
|
||||
LAZYSET(sub_areas_APC, A.type, get_sub_areas(A, FALSE))
|
||||
if(!(A.type in areas_with_APC))
|
||||
areas_with_APC.Add(A.type)
|
||||
else if(A.type in areas_all)
|
||||
@@ -585,10 +588,11 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
CHECK_TICK
|
||||
|
||||
for(var/obj/machinery/airalarm/AA in GLOB.machines)
|
||||
var/area/A = get_area(AA)
|
||||
var/area/A = get_base_area(AA)
|
||||
if(!A) //Make sure the target isn't inside an object, which results in runtimes.
|
||||
dat += "Skipped over [AA] in invalid location, [AA.loc].<br>"
|
||||
continue
|
||||
LAZYSET(sub_areas_air_alarm, A.type, get_sub_areas(A, FALSE))
|
||||
if(!(A.type in areas_with_air_alarm))
|
||||
areas_with_air_alarm.Add(A.type)
|
||||
CHECK_TICK
|
||||
@@ -638,8 +642,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
areas_with_camera.Add(A.type)
|
||||
CHECK_TICK
|
||||
|
||||
var/list/areas_without_APC = areas_all - areas_with_APC
|
||||
var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm
|
||||
var/list/areas_without_APC = areas_all - (areas_with_APC + flatten_list(sub_areas_APC))
|
||||
var/list/areas_without_air_alarm = areas_all - (areas_with_air_alarm + flatten_list(sub_areas_air_alarm))
|
||||
var/list/areas_without_RC = areas_all - areas_with_RC
|
||||
var/list/areas_without_light = areas_all - areas_with_light
|
||||
var/list/areas_without_LS = areas_all - areas_with_LS
|
||||
@@ -656,12 +660,18 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
dat += "<h1>AREAS WITH MULTIPLE APCS:</h1>"
|
||||
for(var/areatype in areas_with_multiple_APCs)
|
||||
dat += "[areatype]<br>"
|
||||
if(sub_areas_APC[areatype])
|
||||
dat += " SUB-AREAS:<br> "
|
||||
dat += jointext(sub_areas_APC[areatype], "<br> ")
|
||||
CHECK_TICK
|
||||
|
||||
if(areas_without_air_alarm.len)
|
||||
dat += "<h1>AREAS WITHOUT AN AIR ALARM:</h1>"
|
||||
for(var/areatype in areas_without_air_alarm)
|
||||
dat += "[areatype]<br>"
|
||||
if(sub_areas_air_alarm[areatype])
|
||||
dat += " SUB-AREAS:<br> "
|
||||
dat += jointext(sub_areas_air_alarm[areatype], "<br> ")
|
||||
CHECK_TICK
|
||||
|
||||
if(areas_without_RC.len)
|
||||
|
||||
@@ -419,7 +419,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
|
||||
if(record_found)//If they have a record we can determine a few things.
|
||||
new_character.real_name = record_found.fields["name"]
|
||||
new_character.gender = record_found.fields["sex"]
|
||||
new_character.gender = record_found.fields["gender"]
|
||||
new_character.age = record_found.fields["age"]
|
||||
new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], new record_found.fields["species"], record_found.fields["features"])
|
||||
else
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/datum/antagonist/abductee
|
||||
name = "Abductee"
|
||||
roundend_category = "abductees"
|
||||
antagpanel_category = "Abductee"
|
||||
var/datum/brain_trauma/abductee/brain_trauma
|
||||
|
||||
/datum/antagonist/abductee/on_gain()
|
||||
give_objective()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/abductee/greet()
|
||||
to_chat(owner, "<span class='warning'><b>Your mind snaps!</b></span>")
|
||||
to_chat(owner, "<big><span class='warning'><b>You can't remember how you got here...</b></span></big>")
|
||||
owner.announce_objectives()
|
||||
|
||||
/datum/antagonist/abductee/proc/give_objective()
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(istype(H))
|
||||
H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY)
|
||||
var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random))
|
||||
var/datum/objective/abductee/O = new objtype()
|
||||
objectives += O
|
||||
|
||||
/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override)
|
||||
update_abductor_icons_added(mob_override ? mob_override.mind : owner,"abductee")
|
||||
var/mob/living/carbon/C = mob_override || owner?.current
|
||||
if(istype(C))
|
||||
if(brain_trauma)
|
||||
qdel(brain_trauma) //make sure there's no lingering trauma
|
||||
brain_trauma = C.gain_trauma(/datum/brain_trauma/abductee, TRAUMA_RESILIENCE_SURGERY)
|
||||
|
||||
/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override)
|
||||
update_abductor_icons_removed(mob_override ? mob_override.mind : owner)
|
||||
qdel(brain_trauma)
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
/datum/objective/abductee/paint/New()
|
||||
var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
|
||||
explanation_text+= " [color]!"
|
||||
explanation_text = " [color]!"
|
||||
|
||||
/datum/objective/abductee/speech
|
||||
explanation_text = "Your brain is broken... you can only communicate in"
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/datum/brain_trauma/abductee
|
||||
name = "abductee mindsnapped"
|
||||
desc = "The patient's brain has been scrambled by experimental procedures."
|
||||
scan_desc = "brain scrambling"
|
||||
gain_text = "<span class='danger'>Your mind snaps.. you feel fragmented.</span>"
|
||||
lose_text = "<span class='boldnotice'>Your mind heals itself and you feel whole again.</span>"
|
||||
random_gain = FALSE
|
||||
clonable = TRUE
|
||||
|
||||
/datum/brain_trauma/abductee/on_gain()
|
||||
. = ..()
|
||||
if(owner.mind)
|
||||
if(!owner.mind.has_antag_datum(/datum/antagonist/abductee))
|
||||
owner.mind.add_antag_datum(/datum/antagonist/abductee)
|
||||
|
||||
/datum/brain_trauma/abductee/on_lose()
|
||||
. = ..()
|
||||
owner.mind?.remove_antag_datum(/datum/antagonist/abductee)
|
||||
@@ -159,35 +159,6 @@
|
||||
|
||||
return "<div class='panel redborder'>[result.Join("<br>")]</div>"
|
||||
|
||||
/datum/antagonist/abductee
|
||||
name = "Abductee"
|
||||
roundend_category = "abductees"
|
||||
antagpanel_category = "Abductee"
|
||||
|
||||
/datum/antagonist/abductee/on_gain()
|
||||
give_objective()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/abductee/greet()
|
||||
to_chat(owner, "<span class='warning'><b>Your mind snaps!</b></span>")
|
||||
to_chat(owner, "<big><span class='warning'><b>You can't remember how you got here...</b></span></big>")
|
||||
owner.announce_objectives()
|
||||
|
||||
/datum/antagonist/abductee/proc/give_objective()
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(istype(H))
|
||||
H.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_LOBOTOMY)
|
||||
var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random))
|
||||
var/datum/objective/abductee/O = new objtype()
|
||||
objectives += O
|
||||
|
||||
/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override)
|
||||
update_abductor_icons_added(mob_override ? mob_override.mind : owner,"abductee")
|
||||
|
||||
/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override)
|
||||
update_abductor_icons_removed(mob_override ? mob_override.mind : owner)
|
||||
|
||||
|
||||
// LANDMARKS
|
||||
/obj/effect/landmark/abductor
|
||||
var/team_number = 1
|
||||
|
||||
@@ -29,6 +29,11 @@
|
||||
var/stealth_armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 15, "bio" = 15, "rad" = 15, "fire" = 70, "acid" = 70)
|
||||
var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90)
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/Initialize()
|
||||
. = ..()
|
||||
stealth_armor = getArmor(arglist(stealth_armor))
|
||||
combat_armor = getArmor(arglist(combat_armor))
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT))
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT)
|
||||
@@ -629,15 +634,12 @@
|
||||
icon_state = "abductor_headset"
|
||||
item_state = "abductor_headset"
|
||||
keyslot2 = new /obj/item/encryptionkey/heads/captain
|
||||
bowman = TRUE
|
||||
|
||||
/obj/item/radio/headset/abductor/Initialize(mapload)
|
||||
. = ..()
|
||||
make_syndie()
|
||||
|
||||
/obj/item/radio/headset/abductor/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS))
|
||||
|
||||
/obj/item/radio/headset/abductor/attackby(obj/item/W, mob/user, params)
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
return // Stops humans from disassembling abductor headsets.
|
||||
|
||||
@@ -22,7 +22,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
|
||||
icon = 'icons/obj/rune.dmi'
|
||||
icon_state = "1"
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
layer = LOW_OBJ_LAYER
|
||||
layer = SIGIL_LAYER
|
||||
color = RUNE_COLOR_RED
|
||||
|
||||
var/invocation = "Aiy ele-mayo." //This is said by cultists when the rune is invoked.
|
||||
|
||||
@@ -274,7 +274,8 @@
|
||||
|
||||
/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
S.DisIntegrate(src)
|
||||
toggle_cam(S, 0)
|
||||
if(!QDELETED(S)) //If it got blown up no need to turn it off.
|
||||
toggle_cam(S, 0)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
|
||||
|
||||
@@ -22,11 +22,19 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
desc = "You aren't entirely sure what this does, but it's very beepy and boopy."
|
||||
background_icon_state = "bg_tech_blue"
|
||||
icon_icon = 'icons/mob/actions/actions_AI.dmi'
|
||||
check_flags = AB_CHECK_CONSCIOUS //can't doomsday if dead.
|
||||
var/mob/living/silicon/ai/owner_AI //The owner AI, so we don't have to typecast every time
|
||||
var/uses //If we have multiple uses of the same power
|
||||
var/auto_use_uses = TRUE //If we automatically use up uses on each activation
|
||||
var/cooldown_period //If applicable, the time in deciseconds we have to wait before using any more modules
|
||||
|
||||
|
||||
/datum/action/innate/ai/New()
|
||||
..()
|
||||
if(uses > 1)
|
||||
desc = "[desc] It has [uses] use\s remaining."
|
||||
button.desc = desc
|
||||
|
||||
/datum/action/innate/ai/Grant(mob/living/L)
|
||||
. = ..()
|
||||
if(!isAI(owner))
|
||||
@@ -38,7 +46,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
/datum/action/innate/ai/IsAvailable()
|
||||
. = ..()
|
||||
if(owner_AI && owner_AI.malf_cooldown > world.time)
|
||||
return
|
||||
return FALSE
|
||||
|
||||
/datum/action/innate/ai/Trigger()
|
||||
. = ..()
|
||||
@@ -49,12 +57,16 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
|
||||
/datum/action/innate/ai/proc/adjust_uses(amt, silent)
|
||||
uses += amt
|
||||
if(!silent && uses)
|
||||
to_chat(owner, "<span class='notice'>[name] now has <b>[uses]</b> use[uses > 1 ? "s" : ""] remaining.</span>")
|
||||
if(!uses)
|
||||
if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway!
|
||||
to_chat(owner, "<span class='warning'>[name] has run out of uses!</span>")
|
||||
qdel(src)
|
||||
if(uses)
|
||||
if(!silent)
|
||||
to_chat(owner, "<span class='notice'>[name] now has <b>[uses]</b> use[uses > 1 ? "s" : ""] remaining.</span>")
|
||||
desc = "[initial(desc)] It has [uses] use\s remaining."
|
||||
UpdateButtonIcon()
|
||||
return
|
||||
if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway!
|
||||
to_chat(owner, "<span class='warning'>[name] has run out of uses!</span>")
|
||||
qdel(src)
|
||||
|
||||
|
||||
//Framework for ranged abilities that can have different effects by left-clicking stuff.
|
||||
/datum/action/innate/ai/ranged
|
||||
@@ -74,13 +86,16 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
|
||||
/datum/action/innate/ai/ranged/adjust_uses(amt, silent)
|
||||
uses += amt
|
||||
if(!silent && uses)
|
||||
to_chat(owner, "<span class='notice'>[name] now has <b>[uses]</b> use[uses > 1 ? "s" : ""] remaining.</span>")
|
||||
if(!uses)
|
||||
if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway!
|
||||
to_chat(owner, "<span class='warning'>[name] has run out of uses!</span>")
|
||||
Remove(owner)
|
||||
QDEL_IN(src, 100) //let any active timers on us finish up
|
||||
if(uses)
|
||||
if(!silent)
|
||||
to_chat(owner, "<span class='notice'>[name] now has <b>[uses]</b> use[uses > 1 ? "s" : ""] remaining.</span>")
|
||||
desc = "[initial(desc)] It has [uses] use\s remaining."
|
||||
UpdateButtonIcon()
|
||||
return
|
||||
if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway!
|
||||
to_chat(owner, "<span class='warning'>[name] has run out of uses!</span>")
|
||||
Remove(owner)
|
||||
QDEL_IN(src, 100) //let any active timers on us finish up
|
||||
|
||||
/datum/action/innate/ai/ranged/Destroy()
|
||||
QDEL_NULL(linked_ability)
|
||||
@@ -97,7 +112,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
var/datum/action/innate/ai/ranged/attached_action
|
||||
|
||||
/obj/effect/proc_holder/ranged_ai/Destroy()
|
||||
QDEL_NULL(attached_action)
|
||||
attached_action = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/proc_holder/ranged_ai/proc/toggle(mob/user)
|
||||
@@ -185,6 +200,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
A.playsound_local(A, AM.unlock_sound, 50, 0)
|
||||
else //Adding uses to an existing module
|
||||
action.uses += initial(action.uses)
|
||||
action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining."
|
||||
action.UpdateButtonIcon()
|
||||
temp = "Additional use[action.uses > 1 ? "s" : ""] added to [action.name]!"
|
||||
processing_time -= AM.cost
|
||||
|
||||
@@ -238,6 +255,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
return
|
||||
if(alert(owner, "Send arming signal? (true = arm, false = cancel)", "purge_all_life()", "confirm = TRUE;", "confirm = FALSE;") != "confirm = TRUE;")
|
||||
return
|
||||
if (active)
|
||||
return //prevent the AI from activating an already active doomsday
|
||||
active = TRUE
|
||||
set_us_up_the_bomb(owner)
|
||||
|
||||
@@ -245,64 +264,64 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
set waitfor = FALSE
|
||||
to_chat(owner, "<span class='small boldannounce'>run -o -a 'selfdestruct'</span>")
|
||||
sleep(5)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='small boldannounce'>Running executable 'selfdestruct'...</span>")
|
||||
sleep(rand(10, 30))
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
owner.playsound_local(owner, 'sound/misc/bloblarm.ogg', 50, 0)
|
||||
to_chat(owner, "<span class='userdanger'>!!! UNAUTHORIZED SELF-DESTRUCT ACCESS !!!</span>")
|
||||
to_chat(owner, "<span class='boldannounce'>This is a class-3 security violation. This incident will be reported to Central Command.</span>")
|
||||
for(var/i in 1 to 3)
|
||||
sleep(20)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='boldannounce'>Sending security report to Central Command.....[rand(0, 9) + (rand(20, 30) * i)]%</span>")
|
||||
sleep(3)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='small boldannounce'>auth 'akjv9c88asdf12nb' ******************</span>")
|
||||
owner.playsound_local(owner, 'sound/items/timer.ogg', 50, 0)
|
||||
sleep(30)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='boldnotice'>Credentials accepted. Welcome, akjv9c88asdf12nb.</span>")
|
||||
owner.playsound_local(owner, 'sound/misc/server-ready.ogg', 50, 0)
|
||||
sleep(5)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='boldnotice'>Arm self-destruct device? (Y/N)</span>")
|
||||
owner.playsound_local(owner, 'sound/misc/compiler-stage1.ogg', 50, 0)
|
||||
sleep(20)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='small boldannounce'>Y</span>")
|
||||
sleep(15)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='boldnotice'>Confirm arming of self-destruct device? (Y/N)</span>")
|
||||
owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0)
|
||||
sleep(10)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='small boldannounce'>Y</span>")
|
||||
sleep(rand(15, 25))
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='boldnotice'>Please repeat password to confirm.</span>")
|
||||
owner.playsound_local(owner, 'sound/misc/compiler-stage2.ogg', 50, 0)
|
||||
sleep(14)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='small boldannounce'>******************</span>")
|
||||
sleep(40)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
to_chat(owner, "<span class='boldnotice'>Credentials accepted. Transmitting arming signal...</span>")
|
||||
owner.playsound_local(owner, 'sound/misc/server-ready.ogg', 50, 0)
|
||||
sleep(30)
|
||||
if(!owner || QDELETED(owner))
|
||||
if(QDELETED(owner) || owner.stat == DEAD)
|
||||
return
|
||||
priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", "aimalf")
|
||||
set_security_level("delta")
|
||||
@@ -724,9 +743,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
|
||||
/datum/action/innate/ai/blackout
|
||||
name = "Blackout"
|
||||
desc = "Overloads lights across the station."
|
||||
desc = "Overloads random lights across the station."
|
||||
button_icon_state = "blackout"
|
||||
uses = 3
|
||||
auto_use_uses = FALSE
|
||||
|
||||
/datum/action/innate/ai/blackout/Activate()
|
||||
for(var/obj/machinery/power/apc/apc in GLOB.apcs_list)
|
||||
@@ -736,6 +756,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
apc.overload++
|
||||
to_chat(owner, "<span class='notice'>Overcurrent applied to the powernet.</span>")
|
||||
owner.playsound_local(owner, "sparks", 50, 0)
|
||||
adjust_uses(-1)
|
||||
|
||||
|
||||
//Disable Emergency Lights
|
||||
@@ -784,11 +805,6 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
auto_use_uses = FALSE
|
||||
cooldown_period = 30
|
||||
|
||||
/datum/action/innate/ai/reactivate_cameras/New()
|
||||
..()
|
||||
desc = "[desc] There are 30 reactivations remaining."
|
||||
button.desc = desc
|
||||
|
||||
/datum/action/innate/ai/reactivate_cameras/Activate()
|
||||
var/fixed_cameras = 0
|
||||
for(var/V in GLOB.cameranet.cameras)
|
||||
@@ -803,8 +819,6 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
to_chat(owner, "<span class='notice'>Diagnostic complete! Cameras reactivated: <b>[fixed_cameras]</b>. Reactivations remaining: <b>[uses]</b>.</span>")
|
||||
owner.playsound_local(owner, 'sound/items/wirecutter.ogg', 50, 0)
|
||||
adjust_uses(0, TRUE) //Checks the uses remaining
|
||||
if(src && uses) //Not sure if not having src here would cause a runtime, so it's here to be safe
|
||||
desc = "[initial(desc)] There are [uses] reactivations remaining."
|
||||
|
||||
|
||||
//Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision.
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
|
||||
/datum/spellbook_entry/timestop
|
||||
name = "Time Stop"
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/timestop
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/smoke
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
return FALSE
|
||||
switch(type)
|
||||
if("feet")
|
||||
if(!H.shoes)
|
||||
if(!H.shoes || !(H.shoes.body_parts_covered & FEET))
|
||||
affecting = H.get_bodypart(pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
|
||||
H.Knockdown(60)
|
||||
if(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND)
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
|
||||
|
||||
if(name == initial(name))
|
||||
name = "[get_area_name(src)] Air Alarm"
|
||||
name = "[get_area_name(src, get_base_area = TRUE)] Air Alarm"
|
||||
|
||||
power_change()
|
||||
set_frequency(frequency)
|
||||
@@ -250,7 +250,7 @@
|
||||
"danger_level" = danger_level,
|
||||
)
|
||||
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
data["atmos_alarm"] = A.atmosalm
|
||||
data["fire_alarm"] = A.fire
|
||||
|
||||
@@ -386,7 +386,7 @@
|
||||
send_signal(device_id, list("checks" = text2num(params["val"])^2), usr)
|
||||
. = TRUE
|
||||
if("set_external_pressure", "set_internal_pressure")
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null
|
||||
if(!isnull(target) && !..())
|
||||
send_signal(device_id, list("[action]" = target), usr)
|
||||
@@ -420,12 +420,12 @@
|
||||
apply_mode()
|
||||
. = TRUE
|
||||
if("alarm")
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(A.atmosalert(2, src))
|
||||
post_alert(2)
|
||||
. = TRUE
|
||||
if("reset")
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(A.atmosalert(0, src))
|
||||
post_alert(0)
|
||||
. = TRUE
|
||||
@@ -456,7 +456,7 @@
|
||||
return 0
|
||||
|
||||
/obj/machinery/airalarm/proc/refresh_all()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
for(var/id_tag in A.air_vent_names)
|
||||
var/list/I = A.air_vent_info[id_tag]
|
||||
if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
|
||||
@@ -507,7 +507,7 @@
|
||||
return "Flood"
|
||||
|
||||
/obj/machinery/airalarm/proc/apply_mode()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
switch(mode)
|
||||
if(AALARM_MODE_SCRUBBING)
|
||||
for(var/device_id in A.air_scrub_names)
|
||||
@@ -645,7 +645,7 @@
|
||||
|
||||
icon_state = "alarm1"
|
||||
var/overlay_state = AALARM_OVERLAY_OFF
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
switch(max(danger_level, A.atmosalm))
|
||||
if(0)
|
||||
add_overlay(AALARM_OVERLAY_GREEN)
|
||||
@@ -715,7 +715,7 @@
|
||||
return
|
||||
|
||||
var/datum/signal/alert_signal = new(list(
|
||||
"zone" = get_area_name(src),
|
||||
"zone" = get_area_name(src, get_base_area = TRUE),
|
||||
"type" = "Atmospheric"
|
||||
))
|
||||
if(alert_level==2)
|
||||
@@ -728,7 +728,7 @@
|
||||
frequency.post_signal(src, alert_signal, range = -1)
|
||||
|
||||
/obj/machinery/airalarm/proc/apply_danger_level()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
|
||||
var/new_area_danger_level = 0
|
||||
for(var/obj/machinery/airalarm/AA in A)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon_state = "relief_valve-t-map"
|
||||
can_unwrench = TRUE
|
||||
construction_type = /obj/item/pipe/binary
|
||||
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
|
||||
var/opened = FALSE
|
||||
var/open_pressure = ONE_ATMOSPHERE * 3
|
||||
var/close_pressure = ONE_ATMOSPHERE
|
||||
@@ -50,9 +51,11 @@
|
||||
if(!is_operational())
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air_contents = airs[1]
|
||||
var/our_pressure = air_contents.return_pressure()
|
||||
if(opened && our_pressure < close_pressure)
|
||||
var/datum/gas_mixture/air_one = airs[1]
|
||||
var/datum/gas_mixture/air_two = airs[2]
|
||||
var/air_one_pressure = air_one.return_pressure()
|
||||
var/our_pressure = abs(air_one_pressure - air_two.return_pressure())
|
||||
if(opened && air_one_pressure < close_pressure)
|
||||
close()
|
||||
else if(!opened && our_pressure >= open_pressure)
|
||||
open()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
underlays.Cut()
|
||||
|
||||
var/turf/T = loc
|
||||
if(level == 2 || !T.intact)
|
||||
if(level == 2 || (istype(T) && !T.intact))
|
||||
showpipe = TRUE
|
||||
plane = GAME_PLANE
|
||||
else
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon = 'icons/obj/atmospherics/components/relief_valve.dmi'
|
||||
icon_state = "relief_valve-e-map"
|
||||
can_unwrench = TRUE
|
||||
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
|
||||
var/opened = FALSE
|
||||
var/open_pressure = ONE_ATMOSPHERE * 3
|
||||
var/close_pressure = ONE_ATMOSPHERE
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
id_tag = assign_uid_vents()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/Destroy()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if (A)
|
||||
A.air_vent_names -= id_tag
|
||||
A.air_vent_info -= id_tag
|
||||
@@ -155,7 +155,7 @@
|
||||
"sigtype" = "status"
|
||||
))
|
||||
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(!A.air_vent_names[id_tag])
|
||||
name = "\improper [A.name] vent pump #[A.air_vent_names.len + 1]"
|
||||
A.air_vent_names[id_tag] = name
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
filter_types += gas_id2path(f)
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if (A)
|
||||
A.air_scrub_names -= id_tag
|
||||
A.air_scrub_info -= id_tag
|
||||
@@ -112,7 +112,7 @@
|
||||
"sigtype" = "status"
|
||||
))
|
||||
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(!A.air_scrub_names[id_tag])
|
||||
name = "\improper [A.name] air scrubber #[A.air_scrub_names.len + 1]"
|
||||
A.air_scrub_names[id_tag] = name
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//3-Way Manifold
|
||||
/obj/machinery/atmospherics/pipe/heat_exchanging/manifold
|
||||
icon_state = "manifold"
|
||||
icon_state = "manifold-2"
|
||||
|
||||
name = "pipe manifold"
|
||||
desc = "A manifold composed of regular pipes."
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
#define AMMO_DROP_LIFETIME 300
|
||||
#define CTF_REQUIRED_PLAYERS 4
|
||||
|
||||
|
||||
|
||||
/obj/item/twohanded/ctf
|
||||
name = "banner"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
@@ -210,7 +208,6 @@
|
||||
toggle_all_ctf(user)
|
||||
return
|
||||
|
||||
|
||||
people_who_want_to_play |= user.ckey
|
||||
var/num = people_who_want_to_play.len
|
||||
var/remaining = CTF_REQUIRED_PLAYERS - num
|
||||
@@ -438,9 +435,9 @@
|
||||
. = FALSE
|
||||
if(istype(target, /obj/structure/barricade/security/ctf))
|
||||
. = TRUE
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/shielded/ctf))
|
||||
if(isliving(target))
|
||||
var/mob/living/H = target
|
||||
if((RED_TEAM in H.faction) || (BLUE_TEAM in H.faction))
|
||||
. = TRUE
|
||||
|
||||
// RED TEAM GUNS
|
||||
|
||||
@@ -64,4 +64,3 @@
|
||||
description = "Nanotrasen has secured a contract in a reenactment of a famous movie, but we only have lethal energy based swords. Send us some convincing replicas so we save on medical costs."
|
||||
reward = 1200
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/toy/sword, /obj/item/toy/sword/cx)
|
||||
@@ -92,11 +92,42 @@
|
||||
export_types = list(/obj/item/stock_parts/cell/bluespace)
|
||||
|
||||
/datum/export/cellyellow
|
||||
cost = 40
|
||||
cost = 200
|
||||
unit_name = "slime power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/high/slime)
|
||||
|
||||
/datum/export/cellyellowhyper
|
||||
cost = 120 //Takes a lot to make and is really good
|
||||
cost = 1200 //Takes a lot to make and is really good
|
||||
unit_name = "hyper slime power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/high/slime/hypercharged)
|
||||
export_types = list(/obj/item/stock_parts/cell/high/slime/hypercharged)
|
||||
|
||||
//Glass working stuff
|
||||
|
||||
/datum/export/glasswork_dish
|
||||
cost = 300
|
||||
unit_name = "small glass dish"
|
||||
export_types = list(/obj/item/reagent_containers/glass/beaker/glass_dish)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/glasswork_lens
|
||||
cost = 1800
|
||||
unit_name = "small glass lens"
|
||||
export_types = list(/obj/item/lens)
|
||||
|
||||
/datum/export/glasswork_spouty
|
||||
cost = 1200
|
||||
unit_name = "flask with spout"
|
||||
export_types = list(/obj/item/reagent_containers/glass/beaker/flask/spouty)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/glasswork_smallflask
|
||||
cost = 600
|
||||
unit_name = "small flask"
|
||||
export_types = list(/obj/item/reagent_containers/glass/beaker/flask)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/glasswork_largeflask
|
||||
cost = 1000
|
||||
unit_name = "large flask"
|
||||
export_types = list(/obj/item/reagent_containers/glass/beaker/flask/large)
|
||||
include_subtypes = FALSE
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
crate_name = "swat taser crate"
|
||||
|
||||
/datum/supply_pack/security/armory/woodstock
|
||||
name = "Classic WoodStock Shotguns Crate"
|
||||
name = "WoodStock Classic Shotguns Crate"
|
||||
desc = "Contains three rustic, pumpaction shotguns. Requires Armory access to open."
|
||||
cost = 3000
|
||||
contains = list(/obj/item/gun/ballistic/shotgun,
|
||||
|
||||
@@ -3,12 +3,18 @@
|
||||
// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal
|
||||
// cost = 700- Minimum cost, or infinite points are possible.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Costumes & Toys /////////////////////////////////
|
||||
////////////////////////////////// Toys //////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/costumes_toys
|
||||
group = "Costumes & Toys"
|
||||
|
||||
/datum/supply_pack/costumes_toys/randomised/fill(obj/structure/closet/crate/C)
|
||||
var/list/L = contains.Copy()
|
||||
for(var/i in 1 to num_contained)
|
||||
var/item = pick_n_take(L)
|
||||
new item(C)
|
||||
|
||||
/datum/supply_pack/costumes_toys/randomised
|
||||
name = "Collectable Hats Crate"
|
||||
desc = "Flaunt your status with three unique, highly-collectable hats!"
|
||||
@@ -92,40 +98,6 @@
|
||||
/obj/item/ammo_box/magazine/toy/pistol)
|
||||
crate_name = "foam force crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/formalwear
|
||||
name = "Formalwear Crate"
|
||||
desc = "You're gonna like the way you look, I guaranteed it. Contains an asston of fancy clothing."
|
||||
cost = 4750 //Lots of fancy clothing that can be sold back!
|
||||
contains = list(/obj/item/clothing/under/blacktango,
|
||||
/obj/item/clothing/under/assistantformal,
|
||||
/obj/item/clothing/under/assistantformal,
|
||||
/obj/item/clothing/under/lawyer/bluesuit,
|
||||
/obj/item/clothing/suit/toggle/lawyer,
|
||||
/obj/item/clothing/under/lawyer/purpsuit,
|
||||
/obj/item/clothing/suit/toggle/lawyer/purple,
|
||||
/obj/item/clothing/under/lawyer/blacksuit,
|
||||
/obj/item/clothing/suit/toggle/lawyer/black,
|
||||
/obj/item/clothing/accessory/waistcoat,
|
||||
/obj/item/clothing/neck/tie/blue,
|
||||
/obj/item/clothing/neck/tie/red,
|
||||
/obj/item/clothing/neck/tie/black,
|
||||
/obj/item/clothing/head/bowler,
|
||||
/obj/item/clothing/head/fedora,
|
||||
/obj/item/clothing/head/flatcap,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/head/that,
|
||||
/obj/item/clothing/shoes/laceup,
|
||||
/obj/item/clothing/shoes/laceup,
|
||||
/obj/item/clothing/shoes/laceup,
|
||||
/obj/item/clothing/under/suit_jacket/charcoal,
|
||||
/obj/item/clothing/under/suit_jacket/navy,
|
||||
/obj/item/clothing/under/suit_jacket/burgundy,
|
||||
/obj/item/clothing/under/suit_jacket/checkered,
|
||||
/obj/item/clothing/under/suit_jacket/tan,
|
||||
/obj/item/lipstick/random)
|
||||
crate_name = "formalwear crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/costumes_toys/clownpin
|
||||
name = "Hilarious Firing Pin Crate"
|
||||
desc = "I uh... I'm not really sure what this does. Wanna buy it?"
|
||||
@@ -167,47 +139,6 @@
|
||||
contains = list(/obj/item/storage/box/lasertagpins)
|
||||
crate_name = "laser tag crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/costume_original
|
||||
name = "Original Costume Crate"
|
||||
desc = "Reenact Shakespearean plays with this assortment of outfits. Contains eight different costumes!"
|
||||
cost = 1750
|
||||
contains = list(/obj/item/clothing/head/snowman,
|
||||
/obj/item/clothing/suit/snowman,
|
||||
/obj/item/clothing/head/chicken,
|
||||
/obj/item/clothing/suit/chickensuit,
|
||||
/obj/item/clothing/mask/gas/monkeymask,
|
||||
/obj/item/clothing/suit/monkeysuit,
|
||||
/obj/item/clothing/head/cardborg,
|
||||
/obj/item/clothing/suit/cardborg,
|
||||
/obj/item/clothing/head/xenos,
|
||||
/obj/item/clothing/suit/xenos,
|
||||
/obj/item/clothing/suit/hooded/ian_costume,
|
||||
/obj/item/clothing/suit/hooded/carp_costume,
|
||||
/obj/item/clothing/suit/hooded/bee_costume)
|
||||
crate_name = "original costume crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/costumes_toys/costume
|
||||
name = "Standard Costume Crate"
|
||||
desc = "Supply the station's entertainers with the equipment of their trade with these Nanotrasen-approved costumes! Contains a full clown and mime outfit, along with a bike horn and a bottle of nothing."
|
||||
cost = 1300
|
||||
access = ACCESS_THEATRE
|
||||
contains = list(/obj/item/storage/backpack/clown,
|
||||
/obj/item/clothing/shoes/clown_shoes,
|
||||
/obj/item/clothing/mask/gas/clown_hat,
|
||||
/obj/item/clothing/under/rank/clown,
|
||||
/obj/item/bikehorn,
|
||||
/obj/item/clothing/under/rank/mime,
|
||||
/obj/item/clothing/shoes/sneakers/black,
|
||||
/obj/item/clothing/gloves/color/white,
|
||||
/obj/item/clothing/mask/gas/mime,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/suit/suspenders,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing,
|
||||
/obj/item/storage/backpack/mime)
|
||||
crate_name = "standard costume crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/costumes_toys/randomised/toys
|
||||
name = "Toy Crate"
|
||||
desc = "Who cares about pride and accomplishment? Skip the gaming and get straight to the sweet rewards with this product! Contains five random toys. Warranty void if used to prank research directors."
|
||||
@@ -278,6 +209,86 @@
|
||||
crate_name = "plushie crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////// Costumes //////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/costumes_toys/formalwear
|
||||
name = "Formalwear Crate"
|
||||
desc = "You're gonna like the way you look, I guaranteed it. Contains an asston of fancy clothing."
|
||||
cost = 4750 //Lots of fancy clothing that can be sold back!
|
||||
contains = list(/obj/item/clothing/under/blacktango,
|
||||
/obj/item/clothing/under/assistantformal,
|
||||
/obj/item/clothing/under/assistantformal,
|
||||
/obj/item/clothing/under/lawyer/bluesuit,
|
||||
/obj/item/clothing/suit/toggle/lawyer,
|
||||
/obj/item/clothing/under/lawyer/purpsuit,
|
||||
/obj/item/clothing/suit/toggle/lawyer/purple,
|
||||
/obj/item/clothing/under/lawyer/blacksuit,
|
||||
/obj/item/clothing/suit/toggle/lawyer/black,
|
||||
/obj/item/clothing/accessory/waistcoat,
|
||||
/obj/item/clothing/neck/tie/blue,
|
||||
/obj/item/clothing/neck/tie/red,
|
||||
/obj/item/clothing/neck/tie/black,
|
||||
/obj/item/clothing/head/bowler,
|
||||
/obj/item/clothing/head/fedora,
|
||||
/obj/item/clothing/head/flatcap,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/head/that,
|
||||
/obj/item/clothing/shoes/laceup,
|
||||
/obj/item/clothing/shoes/laceup,
|
||||
/obj/item/clothing/shoes/laceup,
|
||||
/obj/item/clothing/under/suit_jacket/charcoal,
|
||||
/obj/item/clothing/under/suit_jacket/navy,
|
||||
/obj/item/clothing/under/suit_jacket/burgundy,
|
||||
/obj/item/clothing/under/suit_jacket/checkered,
|
||||
/obj/item/clothing/under/suit_jacket/tan,
|
||||
/obj/item/lipstick/random)
|
||||
crate_name = "formalwear crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/costumes_toys/costume_original
|
||||
name = "Original Costume Crate"
|
||||
desc = "Reenact Shakespearean plays with this assortment of outfits. Contains eight different costumes!"
|
||||
cost = 1750
|
||||
contains = list(/obj/item/clothing/head/snowman,
|
||||
/obj/item/clothing/suit/snowman,
|
||||
/obj/item/clothing/head/chicken,
|
||||
/obj/item/clothing/suit/chickensuit,
|
||||
/obj/item/clothing/mask/gas/monkeymask,
|
||||
/obj/item/clothing/suit/monkeysuit,
|
||||
/obj/item/clothing/head/cardborg,
|
||||
/obj/item/clothing/suit/cardborg,
|
||||
/obj/item/clothing/head/xenos,
|
||||
/obj/item/clothing/suit/xenos,
|
||||
/obj/item/clothing/suit/hooded/ian_costume,
|
||||
/obj/item/clothing/suit/hooded/carp_costume,
|
||||
/obj/item/clothing/suit/hooded/bee_costume)
|
||||
crate_name = "original costume crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/costumes_toys/costume
|
||||
name = "Standard Costume Crate"
|
||||
desc = "Supply the station's entertainers with the equipment of their trade with these Nanotrasen-approved costumes! Contains a full clown and mime outfit, along with a bike horn and a bottle of nothing."
|
||||
cost = 1300
|
||||
access = ACCESS_THEATRE
|
||||
contains = list(/obj/item/storage/backpack/clown,
|
||||
/obj/item/clothing/shoes/clown_shoes,
|
||||
/obj/item/clothing/mask/gas/clown_hat,
|
||||
/obj/item/clothing/under/rank/clown,
|
||||
/obj/item/bikehorn,
|
||||
/obj/item/clothing/under/rank/mime,
|
||||
/obj/item/clothing/shoes/sneakers/black,
|
||||
/obj/item/clothing/gloves/color/white,
|
||||
/obj/item/clothing/mask/gas/mime,
|
||||
/obj/item/clothing/head/beret,
|
||||
/obj/item/clothing/suit/suspenders,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing,
|
||||
/obj/item/storage/backpack/mime)
|
||||
crate_name = "standard costume crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/costumes_toys/wizard
|
||||
name = "Wizard Costume Crate"
|
||||
desc = "Pretend to join the Wizard Federation with this full wizard outfit! Nanotrasen would like to remind its employees that actually joining the Wizard Federation is subject to termination of job and life."
|
||||
@@ -288,82 +299,3 @@
|
||||
/obj/item/clothing/head/wizard/fake)
|
||||
crate_name = "wizard costume crate"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/costumes_toys/randomised/fill(obj/structure/closet/crate/C)
|
||||
var/list/L = contains.Copy()
|
||||
for(var/i in 1 to num_contained)
|
||||
var/item = pick_n_take(L)
|
||||
new item(C)
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/autodrobe
|
||||
name = "Autodrobe Supply Crate"
|
||||
desc = "Autodrobe missing your favorite dress? Solve that issue today with this autodrobe refill."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/autodrobe)
|
||||
crate_name = "autodrobe supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/cargo
|
||||
name = "Cargo Wardrobe Supply Crate"
|
||||
desc = "This crate contains a refill for the CargoDrobe."
|
||||
cost = 750
|
||||
contains = list(/obj/item/vending_refill/wardrobe/cargo_wardrobe)
|
||||
crate_name = "cargo department supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/engineering
|
||||
name = "Engineering Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the EngiDrobe and AtmosDrobe."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/wardrobe/engi_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/atmos_wardrobe)
|
||||
crate_name = "engineering department wardrobe supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/general
|
||||
name = "General Wardrobes Supply Crate"
|
||||
desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe."
|
||||
cost = 3750
|
||||
contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/bar_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/chef_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/jani_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/chap_wardrobe)
|
||||
crate_name = "general wardrobes vendor refills"
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/hydroponics
|
||||
name = "Hydrobe Supply Crate"
|
||||
desc = "This crate contains a refill for the Hydrobe."
|
||||
cost = 750
|
||||
contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe)
|
||||
crate_name = "hydrobe supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/medical
|
||||
name = "Medical Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the MediDrobe, ChemDrobe, GeneDrobe, and ViroDrobe."
|
||||
cost = 3000
|
||||
contains = list(/obj/item/vending_refill/wardrobe/medi_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/chem_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/gene_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/viro_wardrobe)
|
||||
crate_name = "medical department wardrobe supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/science
|
||||
name = "Science Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the SciDrobe and RoboDrobe."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/science_wardrobe)
|
||||
crate_name = "science department wardrobe supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/wardrobes/security
|
||||
name = "Security Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the SecDrobe and LawDrobe."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/wardrobe/sec_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/law_wardrobe)
|
||||
crate_name = "security department supply crate"
|
||||
|
||||
/datum/supply_pack/costumes_toys/kinkmate
|
||||
name = "Kinkmate construction kit"
|
||||
cost = 2000
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate)
|
||||
crate_name = "Kinkmate construction kit"
|
||||
|
||||
@@ -11,11 +11,13 @@
|
||||
|
||||
/datum/supply_pack/emergency/vehicle
|
||||
name = "Biker Gang Kit" //TUNNEL SNAKES OWN THIS TOWN
|
||||
desc = "TUNNEL SNAKES OWN THIS TOWN. Contains an unbranded All Terrain Vehicle, and a complete gang outfit -- consists of black gloves, a menacing skull bandanna, and a SWEET leather overcoat!"
|
||||
desc = "TUNNEL SNAKES OWN THIS TOWN. Contains an unbranded All Terrain Vehicle, two cans of spraypaint, and a complete gang outfit -- consists of black gloves, a menacing skull bandanna, and a SWEET leather overcoat!"
|
||||
cost = 2500
|
||||
contraband = TRUE
|
||||
contains = list(/obj/vehicle/ridden/atv,
|
||||
/obj/item/key,
|
||||
/obj/item/toy/crayon/spraycan,
|
||||
/obj/item/toy/crayon/spraycan,
|
||||
/obj/item/clothing/suit/jacket/leather/overcoat,
|
||||
/obj/item/clothing/gloves/color/black,
|
||||
/obj/item/clothing/head/soft,
|
||||
@@ -126,21 +128,6 @@
|
||||
crate_name = "emergency rcds"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/emergency/soft_suit
|
||||
name = "Emergency Space Suit"
|
||||
desc = "Are there bombs going off left and right? Are there meteors shooting around the station? Well then! Here's two fragile space suits for emergencies. Comes with air and masks."
|
||||
cost = 1200
|
||||
contains = list(/obj/item/tank/internals/air,
|
||||
/obj/item/tank/internals/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/space/fragile,
|
||||
/obj/item/clothing/suit/space/fragile,
|
||||
/obj/item/clothing/head/helmet/space/fragile,
|
||||
/obj/item/clothing/head/helmet/space/fragile)
|
||||
crate_name = "emergency crate"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/emergency/bomb
|
||||
name = "Explosive Emergency Crate"
|
||||
desc = "Science gone bonkers? Beeping behind the airlock? Buy now and be the hero the station des... I mean needs! (Time not included.)"
|
||||
@@ -208,7 +195,7 @@
|
||||
crate_name = "metal foam grenade crate"
|
||||
|
||||
/datum/supply_pack/emergency/mre
|
||||
name = "MRE supply kit (emergency rations)"
|
||||
name = "MRE Packs (Emergency Rations)"
|
||||
desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/storage/box/mre/menu1/safe,
|
||||
@@ -296,6 +283,21 @@
|
||||
crate_name = "space suit crate"
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
/datum/supply_pack/emergency/soft_suit
|
||||
name = "Space Suits (Fragile)"
|
||||
desc = "Are there bombs going off left and right? Are there meteors shooting around the station? Well then! Here's two fragile space suits for emergencies. Comes with air and masks."
|
||||
cost = 1200
|
||||
contains = list(/obj/item/tank/internals/air,
|
||||
/obj/item/tank/internals/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/space/fragile,
|
||||
/obj/item/clothing/suit/space/fragile,
|
||||
/obj/item/clothing/head/helmet/space/fragile,
|
||||
/obj/item/clothing/head/helmet/space/fragile)
|
||||
crate_name = "emergency crate"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/emergency/spacejets
|
||||
name = "Spare EVA Jetpacks"
|
||||
desc = "Contains three EVA grade jectpaks. Requires EVA access to open."
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal
|
||||
// cost = 700- Minimum cost, or infinite points are possible.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Engineering /////////////////////////////////////
|
||||
///////////////////////////// Engineering ////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/engineering
|
||||
@@ -45,6 +45,7 @@
|
||||
/obj/item/clothing/glasses/meson/engine,
|
||||
/obj/item/clothing/glasses/meson/engine)
|
||||
crate_name = "engineering gear crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/engineering
|
||||
|
||||
/datum/supply_pack/engineering/engihardsuit
|
||||
name = "Engineering Hardsuit"
|
||||
@@ -55,6 +56,7 @@
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/space/hardsuit/engine)
|
||||
crate_name = "engineering hardsuit"
|
||||
crate_type = /obj/structure/closet/crate/secure/engineering
|
||||
|
||||
/datum/supply_pack/engineering/atmoshardsuit
|
||||
name = "Atmospherics Hardsuit"
|
||||
@@ -114,6 +116,22 @@
|
||||
crate_name = "PACMAN generator crate"
|
||||
crate_type = /obj/structure/closet/crate/engineering/electrical
|
||||
|
||||
/datum/supply_pack/engineering/airpump
|
||||
name = "Portable Air Pump Crate"
|
||||
desc = "We all know you work in a high pressure workplace. Keep it that way with two additional air pumps!"
|
||||
cost = 3000
|
||||
contains = list(/obj/machinery/portable_atmospherics/pump,
|
||||
/obj/machinery/portable_atmospherics/pump)
|
||||
crate_name = "portable air pump crate"
|
||||
|
||||
/datum/supply_pack/engineering/airscrubber
|
||||
name = "Portable Scrubber Crate"
|
||||
desc = "Miasma got you down? Plasma in the vents? Freshen up with these two brand-new air scrubbers!"
|
||||
cost = 3000
|
||||
contains = list(/obj/machinery/portable_atmospherics/scrubber,
|
||||
/obj/machinery/portable_atmospherics/scrubber)
|
||||
crate_name = "portable scrubber crate"
|
||||
|
||||
/datum/supply_pack/engineering/power
|
||||
name = "Power Cell Crate"
|
||||
desc = "Looking for power overwhelming? Look no further. Contains three high-voltage power cells."
|
||||
|
||||
@@ -69,6 +69,11 @@
|
||||
contains = list(/obj/item/grown/log)
|
||||
crate_name = "lumber crate"
|
||||
|
||||
/datum/supply_pack/materials/rawlumber/generate()
|
||||
. = ..()
|
||||
for(var/i in 1 to 49)
|
||||
new /obj/item/grown/log(.)
|
||||
|
||||
/datum/supply_pack/materials/wood50
|
||||
name = "50 Wood Planks"
|
||||
desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!"
|
||||
@@ -89,7 +94,7 @@
|
||||
/datum/supply_pack/materials/rawcottonbulk
|
||||
name = "Raw Cotton Crate (Bulk)"
|
||||
desc = "We have so much of this stuff we need to get rid of it in -bulk- now. This crate contains 240 raw cotton sheets."
|
||||
cost = 1300 // 100 net cost (per 40 cotton) , 20 x 20 = 400. 300 profit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000
|
||||
cost = 1300 // 600 net cost 20 x 120 = 2400 profit if turned into cloth sheets or if turned into silk 200 x 60 = 12000
|
||||
contains = list(/obj/item/stack/sheet/cotton/thirty,
|
||||
/obj/item/stack/sheet/cotton/thirty,
|
||||
/obj/item/stack/sheet/cotton/thirty,
|
||||
@@ -102,13 +107,8 @@
|
||||
crate_name = "bulk cotton crate"
|
||||
crate_type = /obj/structure/closet/crate/hydroponics
|
||||
|
||||
/datum/supply_pack/critter/animal_feed/generate()
|
||||
. = ..()
|
||||
for(var/i in 1 to 49)
|
||||
new /obj/item/grown/log(.)
|
||||
|
||||
/datum/supply_pack/materials/rcdammo
|
||||
name = "Spare RDC ammo"
|
||||
name = "Spare RCD ammo"
|
||||
desc = "This crate contains sixteen RCD compressed matter packs, to help with any holes or projects people might be working on."
|
||||
cost = 3750
|
||||
contains = list(/obj/item/rcd_ammo,
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
group = "Medical"
|
||||
crate_type = /obj/structure/closet/crate/medical
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Equipment ////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/medical/bodybags
|
||||
name = "Bodybags"
|
||||
desc = "For when the bodies hit the floor. Contains 4 boxes of bodybags."
|
||||
@@ -20,24 +24,6 @@
|
||||
/obj/item/storage/box/bodybags,)
|
||||
crate_name = "bodybag crate"
|
||||
|
||||
/datum/supply_pack/medical/firstaidbruises
|
||||
name = "Bruise Treatment Kit Crate"
|
||||
desc = "Contains three first aid kits focused on healing bruises and broken bones."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/brute,
|
||||
/obj/item/storage/firstaid/brute,
|
||||
/obj/item/storage/firstaid/brute)
|
||||
crate_name = "brute treatment kit crate"
|
||||
|
||||
/datum/supply_pack/medical/firstaidburns
|
||||
name = "Burn Treatment Kit Crate"
|
||||
desc = "Contains three first aid kits focused on healing severe burns."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/fire,
|
||||
/obj/item/storage/firstaid/fire,
|
||||
/obj/item/storage/firstaid/fire)
|
||||
crate_name = "burn treatment kit crate"
|
||||
|
||||
/datum/supply_pack/medical/bloodpacks
|
||||
name = "Blood Pack Variety Crate"
|
||||
desc = "Contains nine different blood packs for reintroducing blood to patients, plus two universal synthetic blood packs."
|
||||
@@ -86,16 +72,6 @@
|
||||
/obj/item/defibrillator/loaded)
|
||||
crate_name = "defibrillator crate"
|
||||
|
||||
/datum/supply_pack/medical/firstaid
|
||||
name = "First Aid Kit Crate"
|
||||
desc = "Contains four first aid kits for healing most types of wounds."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/regular,
|
||||
/obj/item/storage/firstaid/regular,
|
||||
/obj/item/storage/firstaid/regular,
|
||||
/obj/item/storage/firstaid/regular)
|
||||
crate_name = "first aid kit crate"
|
||||
|
||||
/datum/supply_pack/medical/iv_drip
|
||||
name = "IV Drip Crate"
|
||||
desc = "Contains a single IV drip stand for intravenous delivery."
|
||||
@@ -103,17 +79,6 @@
|
||||
contains = list(/obj/machinery/iv_drip)
|
||||
crate_name = "iv drip crate"
|
||||
|
||||
/datum/supply_pack/science/adv_surgery_tools
|
||||
name = "Med-Co Advanced surgery tools"
|
||||
desc = "A full set of Med-Co advanced surgery tools! In addition to that it contains both a can of synthflesh and a can of sterilizine. Requires Surgery access to open."
|
||||
cost = 5500
|
||||
access = ACCESS_SURGERY
|
||||
contains = list(/obj/item/storage/belt/medical/surgery_belt_adv,
|
||||
/obj/item/reagent_containers/medspray/synthflesh,
|
||||
/obj/item/reagent_containers/medspray/sterilizine)
|
||||
crate_name = "medco newest surgery tools"
|
||||
crate_type = /obj/structure/closet/crate/medical
|
||||
|
||||
/datum/supply_pack/medical/medicalhardsuit
|
||||
name = "Medical Hardsuit"
|
||||
desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers. Requires medical access to open."
|
||||
@@ -151,13 +116,57 @@
|
||||
/obj/item/storage/pill_bottle/stimulant)
|
||||
crate_name = "medical supplies crate"
|
||||
|
||||
/datum/supply_pack/medical/vending
|
||||
name = "Medical Vending Crate"
|
||||
desc = "Contains refills for medical vending machines."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/vending_refill/medical,
|
||||
/obj/item/vending_refill/wallmed)
|
||||
crate_name = "medical vending crate"
|
||||
/datum/supply_pack/medical/adv_surgery_tools
|
||||
name = "Med-Co Advanced Surgery Tools"
|
||||
desc = "A full set of Med-Co advanced surgery tools, this crate also comes with a spay of synth flesh as well as a can of . Requires Surgery access to open."
|
||||
cost = 5500
|
||||
access = ACCESS_SURGERY
|
||||
contains = list(/obj/item/storage/belt/medical/surgery_belt_adv,
|
||||
/obj/item/reagent_containers/medspray/synthflesh,
|
||||
/obj/item/reagent_containers/medspray/sterilizine)
|
||||
crate_name = "medco surgery tools"
|
||||
crate_type = /obj/structure/closet/crate/medical
|
||||
|
||||
/datum/supply_pack/medical/surgery
|
||||
name = "Surgical Supplies Crate"
|
||||
desc = "Do you want to perform surgery, but don't have one of those fancy shmancy degrees? Just get started with this crate containing a medical duffelbag, Sterilizine spray and collapsible roller bed."
|
||||
cost = 1300
|
||||
contains = list(/obj/item/storage/backpack/duffelbag/med/surgery,
|
||||
/obj/item/reagent_containers/medspray/sterilizine,
|
||||
/obj/item/roller)
|
||||
crate_name = "surgical supplies crate"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////// Medical Kits ///////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/medical/firstaidbruises
|
||||
name = "Bruise Treatment Kit Crate"
|
||||
desc = "Contains three first aid kits focused on healing bruises and broken bones."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/brute,
|
||||
/obj/item/storage/firstaid/brute,
|
||||
/obj/item/storage/firstaid/brute)
|
||||
crate_name = "brute treatment kit crate"
|
||||
|
||||
/datum/supply_pack/medical/firstaidburns
|
||||
name = "Burn Treatment Kit Crate"
|
||||
desc = "Contains three first aid kits focused on healing severe burns."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/fire,
|
||||
/obj/item/storage/firstaid/fire,
|
||||
/obj/item/storage/firstaid/fire)
|
||||
crate_name = "burn treatment kit crate"
|
||||
|
||||
/datum/supply_pack/medical/firstaid
|
||||
name = "First Aid Kit Crate"
|
||||
desc = "Contains four first aid kits for healing most types of wounds."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/regular,
|
||||
/obj/item/storage/firstaid/regular,
|
||||
/obj/item/storage/firstaid/regular,
|
||||
/obj/item/storage/firstaid/regular)
|
||||
crate_name = "first aid kit crate"
|
||||
|
||||
/datum/supply_pack/medical/sprays
|
||||
name = "Medical Sprays"
|
||||
@@ -193,6 +202,15 @@
|
||||
/obj/item/storage/firstaid/o2)
|
||||
crate_name = "oxygen deprivation kit crate"
|
||||
|
||||
/datum/supply_pack/medical/firstaidtoxins
|
||||
name = "Toxin Treatment Kit Crate"
|
||||
desc = "Contains three first aid kits focused on healing damage dealt by heavy toxins."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/toxin,
|
||||
/obj/item/storage/firstaid/toxin,
|
||||
/obj/item/storage/firstaid/toxin)
|
||||
crate_name = "toxin treatment kit crate"
|
||||
|
||||
/datum/supply_pack/medical/advrad
|
||||
name = "Radiation Treatment Crate Deluxe"
|
||||
desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pills, as well as a radiation treatment deluxe pill bottle!"
|
||||
@@ -206,23 +224,9 @@
|
||||
crate_name = "radiation protection crate"
|
||||
crate_type = /obj/structure/closet/crate/radiation
|
||||
|
||||
/datum/supply_pack/medical/surgery
|
||||
name = "Surgical Supplies Crate"
|
||||
desc = "Do you want to perform surgery, but don't have one of those fancy shmancy degrees? Just get started with this crate containing a medical duffelbag, Sterilizine spray and collapsible roller bed."
|
||||
cost = 1300
|
||||
contains = list(/obj/item/storage/backpack/duffelbag/med/surgery,
|
||||
/obj/item/reagent_containers/medspray/sterilizine,
|
||||
/obj/item/roller)
|
||||
crate_name = "surgical supplies crate"
|
||||
|
||||
/datum/supply_pack/medical/firstaidtoxins
|
||||
name = "Toxin Treatment Kit Crate"
|
||||
desc = "Contains three first aid kits focused on healing damage dealt by heavy toxins."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/storage/firstaid/toxin,
|
||||
/obj/item/storage/firstaid/toxin,
|
||||
/obj/item/storage/firstaid/toxin)
|
||||
crate_name = "toxin treatment kit crate"
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////// Virology ////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/medical/virus
|
||||
name = "Virus Crate"
|
||||
@@ -266,4 +270,4 @@
|
||||
/obj/item/storage/box/syringes,
|
||||
/obj/item/storage/box/beakers)
|
||||
crate_name = "virus containment unit crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/plasma
|
||||
crate_type = /obj/structure/closet/crate/secure/plasma
|
||||
@@ -13,16 +13,6 @@
|
||||
//////////////////// Paperwork and Writing Supplies //////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/misc/abandonedcrate
|
||||
name = "Loot Box"
|
||||
desc = "Try your luck with these highly secure loot boxes! Solve the lock, win great prizes! WARNING: EXPLOSIVE FAILURE."
|
||||
contraband = TRUE
|
||||
cost = 15000
|
||||
contains = list(/obj/structure/closet/crate/secure/loot)
|
||||
crate_name = "abandoned crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
dangerous = TRUE
|
||||
|
||||
/datum/supply_pack/misc/artsupply
|
||||
name = "Art Supplies"
|
||||
desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!"
|
||||
@@ -83,7 +73,7 @@
|
||||
name = "Captain Pen"
|
||||
desc = "A spare Captain fountain pen."
|
||||
access = ACCESS_CAPTAIN
|
||||
cost = 10000
|
||||
cost = 5000
|
||||
contains = list(/obj/item/pen/fountain/captain)
|
||||
crate_name = "captain pen"
|
||||
crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen
|
||||
@@ -153,7 +143,7 @@
|
||||
/obj/item/bedsheet/purple,
|
||||
/obj/item/bedsheet/red,
|
||||
/obj/item/bedsheet/yellow,
|
||||
/obj/item/bedsheet/brown,
|
||||
/obj/item/bedsheet/brown,
|
||||
/obj/item/bedsheet/black,
|
||||
/obj/item/bedsheet/rainbow)
|
||||
crate_name = "colored bedsheet crate"
|
||||
@@ -182,18 +172,6 @@
|
||||
/obj/structure/piano/unanchored)
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/misc/cbtpack
|
||||
name = "CBT Equipment"
|
||||
desc = "(*!&@#CBT is a special term coined by high ranking syndicate operatives for a special form of information extraction. While the training required to use this shipment is highly classified, the distribution of it's contents are not. In addition to this crates unusual contents, we have added a bar of soap.#@*$"
|
||||
hidden = TRUE
|
||||
cost = 2400
|
||||
contains = list(/mob/living/simple_animal/chicken,
|
||||
/obj/item/toy/beach_ball/holoball,
|
||||
/obj/item/melee/baton/cattleprod,
|
||||
/obj/item/soap/syndie)
|
||||
crate_name = "cbt crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
|
||||
/datum/supply_pack/misc/casinocrate
|
||||
name = "Casino Crate"
|
||||
desc = "Start up your own grand casino with this crate filled with slot machine and arcade boards!"
|
||||
@@ -216,8 +194,8 @@
|
||||
name = "Coin Crate"
|
||||
desc = "Psssst, hey, you. Yes, you. I've heard that coins can do some special things on your station, give you access to some pretty cool stuff. Here's the deal, you give me some credits, and I give so some coins. Sound like a deal? I'll give you 10 for 10000 creds."
|
||||
contraband = TRUE
|
||||
cost = 10000
|
||||
contains = list(/obj/item/coin/silver)
|
||||
cost = 3000
|
||||
contains = list(/obj/item/coin/silver) // 400 x 10 = 2 sheets of silver for 2300cr
|
||||
crate_name = "coin crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
|
||||
@@ -226,10 +204,41 @@
|
||||
for(var/i in 1 to 9)
|
||||
new /obj/item/coin/silver(.)
|
||||
|
||||
/datum/supply_pack/misc/dirtymags
|
||||
name = "Dirty Magazines"
|
||||
desc = "Get your mind out of the gutter operative, you have work to do. Three items per order. Possible Results: .357 Speedloaders, Kitchen Gun Mags, Stetchkin Mags."
|
||||
hidden = TRUE
|
||||
cost = 12000
|
||||
var/num_contained = 3
|
||||
contains = list(/obj/item/ammo_box/a357,
|
||||
/obj/item/ammo_box/a357,
|
||||
/obj/item/ammo_box/a357,
|
||||
/obj/item/ammo_box/magazine/pistolm9mm,
|
||||
/obj/item/ammo_box/magazine/pistolm9mm,
|
||||
/obj/item/ammo_box/magazine/pistolm9mm,
|
||||
/obj/item/ammo_box/magazine/m45/kitchengun,
|
||||
/obj/item/ammo_box/magazine/m45/kitchengun)
|
||||
crate_name = "crate"
|
||||
|
||||
/datum/supply_pack/misc/dirtymags/fill(obj/structure/closet/crate/C)
|
||||
var/list/L = contains.Copy()
|
||||
for(var/i in 1 to num_contained)
|
||||
var/item = pick_n_take(L)
|
||||
new item(C)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////// Misc Supplies ///////////////////////////////
|
||||
///////////////////////////////// Misc Supplies //////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/misc/candles
|
||||
name = "Candle Crate"
|
||||
desc = "Set up a romantic dinner or host a séance with these extra candles and crayons."
|
||||
cost = 850
|
||||
contains = list(/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/storage/box/matches)
|
||||
crate_name = "candle crate"
|
||||
|
||||
/datum/supply_pack/misc/exoticfootwear
|
||||
name = "Exotic Footwear Crate"
|
||||
desc = "Popularised by lizards and exotic dancers, the footwear included in this shipment is sure to give your feet the breathing room they deserve. Sweet Kicks Inc. is not responsible for any damage, distress, or @r0u$a1 caused by this shipment."
|
||||
@@ -246,13 +255,24 @@
|
||||
/obj/item/clothing/shoes/kindleKicks)
|
||||
crate_name = "footie crate"
|
||||
|
||||
/datum/supply_pack/misc/wrapping_paper
|
||||
name = "Festive Wrapping Paper Crate"
|
||||
desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, or the Clown's severed head? You can do all that, with this crate full of wrapping paper."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/stack/wrapping_paper)
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
crate_name = "festive wrapping paper crate"
|
||||
/datum/supply_pack/misc/funeral
|
||||
name = "Funeral Supplies"
|
||||
desc = "Mourn your dead properly buy sending them off with love filled notes, clean clothes, and a proper ceremony. Contains two candle packs, funeral garb, flowers, a paperbin , and crayons to help aid in religious rituals. Coffin included."
|
||||
cost = 1200
|
||||
contains = list(/obj/item/clothing/under/burial,
|
||||
/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/reagent_containers/food/snacks/grown/harebell,
|
||||
/obj/item/reagent_containers/food/snacks/grown/harebell,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/lily,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/lily,
|
||||
/obj/item/storage/crayons,
|
||||
/obj/item/paper_bin
|
||||
)
|
||||
crate_name = "coffin"
|
||||
crate_type = /obj/structure/closet/crate/coffin
|
||||
|
||||
/datum/supply_pack/misc/jukebox
|
||||
name = "Jukebox"
|
||||
@@ -260,6 +280,16 @@
|
||||
contains = list(/obj/machinery/jukebox)
|
||||
crate_name = "Jukebox"
|
||||
|
||||
/datum/supply_pack/misc/abandonedcrate
|
||||
name = "Loot Box"
|
||||
desc = "Try your luck with these highly secure loot boxes! Solve the lock, win great prizes! WARNING: EXPLOSIVE FAILURE."
|
||||
contraband = TRUE
|
||||
cost = 15000
|
||||
contains = list(/obj/structure/closet/crate/secure/loot)
|
||||
crate_name = "abandoned crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
dangerous = TRUE
|
||||
|
||||
/datum/supply_pack/misc/potted_plants
|
||||
name = "Potted Plants Crate"
|
||||
desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown."
|
||||
@@ -284,25 +314,6 @@
|
||||
/obj/item/clothing/suit/hooded/chaplain_hoodie)
|
||||
crate_name = "religious supplies crate"
|
||||
|
||||
/datum/supply_pack/misc/funeral
|
||||
name = "Funeral Supplies"
|
||||
desc = "Mourn your dead properly buy sending them off with love filled notes, clean clothes, and a proper ceremony. Contains two candle packs, funeral garb, flowers, a paperbin , and crayons to help aid in religious rituals. Coffin included."
|
||||
cost = 1200
|
||||
contains = list(/obj/item/clothing/under/burial,
|
||||
/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/reagent_containers/food/snacks/grown/harebell,
|
||||
/obj/item/reagent_containers/food/snacks/grown/harebell,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/lily,
|
||||
/obj/item/reagent_containers/food/snacks/grown/poppy/lily,
|
||||
/obj/item/storage/crayons,
|
||||
/obj/item/paper_bin
|
||||
)
|
||||
crate_name = "coffin"
|
||||
crate_type = /obj/structure/closet/crate/coffin
|
||||
|
||||
/datum/supply_pack/misc/shower
|
||||
name = "Shower Supplies"
|
||||
desc = "Everyone needs a bit of R&R. Make sure you get can get yours by ordering this crate filled with towels, rubber duckies, and some soap!"
|
||||
@@ -362,29 +373,6 @@
|
||||
/obj/item/stack/tile/carpet/monochrome/fifty)
|
||||
crate_name = "premium carpet crate"
|
||||
|
||||
/datum/supply_pack/misc/party
|
||||
name = "Party Equipment"
|
||||
desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, a drinking shaker, and a bottle of patron & goldschlager!"
|
||||
cost = 2000
|
||||
contains = list(/obj/item/storage/box/drinkingglasses,
|
||||
/obj/item/reagent_containers/food/drinks/shaker,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/patron,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/goldschlager,
|
||||
/obj/item/reagent_containers/food/drinks/ale,
|
||||
/obj/item/reagent_containers/food/drinks/ale,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/flashlight/glowstick,
|
||||
/obj/item/flashlight/glowstick/red,
|
||||
/obj/item/flashlight/glowstick/blue,
|
||||
/obj/item/flashlight/glowstick/cyan,
|
||||
/obj/item/flashlight/glowstick/orange,
|
||||
/obj/item/flashlight/glowstick/yellow,
|
||||
/obj/item/flashlight/glowstick/pink)
|
||||
crate_name = "party equipment crate"
|
||||
|
||||
/datum/supply_pack/misc/noslipfloor
|
||||
name = "High-traction Floor Tiles"
|
||||
desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!"
|
||||
|
||||
+197
-203
@@ -3,22 +3,47 @@
|
||||
// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal
|
||||
// cost = 700- Minimum cost, or infinite points are possible.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Organic /////////////////////////////////////////
|
||||
//////////////////////////////// Organic /////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/organic
|
||||
group = "Food & Hydroponics"
|
||||
crate_type = /obj/structure/closet/crate/freezer
|
||||
|
||||
/datum/supply_pack/organic/randomized
|
||||
var/num_contained = 15
|
||||
|
||||
/datum/supply_pack/organic/randomized/fill(obj/structure/closet/crate/C)
|
||||
for(var/i in 1 to num_contained)
|
||||
var/item = pick(contains)
|
||||
new item(C)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Food /////////////////////////////////////////
|
||||
//////////////////////////////// Meals ///////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/organic/candy/randomised
|
||||
/datum/supply_pack/organic/combomeal2
|
||||
name = "Burger Combo #2"
|
||||
desc = "We value our customers at the Greasy Griddle, so much so that we're willing to deliver -just for you.- This combo meal contains two burgers, a soda, fries, a toy, and some chicken nuggets."
|
||||
cost = 3200
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/burger/bigbite,
|
||||
/obj/item/reagent_containers/food/snacks/burger/cheese,
|
||||
/obj/item/reagent_containers/food/snacks/fries,
|
||||
/obj/item/reagent_containers/food/condiment/pack/ketchup,
|
||||
/obj/item/reagent_containers/food/condiment/pack/ketchup,
|
||||
/obj/item/reagent_containers/food/snacks/nugget,
|
||||
/obj/item/reagent_containers/food/snacks/nugget,
|
||||
/obj/item/reagent_containers/food/snacks/nugget,
|
||||
/obj/item/reagent_containers/food/snacks/nugget,
|
||||
/obj/item/toy/plush/random)
|
||||
crate_name = "combo meal w/toy"
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
|
||||
/datum/supply_pack/organic/randomized/candy
|
||||
name = "Candy Crate"
|
||||
desc = "For people that have an insatiable sweet tooth! Has ten candies to be eaten up.."
|
||||
cost = 2500
|
||||
var/num_contained = 10 //number of items picked to be contained in a randomised crate
|
||||
num_contained = 10
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/candy,
|
||||
/obj/item/reagent_containers/food/snacks/lollipop,
|
||||
/obj/item/reagent_containers/food/snacks/gumball,
|
||||
@@ -47,91 +72,6 @@
|
||||
/obj/item/storage/fancy/donut_box)
|
||||
crate_name = "candy crate"
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef
|
||||
name = "Excellent Meat Crate"
|
||||
desc = "The best cuts in the whole galaxy."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/killertomato,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/bear,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/spider,
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawbacon,
|
||||
/obj/item/reagent_containers/food/snacks/spiderleg,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human)
|
||||
crate_name = "food crate"
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef/fill(obj/structure/closet/crate/C)
|
||||
for(var/i in 1 to 15)
|
||||
var/item = pick(contains)
|
||||
new item(C)
|
||||
|
||||
/datum/supply_pack/organic/exoticseeds
|
||||
name = "Exotic Seeds Crate"
|
||||
desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/seeds/nettle,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/plump,
|
||||
/obj/item/seeds/liberty,
|
||||
/obj/item/seeds/amanita,
|
||||
/obj/item/seeds/reishi,
|
||||
/obj/item/seeds/banana,
|
||||
/obj/item/seeds/bamboo,
|
||||
/obj/item/seeds/eggplant/eggy,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random)
|
||||
crate_name = "exotic seeds crate"
|
||||
crate_type = /obj/structure/closet/crate/hydroponics
|
||||
|
||||
/datum/supply_pack/organic/food
|
||||
name = "Food Crate"
|
||||
desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, an enzyme and sugar bottle, and three slabs of monkeymeat."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/reagent_containers/food/condiment/flour,
|
||||
/obj/item/reagent_containers/food/condiment/flour,
|
||||
/obj/item/reagent_containers/food/condiment/rice,
|
||||
/obj/item/reagent_containers/food/condiment/rice,
|
||||
/obj/item/reagent_containers/food/condiment/milk,
|
||||
/obj/item/reagent_containers/food/condiment/milk,
|
||||
/obj/item/reagent_containers/food/condiment/soymilk,
|
||||
/obj/item/reagent_containers/food/condiment/saltshaker,
|
||||
/obj/item/reagent_containers/food/condiment/peppermill,
|
||||
/obj/item/storage/fancy/egg_box,
|
||||
/obj/item/storage/fancy/egg_box,
|
||||
/obj/item/reagent_containers/food/condiment/enzyme,
|
||||
/obj/item/reagent_containers/food/condiment/sugar,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana)
|
||||
crate_name = "food crate"
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef/fruits
|
||||
name = "Fruit Crate"
|
||||
desc = "Rich in vitamins, may contain oranges."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/watermelon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
|
||||
/obj/item/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry)
|
||||
crate_name = "food crate"
|
||||
|
||||
/datum/supply_pack/organic/fiestatortilla
|
||||
name = "Fiesta Crate"
|
||||
desc = "Spice up the kitchen with this fiesta themed food order! Contains 8 tortilla based food items, as well as a sombrero, moustache, and cloak!"
|
||||
@@ -151,79 +91,6 @@
|
||||
/obj/item/reagent_containers/glass/bottle/capsaicin)
|
||||
crate_name = "fiesta crate"
|
||||
|
||||
/datum/supply_pack/organic/grill
|
||||
name = "Grilling Starter Kit"
|
||||
desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT ONLY 5000 BUX GET NOW! Contains a cooking grill and five fuel coal sheets."
|
||||
cost = 3000
|
||||
crate_type = /obj/structure/closet/crate
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/five,
|
||||
/obj/machinery/grill/unwrenched)
|
||||
crate_name = "grilling starter kit crate"
|
||||
|
||||
/datum/supply_pack/organic/grillfuel
|
||||
name = "Grilling Fuel Kit"
|
||||
desc = "Contains coal and coal accessories. (Note: only ten coal sheets.)"
|
||||
cost = 1000
|
||||
crate_type = /obj/structure/closet/crate
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/ten)
|
||||
crate_name = "grilling fuel kit crate"
|
||||
|
||||
/datum/supply_pack/organic/cream_piee
|
||||
name = "High-yield Clown-grade Cream Pie Crate"
|
||||
desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results."
|
||||
cost = 6000
|
||||
contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie)
|
||||
crate_name = "party equipment crate"
|
||||
contraband = TRUE
|
||||
access = ACCESS_THEATRE
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
/datum/supply_pack/organic/fakemeat
|
||||
name = "Meat Crate"
|
||||
desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 12 slabs of meat product, and 4 slabs of *carp*."
|
||||
cost = 1200 // Buying 3 food crates nets you 9 meat for 900 points, plus like, 6 bags of rice, flour, and egg boxes. This is 12 for 500, but you -only- get meat and carp.
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation)
|
||||
crate_name = "meaty crate"
|
||||
crate_type = /obj/structure/closet/crate/freezer
|
||||
|
||||
/datum/supply_pack/organic/monkeydripmeat
|
||||
name = "*Meat* Crate"
|
||||
desc = "Need some meat? With this do-it-yourself kit you'll be swimming in it! Contains a monkey cube, an IV drip, and some cryoxadone!"
|
||||
cost = 2150
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/monkeycube,
|
||||
/obj/item/restraints/handcuffs/cable,
|
||||
/obj/machinery/iv_drip,
|
||||
/obj/item/reagent_containers/glass/beaker/cryoxadone,
|
||||
/obj/item/reagent_containers/glass/beaker/cryoxadone)
|
||||
crate_name = "monkey meat crate"
|
||||
|
||||
/datum/supply_pack/organic/mixedboxes
|
||||
name = "Mixed Ingredient Boxes"
|
||||
desc = "Get overwhelmed with inspiration by ordering these boxes of surprise ingredients! Get four boxes filled with an assortment of products!"
|
||||
cost = 2300
|
||||
contains = list(/obj/item/storage/box/ingredients/wildcard,
|
||||
/obj/item/storage/box/ingredients/wildcard,
|
||||
/obj/item/storage/box/ingredients/wildcard,
|
||||
/obj/item/storage/box/ingredients/wildcard)
|
||||
crate_name = "wildcard food crate"
|
||||
crate_type = /obj/structure/closet/crate/freezer
|
||||
|
||||
/datum/supply_pack/organic/pizza
|
||||
name = "Pizza Crate"
|
||||
desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99% anomaly-free!"
|
||||
@@ -258,9 +125,129 @@
|
||||
considered <b>\[REDACTED\]</b> and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \
|
||||
of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.")
|
||||
|
||||
/datum/supply_pack/organic/randomized/chef/vegetables
|
||||
name = "Vegetables Crate"
|
||||
desc = "Grown in vats."
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Raw Ingredients /////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/organic/food
|
||||
name = "Food Crate"
|
||||
desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, an enzyme and sugar bottle, and three slabs of monkeymeat."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/reagent_containers/food/condiment/flour,
|
||||
/obj/item/reagent_containers/food/condiment/flour,
|
||||
/obj/item/reagent_containers/food/condiment/rice,
|
||||
/obj/item/reagent_containers/food/condiment/rice,
|
||||
/obj/item/reagent_containers/food/condiment/milk,
|
||||
/obj/item/reagent_containers/food/condiment/milk,
|
||||
/obj/item/reagent_containers/food/condiment/soymilk,
|
||||
/obj/item/reagent_containers/food/condiment/saltshaker,
|
||||
/obj/item/reagent_containers/food/condiment/peppermill,
|
||||
/obj/item/storage/fancy/egg_box,
|
||||
/obj/item/storage/fancy/egg_box,
|
||||
/obj/item/reagent_containers/food/condiment/enzyme,
|
||||
/obj/item/reagent_containers/food/condiment/sugar,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana)
|
||||
crate_name = "food crate"
|
||||
|
||||
/datum/supply_pack/organic/randomized/fruits
|
||||
name = "Fruit Crate"
|
||||
desc = "Rich in vitamins and possibly sugar. Contains 15 assorted fruits."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
|
||||
/obj/item/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/reagent_containers/food/snacks/grown/watermelon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/apple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes,
|
||||
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
|
||||
/obj/item/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach,
|
||||
/obj/item/reagent_containers/food/snacks/grown/strawberry)
|
||||
crate_name = "fruit crate"
|
||||
|
||||
/datum/supply_pack/organic/cream_piee
|
||||
name = "High-yield Clown-grade Cream Pie Crate"
|
||||
desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results."
|
||||
cost = 6000
|
||||
contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie)
|
||||
crate_name = "party equipment crate"
|
||||
contraband = TRUE
|
||||
access = ACCESS_THEATRE
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
/datum/supply_pack/organic/randomized
|
||||
name = "Meat Crate (Exotic)"
|
||||
desc = "The best cuts in the whole galaxy. Contains 15 assorted exotic meats."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/killertomato,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/bear,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/spider,
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawbacon,
|
||||
/obj/item/reagent_containers/food/snacks/spiderleg,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human)
|
||||
crate_name = "exotic meat crate"
|
||||
|
||||
/datum/supply_pack/organic/monkeydripmeat
|
||||
name = "Meat Crate (Fresh)"
|
||||
desc = "Need some meat? With this do-it-yourself kit you'll be swimming in it! Contains a monkey cube, an IV drip, and some cryoxadone!"
|
||||
cost = 2150
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/monkeycube,
|
||||
/obj/item/restraints/handcuffs/cable,
|
||||
/obj/machinery/iv_drip,
|
||||
/obj/item/reagent_containers/glass/beaker/cryoxadone,
|
||||
/obj/item/reagent_containers/glass/beaker/cryoxadone)
|
||||
crate_name = "monkey meat crate"
|
||||
|
||||
/datum/supply_pack/organic/fakemeat
|
||||
name = "Meat Crate 'Synthetic'"
|
||||
desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 12 slabs of meat product, and 4 slabs of *carp*."
|
||||
cost = 1200 // Buying 3 food crates nets you 9 meat for 900 points, plus like, 6 bags of rice, flour, and egg boxes. This is 12 for 500, but you -only- get meat and carp.
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/imitation)
|
||||
crate_name = "meaty crate"
|
||||
crate_type = /obj/structure/closet/crate/freezer
|
||||
|
||||
/datum/supply_pack/organic/mixedboxes
|
||||
name = "Mixed Ingredient Boxes"
|
||||
desc = "Get overwhelmed with inspiration by ordering these boxes of surprise ingredients! Get four boxes filled with an assortment of products!"
|
||||
cost = 2300
|
||||
contains = list(/obj/item/storage/box/ingredients/wildcard,
|
||||
/obj/item/storage/box/ingredients/wildcard,
|
||||
/obj/item/storage/box/ingredients/wildcard,
|
||||
/obj/item/storage/box/ingredients/wildcard)
|
||||
crate_name = "wildcard food crate"
|
||||
crate_type = /obj/structure/closet/crate/freezer
|
||||
|
||||
/datum/supply_pack/organic/randomized/vegetables
|
||||
name = "Vegetable Crate"
|
||||
desc = "Grown in vats. Contains 15 assorted vegetables."
|
||||
cost = 1300
|
||||
contains = list(/obj/item/reagent_containers/food/snacks/grown/chili,
|
||||
/obj/item/reagent_containers/food/snacks/grown/corn,
|
||||
@@ -270,7 +257,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle,
|
||||
/obj/item/reagent_containers/food/snacks/grown/onion,
|
||||
/obj/item/reagent_containers/food/snacks/grown/pumpkin)
|
||||
crate_name = "food crate"
|
||||
crate_name = "veggie crate"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Hydroponics /////////////////////////////////////
|
||||
@@ -302,42 +289,6 @@
|
||||
crate_name = "beekeeping starter crate"
|
||||
crate_type = /obj/structure/closet/crate/hydroponics
|
||||
|
||||
/datum/supply_pack/organic/exoticseeds
|
||||
name = "Exotic Seeds Crate"
|
||||
desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/seeds/nettle,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/plump,
|
||||
/obj/item/seeds/liberty,
|
||||
/obj/item/seeds/amanita,
|
||||
/obj/item/seeds/reishi,
|
||||
/obj/item/seeds/banana,
|
||||
/obj/item/seeds/eggplant/eggy,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random)
|
||||
crate_name = "exotic seeds crate"
|
||||
crate_type = /obj/structure/closet/crate/hydroponics
|
||||
|
||||
/* Maintenance Garden Crate basically does this and more.
|
||||
/datum/supply_pack/organic/hydroponics
|
||||
name = "Hydroponics Crate"
|
||||
desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
|
||||
cost = 1750
|
||||
contains = list(/obj/item/reagent_containers/spray/plantbgone,
|
||||
/obj/item/reagent_containers/spray/plantbgone,
|
||||
/obj/item/reagent_containers/glass/bottle/ammonia,
|
||||
/obj/item/reagent_containers/glass/bottle/ammonia,
|
||||
/obj/item/hatchet,
|
||||
/obj/item/cultivator,
|
||||
/obj/item/plant_analyzer,
|
||||
/obj/item/clothing/gloves/botanic_leather,
|
||||
/obj/item/clothing/suit/apron)
|
||||
crate_name = "hydroponics crate"
|
||||
crate_type = /obj/structure/closet/crate/hydroponics
|
||||
*/
|
||||
/datum/supply_pack/organic/hydroponics/hydrotank
|
||||
name = "Hydroponics Backpack Crate"
|
||||
desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open."
|
||||
@@ -390,10 +341,30 @@
|
||||
/obj/item/seeds/sunflower,
|
||||
/obj/item/seeds/chanter,
|
||||
/obj/item/seeds/potato,
|
||||
/obj/item/seeds/sugarcane)
|
||||
/obj/item/seeds/sugarcane,
|
||||
/obj/item/seeds/ambrosia)
|
||||
crate_name = "seeds crate"
|
||||
crate_type = /obj/structure/closet/crate/hydroponics
|
||||
|
||||
/datum/supply_pack/organic/exoticseeds
|
||||
name = "Seeds Crate (Exotic)"
|
||||
desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/seeds/nettle,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/replicapod,
|
||||
/obj/item/seeds/plump,
|
||||
/obj/item/seeds/liberty,
|
||||
/obj/item/seeds/amanita,
|
||||
/obj/item/seeds/reishi,
|
||||
/obj/item/seeds/banana,
|
||||
/obj/item/seeds/eggplant/eggy,
|
||||
/obj/item/seeds/random,
|
||||
/obj/item/seeds/random)
|
||||
crate_name = "exotic seeds crate"
|
||||
crate_type = /obj/structure/closet/crate/hydroponics
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////// Misc /////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
@@ -414,6 +385,29 @@
|
||||
crate_name = "sporting crate"
|
||||
crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:(
|
||||
|
||||
/datum/supply_pack/organic/party
|
||||
name = "Party Equipment"
|
||||
desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, a drinking shaker, and a bottle of patron & goldschlager!"
|
||||
cost = 2000
|
||||
contains = list(/obj/item/storage/box/drinkingglasses,
|
||||
/obj/item/reagent_containers/food/drinks/shaker,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/patron,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/goldschlager,
|
||||
/obj/item/reagent_containers/food/drinks/ale,
|
||||
/obj/item/reagent_containers/food/drinks/ale,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/reagent_containers/food/drinks/beer,
|
||||
/obj/item/flashlight/glowstick,
|
||||
/obj/item/flashlight/glowstick/red,
|
||||
/obj/item/flashlight/glowstick/blue,
|
||||
/obj/item/flashlight/glowstick/cyan,
|
||||
/obj/item/flashlight/glowstick/orange,
|
||||
/obj/item/flashlight/glowstick/yellow,
|
||||
/obj/item/flashlight/glowstick/pink)
|
||||
crate_name = "party equipment crate"
|
||||
|
||||
/datum/supply_pack/organic/vday
|
||||
name = "Surplus Valentine Crate"
|
||||
desc = "Turns out we got warehouses of this love-y dove-y crap. We're sending out small bargain buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards."
|
||||
|
||||
@@ -24,13 +24,12 @@
|
||||
name = "Advanced Alien Alloy Crate Crate"
|
||||
desc = "Hello brothers from the stars!!! Our fellow brethren have made contact at long last and gave us gifts man! They really did build the prymi- Connection Error- Bro we’ll send you a sheet of advanced alien alloy."
|
||||
cost = 15000
|
||||
contraband = TRUE
|
||||
DropPodOnly = TRUE
|
||||
contains = list(/obj/item/stack/sheet/mineral/abductor)
|
||||
crate_name = "alien bro alloy crate"
|
||||
|
||||
/datum/supply_pack/science/beakers
|
||||
name = "Chemistry Beackers Crate"
|
||||
name = "Chemistry Beakers Crate"
|
||||
desc = "Glassware for any chemistry lab! Contains four small beakers, three large, two plastic, and one metamaterial. As well as three droppers and two pairs of latex gloves."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/reagent_containers/glass/beaker,
|
||||
@@ -82,6 +81,16 @@
|
||||
/obj/item/integrated_electronics/wirer)
|
||||
crate_name = "circuitry starter pack crate"
|
||||
|
||||
/datum/supply_pack/science/glasswork
|
||||
name = "Glass Blower Kit Crate"
|
||||
desc = "Learn and make glassworks of usefull things for a profit! Contains glassworking tools and blowing rods. Glass not included."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/glasswork/glasskit,
|
||||
/obj/item/glasswork/glasskit,
|
||||
/obj/item/glasswork/blowing_rod,
|
||||
/obj/item/glasswork/blowing_rod)
|
||||
crate_name = "glassblower gear crate"
|
||||
|
||||
/datum/supply_pack/science/monkey
|
||||
name = "Monkey Cube Crate"
|
||||
desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!"
|
||||
|
||||
@@ -163,13 +163,6 @@
|
||||
/obj/item/storage/box/handcuffs)
|
||||
crate_name = "security supply crate"
|
||||
|
||||
/datum/supply_pack/security/vending/security
|
||||
name = "SecTech Supply Crate"
|
||||
desc = "Officer Paul bought all the donuts? Then refill the security vendor with ths crate."
|
||||
cost = 1500
|
||||
contains = list(/obj/machinery/vending/security)
|
||||
crate_name = "SecTech supply crate"
|
||||
|
||||
/datum/supply_pack/security/firingpins
|
||||
name = "Standard Firing Pins Crate"
|
||||
desc = "Upgrade your arsenal with 10 standard firing pins. Requires Security access to open."
|
||||
|
||||
@@ -10,9 +10,24 @@
|
||||
group = "Service"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Cargo ////////////////////////////////////////
|
||||
//////////////////////////////// Cargo ///////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/service/wrapping_paper
|
||||
name = "Cargo Packaging Crate"
|
||||
desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, or the Clown's severed head? You can do all that, with this crate full of festive (and normal) wrapping paper. Also contains a hand labeler and a destination tagger for easy shipping!"
|
||||
cost = 1000
|
||||
contains = list(/obj/item/stack/wrapping_paper,
|
||||
/obj/item/stack/wrapping_paper,
|
||||
/obj/item/stack/wrapping_paper,
|
||||
/obj/item/stack/packageWrap,
|
||||
/obj/item/stack/packageWrap,
|
||||
/obj/item/stack/packageWrap,
|
||||
/obj/item/destTagger,
|
||||
/obj/item/hand_labeler)
|
||||
crate_type = /obj/structure/closet/crate/wooden
|
||||
crate_name = "wrapping paper crate"
|
||||
|
||||
/datum/supply_pack/service/cargo_supples
|
||||
name = "Cargo Supplies Crate"
|
||||
desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping. Now with extra toner cartidges!"
|
||||
@@ -101,6 +116,23 @@
|
||||
crate_name = "ice cream vat crate"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/service/grill
|
||||
name = "Grilling Starter Kit"
|
||||
desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT ONLY 5000 BUX GET NOW! Contains a cooking grill and five fuel coal sheets."
|
||||
cost = 3000
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/five,
|
||||
/obj/machinery/grill/unwrenched)
|
||||
crate_name = "grilling starter kit crate"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/service/grillfuel
|
||||
name = "Grilling Fuel Kit"
|
||||
desc = "Contains coal and coal accessories. (Note: only ten coal sheets.)"
|
||||
cost = 1000
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/ten)
|
||||
crate_name = "grilling fuel kit crate"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/service/cutlery
|
||||
name = "Kitchen Cutlery Deluxe Set"
|
||||
desc = "Need to slice and dice away those \"Tomatoes\"? Well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal."
|
||||
@@ -115,7 +147,7 @@
|
||||
/obj/item/kitchen/knife,
|
||||
/obj/item/kitchen/knife/butcher,
|
||||
/obj/item/kitchen/knife/butcher,
|
||||
/obj/item/kitchen/rollingpin,
|
||||
/obj/item/kitchen/rollingpin,
|
||||
/obj/item/trash/plate,
|
||||
/obj/item/trash/plate,
|
||||
/obj/item/trash/plate,
|
||||
@@ -240,45 +272,3 @@
|
||||
crate_name = "janitorial cart crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Vendor Refills //////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/service/vending/bartending
|
||||
name = "Bartending Supply Crate"
|
||||
desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!"
|
||||
cost = 2000
|
||||
contains = list(/obj/item/vending_refill/boozeomat,
|
||||
/obj/item/vending_refill/coffee,
|
||||
/obj/item/book/granter/action/drink_fling)
|
||||
crate_name = "bartending supply crate"
|
||||
|
||||
/datum/supply_pack/service/vending/cigarette
|
||||
name = "Cigarette Supply Crate"
|
||||
desc = "Don't believe the reports - smoke today! Contains a cigarette vending machine refill."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/cigarette)
|
||||
crate_name = "cigarette supply crate"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/service/vending/games
|
||||
name = "Games Supply Crate"
|
||||
desc = "Get your game on with this game vending machine refill."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/vending_refill/games)
|
||||
crate_name = "games supply crate"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/service/vending/snack
|
||||
name = "Snack Supply Crate"
|
||||
desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/snack)
|
||||
crate_name = "snacks supply crate"
|
||||
|
||||
/datum/supply_pack/service/vending/cola
|
||||
name = "Softdrinks Supply Crate"
|
||||
desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with this soda machine refill, today!"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/cola)
|
||||
crate_name = "soft drinks supply crate"
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
|
||||
//Reminders-
|
||||
// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal
|
||||
// cost = 700- Minimum cost, or infinite points are possible.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Vending //////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/vending
|
||||
group = "Vending"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////// Service, Medical, Sec //////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/vending/bartending
|
||||
name = "Bartending Supply Crate"
|
||||
desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!"
|
||||
cost = 2000
|
||||
contains = list(/obj/item/vending_refill/boozeomat,
|
||||
/obj/item/vending_refill/coffee,
|
||||
/obj/item/book/granter/action/drink_fling)
|
||||
crate_name = "bartending supply crate"
|
||||
|
||||
/datum/supply_pack/vending/cigarette
|
||||
name = "Cigarette Supply Crate"
|
||||
desc = "Don't believe the reports - smoke today! Contains a cigarette vending machine refill."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/cigarette)
|
||||
crate_name = "cigarette supply crate"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/vending/games
|
||||
name = "Games Supply Crate"
|
||||
desc = "Get your game on with this game vending machine refill."
|
||||
cost = 1000
|
||||
contains = list(/obj/item/vending_refill/games)
|
||||
crate_name = "games supply crate"
|
||||
crate_type = /obj/structure/closet/crate
|
||||
|
||||
/datum/supply_pack/vending/kinkmate
|
||||
name = "Kinkmate Supply and Construction Kit"
|
||||
cost = 2000
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate)
|
||||
crate_name = "Kinkmate construction kit"
|
||||
|
||||
/datum/supply_pack/vending/medical
|
||||
name = "Medical Vending Crate"
|
||||
desc = "Contains refills for medical vending machines."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/vending_refill/medical,
|
||||
/obj/item/vending_refill/wallmed)
|
||||
crate_name = "medical vending crate"
|
||||
crate_type = /obj/structure/closet/crate/medical
|
||||
|
||||
/datum/supply_pack/vending/security
|
||||
name = "SecTech Supply Crate"
|
||||
desc = "Officer Paul bought all the donuts? Then refill the security vendor with ths crate. Requires Security Access to open."
|
||||
cost = 1500
|
||||
access = ACCESS_SECURITY
|
||||
contains = list(/obj/machinery/vending/security)
|
||||
crate_name = "SecTech supply crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/gear
|
||||
|
||||
/datum/supply_pack/vending/snack
|
||||
name = "Snack Supply Crate"
|
||||
desc = "One vending machine refill of cavity-bringin' goodness! The number one dentist recommended order!"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/snack)
|
||||
crate_name = "snacks supply crate"
|
||||
|
||||
/datum/supply_pack/vending/cola
|
||||
name = "Softdrinks Supply Crate"
|
||||
desc = "Got whacked by a toolbox, but you still have those pesky teeth? Get rid of those pearly whites with this soda machine refill, today!"
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/cola)
|
||||
crate_name = "soft drinks supply crate"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Wardrobe Vendors ////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/autodrobe
|
||||
name = "Autodrobe Supply Crate"
|
||||
desc = "Autodrobe missing your favorite dress? Solve that issue today with this autodrobe refill."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/autodrobe)
|
||||
crate_name = "autodrobe supply crate"
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/cargo
|
||||
name = "Cargo Wardrobe Supply Crate"
|
||||
desc = "This crate contains a refill for the CargoDrobe."
|
||||
cost = 750
|
||||
contains = list(/obj/item/vending_refill/wardrobe/cargo_wardrobe)
|
||||
crate_name = "cargo department supply crate"
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/engineering
|
||||
name = "Engineering Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the EngiDrobe and AtmosDrobe."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/wardrobe/engi_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/atmos_wardrobe)
|
||||
crate_name = "engineering department wardrobe supply crate"
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/general
|
||||
name = "General Wardrobes Supply Crate"
|
||||
desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe."
|
||||
cost = 3750
|
||||
contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/bar_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/chef_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/jani_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/chap_wardrobe)
|
||||
crate_name = "general wardrobes vendor refills"
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/hydroponics
|
||||
name = "Hydrobe Supply Crate"
|
||||
desc = "This crate contains a refill for the Hydrobe."
|
||||
cost = 750
|
||||
contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe)
|
||||
crate_name = "hydrobe supply crate"
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/medical
|
||||
name = "Medical Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the MediDrobe, ChemDrobe, GeneDrobe, and ViroDrobe."
|
||||
cost = 3000
|
||||
contains = list(/obj/item/vending_refill/wardrobe/medi_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/chem_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/gene_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/viro_wardrobe)
|
||||
crate_name = "medical department wardrobe supply crate"
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/science
|
||||
name = "Science Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the SciDrobe and RoboDrobe."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/science_wardrobe)
|
||||
crate_name = "science department wardrobe supply crate"
|
||||
|
||||
/datum/supply_pack/vending/wardrobes/security
|
||||
name = "Security Wardrobe Supply Crate"
|
||||
desc = "This crate contains refills for the SecDrobe and LawDrobe."
|
||||
cost = 1500
|
||||
contains = list(/obj/item/vending_refill/wardrobe/sec_wardrobe,
|
||||
/obj/item/vending_refill/wardrobe/law_wardrobe)
|
||||
crate_name = "security department supply crate"
|
||||
@@ -482,12 +482,20 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
if(gender == MALE)
|
||||
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list)
|
||||
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_male_list)
|
||||
else
|
||||
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_m)
|
||||
underwear = sanitize_inlist(underwear, GLOB.underwear_m)
|
||||
else if(gender == FEMALE)
|
||||
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list)
|
||||
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_female_list)
|
||||
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
|
||||
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_f)
|
||||
underwear = sanitize_inlist(underwear, GLOB.underwear_f)
|
||||
else
|
||||
hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_list)
|
||||
facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_list)
|
||||
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
|
||||
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
|
||||
|
||||
undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color))
|
||||
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
|
||||
shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color))
|
||||
socks = sanitize_inlist(socks, GLOB.socks_list)
|
||||
socks_color = sanitize_hexcolor(socks_color, 3, FALSE, initial(socks_color))
|
||||
|
||||
@@ -18,8 +18,9 @@
|
||||
R.freqlock = TRUE
|
||||
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
W.registered_name = H.real_name
|
||||
W.update_label(W.registered_name, W.assignment)
|
||||
if(W)
|
||||
W.registered_name = H.real_name
|
||||
W.update_label(W.registered_name, W.assignment)
|
||||
|
||||
/datum/outfit/ert/commander
|
||||
name = "ERT Commander"
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE
|
||||
|
||||
/obj/item/clothing/head/hooded/cloakhood/drake
|
||||
name = "drake helm"
|
||||
@@ -90,4 +90,4 @@
|
||||
armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100)
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE
|
||||
|
||||
@@ -945,4 +945,59 @@
|
||||
icon_state = "christmasfemaleg"
|
||||
item_state = "christmasfemaleg"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
can_adjust = FALSE
|
||||
|
||||
// Lunar Clothes
|
||||
/obj/item/clothing/under/lunar/qipao
|
||||
name = "Black Qipao"
|
||||
desc = "A Qipao, traditionally worn in ancient Earth China by women during social events and lunar new years. This one is black."
|
||||
icon_state = "qipao"
|
||||
item_state = "qipao"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/under/lunar/qipao/white
|
||||
name = "White Qipao"
|
||||
desc = "A Qipao, traditionally worn in ancient Earth China by women during social events and lunar new years. This one is white."
|
||||
icon_state = "qipao_white"
|
||||
item_state = "qipao_white"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/under/lunar/qipao/red
|
||||
name = "Red Qipao"
|
||||
desc = "A Qipao, traditionally worn in ancient Earth China by women during social events and lunar new years. This one is red."
|
||||
icon_state = "qipao_red"
|
||||
item_state = "qipao_red"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/under/lunar/cheongsam
|
||||
name = "Black Cheongsam"
|
||||
desc = "A Cheongsam, traditionally worn in ancient Earth China by men during social events and lunar new years. This one is black."
|
||||
icon_state = "cheong"
|
||||
item_state = "cheong"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/under/lunar/cheongsam/white
|
||||
name = "White Cheongsam"
|
||||
desc = "A Cheongsam, traditionally worn in ancient Earth China by men during social events and lunar new years. This one is white."
|
||||
icon_state = "cheongw"
|
||||
item_state = "cheongw"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/under/lunar/cheongsam/red
|
||||
name = "Red Cheongsam"
|
||||
desc = "A Cheongsam, traditionally worn in ancient Earth China by men during social events and lunar new years. This one is red.."
|
||||
icon_state = "cheongr"
|
||||
item_state = "cheongr"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NONE
|
||||
@@ -0,0 +1,299 @@
|
||||
//This file is for glass working types of things!
|
||||
|
||||
/obj/item/glasswork
|
||||
name = "This is a bug report it!"
|
||||
desc = "Failer to code. Contact your local bug remover..."
|
||||
icon = 'icons/obj/glassworks.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 1
|
||||
throw_speed = 1
|
||||
throw_range = 3
|
||||
tool_behaviour = null
|
||||
|
||||
/obj/item/glasswork/glasskit
|
||||
name = "Glass working tools"
|
||||
desc = "A lovely belt of most the tools you will need to shape, mold, and refine glass into more advanced shapes."
|
||||
icon_state = "glass_tools"
|
||||
tool_behaviour = TOOL_GLASS_CUT
|
||||
|
||||
/obj/item/glasswork/blowing_rod
|
||||
name = "Glass working blow rod"
|
||||
desc = "A hollow metal stick made for glass blowing."
|
||||
icon_state = "blowing_rods_unused"
|
||||
tool_behaviour = TOOL_BLOW
|
||||
|
||||
/obj/item/glasswork/glass_base
|
||||
name = "Glass fodder sheet"
|
||||
desc = "A sheet of glass set aside for glass working"
|
||||
icon_state = "glass_base"
|
||||
var/next_step = null
|
||||
var/rod = /obj/item/glasswork/blowing_rod
|
||||
|
||||
/obj/item/lens
|
||||
name = "Optical lens"
|
||||
desc = "Good for selling or crafting, by itself its useless"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "glass_optics"
|
||||
|
||||
//////////////////////Chem Disk/////////////////////
|
||||
//Two Steps //
|
||||
//Sells for 300 cr, takes 10 glass shets //
|
||||
//Usefull for chem spliting //
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/glasswork/glass_base/dish
|
||||
name = "Glass fodder sheet"
|
||||
desc = "A set of glass sheets set aside for glass working, this one is ideal for a small glass dish. Needs to be cut with some tools."
|
||||
next_step = /obj/item/glasswork/glass_base/dish_part1
|
||||
|
||||
/obj/item/glasswork/glass_base/dish/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/dish_part1
|
||||
name = "Half chem dish sheet"
|
||||
desc = "A sheet of glass cut in half, looks like it still needs some more cutting down"
|
||||
icon_state = "glass_base_half"
|
||||
next_step = /obj/item/reagent_containers/glass/beaker/glass_dish
|
||||
|
||||
/obj/item/glasswork/glass_base/dish_part1/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
//////////////////////Lens//////////////////////////
|
||||
//Six Steps //
|
||||
//Sells for 1800 cr, takes 15 glass shets //
|
||||
//Usefull for selling and later crafting //
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens
|
||||
name = "Glass fodder sheet"
|
||||
desc = "A set of glass sheets set aside for glass working, this one is ideal for a small glass lens. Needs to be cut with some tools."
|
||||
next_step = /obj/item/glasswork/glass_base/glass_lens_part1
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part1
|
||||
name = "Glass fodder sheet"
|
||||
desc = "Cut glass ready to be heated. Needs to be heated with some tools."
|
||||
icon_state = "glass_base_half"
|
||||
next_step = /obj/item/glasswork/glass_base/glass_lens_part2
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part1/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_WELDER)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part2
|
||||
name = "Glass fodder sheet"
|
||||
desc = "Cut glass that has been heated. Needs to be heated more with some tools."
|
||||
icon_state = "glass_base_heat"
|
||||
next_step = /obj/item/glasswork/glass_base/glass_lens_part3
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part2/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_WELDER)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part3
|
||||
name = "Glass fodder sheet"
|
||||
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be placed onto a blow tube."
|
||||
icon_state = "glass_base_molding"
|
||||
next_step = /obj/item/glasswork/glass_base/glass_lens_part4
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part3/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_BLOW)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part4
|
||||
name = "Glass fodder sheet"
|
||||
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be cut off onto a blow tube."
|
||||
icon_state = "blowing_rods_inuse"
|
||||
next_step = /obj/item/glasswork/glass_base/glass_lens_part5
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part4/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
new rod(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part5
|
||||
name = "Unpolished glass lens"
|
||||
desc = "A small unpolished glass lens. Could be polished with some cloth."
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "glass_optics"
|
||||
next_step = /obj/item/glasswork/glass_base/glass_lens_part6
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part5/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/sheet/cloth))
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part6
|
||||
name = "Unrefined glass lens"
|
||||
desc = "A small polished glass lens. Just needs to be refined with some sandstone."
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "glass_optics"
|
||||
next_step = /obj/item/lens
|
||||
|
||||
/obj/item/glasswork/glass_base/glass_lens_part6/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/sandstone))
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
//////////////////////Spouty Flask//////////////////
|
||||
//Four Steps //
|
||||
//Sells for 1200 cr, takes 20 glass shets //
|
||||
//Usefull for selling and chemical things //
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty
|
||||
name = "Glass fodder sheet"
|
||||
desc = "A set of glass sheets set aside for glass working, this one is ideal for a spout beaker. Needs to be cut with some tools."
|
||||
next_step = /obj/item/glasswork/glass_base/spouty_part2
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty_part2
|
||||
name = "Glass fodder sheet"
|
||||
desc = "Cut glass that has been heated. Needs to be heated with some tools."
|
||||
icon_state = "glass_base_half"
|
||||
next_step = /obj/item/glasswork/glass_base/spouty_part3
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty_part2/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_WELDER)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty_part3
|
||||
name = "Glass fodder sheet"
|
||||
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be placed onto a blow tube."
|
||||
icon_state = "glass_base_molding"
|
||||
next_step = /obj/item/glasswork/glass_base/spouty_part4
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty_part3/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_BLOW)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty_part4
|
||||
name = "Glass fodder sheet"
|
||||
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be cut off onto a blow tube."
|
||||
icon_state = "blowing_rods_inuse"
|
||||
next_step = /obj/item/reagent_containers/glass/beaker/flask/spouty
|
||||
|
||||
/obj/item/glasswork/glass_base/spouty_part4/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
new rod(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
//////////////////////Small Bulb Flask//////////////
|
||||
//Two Steps //
|
||||
//Sells for 600 cr, takes 5 glass shets //
|
||||
//Usefull for selling and chemical things //
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_small
|
||||
name = "Glass fodder sheet"
|
||||
desc = "A set of glass sheets set aside for glass working, this one is ideal for a small flask. Needs to be heated with some tools."
|
||||
next_step = /obj/item/glasswork/glass_base/flask_small_part1
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_small/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_WELDER)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_small_part1
|
||||
name = "Metled glass"
|
||||
desc = "A blob of metled glass, this one is ideal for a small flask. Needs to be blown with some tools."
|
||||
icon_state = "glass_base_molding"
|
||||
next_step = /obj/item/glasswork/glass_base/flask_small_part2
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_small_part1/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_BLOW)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_small_part2
|
||||
name = "Metled glass"
|
||||
desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools."
|
||||
icon_state = "blowing_rods_inuse"
|
||||
next_step = /obj/item/reagent_containers/glass/beaker/flask
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_small_part2/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
new rod(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
//////////////////////Large Bulb Flask//////////////
|
||||
//Two Steps //
|
||||
//Sells for 1000 cr, takes 15 glass shets //
|
||||
//Usefull for selling and chemical things //
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_large
|
||||
name = "Glass fodder sheet"
|
||||
desc = "A set of glass sheets set aside for glass working, this one is ideal for a large flask. Needs to be heated with some tools."
|
||||
next_step = /obj/item/glasswork/glass_base/flask_large_part1
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_large/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_WELDER)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_large_part1
|
||||
name = "Metled glass"
|
||||
desc = "A blob of metled glass, this one is ideal for a large flask. Needs to be blown with some tools."
|
||||
icon_state = "glass_base_molding"
|
||||
next_step = /obj/item/glasswork/glass_base/flask_large_part2
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_large_part1/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_BLOW)
|
||||
new next_step(user.loc, 1)
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_large_part2
|
||||
name = "Metled glass"
|
||||
desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools."
|
||||
icon_state = "blowing_rods_inuse"
|
||||
next_step = /obj/item/reagent_containers/glass/beaker/flask/large
|
||||
|
||||
/obj/item/glasswork/glass_base/flask_large_part2/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(I.tool_behaviour == TOOL_GLASS_CUT)
|
||||
new next_step(user.loc, 1)
|
||||
new rod(user.loc, 1)
|
||||
qdel(src)
|
||||
@@ -18,6 +18,7 @@
|
||||
announceWhen = 1
|
||||
var/list/wave_type
|
||||
var/wave_name = "normal"
|
||||
var/direction
|
||||
|
||||
/datum/round_event/meteor_wave/setup()
|
||||
announceWhen = 1
|
||||
@@ -26,7 +27,6 @@
|
||||
startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
|
||||
endWhen = startWhen + 60
|
||||
|
||||
|
||||
/datum/round_event/meteor_wave/New()
|
||||
..()
|
||||
if(!wave_type)
|
||||
@@ -38,6 +38,8 @@
|
||||
"normal" = 50,
|
||||
"threatening" = 40,
|
||||
"catastrophic" = 10))
|
||||
if(!direction)
|
||||
direction = pick(GLOB.cardinals)
|
||||
switch(wave_name)
|
||||
if("normal")
|
||||
wave_type = GLOB.meteors_normal
|
||||
@@ -59,11 +61,21 @@
|
||||
kill()
|
||||
|
||||
/datum/round_event/meteor_wave/announce(fake)
|
||||
priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", "meteors")
|
||||
var/directionstring
|
||||
switch(direction)
|
||||
if(NORTH)
|
||||
directionstring = " towards the fore"
|
||||
if(SOUTH)
|
||||
directionstring = " towards the aft"
|
||||
if(EAST)
|
||||
directionstring = " towards starboard"
|
||||
if(WEST)
|
||||
directionstring = " towards port"
|
||||
priority_announce("Meteors have been detected on collision course with the station[directionstring]. Estimated time until impact: [round((startWhen * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", "meteors")
|
||||
|
||||
/datum/round_event/meteor_wave/tick()
|
||||
if(ISMULTIPLE(activeFor, 3))
|
||||
spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
spawn_meteors(5, wave_type, direction) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
|
||||
/datum/round_event_control/meteor_wave/threatening
|
||||
name = "Meteor Wave: Threatening"
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator)
|
||||
|
||||
if(RUSKY_PARTY)
|
||||
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/misc/party]
|
||||
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/organic/party]
|
||||
pack.generate(pick_n_take(empty_shuttle_turfs))
|
||||
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
pixel_x = -64
|
||||
pixel_y = -64
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/list/immune = list() // the one who creates the timestop is immune
|
||||
var/list/immune = list() // the one who creates the timestop is immune, which includes wizards and the dead slime you murdered to make this chronofield
|
||||
var/turf/target
|
||||
var/freezerange = 2
|
||||
var/duration = 140
|
||||
@@ -27,10 +27,10 @@
|
||||
for(var/A in immune_atoms)
|
||||
immune[A] = TRUE
|
||||
for(var/mob/living/L in GLOB.player_list)
|
||||
if(locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects
|
||||
if(locate(/obj/effect/proc_holder/spell/aoe_turf/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects
|
||||
immune[L] = TRUE
|
||||
for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.parasites)
|
||||
if(G.summoner && locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in G.summoner.mind.spell_list) //It would only make sense that a person's stand would also be immune.
|
||||
if(G.summoner && locate(/obj/effect/proc_holder/spell/aoe_turf/timestop) in G.summoner.mind.spell_list) //It would only make sense that a person's stand would also be immune.
|
||||
immune[G] = TRUE
|
||||
if(start)
|
||||
timestop()
|
||||
@@ -46,9 +46,8 @@
|
||||
chronofield = make_field(/datum/proximity_monitor/advanced/timestop, list("current_range" = freezerange, "host" = src, "immune" = immune, "check_anti_magic" = check_anti_magic, "check_holy" = check_holy))
|
||||
QDEL_IN(src, duration)
|
||||
|
||||
/obj/effect/timestop/wizard
|
||||
/obj/effect/timestop/magic
|
||||
check_anti_magic = TRUE
|
||||
duration = 100
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop
|
||||
name = "chronofield"
|
||||
@@ -56,9 +55,10 @@
|
||||
field_shape = FIELD_SHAPE_RADIUS_SQUARE
|
||||
requires_processing = TRUE
|
||||
var/list/immune = list()
|
||||
var/list/mob/living/frozen_mobs = list()
|
||||
var/list/obj/item/projectile/frozen_projectiles = list()
|
||||
var/list/atom/movable/frozen_throws = list()
|
||||
var/list/frozen_things = list()
|
||||
var/list/frozen_mobs = list() //cached separately for processing
|
||||
var/list/frozen_structures = list() //Also machinery, and only frozen aestethically
|
||||
var/list/frozen_turfs = list() //Only aesthetically
|
||||
var/check_anti_magic = FALSE
|
||||
var/check_holy = FALSE
|
||||
|
||||
@@ -74,85 +74,125 @@
|
||||
/datum/proximity_monitor/advanced/timestop/proc/freeze_atom(atom/movable/A)
|
||||
if(immune[A] || global_frozen_atoms[A] || !istype(A))
|
||||
return FALSE
|
||||
if(A.throwing)
|
||||
freeze_throwing(A)
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(M.anti_magic_check(check_anti_magic, check_holy))
|
||||
immune[A] = TRUE
|
||||
return
|
||||
var/frozen = TRUE
|
||||
if(isliving(A))
|
||||
freeze_mob(A)
|
||||
else if(istype(A, /obj/item/projectile))
|
||||
freeze_projectile(A)
|
||||
else if(istype(A, /obj/mecha))
|
||||
freeze_mecha(A)
|
||||
else if((ismachinery(A) && !istype(A, /obj/machinery/light)) || isstructure(A)) //Special exception for light fixtures since recoloring causes them to change light
|
||||
freeze_structure(A)
|
||||
else
|
||||
return FALSE
|
||||
frozen = FALSE
|
||||
if(A.throwing)
|
||||
freeze_throwing(A)
|
||||
frozen = TRUE
|
||||
if(!frozen)
|
||||
return
|
||||
|
||||
frozen_things[A] = A.move_resist
|
||||
A.move_resist = INFINITY
|
||||
global_frozen_atoms[A] = src
|
||||
into_the_negative_zone(A)
|
||||
RegisterSignal(A, COMSIG_MOVABLE_PRE_MOVE, .proc/unfreeze_atom)
|
||||
RegisterSignal(A, COMSIG_ITEM_PICKUP, .proc/unfreeze_atom)
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_all()
|
||||
for(var/i in frozen_projectiles)
|
||||
unfreeze_projectile(i)
|
||||
for(var/i in frozen_mobs)
|
||||
unfreeze_mob(i)
|
||||
for(var/i in frozen_throws)
|
||||
unfreeze_throw(i)
|
||||
for(var/i in frozen_things)
|
||||
unfreeze_atom(i)
|
||||
for(var/T in frozen_turfs)
|
||||
unfreeze_turf(T)
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_atom(atom/movable/A)
|
||||
if(A.throwing)
|
||||
unfreeze_throwing(A)
|
||||
if(isliving(A))
|
||||
unfreeze_mob(A)
|
||||
else if(istype(A, /obj/item/projectile))
|
||||
unfreeze_projectile(A)
|
||||
else if(istype(A, /obj/mecha))
|
||||
unfreeze_mecha(A)
|
||||
|
||||
UnregisterSignal(A, COMSIG_MOVABLE_PRE_MOVE)
|
||||
UnregisterSignal(A, COMSIG_ITEM_PICKUP)
|
||||
escape_the_negative_zone(A)
|
||||
A.move_resist = frozen_things[A]
|
||||
frozen_things -= A
|
||||
global_frozen_atoms -= A
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/freeze_mecha(obj/mecha/M)
|
||||
M.completely_disabled = TRUE
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mecha(obj/mecha/M)
|
||||
M.completely_disabled = FALSE
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/freeze_throwing(atom/movable/AM)
|
||||
var/datum/thrownthing/T = AM.throwing
|
||||
T.paused = TRUE
|
||||
frozen_throws[AM] = T
|
||||
global_frozen_atoms[AM] = TRUE
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_throw(atom/movable/AM)
|
||||
var/datum/thrownthing/T = frozen_throws[AM]
|
||||
T.paused = FALSE
|
||||
frozen_throws -= AM
|
||||
global_frozen_atoms -= AM
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_throwing(atom/movable/AM)
|
||||
var/datum/thrownthing/T = AM.throwing
|
||||
if(T)
|
||||
T.paused = FALSE
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/freeze_turf(turf/T)
|
||||
into_the_negative_zone(T)
|
||||
frozen_turfs += T
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_turf(turf/T)
|
||||
escape_the_negative_zone(T)
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/freeze_structure(obj/O)
|
||||
into_the_negative_zone(O)
|
||||
frozen_structures += O
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_structure(obj/O)
|
||||
escape_the_negative_zone(O)
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/process()
|
||||
for(var/i in frozen_mobs)
|
||||
var/mob/living/m = i
|
||||
if(get_dist(get_turf(m), get_turf(host)) > current_range)
|
||||
unfreeze_mob(m)
|
||||
else
|
||||
m.Stun(20, 1, 1)
|
||||
m.Stun(20, 1, 1)
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/setup_field_turf(turf/T)
|
||||
for(var/i in T.contents)
|
||||
freeze_atom(i)
|
||||
freeze_turf(T)
|
||||
return ..()
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_projectile(obj/item/projectile/P)
|
||||
escape_the_negative_zone(P)
|
||||
frozen_projectiles -= P
|
||||
P.paused = FALSE
|
||||
global_frozen_atoms -= P
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/freeze_projectile(obj/item/projectile/P)
|
||||
frozen_projectiles[P] = TRUE
|
||||
P.paused = TRUE
|
||||
global_frozen_atoms[P] = TRUE
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_projectile(obj/item/projectile/P)
|
||||
P.paused = FALSE
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/freeze_mob(mob/living/L)
|
||||
if(L.anti_magic_check(check_anti_magic, check_holy))
|
||||
immune += L
|
||||
return
|
||||
frozen_mobs += L
|
||||
L.Stun(20, 1, 1)
|
||||
frozen_mobs[L] = L.anchored
|
||||
L.anchored = TRUE
|
||||
global_frozen_atoms[L] = TRUE
|
||||
if(ishostile(L))
|
||||
var/mob/living/simple_animal/hostile/H = L
|
||||
H.toggle_ai(AI_OFF)
|
||||
H.LoseTarget()
|
||||
ADD_TRAIT(L, TRAIT_MUTE, TIMESTOP_TRAIT)
|
||||
walk(L, 0) //stops them mid pathing even if they're stunimmune
|
||||
if(isanimal(L))
|
||||
var/mob/living/simple_animal/S = L
|
||||
S.toggle_ai(AI_OFF)
|
||||
if(ishostile(L))
|
||||
var/mob/living/simple_animal/hostile/H = L
|
||||
H.LoseTarget()
|
||||
|
||||
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mob(mob/living/L)
|
||||
escape_the_negative_zone(L)
|
||||
L.AdjustStun(-20, 1, 1)
|
||||
L.anchored = frozen_mobs[L]
|
||||
REMOVE_TRAIT(L, TRAIT_MUTE, TIMESTOP_TRAIT)
|
||||
frozen_mobs -= L
|
||||
global_frozen_atoms -= L
|
||||
if(ishostile(L))
|
||||
var/mob/living/simple_animal/hostile/H = L
|
||||
H.toggle_ai(initial(H.AIStatus))
|
||||
if(isanimal(L))
|
||||
var/mob/living/simple_animal/S = L
|
||||
S.toggle_ai(initial(S.AIStatus))
|
||||
|
||||
//you don't look quite right, is something the matter?
|
||||
/datum/proximity_monitor/advanced/timestop/proc/into_the_negative_zone(atom/A)
|
||||
@@ -160,4 +200,4 @@
|
||||
|
||||
//let's put some colour back into your cheeks
|
||||
/datum/proximity_monitor/advanced/timestop/proc/escape_the_negative_zone(atom/A)
|
||||
A.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
|
||||
A.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
|
||||
|
||||
@@ -186,8 +186,8 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
|
||||
product_name = parent.myseed.plantname
|
||||
if(getYield() >= 1)
|
||||
SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name)
|
||||
parent.investigate_log("[user] harvested [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY)
|
||||
parent.update_tray(user)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,26 @@
|
||||
|
||||
// please make sure they're sorted alphabetically and categorized
|
||||
|
||||
/datum/sprite_accessory/facial_hair/threeoclock
|
||||
name = "Beard (3 o\'Clock)"
|
||||
icon_state = "facial_3oclock"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fiveoclock
|
||||
name = "Beard (5 o\'Clock)"
|
||||
icon_state = "facial_5oclock"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fiveoclockm
|
||||
name = "Beard (5 o\'Clock with Moustache)"
|
||||
icon_state = "facial_5oclockmoustache"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/sevenoclock
|
||||
name = "Beard (7 o\'Clock)"
|
||||
icon_state = "facial_7oclock"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/sevenoclockm
|
||||
name = "Beard (7 o\'Clock with Moustache)"
|
||||
icon_state = "facial_7oclockmoustache"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/abe
|
||||
name = "Beard (Abraham Lincoln)"
|
||||
icon_state = "facial_abe"
|
||||
@@ -23,10 +43,6 @@
|
||||
name = "Beard (Dwarf)"
|
||||
icon_state = "facial_dwarf"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fiveoclock
|
||||
name = "Beard (Five o Clock Shadow)"
|
||||
icon_state = "facial_fiveoclock"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fullbeard
|
||||
name = "Beard (Full)"
|
||||
icon_state = "facial_fullbeard"
|
||||
@@ -35,6 +51,10 @@
|
||||
name = "Beard (Goatee)"
|
||||
icon_state = "facial_gt"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/goatee
|
||||
name = "Beard (Goatee 2)"
|
||||
icon_state = "facial_goatee"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/hip
|
||||
name = "Beard (Hipster)"
|
||||
icon_state = "facial_hip"
|
||||
@@ -43,18 +63,38 @@
|
||||
name = "Beard (Jensen)"
|
||||
icon_state = "facial_jensen"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/martialartist
|
||||
name = "Beard (Martial Artist)"
|
||||
icon_state = "facial_martialartist"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/moonshiner
|
||||
name = "Beard (Moonshiner)"
|
||||
icon_state = "facial_moonshiner"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/neckbeard
|
||||
name = "Beard (Neckbeard)"
|
||||
icon_state = "facial_neckbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/tribeard
|
||||
name = "Beard (Tribeard)"
|
||||
icon_state = "facial_tribeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/vlongbeard
|
||||
name = "Beard (Very Long)"
|
||||
icon_state = "facial_wise"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/volaju
|
||||
name = "Beard (Volaju)"
|
||||
icon_state = "facial_volaju"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/longbeard
|
||||
name = "Beard (Long)"
|
||||
icon_state = "facial_longbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/moustache
|
||||
name = "Moustache"
|
||||
icon_state = "facial_moustache"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fu
|
||||
name = "Moustache (Fu Manchu)"
|
||||
icon_state = "facial_fumanchu"
|
||||
@@ -63,6 +103,10 @@
|
||||
name = "Moustache (Hulk Hogan)"
|
||||
icon_state = "facial_hogan" //-Neek
|
||||
|
||||
/datum/sprite_accessory/facial_hair/pencil
|
||||
name = "Moustache (Pencil)"
|
||||
icon_state = "facial_pencilstache"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/selleck
|
||||
name = "Moustache (Selleck)"
|
||||
icon_state = "facial_selleck"
|
||||
@@ -75,56 +119,31 @@
|
||||
name = "Moustache (Van Dyke)"
|
||||
icon_state = "facial_vandyke"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/walrus
|
||||
name = "Moustache (Walrus)"
|
||||
icon_state = "facial_walrus"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/watson
|
||||
name = "Moustache (Watson)"
|
||||
icon_state = "facial_watson"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/mutton
|
||||
name = "Mutton Chops"
|
||||
icon_state = "facial_mutton"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/muttonmus
|
||||
name = "Mutton Chops with Moustache"
|
||||
icon_state = "facial_muttonmus"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/shaved
|
||||
name = "Shaved"
|
||||
icon_state = null
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/facial_hair/sideburn
|
||||
name = "Sideburns"
|
||||
icon_state = "facial_sideburns"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/elvis
|
||||
name = "Sideburns (Elvis)"
|
||||
icon_state = "facial_elvis"
|
||||
|
||||
#define VFACE(_name, new_state) /datum/sprite_accessory/facial_hair/##new_state/icon_state=#new_state;;/datum/sprite_accessory/facial_hair/##new_state/name= #_name + " (Virgo)"
|
||||
VFACE("Watson", facial_watson_s)
|
||||
VFACE("Chaplin", facial_chaplin_s)
|
||||
VFACE("Fullbeard", facial_fullbeard_s)
|
||||
VFACE("Vandyke", facial_vandyke_s)
|
||||
VFACE("Elvis", facial_elvis_s)
|
||||
VFACE("Abe", facial_abe_s)
|
||||
VFACE("Chin", facial_chin_s)
|
||||
VFACE("GT", facial_gt_s)
|
||||
VFACE("Hip", facial_hip_s)
|
||||
VFACE("Hogan", facial_hogan_s)
|
||||
VFACE("Selleck", facial_selleck_s)
|
||||
VFACE("Neckbeard", facial_neckbeard_s)
|
||||
VFACE("Longbeard", facial_longbeard_s)
|
||||
VFACE("Dwarf", facial_dwarf_s)
|
||||
VFACE("Sideburn", facial_sideburn_s)
|
||||
VFACE("Mutton", facial_mutton_s)
|
||||
VFACE("Moustache", facial_moustache_s)
|
||||
VFACE("Pencilstache", facial_pencilstache_s)
|
||||
VFACE("Goatee", facial_goatee_s)
|
||||
VFACE("Smallstache", facial_smallstache_s)
|
||||
VFACE("Volaju", facial_volaju_s)
|
||||
VFACE("3 O\'clock", facial_3oclock_s)
|
||||
VFACE("5 O\'clock", facial_5oclock_s)
|
||||
VFACE("7 O\'clock", facial_7oclock_s)
|
||||
VFACE("5 O\'clock Moustache", facial_5oclockmoustache_s)
|
||||
VFACE("7 O\'clock", facial_7oclockmoustache_s)
|
||||
VFACE("Walrus", facial_walrus_s)
|
||||
VFACE("Muttonmus", facial_muttonmus_s)
|
||||
VFACE("Wise", facial_wise_s)
|
||||
VFACE("Martial Artist", facial_martialartist_s)
|
||||
VFACE("Dorsalfnil", facial_dorsalfnil_s)
|
||||
VFACE("Hornadorns", facial_hornadorns_s)
|
||||
VFACE("Spike", facial_spike_s)
|
||||
VFACE("Chinhorns", facial_chinhorns_s)
|
||||
VFACE("Cropped Fullbeard", facial_croppedfullbeard_s)
|
||||
VFACE("Chinless Beard", facial_chinlessbeard_s)
|
||||
VFACE("Moonshiner", facial_moonshiner_s)
|
||||
VFACE("Tribearder", facial_tribearder_s)
|
||||
#undef VFACE
|
||||
icon_state = "facial_elvis"
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
/datum/sprite_accessory/hair/bald
|
||||
name = "Bald"
|
||||
icon_state = null
|
||||
icon_state = "bald"
|
||||
|
||||
/datum/sprite_accessory/hair/balding
|
||||
name = "Balding Hair"
|
||||
@@ -37,6 +37,14 @@
|
||||
name = "Bedhead"
|
||||
icon_state = "hair_bedhead"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead_long
|
||||
name = "Bedhead (Long)"
|
||||
icon_state = "hair_long_bedhead"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead_longer
|
||||
name = "Bedhead (Longer)"
|
||||
icon_state = "hair_longer_bedhead"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead2
|
||||
name = "Bedhead 2"
|
||||
icon_state = "hair_bedheadv2"
|
||||
@@ -51,7 +59,7 @@
|
||||
|
||||
/datum/sprite_accessory/hair/beehive2
|
||||
name = "Beehive 2"
|
||||
icon_state = "hair_beehivev2"
|
||||
icon_state = "hair_beehive2"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob Hair"
|
||||
@@ -69,6 +77,14 @@
|
||||
name = "Bobcurl"
|
||||
icon_state = "hair_bobcurl"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcut
|
||||
name = "Bobcut"
|
||||
icon_state = "hair_bobcut"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcutalt
|
||||
name = "Bobcut (Alt)"
|
||||
icon_state = "hair_bobcutalt"
|
||||
|
||||
/datum/sprite_accessory/hair/boddicker
|
||||
name = "Boddicker"
|
||||
icon_state = "hair_boddicker"
|
||||
@@ -77,6 +93,10 @@
|
||||
name = "Bowl"
|
||||
icon_state = "hair_bowlcut"
|
||||
|
||||
/datum/sprite_accessory/hair/bowl2
|
||||
name = "Bowl 2"
|
||||
icon_state = "hair_bowlcut2"
|
||||
|
||||
/datum/sprite_accessory/hair/braid
|
||||
name = "Braid (Floorlength)"
|
||||
icon_state = "hair_braid"
|
||||
@@ -89,6 +109,10 @@
|
||||
name = "Braided Front"
|
||||
icon_state = "hair_braidfront"
|
||||
|
||||
/datum/sprite_accessory/hair/grandebraid
|
||||
name = "Braid (Grande)"
|
||||
icon_state = "hair_grande"
|
||||
|
||||
/datum/sprite_accessory/hair/not_floorlength_braid
|
||||
name = "Braid (High)"
|
||||
icon_state = "hair_braid2"
|
||||
@@ -113,10 +137,26 @@
|
||||
name = "Bun Head 2"
|
||||
icon_state = "hair_bunhead2"
|
||||
|
||||
/datum/sprite_accessory/hair/bun3
|
||||
name = "Bun Head 3"
|
||||
icon_state = "hair_bunhead3"
|
||||
|
||||
/datum/sprite_accessory/hair/bun4
|
||||
name = "Bun Head 4"
|
||||
icon_state = "hair_bunhead4"
|
||||
|
||||
/datum/sprite_accessory/hair/doublebun
|
||||
name = "Bun Head (Double)"
|
||||
icon_state = "hair_doublebun"
|
||||
|
||||
/datum/sprite_accessory/hair/largebun
|
||||
name = "Bun (Large)"
|
||||
name = "Bun Head (Large)"
|
||||
icon_state = "hair_largebun"
|
||||
|
||||
/datum/sprite_accessory/hair/tightbun
|
||||
name = "Bun Head (Tight)"
|
||||
icon_state = "hair_tightbun"
|
||||
|
||||
/datum/sprite_accessory/hair/business
|
||||
name = "Business Hair"
|
||||
icon_state = "hair_business"
|
||||
@@ -137,10 +177,22 @@
|
||||
name = "Buzzcut"
|
||||
icon_state = "hair_buzzcut"
|
||||
|
||||
/datum/sprite_accessory/hair/cia
|
||||
name = "CIA"
|
||||
icon_state = "hair_cia"
|
||||
|
||||
/datum/sprite_accessory/hair/combover
|
||||
name = "Combover"
|
||||
icon_state = "hair_combover"
|
||||
|
||||
/datum/sprite_accessory/hair/coffeehouse
|
||||
name = "Coffee House"
|
||||
icon_state = "hair_coffeehouse"
|
||||
|
||||
/datum/sprite_accessory/hair/country
|
||||
name = "Country"
|
||||
icon_state = "hair_country"
|
||||
|
||||
/datum/sprite_accessory/hair/crew
|
||||
name = "Crewcut"
|
||||
icon_state = "hair_crewcut"
|
||||
@@ -149,13 +201,21 @@
|
||||
name = "Curls"
|
||||
icon_state = "hair_curls"
|
||||
|
||||
/datum/sprite_accessory/hair/curly
|
||||
name = "Curly"
|
||||
icon_state = "hair_curly"
|
||||
|
||||
/datum/sprite_accessory/hair/cut
|
||||
name = "Cut Hair"
|
||||
icon_state = "hair_c"
|
||||
|
||||
/datum/sprite_accessory/hair/dave
|
||||
name = "Dave"
|
||||
icon_state = "hair_dave"
|
||||
|
||||
/datum/sprite_accessory/hair/devillock
|
||||
name = "Devil Lock"
|
||||
icon_state = "hair_devilock"
|
||||
icon_state = "hair_devillock"
|
||||
|
||||
/datum/sprite_accessory/hair/dreadlocks
|
||||
name = "Dreadlocks"
|
||||
@@ -173,22 +233,66 @@
|
||||
name = "Emo"
|
||||
icon_state = "hair_emo"
|
||||
|
||||
/datum/sprite_accessory/hair/emo2
|
||||
name = "Emo 2"
|
||||
icon_state = "hair_emo2"
|
||||
|
||||
/datum/sprite_accessory/hair/emo_fringe
|
||||
name = "Emo (Fringe)"
|
||||
icon_state = "hair_emofringe"
|
||||
|
||||
/datum/sprite_accessory/hair/emo_long
|
||||
name = "Emo (Long)"
|
||||
icon_state = "hair_emolong"
|
||||
|
||||
/datum/sprite_accessory/hair/lowfade
|
||||
name = "Fade (Low)"
|
||||
icon_state = "hair_lowfade"
|
||||
|
||||
/datum/sprite_accessory/hair/medfade
|
||||
name = "Fade (Medium)"
|
||||
icon_state = "hair_medfade"
|
||||
|
||||
/datum/sprite_accessory/hair/highfade
|
||||
name = "Fade (High)"
|
||||
icon_state = "hair_highfade"
|
||||
|
||||
/datum/sprite_accessory/hair/baldfade
|
||||
name = "Fade (Bald)"
|
||||
icon_state = "hair_baldfade"
|
||||
|
||||
/datum/sprite_accessory/hair/nofade
|
||||
name = "Fade (None)"
|
||||
icon_state = "hair_nofade"
|
||||
|
||||
/datum/sprite_accessory/hair/father
|
||||
name = "Father"
|
||||
icon_state = "hair_father"
|
||||
|
||||
/datum/sprite_accessory/hair/feather
|
||||
name = "Feather"
|
||||
icon_state = "hair_feather"
|
||||
|
||||
/datum/sprite_accessory/hair/flair
|
||||
name = "Flair"
|
||||
icon_state = "hair_flair"
|
||||
|
||||
/datum/sprite_accessory/hair/sargeant
|
||||
name = "Flat Top"
|
||||
icon_state = "hair_sargeant"
|
||||
icon_state = "hair_sergeant"
|
||||
|
||||
/datum/sprite_accessory/hair/bigflattop
|
||||
name = "Flat Top (Big)"
|
||||
icon_state = "hair_bigflattop"
|
||||
|
||||
/datum/sprite_accessory/hair/fag
|
||||
/datum/sprite_accessory/hair/fag //grimacing emoji
|
||||
name = "Flow Hair"
|
||||
icon_state = "hair_f"
|
||||
|
||||
/datum/sprite_accessory/hair/fringetail
|
||||
name = "Fringe Tail"
|
||||
icon_state = "hair_fringetail"
|
||||
|
||||
/datum/sprite_accessory/hair/gelled
|
||||
name = "Gelled Back"
|
||||
icon_state = "hair_gelled"
|
||||
@@ -205,10 +309,22 @@
|
||||
name = "Half-banged Hair 2"
|
||||
icon_state = "hair_halfbang2"
|
||||
|
||||
/datum/sprite_accessory/hair/halfbangalt
|
||||
name = "Half-banged Hair (Alt)"
|
||||
icon_state = "hair_halfbang_alt"
|
||||
|
||||
/datum/sprite_accessory/hair/halfshaved
|
||||
name = "Half-shaved Hair"
|
||||
icon_state = "hair_halfshaved"
|
||||
|
||||
/datum/sprite_accessory/hair/hedgehog
|
||||
name = "Hedgehog Hair"
|
||||
icon_state = "hair_hedgehog"
|
||||
|
||||
/datum/sprite_accessory/hair/hightight
|
||||
name = "High and Tight"
|
||||
icon_state = "hair_hightight"
|
||||
|
||||
/datum/sprite_accessory/hair/himecut
|
||||
name = "Hime Cut"
|
||||
icon_state = "hair_himecut"
|
||||
@@ -217,6 +333,10 @@
|
||||
name = "Hime Cut 2"
|
||||
icon_state = "hair_himecut2"
|
||||
|
||||
/datum/sprite_accessory/hair/shorthime
|
||||
name = "Hime Cut (Short)"
|
||||
icon_state = "hair_shorthime"
|
||||
|
||||
/datum/sprite_accessory/hair/himeup
|
||||
name = "Hime Updo"
|
||||
icon_state = "hair_himeup"
|
||||
@@ -225,16 +345,28 @@
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/jade
|
||||
name = "Jade"
|
||||
icon_state = "hair_jade"
|
||||
|
||||
/datum/sprite_accessory/hair/jensen
|
||||
name = "Jensen Hair"
|
||||
name = "Jensen"
|
||||
icon_state = "hair_jensen"
|
||||
|
||||
/datum/sprite_accessory/hair/joestar
|
||||
name = "Joestar"
|
||||
icon_state = "hair_joestar"
|
||||
|
||||
/datum/sprite_accessory/hair/kagami
|
||||
name = "Kagami"
|
||||
icon_state = "hair_kagami"
|
||||
|
||||
/datum/sprite_accessory/hair/keanu
|
||||
name = "Keanu Hair"
|
||||
name = "Keanu"
|
||||
icon_state = "hair_keanu"
|
||||
|
||||
/datum/sprite_accessory/hair/kusangi
|
||||
name = "Kusanagi Hair"
|
||||
name = "Kusanagi"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
@@ -249,6 +381,10 @@
|
||||
name = "Long Hair 3"
|
||||
icon_state = "hair_long3"
|
||||
|
||||
/datum/sprite_accessory/hair/longalt
|
||||
name = "Long Hair (Alt)"
|
||||
icon_state = "hair_longeralt"
|
||||
|
||||
/datum/sprite_accessory/hair/long_over_eye
|
||||
name = "Long Over Eye"
|
||||
icon_state = "hair_longovereye"
|
||||
@@ -269,6 +405,10 @@
|
||||
name = "Long Side Part"
|
||||
icon_state = "hair_longsidepart"
|
||||
|
||||
/datum/sprite_accessory/hair/manbun
|
||||
name = "Manbun"
|
||||
icon_state = "hair_manbun"
|
||||
|
||||
/datum/sprite_accessory/hair/megaeyebrows
|
||||
name = "Mega Eyebrows"
|
||||
icon_state = "hair_megaeyebrows"
|
||||
@@ -277,6 +417,10 @@
|
||||
name = "Messy"
|
||||
icon_state = "hair_messy"
|
||||
|
||||
/datum/sprite_accessory/hair/modern
|
||||
name = "Modern"
|
||||
icon_state = "hair_modern"
|
||||
|
||||
/datum/sprite_accessory/hair/mohawk
|
||||
name = "Mohawk"
|
||||
icon_state = "hair_d"
|
||||
@@ -285,6 +429,26 @@
|
||||
name = "Mohawk (Reverse)"
|
||||
icon_state = "hair_reversemohawk"
|
||||
|
||||
/datum/sprite_accessory/hair/shavedmohawk
|
||||
name = "Mohawk (Shaved)"
|
||||
icon_state = "hair_shavedmohawk"
|
||||
|
||||
/datum/sprite_accessory/hair/mohawk_unshaven
|
||||
name = "Mohawk (Unshaven)"
|
||||
icon_state = "hair_unshaven_mohawk"
|
||||
|
||||
/datum/sprite_accessory/hair/mulder
|
||||
name = "Mulder"
|
||||
icon_state = "hair_mulder"
|
||||
|
||||
/datum/sprite_accessory/hair/nia
|
||||
name = "Nia"
|
||||
icon_state = "hair_nia"
|
||||
|
||||
/datum/sprite_accessory/hair/nitori
|
||||
name = "Nitori"
|
||||
icon_state = "hair_nitori"
|
||||
|
||||
/datum/sprite_accessory/hair/odango
|
||||
name = "Odango"
|
||||
icon_state = "hair_odango"
|
||||
@@ -301,6 +465,10 @@
|
||||
name = "Over Eye"
|
||||
icon_state = "hair_shortovereye"
|
||||
|
||||
/datum/sprite_accessory/hair/oxton
|
||||
name = "Oxton"
|
||||
icon_state = "hair_oxton"
|
||||
|
||||
//Donator item - fractious
|
||||
/datum/sprite_accessory/hair/over_eye_fr
|
||||
name = "Over Eye (fract)"
|
||||
@@ -331,6 +499,10 @@
|
||||
name = "Pixie Cut"
|
||||
icon_state = "hair_pixie"
|
||||
|
||||
/datum/sprite_accessory/hair/plait
|
||||
name = "Plait"
|
||||
icon_state = "hair_plait"
|
||||
|
||||
/datum/sprite_accessory/hair/pompadour
|
||||
name = "Pompadour"
|
||||
icon_state = "hair_pompadour"
|
||||
@@ -383,10 +555,66 @@
|
||||
name = "Ponytail (Side) 4"
|
||||
icon_state = "hair_sidetail4"
|
||||
|
||||
/datum/sprite_accessory/hair/spikytail
|
||||
name = "Ponytail (Spiky)"
|
||||
icon_state = "hair_spikyponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/poofy
|
||||
name = "Poofy"
|
||||
icon_state = "hair_poofy"
|
||||
|
||||
/datum/sprite_accessory/hair/poofy2
|
||||
name = "Poofy 2"
|
||||
icon_state = "hair_poofy2"
|
||||
|
||||
/datum/sprite_accessory/hair/quiff
|
||||
name = "Quiff"
|
||||
icon_state = "hair_quiff"
|
||||
|
||||
/datum/sprite_accessory/hair/ronin
|
||||
name = "Ronin"
|
||||
icon_state = "hair_ronin"
|
||||
|
||||
/datum/sprite_accessory/hair/row
|
||||
name = "Rows"
|
||||
icon_state = "hair_rows1"
|
||||
|
||||
/datum/sprite_accessory/hair/row2
|
||||
name = "Rows 2"
|
||||
icon_state = "hair_rows2"
|
||||
|
||||
/datum/sprite_accessory/hair/rowbun
|
||||
name = "Rows (Bun)"
|
||||
icon_state = "hair_rowbun"
|
||||
|
||||
/datum/sprite_accessory/hair/rowdualtail
|
||||
name = "Rows (Pigtails)"
|
||||
icon_state = "hair_rowdualtail"
|
||||
|
||||
/datum/sprite_accessory/hair/rowbraid
|
||||
name = "Rows (Braid)"
|
||||
icon_state = "hair_rowbraid"
|
||||
|
||||
/datum/sprite_accessory/hair/scully
|
||||
name = "Scully"
|
||||
icon_state = "hair_scully"
|
||||
|
||||
/datum/sprite_accessory/hair/shaggy
|
||||
name = "Shaggy"
|
||||
icon_state = "hair_shaggy"
|
||||
|
||||
/datum/sprite_accessory/hair/shaved
|
||||
name = "Shaved"
|
||||
icon_state = "hair_shaved"
|
||||
|
||||
/datum/sprite_accessory/hair/shavedpart
|
||||
name = "Shaved (Part)"
|
||||
icon_state = "hair_shavedpart"
|
||||
|
||||
/datum/sprite_accessory/hair/bangs_short
|
||||
name = "Short Bangs"
|
||||
icon_state = "hair_shortbangs"
|
||||
|
||||
/datum/sprite_accessory/hair/short
|
||||
name = "Short Hair"
|
||||
icon_state = "hair_a"
|
||||
@@ -399,10 +627,30 @@
|
||||
name = "Short Hair 3"
|
||||
icon_state = "hair_shorthair3"
|
||||
|
||||
/datum/sprite_accessory/hair/shorthair4
|
||||
name = "Short Hair 4"
|
||||
icon_state = "hair_shorthair4"
|
||||
|
||||
/datum/sprite_accessory/hair/shorthair80s
|
||||
name = "Short Hair 80s"
|
||||
icon_state = "hair_80s"
|
||||
|
||||
/datum/sprite_accessory/hair/shorthairrosa
|
||||
name = "Short Hair Rosa"
|
||||
icon_state = "hair_rosa"
|
||||
|
||||
/datum/sprite_accessory/hair/stail
|
||||
name = "Short Tail"
|
||||
icon_state = "hair_stail"
|
||||
|
||||
/datum/sprite_accessory/hair/shoulderlength
|
||||
name = "Shoulder-length Hair"
|
||||
icon_state = "hair_b"
|
||||
|
||||
/datum/sprite_accessory/hair/shy
|
||||
name = "Shy"
|
||||
icon_state = "hair_shy"
|
||||
|
||||
/datum/sprite_accessory/hair/sidecut
|
||||
name = "Sidecut"
|
||||
icon_state = "hair_sidecut"
|
||||
@@ -411,6 +659,10 @@
|
||||
name = "Skinhead"
|
||||
icon_state = "hair_skinhead"
|
||||
|
||||
/datum/sprite_accessory/hair/sleaze
|
||||
name = "Sleaze"
|
||||
icon_state = "hair_sleaze"
|
||||
|
||||
/datum/sprite_accessory/hair/protagonist
|
||||
name = "Slightly Long Hair"
|
||||
icon_state = "hair_protagonist"
|
||||
@@ -435,14 +687,58 @@
|
||||
name = "Swept Back Hair 2"
|
||||
icon_state = "hair_swept2"
|
||||
|
||||
/datum/sprite_accessory/hair/thinning
|
||||
name = "Thinning"
|
||||
icon_state = "hair_thinning"
|
||||
|
||||
/datum/sprite_accessory/hair/thinningfront
|
||||
name = "Thinning (Front)"
|
||||
icon_state = "hair_thinningfront"
|
||||
|
||||
/datum/sprite_accessory/hair/thinningrear
|
||||
name = "Thinning (Rear)"
|
||||
icon_state = "hair_thinningrear"
|
||||
|
||||
/datum/sprite_accessory/hair/topknot
|
||||
name = "Topknot"
|
||||
icon_state = "hair_topknot"
|
||||
|
||||
/datum/sprite_accessory/hair/toriyama
|
||||
name = "Toriyama"
|
||||
icon_state = "hair_toriyama"
|
||||
|
||||
/datum/sprite_accessory/hair/toriyama2
|
||||
name = "Toriyama 2"
|
||||
icon_state = "hair_toriyama2"
|
||||
|
||||
/datum/sprite_accessory/hair/tressshoulder
|
||||
name = "Tress Shoulder"
|
||||
icon_state = "hair_tressshoulder"
|
||||
|
||||
/datum/sprite_accessory/hair/trimmed
|
||||
name = "Trimmed"
|
||||
icon_state = "hair_trimmed"
|
||||
|
||||
/datum/sprite_accessory/hair/trimflat
|
||||
name = "Trimmed (Flat)"
|
||||
icon_state = "hair_trimflat"
|
||||
|
||||
/datum/sprite_accessory/hair/twintails
|
||||
name = "Twintails"
|
||||
icon_state = "hair_twintail"
|
||||
|
||||
/datum/sprite_accessory/hair/longtwintails
|
||||
name = "Twintails (Long)"
|
||||
icon_state = "hair_longstraighttwintails"
|
||||
|
||||
/datum/sprite_accessory/hair/undercut
|
||||
name = "Undercut"
|
||||
icon_state = "hair_undercut"
|
||||
|
||||
/datum/sprite_accessory/hair/unkempt
|
||||
name = "Unkempt"
|
||||
icon_state = "hair_unkempt"
|
||||
|
||||
/datum/sprite_accessory/hair/updo
|
||||
name = "Updo"
|
||||
icon_state = "hair_updo"
|
||||
@@ -463,161 +759,22 @@
|
||||
name = "Very Long with Fringe"
|
||||
icon_state = "hair_vlongfringe"
|
||||
|
||||
/*************** VIRGO PORTED HAIRS ****************************/
|
||||
#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = #_name + " (Virgo)"
|
||||
//VIRGO PORTED HAIRS
|
||||
VHAIR("Short Hair Rosa", hair_rosa_s)
|
||||
VHAIR("Short Hair 80s", hair_80s_s)
|
||||
VHAIR("Long Bedhead", hair_long_bedhead_s)
|
||||
VHAIR("Dave", hair_dave_s)
|
||||
VHAIR("Country", hair_country_s)
|
||||
VHAIR("Shy", hair_shy_s)
|
||||
VHAIR("Unshaven Mohawk", hair_unshaven_mohawk_s)
|
||||
VHAIR("Manbun", hair_manbun_s)
|
||||
VHAIR("Longer Bedhead", hair_longer_bedhead_s)
|
||||
VHAIR("Ponytail", hair_ponytail_s)
|
||||
VHAIR("Ziegler", hair_ziegler_s)
|
||||
VHAIR("Emo Fringe", hair_emofringe_s)
|
||||
VHAIR("Very Short Over Eye Alt", hair_veryshortovereyealternate_s)
|
||||
VHAIR("Shorthime", hair_shorthime_s)
|
||||
VHAIR("High Tight", hair_hightight_s)
|
||||
VHAIR("Thinning Front", hair_thinningfront_s)
|
||||
VHAIR("Big Afro", hair_bigafro_s)
|
||||
VHAIR("Afro", hair_afro_s)
|
||||
VHAIR("High Braid", hair_hbraid_s)
|
||||
VHAIR("Braid", hair_braid_s)
|
||||
VHAIR("Sargeant", hair_sargeant_s)
|
||||
VHAIR("Gelled", hair_gelled_s)
|
||||
VHAIR("Kagami", hair_kagami_s)
|
||||
VHAIR("ShortTail", hair_stail_s)
|
||||
VHAIR("Gentle", hair_gentle_s)
|
||||
VHAIR("Grande", hair_grande_s)
|
||||
VHAIR("Bobcurl", hair_bobcurl_s)
|
||||
VHAIR("Pompadeur", hair_pompadour_s)
|
||||
VHAIR("Plait", hair_plait_s)
|
||||
VHAIR("Long", hair_long_s)
|
||||
VHAIR("Rattail", hair_rattail_s)
|
||||
VHAIR("Tajspiky", hair_tajspiky_s)
|
||||
VHAIR("Messy", hair_messy_s)
|
||||
VHAIR("Bangs", hair_bangs_s)
|
||||
VHAIR("TBraid", hair_tbraid_s)
|
||||
VHAIR("Toriyama2", hair_toriyama2_s)
|
||||
VHAIR("CIA", hair_cia_s)
|
||||
VHAIR("Mulder", hair_mulder_s)
|
||||
VHAIR("Scully", hair_scully_s)
|
||||
VHAIR("Nitori", hair_nitori_s)
|
||||
VHAIR("Joestar", hair_joestar_s)
|
||||
VHAIR("Ponytail4", hair_ponytail4_s)
|
||||
VHAIR("Ponytail5", hair_ponytail5_s)
|
||||
VHAIR("Beehive2", hair_beehive2_s)
|
||||
VHAIR("Short Braid", hair_shortbraid_s)
|
||||
VHAIR("Reverse Mohawk", hair_reversemohawk_s)
|
||||
VHAIR("SHort Bangs", hair_shortbangs_s)
|
||||
VHAIR("Half Shaved", hair_halfshaved_s)
|
||||
VHAIR("Longer Alt 2", hair_longeralt2_s)
|
||||
VHAIR("Bun", hair_bun_s)
|
||||
VHAIR("Curly", hair_curly_s)
|
||||
VHAIR("Victory", hair_victory_s)
|
||||
VHAIR("Ponytail6", hair_ponytail6_s)
|
||||
VHAIR("Undercut3", hair_undercut3_s)
|
||||
VHAIR("Bobcut Alt", hair_bobcultalt_s)
|
||||
VHAIR("Fingerwave", hair_fingerwave_s)
|
||||
VHAIR("Oxton", hair_oxton_s)
|
||||
VHAIR("Poofy2", hair_poofy2_s)
|
||||
VHAIR("Fringe Tail", hair_fringetail_s)
|
||||
VHAIR("Bun3", hair_bun3_s)
|
||||
VHAIR("Wisp", hair_wisp_s)
|
||||
VHAIR("Undercut2", hair_undercut2_s)
|
||||
VHAIR("TBob", hair_tbob_s)
|
||||
VHAIR("Spiky Ponytail", hair_spikyponytail_s)
|
||||
VHAIR("Rowbun", hair_rowbun_s)
|
||||
VHAIR("Rowdualtail", hair_rowdualtail_s)
|
||||
VHAIR("Rowbraid", hair_rowbraid_s)
|
||||
VHAIR("Shaved Mohawk", hair_shavedmohawk_s)
|
||||
VHAIR("Topknot", hair_topknot_s)
|
||||
VHAIR("Ronin", hair_ronin_s)
|
||||
VHAIR("Bowlcut2", hair_bowlcut2_s)
|
||||
VHAIR("Thinning Rear", hair_thinningrear_s)
|
||||
VHAIR("Thinning", hair_thinning_s)
|
||||
VHAIR("Jade", hair_jade_s)
|
||||
VHAIR("Bedhead", hair_bedhead_s)
|
||||
VHAIR("Dreadlocks", hair_dreads_s)
|
||||
VHAIR("Very Long", hair_vlong_s)
|
||||
VHAIR("Jensen", hair_jensen_s)
|
||||
VHAIR("Halfbang", hair_halfbang_s)
|
||||
VHAIR("Kusangi", hair_kusangi_s)
|
||||
VHAIR("Ponytail", hair_ponytail_s)
|
||||
VHAIR("Ponytail3", hair_ponytail3_s)
|
||||
VHAIR("Halfbang Alt", hair_halfbang_alt_s)
|
||||
VHAIR("Bedhead V2", hair_bedheadv2_s)
|
||||
VHAIR("Long Fringe", hair_longfringe_s)
|
||||
VHAIR("Flair", hair_flair_s)
|
||||
VHAIR("Bedhead V3", hair_bedheadv3_s)
|
||||
VHAIR("Himecut", hair_himecut_s)
|
||||
VHAIR("Curls", hair_curls_s)
|
||||
VHAIR("Very Long Fringe", hair_vlongfringe_s)
|
||||
VHAIR("Longest", hair_longest_s)
|
||||
VHAIR("Father", hair_father_s)
|
||||
VHAIR("Emo Long", hair_emolong_s)
|
||||
VHAIR("Short Hair 3", hair_shorthair3_s)
|
||||
VHAIR("Double Bun", hair_doublebun_s)
|
||||
VHAIR("Sleeze", hair_sleeze_s)
|
||||
VHAIR("Twintail", hair_twintail_s)
|
||||
VHAIR("Emo 2", hair_emo2_s)
|
||||
VHAIR("Low Fade", hair_lowfade_s)
|
||||
VHAIR("Med Fade", hair_medfade_s)
|
||||
VHAIR("High Fade", hair_highfade_s)
|
||||
VHAIR("Bald Fade", hair_baldfade_s)
|
||||
VHAIR("No Fade", hair_nofade_s)
|
||||
VHAIR("Trim Flat", hair_trimflat_s)
|
||||
VHAIR("Shaved", hair_shaved_s)
|
||||
VHAIR("Trimmed", hair_trimmed_s)
|
||||
VHAIR("Tight Bun", hair_tightbun_s)
|
||||
VHAIR("Short Hair 4", hair_d_s)
|
||||
VHAIR("Short Hair 5", hair_e_s)
|
||||
VHAIR("Short Hair 6", hair_f_s)
|
||||
VHAIR("Skinhead", hair_skinhead_s)
|
||||
VHAIR("Afro2", hair_afro2_s)
|
||||
VHAIR("Bobcut", hair_bobcut_s)
|
||||
VHAIR("Emo", hair_emo_s)
|
||||
VHAIR("Long Over Eye", hair_longovereye_s)
|
||||
VHAIR("Feather", hair_feather_s)
|
||||
VHAIR("Hitop", hair_hitop_s)
|
||||
VHAIR("Short Over Eye", hair_shortoverye_s)
|
||||
VHAIR("Straight", hair_straight_s)
|
||||
VHAIR("Buzzcut", hair_buzzcut_s)
|
||||
VHAIR("Combover", hair_combover_s)
|
||||
VHAIR("Crewcut", hair_crewcut_s)
|
||||
VHAIR("Devillock", hair_devilock_s)
|
||||
VHAIR("Clean", hair_clean_s)
|
||||
VHAIR("Shaggy", hair_shaggy_s)
|
||||
VHAIR("Updo", hair_updo_s)
|
||||
VHAIR("Mohawk", hair_mohawk_s)
|
||||
VHAIR("Odango", hair_odango_s)
|
||||
VHAIR("Ombre", hair_ombre_s)
|
||||
VHAIR("Parted", hair_parted_s)
|
||||
VHAIR("Quiff", hair_quiff_s)
|
||||
VHAIR("Volaju", hair_volaju_s)
|
||||
VHAIR("Bun2", hair_bun2_s)
|
||||
VHAIR("Rows1", hair_rows1_s)
|
||||
VHAIR("Rows2", hair_rows2_s)
|
||||
VHAIR("Dandy Pompadour", hair_dandypompadour_s)
|
||||
VHAIR("Poofy", hair_poofy_s)
|
||||
VHAIR("Toriyama", hair_toriyama_s)
|
||||
VHAIR("Drillruru", hair_drillruru_s)
|
||||
VHAIR("Bowlcut", hair_bowlcut_s)
|
||||
VHAIR("Coffee House", hair_coffeehouse_s)
|
||||
VHAIR("Family Man", hair_thefamilyman_s)
|
||||
VHAIR("Shaved Part", hair_shavedpart_s)
|
||||
VHAIR("Modern", hair_modern_s)
|
||||
VHAIR("One Shoulder", hair_oneshoulder_s)
|
||||
VHAIR("Very Short Over Eye", hair_veryshortovereye_s)
|
||||
VHAIR("Unkept", hair_unkept_s)
|
||||
VHAIR("Wife", hair_wife_s)
|
||||
VHAIR("Nia", hair_nia_s)
|
||||
VHAIR("Undercut", hair_undercut_s)
|
||||
VHAIR("Bobcut Alt", hair_bobcutalt_s)
|
||||
VHAIR("Short Hair 4 alt", hair_shorthair4_s)
|
||||
VHAIR("Tressshoulder", hair_tressshoulder_s)
|
||||
//END
|
||||
#undef VHAIR
|
||||
/datum/sprite_accessory/hair/short_oe
|
||||
name = "Very Short Over Eye"
|
||||
icon_state = "hair_veryshortovereye"
|
||||
|
||||
/datum/sprite_accessory/hair/short_oe_alt
|
||||
name = "Very Short Over Eye (Alt)"
|
||||
icon_state = "hair_veryshortovereyealternate"
|
||||
|
||||
/datum/sprite_accessory/hair/volaju
|
||||
name = "Volaju"
|
||||
icon_state = "hair_volaju"
|
||||
|
||||
/datum/sprite_accessory/hair/wisp
|
||||
name = "Wisp"
|
||||
icon_state = "hair_wisp"
|
||||
|
||||
/datum/sprite_accessory/hair/ziegler
|
||||
name = "Ziegler"
|
||||
icon_state = "hair_ziegler"
|
||||
@@ -389,6 +389,7 @@
|
||||
if(resilience)
|
||||
actual_trauma.resilience = resilience
|
||||
SSblackbox.record_feedback("tally", "traumas", 1, actual_trauma.type)
|
||||
return actual_trauma
|
||||
|
||||
//Add a random trauma of a certain subtype
|
||||
/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
var/alt_inhands_file = 'icons/mob/alienqueen.dmi'
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/can_inject()
|
||||
/mob/living/carbon/alien/humanoid/royal/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE)
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/queen
|
||||
|
||||
@@ -44,7 +44,8 @@
|
||||
if(M.occupant == src)
|
||||
M.go_out()
|
||||
|
||||
dna.species.spec_death(gibbed, src)
|
||||
if(!QDELETED(dna)) //The gibbed param is bit redundant here since dna won't exist at this point if they got deleted.
|
||||
dna.species.spec_death(gibbed, src)
|
||||
|
||||
if(SSticker.HasRoundStarted())
|
||||
SSblackbox.ReportDeath(src)
|
||||
|
||||
@@ -385,20 +385,17 @@
|
||||
else if(isobserver(user) && traitstring)
|
||||
. += "<span class='info'><b>Traits:</b> [traitstring]</span>"
|
||||
|
||||
if(print_flavor_text())
|
||||
if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
|
||||
. += "...?"
|
||||
else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either.
|
||||
. += "...?"
|
||||
else
|
||||
. += "[print_flavor_text()]"
|
||||
if(print_flavor_text_2())
|
||||
if(get_visible_name() == "Unknown") //Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
|
||||
. += "...?"
|
||||
else if(skipface) //Sometimes we're not unknown, but impersonating someone in a hardsuit, let's not reveal our flavor text then either.
|
||||
. += "...?"
|
||||
else
|
||||
. += "[print_flavor_text_2()]"
|
||||
//No flavor text unless the face can be seen. Prevents certain metagaming with impersonation.
|
||||
var/invisible_man = skipface || get_visible_name() == "Unknown"
|
||||
if(invisible_man)
|
||||
. += "...?"
|
||||
else
|
||||
var/flavor = print_flavor_text()
|
||||
if(flavor)
|
||||
. += flavor
|
||||
var/temp_flavor = print_flavor_text_2()
|
||||
if(temp_flavor)
|
||||
. += temp_flavor
|
||||
. += "*---------*</span>"
|
||||
|
||||
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
|
||||
|
||||
@@ -336,7 +336,8 @@
|
||||
if(bomb_armor < EXPLODE_GIB_THRESHOLD) //gibs the mob if their bomb armor is lower than EXPLODE_GIB_THRESHOLD
|
||||
for(var/I in contents)
|
||||
var/atom/A = I
|
||||
A.ex_act(severity)
|
||||
if(!QDELETED(A))
|
||||
A.ex_act(severity)
|
||||
gib()
|
||||
return
|
||||
else
|
||||
|
||||
@@ -849,6 +849,8 @@
|
||||
linked_mobs.Add(M)
|
||||
if(!selflink)
|
||||
to_chat(M, "<span class='notice'>You are now connected to [slimelink_owner.real_name]'s Slime Link.</span>")
|
||||
RegisterSignal(M, COMSIG_MOB_DEATH , .proc/unlink_mob)
|
||||
RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/unlink_mob)
|
||||
var/datum/action/innate/linked_speech/action = new(src)
|
||||
linked_actions.Add(action)
|
||||
action.Grant(M)
|
||||
@@ -858,6 +860,7 @@
|
||||
var/link_id = linked_mobs.Find(M)
|
||||
if(!(link_id))
|
||||
return
|
||||
UnregisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING))
|
||||
var/datum/action/innate/linked_speech/action = linked_actions[link_id]
|
||||
action.Remove(M)
|
||||
to_chat(M, "<span class='notice'>You are no longer connected to [slimelink_owner.real_name]'s Slime Link.</span>")
|
||||
@@ -890,18 +893,11 @@
|
||||
Remove(H)
|
||||
return
|
||||
|
||||
if(QDELETED(H) || H.stat == DEAD)
|
||||
species.unlink_mob(H)
|
||||
return
|
||||
|
||||
if(message)
|
||||
var/msg = "<i><font color=#008CA2>\[[species.slimelink_owner.real_name]'s Slime Link\] <b>[H]:</b> [message]</font></i>"
|
||||
log_directed_talk(H, species.slimelink_owner, msg, LOG_SAY, "slime link")
|
||||
for(var/X in species.linked_mobs)
|
||||
var/mob/living/M = X
|
||||
if(QDELETED(M) || M.stat == DEAD)
|
||||
species.unlink_mob(M)
|
||||
continue
|
||||
to_chat(M, msg)
|
||||
|
||||
for(var/X in GLOB.dead_mob_list)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
..()
|
||||
|
||||
/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
var/current_job = J.title
|
||||
var/current_job = J?.title
|
||||
var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
|
||||
switch(current_job)
|
||||
if("Chaplain")
|
||||
|
||||
@@ -382,9 +382,6 @@ There are several things that need to be remembered:
|
||||
|
||||
if(wear_suit)
|
||||
var/obj/item/clothing/suit/S = wear_suit
|
||||
var/item_level_support = FALSE // LISTEN! If you must degrade the code with further snowflake checks, at least keep it compatible with worn non-clothing items!
|
||||
if(!istype(S))
|
||||
item_level_support = TRUE
|
||||
wear_suit.screen_loc = ui_oclothing
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
@@ -400,7 +397,7 @@ There are several things that need to be remembered:
|
||||
if("taur" in dna.species.mutant_bodyparts)
|
||||
T = GLOB.taur_list[dna.features["taur"]]
|
||||
|
||||
if(!item_level_support && S.mutantrace_variation)
|
||||
if(S.mutantrace_variation)
|
||||
if(T?.taur_mode)
|
||||
var/init_worn_icon = worn_icon
|
||||
variation_flag |= S.mutantrace_variation & T.taur_mode || S.mutantrace_variation & T.alt_taur_mode
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
|
||||
/mob/living/carbon/monkey/handle_mutations_and_radiation()
|
||||
if(radiation)
|
||||
if(radiation > RAD_MOB_MUTATE && prob((radiation - RAD_MOB_MUTATE) / 25))
|
||||
gorillize()
|
||||
return
|
||||
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
|
||||
if(!IsKnockdown())
|
||||
emote("collapse")
|
||||
@@ -41,10 +44,6 @@
|
||||
randmutb()
|
||||
emote("gasp")
|
||||
domutcheck()
|
||||
|
||||
if(radiation > RAD_MOB_MUTATE * 2 && prob(50))
|
||||
gorillize()
|
||||
return
|
||||
if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB))
|
||||
vomit(10, TRUE)
|
||||
return ..()
|
||||
|
||||
@@ -90,8 +90,10 @@
|
||||
if(now_pushing)
|
||||
return TRUE
|
||||
|
||||
var/they_can_move = TRUE
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
they_can_move = L.canmove //L.mobility_flags & MOBILITY_MOVE
|
||||
//Also spread diseases
|
||||
for(var/thing in diseases)
|
||||
var/datum/disease/D = thing
|
||||
@@ -144,13 +146,17 @@
|
||||
return 1
|
||||
|
||||
if(!M.buckled && !M.has_buckled_mobs())
|
||||
var/mob_swap
|
||||
//the puller can always swap with its victim if on grab intent
|
||||
if(M.pulledby == src && a_intent == INTENT_GRAB)
|
||||
mob_swap = 1
|
||||
//restrained people act if they were on 'help' intent to prevent a person being pulled from being separated from their puller
|
||||
else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
|
||||
mob_swap = 1
|
||||
var/mob_swap = FALSE
|
||||
var/too_strong = (M.move_resist > move_force) //can't swap with immovable objects unless they help us
|
||||
if(!they_can_move) //we have to physically move them
|
||||
if(!too_strong)
|
||||
mob_swap = TRUE
|
||||
else
|
||||
if(M.pulledby == src && a_intent == INTENT_GRAB)
|
||||
mob_swap = TRUE
|
||||
//restrained people act if they were on 'help' intent to prevent a person being pulled from being separated from their puller
|
||||
else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
|
||||
mob_swap = TRUE
|
||||
if(mob_swap)
|
||||
//switch our position with M
|
||||
if(loc && !loc.Adjacent(M.loc))
|
||||
@@ -453,7 +459,7 @@
|
||||
return ret
|
||||
|
||||
// Living mobs use can_inject() to make sure that the mob is not syringe-proof in general.
|
||||
/mob/living/proc/can_inject()
|
||||
/mob/living/proc/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/is_injectable(allowmobs = TRUE)
|
||||
|
||||
@@ -53,11 +53,11 @@
|
||||
if(NONE)
|
||||
return FALSE
|
||||
if(POWER_REQ_ALL)
|
||||
return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
if(POWER_REQ_CLOCKCULT)
|
||||
for(var/obj/effect/clockwork/sigil/transmission/ST in range(src, SIGIL_ACCESS_RANGE))
|
||||
return FALSE
|
||||
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
|
||||
/mob/living/silicon/ai/updatehealth()
|
||||
if(status_flags & GODMODE)
|
||||
@@ -100,7 +100,7 @@
|
||||
sleep(50)
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/AIarea = get_area(src)
|
||||
if(AIarea && AIarea.power_equip)
|
||||
if(AIarea && AIarea.powered(EQUIP))
|
||||
if(!isspaceturf(T))
|
||||
ai_restore_power()
|
||||
return
|
||||
@@ -120,7 +120,7 @@
|
||||
var/PRP //like ERP with the code, at least this stuff is no more 4x sametext
|
||||
for (PRP=1, PRP<=4, PRP++)
|
||||
T = get_turf(src)
|
||||
AIarea = get_area(src)
|
||||
AIarea = get_base_area(src)
|
||||
if(AIarea)
|
||||
for (var/obj/machinery/power/apc/APC in AIarea)
|
||||
if (!(APC.stat & BROKEN))
|
||||
@@ -134,7 +134,7 @@
|
||||
to_chat(src, "Lost connection with the APC!")
|
||||
aiRestorePowerRoutine = POWER_RESTORATION_SEARCH_APC
|
||||
return
|
||||
if(AIarea.power_equip)
|
||||
if(AIarea.powered(EQUIP))
|
||||
if(!isspaceturf(T))
|
||||
ai_restore_power()
|
||||
return
|
||||
|
||||
@@ -438,7 +438,7 @@
|
||||
if(1)
|
||||
. += "<CENTER><B>Medical Record</B></CENTER><BR>"
|
||||
if(medicalActive1 in GLOB.data_core.general)
|
||||
. += "Name: [medicalActive1.fields["name"]] ID: [medicalActive1.fields["id"]]<BR>\nSex: [medicalActive1.fields["sex"]]<BR>\nAge: [medicalActive1.fields["age"]]<BR>\nFingerprint: [medicalActive1.fields["fingerprint"]]<BR>\nPhysical Status: [medicalActive1.fields["p_stat"]]<BR>\nMental Status: [medicalActive1.fields["m_stat"]]<BR>"
|
||||
. += "Name: [medicalActive1.fields["name"]] ID: [medicalActive1.fields["id"]]<BR>\nGender: [medicalActive1.fields["gender"]]<BR>\nAge: [medicalActive1.fields["age"]]<BR>\nFingerprint: [medicalActive1.fields["fingerprint"]]<BR>\nPhysical Status: [medicalActive1.fields["p_stat"]]<BR>\nMental Status: [medicalActive1.fields["m_stat"]]<BR>"
|
||||
else
|
||||
. += "<pre>Requested medical record not found.</pre><BR>"
|
||||
if(medicalActive2 in GLOB.data_core.medical)
|
||||
@@ -460,7 +460,7 @@
|
||||
if(1)
|
||||
. += "<h3>Security Record</h3>"
|
||||
if(securityActive1 in GLOB.data_core.general)
|
||||
. += "Name: <A href='?src=[REF(src)];field=name'>[securityActive1.fields["name"]]</A> ID: <A href='?src=[REF(src)];field=id'>[securityActive1.fields["id"]]</A><BR>\nSex: <A href='?src=[REF(src)];field=sex'>[securityActive1.fields["sex"]]</A><BR>\nAge: <A href='?src=[REF(src)];field=age'>[securityActive1.fields["age"]]</A><BR>\nRank: <A href='?src=[REF(src)];field=rank'>[securityActive1.fields["rank"]]</A><BR>\nFingerprint: <A href='?src=[REF(src)];field=fingerprint'>[securityActive1.fields["fingerprint"]]</A><BR>\nPhysical Status: [securityActive1.fields["p_stat"]]<BR>\nMental Status: [securityActive1.fields["m_stat"]]<BR>"
|
||||
. += "Name: <A href='?src=[REF(src)];field=name'>[securityActive1.fields["name"]]</A> ID: <A href='?src=[REF(src)];field=id'>[securityActive1.fields["id"]]</A><BR>\nGender: <A href='?src=[REF(src)];field=sex'>[securityActive1.fields["gender"]]</A><BR>\nAge: <A href='?src=[REF(src)];field=age'>[securityActive1.fields["age"]]</A><BR>\nRank: <A href='?src=[REF(src)];field=rank'>[securityActive1.fields["rank"]]</A><BR>\nFingerprint: <A href='?src=[REF(src)];field=fingerprint'>[securityActive1.fields["fingerprint"]]</A><BR>\nPhysical Status: [securityActive1.fields["p_stat"]]<BR>\nMental Status: [securityActive1.fields["m_stat"]]<BR>"
|
||||
else
|
||||
. += "<pre>Requested security record not found,</pre><BR>"
|
||||
if(securityActive2 in GLOB.data_core.security)
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
for(var/key in alarm_types_clear)
|
||||
alarm_types_clear[key] = 0
|
||||
|
||||
/mob/living/silicon/can_inject(mob/user, error_msg)
|
||||
/mob/living/silicon/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE)
|
||||
if(error_msg)
|
||||
to_chat(user, "<span class='alert'>[p_their(TRUE)] outer shell is too tough.</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -207,7 +207,11 @@
|
||||
|
||||
switch(add_to)
|
||||
if("collar")
|
||||
add_collar(usr.get_active_held_item(), usr)
|
||||
var/obj/item/clothing/neck/petcollar/P = usr.get_active_held_item()
|
||||
if(!istype(P))
|
||||
to_chat(usr,"<span class='warning'>That's not a collar.</span>")
|
||||
return
|
||||
add_collar(P, usr)
|
||||
update_corgi_fluff()
|
||||
|
||||
if(BODY_ZONE_HEAD)
|
||||
|
||||
@@ -479,31 +479,33 @@ Difficulty: Very Hard
|
||||
NewTerrainTables = /obj/structure/table/abductor
|
||||
|
||||
/obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method)
|
||||
if(..())
|
||||
var/area/A = get_area(src)
|
||||
if(!A.outdoors && !(A in affected_targets))
|
||||
for(var/atom/Stuff in A)
|
||||
if(isturf(Stuff))
|
||||
var/turf/T = Stuff
|
||||
if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
|
||||
var/turf/open/O = T.ChangeTurf(NewTerrainFloors, flags = CHANGETURF_INHERIT_AIR)
|
||||
if(prob(florachance) && NewFlora.len && !is_blocked_turf(O, TRUE))
|
||||
var/atom/Picked = pick(NewFlora)
|
||||
new Picked(O)
|
||||
continue
|
||||
if(iswallturf(T) && NewTerrainWalls)
|
||||
T.ChangeTurf(NewTerrainWalls)
|
||||
continue
|
||||
if(istype(Stuff, /obj/structure/chair) && NewTerrainChairs)
|
||||
var/obj/structure/chair/Original = Stuff
|
||||
var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
|
||||
C.setDir(Original.dir)
|
||||
qdel(Stuff)
|
||||
continue
|
||||
if(istype(Stuff, /obj/structure/table) && NewTerrainTables)
|
||||
new NewTerrainTables(Stuff.loc)
|
||||
continue
|
||||
affected_targets += A
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
for(var/i in get_sub_areas(src))
|
||||
var/area/A = i
|
||||
if(A.outdoors || (A in affected_targets))
|
||||
continue
|
||||
affected_targets += A
|
||||
for(var/stuff in A)
|
||||
var/atom/target = stuff
|
||||
if(isturf(target))
|
||||
var/turf/T = target
|
||||
if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
|
||||
var/turf/open/O = T.ChangeTurf(NewTerrainFloors, flags = CHANGETURF_INHERIT_AIR)
|
||||
if(NewFlora.len && prob(florachance) && !is_blocked_turf(O, TRUE))
|
||||
var/atom/Picked = pick(NewFlora)
|
||||
new Picked(O)
|
||||
else if(iswallturf(T) && NewTerrainWalls)
|
||||
T.ChangeTurf(NewTerrainWalls)
|
||||
else if(NewTerrainChairs && istype(target, /obj/structure/chair))
|
||||
var/obj/structure/chair/Original = target
|
||||
var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
|
||||
C.setDir(Original.dir)
|
||||
qdel(target)
|
||||
else if(NewTerrainTables && istype(target, /obj/structure/table))
|
||||
new NewTerrainTables(target.loc)
|
||||
qdel(target)
|
||||
|
||||
/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with
|
||||
observer_desc = "This crystal generates a projectile when activated."
|
||||
|
||||
@@ -170,7 +170,7 @@ Difficulty: Medium
|
||||
to_chat(user, "<span class='warning'>The staff is still recharging!</span>")
|
||||
return
|
||||
|
||||
var/area/user_area = get_area(user)
|
||||
var/area/user_area = get_base_area(user)
|
||||
var/turf/user_turf = get_turf(user)
|
||||
if(!user_area || !user_turf || (user_area.type in excluded_areas))
|
||||
to_chat(user, "<span class='warning'>Something is preventing you from using the staff here.</span>")
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
var/datum/personal_crafting/handcrafting
|
||||
|
||||
var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever), AI_Z_OFF (Temporarily off due to nonpresence of players)
|
||||
var/can_have_ai = TRUE //once we have become sentient, we can never go back
|
||||
|
||||
var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check.
|
||||
|
||||
@@ -425,6 +426,9 @@
|
||||
canmove = FALSE
|
||||
else
|
||||
canmove = value_otherwise
|
||||
if(!canmove) // !(mobility_flags & MOBILITY_MOVE)
|
||||
walk(src, 0) //stop mid walk
|
||||
|
||||
update_transform()
|
||||
update_action_buttons_icon()
|
||||
return canmove
|
||||
@@ -443,6 +447,7 @@
|
||||
|
||||
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
|
||||
toggle_ai(AI_OFF) // To prevent any weirdness.
|
||||
can_have_ai = FALSE
|
||||
|
||||
/mob/living/simple_animal/update_sight()
|
||||
if(!client)
|
||||
@@ -557,6 +562,8 @@
|
||||
LoadComponent(/datum/component/riding)
|
||||
|
||||
/mob/living/simple_animal/proc/toggle_ai(togglestatus)
|
||||
if(!can_have_ai && (togglestatus != AI_OFF))
|
||||
return
|
||||
if (AIStatus != togglestatus)
|
||||
if (togglestatus > 0 && togglestatus < 5)
|
||||
if (togglestatus == AI_Z_OFF || AIStatus == AI_Z_OFF)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
AIproc = 1
|
||||
|
||||
while(AIproc && stat != DEAD && (attacked || hungry || rabid || buckled))
|
||||
if(buckled) // can't eat AND have this little process at the same time
|
||||
if(!canmove) // !(mobility_flags & MOBILITY_MOVE) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly
|
||||
break
|
||||
|
||||
if(!Target || client)
|
||||
|
||||
@@ -456,8 +456,10 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
|
||||
return
|
||||
|
||||
/mob/proc/transfer_ckey(mob/new_mob, send_signal = TRUE)
|
||||
if(!ckey || !new_mob)
|
||||
CRASH("transfer_ckey() called [ckey ? "" : "on a ckey-less mob[new_mob ? "" : " and "]"][new_mob ? "" : "without a valid mob target"]!")
|
||||
if(!new_mob || (!ckey && new_mob.ckey))
|
||||
CRASH("transfer_ckey() called [new_mob ? "on ckey-less mob with a player mob as target" : "without a valid mob target"]!")
|
||||
if(!ckey)
|
||||
return
|
||||
SEND_SIGNAL(new_mob, COMSIG_MOB_PRE_PLAYER_CHANGE, new_mob, src)
|
||||
if (client && client.prefs && client.prefs.auto_ooc)
|
||||
if (client.prefs.chat_toggles & CHAT_OOC && isliving(new_mob))
|
||||
@@ -964,4 +966,4 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
|
||||
|
||||
/mob/setMovetype(newval)
|
||||
. = ..()
|
||||
update_movespeed(FALSE)
|
||||
update_movespeed(FALSE)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
var/computer_id = null
|
||||
var/list/logging = list()
|
||||
var/obj/machinery/machine = null
|
||||
var/atom/machine = null
|
||||
|
||||
var/next_move = null
|
||||
var/create_area_cooldown
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
|
||||
for(var/C in all_components)
|
||||
var/obj/item/computer_hardware/H = all_components[C]
|
||||
if(QDELETED(H))
|
||||
return
|
||||
uninstall_component(H)
|
||||
H.forceMove(newloc)
|
||||
if(prob(25))
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
|
||||
|
||||
|
||||
/obj/item/modular_computer/laptop/preset/civillian
|
||||
/obj/item/modular_computer/laptop/preset/civilian
|
||||
desc = "A low-end laptop often used for personal recreation."
|
||||
|
||||
|
||||
/obj/item/modular_computer/laptop/preset/civillian/install_programs()
|
||||
/obj/item/modular_computer/laptop/preset/civilian/install_programs()
|
||||
var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
|
||||
hard_drive.store_file(new/datum/computer_file/program/chatclient())
|
||||
hard_drive.store_file(new/datum/computer_file/program/nttransfer())
|
||||
hard_drive.store_file(new/datum/computer_file/program/nttransfer())
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
continue
|
||||
var/obj/item/paper/P = new /obj/item/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 += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nGender: [G.fields["gender"]]<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]"])
|
||||
@@ -159,7 +159,7 @@
|
||||
continue
|
||||
var/obj/item/paper/P = new /obj/item/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 += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nGender: [G.fields["gender"]]<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["blood_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]"])
|
||||
|
||||
@@ -34,7 +34,9 @@
|
||||
|
||||
/obj/item/paperplane/handle_atom_del(atom/A)
|
||||
if(A == internalPaper)
|
||||
var/obj/item/paper/P = internalPaper
|
||||
internalPaper = null
|
||||
P.moveToNullspace() //So we're not deleting it twice when deleting our contents.
|
||||
if(!QDELETED(src))
|
||||
qdel(src)
|
||||
return ..()
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
var/picture_size_y_min = 1
|
||||
var/picture_size_x_max = 4
|
||||
var/picture_size_y_max = 4
|
||||
var/can_customise = TRUE
|
||||
var/default_picture_name
|
||||
|
||||
/obj/item/camera/attack_self(mob/user)
|
||||
if(!disk)
|
||||
@@ -199,8 +201,10 @@
|
||||
user.put_in_hands(p)
|
||||
pictures_left--
|
||||
to_chat(user, "<span class='notice'>[pictures_left] photos left.</span>")
|
||||
var/customize = alert(user, "Do you want to customize the photo?", "Customization", "Yes", "No")
|
||||
if(customize == "Yes")
|
||||
var/customise = "No"
|
||||
if(can_customise)
|
||||
customise = alert(user, "Do you want to customize the photo?", "Customization", "Yes", "No")
|
||||
if(customise == "Yes")
|
||||
var/name1 = stripped_input(user, "Set a name for this photo, or leave blank. 32 characters max.", "Name", max_length = 32)
|
||||
var/desc1 = stripped_input(user, "Set a description to add to photo, or leave blank. 128 characters max.", "Caption", max_length = 128)
|
||||
var/caption = stripped_input(user, "Set a caption for this photo, or leave blank. 256 characters max.", "Caption", max_length = 256)
|
||||
@@ -210,6 +214,10 @@
|
||||
picture.picture_desc = "[desc1] - [picture.picture_desc]"
|
||||
if(caption)
|
||||
picture.caption = caption
|
||||
else
|
||||
if(default_picture_name)
|
||||
picture.picture_name = default_picture_name
|
||||
|
||||
p.set_picture(picture, TRUE, TRUE)
|
||||
if(CONFIG_GET(flag/picture_logging_camera))
|
||||
picture.log_to_file()
|
||||
+37
-45
@@ -56,6 +56,8 @@
|
||||
integrity_failure = 50
|
||||
var/damage_deflection = 10
|
||||
resistance_flags = FIRE_PROOF
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50)
|
||||
req_access = list(ACCESS_ENGINE_EQUIP)
|
||||
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON
|
||||
|
||||
var/lon_range = 1.5
|
||||
@@ -148,12 +150,40 @@
|
||||
if(terminal)
|
||||
terminal.connect_to_network()
|
||||
|
||||
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
|
||||
if (!req_access)
|
||||
req_access = list(ACCESS_ENGINE_EQUIP)
|
||||
if (!armor)
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50)
|
||||
..()
|
||||
/obj/machinery/power/apc/Initialize(mapload, ndir, building = FALSE)
|
||||
. = ..()
|
||||
var/area/A = get_base_area(src)
|
||||
if(!building)
|
||||
has_electronics = APC_ELECTRONICS_SECURED
|
||||
// is starting with a power cell installed, create it and set its charge level
|
||||
if(cell_type)
|
||||
cell = new cell_type
|
||||
cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
|
||||
|
||||
//if area isn't specified use current
|
||||
if(areastring)
|
||||
area = get_area_instance_from_text(areastring)
|
||||
if(!area)
|
||||
area = A
|
||||
stack_trace("Bad areastring path for [src], [src.areastring]")
|
||||
else if(isarea(A) && !areastring)
|
||||
area = A
|
||||
if(auto_name)
|
||||
name = "\improper [A.name] APC"
|
||||
update_icon()
|
||||
|
||||
make_terminal()
|
||||
update_nightshift_auth_requirement()
|
||||
|
||||
else
|
||||
area = A
|
||||
opened = APC_COVER_OPENED
|
||||
operating = FALSE
|
||||
name = "\improper [A.name] APC"
|
||||
stat |= MAINT
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
GLOB.apcs_list += src
|
||||
|
||||
wires = new /datum/wires/apc(src)
|
||||
@@ -164,9 +194,6 @@
|
||||
src.tdir = dir // to fix Vars bug
|
||||
setDir(SOUTH)
|
||||
|
||||
if(auto_name)
|
||||
name = "\improper [get_area(src)] APC"
|
||||
|
||||
switch(tdir)
|
||||
if(NORTH)
|
||||
pixel_y = 23
|
||||
@@ -176,14 +203,6 @@
|
||||
pixel_x = 24
|
||||
if(WEST)
|
||||
pixel_x = -25
|
||||
if (building)
|
||||
area = get_area(src)
|
||||
opened = APC_COVER_OPENED
|
||||
operating = FALSE
|
||||
name = "[area.name] APC"
|
||||
stat |= MAINT
|
||||
src.update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
/obj/machinery/power/apc/Destroy()
|
||||
GLOB.apcs_list -= src
|
||||
@@ -217,33 +236,6 @@
|
||||
terminal.setDir(tdir)
|
||||
terminal.master = src
|
||||
|
||||
/obj/machinery/power/apc/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
return
|
||||
has_electronics = APC_ELECTRONICS_SECURED
|
||||
// is starting with a power cell installed, create it and set its charge level
|
||||
if(cell_type)
|
||||
cell = new cell_type
|
||||
cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
|
||||
|
||||
var/area/A = src.loc.loc
|
||||
|
||||
//if area isn't specified use current
|
||||
if(areastring)
|
||||
src.area = get_area_instance_from_text(areastring)
|
||||
if(!src.area)
|
||||
src.area = A
|
||||
stack_trace("Bad areastring path for [src], [src.areastring]")
|
||||
else if(isarea(A) && src.areastring == null)
|
||||
src.area = A
|
||||
update_icon()
|
||||
|
||||
make_terminal()
|
||||
update_nightshift_auth_requirement()
|
||||
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
/obj/machinery/power/apc/examine(mob/user)
|
||||
. = ..()
|
||||
if(stat & BROKEN)
|
||||
@@ -1432,7 +1424,7 @@
|
||||
return
|
||||
for(var/A in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/I = A
|
||||
if(get_area(I) == area)
|
||||
if(get_base_area(I) == area)
|
||||
return
|
||||
|
||||
failure_timer = max(failure_timer, round(duration))
|
||||
|
||||
@@ -193,9 +193,9 @@
|
||||
var/on = FALSE // 1 if on, 0 if off
|
||||
var/on_gs = FALSE
|
||||
var/static_power_used = 0
|
||||
var/brightness = 8 // luminosity when on, also used in power calculation
|
||||
var/brightness = 11 // luminosity when on, also used in power calculation
|
||||
var/bulb_power = 0.75 // basically the alpha of the emitted light source
|
||||
var/bulb_colour = "#FFEEDD" // befault colour of the light.
|
||||
var/bulb_colour = "#FFF6ED" // befault colour of the light.
|
||||
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
|
||||
var/flickering = FALSE
|
||||
var/light_type = /obj/item/light/tube // the type of light item
|
||||
@@ -231,7 +231,7 @@
|
||||
icon_state = "bulb"
|
||||
base_state = "bulb"
|
||||
fitting = "bulb"
|
||||
brightness = 4
|
||||
brightness = 6
|
||||
bulb_colour = "#FFDDBB"
|
||||
desc = "A small lighting fixture."
|
||||
light_type = /obj/item/light/bulb
|
||||
@@ -272,11 +272,11 @@
|
||||
spawn(2)
|
||||
switch(fitting)
|
||||
if("tube")
|
||||
brightness = 8
|
||||
brightness = 11
|
||||
if(prob(2))
|
||||
break_light_tube(1)
|
||||
if("bulb")
|
||||
brightness = 4
|
||||
brightness = 6
|
||||
if(prob(5))
|
||||
break_light_tube(1)
|
||||
spawn(1)
|
||||
@@ -294,7 +294,7 @@
|
||||
cut_overlays()
|
||||
switch(status) // set icon_states
|
||||
if(LIGHT_OK)
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(emergency_mode || (A && A.fire))
|
||||
icon_state = "[base_state]_emergency"
|
||||
else
|
||||
@@ -323,7 +323,7 @@
|
||||
var/CO = bulb_colour
|
||||
if(color)
|
||||
CO = color
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if (A && A.fire)
|
||||
CO = bulb_emergency_colour
|
||||
else if (nightshift_enabled)
|
||||
@@ -351,11 +351,11 @@
|
||||
set_light(0)
|
||||
update_icon()
|
||||
|
||||
active_power_usage = (brightness * 10)
|
||||
active_power_usage = (brightness * 7.2)
|
||||
if(on != on_gs)
|
||||
on_gs = on
|
||||
if(on)
|
||||
static_power_used = brightness * 20 //20W per unit luminosity
|
||||
static_power_used = brightness * 14.4 //20W per unit luminosity
|
||||
addStaticPower(static_power_used, STATIC_LIGHT)
|
||||
else
|
||||
removeStaticPower(static_power_used, STATIC_LIGHT)
|
||||
@@ -738,7 +738,7 @@
|
||||
icon_state = "ltube"
|
||||
base_state = "ltube"
|
||||
item_state = "c_tube"
|
||||
brightness = 8
|
||||
brightness = 11
|
||||
|
||||
/obj/item/light/tube/broken
|
||||
status = LIGHT_BROKEN
|
||||
@@ -751,7 +751,7 @@
|
||||
item_state = "contvapour"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
brightness = 4
|
||||
brightness = 6
|
||||
|
||||
/obj/item/light/bulb/broken
|
||||
status = LIGHT_BROKEN
|
||||
@@ -820,7 +820,7 @@
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
base_state = "floor" // base description and icon_state
|
||||
icon_state = "floor"
|
||||
brightness = 4
|
||||
brightness = 6
|
||||
layer = 2.5
|
||||
light_type = /obj/item/light/bulb
|
||||
fitting = "bulb"
|
||||
|
||||
@@ -382,6 +382,7 @@
|
||||
return null
|
||||
|
||||
/area/proc/get_apc()
|
||||
var/target = base_area ? base_area : src
|
||||
for(var/obj/machinery/power/apc/APC in GLOB.apcs_list)
|
||||
if(APC.area == src)
|
||||
if(APC.area == target)
|
||||
return APC
|
||||
@@ -96,15 +96,20 @@
|
||||
"Gold Trim" = "detective_gold",
|
||||
"The Peacemaker" = "detective_peacemaker"
|
||||
)
|
||||
var/list/safe_calibers
|
||||
|
||||
/obj/item/gun/ballistic/revolver/detective/Initialize()
|
||||
. = ..()
|
||||
safe_calibers = magazine.caliber
|
||||
|
||||
/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
|
||||
if(magazine.caliber != initial(magazine.caliber))
|
||||
if(chambered && !(chambered.caliber in safe_calibers))
|
||||
if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
to_chat(user, "<span class='userdanger'>[src] blows up in your face!</span>")
|
||||
user.take_bodypart_damage(0,20)
|
||||
user.dropItemToGround(src)
|
||||
return 0
|
||||
return FALSE
|
||||
..()
|
||||
|
||||
/obj/item/gun/ballistic/revolver/detective/screwdriver_act(mob/living/user, obj/item/I)
|
||||
|
||||
@@ -374,14 +374,18 @@
|
||||
desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use."
|
||||
modifier = 2.5
|
||||
minebot_upgrade = FALSE
|
||||
var/decreased
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
KA.overheat_time -= modifier
|
||||
var/old = KA.overheat_time
|
||||
KA.overheat_time = max(0, KA.overheat_time - modifier)
|
||||
decreased = old - KA.overheat_time
|
||||
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/gun/energy/kinetic_accelerator/KA)
|
||||
KA.overheat_time += modifier
|
||||
KA.overheat_time += decreased
|
||||
..()
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/minebot
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
|
||||
return master
|
||||
|
||||
/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
|
||||
/datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier = 1, preserve_data = 1, no_react = 0, log = FALSE)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
|
||||
var/list/cached_reagents = reagent_list
|
||||
if(!target || !total_volume)
|
||||
return
|
||||
@@ -188,17 +188,23 @@
|
||||
amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
|
||||
var/part = amount / src.total_volume
|
||||
var/trans_data = null
|
||||
var/list/transferred = list()
|
||||
for(var/reagent in cached_reagents)
|
||||
var/datum/reagent/T = reagent
|
||||
var/transfer_amount = T.volume * part
|
||||
if(preserve_data)
|
||||
trans_data = copy_data(T)
|
||||
|
||||
transferred += "[T] - [transfer_amount]"
|
||||
|
||||
R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE, ignore_pH = TRUE) //we only handle reaction after every reagent has been transfered.
|
||||
|
||||
remove_reagent(T.type, transfer_amount, ignore_pH = TRUE)
|
||||
|
||||
if(log && amount > 0)
|
||||
var/atom/us = my_atom
|
||||
var/atom/them = R.my_atom
|
||||
var/location_string = "FROM [(us && "[us] ([REF(us)]) [COORD(us)]") || "NULL"] TO [(them && "[them] ([REF(them)]) [COORD(them)]") || "NULL"]"
|
||||
log_reagent_transfer("[location_string] - [key_name(usr)][istext(log) ? " - [log]" : ""]: trans_to with arguments [target] [amount] [multiplier] [preserve_data] [no_react] and reagents [english_list(transferred)]")
|
||||
|
||||
update_total()
|
||||
R.update_total()
|
||||
if(!no_react)
|
||||
@@ -237,7 +243,7 @@
|
||||
src.handle_reactions()
|
||||
return amount
|
||||
|
||||
/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
|
||||
/datum/reagents/proc/trans_id_to(obj/target, reagent, amount = 1, preserve_data = TRUE, log = FALSE)//Not sure why this proc didn't exist before. It does now! /N
|
||||
var/list/cached_reagents = reagent_list
|
||||
if (!target)
|
||||
return
|
||||
@@ -257,8 +263,12 @@
|
||||
if(preserve_data)
|
||||
trans_data = current_reagent.data
|
||||
R.add_reagent(current_reagent.type, amount, trans_data, chem_temp, current_reagent.purity, pH, no_react = TRUE)
|
||||
|
||||
remove_reagent(current_reagent.type, amount, 1)
|
||||
if(log && amount > 0)
|
||||
var/atom/us = my_atom
|
||||
var/atom/them = R.my_atom
|
||||
var/location_string = "FROM [(us && "[us] ([REF(us)]) [COORD(us)]") || "NULL"] TO [(them && "[them] ([REF(them)]) [COORD(them)]") || "NULL"]"
|
||||
log_reagent_transfer("[location_string] - [key_name(usr)][istext(log) ? " - [log]" : ""]: trans_id_to with arguments [target] [reagent] [amount] [preserve_data]")
|
||||
break
|
||||
|
||||
src.update_total()
|
||||
|
||||
@@ -148,8 +148,8 @@
|
||||
|
||||
/obj/machinery/chem_master/on_deconstruction()
|
||||
var/atom/A = drop_location()
|
||||
beaker.forceMove(A)
|
||||
bottle.forceMove(A)
|
||||
beaker?.forceMove(A)
|
||||
bottle?.forceMove(A)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
|
||||
@@ -887,7 +887,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M)
|
||||
if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes.
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.shoes)
|
||||
if(!H.shoes || !(H.shoes.body_parts_covered & FEET))
|
||||
H.adjustBruteLoss(-3, 0)
|
||||
. = 1
|
||||
return ..() || .
|
||||
|
||||
@@ -153,20 +153,37 @@
|
||||
color = "#669900" // rgb: 102, 153, 0
|
||||
toxpwr = 0.5
|
||||
taste_description = "death"
|
||||
var/fakedeath_active = FALSE
|
||||
pH = 13
|
||||
|
||||
/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
L.fakedeath(type)
|
||||
ADD_TRAIT(L, TRAIT_FAKEDEATH, type)
|
||||
|
||||
/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/L)
|
||||
L.cure_fakedeath(type)
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustOxyLoss(0.5*REM, 0)
|
||||
/datum/reagent/toxin/zombiepowder/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
|
||||
L.adjustOxyLoss(0.5*REM, 0)
|
||||
if(method == INGEST)
|
||||
fakedeath_active = TRUE
|
||||
L.fakedeath(type)
|
||||
|
||||
/datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/M)
|
||||
..()
|
||||
. = 1
|
||||
if(fakedeath_active)
|
||||
return TRUE
|
||||
switch(current_cycle)
|
||||
if(1 to 5)
|
||||
M.confused += 1
|
||||
M.drowsyness += 1
|
||||
M.slurring += 3
|
||||
if(5 to 8)
|
||||
M.adjustStaminaLoss(40, 0)
|
||||
if(9 to INFINITY)
|
||||
fakedeath_active = TRUE
|
||||
M.fakedeath(type)
|
||||
|
||||
/datum/reagent/toxin/ghoulpowder
|
||||
name = "Ghoul Powder"
|
||||
|
||||
@@ -70,6 +70,14 @@
|
||||
required_other = TRUE
|
||||
required_container = /obj/item/slime_extract/green
|
||||
|
||||
/datum/chemical_reaction/slime/slimemammal
|
||||
name = "Mammal Mutation Toxin"
|
||||
id = /datum/reagent/mutationtoxin/mammal
|
||||
results = list(/datum/reagent/mutationtoxin/mammal = 1)
|
||||
required_reagents = list(/datum/reagent/water = 1)
|
||||
required_other = TRUE
|
||||
required_container = /obj/item/slime_extract/green
|
||||
|
||||
//Metal
|
||||
/datum/chemical_reaction/slime/slimemetal
|
||||
name = "Slime Metal"
|
||||
@@ -565,9 +573,16 @@
|
||||
required_other = TRUE
|
||||
|
||||
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder)
|
||||
sleep(50)
|
||||
var/obj/item/slime_extract/sepia/extract = holder.my_atom
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
var/list/M = list(get_mob_by_key(holder.my_atom.fingerprintslast))
|
||||
new /obj/effect/timestop(T, null, null, M)
|
||||
new /obj/effect/timestop(T, null, null, null)
|
||||
if(istype(extract))
|
||||
if(extract.Uses > 0)
|
||||
var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast)
|
||||
if(lastheld && !lastheld.equip_to_slot_if_possible(extract, SLOT_HANDS, disable_warning = TRUE))
|
||||
extract.forceMove(get_turf(lastheld))
|
||||
|
||||
..()
|
||||
|
||||
/datum/chemical_reaction/slime/slimecamera
|
||||
|
||||
@@ -186,6 +186,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related
|
||||
var/datum/chemical_reaction/recipe = get_chemical_reaction(recipe_id)
|
||||
if(!recipe)
|
||||
info = "This recipe is illegible."
|
||||
return
|
||||
var/list/dat = list("<ul>")
|
||||
for(var/rid in recipe.required_reagents)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[rid]
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define PH_WEAK (1 << 0)
|
||||
#define TEMP_WEAK (1 << 1)
|
||||
|
||||
/obj/item/reagent_containers
|
||||
name = "Container"
|
||||
desc = "..."
|
||||
@@ -9,14 +6,13 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/amount_per_transfer_from_this = 5
|
||||
var/list/possible_transfer_amounts = list(5,10,15,20,25,30)
|
||||
var/APTFT_altclick = TRUE //will the set amount_per_transfer_from_this proc be called on AltClick() ?
|
||||
var/volume = 30
|
||||
var/reagent_flags
|
||||
var/reagent_flags //used to determine the reagent holder flags on add_initial_reagents()
|
||||
var/list/list_reagents = null
|
||||
var/spawned_disease = null
|
||||
var/disease_amount = 20
|
||||
var/spillable = FALSE
|
||||
var/beaker_weakness_bitflag = NONE//Bitflag!
|
||||
var/container_flags = APTFT_ALTCLICK|APTFT_VERB //the container item flags
|
||||
var/container_HP = 2
|
||||
var/cached_icon
|
||||
|
||||
@@ -24,7 +20,7 @@
|
||||
. = ..()
|
||||
if(isnum(vol) && vol > 0)
|
||||
volume = vol
|
||||
if(length(possible_transfer_amounts))
|
||||
if(container_flags & APTFT_VERB && length(possible_transfer_amounts))
|
||||
verbs += /obj/item/reagent_containers/proc/set_APTFT
|
||||
create_reagents(volume, reagent_flags)
|
||||
if(spawned_disease)
|
||||
@@ -37,12 +33,12 @@
|
||||
. = ..()
|
||||
if(length(possible_transfer_amounts) > 1)
|
||||
. += "Currently transferring [amount_per_transfer_from_this] units per use."
|
||||
if(APTFT_altclick && user.Adjacent(src))
|
||||
if(container_flags & APTFT_ALTCLICK && user.Adjacent(src))
|
||||
. += "<span class='notice'>Alt-click it to set its transfer amount.</span>"
|
||||
|
||||
/obj/item/reagent_containers/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(APTFT_altclick && length(possible_transfer_amounts) > 1 && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
|
||||
if(container_flags & APTFT_ALTCLICK && length(possible_transfer_amounts) > 1 && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
|
||||
set_APTFT()
|
||||
return TRUE
|
||||
|
||||
@@ -108,10 +104,12 @@
|
||||
|
||||
/obj/item/reagent_containers/proc/bartender_check(atom/target)
|
||||
. = FALSE
|
||||
if(target.CanPass(src, get_turf(src)) && thrownby && thrownby.actions)
|
||||
for(var/datum/action/innate/drink_fling/D in thrownby.actions)
|
||||
if(D.active)
|
||||
return TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T || target.CanPass(src, T) || !thrownby || !thrownby.actions)
|
||||
return
|
||||
for(var/datum/action/innate/drink_fling/D in thrownby.actions)
|
||||
if(D.active)
|
||||
return TRUE
|
||||
|
||||
/obj/item/reagent_containers/proc/ForceResetRotation()
|
||||
transform = initial(transform)
|
||||
@@ -155,7 +153,7 @@
|
||||
//melts plastic beakers
|
||||
/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M)
|
||||
reagents.expose_temperature(1000)
|
||||
if(beaker_weakness_bitflag & TEMP_WEAK)
|
||||
if(container_flags & TEMP_WEAK)
|
||||
var/list/seen = viewers(5, get_turf(src))
|
||||
var/iconhtml = icon2html(src, seen)
|
||||
for(var/mob/H in seen)
|
||||
@@ -170,13 +168,13 @@
|
||||
temp_check()
|
||||
|
||||
/obj/item/reagent_containers/proc/temp_check()
|
||||
if(beaker_weakness_bitflag & TEMP_WEAK)
|
||||
if(container_flags & TEMP_WEAK)
|
||||
if(reagents.chem_temp >= 444)//assuming polypropylene
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
//melts glass beakers
|
||||
/obj/item/reagent_containers/proc/pH_check()
|
||||
if(beaker_weakness_bitflag & PH_WEAK)
|
||||
if(container_flags & PH_WEAK)
|
||||
if((reagents.pH < 1.5) || (reagents.pH > 12.5))
|
||||
START_PROCESSING(SSobj, src)
|
||||
else if((reagents.pH < -3) || (reagents.pH > 17))
|
||||
@@ -190,7 +188,7 @@
|
||||
cached_icon = icon_state
|
||||
var/damage
|
||||
var/cause
|
||||
if(beaker_weakness_bitflag & PH_WEAK)
|
||||
if(container_flags & PH_WEAK)
|
||||
if(reagents.pH < 2)
|
||||
damage = (2 - reagents.pH)/20
|
||||
cause = "from the extreme pH"
|
||||
@@ -201,7 +199,7 @@
|
||||
cause = "from the extreme pH"
|
||||
playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1)
|
||||
|
||||
if(beaker_weakness_bitflag & TEMP_WEAK)
|
||||
if(container_flags & TEMP_WEAK)
|
||||
if(reagents.chem_temp >= 444)
|
||||
if(damage)
|
||||
damage += (reagents.chem_temp/444)/5
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
resistance_flags = ACID_PROOF
|
||||
container_HP = 2
|
||||
|
||||
|
||||
/obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target)
|
||||
if(!canconsume(M, user))
|
||||
return
|
||||
@@ -22,13 +21,9 @@
|
||||
|
||||
if(istype(M))
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
var/R
|
||||
M.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [M]!</span>", \
|
||||
"<span class='userdanger'>[user] splashes the contents of [src] onto [M]!</span>")
|
||||
if(reagents)
|
||||
for(var/datum/reagent/A in reagents.reagent_list)
|
||||
R += A.type + " ("
|
||||
R += num2text(A.volume) + "),"
|
||||
var/R = reagents?.log_list()
|
||||
if(isturf(target) && reagents.reagent_list.len && thrownby)
|
||||
log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]")
|
||||
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].")
|
||||
@@ -36,7 +31,8 @@
|
||||
log_combat(user, M, "splashed", R)
|
||||
reagents.clear_reagents()
|
||||
else
|
||||
if(M != user)
|
||||
var/self_fed = M == user
|
||||
if(!self_fed)
|
||||
M.visible_message("<span class='danger'>[user] attempts to feed something to [M].</span>", \
|
||||
"<span class='userdanger'>[user] attempts to feed something to you.</span>")
|
||||
if(!do_mob(user, M))
|
||||
@@ -49,7 +45,7 @@
|
||||
to_chat(user, "<span class='notice'>You swallow a gulp of [src].</span>")
|
||||
var/fraction = min(5/reagents.total_volume, 1)
|
||||
reagents.reaction(M, INGEST, fraction)
|
||||
addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
|
||||
addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5, null, null, null, self_fed? "self swallowed" : "fed by [user]"), 5)
|
||||
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
|
||||
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
|
||||
@@ -66,7 +62,7 @@
|
||||
to_chat(user, "<span class='warning'>[target] is full.</span>")
|
||||
return
|
||||
|
||||
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
|
||||
var/trans = reagents.trans_to(target, amount_per_transfer_from_this, log = "reagentcontainer-glass afterattack transfer to")
|
||||
to_chat(user, "<span class='notice'>You transfer [trans] unit\s of the solution to [target].</span>")
|
||||
|
||||
else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us.
|
||||
@@ -78,7 +74,7 @@
|
||||
to_chat(user, "<span class='warning'>[src] is full.</span>")
|
||||
return
|
||||
|
||||
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
|
||||
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, log = "reagentcontainer-glass afterattack fill from")
|
||||
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [target].</span>")
|
||||
|
||||
else if(reagents.total_volume)
|
||||
@@ -101,12 +97,11 @@
|
||||
to_chat(user, "<span class='notice'>[src] is full.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You break [E] in [src].</span>")
|
||||
E.reagents.trans_to(src, E.reagents.total_volume)
|
||||
E.reagents.trans_to(src, E.reagents.total_volume, log = "reagentcontainer-glass break egg in")
|
||||
qdel(E)
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker
|
||||
name = "beaker"
|
||||
desc = "A beaker. It can hold up to 60 units. Unable to withstand extreme pHes."
|
||||
@@ -116,7 +111,7 @@
|
||||
item_state = "beaker"
|
||||
materials = list(MAT_GLASS=500)
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,50,60)
|
||||
beaker_weakness_bitflag = PH_WEAK
|
||||
container_flags = PH_WEAK|APTFT_ALTCLICK|APTFT_VERB
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/Initialize()
|
||||
. = ..()
|
||||
@@ -159,8 +154,37 @@
|
||||
/obj/item/reagent_containers/glass/beaker/jar
|
||||
name = "honey jar"
|
||||
desc = "A jar for honey. It can hold up to 60 units of sweet delight. Unable to withstand reagents of an extreme pH."
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "vapour"
|
||||
icon_state = "honey"
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/glass_dish
|
||||
name = "glass dish"
|
||||
desc = "A tiny glass dish. It can hold up to 3 units. Unable to withstand reagents of an extreme pH."
|
||||
materials = list(MAT_GLASS=500)
|
||||
icon_state = "glass_disk"
|
||||
possible_transfer_amounts = list(0.1,0.5,0.75,1,2,3)
|
||||
volume = 3
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/flask/large
|
||||
name = "large flask"
|
||||
desc = "A large flask. It can hold up to 80 units. Unable to withstand reagents of an extreme pH."
|
||||
materials = list(MAT_GLASS=2500)
|
||||
icon_state = "flasklarge"
|
||||
volume = 80
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/flask
|
||||
name = "small flask"
|
||||
desc = "A small flask. It can hold up to 40 units. Unable to withstand reagents of an extreme pH."
|
||||
materials = list(MAT_GLASS=1000)
|
||||
icon_state = "flasksmall"
|
||||
volume = 40
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/flask/spouty
|
||||
name = "flask with spout"
|
||||
desc = "A flask with a spout! It can hold up to 120 units. Unable to withstand reagents of an extreme pH."
|
||||
materials = list(MAT_GLASS=2500)
|
||||
icon_state = "flaskspouty"
|
||||
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30,50,100,120)
|
||||
volume = 120
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/large
|
||||
name = "large beaker"
|
||||
@@ -180,11 +204,7 @@
|
||||
volume = 180
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,40,50,60,120,180)
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/plastic/Initialize()
|
||||
beaker_weakness_bitflag &= ~PH_WEAK
|
||||
beaker_weakness_bitflag |= TEMP_WEAK
|
||||
. = ..()
|
||||
container_flags = TEMP_WEAK|APTFT_ALTCLICK|APTFT_VERB
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/plastic/update_icon()
|
||||
icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states
|
||||
@@ -199,10 +219,7 @@
|
||||
volume = 240
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,40,50,60,120,200,240)
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/meta/Initialize() // why the fuck can't you just set the beaker weakness bitflags to nothing? fuck you
|
||||
beaker_weakness_bitflag &= ~PH_WEAK
|
||||
. = ..()
|
||||
container_flags = APTFT_ALTCLICK|APTFT_VERB
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/noreact
|
||||
name = "cryostasis beaker"
|
||||
@@ -213,13 +230,9 @@
|
||||
reagent_flags = OPENCONTAINER | NO_REACT
|
||||
volume = 50
|
||||
amount_per_transfer_from_this = 10
|
||||
container_flags = APTFT_ALTCLICK|APTFT_VERB
|
||||
container_HP = 10//shouldn't be needed
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/noreact/Initialize()
|
||||
beaker_weakness_bitflag &= ~PH_WEAK
|
||||
. = ..()
|
||||
//reagents.set_reacting(FALSE) was this removed in a recent pr?
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/bluespace
|
||||
name = "bluespace beaker"
|
||||
desc = "A bluespace beaker, powered by experimental bluespace technology \
|
||||
@@ -287,18 +300,15 @@
|
||||
SLOT_L_STORE, SLOT_R_STORE,\
|
||||
SLOT_GENERC_DEXTROUS_STORAGE
|
||||
)
|
||||
container_flags = APTFT_ALTCLICK|APTFT_VERB
|
||||
container_HP = 1
|
||||
|
||||
/obj/item/reagent_containers/glass/bucket/Initialize()
|
||||
beaker_weakness_bitflag |= TEMP_WEAK
|
||||
. = ..()
|
||||
|
||||
/obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params)
|
||||
if(istype(O, /obj/item/mop))
|
||||
if(reagents.total_volume < 1)
|
||||
to_chat(user, "<span class='warning'>[src] is out of water!</span>")
|
||||
else
|
||||
reagents.trans_to(O, 5)
|
||||
reagents.trans_to(O, 5, log = "reagentcontainer-bucket fill mop")
|
||||
to_chat(user, "<span class='notice'>You wet [O] in [src].</span>")
|
||||
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
|
||||
else if(isprox(O))
|
||||
@@ -342,12 +352,9 @@
|
||||
volume = 50
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,50)
|
||||
container_flags = TEMP_WEAK|APTFT_ALTCLICK|APTFT_VERB
|
||||
container_HP = 1
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/waterbottle/Initialize()
|
||||
beaker_weakness_bitflag |= TEMP_WEAK
|
||||
. = ..()
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/waterbottle/empty
|
||||
list_reagents = list()
|
||||
|
||||
|
||||
@@ -362,30 +362,14 @@
|
||||
return
|
||||
|
||||
/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity)
|
||||
if(!vial)
|
||||
if(!vial || !proximity || !isliving(target))
|
||||
return
|
||||
var/mob/living/L = target
|
||||
|
||||
if(!L.reagents || !L.can_inject(user, TRUE, user.zone_selected, penetrates))
|
||||
return
|
||||
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
if(!ismob(target))
|
||||
return
|
||||
|
||||
var/mob/living/L
|
||||
if(isliving(target))
|
||||
L = target
|
||||
if(!penetrates && !L.can_inject(user, 1)) //This check appears another four times, since otherwise the penetrating sprays will break in do_mob.
|
||||
return
|
||||
|
||||
if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles
|
||||
to_chat(user, "<span class='warning'>You cannot directly fill [target]!</span>")
|
||||
return
|
||||
|
||||
if(target.reagents.total_volume >= target.reagents.maximum_volume)
|
||||
to_chat(user, "<span class='notice'>[target] is full.</span>")
|
||||
return
|
||||
|
||||
if(ishuman(L))
|
||||
if(iscarbon(L))
|
||||
var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected))
|
||||
if(!affecting)
|
||||
to_chat(user, "<span class='warning'>The limb is missing!</span>")
|
||||
@@ -394,84 +378,40 @@
|
||||
to_chat(user, "<span class='notice'>Medicine won't work on a robotic limb!</span>")
|
||||
return
|
||||
|
||||
//Always log attemped injections for admins
|
||||
var/contained = vial.reagents.log_list()
|
||||
log_combat(user, L, "attemped to inject", src, addition="which had [contained]")
|
||||
//Always log attemped injections for admins
|
||||
if(vial != null)
|
||||
switch(mode)
|
||||
if(HYPO_INJECT)
|
||||
if(L) //living mob
|
||||
if(L != user)
|
||||
L.visible_message("<span class='danger'>[user] is trying to inject [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to inject [L] with [src]!</span>")
|
||||
if(!do_mob(user, L, inject_wait))
|
||||
return
|
||||
if(!penetrates && !L.can_inject(user, 1))
|
||||
return
|
||||
if(!vial.reagents.total_volume)
|
||||
return
|
||||
if(L.reagents.total_volume >= L.reagents.maximum_volume)
|
||||
return
|
||||
L.visible_message("<span class='danger'>[user] uses the [src] on [L]!</span>", \
|
||||
"<span class='userdanger'>[user] uses the [src] on [L]!</span>")
|
||||
else
|
||||
if(!do_mob(user, L, inject_self))
|
||||
return
|
||||
if(!penetrates && !L.can_inject(user, 1))
|
||||
return
|
||||
if(!vial.reagents.total_volume)
|
||||
return
|
||||
if(L.reagents.total_volume >= L.reagents.maximum_volume)
|
||||
return
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])</font>")
|
||||
L.log_message("<font color='orange'>applied [src] to themselves ([contained]).</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
|
||||
var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1)
|
||||
vial.reagents.reaction(L, INJECT, fraction)
|
||||
vial.reagents.trans_to(target, vial.amount_per_transfer_from_this)
|
||||
if(vial.amount_per_transfer_from_this >= 15)
|
||||
playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
|
||||
if(vial.amount_per_transfer_from_this < 15)
|
||||
playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
|
||||
to_chat(user, "<span class='notice'>You inject [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.</span>")
|
||||
|
||||
if(HYPO_SPRAY)
|
||||
if(L) //living mob
|
||||
if(L != user)
|
||||
L.visible_message("<span class='danger'>[user] is trying to spray [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to spray [L] with [src]!</span>")
|
||||
if(!do_mob(user, L, spray_wait))
|
||||
return
|
||||
if(!penetrates && !L.can_inject(user, 1))
|
||||
return
|
||||
if(!vial.reagents.total_volume)
|
||||
return
|
||||
if(L.reagents.total_volume >= L.reagents.maximum_volume)
|
||||
return
|
||||
L.visible_message("<span class='danger'>[user] uses the [src] on [L]!</span>", \
|
||||
"<span class='userdanger'>[user] uses the [src] on [L]!</span>")
|
||||
else
|
||||
if(!do_mob(user, L, spray_self))
|
||||
return
|
||||
if(!penetrates && !L.can_inject(user, 1))
|
||||
return
|
||||
if(!vial.reagents.total_volume)
|
||||
return
|
||||
if(L.reagents.total_volume >= L.reagents.maximum_volume)
|
||||
return
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])</font>")
|
||||
L.log_message("<font color='orange'>applied [src] to themselves ([contained]).</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1)
|
||||
vial.reagents.reaction(L, PATCH, fraction)
|
||||
vial.reagents.trans_to(target, vial.amount_per_transfer_from_this)
|
||||
if(vial.amount_per_transfer_from_this >= 15)
|
||||
playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
|
||||
if(vial.amount_per_transfer_from_this < 15)
|
||||
playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
|
||||
to_chat(user, "<span class='notice'>You spray [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] doesn't work here!</span>")
|
||||
if(!vial)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't have any vial installed!</span>")
|
||||
return
|
||||
if(!vial.reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>[src]'s vial is empty!</span>")
|
||||
return
|
||||
|
||||
var/fp_verb = mode == HYPO_SPRAY ? "spray" : "inject"
|
||||
var/method = mode == HYPO_SPRAY ? TOUCH : INJECT
|
||||
|
||||
if(L != user)
|
||||
L.visible_message("<span class='danger'>[user] is trying to [fp_verb] [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to [fp_verb] you with [src]!</span>")
|
||||
if(!do_mob(user, L, inject_wait, extra_checks = CALLBACK(L, /mob/living/proc/can_inject, user, FALSE, user.zone_selected, penetrates)))
|
||||
return
|
||||
if(!vial.reagents.total_volume)
|
||||
return
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [mode])</font>")
|
||||
if(L != user)
|
||||
L.visible_message("<span class='danger'>[user] uses the [src] on [L]!</span>", \
|
||||
"<span class='userdanger'>[user] uses the [src] on you!</span>")
|
||||
else
|
||||
L.log_message("<font color='orange'>applied [src] to themselves ([contained]).</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
|
||||
var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1)
|
||||
vial.reagents.reaction(L, method, fraction)
|
||||
vial.reagents.trans_to(target, vial.amount_per_transfer_from_this)
|
||||
var/long_sound = vial.amount_per_transfer_from_this >= 15
|
||||
playsound(loc, long_sound ? 'sound/items/hypospray_long.ogg' : pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
|
||||
to_chat(user, "<span class='notice'>You [fp_verb] [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.</span>")
|
||||
|
||||
/obj/item/hypospray/mkii/attack_self(mob/living/user)
|
||||
if(user)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
spillable = FALSE
|
||||
volume = 10
|
||||
possible_transfer_amounts = list(1,2,5,10)
|
||||
APTFT_altclick = FALSE
|
||||
container_flags = APTFT_VERB
|
||||
obj_flags = UNIQUE_RENAME
|
||||
unique_reskin = list("hypovial" = "hypovial",
|
||||
"red hypovial" = "hypovial-b",
|
||||
@@ -25,9 +25,6 @@
|
||||
if(!icon_state)
|
||||
icon_state = "hypovial"
|
||||
update_icon()
|
||||
// beaker_weakness_bitflag |= PH_WEAK // fuck you if you're using these like beakers
|
||||
// beaker_weakness_bitflag |= TEMP_WEAK
|
||||
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/vial/on_reagent_change()
|
||||
update_icon()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
reagent_flags = REFILLABLE | DRAINABLE
|
||||
amount_per_transfer_from_this = 5
|
||||
possible_transfer_amounts = list()
|
||||
APTFT_altclick = FALSE
|
||||
container_flags = APTFT_VERB
|
||||
volume = 5
|
||||
spillable = FALSE
|
||||
var/wipe_sound
|
||||
@@ -118,6 +118,7 @@
|
||||
item_flags = NOBLUDGEON | NO_UNIFORM_REQUIRED //so it can be worn on the belt slot even with no uniform.
|
||||
force = 1
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
mutantrace_variation = STYLE_DIGITIGRADE
|
||||
attack_verb = list("whipped")
|
||||
hitsound = 'sound/items/towelwhip.ogg'
|
||||
volume = 10
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
amount_per_transfer_from_this = 5
|
||||
volume = 250
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
|
||||
container_flags = NONE //APTFT is alternated between the initial value and stream_amount and shouldn't be exploited.
|
||||
|
||||
/obj/item/reagent_containers/spray/afterattack(atom/A, mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -151,77 +151,76 @@
|
||||
name = "Export Design (Wine)"
|
||||
desc = "Allows for the blowing, and bottling of Wine bottles."
|
||||
id = "wine_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/wine = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/wine = 50)
|
||||
build_path = /obj/item/export/bottle/wine
|
||||
|
||||
/datum/design/bottle/export/rum
|
||||
name = "Export Design (Rum)"
|
||||
desc = "Allows for the blowing, and bottling of Rum bottles."
|
||||
id = "rum_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/rum = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/rum = 50)
|
||||
build_path = /obj/item/export/bottle/rum
|
||||
|
||||
/datum/design/bottle/export/gin
|
||||
name = "Export Design (Gin)"
|
||||
desc = "Allows for the blowing, and bottling of Gin bottles."
|
||||
id = "gin_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/gin = 100)
|
||||
build_path = /obj/item/export/bottle/gin
|
||||
|
||||
/datum/design/bottle/export/whiskey
|
||||
name = "Export Design (Whiskey)"
|
||||
desc = "Allows for the blowing, and bottling of Whiskey bottles."
|
||||
id = "whiskey_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/whiskey = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/whiskey = 50)
|
||||
build_path = /obj/item/export/bottle/whiskey
|
||||
|
||||
/datum/design/bottle/export/vodka
|
||||
name = "Export Design (Vodka)"
|
||||
desc = "Allows for the blowing, and bottling of 99% Vodka bottles."
|
||||
id = "vodka_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/vodka = 99, /datum/reagent/water = 1)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/vodka = 45, /datum/reagent/water = 1)
|
||||
build_path = /obj/item/export/bottle/vodka
|
||||
|
||||
/datum/design/bottle/export/tequila
|
||||
name = "Export Design (Tequila)"
|
||||
desc = "Allows for the blowing, and bottling of Tequila bottles."
|
||||
id = "tequila_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/tequila = 80, /datum/reagent/consumable/lemonjuice = 20)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/tequila = 40, /datum/reagent/consumable/lemonjuice = 10)
|
||||
build_path = /obj/item/export/bottle/tequila
|
||||
|
||||
/datum/design/bottle/export/patron
|
||||
name = "Export Design (Patron)"
|
||||
desc = "Allows for the blowing, and bottling of Patron bottles."
|
||||
id = "patron_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/patron = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/patron = 50)
|
||||
build_path = /obj/item/export/bottle/patron
|
||||
|
||||
/datum/design/bottle/export/kahlua
|
||||
name = "Export Design (Kahlua)"
|
||||
desc = "Allows for the blowing, and bottling of Kahlua bottles."
|
||||
id = "kahlua_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/kahlua = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/kahlua = 50)
|
||||
build_path = /obj/item/export/bottle/kahlua
|
||||
|
||||
/datum/design/bottle/export/sake
|
||||
name = "Export Design (Sake)"
|
||||
desc = "Allows for the blowing, and bottling of Sake bottles."
|
||||
id = "sake_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/sake = 80, /datum/reagent/consumable/rice = 10, /datum/reagent/consumable/sugar = 10)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/sake = 40, /datum/reagent/consumable/rice = 10, /datum/reagent/consumable/sugar = 10)
|
||||
build_path = /obj/item/export/bottle/sake
|
||||
|
||||
/datum/design/bottle/export/vermouth
|
||||
name = "Export Design (Vermouth)"
|
||||
desc = "Allows for the blowing, and bottling of Vermouth bottles."
|
||||
id = "vermouth_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/vermouth = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/vermouth = 50)
|
||||
build_path = /obj/item/export/bottle/vermouth
|
||||
|
||||
/datum/design/bottle/export/goldschlager
|
||||
name = "Export Design (Goldschlager)"
|
||||
desc = "Allows for the blowing, and bottling of Goldschlager bottles."
|
||||
id = "goldschlager_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/goldschlager = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/goldschlager = 50)
|
||||
build_path = /obj/item/export/bottle/goldschlager
|
||||
|
||||
/datum/design/bottle/export/hcider
|
||||
@@ -235,13 +234,13 @@
|
||||
name = "Export Design (Cognac)"
|
||||
desc = "Allows for the blowing, and bottling of Cognac bottles."
|
||||
id = "cognac_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/cognac = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/cognac = 50)
|
||||
build_path = /obj/item/export/bottle/cognac
|
||||
|
||||
/datum/design/bottle/export/absinthe
|
||||
name = "Export Design (Absinthe)"
|
||||
desc = "Allows for the blowing, and bottling of Absinthe bottles."
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/absinthe = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/absinthe = 50)
|
||||
id = "absinthe_export"
|
||||
build_path = /obj/item/export/bottle/absinthe
|
||||
|
||||
@@ -249,49 +248,49 @@
|
||||
name = "Export Design (Grappa)"
|
||||
desc = "Allows for the blowing, and bottling of Grappa bottles."
|
||||
id = "grappa_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/grappa = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/grappa = 50)
|
||||
build_path = /obj/item/export/bottle/grappa
|
||||
|
||||
/datum/design/bottle/export/fernet
|
||||
name = "Export Design (Fernet)"
|
||||
desc = "Allows for the blowing, and bottling of Fernet bottles."
|
||||
id = "fernet_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/fernet = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/fernet = 50)
|
||||
build_path = /obj/item/export/bottle/fernet
|
||||
|
||||
/datum/design/bottle/export/applejack
|
||||
name = "Export Design (Applejack)"
|
||||
desc = "Allows for the blowing, and bottling of Applejack bottles."
|
||||
id = "applejack_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/applejack = 50, /datum/reagent/consumable/ethanol/gin = 10)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/applejack = 35, /datum/reagent/consumable/ethanol/gin = 10)
|
||||
build_path = /obj/item/export/bottle/applejack
|
||||
|
||||
/datum/design/bottle/export/champagne
|
||||
name = "Export Design (Champagne)"
|
||||
desc = "Allows for the blowing, and bottling of Champagne bottles."
|
||||
id = "champagne_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/champagne = 90, /datum/reagent/carbondioxide = 10)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/champagne = 30, /datum/reagent/carbondioxide = 10)
|
||||
build_path = /obj/item/export/bottle/champagne
|
||||
|
||||
/datum/design/bottle/export/blazaam
|
||||
name = "Export Design (Blazaam)"
|
||||
desc = "Allows for the blowing, and bottling of Blazaam bottles."
|
||||
id = "blazaam_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/blazaam = 80, /datum/reagent/water/holywater = 20)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/blazaam = 40, /datum/reagent/water/holywater = 20)
|
||||
build_path = /obj/item/export/bottle/blazaam
|
||||
|
||||
/datum/design/bottle/export/trappist
|
||||
name = "Export Design (Trappist)"
|
||||
desc = "Allows for the blowing, and bottling of Trappist bottles."
|
||||
id = "trappist_export"
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/trappist = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/trappist = 50)
|
||||
build_path = /obj/item/export/bottle/trappist
|
||||
|
||||
/datum/design/bottle/export/grenadine
|
||||
name = "Export Design (Grenadine)"
|
||||
desc = "Allows for the blowing, and bottling of Grenadine bottles."
|
||||
id = "grenadine_export"
|
||||
reagents_list = list(/datum/reagent/consumable/grenadine = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/grenadine = 50)
|
||||
build_path = /obj/item/export/bottle/grenadine
|
||||
|
||||
/datum/design/bottle/export/minikeg
|
||||
@@ -299,7 +298,7 @@
|
||||
desc = "Allows for the fabication, and bottling of Minikeg of craft beer."
|
||||
id = "minikeg"
|
||||
category = list("Beers")
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/beer/light = 100)
|
||||
reagents_list = list(/datum/reagent/consumable/ethanol/beer/light = 50)
|
||||
build_path = /obj/item/export/bottle/minikeg
|
||||
|
||||
/datum/design/bottle/export/blooddrop
|
||||
@@ -315,7 +314,7 @@
|
||||
desc = "Allows for the blowing, and bottling of Slim Gold bottles."
|
||||
id = "slim_gold"
|
||||
category = list("Beers")
|
||||
reagents_list = list(/datum/reagent/gold = 10, /datum/reagent/carbondioxide = 10, /datum/reagent/consumable/ethanol/rum = 30, /datum/reagent/consumable/ethanol/beer = 40)
|
||||
reagents_list = list(/datum/reagent/gold = 10, /datum/reagent/carbondioxide = 10, /datum/reagent/consumable/ethanol/rum = 15, /datum/reagent/consumable/ethanol/beer = 20)
|
||||
build_path = /obj/item/export/bottle/slim_gold
|
||||
|
||||
/datum/design/bottle/export/white_bloodmoon
|
||||
@@ -323,13 +322,13 @@
|
||||
desc = "Allows for the blowing, and bottling of White Bloodmoon bottles."
|
||||
id = "white_bloodmoon"
|
||||
category = list("Wines")
|
||||
reagents_list = list(/datum/reagent/medicine/synthflesh = 50, /datum/reagent/blood = 50, /datum/reagent/liquidgibs = 10)
|
||||
reagents_list = list(/datum/reagent/medicine/synthflesh = 20, /datum/reagent/blood = 30, /datum/reagent/liquidgibs = 10)
|
||||
build_path = /obj/item/export/bottle/white_bloodmoon
|
||||
|
||||
/datum/design/bottle/export/greenroad
|
||||
name = "Export Design (Greenroad)"
|
||||
desc = "Allows for the blowing, and bottling of Greenroad bottles."
|
||||
id = "greenroad"
|
||||
reagents_list = list(/datum/reagent/consumable/vitfro = 50, /datum/reagent/consumable/ethanol/rum = 50, /datum/reagent/ash = 10)
|
||||
reagents_list = list(/datum/reagent/consumable/vitfro = 50, /datum/reagent/consumable/ethanol/rum = 30, /datum/reagent/ash = 10)
|
||||
category = list("Beers")
|
||||
build_path = /obj/item/export/bottle/greenroad
|
||||
@@ -573,7 +573,8 @@
|
||||
else if(loc == user)
|
||||
cooldown = TRUE
|
||||
call(src,realProc)(user)
|
||||
addtimer(CALLBACK(src, .proc/cd), cooldownMax)
|
||||
if(!QDELETED(src))
|
||||
addtimer(CALLBACK(src, .proc/cd), cooldownMax)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You aren't quite sure what to do with this yet.</span>")
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ Burning extracts:
|
||||
|
||||
/obj/item/slimecross/burning/sepia/do_effect(mob/user)
|
||||
user.visible_message("<span class='notice'>[src] shapes itself into a camera!</span>")
|
||||
new /obj/item/camera/timefreeze(get_turf(user))
|
||||
new /obj/item/camera/rewind(get_turf(user))
|
||||
..()
|
||||
|
||||
/obj/item/slimecross/burning/cerulean
|
||||
@@ -289,25 +289,88 @@ Burning extracts:
|
||||
|
||||
//Misc. things added
|
||||
|
||||
//Rewind camera - I'm already Burning Sepia
|
||||
/obj/item/camera/rewind
|
||||
name = "sepia-tinted camera"
|
||||
desc = "They say a picture is like a moment stopped in time."
|
||||
pictures_left = 1
|
||||
pictures_max = 1
|
||||
can_customise = FALSE
|
||||
default_picture_name = "A nostalgic picture"
|
||||
var/used = FALSE
|
||||
|
||||
/datum/saved_bodypart
|
||||
var/obj/item/bodypart/old_part
|
||||
var/bodypart_type
|
||||
var/brute_dam
|
||||
var/burn_dam
|
||||
var/stamina_dam
|
||||
|
||||
/datum/saved_bodypart/New(obj/item/bodypart/part)
|
||||
old_part = part
|
||||
bodypart_type = part.type
|
||||
brute_dam = part.brute_dam
|
||||
burn_dam = part.burn_dam
|
||||
stamina_dam = part.stamina_dam
|
||||
|
||||
/mob/living/carbon/proc/apply_saved_bodyparts(list/datum/saved_bodypart/parts)
|
||||
var/list/dont_chop = list()
|
||||
for(var/zone in parts)
|
||||
var/datum/saved_bodypart/saved_part = parts[zone]
|
||||
var/obj/item/bodypart/already = get_bodypart(zone)
|
||||
if(QDELETED(saved_part.old_part))
|
||||
saved_part.old_part = new saved_part.bodypart_type
|
||||
if(!already || already != saved_part.old_part)
|
||||
saved_part.old_part.replace_limb(src, TRUE)
|
||||
saved_part.old_part.heal_damage(INFINITY, INFINITY, INFINITY, null, FALSE)
|
||||
saved_part.old_part.receive_damage(saved_part.brute_dam, saved_part.burn_dam, saved_part.stamina_dam)
|
||||
dont_chop[zone] = TRUE
|
||||
for(var/_part in bodyparts)
|
||||
var/obj/item/bodypart/part = _part
|
||||
if(dont_chop[part.body_zone])
|
||||
continue
|
||||
part.drop_limb(TRUE)
|
||||
|
||||
/mob/living/carbon/proc/save_bodyparts()
|
||||
var/list/datum/saved_bodypart/ret = list()
|
||||
for(var/_part in bodyparts)
|
||||
var/obj/item/bodypart/part = _part
|
||||
var/datum/saved_bodypart/saved_part = new(part)
|
||||
|
||||
ret[part.body_zone] = saved_part
|
||||
return ret
|
||||
|
||||
/obj/item/camera/rewind/afterattack(atom/target, mob/user, flag)
|
||||
if(!on || !pictures_left || !isturf(target.loc))
|
||||
return
|
||||
if(!used)//selfie time
|
||||
if(user == target)
|
||||
to_chat(user, "<span class=notice>You take a selfie!</span>")
|
||||
else
|
||||
to_chat(user, "<span class=notice>You take a photo with [target]!</span>")
|
||||
to_chat(target, "<span class=notice>[user] takes a photo with you!</span>")
|
||||
to_chat(target, "<span class=notice>You'll remember this moment forever!</span>")
|
||||
|
||||
used = TRUE
|
||||
target.AddComponent(/datum/component/dejavu, 2)
|
||||
.=..()
|
||||
|
||||
//Timefreeze camera - Old Burning Sepia result. Kept in case admins want to spawn it
|
||||
/obj/item/camera/timefreeze
|
||||
name = "sepia-tinted camera"
|
||||
desc = "They say a picture is like a moment stopped in time."
|
||||
pictures_left = 1
|
||||
pictures_max = 1
|
||||
var/used = FALSE
|
||||
|
||||
/obj/item/camera/timefreeze/afterattack(atom/target, mob/user, flag)
|
||||
if(!on || !pictures_left || !isturf(target.loc))
|
||||
return
|
||||
new /obj/effect/timestop(get_turf(target), 2, 50, list(user))
|
||||
. = ..()
|
||||
var/text = "The camera fades away"
|
||||
if(disk)
|
||||
text += ", leaving the disk behind!"
|
||||
user.put_in_hands(disk)
|
||||
else
|
||||
text += "!"
|
||||
to_chat(user,"<span class='notice'>[text]</span>")
|
||||
qdel(src)
|
||||
if(!used) //refilling the film does not refill the timestop
|
||||
new /obj/effect/timestop(get_turf(target), 2, 50, list(user))
|
||||
used = TRUE
|
||||
desc = "This camera has seen better days."
|
||||
return ..()
|
||||
|
||||
/obj/item/slimepotion/extract_cloner
|
||||
name = "extract cloning potion"
|
||||
|
||||
@@ -212,7 +212,7 @@ Consuming extracts:
|
||||
taste = "sugar and starlight"
|
||||
|
||||
/obj/item/slime_cookie/bluespace/do_effect(mob/living/M, mob/user)
|
||||
var/list/L = get_area_turfs(get_area(get_turf(M)))
|
||||
var/list/L = get_sub_areas_turfs(get_area(M))
|
||||
var/turf/target
|
||||
while (L.len && !target)
|
||||
var/I = rand(1, L.len)
|
||||
|
||||
@@ -148,8 +148,9 @@ Regenerative extracts:
|
||||
/obj/item/slimecross/regenerative/sepia
|
||||
colour = "sepia"
|
||||
|
||||
/obj/item/slimecross/regenerative/sepia/core_effect(mob/living/target, mob/user)
|
||||
new /obj/effect/timestop(get_turf(target), 2, 50, list(user,target))
|
||||
/obj/item/slimecross/regenerative/sepia/core_effect_before(mob/living/target, mob/user)
|
||||
to_chat(target, "<span class=notice>You try to forget how you feel.</span>")
|
||||
target.AddComponent(/datum/component/dejavu)
|
||||
|
||||
/obj/item/slimecross/regenerative/cerulean
|
||||
colour = "cerulean"
|
||||
|
||||
@@ -909,12 +909,15 @@
|
||||
to_chat(user, "<span class='warning'>The potion can only be used on gendered things!</span>")
|
||||
return
|
||||
|
||||
if(L.gender == MALE)
|
||||
if(L.gender == MALE && (L.client?.prefs.cit_toggles & FORCED_FEM))
|
||||
L.gender = FEMALE
|
||||
L.visible_message("<span class='boldnotice'>[L] suddenly looks more feminine!</span>", "<span class='boldwarning'>You suddenly feel more feminine!</span>")
|
||||
else
|
||||
else if(L.gender == FEMALE && (L.client?.prefs.cit_toggles & FORCED_MASC))
|
||||
L.gender = MALE
|
||||
L.visible_message("<span class='boldnotice'>[L] suddenly looks more masculine!</span>", "<span class='boldwarning'>You suddenly feel more masculine!</span>")
|
||||
else
|
||||
to_chat(user,"<span class='warning'>It won't work on [L]!</span>")
|
||||
return
|
||||
L.regenerate_icons()
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore
|
||||
var/list/activeRooms = list()
|
||||
var/list/storedRooms = list()
|
||||
var/list/checked_in_ckeys = list()
|
||||
var/storageTurf
|
||||
//Lore Stuff
|
||||
var/ruinSpawned = FALSE
|
||||
@@ -44,7 +45,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
|
||||
/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user)
|
||||
var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num
|
||||
if(!chosenRoomNumber)
|
||||
if(!chosenRoomNumber || !user.CanReach(src))
|
||||
return
|
||||
if(chosenRoomNumber > SHORT_REAL_LIMIT)
|
||||
to_chat(user, "<span class='warning'>You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!</span>")
|
||||
@@ -52,8 +53,8 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber)))
|
||||
to_chat(user, "<span class='warning'>That is not a valid room number!</span>")
|
||||
return
|
||||
if(ismob(loc))
|
||||
if(user == loc) //Not always the same as user
|
||||
if(!isturf(loc))
|
||||
if((loc == user) || (loc.loc == user) || (loc.loc in user.contents) || (loc in user.GetAllContents(type))) //short circuit, first three checks are cheaper and covers almost all cases (loc.loc covers hotel in box in backpack).
|
||||
forceMove(get_turf(user))
|
||||
if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize
|
||||
if(!GLOB.hhStorageTurf)
|
||||
@@ -63,13 +64,13 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3])
|
||||
else
|
||||
storageTurf = GLOB.hhStorageTurf
|
||||
checked_in_ckeys |= user.ckey //if anything below runtimes, guess you're outta luck!
|
||||
if(tryActiveRoom(chosenRoomNumber, user))
|
||||
return
|
||||
if(tryStoredRoom(chosenRoomNumber, user))
|
||||
return
|
||||
sendToNewRoom(chosenRoomNumber, user)
|
||||
|
||||
|
||||
/obj/item/hilbertshotel/proc/tryActiveRoom(var/roomNumber, var/mob/user)
|
||||
if(activeRooms["[roomNumber]"])
|
||||
var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"]
|
||||
@@ -102,6 +103,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/// This is a BLOCKING OPERATION. Note the room load call, and the block reservation calls.
|
||||
/obj/item/hilbertshotel/proc/sendToNewRoom(var/roomNumber, var/mob/user)
|
||||
var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height)
|
||||
if(ruinSpawned)
|
||||
@@ -200,7 +202,6 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
name = "Hilbert's Hotel Storage"
|
||||
mappath = '_maps/templates/hilbertshotelstorage.dmm'
|
||||
|
||||
|
||||
//Turfs and Areas
|
||||
/turf/closed/indestructible/hotelwall
|
||||
name = "hotel wall"
|
||||
@@ -359,6 +360,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
. = ..()
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
parentSphere?.checked_in_ckeys -= M.ckey
|
||||
if(M.mind)
|
||||
var/stillPopulated = FALSE
|
||||
var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything
|
||||
|
||||
@@ -94,9 +94,9 @@
|
||||
name = "Lightning Bolt"
|
||||
desc = "Fire a high powered lightning bolt at your foes!"
|
||||
school = "evocation"
|
||||
charge_max = 200
|
||||
charge_max = 150
|
||||
clothes_req = 1
|
||||
invocation = "UN'LTD P'WAH"
|
||||
invocation = "ZAP MUTHA'FUCKA"
|
||||
invocation_type = "shout"
|
||||
cooldown_min = 30
|
||||
active_icon_state = "lightning"
|
||||
@@ -112,12 +112,12 @@
|
||||
name = "Fireball"
|
||||
desc = "This spell fires a fireball at a target and does not require wizard garb."
|
||||
school = "evocation"
|
||||
charge_max = 60
|
||||
charge_max = 100
|
||||
clothes_req = 0
|
||||
invocation = "ONI SOMA"
|
||||
invocation_type = "shout"
|
||||
range = 20
|
||||
cooldown_min = 20 //10 deciseconds reduction per rank
|
||||
cooldown_min = 20 //20 deciseconds reduction per rank
|
||||
projectile_type = /obj/item/projectile/magic/aoe/fireball
|
||||
base_icon_state = "fireball"
|
||||
action_icon_state = "fireball0"
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/obj/effect/proc_holder/spell/targeted/emplosion
|
||||
name = "Emplosion"
|
||||
desc = "This spell emplodes an area."
|
||||
charge_max = 250
|
||||
cooldown_min = 50
|
||||
|
||||
var/emp_heavy = 2
|
||||
var/emp_light = 3
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Forcewall"
|
||||
desc = "Create a magical barrier that only you can pass through. Does not require wizard garb."
|
||||
school = "transmutation"
|
||||
charge_max = 100
|
||||
charge_max = 80
|
||||
clothes_req = 0
|
||||
invocation = "TARCOL MINTI ZHERI"
|
||||
invocation_type = "shout"
|
||||
@@ -10,7 +10,7 @@
|
||||
action_icon_state = "shield"
|
||||
range = -1
|
||||
include_user = 1
|
||||
cooldown_min = 50 //12 deciseconds reduction per rank
|
||||
cooldown_min = 15 //15 deciseconds reduction per rank
|
||||
var/wall_type = /obj/effect/forcefield/wizard
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user