Merge branch 'master' of https://github.com/PolarisSS13/Polaris into heart_damage_2

# Conflicts:
#	code/modules/mob/living/simple_animal/hostile/giant_spider.dm
#	code/modules/organs/blood.dm
#	code/modules/organs/internal/lungs.dm
#	code/modules/organs/organ.dm
#	code/modules/organs/organ_external.dm
This commit is contained in:
Anewbe
2017-03-22 17:29:01 -05:00
537 changed files with 17289 additions and 9499 deletions
+1 -1
View File
@@ -333,7 +333,7 @@ steam.start() -- spawns the effect
spawn(0)
var/turf/T = get_turf(src.holder)
if(T != src.oldposition)
if(istype(T, /turf/space))
if(isturf(T))
var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition)
src.oldposition = T
I.set_dir(src.holder.dir)
+1 -1
View File
@@ -135,7 +135,7 @@
new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc)
new /obj/item/clothing/head/flatcap(src.loc)
new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(src.loc)
new /obj/item/clothing/shoes/jackboots(src.loc)
new /obj/item/clothing/shoes/boots/jackboots(src.loc)
delete_me = 1
/obj/effect/landmark/costume/nyangirl/New()
+7 -1
View File
@@ -77,6 +77,8 @@
desc = "They seem to pulse slightly with an inner life"
icon_state = "eggs"
var/amount_grown = 0
var/spiders_min = 6
var/spiders_max = 24
New()
pixel_x = rand(3,-3)
pixel_y = rand(3,-3)
@@ -97,7 +99,7 @@
/obj/effect/spider/eggcluster/process()
amount_grown += rand(0,2)
if(amount_grown >= 100)
var/num = rand(6,24)
var/num = rand(spiders_min, spiders_max)
var/obj/item/organ/external/O = null
if(istype(loc, /obj/item/organ/external))
O = loc
@@ -108,6 +110,10 @@
O.implants += spiderling
qdel(src)
/obj/effect/spider/eggcluster/small
spiders_min = 1
spiders_max = 3
/obj/effect/spider/spiderling
name = "spiderling"
desc = "It never stays still for long."
+20
View File
@@ -0,0 +1,20 @@
// This artificially splits a ZAS zone, useful if you wish to prevent massive super-zones which can cause lag.
/obj/effect/zone_divider
name = "zone divider"
icon = 'icons/mob/screen1.dmi'
icon_state = "x3"
invisibility = 101 //nope, can't see this
anchored = 1
density = 0
opacity = 0
/obj/effect/zone_divider/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
// Special case to prevent us from being part of a zone during the first air master tick.
// We must merge ourselves into a zone on next tick. This will cause a bit of lag on
// startup, but it can't really be helped you know?
if(air_master && air_master.current_cycle == 0)
spawn(1)
air_master.mark_for_update(get_turf(src))
return 0
return !air_group // Anything except zones can pass
+33 -11
View File
@@ -4,17 +4,17 @@
// #define EMPDEBUG 10
proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_range, log=0)
if(!epicenter) return
if(!istype(epicenter, /turf))
epicenter = get_turf(epicenter.loc)
if(log)
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
message_admins("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ")
log_game("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ")
if(heavy_range > 1)
if(first_range > 1)
var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter)
pulse.icon = 'icons/effects/effects.dmi'
pulse.icon_state = "emppulse"
@@ -23,28 +23,50 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
spawn(20)
qdel(pulse)
if(heavy_range > light_range)
light_range = heavy_range
if(first_range > second_range)
second_range = first_range
if(second_range > third_range)
third_range = second_range
if(third_range > fourth_range)
fourth_range = third_range
for(var/mob/M in range(heavy_range, epicenter))
for(var/mob/M in range(first_range, epicenter))
M << 'sound/effects/EMPulse.ogg'
for(var/atom/T in range(light_range, epicenter))
for(var/atom/T in range(fourth_range, epicenter))
#ifdef EMPDEBUG
var/time = world.timeofday
#endif
var/distance = get_dist(epicenter, T)
if(distance < 0)
distance = 0
if(distance < heavy_range)
//Worst effects, really hurts
if(distance < first_range)
T.emp_act(1)
else if(distance == heavy_range)
else if(distance == first_range)
if(prob(50))
T.emp_act(1)
else
T.emp_act(2)
else if(distance <= light_range)
//Slightly less painful
else if(distance <= second_range)
T.emp_act(2)
else if(distance == second_range)
if(prob(50))
T.emp_act(2)
else
T.emp_act(3)
//Even less slightly less painful
else if(distance <= third_range)
T.emp_act(3)
else if(distance == third_range)
if(prob(50))
T.emp_act(2)
else
T.emp_act(3)
//This should be more or less harmless
else if(distance <= fourth_range)
T.emp_act(4)
#ifdef EMPDEBUG
if((world.timeofday - time) >= EMPDEBUG)
log_and_message_admins("EMPDEBUG: [T.name] - [T.type] - took [world.timeofday - time]ds to process emp_act()!")
+23 -17
View File
@@ -19,6 +19,23 @@
var/const/ROOM_ERR_SPACE = -1
var/const/ROOM_ERR_TOOLARGE = -2
var/static/list/SPACE_AREA_TYPES = list(
/area/space,
/area/mine
)
var/static/list/SPECIAL_AREA_TYPES = list(
/area/shuttle,
/area/admin,
/area/arrival,
/area/centcom,
/area/asteroid,
/area/tdome,
/area/syndicate_station,
/area/wizard_station,
/area/prison
// /area/derelict //commented out, all hail derelict-rebuilders!
)
/obj/item/blueprints/attack_self(mob/M as mob)
if (!istype(M,/mob/living/carbon/human))
M << "This stack of blue paper means nothing to you." //monkeys cannot into projecting
@@ -48,7 +65,7 @@
var/area/A = get_area()
var/text = {"<HTML><head><title>[src]</title></head><BODY>
<h2>[station_name()] blueprints</h2>
<small>Property of [company_name]. For heads of staff only. Store in high-secure storage.</small><hr>
<small>Property of [using_map.company_name]. For heads of staff only. Store in high-secure storage.</small><hr>
"}
switch (get_area_type())
if (AREA_SPACE)
@@ -79,22 +96,11 @@ move an amendment</a> to the drawing.</p>
return A
/obj/item/blueprints/proc/get_area_type(var/area/A = get_area())
if(istype(A, /area/space))
return AREA_SPACE
var/list/SPECIALS = list(
/area/shuttle,
/area/admin,
/area/arrival,
/area/centcom,
/area/asteroid,
/area/tdome,
/area/syndicate_station,
/area/wizard_station,
/area/prison
// /area/derelict //commented out, all hail derelict-rebuilders!
)
for (var/type in SPECIALS)
if ( istype(A,type) )
for(var/type in SPACE_AREA_TYPES)
if(istype(A, type))
return AREA_SPACE
for (var/type in SPECIAL_AREA_TYPES)
if(istype(A, type))
return AREA_SPECIAL
return AREA_STATION
+1 -1
View File
@@ -998,7 +998,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
M.apply_damage( rand(30,60) , BURN)
message += "You feel a searing heat! Your [P] is burning!"
if(i>=20 && i<=25) //EMP
empulse(P.loc, 3, 6, 1)
empulse(P.loc, 1, 2, 4, 6, 1)
message += "Your [P] emits a wave of electromagnetic energy!"
if(i>=25 && i<=40) //Smoke
var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem
@@ -213,6 +213,17 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
update_icon()
ui_interact(user)
// Proc: MouseDrop()
//Same thing PDAs do
/obj/item/device/communicator/MouseDrop(obj/over_object as obj)
var/mob/M = usr
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
if(!istype(over_object, /obj/screen))
return attack_self(M)
return
// Proc: attack_ghost()
// Parameters: 1 (user - the ghost clicking on the device)
// Description: Recreates the known_devices list, so that the ghost looking at the device can see themselves, then calls ..() so that NanoUI appears.
@@ -35,12 +35,12 @@
/obj/item/device/radio/intercom/department/medbay
name = "station intercom (Medbay)"
icon_state = "secintercom"
icon_state = "medintercom"
frequency = MED_I_FREQ
/obj/item/device/radio/intercom/department/security
name = "station intercom (Security)"
icon_state = "medintercom"
icon_state = "secintercom"
frequency = SEC_I_FREQ
/obj/item/device/radio/intercom/entertainment
+5 -5
View File
@@ -52,8 +52,8 @@ REAGENT SCANNER
if (!istype(M,/mob/living/carbon/human) || M.isSynthetic())
//these sensors are designed for organic life
user.show_message("<span class='notice'>Analyzing Results for ERROR:\n\t Overall Status: ERROR</span>")
user.show_message("<span class='notice'> Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
user.show_message("<span class='notice'> Damage Specifics: <font color='blue'>?</font> - <font color='green'>?</font> - <font color='#FFA500'>?</font> - <font color='red'>?</font></span>")
user.show_message("<span class='notice'> Key: <font color='cyan'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
user.show_message("<span class='notice'> Damage Specifics: <font color='cyan'>?</font> - <font color='green'>?</font> - <font color='#FFA500'>?</font> - <font color='red'>?</font></span>")
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)</span>", 1)
user.show_message("<span class='warning'>Warning: Blood Level ERROR: --% --cl.</span> <span class='notice'>Type: ERROR</span>")
user.show_message("<span class='notice'>Subject's pulse: <font color='red'>-- bpm.</font></span>")
@@ -70,8 +70,8 @@ REAGENT SCANNER
user.show_message("<span class='notice'>Overall Status: dead</span>")
else
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.maxHealth)*100) ]% healthy"]</span>")
user.show_message("<span class='notice'> Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
user.show_message("<span class='notice'> Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font></span>")
user.show_message("<span class='notice'> Key: <font color='cyan'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
user.show_message("<span class='notice'> Damage Specifics: <font color='cyan'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font></span>")
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)</span>", 1)
if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
user.show_message("<span class='notice'>Time of Death: [M.tod]</span>")
@@ -92,7 +92,7 @@ REAGENT SCANNER
else
user.show_message("<span class='notice'> Limbs are OK.</span>",1)
OX = M.getOxyLoss() > 50 ? "<font color='blue'><b>Severe oxygen deprivation detected</b></font>" : "Subject bloodstream oxygen level normal"
OX = M.getOxyLoss() > 50 ? "<font color='cyan'><b>Severe oxygen deprivation detected</b></font>" : "Subject bloodstream oxygen level normal"
TX = M.getToxLoss() > 50 ? "<font color='green'><b>Dangerous amount of toxins detected</b></font>" : "Subject bloodstream toxin level minimal"
BU = M.getFireLoss() > 50 ? "<font color='#FFA500'><b>Severe burn damage detected</b></font>" : "Subject burn injury status O.K"
BR = M.getBruteLoss() > 50 ? "<font color='red'><b>Severe anatomical damage detected</b></font>" : "Subject brute-force injury status O.K"
@@ -0,0 +1,79 @@
//Universal translator
/obj/item/device/universal_translator
name = "handheld translator"
desc = "This handy device appears to translate the languages it hears into onscreen text for a user."
icon = 'icons/obj/device.dmi'
icon_state = "translator"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
var/mult_icons = 1 //Changes sprite when it translates
var/visual = 1 //If you need to see to get the message
var/audio = 0 //If you need to hear to get the message
var/listening = 0
var/datum/language/langset
/obj/item/device/universal_translator/attack_self(mob/user)
if(!listening) //Turning ON
langset = input(user,"Translate to which of your languages?","Language Selection") as null|anything in user.languages
if(langset)
if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND)))
to_chat(user, "<span class='warning'>\The [src] cannot output that language.</span>")
return
else
listening = 1
listening_objects |= src
if(mult_icons)
icon_state = "[initial(icon_state)]1"
to_chat(user, "<span class='notice'>You enable \the [src], translating into [langset.name].</span>")
else //Turning OFF
listening = 0
listening_objects -= src
langset = null
icon_state = "[initial(icon_state)]"
to_chat(user, "<span class='notice'>You disable \the [src].</span>")
/obj/item/device/universal_translator/hear_talk(var/mob/speaker, var/message, var/vrb, var/datum/language/language)
if(!listening || !istype(speaker))
return
//Show the "I heard something" animation.
if(mult_icons)
flick("[initial(icon_state)]2",src)
//Handheld or pocket only.
if(!isliving(loc))
return
var/mob/living/L = loc
if (language && (language.flags & NONVERBAL))
return //Not gonna translate sign language
if (visual && ((L.sdisabilities & BLIND) || L.eye_blind))
return //Can't see the screen, don't get the message
if (audio && ((L.sdisabilities & DEAF) || L.ear_deaf))
return //Can't hear the translation, don't get the message
//Only translate if they can't understand, otherwise pointlessly spammy
//I'll just assume they don't look at the screen in that case
//They don't understand the spoken language we're translating FROM
if(!L.say_understands(speaker,language))
//They understand the output language
if(L.say_understands(null,langset))
to_chat(L, "<i><b>[src]</b> translates, </i>\"<span class='[langset.colour]'>[message]</span>\"")
//They don't understand the output language
else
to_chat(L, "<i><b>[src]</b> translates, </i>\"<span class='[langset.colour]'>[langset.scramble(message)]</span>\"")
//Let's try an ear-worn version
/obj/item/device/universal_translator/ear
name = "translator earpiece"
desc = "This handy device appears to translate the languages it hears into another language for a user."
icon_state = "earpiece"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS
visual = 0
audio = 1
@@ -35,7 +35,7 @@ AI MODULES
return
if(ticker && ticker.mode && ticker.mode.name == "blob")
usr << "Law uploads have been disabled by [company_name]!"
usr << "Law uploads have been disabled by [using_map.company_name]!"
return
if (comp.current.stat == 2 || comp.current.control_disabled == 1)
@@ -85,10 +85,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
body_parts_covered = 0
var/lit = 0
var/icon_on
var/icon_off
var/type_butt = null
var/chem_volume = 0
var/smoketime = 0
var/is_pipe = 0 //Prevents a runtime with pipes
var/matchmes = "USER lights NAME with FLAME"
var/lightermes = "USER lights NAME with FLAME"
var/zippomes = "USER lights NAME with FLAME"
@@ -106,6 +106,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
smoketime--
if(smoketime < 1)
die()
if(ishuman(loc))
var/mob/living/carbon/human/C = loc
to_chat(C, "<span class='notice'>Your [name] goes out.</span>")
return
if(location)
location.hotspot_expose(700, 5)
@@ -119,19 +122,20 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/examine(mob/user)
..()
if(lit == 1)
var/smoke_percent = round((smoketime / initial(smoketime)) * 100)
switch(smoke_percent)
if(90 to INFINITY)
user << "[src] has just begun to burn."
if(60 to 90)
user << "[src] has a good amount of burn time remaining."
if(30 to 60)
user << "[src] is about half finished."
if(10 to 30)
user << "[src] is starting to burn low."
else
user << "[src] is nearly burnt out!"
if(is_pipe)
return
var/smoke_percent = round((smoketime / initial(smoketime)) * 100)
switch(smoke_percent)
if(90 to INFINITY)
user << "[src] is still fresh."
if(60 to 90)
user << "[src] has a good amount of burn time remaining."
if(30 to 60)
user << "[src] is about half finished."
if(10 to 30)
user << "[src] is starting to burn low."
else
user << "[src] is nearly burnt out!"
/obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights the [name].")
@@ -167,6 +171,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/proc/die(var/nomessage = 0)
var/turf/T = get_turf(src)
set_light(0)
processing_objects.Remove(src)
if (type_butt)
var/obj/item/butt = new type_butt(T)
transfer_fingerprints_to(butt)
@@ -175,12 +180,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(ismob(loc))
var/mob/living/M = loc
if (!nomessage)
M << "<span class='notice'>Your [name] goes out.</span>"
to_chat(M, "<span class='notice'>Your [name] goes out.</span>")
M.remove_from_mob(src) //un-equip it so the overlays can update
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
processing_objects.Remove(src)
qdel(src)
else
new /obj/effect/decal/cleanable/ash(T)
@@ -189,12 +193,26 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if (!nomessage)
M << "<span class='notice'>Your [name] goes out, and you empty the ash.</span>"
lit = 0
icon_state = icon_off
item_state = icon_off
icon_state = initial(icon_state)
item_state = initial(item_state)
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
processing_objects.Remove(src)
smoketime = 0
reagents.clear_reagents()
name = "empty [initial(name)]"
/obj/item/clothing/mask/smokable/proc/quench()
lit = 0
processing_objects.Remove(src)
icon_state = initial(icon_state)
item_state = initial(item_state)
if(ismob(loc))
var/mob/living/M = loc
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
/obj/item/clothing/mask/smokable/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
@@ -223,6 +241,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
return ..()
/obj/item/clothing/mask/smokable/water_act(amount)
if(amount >= 5)
quench()
/obj/item/clothing/mask/smokable/cigarette
name = "cigarette"
desc = "A roll of tobacco and nicotine."
@@ -233,7 +255,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
slot_flags = SLOT_EARS | SLOT_MASK
attack_verb = list("burnt", "singed")
icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
icon_off = "cigoff"
type_butt = /obj/item/weapon/cigbutt
chem_volume = 15
smoketime = 300
@@ -269,8 +290,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user as mob)
if(lit == 1)
user.visible_message("<span class='notice'>[user] calmly drops and treads on the lit [src], putting it out instantly.</span>")
die(1)
if(user.a_intent == I_HURT)
user.visible_message("<span class='notice'>[user] drops and treads on the lit [src], putting it out instantly.</span>")
die(1)
else
user.visible_message("<span class='notice'>[user] puts out \the [src].</span>")
quench()
return ..()
////////////
@@ -281,7 +306,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
type_butt = /obj/item/weapon/cigbutt/cigarbutt
throw_speed = 0.5
item_state = "cigaroff"
@@ -298,14 +322,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "There's little more you could want from a cigar."
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
name = "premium Havanian cigar"
desc = "A cigar fit for only the best of the best."
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
smoketime = 7200
chem_volume = 30
@@ -345,7 +367,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_state = "pipeoff"
item_state = "pipeoff"
icon_on = "pipeon" //Note - these are in masks.dmi
icon_off = "pipeoff"
smoketime = 0
chem_volume = 50
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
@@ -353,6 +374,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
zippomes = "<span class='rose'>With much care, USER lights their NAME with their FLAME.</span>"
weldermes = "<span class='notice'>USER recklessly lights NAME with FLAME.</span>"
ignitermes = "<span class='notice'>USER fiddles with FLAME, and manages to light their NAME with the power of science.</span>"
is_pipe = 1
/obj/item/clothing/mask/smokable/pipe/New()
..()
@@ -375,18 +397,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user as mob)
if(lit == 1)
user.visible_message("<span class='notice'>[user] puts out [src].</span>", "<span class='notice'>You put out [src].</span>")
lit = 0
icon_state = icon_off
item_state = icon_off
processing_objects.Remove(src)
else if (smoketime)
var/turf/location = get_turf(user)
user.visible_message("<span class='notice'>[user] empties out [src].</span>", "<span class='notice'>You empty out [src].</span>")
new /obj/effect/decal/cleanable/ash(location)
smoketime = 0
reagents.clear_reagents()
name = "empty [initial(name)]"
if(user.a_intent == I_HURT)
user.visible_message("<span class='notice'>[user] empties the lit [src] on the floor!.</span>")
die(1)
else
user.visible_message("<span class='notice'>[user] puts out \the [src].</span>")
quench()
/obj/item/clothing/mask/smokable/pipe/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/melee/energy/sword))
@@ -431,7 +447,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_state = "cobpipeoff"
item_state = "cobpipeoff"
icon_on = "cobpipeon" //Note - these are in masks.dmi
icon_off = "cobpipeoff"
chem_volume = 35
/////////
@@ -35,3 +35,22 @@
if(istype(M, build_path))
return 1
return 0
//Should be called from the constructor of any machine to automatically populate the default parts
/obj/item/weapon/circuitboard/proc/apply_default_parts(var/obj/machinery/M)
if(!istype(M))
return
if(!req_components)
return
M.component_parts = list()
for(var/comp_path in req_components)
var/comp_amt = req_components[comp_path]
if(!comp_amt)
continue
if(ispath(comp_path, /obj/item/stack))
M.component_parts += new comp_path(contain_parts ? M : null, comp_amt)
else
for(var/i in 1 to comp_amt)
M.component_parts += new comp_path(contain_parts ? M : null)
return
@@ -12,7 +12,7 @@
/obj/item/weapon/circuitboard/security/New()
..()
network = station_networks
network = using_map.station_networks
/obj/item/weapon/circuitboard/security/engineering
name = T_BOARD("engineering camera monitor")
@@ -26,7 +26,7 @@
/obj/item/weapon/circuitboard/security/mining
name = T_BOARD("mining camera monitor")
build_path = /obj/machinery/computer/security/mining
network = list("MINE")
network = list("Mining Outpost")
req_access = list()
/obj/item/weapon/circuitboard/security/telescreen/entertainment
@@ -0,0 +1,13 @@
#ifndef T_BOARD
#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/papershredder
name = T_BOARD("papershredder")
build_path = /obj/machinery/papershredder
board_type = new /datum/frame/frame_types/machine
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/motor = 1,
/obj/item/weapon/stock_parts/gear = 2,
/obj/item/weapon/stock_parts/micro_laser = 1)
@@ -3,12 +3,14 @@
icon_state = "emp"
item_state = "empgrenade"
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
var/emp_heavy = 4
var/emp_light = 10
var/emp_heavy = 2
var/emp_med = 4
var/emp_light = 7
var/emp_long = 10
prime()
..()
if(empulse(src, emp_heavy, emp_light))
if(empulse(src, emp_heavy, emp_med, emp_light, emp_long))
qdel(src)
return
@@ -18,4 +20,6 @@
icon_state = "lyemp"
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
emp_heavy = 1
emp_light = 4
emp_med = 2
emp_light = 3
emp_long = 4
@@ -101,6 +101,10 @@ Implant Specifics:<BR>"}
meltdown()
if(2)
delay = rand(5*60*10,15*60*10) //from 5 to 15 minutes of free time
if(3)
delay = rand(2*60*10,5*60*10) //from 2 to 5 minutes of free time
if(4)
delay = rand(0.5*60*10,1*60*10) //from .5 to 1 minutes of free time
spawn(delay)
malfunction--
@@ -227,10 +231,22 @@ Implant Specifics:<BR>"}
return
malfunction = MALFUNCTION_TEMPORARY
switch (severity)
if (2.0) //Weak EMP will make implant tear limbs off.
if (4) //Weak EMP will make implant tear limbs off.
if (prob(25))
small_boom()
if (3) //Weak EMP will make implant tear limbs off.
if (prob(50))
small_boom()
if (1.0) //strong EMP will melt implant either making it go off, or disarming it
if (2) //strong EMP will melt implant either making it go off, or disarming it
if (prob(70))
if (prob(75))
small_boom()
else
if (prob(13))
activate() //chance of bye bye
else
meltdown() //chance of implant disarming
if (1) //strong EMP will melt implant either making it go off, or disarming it
if (prob(70))
if (prob(50))
small_boom()
@@ -320,7 +336,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
if(prob(60))
activate(20)
if(2)
if(prob(30))
if(prob(40))
activate(20)
if(3)
if(prob(40))
activate(5)
if(4)
if(prob(20))
activate(5)
spawn(20)
@@ -333,7 +355,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/loyalty/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> [company_name] Employee Management Implant<BR>
<b>Name:</b> [using_map.company_name] Employee Management Implant<BR>
<b>Life:</b> Ten years.<BR>
<b>Important Notes:</b> Personnel injected with this device tend to be much more loyal to the company.<BR>
<HR>
@@ -349,11 +371,11 @@ the implant may become unstable and either pre-maturely inject the subject or si
var/mob/living/carbon/human/H = M
var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role)
if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE))
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [company_name] try to invade your mind!")
H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [using_map.company_name] try to invade your mind!")
return 0
else
clear_antag_roles(H.mind, 1)
H << "<span class='notice'>You feel a surge of loyalty towards [company_name].</span>"
H << "<span class='notice'>You feel a surge of loyalty towards [using_map.company_name].</span>"
return 1
@@ -403,7 +425,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/death_alarm/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> [company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
<b>Name:</b> [using_map.company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
<b>Life:</b> Activates upon death.<BR>
<b>Important Notes:</b> Alerts crew to crewmember death.<BR>
<HR>
@@ -485,7 +507,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/compressed/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> [company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
<b>Name:</b> [using_map.company_name] \"Profit Margin\" Class Employee Lifesign Sensor<BR>
<b>Life:</b> Activates upon death.<BR>
<b>Important Notes:</b> Alerts crew to crewmember death.<BR>
<HR>
@@ -6,6 +6,7 @@
throw_speed = 1
throw_range = 5
w_class = ITEMSIZE_SMALL
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 1000)
var/obj/item/weapon/implant/imp = null
/obj/item/weapon/implanter/attack_self(var/mob/user)
+1 -1
View File
@@ -751,7 +751,7 @@
<br>
<h1>The Oath</h1>
<i>The Medical Oath sworn by recognised medical practitioners in the employ of [company_name]</i><br>
<i>The Medical Oath sworn by recognised medical practitioners in the employ of [using_map.company_name]</i><br>
<ol>
<li>Now, as a new doctor, I solemnly promise that I will, to the best of my ability, serve humanity-caring for the sick, promoting good health, and alleviating pain and suffering.</li>
@@ -285,4 +285,59 @@
/obj/item/weapon/anobattery,
/obj/item/device/ano_scanner,
/obj/item/weapon/pickaxe/hand
)
)
/obj/item/weapon/storage/belt/fannypack
name = "leather fannypack"
desc = "A dorky fannypack for keeping small items in."
icon_state = "fannypack_leather"
item_state = "fannypack_leather"
max_w_class = ITEMSIZE_SMALL
storage_slots = null
max_storage_space = ITEMSIZE_COST_NORMAL * 2
/obj/item/weapon/storage/belt/fannypack/black
name = "black fannypack"
icon_state = "fannypack_black"
item_state = "fannypack_black"
/obj/item/weapon/storage/belt/fannypack/blue
name = "blue fannypack"
icon_state = "fannypack_blue"
item_state = "fannypack_blue"
/obj/item/weapon/storage/belt/fannypack/cyan
name = "cyan fannypack"
icon_state = "fannypack_cyan"
item_state = "fannypack_cyan"
/obj/item/weapon/storage/belt/fannypack/green
name = "green fannypack"
icon_state = "fannypack_green"
item_state = "fannypack_green"
/obj/item/weapon/storage/belt/fannypack/orange
name = "orange fannypack"
icon_state = "fannypack_orange"
item_state = "fannypack_orange"
/obj/item/weapon/storage/belt/fannypack/purple
name = "purple fannypack"
icon_state = "fannypack_purple"
item_state = "fannypack_purple"
/obj/item/weapon/storage/belt/fannypack/red
name = "red fannypack"
icon_state = "fannypack_red"
item_state = "fannypack_red"
/obj/item/weapon/storage/belt/fannypack/white
name = "white fannypack"
icon_state = "fannypack_white"
item_state = "fannypack_white"
/obj/item/weapon/storage/belt/fannypack/yellow
name = "yellow fannypack"
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
@@ -50,10 +50,10 @@
if (!( user.restrained() ) && !( user.stat ))
switch(over_object.name)
if("r_hand")
user.u_equip(master_item)
user.unEquip(master_item)
user.put_in_r_hand(master_item)
if("l_hand")
user.u_equip(master_item)
user.unEquip(master_item)
user.put_in_l_hand(master_item)
master_item.add_fingerprint(user)
return 0
@@ -77,10 +77,10 @@
switch(over_object.name)
if("r_hand")
usr.u_equip(src)
usr.unEquip(src)
usr.put_in_r_hand(src)
if("l_hand")
usr.u_equip(src)
usr.unEquip(src)
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
@@ -150,12 +150,14 @@
//misc, formerly from code/defines/weapons.dm
/obj/item/weapon/surgical/bonegel
name = "bone gel"
desc = "For fixing bones."
icon_state = "bone-gel"
force = 0
throwforce = 1.0
/obj/item/weapon/surgical/FixOVein
name = "FixOVein"
desc = "Like bone gel. For veins."
icon_state = "fixovein"
force = 0
throwforce = 1.0
@@ -164,6 +166,7 @@
/obj/item/weapon/surgical/bonesetter
name = "bone setter"
desc = "Put them in their place."
icon_state = "bone setter"
force = 8.0
throwforce = 9.0
@@ -103,7 +103,7 @@
/obj/item/weapon/tank/vox //Can't be a child of phoron or the gas amount gets screwey.
name = "phoron tank"
desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable."
icon_state = "oxygen_fr"
icon_state = "phoron_vox"
gauge_icon = null
flags = CONDUCT
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
@@ -209,4 +209,4 @@
/obj/item/weapon/tank/nitrogen/examine(mob/user)
if(..(user, 0) && air_contents.gas["nitrogen"] < 10)
user << text("<span class='danger'>The meter on \the [src] indicates you are almost out of nitrogen!</span>")
//playsound(user, 'sound/effects/alert.ogg', 50, 1)
//playsound(user, 'sound/effects/alert.ogg', 50, 1)
+1 -1
View File
@@ -17,7 +17,7 @@
var/max_carry = 10
/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
// Drop all the things. All of them.
overlays.Cut()
for(var/obj/item/I in carrying)
+62 -6
View File
@@ -630,9 +630,9 @@ something, make sure it's not in one of the other lists.*/
prob(1);/obj/item/weapon/grenade/flashbang,
prob(1);/obj/item/weapon/melee/baton,
prob(1);/obj/item/weapon/reagent_containers/spray/pepper,
prob(3);/obj/item/clothing/shoes/jackboots,
prob(1);/obj/item/clothing/shoes/swat,
prob(1);/obj/item/clothing/shoes/combat,
prob(3);/obj/item/clothing/shoes/boots/jackboots,
prob(1);/obj/item/clothing/shoes/boots/swat,
prob(1);/obj/item/clothing/shoes/boots/combat,
prob(1);/obj/item/clothing/gloves/swat,
prob(1);/obj/item/clothing/gloves/combat,
prob(1);/obj/item/clothing/glasses/sunglasses/big,
@@ -684,7 +684,7 @@ something, make sure it's not in one of the other lists.*/
prob(3);/obj/item/weapon/storage/box/gloves,
prob(2);/obj/item/weapon/storage/belt/medical/emt,
prob(2);/obj/item/weapon/storage/belt/medical,
prob(1);/obj/item/clothing/shoes/combat,
prob(1);/obj/item/clothing/shoes/boots/combat,
prob(3);/obj/item/clothing/shoes/white,
prob(2);/obj/item/clothing/gloves/latex,
prob(5);/obj/item/clothing/gloves/white,
@@ -730,7 +730,7 @@ something, make sure it's not in one of the other lists.*/
prob(2);/obj/item/clothing/head/welding,
prob(4);/obj/item/clothing/suit/storage/hazardvest,
prob(2);/obj/item/clothing/under/overalls,
prob(3);/obj/item/clothing/shoes/workboots,
prob(3);/obj/item/clothing/shoes/boots/workboots,
prob(1);/obj/item/clothing/shoes/magboots,
prob(2);/obj/item/clothing/accessory/storage/black_vest,
prob(2);/obj/item/clothing/accessory/storage/brown_vest,
@@ -839,4 +839,60 @@ var/list/random_useful_
random_junk_ -= /obj/item/trash/tray
return pick(random_junk_)
// Misc. actually useful stuff
return get_random_useful_type()
return get_random_useful_type()
/*
Selects one spawn point out of a group of points with the same ID and asks it to generate its items
*/
var/list/multi_point_spawns
/obj/random_multi
name = "random object spawn point"
desc = "This item type is used to spawn random objects at round-start. Only one spawn point for a given group id is selected."
icon = 'icons/misc/mark.dmi'
icon_state = "x3"
invisibility = INVISIBILITY_MAXIMUM
var/id // Group id
var/weight // Probability weight for this spawn point
/obj/random_multi/initialize()
..()
weight = max(1, round(weight))
if(!multi_point_spawns)
multi_point_spawns = list()
var/list/spawnpoints = multi_point_spawns[id]
if(!spawnpoints)
spawnpoints = list()
multi_point_spawns[id] = spawnpoints
spawnpoints[src] = weight
/obj/random_multi/Destroy()
var/list/spawnpoints = multi_point_spawns[id]
spawnpoints -= src
if(!spawnpoints.len)
multi_point_spawns -= id
. = ..()
/obj/random_multi/proc/generate_items()
return
/obj/random_multi/single_item
var/item_path // Item type to spawn
/obj/random_multi/single_item/generate_items()
new item_path(loc)
/hook/roundstart/proc/generate_multi_spawn_items()
for(var/id in multi_point_spawns)
var/list/spawn_points = multi_point_spawns[id]
var/obj/random_multi/rm = pickweight(spawn_points)
rm.generate_items()
for(var/entry in spawn_points)
qdel(entry)
return 1
/obj/random_multi/single_item/captains_spare_id
name = "Multi Point - Captain's Spare"
id = "Captain's spare id"
item_path = /obj/item/weapon/card/id/captains_spare
@@ -65,8 +65,8 @@
new /obj/item/clothing/head/helmet/swat(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/shoes/swat(src)
new /obj/item/clothing/shoes/swat(src)
new /obj/item/clothing/shoes/boots/swat(src)
new /obj/item/clothing/shoes/boots/swat(src)
new /obj/item/clothing/suit/armor/swat(src)
new /obj/item/clothing/suit/armor/swat(src)
new /obj/item/clothing/under/syndicate/tacticool(src)
@@ -142,6 +142,7 @@
new /obj/item/clothing/suit/storage/toggle/labcoat/emt(src)
new /obj/item/device/radio/headset/headset_med/alt(src)
new /obj/item/weapon/cartridge/medical(src)
new /obj/item/weapon/storage/briefcase/inflatable(src)
new /obj/item/device/flashlight(src)
new /obj/item/weapon/tank/emergency/oxygen/engi(src)
new /obj/item/clothing/glasses/hud/health(src)
@@ -29,9 +29,9 @@
new /obj/item/clothing/under/rank/security2(src)
new /obj/item/clothing/under/rank/security2(src)
new /obj/item/clothing/under/rank/security2(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/boots/jackboots(src)
new /obj/item/clothing/shoes/boots/jackboots(src)
new /obj/item/clothing/shoes/boots/jackboots(src)
new /obj/item/clothing/head/soft/sec(src)
new /obj/item/clothing/head/soft/sec(src)
new /obj/item/clothing/head/soft/sec(src)
@@ -190,8 +190,8 @@
new /obj/item/clothing/shoes/sandal(src)
new /obj/item/clothing/shoes/sandal(src)
new /obj/item/clothing/shoes/sandal(src)
new /obj/item/clothing/shoes/winterboots(src)
new /obj/item/clothing/shoes/winterboots(src)
new /obj/item/clothing/shoes/boots/winter(src)
new /obj/item/clothing/shoes/boots/winter(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat(src)
return
@@ -294,9 +294,9 @@
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/boots/workboots(src)
new /obj/item/clothing/shoes/boots/workboots(src)
new /obj/item/clothing/shoes/boots/workboots(src)
return
@@ -564,7 +564,7 @@
new /obj/item/weapon/storage/belt/security/tactical(src)
if(prob(10))
new /obj/item/clothing/mask/bandana/skull(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/boots/jackboots(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/under/pants/camo(src)
return
@@ -582,7 +582,7 @@
new /obj/item/clothing/under/syndicate/combat(src)
new /obj/item/device/radio/headset/ert/alt(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/clothing/shoes/swat(src)
new /obj/item/clothing/shoes/boots/swat(src)
new /obj/item/clothing/gloves/swat(src)
new /obj/item/clothing/mask/balaclava/tactical(src)
new /obj/item/clothing/mask/balaclava(src)
@@ -283,9 +283,9 @@
/obj/structure/closet/crate/rcd
name = "\improper RCD crate"
desc = "A crate with rapid construction device."
icon_state = "crate"
icon_opened = "crateopen"
icon_closed = "crate"
icon_state = "engi_crate"
icon_opened = "engi_crateopen"
icon_closed = "engi_crate"
/obj/structure/closet/crate/rcd/New()
..()
@@ -427,6 +427,20 @@
icon_opened = "hydrosecurecrateopen"
icon_closed = "hydrosecurecrate"
/obj/structure/closet/crate/secure/engineering
desc = "A crate with a lock on it, painted in the scheme of the station's engineers."
name = "secure engineering crate"
icon_state = "engi_secure_crate"
icon_opened = "engi_secure_crateopen"
icon_closed = "engi_secure_crate"
/obj/structure/closet/crate/secure/science
name = "secure science crate"
desc = "A crate with a lock on it, painted in the scheme of the station's scientists."
icon_state = "scisecurecrate"
icon_opened = "scisecurecrateopen"
icon_closed = "scisecurecrate"
/obj/structure/closet/crate/secure/bin
name = "secure bin"
desc = "A secure bin."
@@ -499,6 +513,23 @@
icon_opened = "largermetalopen"
icon_closed = "largermetal"
/obj/structure/closet/crate/engineering
name = "engineering crate"
icon_state = "engi_crate"
icon_opened = "engi_crateopen"
icon_closed = "engi_crate"
/obj/structure/closet/crate/engineering/electrical
icon_state = "engi_e_crate"
icon_opened = "engi_crateopen"
icon_closed = "engi_e_crate"
/obj/structure/closet/crate/science
name = "science crate"
icon_state = "scicrate"
icon_opened = "scicrateopen"
icon_closed = "scicrate"
/obj/structure/closet/crate/hydroponics
name = "hydroponics crate"
desc = "All you need to destroy those pesky weeds and pests."
@@ -72,7 +72,7 @@
/obj/structure/largecrate/animal/goat
name = "goat crate"
held_type = /mob/living/simple_animal/hostile/retaliate/goat
held_type = /mob/living/simple_animal/retaliate/goat
/obj/structure/largecrate/animal/cat
name = "cat carrier"
@@ -107,6 +107,16 @@
airlock_type = "/highsecurity"
glass = -1
/obj/structure/door_assembly/door_assembly_voidcraft
base_icon_state = "voidcraft"
base_name = "voidcraft hatch"
airlock_type = "/voidcraft"
glass = -1
/obj/structure/door_assembly/door_assembly_voidcraft/vertical
base_icon_state = "voidcraft_vertical"
airlock_type = "/voidcraft/vertical"
/obj/structure/door_assembly/multi_tile
icon = 'icons/obj/doors/door_assembly2x1.dmi'
dir = EAST
+159 -5
View File
@@ -32,6 +32,19 @@
..()
icon_state = "tree_[rand(1, 6)]"
/obj/structure/flora/tree/sif
name = "glowing tree"
desc = "It's a tree, except this one seems quite alien. It glows a deep blue."
icon = 'icons/obj/flora/deadtrees.dmi'
icon_state = "tree_sif"
/obj/structure/flora/tree/sif/New()
update_icon()
/obj/structure/flora/tree/sif/update_icon()
set_light(5, 1, "#33ccff")
overlays.Cut()
overlays.Add(image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[icon_state]_glow", layer = LIGHTING_LAYER + 0.1))
//grass
/obj/structure/flora/grass
@@ -79,10 +92,6 @@
icon = 'icons/obj/plants.dmi'
icon_state = "plant-26"
/obj/structure/flora/pottedplant/xmas/New()
..()
icon_state = "plant-xmas"
//newbushes
@@ -205,4 +214,149 @@
name = "hanging skeleton model"
icon = 'icons/obj/plants.dmi'
icon_state = "hangskele"
desc = "It's an anatomical model of a human skeletal system made of plaster."
desc = "It's an anatomical model of a human skeletal system made of plaster."
//potted plants credit: Flashkirby
/obj/structure/flora/pottedplant
name = "potted plant"
desc = "Really brings the room together."
icon = 'icons/obj/plants.dmi'
icon_state = "plant-01"
/obj/structure/flora/pottedplant/large
name = "large potted plant"
desc = "This is a large plant. Three branches support pairs of waxy leaves."
icon_state = "plant-26"
/obj/structure/flora/pottedplant/fern
name = "potted fern"
desc = "This is an ordinary looking fern. It looks like it could do with some water."
icon_state = "plant-02"
/obj/structure/flora/pottedplant/overgrown
name = "overgrown potted plants"
desc = "This is an assortment of colourful plants. Some parts are overgrown."
icon_state = "plant-03"
/obj/structure/flora/pottedplant/bamboo
name = "potted bamboo"
desc = "These are bamboo shoots. The tops looks like they've been cut short."
icon_state = "plant-04"
/obj/structure/flora/pottedplant/largebush
name = "large potted bush"
desc = "This is a large bush. The leaves stick upwards in an odd fashion."
icon_state = "plant-05"
/obj/structure/flora/pottedplant/thinbush
name = "thin potted bush"
desc = "This is a thin bush. It appears to be flowering."
icon_state = "plant-06"
/obj/structure/flora/pottedplant/mysterious
name = "mysterious potted bulbs"
desc = "This is a mysterious looking plant. Touching the bulbs cause them to shrink."
icon_state = "plant-07"
/obj/structure/flora/pottedplant/smalltree
name = "small potted tree"
desc = "This is a small tree. It is rather pleasant."
icon_state = "plant-08"
/obj/structure/flora/pottedplant/unusual
name = "unusual potted plant"
desc = "This is an unusual plant. It's bulbous ends emit a soft blue light."
icon_state = "plant-09"
set_light(l_range = 1, l_power = 0.5, l_color = "#0000FF")
/obj/structure/flora/pottedplant/orientaltree
name = "potted oriental tree"
desc = "This is a rather oriental style tree. It's flowers are bright pink."
icon_state = "plant-10"
/obj/structure/flora/pottedplant/smallcactus
name = "small potted cactus"
desc = "This is a small cactus. Its needles are sharp."
icon_state = "plant-11"
/obj/structure/flora/pottedplant/tall
name = "tall potted plant"
desc = "This is a tall plant. Tiny pores line its surface."
icon_state = "plant-12"
/obj/structure/flora/pottedplant/sticky
name = "styicky potted plant"
desc = "This is an odd plant. Its sticky leaves trap insects."
icon_state = "plant-13"
/obj/structure/flora/pottedplant/smelly
name = "smelly potted plant"
desc = "This is some kind of tropical plant. It reeks of rotten eggs."
icon_state = "plant-14"
/obj/structure/flora/pottedplant/small
name = "small potted plant"
desc = "This is a pot of assorted small flora. Some look familiar."
icon_state = "plant-15"
/obj/structure/flora/pottedplant/aquatic
name = "aquatic potted plant"
desc = "This is apparently an aquatic plant. It's probably fake."
icon_state = "plant-16"
/obj/structure/flora/pottedplant/shoot
name = "small potted shoot"
desc = "This is a small shoot. It still needs time to grow."
icon_state = "plant-17"
/obj/structure/flora/pottedplant/flower
name = "potted flower"
desc = "This is a slim plant. Sweet smelling flowers are supported by spindly stems."
icon_state = "plant-18"
/obj/structure/flora/pottedplant/crystal
name = "crystalline potted plant"
desc = "These are rather cubic plants. Odd crystal formations grow on the end."
icon_state = "plant-19"
/obj/structure/flora/pottedplant/subterranean
name = "subterranean potted plant"
desc = "This is a subterranean plant. It's bulbous ends glow faintly."
icon_state = "plant-20"
set_light(l_range = 1, l_power = 0.5, l_color = "#FF6633")
/obj/structure/flora/pottedplant/minitree
name = "potted tree"
desc = "This is a miniature tree. Apparently it was grown to 1/5 scale."
icon_state = "plant-21"
/obj/structure/flora/pottedplant/stoutbush
name = "stout potted bush"
desc = "This is a stout bush. Its leaves point up and outwards."
icon_state = "plant-22"
/obj/structure/flora/pottedplant/drooping
name = "drooping potted plant"
desc = "This is a small plant. The drooping leaves make it look like its wilted."
icon_state = "plant-23"
/obj/structure/flora/pottedplant/tropical
name = "tropical potted plant"
desc = "This is some kind of tropical plant. It hasn't begun to flower yet."
icon_state = "plant-24"
/obj/structure/flora/pottedplant/dead
name = "dead potted plant"
desc = "This is the dried up remains of a dead plant. Someone should replace it."
icon_state = "plant-25"
/obj/structure/flora/pottedplant/decorative
name = "decorative potted plant"
desc = "This is a decorative shrub. It's been trimmed into the shape of an apple."
icon_state = "applebush"
/obj/structure/flora/pottedplant/xmas
name = "small christmas tree"
desc = "This is a tiny well lit decorative christmas tree."
icon_state = "plant-xmas"
+5
View File
@@ -34,6 +34,11 @@
if(locate(/obj/structure/lattice, get_step(src, dir)))
L = locate(/obj/structure/lattice, get_step(src, dir))
L.updateOverlays(src.loc)
if(istype(loc, /turf/simulated/open))
var/turf/simulated/open/O = loc
spawn(1)
if(O) // If we built a new floor with the lattice, the open turf won't exist anymore.
O.update() // This lattice may be supporting things on top of it. If it's being deleted, they need to fall down.
..()
/obj/structure/lattice/ex_act(severity)
+102
View File
@@ -122,6 +122,108 @@
desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking2"
/obj/structure/sign/warning
name = "\improper WARNING"
icon_state = "securearea"
/obj/structure/sign/warning/New()
..()
desc = "A warning sign which reads '[name]'."
/obj/structure/sign/warning/airlock
name = "\improper EXTERNAL AIRLOCK"
icon_state = "doors"
/obj/structure/sign/warning/biohazard
name = "\improper BIOHAZARD"
icon_state = "bio"
/obj/structure/sign/warning/bomb_range
name = "\improper BOMB RANGE"
icon_state = "blast"
/obj/structure/sign/warning/caution
name = "\improper CAUTION"
/obj/structure/sign/warning/compressed_gas
name = "\improper COMPRESSED GAS"
icon_state = "hikpa"
/obj/structure/sign/warning/deathsposal
name = "\improper DISPOSAL LEADS TO SPACE"
icon_state = "deathsposal"
/obj/structure/sign/warning/docking_area
name = "\improper KEEP CLEAR: DOCKING AREA"
/obj/structure/sign/warning/engineering_access
name = "\improper ENGINEERING ACCESS"
/obj/structure/sign/warning/fire
name = "\improper DANGER: FIRE"
icon_state = "fire"
/obj/structure/sign/warning/high_voltage
name = "\improper HIGH VOLTAGE"
icon_state = "shock"
/obj/structure/sign/warning/hot_exhaust
name = "\improper HOT EXHAUST"
icon_state = "fire"
/obj/structure/sign/warning/internals_required
name = "\improper INTERNALS REQUIRED"
/obj/structure/sign/warning/lethal_turrets
name = "\improper LETHAL TURRETS"
icon_state = "turrets"
/obj/structure/sign/warning/lethal_turrets/New()
..()
desc += " Enter at own risk!."
/obj/structure/sign/warning/mail_delivery
name = "\improper MAIL DELIVERY"
/obj/structure/sign/warning/moving_parts
name = "\improper MOVING PARTS"
/obj/structure/sign/warning/nosmoking_1
name = "\improper NO SMOKING"
icon_state = "nosmoking"
/obj/structure/sign/warning/nosmoking_2
name = "\improper NO SMOKING"
icon_state = "nosmoking2"
/obj/structure/sign/warning/pods
name = "\improper ESCAPE PODS"
icon_state = "pods"
/obj/structure/sign/warning/radioactive
name = "\improper RADIOACTIVE AREA"
icon_state = "radiation"
/obj/structure/sign/warning/secure_area
name = "\improper SECURE AREA"
/obj/structure/sign/warning/secure_area/armory
name = "\improper ARMORY"
/obj/structure/sign/warning/server_room
name = "\improper SERVER ROOM"
/obj/structure/sign/warning/siphon_valve
name = "\improper SIPHON VALVE"
/obj/structure/sign/warning/vacuum
name = "\improper HARD VACUUM AHEAD"
icon_state = "space"
/obj/structure/sign/warning/vent_port
name = "\improper EJECTION/VENTING PORT"
/obj/structure/sign/redcross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
@@ -133,7 +133,7 @@
user << "<span class='notice'>\The [src] already has someone buckled to it.</span>"
return
user.visible_message("<span class='notice'>[user] attempts to buckle [affecting] into \the [src]!</span>")
if(do_after(user, 20))
if(do_after(user, 20, G.affecting))
affecting.loc = loc
spawn(0)
if(buckle_mob(affecting))
+5 -3
View File
@@ -18,8 +18,9 @@
/obj/structure/toilet/attack_hand(mob/living/user as mob)
if(swirlie)
usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
usr.visible_message("<span class='danger'>[user] slams the toilet seat onto [swirlie.name]'s head!</span>", "<span class='notice'>You slam the toilet seat onto [swirlie.name]'s head!</span>", "You hear reverberating porcelain.")
swirlie.adjustBruteLoss(8)
swirlie.adjustBruteLoss(5)
return
if(cistern && !open)
@@ -53,6 +54,7 @@
return
if(istype(I, /obj/item/weapon/grab))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
var/obj/item/weapon/grab/G = I
if(isliving(G.affecting))
@@ -65,14 +67,14 @@
if(open && !swirlie)
user.visible_message("<span class='danger'>[user] starts to give [GM.name] a swirlie!</span>", "<span class='notice'>You start to give [GM.name] a swirlie!</span>")
swirlie = GM
if(do_after(user, 30, 5, 0))
if(do_after(user, 30, GM))
user.visible_message("<span class='danger'>[user] gives [GM.name] a swirlie!</span>", "<span class='notice'>You give [GM.name] a swirlie!</span>", "You hear a toilet flushing.")
if(!GM.internal)
GM.adjustOxyLoss(5)
swirlie = null
else
user.visible_message("<span class='danger'>[user] slams [GM.name] into the [src]!</span>", "<span class='notice'>You slam [GM.name] into the [src]!</span>")
GM.adjustBruteLoss(8)
GM.adjustBruteLoss(5)
else
user << "<span class='notice'>You need a tighter grip.</span>"