Merge branch 'master' of https://github.com/PolarisSS13/Polaris into ling-cuff-slip

This commit is contained in:
Anewbe
2017-11-19 01:58:06 -06:00
253 changed files with 16223 additions and 15337 deletions
+1
View File
@@ -57,3 +57,4 @@
#define INFECTION_LEVEL_ONE 100
#define INFECTION_LEVEL_TWO 500
#define INFECTION_LEVEL_THREE 1000
#define INFECTION_LEVEL_MAX 1500
+9
View File
@@ -298,6 +298,15 @@
name = "speedloader (.38 rubber)"
path =/obj/item/ammo_magazine/s38/rubber
/datum/category_item/autolathe/arms/speedloader_45
name = "speedloader (.45)"
path = /obj/item/ammo_magazine/s45
hidden = 1
/datum/category_item/autolathe/arms/speedloader_45r
name = "speedloader (.45 rubber)"
path = /obj/item/ammo_magazine/s45/rubber
// Commented out until metal exploits with autolathe is fixed.
/*/datum/category_item/autolathe/arms/pistol_clip_45
name = "ammo clip (.45)"
+4 -2
View File
@@ -63,11 +63,13 @@
/obj/item/clothing/suit/storage/vest/heavy/merc,
/obj/item/clothing/glasses/night,
/obj/item/weapon/storage/box/anti_photons,
/obj/item/ammo_magazine/clip/c12g/pellet, /obj/item/ammo_magazine/clip/c12g
/obj/item/ammo_magazine/clip/c12g/pellet,
/obj/item/ammo_magazine/clip/c12g
),
list( //the doc,
/obj/item/weapon/storage/firstaid/combat,
/obj/item/weapon/gun/projectile/dartgun, /obj/item/weapon/reagent_containers/hypospray,
/obj/item/weapon/gun/projectile/dartgun,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate,
/obj/item/weapon/reagent_containers/glass/bottle/cyanide,
/obj/item/ammo_magazine/chemdart
+1 -1
View File
@@ -119,7 +119,7 @@
/obj/item/weapon/storage/belt/medical,
/obj/item/device/radio/headset/heads/cmo,
/obj/item/clothing/under/rank/chief_medical_officer,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/weapon/reagent_containers/hypospray/vial,
/obj/item/clothing/accessory/stethoscope,
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/suit/storage/toggle/labcoat/cmo,
+1 -1
View File
@@ -142,7 +142,7 @@
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2
)
cost = 50
cost = 60
containertype = "/obj/structure/closet/crate/secure"
containername = "Vey-Med Medical voidsuit crate"
access = access_medical_equip
+8
View File
@@ -22,6 +22,14 @@
name = "Pistol Magazine (.45 AP)"
path = /obj/item/ammo_magazine/m45/ap
/datum/uplink_item/item/ammo/s45m
name = "Speedloader (.45)"
path = /obj/item/ammo_magazine/s45
/datum/uplink_item/item/ammo/s45map
name = "Speedloader (.45 AP)"
path = /obj/item/ammo_magazine/s45/ap
/datum/uplink_item/item/ammo/tommymag
name = "Tommygun Magazine (.45)"
path = /obj/item/ammo_magazine/m45tommy
+11 -2
View File
@@ -1,6 +1,6 @@
/atom/movable
layer = 3
appearance_flags = TILE_BOUND
appearance_flags = TILE_BOUND|PIXEL_SCALE
var/last_move = null
var/anchored = 0
// var/elevation = 2 - not used anywhere
@@ -15,7 +15,7 @@
var/moved_recently = 0
var/mob/pulledby = null
var/item_state = null // Used to specify the item state for the on-mob overlays.
var/icon_scale = 1 // Used to scale icons up or down in update_transform().
var/auto_init = 1
/atom/movable/New()
@@ -296,3 +296,12 @@
return null
return text2num(pickweight(candidates))
/atom/movable/proc/update_transform()
var/matrix/M = matrix()
M.Scale(icon_scale)
src.transform = M
// Use this to set the object's scale.
/atom/movable/proc/adjust_scale(new_scale)
icon_scale = new_scale
update_transform()
@@ -4,6 +4,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/list/datum/absorbed_dna/absorbed_dna = list()
var/list/absorbed_languages = list() // Necessary because of set_species stuff
var/absorbedcount = 0
var/lingabsorbedcount = 1 //Starts at one, because that's us
var/chem_charges = 20
var/chem_recharge_rate = 0.5
var/chem_storage = 50
@@ -11,8 +12,8 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/changelingID = "Changeling"
var/geneticdamage = 0
var/isabsorbing = 0
var/geneticpoints = 5
var/max_geneticpoints = 5
var/geneticpoints = 7
var/max_geneticpoints = 7
var/readapts = 1
var/max_readapts = 2
var/list/purchased_powers = list()
@@ -90,16 +90,23 @@
continue
absorbDNA(dna_data)
changeling.absorbedcount++
T.mind.changeling.absorbed_dna.len = 1
changeling.geneticpoints += 5
changeling.max_geneticpoints += 5
// This is where lings get boosts from eating eachother
if(T.mind.changeling.lingabsorbedcount)
for(var/a = 1 to T.mind.changeling.lingabsorbedcount)
changeling.lingabsorbedcount++
changeling.geneticpoints += 4
changeling.max_geneticpoints += 4
src << "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>"
T.mind.changeling.chem_charges = 0
T.mind.changeling.geneticpoints = -1
T.mind.changeling.max_geneticpoints = -1 //To prevent revival.
T.mind.changeling.absorbedcount = 0
T.mind.changeling.lingabsorbedcount = 0
changeling.absorbedcount++
changeling.isabsorbing = 0
+2 -2
View File
@@ -7,8 +7,8 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
/datum/game_mode/heist
name = "Heist"
config_tag = "heist"
required_players = 9
required_players_secret = 9
required_players = 12
required_players_secret = 12
required_enemies = 3
round_description = "An unidentified bluespace signature is approaching the station!"
extended_round_description = "The Company's majority control of phoron in the system has marked the \
+2 -2
View File
@@ -12,8 +12,8 @@ var/list/nuke_disks = list()
colony of sizable population and considerable wealth causes it to often be the target of various \
attempts of robbery, fraud and other malicious actions."
config_tag = "mercenary"
required_players = 9
required_players_secret = 9
required_players = 12
required_players_secret = 12
required_enemies = 3
end_on_antag_death = 0
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
+1 -1
View File
@@ -440,7 +440,7 @@ datum/objective/steal
"a chief medical officer's jumpsuit" = /obj/item/clothing/under/rank/chief_medical_officer,
"a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security,
"a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel,
"the hypospray" = /obj/item/weapon/reagent_containers/hypospray,
"the hypospray" = /obj/item/weapon/reagent_containers/hypospray/vial,
"the colony director's pinpointer" = /obj/item/weapon/pinpointer,
"an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof,
)
+1 -1
View File
@@ -74,7 +74,7 @@ var/global/datum/controller/occupations/job_master
proc/FreeRole(var/rank) //making additional slot on the fly
var/datum/job/job = GetJob(rank)
if(job && job.current_positions >= job.total_positions && job.total_positions != -1)
if(job && job.total_positions != -1)
job.total_positions++
return 1
return 0
+30
View File
@@ -127,6 +127,36 @@
icon = 'icons/obj/doors/Doormaint.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_mai
/obj/machinery/door/airlock/maintenance/cargo
icon = 'icons/obj/doors/Doormaint_cargo.dmi'
req_one_access = list(access_cargo)
/obj/machinery/door/airlock/maintenance/command
icon = 'icons/obj/doors/Doormaint_command.dmi'
req_one_access = list(access_heads)
/obj/machinery/door/airlock/maintenance/common
icon = 'icons/obj/doors/Doormaint_common.dmi'
/obj/machinery/door/airlock/maintenance/engi
icon = 'icons/obj/doors/Doormaint_engi.dmi'
req_one_access = list(access_engine)
/obj/machinery/door/airlock/maintenance/int
icon = 'icons/obj/doors/Doormaint_int.dmi'
/obj/machinery/door/airlock/maintenance/medical
icon = 'icons/obj/doors/Doormaint_med.dmi'
req_one_access = list(access_medical)
/obj/machinery/door/airlock/maintenance/rnd
icon = 'icons/obj/doors/Doormaint_rnd.dmi'
req_one_access = list(access_research)
/obj/machinery/door/airlock/maintenance/sec
icon = 'icons/obj/doors/Doormaint_sec.dmi'
req_one_access = list(access_security)
/obj/machinery/door/airlock/external
name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi'
+55
View File
@@ -2,15 +2,44 @@
/obj/machinery/door/airlock/multi_tile
width = 2
appearance_flags = 0
var/obj/machinery/filler_object/filler1
var/obj/machinery/filler_object/filler2
/obj/machinery/door/airlock/multi_tile/New()
..()
SetBounds()
if(opacity)
create_fillers()
/obj/machinery/door/airlock/multi_tile/Destroy()
qdel_null(filler1)
qdel_null(filler2)
return ..()
/obj/machinery/door/airlock/multi_tile/Move()
. = ..()
SetBounds()
/obj/machinery/door/airlock/multi_tile/open()
. = ..()
if(filler1)
filler1.set_opacity(opacity)
if(filler2)
filler2.set_opacity(opacity)
return .
/obj/machinery/door/airlock/multi_tile/close()
. = ..()
if(filler1)
filler1.set_opacity(opacity)
if(filler2)
filler2.set_opacity(opacity)
return .
/obj/machinery/door/airlock/multi_tile/proc/SetBounds()
if(dir in list(EAST, WEST))
bound_width = width * world.icon_size
@@ -19,9 +48,35 @@
bound_width = world.icon_size
bound_height = width * world.icon_size
/obj/machinery/door/airlock/multi_tile/proc/create_fillers()
if(src.dir > 3)
filler1 = new/obj/machinery/filler_object (src.loc)
filler2 = new/obj/machinery/filler_object (get_step(src,EAST))
else
filler1 = new/obj/machinery/filler_object (src.loc)
filler2 = new/obj/machinery/filler_object (get_step(src,NORTH))
filler1.density = 0
filler2.density = 0
filler1.set_opacity(opacity)
filler2.set_opacity(opacity)
/obj/machinery/door/airlock/multi_tile/glass
name = "Glass Airlock"
icon = 'icons/obj/doors/Door2x1glass.dmi'
opacity = 0
glass = 1
assembly_type = /obj/structure/door_assembly/multi_tile
/obj/machinery/door/airlock/multi_tile/metal
name = "Airlock"
icon = 'icons/obj/doors/Door2x1metal.dmi'
assembly_type = /obj/structure/door_assembly/multi_tile
/obj/machinery/filler_object
name = ""
icon = 'icons/obj/doors/rapid_pdoor.dmi'
icon_state = ""
density = 0
/obj/machinery/door/airlock/multi_tile/metal/mait
icon = 'icons/obj/doors/Door2x1_Maint.dmi'
+11 -2
View File
@@ -640,7 +640,7 @@
name = "Nonstandard suit cycler"
model_text = "Nonstandard"
req_access = list(access_syndicate)
departments = list("Mercenary")
departments = list("Mercenary", "Charring")
can_repair = 1
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
@@ -752,7 +752,7 @@
//Clear the access reqs, disable the safeties, and open up all paintjobs.
user << "<span class='danger'>You run the sequencer across the interface, corrupting the operating protocols.</span>"
departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Crowd Control","Emergency Medical Response","^%###^%$")
departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Crowd Control","Emergency Medical Response","^%###^%$", "Charring")
species = list("Human","Tajara","Skrell","Unathi", "Teshari")
emagged = 1
@@ -1073,6 +1073,15 @@
suit.name = "blood-red voidsuit"
suit.item_state = "syndie_voidsuit"
suit.icon_state = "rig-syndie"
if("Charring")
if(helmet)
helmet.name = "soot-covered voidsuit helmet"
helmet.icon_state = "rig0-firebug"
helmet.item_state = "rig0-firebug"
if(suit)
suit.name = "soot-covered voidsuit"
suit.item_state = "rig-firebug"
suit.icon_state = "rig-firebug"
if(helmet) helmet.name = "refitted [helmet.name]"
if(suit) suit.name = "refitted [suit.name]"
+4 -4
View File
@@ -59,7 +59,7 @@
//..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
return
else if(istype(W, /obj/item/weapon/wirecutters))
user << "You cut the tag off the bodybag"
to_chat(user, "You cut the tag off the bodybag")
src.name = "body bag"
src.overlays.Cut()
return
@@ -160,7 +160,7 @@
O.name = "used stasis bag"
O.icon = src.icon
O.icon_state = "bodybag_used"
O.desc = "Pretty useless now.."
O.desc = "Pretty useless now..."
qdel(src)
/obj/structure/closet/body_bag/cryobag/MouseDrop(over_object, src_location, over_location)
@@ -211,9 +211,9 @@
/obj/structure/closet/body_bag/cryobag/examine(mob/user)
..()
if(Adjacent(user)) //The bag's rather thick and opaque from a distance.
user << "<span class='info'>You peer into \the [src].</span>"
to_chat(user, "<span class='info'>You peer into \the [src].</span>")
if(syringe)
user << "<span class='info'>It has a syringe added to it.</span>"
to_chat(user, "<span class='info'>It has a syringe added to it.</span>")
for(var/mob/living/L in contents)
L.examine(user)
+4 -1
View File
@@ -374,7 +374,10 @@
// This proc is used so that we can return out of the revive process while ensuring that busy and update_icon() are handled
/obj/item/weapon/shockpaddles/proc/do_revive(mob/living/carbon/human/H, mob/user)
if(!H.client && !H.teleop)
to_chat(find_dead_player(H.ckey, 1), "Someone is attempting to resuscitate you. Re-enter your body if you want to be revived!")
for(var/mob/observer/dead/ghost in player_list)
if(ghost.mind == H.mind)
to_chat(ghost, "<b><font color = #330033><font size = 3>Someone is attempting to resuscitate you. Re-enter your body if you want to be revived!</b> (Verbs -> Ghost -> Re-enter corpse)</font></font>")
break
//beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='warning'>\The [user] begins to place [src] on [H]'s chest.</span>", "<span class='warning'>You begin to place [src] on [H]'s chest...</span>")
+42 -12
View File
@@ -1,7 +1,7 @@
#define RAD_LEVEL_LOW 5 //10 // Around the level at which radiation starts to become harmful
#define RAD_LEVEL_MODERATE 15 //15
#define RAD_LEVEL_HIGH 50 //50
#define RAD_LEVEL_VERY_HIGH 100 //100
#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful
#define RAD_LEVEL_MODERATE 10
#define RAD_LEVEL_HIGH 25
#define RAD_LEVEL_VERY_HIGH 50
//Geiger counter
//Rewritten version of TG's geiger counter
@@ -19,7 +19,14 @@
/obj/item/device/geiger/New()
processing_objects |= src
/obj/item/device/geiger/Destroy()
processing_objects -= src
return ..()
/obj/item/device/geiger/process()
get_radiation()
/obj/item/device/geiger/proc/get_radiation()
if(!scanning)
return
radiation_count = radiation_repository.get_rads_at_turf(get_turf(src))
@@ -27,12 +34,29 @@
/obj/item/device/geiger/examine(mob/user)
..(user)
to_chat(user, "<span class='warning'>[scanning ? "ambient" : "stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.</span>")
get_radiation()
to_chat(user, "<span class='warning'>[scanning ? "Ambient" : "Stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.</span>")
/obj/item/device/geiger/rad_act(amount)
if(!amount || !scanning)
return FALSE
if(amount > radiation_count)
radiation_count = amount
var/sound = "geiger"
if(amount < 5)
sound = "geiger_weak"
playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
if(sound == "geiger_weak") // A weak geiger sound every two seconds sounds too infrequent.
spawn(1 SECOND)
playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
update_icon()
/obj/item/device/geiger/attack_self(var/mob/user)
scanning = !scanning
update_icon()
to_chat(user, "<span class='notice'>\icon[src] You switch [scanning ? "on" : "off"] [src].</span>")
to_chat(user, "<span class='notice'>\icon[src] You switch [scanning ? "on" : "off"] \the [src].</span>")
/obj/item/device/geiger/update_icon()
if(!scanning)
@@ -40,12 +64,18 @@
return 1
switch(radiation_count)
if(null) icon_state = "geiger_on_1"
if(-INFINITY to RAD_LEVEL_LOW) icon_state = "geiger_on_1"
if(RAD_LEVEL_LOW + 1 to RAD_LEVEL_MODERATE) icon_state = "geiger_on_2"
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) icon_state = "geiger_on_3"
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) icon_state = "geiger_on_4"
if(RAD_LEVEL_VERY_HIGH + 1 to INFINITY) icon_state = "geiger_on_5"
if(null)
icon_state = "geiger_on_1"
if(-INFINITY to RAD_LEVEL_LOW)
icon_state = "geiger_on_1"
if(RAD_LEVEL_LOW to RAD_LEVEL_MODERATE)
icon_state = "geiger_on_2"
if(RAD_LEVEL_MODERATE to RAD_LEVEL_HIGH)
icon_state = "geiger_on_3"
if(RAD_LEVEL_HIGH to RAD_LEVEL_VERY_HIGH)
icon_state = "geiger_on_4"
if(RAD_LEVEL_VERY_HIGH to INFINITY)
icon_state = "geiger_on_5"
#undef RAD_LEVEL_LOW
#undef RAD_LEVEL_MODERATE
+1 -1
View File
@@ -8,7 +8,7 @@
var/spamcheck = 0
var/emagged = 0
var/insults = 0
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!")
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TERRORIST!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "GLORY TO ALMACH!")
/obj/item/device/megaphone/attack_self(mob/living/user as mob)
if (user.client)
+19
View File
@@ -0,0 +1,19 @@
/obj/item/gunbox
name = "detective's gun box"
desc = "A secure box containing a Detective's sidearm."
icon = 'icons/obj/storage.dmi'
icon_state = "gunbox"
w_class = ITEMSIZE_HUGE
/obj/item/gunbox/attack_self(mob/living/user)
var/list/options = list()
options[".45 Pistol"] = list(/obj/item/weapon/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber)
options[".45 Revolver"] = list(/obj/item/weapon/gun/projectile/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber)
var/choice = input(user,"Would you prefer a pistol or a revolver?") as null|anything in options
if(src && choice)
var/list/things_to_spawn = options[choice]
for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
var/atom/movable/AM = new new_type(get_turf(src))
if(istype(AM, /obj/item/weapon/gun))
to_chat(user, "You have chosen \the [AM]. Say hello to your new friend.")
qdel(src)
+35 -19
View File
@@ -75,11 +75,11 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
return
if(affecting.is_bandaged())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>"
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
@@ -93,9 +93,13 @@
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
user << "<span class='notice'>You must stand still to bandage wounds.</span>"
to_chat(user, "<span class='notice'>You must stand still to bandage wounds.</span>")
break
if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check.
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
return 1
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
@@ -111,9 +115,9 @@
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
user << "<span class='warning'>\The [src] is used up.</span>"
to_chat(user, "<span class='warning'>\The [src] is used up.</span>")
else
user << "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>"
to_chat(user, "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>")
use(used)
/obj/item/stack/medical/ointment
@@ -135,17 +139,20 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
return
if(affecting.is_salved())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>"
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
return 1
if(affecting.is_salved()) // We do a second check after the delay, in case it was bandaged after the first check.
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
user.visible_message("<span class='notice'>[user] salved wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You salved wounds on [M]'s [affecting.name].</span>" )
@@ -169,11 +176,11 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
return
if(affecting.is_bandaged() && affecting.is_disinfected())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been treated.</span>"
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been treated.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
@@ -187,8 +194,11 @@
if(used == amount)
break
if(!do_mob(user, M, W.damage/5))
user << "<span class='notice'>You must stand still to bandage wounds.</span>"
to_chat(user, "<span class='notice'>You must stand still to bandage wounds.</span>")
break
if(affecting.is_bandaged() && affecting.is_disinfected()) // We do a second check after the delay, in case it was bandaged after the first check.
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
return 1
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.</span>", \
"<span class='notice'>You clean and seal \a [W.desc] on [M]'s [affecting.name].</span>" )
@@ -205,9 +215,9 @@
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
user << "<span class='warning'>\The [src] is used up.</span>"
to_chat(user, "<span class='warning'>\The [src] is used up.</span>")
else
user << "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>"
to_chat(user, "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>")
use(used)
/obj/item/stack/medical/advanced/ointment
@@ -228,16 +238,19 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
if(affecting.is_salved())
user << "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>"
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
return 1
if(affecting.is_salved()) // We do a second check after the delay, in case it was bandaged after the first check.
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
user.visible_message( "<span class='notice'>[user] covers wounds on [M]'s [affecting.name] with regenerative membrane.</span>", \
"<span class='notice'>You cover wounds on [M]'s [affecting.name] with regenerative membrane.</span>" )
@@ -264,20 +277,23 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
var/limb = affecting.name
if(!(affecting.organ_tag in splintable_organs))
user << "<span class='danger'>You can't use \the [src] to apply a splint there!</span>"
to_chat(user, "<span class='danger'>You can't use \the [src] to apply a splint there!</span>")
return
if(affecting.splinted)
user << "<span class='danger'>[M]'s [limb] is already splinted!</span>"
to_chat(user, "<span class='danger'>[M]'s [limb] is already splinted!</span>")
return
if (M != user)
user.visible_message("<span class='danger'>[user] starts to apply \the [src] to [M]'s [limb].</span>", "<span class='danger'>You start to apply \the [src] to [M]'s [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
else
if(( !user.hand && (affecting.organ_tag in list(BP_R_ARM, BP_R_HAND)) || \
user.hand && (affecting.organ_tag in list(BP_L_ARM, BP_L_HAND)) ))
user << "<span class='danger'>You can't apply a splint to the arm you're using!</span>"
to_chat(user, "<span class='danger'>You can't apply a splint to the arm you're using!</span>")
return
user.visible_message("<span class='danger'>[user] starts to apply \the [src] to their [limb].</span>", "<span class='danger'>You start to apply \the [src] to your [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
if(do_after(user, 50, M))
if(affecting.splinted)
to_chat(user, "<span class='danger'>[M]'s [limb] is already splinted!</span>")
return
if(M == user && prob(75))
user.visible_message("<span class='danger'>\The [user] fumbles [src].</span>", "<span class='danger'>You fumble [src].</span>", "<span class='danger'>You hear something being wrapped.</span>")
return
+22 -17
View File
@@ -6,6 +6,7 @@
icon_state = "nanopaste"
origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
amount = 10
toolspeed = 0.75 //Used in surgery, shouldn't be the same speed as a normal screwdriver on mechanical organ repair.
w_class = ITEMSIZE_SMALL
no_variants = FALSE
@@ -14,12 +15,13 @@
return 0
if (istype(M,/mob/living/silicon/robot)) //Repairing cyborgs
var/mob/living/silicon/robot/R = M
if (R.getBruteLoss() || R.getFireLoss() )
R.adjustBruteLoss(-15)
R.adjustFireLoss(-15)
R.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applied some [src] on [R]'s damaged areas.</span>",\
if (R.getBruteLoss() || R.getFireLoss())
if(do_after(user,7 * toolspeed))
R.adjustBruteLoss(-15)
R.adjustFireLoss(-15)
R.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applied some [src] on [R]'s damaged areas.</span>",\
"<span class='notice'>You apply some [src] at [R]'s damaged areas.</span>")
else
user << "<span class='notice'>All [R]'s systems are nominal.</span>"
@@ -28,14 +30,17 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting)
if(S.open >= 2)
if (S && (S.robotic >= ORGAN_ROBOT))
if(!S.get_damage())
user << "<span class='notice'>Nothing to fix here.</span>"
else if(can_use(1))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
S.heal_damage(15, 15, robo_repair = 1)
H.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].</span>",\
"<span class='notice'>You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].</span>")
if (S && (S.robotic >= ORGAN_ROBOT))
if(!S.get_damage())
user << "<span class='notice'>Nothing to fix here.</span>"
else if(can_use(1))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(S.open >= 2)
if(do_after(user,5 * toolspeed))
S.heal_damage(20, 20, robo_repair = 1)
else if(do_after(user,5 * toolspeed))
S.heal_damage(10,10, robo_repair =1)
H.updatehealth()
use(1)
user.visible_message("<span class='notice'>\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].</span>",\
"<span class='notice'>You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].</span>")
+18
View File
@@ -1060,4 +1060,22 @@ var/list/multi_point_spawns
/obj/item/clothing/suit/space/void/security/riot,
/obj/item/clothing/head/helmet/space/void/security/riot
)
)
/obj/random/multiple/voidsuit/mining
name = "Random Mining Voidsuit"
desc = "This is a random mining voidsuit."
icon = 'icons/obj/clothing/suits.dmi'
icon_state = "rig-mining"
/obj/random/multiple/voidsuit/mining/item_to_spawn()
return pick(
prob(5);list(
/obj/item/clothing/suit/space/void/mining,
/obj/item/clothing/head/helmet/space/void/mining
),
prob(1);list(
/obj/item/clothing/suit/space/void/mining/alt,
/obj/item/clothing/head/helmet/space/void/mining/alt
)
)
@@ -36,7 +36,7 @@
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
if(do_after(user, 20 * O.toolspeed))
src.locked = 0
user << "<span class = 'caution'> You disable the locking modules.</span>"
to_chat(user, "<span class = 'caution'> You disable the locking modules.</span>")
update_icon()
return
else if(istype(O, /obj/item/weapon))
@@ -50,7 +50,7 @@
else
playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
if(W.force < 15)
user << "<span class='notice'>The cabinet's protective glass glances off the hit.</span>"
to_chat(user, "<span class='notice'>The cabinet's protective glass glances off the hit.</span>")
else
src.hitstaken++
if(src.hitstaken == 4)
@@ -63,12 +63,14 @@
if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened)
if(!fireaxe)
if(O:wielded)
user << "<span class='warning'>Unwield the axe first.</span>"
return
O:wielded = 0
O.update_icon()
//to_chat(user, "<span class='warning'>Unwield the axe first.</span>")
//return
fireaxe = O
user.remove_from_mob(O)
src.contents += O
user << "<span class='notice'>You place the fire axe back in the [src.name].</span>"
to_chat(user, "<span class='notice'>You place the fire axe back in the [src.name].</span>")
update_icon()
else
if(src.smashed)
@@ -91,11 +93,11 @@
spawn(10) update_icon()
return
else
user << "<span class='warning'>Resetting circuitry...</span>"
to_chat(user, "<span class='warning'>Resetting circuitry...</span>")
playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
if(do_after(user,20 * O.toolspeed))
src.locked = 1
user << "<span class = 'caution'> You re-enable the locking modules.</span>"
to_chat(user, "<span class = 'caution'> You re-enable the locking modules.</span>")
return
else
localopened = !localopened
@@ -116,13 +118,13 @@
hasaxe = 1
if(src.locked)
user <<"<span class='warning'>The cabinet won't budge!</span>"
to_chat(user, "<span class='warning'>The cabinet won't budge!</span>")
return
if(localopened)
if(fireaxe)
user.put_in_hands(fireaxe)
fireaxe = null
user << "<span class='notice'>You take the fire axe from the [name].</span>"
to_chat (user, "<span class='notice'>You take the fire axe from the [name].</span>")
src.add_fingerprint(user)
update_icon()
else
@@ -149,7 +151,7 @@
attack_tk(mob/user as mob)
if(localopened && fireaxe)
fireaxe.forceMove(loc)
user << "<span class='notice'>You telekinetically remove the fire axe.</span>"
to_chat(user, "<span class='notice'>You telekinetically remove the fire axe.</span>")
fireaxe = null
update_icon()
return
@@ -161,9 +163,9 @@
if (isrobot(usr) || src.locked || src.smashed)
if(src.locked)
usr << "<span class='warning'>The cabinet won't budge!</span>"
to_chat(usr, "<span class='warning'>The cabinet won't budge!</span>")
else if(src.smashed)
usr << "<span class='notice'>The protective glass is broken!</span>"
to_chat(usr, "<span class='notice'>The protective glass is broken!</span>")
return
localopened = !localopened
@@ -180,23 +182,23 @@
if(fireaxe)
usr.put_in_hands(fireaxe)
fireaxe = null
usr << "<span class='notice'>You take the Fire axe from the [name].</span>"
to_chat(usr, "<span class='notice'>You take the Fire axe from the [name].</span>")
else
usr << "<span class='notice'>The [src.name] is empty.</span>"
to_chat(usr, "<span class='notice'>The [src.name] is empty.</span>")
else
usr << "<span class='notice'>The [src.name] is closed.</span>"
to_chat(usr, "<span class='notice'>The [src.name] is closed.</span>")
update_icon()
attack_ai(mob/user as mob)
if(src.smashed)
user << "<span class='warning'>The security of the cabinet is compromised.</span>"
to_chat(user, "<span class='warning'>The security of the cabinet is compromised.</span>")
return
else
locked = !locked
if(locked)
user << "<span class='warning'>Cabinet locked.</span>"
to_chat(user, "<span class='warning'>Cabinet locked.</span>")
else
user << "<span class='notice'>Cabinet unlocked.</span>"
to_chat(user, "<span class='notice'>Cabinet unlocked.</span>")
return
update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
@@ -204,7 +204,7 @@
new /obj/item/device/radio/headset/heads/cmo(src)
new /obj/item/device/radio/headset/heads/cmo/alt(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/reagent_containers/hypospray(src)
new /obj/item/weapon/reagent_containers/hypospray/vial(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
new /obj/item/clothing/shoes/boots/winter/medical(src)
new /obj/item/weapon/storage/box/freezer(src)
@@ -243,21 +243,17 @@
New()
..()
new /obj/item/clothing/under/rank/psych(src)
new /obj/item/clothing/under/rank/psych/turtleneck(src)
new /obj/item/clothing/suit/straight_jacket(src)
new /obj/item/weapon/reagent_containers/glass/bottle/stoxin(src)
new /obj/item/weapon/reagent_containers/syringe(src)
new /obj/item/weapon/storage/pill_bottle/citalopram(src)
new /obj/item/weapon/reagent_containers/pill/methylphenidate(src)
new /obj/item/weapon/clipboard(src)
new /obj/item/weapon/folder/white(src)
new /obj/item/device/taperecorder(src)
new /obj/item/device/tape/random(src)
new /obj/item/device/tape/random(src)
new /obj/item/device/tape/random(src)
new /obj/item/device/camera(src)
new /obj/item/toy/plushie/therapy/blue(src)
new /obj/item/weapon/storage/box/pillbottles(src)
new /obj/item/weapon/storage/box/pillbottles(src)
new /obj/item/weapon/storage/box/beakers(src)
new /obj/item/weapon/storage/box/autoinjectors(src)
new /obj/item/weapon/storage/box/syringes(src)
new /obj/item/weapon/reagent_containers/dropper(src)
new /obj/item/weapon/reagent_containers/dropper(src)
new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
return
/obj/structure/closet/secure_closet/psych
@@ -274,8 +270,21 @@
New()
..()
new /obj/item/weapon/storage/box/pillbottles(src)
new /obj/item/weapon/storage/box/pillbottles(src)
new /obj/item/clothing/under/rank/psych(src)
new /obj/item/clothing/under/rank/psych/turtleneck(src)
new /obj/item/clothing/suit/straight_jacket(src)
new /obj/item/weapon/reagent_containers/glass/bottle/stoxin(src)
new /obj/item/weapon/reagent_containers/syringe(src)
new /obj/item/weapon/storage/pill_bottle/citalopram(src)
new /obj/item/weapon/reagent_containers/pill/methylphenidate(src)
new /obj/item/weapon/clipboard(src)
new /obj/item/weapon/folder/white(src)
new /obj/item/device/taperecorder(src)
new /obj/item/device/tape/random(src)
new /obj/item/device/tape/random(src)
new /obj/item/device/tape/random(src)
new /obj/item/device/camera(src)
new /obj/item/toy/plushie/therapy/blue(src)
return
/obj/structure/closet/secure_closet/medical_wall
@@ -276,15 +276,13 @@
..()
new /obj/item/clothing/accessory/badge/holo/detective(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/gunbox(src)
new /obj/item/weapon/storage/belt/detective(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/suit/storage/vest/detective(src)
new /obj/item/ammo_magazine/m45/rubber(src)
new /obj/item/ammo_magazine/m45/rubber(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/projectile/colt/detective(src)
new /obj/item/clothing/accessory/holster/armpit(src)
new /obj/item/device/flashlight/maglight(src)
new /obj/item/weapon/reagent_containers/food/drinks/flask/detflask(src)
+65
View File
@@ -0,0 +1,65 @@
/obj/structure/fitness
icon = 'icons/obj/stationobjs.dmi'
anchored = 1
var/being_used = 0
/obj/structure/fitness/punchingbag
name = "punching bag"
desc = "A punching bag."
icon_state = "punchingbag"
density = 1
var/list/hit_message = list("hit", "punch", "kick", "robust")
/obj/structure/fitness/punchingbag/attack_hand(var/mob/living/carbon/human/user)
if(!istype(user))
..()
return
if(user.nutrition < 20)
to_chat(user, "<span class='warning'>You need more energy to use the punching bag. Go eat something.</span>")
else
if(user.a_intent == I_HURT)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
flick("[icon_state]_hit", src)
playsound(src.loc, 'sound/effects/woodhit.ogg', 25, 1, -1)
user.do_attack_animation(src)
user.nutrition = user.nutrition - 5
to_chat(user, "<span class='warning'>You [pick(hit_message)] \the [src].</span>")
/obj/structure/fitness/weightlifter
name = "weightlifting machine"
desc = "A machine used to lift weights."
icon_state = "weightlifter"
var/weight = 1
var/list/qualifiers = list("with ease", "without any trouble", "with great effort")
/obj/structure/fitness/weightlifter/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
weight = ((weight) % qualifiers.len) + 1
to_chat(user, "You set the machine's weight level to [weight].")
/obj/structure/fitness/weightlifter/attack_hand(var/mob/living/carbon/human/user)
if(!istype(user))
return
if(user.loc != src.loc)
to_chat(user, "<span class='warning'>You must be on the weight machine to use it.</span>")
return
if(user.nutrition < 50)
to_chat(user, "<span class='warning'>You need more energy to lift weights. Go eat something.</span>")
return
if(being_used)
to_chat(user, "<span class='warning'>The weight machine is already in use by somebody else.</span>")
return
else
being_used = 1
playsound(src.loc, 'sound/effects/weightlifter.ogg', 50, 1)
user.set_dir(SOUTH)
flick("[icon_state]_[weight]", src)
if(do_after(user, 20 + (weight * 10)))
playsound(src.loc, 'sound/effects/weightdrop.ogg', 25, 1)
user.nutrition -= weight * 10
to_chat(user, "<span class='notice'>You lift the weights [qualifiers[weight]].</span>")
being_used = 0
else
to_chat(user, "<span class='notice'>Against your previous judgement, perhaps working out is not for you.</span>")
being_used = 0
+26 -101
View File
@@ -77,6 +77,9 @@
return
return
/obj/structure/morgue/attack_robot(mob/user)
if(Adjacent(user))
attack_hand(user)
/obj/structure/morgue/attack_hand(mob/user as mob)
if (src.connected)
@@ -156,6 +159,10 @@
connected = null
return ..()
/obj/structure/m_tray/attack_robot(mob/user)
if(Adjacent(user))
attack_hand(user)
/obj/structure/m_tray/attack_hand(mob/user as mob)
if (src.connected)
for(var/atom/movable/A as mob|obj in src.loc)
@@ -181,7 +188,7 @@
if (user != O)
for(var/mob/B in viewers(user, 3))
if ((B.client && !( B.blinded )))
B << "<span class='warning'>\The [user] stuffs [O] into [src]!</span>"
to_chat(B, "<span class='warning'>\The [user] stuffs [O] into [src]!</span>")
return
@@ -189,25 +196,16 @@
* Crematorium
*/
/obj/structure/crematorium
/obj/structure/morgue/crematorium
name = "crematorium"
desc = "A human incinerator. Works well on barbeque nights."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "crema1"
density = 1
var/obj/structure/c_tray/connected = null
anchored = 1.0
var/cremating = 0
var/id = 1
var/locked = 0
/obj/structure/crematorium/Destroy()
if(connected)
qdel(connected)
connected = null
return ..()
/obj/structure/crematorium/proc/update()
/obj/structure/morgue/crematorium/update()
if (src.connected)
src.icon_state = "crema0"
else
@@ -217,37 +215,7 @@
src.icon_state = "crema1"
return
/obj/structure/crematorium/ex_act(severity)
switch(severity)
if(1.0)
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
if(2.0)
if (prob(50))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
if(3.0)
if (prob(5))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
ex_act(severity)
qdel(src)
return
return
/obj/structure/crematorium/attack_hand(mob/user as mob)
// if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH
// user.show_message("<span class='warning'>Uh-oh, that was a bad idea.</span>", 1)
// //usr << "Uh-oh, that was a bad idea."
// src:loc:poison += 20000000
// src:loc:firelevel = src:loc:poison
// return
/obj/structure/morgue/crematorium/attack_hand(mob/user as mob)
if (cremating)
usr << "<span class='warning'>It's locked.</span>"
return
@@ -260,10 +228,10 @@
qdel(src.connected)
else if (src.locked == 0)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
src.connected = new /obj/structure/c_tray( src.loc )
step(src.connected, SOUTH)
src.connected = new /obj/structure/m_tray/c_tray( src.loc )
step(src.connected, EAST)
src.connected.layer = OBJ_LAYER
var/turf/T = get_step(src, SOUTH)
var/turf/T = get_step(src, EAST)
if (T.contents.Find(src.connected))
src.connected.connected = src
src.icon_state = "crema0"
@@ -276,7 +244,7 @@
src.add_fingerprint(user)
update()
/obj/structure/crematorium/attackby(P as obj, mob/user as mob)
/obj/structure/morgue/crematorium/attackby(P as obj, mob/user as mob)
if (istype(P, /obj/item/weapon/pen))
var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
if (user.get_active_hand() != P)
@@ -291,13 +259,13 @@
src.add_fingerprint(user)
return
/obj/structure/crematorium/relaymove(mob/user as mob)
/obj/structure/morgue/crematorium/relaymove(mob/user as mob)
if (user.stat || locked)
return
src.connected = new /obj/structure/c_tray( src.loc )
step(src.connected, SOUTH)
src.connected = new /obj/structure/m_tray/c_tray( src.loc )
step(src.connected, EAST)
src.connected.layer = OBJ_LAYER
var/turf/T = get_step(src, SOUTH)
var/turf/T = get_step(src, EAST)
if (T.contents.Find(src.connected))
src.connected.connected = src
src.icon_state = "crema0"
@@ -309,25 +277,22 @@
src.connected = null
return
/obj/structure/crematorium/proc/cremate(atom/A, mob/user as mob)
// for(var/obj/machinery/crema_switch/O in src) //trying to figure a way to call the switch, too drunk to sort it out atm
// if(var/on == 1)
// return
/obj/structure/morgue/crematorium/proc/cremate(atom/A, mob/user as mob)
if(cremating)
return //don't let you cremate something twice or w/e
if(contents.len <= 0)
for (var/mob/M in viewers(src))
M.show_message("<span class='warning'>You hear a hollow crackle.</span>", 1)
to_chat(M,"<span class='warning'>You hear a hollow crackle.</span>")
return
else
if(!isemptylist(src.search_contents_for(/obj/item/weapon/disk/nuclear)))
usr << "You get the feeling that you shouldn't cremate one of the items in the cremator."
to_chat(user,"You get the feeling that you shouldn't cremate one of the items in the cremator.")
return
for (var/mob/M in viewers(src))
M.show_message("<span class='warning'>You hear a roar as the crematorium activates.</span>", 1)
to_chat(M,"<span class='warning'>You hear a roar as the crematorium activates.</span>")
cremating = 1
locked = 1
@@ -363,51 +328,11 @@
/*
* Crematorium tray
*/
/obj/structure/c_tray
/obj/structure/m_tray/c_tray
name = "crematorium tray"
desc = "Apply body before burning."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "cremat"
density = 1
layer = 2.0
var/obj/structure/crematorium/connected = null
anchored = 1
throwpass = 1
/obj/structure/c_tray/Destroy()
if(connected && connected.connected == src)
connected.connected = null
connected = null
return ..()
/obj/structure/c_tray/attack_hand(mob/user as mob)
if (src.connected)
for(var/atom/movable/A as mob|obj in src.loc)
if (!( A.anchored ))
A.forceMove(src.connected)
//Foreach goto(26)
src.connected.connected = null
src.connected.update()
add_fingerprint(user)
//SN src = null
qdel(src)
return
return
/obj/structure/c_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
return
if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
return
if (!ismob(user) || user.stat || user.lying || user.stunned)
return
O.forceMove(src.loc)
if (user != O)
for(var/mob/B in viewers(user, 3))
if ((B.client && !( B.blinded )))
B << text("<span class='warning'>[] stuffs [] into []!</span>", user, O, src)
//Foreach goto(99)
return
/obj/machinery/button/crematorium
name = "crematorium igniter"
@@ -421,9 +346,9 @@
if(..())
return
if(src.allowed(user))
for (var/obj/structure/crematorium/C in world)
for (var/obj/structure/morgue/crematorium/C in world)
if (C.id == id)
if (!C.cremating)
C.cremate(user)
else
usr << "<span class='warning'>Access denied.</span>"
to_chat(user,"<span class='warning'>Access denied.</span>")
+4
View File
@@ -51,6 +51,8 @@ var/list/keyboard_sound = list ('sound/effects/keyboard/keyboard1.ogg','sound/ef
var/list/mechstep_sound = list('sound/mecha/mechstep1.ogg', 'sound/mecha/mechstep2.ogg')
var/list/bodyfall_sound = list('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg')
var/list/can_sound = list('sound/effects/can_open1.ogg','sound/effects/can_open2.ogg','sound/effects/can_open3.ogg','sound/effects/can_open4.ogg')
var/list/geiger_sound = list('sound/items/geiger1.ogg', 'sound/items/geiger2.ogg', 'sound/items/geiger3.ogg', 'sound/items/geiger4.ogg', 'sound/items/geiger5.ogg')
var/list/geiger_weak_sound = list('sound/items/geiger_weak1.ogg', 'sound/items/geiger_weak2.ogg', 'sound/items/geiger_weak3.ogg', 'sound/items/geiger_weak4.ogg')
//var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
@@ -186,4 +188,6 @@ var/const/FALLOFF_SOUNDS = 0.5
if ("canopen") soundin = pick(can_sound)
if ("mechstep") soundin = pick(mechstep_sound)
//if ("gunshot") soundin = pick(gun_sound)
if("geiger") soundin = pick(geiger_sound)
if("geiger_weak") soundin = pick(geiger_weak_sound)
return soundin
+2
View File
@@ -43,6 +43,8 @@
var/ooc_style = "everyone"
if(holder && !holder.fakekey)
ooc_style = "elevated"
if(holder.rights & R_EVENT)
ooc_style = "event_manager"
if(holder.rights & R_MOD)
ooc_style = "moderator"
if(holder.rights & R_DEBUG)
-15
View File
@@ -1223,21 +1223,6 @@ proc/admin_notice(var/message, var/rights)
if(istype(H))
H.regenerate_icons()
/*
helper proc to test if someone is an event manager or not. Got tired of writing this same check all over the place.
*/
/proc/is_eventM(client/C)
if(!istype(C))
return 0
if(!C.holder)
return 0
if(C.holder.rights == R_EVENT)
return 1
return 0
/proc/get_options_bar(whom, detail = 2, name = 0, link = 1, highlight_special = 1)
if(!whom)
return "<b>(*null*)</b>"
+4 -4
View File
@@ -100,18 +100,18 @@ var/datum/admin_secrets/admin_secrets = new()
/datum/admin_secret_item/admin_secret
category = /datum/admin_secret_category/admin_secrets
log = 0
permissions = R_ADMIN
permissions = R_ADMIN|R_EVENT
/datum/admin_secret_item/random_event
category = /datum/admin_secret_category/random_events
permissions = R_FUN
permissions = R_FUN|R_EVENT
warn_before_use = 1
/datum/admin_secret_item/fun_secret
category = /datum/admin_secret_category/fun_secrets
permissions = R_FUN
permissions = R_FUN|R_EVENT
warn_before_use = 1
/datum/admin_secret_item/final_solution
category = /datum/admin_secret_category/final_solutions
permissions = R_FUN|R_SERVER|R_ADMIN
permissions = R_FUN|R_SERVER|R_ADMIN|R_EVENT
+3 -7
View File
@@ -8,7 +8,6 @@ var/list/admin_verbs_default = list(
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify,
// /client/proc/check_antagonists, //shows all antags,
// /client/proc/cmd_mod_say,
/client/proc/cmd_eventM_check_new_players,
// /client/proc/deadchat //toggles deadchat on/off,
// /client/proc/toggle_ahelp_sound,
)
@@ -330,11 +329,11 @@ var/list/admin_verbs_mod = list(
)
var/list/admin_verbs_event_manager = list(
/client/proc/cmd_event_say,
/client/proc/cmd_admin_pm_context,
/client/proc/cmd_admin_pm_panel,
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost,
/client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
/client/proc/dsay,
/client/proc/cmd_admin_subtle_message,
@@ -448,9 +447,6 @@ var/list/admin_verbs_event_manager = list(
feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_ghost()
set category = "Admin"
set name = "Aghost"
@@ -461,7 +457,7 @@ var/list/admin_verbs_event_manager = list(
if(ghost.can_reenter_corpse)
ghost.reenter_corpse()
else
ghost << "<font color='red'>Error: Aghost: Can't reenter corpse, event managers that use adminHUD while aghosting are not permitted to enter their corpse again</font>"
to_chat(ghost, "<font color='red'>Error: Aghost: Can't reenter corpse.</font>")
return
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -777,7 +773,7 @@ var/list/admin_verbs_event_manager = list(
set category = "Admin"
if(holder)
if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someont promoting you.",,"Yes","No") == "Yes")
if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someone promoting you.",,"Yes","No") == "Yes")
log_admin("[src] deadmined themself.")
message_admins("[src] deadmined themself.", 1)
deadmin()
+7 -13
View File
@@ -363,20 +363,14 @@
<td align=center><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>
"}
if(usr.client)
var/client/C = usr.client
if(is_eventM(C))
dat += {"<td align=center> N/A </td>"}
else
switch(is_special_character(M))
if(0)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
if(1)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
if(2)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
switch(is_special_character(M))
if(0)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"}
if(1)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"}
if(2)
dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"}
else
dat += {"<td align=center> N/A </td>"}
+3 -2
View File
@@ -36,7 +36,8 @@
if(check_rights(R_ADMIN, 0))
sender_name = "<span class='admin'>[sender_name]</span>"
for(var/client/C in admins)
C << "<span class='mod_channel'>" + create_text_tag("mod", "MOD:", C) + " <span class='name'>[sender_name]</span>([admin_jump_link(mob, C.holder)]): <span class='message'>[msg]</span></span>"
if(check_rights(R_ADMIN|R_MOD|R_SERVER))
C << "<span class='mod_channel'>" + create_text_tag("mod", "MOD:", C) + " <span class='name'>[sender_name]</span>([admin_jump_link(mob, C.holder)]): <span class='message'>[msg]</span></span>"
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -45,7 +46,7 @@
set name = "Esay"
set hidden = 1
if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER))
if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER|R_EVENT))
return
msg = sanitize(msg)
-36
View File
@@ -65,42 +65,6 @@
message_admins("<font color='blue'><B>SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]</B></font>", 1)
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_eventM_check_new_players() //Allows event managers / admins to determine who the newer players are.
set category = "Admin"
set name = "Check new Players"
if(!holder)
src << "Only staff members may use this command."
var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
if(age == "All")
age = 9999999
else
age = text2num(age)
var/missing_ages = 0
var/msg = ""
var/highlight_special_characters = 1
if(is_eventM(usr.client))
highlight_special_characters = 0
for(var/client/C in clients)
if(C.player_age == "Requires database")
missing_ages = 1
continue
if(C.player_age < age)
msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old<br>"
if(missing_ages)
src << "Some accounts did not have proper ages set in their clients. This function requires database to be present"
if(msg != "")
src << browse(msg, "window=Player_age_check")
else
src << "No matches for that age range found."
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
set category = "Special Verbs"
set name = "Global Narrate"
@@ -72,6 +72,25 @@
Regardless, you find it quite difficult to land shots where you wanted them to go."
modifier_type = /datum/modifier/trait/inaccurate
/datum/trait/modifier/physical/smaller
name = "Smaller"
modifier_type = /datum/modifier/trait/smaller
mutually_exclusive = list(/datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger)
/datum/trait/modifier/physical/small
name = "Small"
modifier_type = /datum/modifier/trait/small
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger)
/datum/trait/modifier/physical/large
name = "Large"
modifier_type = /datum/modifier/trait/large
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/larger)
/datum/trait/modifier/physical/larger
name = "Larger"
modifier_type = /datum/modifier/trait/larger
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large)
// These two traits might be borderline, feel free to remove if they get abused.
/datum/trait/modifier/physical/high_metabolism
@@ -150,20 +150,20 @@
item_state_slots = list(slot_r_hand_str = "medical_voidsuit_bio", slot_l_hand_str = "medical_voidsuit_bio")
armor = list(melee = 45, bullet = 5, laser = 20, energy = 5, bomb = 15, bio = 100, rad = 75)
//Medical Surplus Voidsuit
//Medical Streamlined Voidsuit
/obj/item/clothing/head/helmet/space/void/medical/alt
name = "streamlined medical voidsuit helmet"
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a fetching green."
icon_state = "rig0-medicalalt"
armor = list(melee = 30, bullet = 5, laser = 10,energy = 5, bomb = 5, bio = 100, rad = 60)
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
light_overlay = "helmet_light_dual_green"
/obj/item/clothing/suit/space/void/medical/alt
icon_state = "rig-medicalalt"
name = "streamlined medical voidsuit"
desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology, without sacrificing comfort or style."
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
armor = list(melee = 30, bullet = 5, laser = 10,energy = 5, bomb = 5, bio = 100, rad = 60)
slowdown = 0
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
//Security
/obj/item/clothing/head/helmet/space/void/security
+1
View File
@@ -49,6 +49,7 @@
/var/list/economic_species_modifier = list(
/datum/species/human = 10,
/datum/species/human/vatgrown = 10,
/datum/species/skrell = 12,
/datum/species/unathi = 7,
/datum/species/tajaran = 7,
@@ -18,7 +18,9 @@
else
io_list.Add(new io_type(src, io_entry, default_data))
/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, var/new_data)
/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, datum/new_data)
if (istype(new_data) && !isweakref(new_data))
new_data = weakref(new_data)
var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number)
return pin.write_data_to_pin(new_data)
@@ -112,6 +112,8 @@ list[](
/datum/integrated_io/proc/write_data_to_pin(var/new_data)
if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want.
if(istext(new_data))
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
data = new_data
holder.on_data_written()
@@ -4,11 +4,14 @@
/datum/integrated_io/string/ask_for_pin_data(mob/user)
var/new_data = input("Please type in a string.","[src] string writing") as null|text
if(holder.check_interactivity(user) )
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(new_data && holder.check_interactivity(user) )
to_chat(user, "<span class='notice'>You input [new_data ? "new_data" : "NULL"] into the pin.</span>")
write_data_to_pin(new_data)
/datum/integrated_io/string/write_data_to_pin(var/new_data)
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(isnull(new_data) || istext(new_data))
data = new_data
holder.on_data_written()
@@ -125,6 +125,7 @@
if("string")
accepting_refs = 0
new_data = input("Now type in a string.","[src] string writing") as null|text
new_data = sanitizeSafe(new_data, MAX_MESSAGE_LEN, 0, 0)
if(istext(new_data) && CanInteract(user, physical_state))
data_to_write = new_data
to_chat(user, "<span class='notice'>You set \the [src]'s memory to \"[new_data]\".</span>")
@@ -29,6 +29,28 @@
if(assembly)
assembly.give_power(adjusted_power)
/obj/item/integrated_circuit/passive/power/starter
name = "starter"
desc = "This tiny circuit will send a pulse right after device is turned on, or when power is restored."
icon_state = "led"
complexity = 1
activators = list("pulse out" = IC_PINTYPE_PULSE_OUT)
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
var/is_charge=0
/obj/item/integrated_circuit/passive/power/starter/make_energy()
if(assembly.battery)
if(assembly.battery.charge)
if(!is_charge)
activate_pin(1)
is_charge=1
else
is_charge=0
else
is_charge=0
return FALSE
// For implants.
/obj/item/integrated_circuit/passive/power/metabolic_siphon
name = "metabolic siphon"
@@ -82,6 +104,44 @@
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
spawn_flags = IC_SPAWN_RESEARCH
var/power_amount = 250
//fuel cell
/obj/item/integrated_circuit/passive/power/chemical_cell
name = "fuel cell"
desc = "Produces electricity from chemicals."
icon_state = "chemical_cell"
extended_desc = "This is effectively an internal beaker. It will consume and produce power from phoron, slime jelly, welding fuel, carbon,\
ethanol, nutriments and blood, in order of decreasing efficiency. It will consume fuel only if the battery can take more energy."
flags = OPENCONTAINER
complexity = 4
inputs = list()
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
var/volume = 60
var/list/fuel = list("phoron" = 50000, "slimejelly" = 25000, "fuel" = 15000, "carbon" = 10000, "ethanol"= 10000, "nutriment" =8000, "blood" = 5000)
/obj/item/integrated_circuit/passive/power/chemical_cell/New()
..()
create_reagents(volume)
/obj/item/integrated_circuit/passive/power/chemical_cell/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
/obj/item/integrated_circuit/passive/power/chemical_cell/make_energy()
if(assembly)
for(var/I in fuel)
if((assembly.battery.maxcharge-assembly.battery.charge) / CELLRATE > fuel[I])
if(reagents.remove_reagent(I, 1))
assembly.give_power(fuel[I])
// For really fat machines.
/obj/item/integrated_circuit/passive/power/relay/large
@@ -27,13 +27,10 @@
/obj/item/integrated_circuit/transfer/multiplexer/do_work()
var/input_index = get_pin_data(IC_INPUT, 1)
var/output = null
if(!isnull(input_index) && (input_index >= 1 && input_index < inputs.len))
output = get_pin_data(IC_INPUT, input_index + 1)
set_pin_data(IC_OUTPUT, 1, output)
push_data()
set_pin_data(IC_OUTPUT, 1,get_pin_data(IC_INPUT, input_index + 1))
push_data()
activate_pin(2)
/obj/item/integrated_circuit/transfer/multiplexer/medium
@@ -79,10 +76,8 @@
/obj/item/integrated_circuit/transfer/demultiplexer/do_work()
var/output_index = get_pin_data(IC_INPUT, 1)
var/output = get_pin_data(IC_INPUT, 2)
for(var/i = 1 to outputs.len)
set_pin_data(IC_OUTPUT, i, i == output_index ? output : null)
set_pin_data(IC_OUTPUT, i, i == output_index ? get_pin_data(IC_INPUT, 2) : null)
activate_pin(2)
@@ -101,4 +96,51 @@
name = "sixteen demultiplexer"
icon_state = "dmux16"
w_class = ITEMSIZE_SMALL
number_of_outputs = 16
/obj/item/integrated_circuit/transfer/pulsedemultiplexer
name = "two pulse demultiplexer"
desc = "Selector switch to choose the pin to be activated by number."
extended_desc = "The first input pin is used to select which of the pulse out pins will be activated after activation of the circuit. \
If the output selection is outside the valid range then no output is given."
complexity = 2
icon_state = "dmux2"
inputs = list("output selection" = IC_PINTYPE_NUMBER)
outputs = list()
activators = list("select" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 4
var/number_of_outputs = 2
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/New()
for(var/i = 1 to number_of_outputs)
// outputs += "output [i]"
activators["output [i]"] = IC_PINTYPE_PULSE_OUT
complexity = number_of_outputs
..()
desc += " It has [number_of_outputs] output pins."
extended_desc += " This pulse demultiplexer has a range from 1 to [activators.len - 1]."
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/do_work()
var/output_index = get_pin_data(IC_INPUT, 1)
if(output_index == Clamp(output_index, 1, number_of_outputs))
activate_pin(round(output_index + 1 ,1))
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium
name = "four pulse demultiplexer"
icon_state = "dmux4"
number_of_outputs = 4
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/large
name = "eight pulse demultiplexer"
icon_state = "dmux8"
w_class = ITEMSIZE_SMALL
number_of_outputs = 8
/obj/item/integrated_circuit/transfer/pulsedemultiplexer/huge
name = "sixteen pulse demultiplexer"
icon_state = "dmux16"
w_class = ITEMSIZE_SMALL
number_of_outputs = 16
@@ -110,8 +110,10 @@
/obj/item/integrated_circuit/input/adv_med_scanner
name = "integrated advanced medical analyser"
desc = "A very small version of the medbot's medical analyser. This allows the machine to know how healthy someone is. \
name = "integrated advanced medical analyzer"
desc = "A very small version of the medibot's medical analyzer. This allows the machine to know how healthy someone is. \
This type is much more precise, allowing the machine to know much more about the target than a normal analyzer."
icon_state = "medscan_adv"
complexity = 12
@@ -134,7 +136,9 @@
var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living/carbon/human)
if(!istype(H)) //Invalid input
return
if(H in view(get_turf(H))) // Like medbot's analyzer it can be used in range..
var/total_health = round(H.health/H.getMaxHealth(), 0.01)*100
var/missing_health = H.getMaxHealth() - H.health
@@ -336,6 +340,7 @@
// Set the pins so when someone sees them, they won't show as null
set_pin_data(IC_INPUT, 1, frequency)
set_pin_data(IC_INPUT, 2, code)
push_data()
/obj/item/integrated_circuit/input/signaler/Destroy()
if(radio_controller)
@@ -464,6 +469,7 @@
set_pin_data(IC_OUTPUT, 1, null)
set_pin_data(IC_OUTPUT, 2, null)
if(!T)
push_data()
return
set_pin_data(IC_OUTPUT, 1, T.x)
@@ -486,7 +492,7 @@
"speaker" = IC_PINTYPE_STRING,
"message" = IC_PINTYPE_STRING
)
activators = list("on message received" = IC_PINTYPE_PULSE_IN, "on translation" = IC_PINTYPE_PULSE_OUT)
activators = list("on message received" = IC_PINTYPE_PULSE_OUT, "on translation" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 15
@@ -618,7 +624,6 @@
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/atmo_scanner
name = "integrated atmospheric analyser"
desc = "The same atmospheric analysis module that is integrated into every PDA. \
@@ -850,4 +855,4 @@
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
activate_pin(2)
@@ -52,12 +52,123 @@
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/search
name = "search circuit"
desc = "This circuit will give index of desired element in the list."
extended_desc = "Search will start at 1 position and will return first matching position."
inputs = list(
"list" = IC_PINTYPE_LIST,
"item" = IC_PINTYPE_ANY
)
outputs = list(
"index" = IC_PINTYPE_NUMBER
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/search/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/item = get_pin_data(IC_INPUT, 2)
set_pin_data(IC_OUTPUT, 1, input_list.Find(item))
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/at
name = "at circuit"
desc = "This circuit will pick an element from a list by index."
extended_desc = "If there is no element with such index, result will be null."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_NUMBER
)
outputs = list("item" = IC_PINTYPE_ANY)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/at/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/index = get_pin_data(IC_INPUT, 2)
var/item = input_list[index]
set_pin_data(IC_OUTPUT, 1, item)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/delete
name = "delete circuit"
desc = "This circuit will delete the element from a list by index."
extended_desc = "If there is no element with such index, result list will be unchanged."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_NUMBER
)
outputs = list(
"item" = IC_PINTYPE_LIST
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/delete/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/list/red_list = list()
var/index = get_pin_data(IC_INPUT, 2)
var/j = 0
for(var/I in input_list)
j = j + 1
if(j != index)
red_list.Add(I)
set_pin_data(IC_OUTPUT, 1, red_list)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/write
name = "write circuit"
desc = "This circuit will write element in list with given index."
extended_desc = "If there is no element with such index, it will give the same list, as before."
inputs = list(
"list" = IC_PINTYPE_LIST,
"index" = IC_PINTYPE_NUMBER,
"item" = IC_PINTYPE_ANY
)
outputs = list(
"redacted list" = IC_PINTYPE_LIST
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/write/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
var/index = get_pin_data(IC_INPUT, 2)
var/item = get_pin_data(IC_INPUT, 3)
input_list[index] = item
set_pin_data(IC_OUTPUT, 1, input_list)
push_data()
activate_pin(2)
obj/item/integrated_circuit/list/len
name = "len circuit"
desc = "This circuit will give length of the list."
inputs = list(
"list" = IC_PINTYPE_LIST,
)
outputs = list(
"item" = IC_PINTYPE_NUMBER
)
icon_state = "addition"
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/list/len/do_work()
var/list/input_list = get_pin_data(IC_INPUT, 1)
set_pin_data(IC_OUTPUT, 1, input_list.len)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/list/jointext
name = "join text circuit"
desc = "This circuit will add all elements of a list into one string, seperated by a character."
extended_desc = "Default settings will encode the entire list into a string."
inputs = list(
"list to join" = IC_PINTYPE_LIST,
"list to join" = IC_PINTYPE_LIST,//
"delimiter" = IC_PINTYPE_CHAR,
"start" = IC_PINTYPE_NUMBER,
"end" = IC_PINTYPE_NUMBER
@@ -40,8 +40,15 @@
O.push_data()
activate_pin(2)
/obj/item/integrated_circuit/memory/tiny
name = "small memory circuit"
desc = "This circuit can store two pieces of data."
icon_state = "memory2"
power_draw_per_use = 2
number_of_pins = 2
/obj/item/integrated_circuit/memory/medium
name = "memory circuit"
name = "medium memory circuit"
desc = "This circuit can store four pieces of data."
icon_state = "memory4"
power_draw_per_use = 2
@@ -37,9 +37,7 @@
amount_to_move = 20000
/obj/item/integrated_circuit/power/transmitter/do_work()
set_pin_data(IC_OUTPUT, 1, null)
set_pin_data(IC_OUTPUT, 2, null)
set_pin_data(IC_OUTPUT, 3, null)
var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
if(AM)
if(!assembly)
@@ -72,7 +70,15 @@
set_pin_data(IC_OUTPUT, 2, cell.maxcharge)
set_pin_data(IC_OUTPUT, 3, cell.percent())
activate_pin(2)
push_data()
return TRUE
else
set_pin_data(IC_OUTPUT, 1, null)
set_pin_data(IC_OUTPUT, 2, null)
set_pin_data(IC_OUTPUT, 3, null)
activate_pin(2)
push_data()
return FALSE
return FALSE
/obj/item/integrated_circuit/power/transmitter/large/do_work()
@@ -1,6 +1,8 @@
/obj/item/integrated_circuit/reagent
category_text = "Reagent"
var/volume = 0
unacidable = 1
phoronproof = 1
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/New()
@@ -18,13 +20,23 @@
complexity = 20
cooldown_per_use = 30 SECONDS
inputs = list()
outputs = list()
activators = list("create smoke" = IC_PINTYPE_PULSE_IN)
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list("create smoke" = IC_PINTYPE_PULSE_IN,"on smoked" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 3)
volume = 100
power_draw_per_use = 20
/obj/item/integrated_circuit/reagent/smoke/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
/obj/item/integrated_circuit/reagent/smoke/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/reagent/smoke/do_work()
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new()
@@ -33,52 +45,141 @@
for(var/i = 1 to 8)
smoke_system.start()
reagents.clear_reagents()
activate_pin(2)
/obj/item/integrated_circuit/reagent/injector
name = "integrated hypo-injector"
desc = "This scary looking thing is able to pump liquids into whatever it's pointed at."
icon_state = "injector"
extended_desc = "This autoinjector can push reagents into another container or someone else outside of the machine. The target \
must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing."
must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing. A negative amount makes the injector draw out reagents."
flags = OPENCONTAINER
complexity = 20
cooldown_per_use = 6 SECONDS
inputs = list("target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER)
inputs_default = list("2" = 5)
outputs = list()
activators = list("inject" = IC_PINTYPE_PULSE_IN)
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list("inject" = IC_PINTYPE_PULSE_IN, "on injected" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
volume = 30
power_draw_per_use = 15
var/direc = 1
var/transfer_amount = 10
/obj/item/integrated_circuit/reagent/injector/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/reagent/injector/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
/obj/item/integrated_circuit/reagent/injector/on_data_written()
var/new_amount = get_pin_data(IC_INPUT, 2)
if(new_amount < 0)
new_amount = -new_amount
direc = 0
else
direc = 1
if(isnum(new_amount))
new_amount = Clamp(new_amount, 0, volume)
transfer_amount = new_amount
/obj/item/integrated_circuit/reagent/injector/proc/inject_amount()
var/amount = get_pin_data(IC_INPUT, 2)
if(isnum(amount))
return Clamp(amount, 0, 30)
/obj/item/integrated_circuit/reagent/injector/do_work()
set waitfor = 0 // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing
var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
if(!istype(AM)) //Invalid input
activate_pin(3)
return
if(!reagents.total_volume) // Empty
return
if(AM.can_be_injected_by(src))
if(isliving(AM))
var/mob/living/L = AM
var/turf/T = get_turf(AM)
T.visible_message("<span class='warning'>[src] is trying to inject [L]!</span>")
sleep(3 SECONDS)
if(!L.can_be_injected_by(src))
if(direc == 1)
if(!istype(AM)) //Invalid input
activate_pin(3)
return
if(!reagents.total_volume) // Empty
activate_pin(3)
return
if(AM.can_be_injected_by(src))
if(isliving(AM))
var/mob/living/L = AM
var/turf/T = get_turf(AM)
T.visible_message("<span class='warning'>[src] is trying to inject [L]!</span>")
sleep(3 SECONDS)
if(!L.can_be_injected_by(src))
activate_pin(3)
return
var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(L, transfer_amount, CHEM_BLOOD)
message_admins("[src] injected \the [L] with [trans]u of [contained].")
to_chat(AM, "<span class='notice'>You feel a tiny prick!</span>")
visible_message("<span class='warning'>[src] injects [L]!</span>")
else
reagents.trans_to(AM, transfer_amount)
else
if(reagents.total_volume >= volume) // Full
activate_pin(3)
return
var/obj/target = AM
if(!target.reagents)
activate_pin(3)
return
var/turf/TS = get_turf(src)
var/turf/TT = get_turf(AM)
if(!TS.Adjacent(TT))
activate_pin(3)
return
var/tramount = Clamp(min(transfer_amount, reagents.maximum_volume - reagents.total_volume), 0, reagents.maximum_volume)
if(ismob(target))//Blood!
if(istype(target, /mob/living/carbon))
var/mob/living/carbon/T = target
if(!T.dna)
if(T.reagents.trans_to_obj(src, tramount))
activate_pin(2)
else
activate_pin(3)
return
if(NOCLONE in T.mutations) //target done been et, no more blood in him
if(T.reagents.trans_to_obj(src, tramount))
activate_pin(2)
else
activate_pin(3)
return
return
var/datum/reagent/B
if(istype(T, /mob/living/carbon/human))
var/mob/living/carbon/human/H = T
if(H.species && !H.should_have_organ(O_HEART))
H.reagents.trans_to_obj(src, tramount)
else
B = T.take_blood(src, tramount)
else
B = T.take_blood(src,tramount)
if (B)
reagents.reagent_list |= B
reagents.update_total()
on_reagent_change()
reagents.handle_reactions()
B = null
visible_message( "<span class='notice'>Machine takes a blood sample from [target].</span>")
else
activate_pin(3)
return
var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(L, inject_amount(), CHEM_BLOOD)
message_admins("[src] injected \the [L] with [trans]u of [contained].")
to_chat(AM, "<span class='notice'>You feel a tiny prick!</span>")
visible_message("<span class='warning'>[src] injects [L]!</span>")
else
reagents.trans_to(AM, inject_amount())
else //if not mob
if(!target.reagents.total_volume)
visible_message( "<span class='notice'>[target] is empty.</span>")
activate_pin(3)
return
target.reagents.trans_to_obj(src, tramount)
activate_pin(2)
/obj/item/integrated_circuit/reagent/pump
name = "reagent pump"
@@ -96,11 +197,17 @@
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
var/transfer_amount = 10
var/direc = 1
power_draw_per_use = 10
/obj/item/integrated_circuit/reagent/pump/on_data_written()
var/new_amount = get_pin_data(IC_INPUT, 3)
if(!isnull(new_amount))
if(new_amount < 0)
new_amount = -new_amount
direc = 0
else
direc = 1
if(isnum(new_amount))
new_amount = Clamp(new_amount, 0, 50)
transfer_amount = new_amount
@@ -111,17 +218,23 @@
if(!istype(source) || !istype(target)) //Invalid input
return
var/turf/T = get_turf(src)
if(source.Adjacent(T) && target.Adjacent(T))
var/turf/TS = get_turf(source)
var/turf/TT = get_turf(target)
if(TS.Adjacent(T) && TT.Adjacent(T))
if(!source.reagents || !target.reagents)
return
if(ismob(source) || ismob(target))
return
if(!source.is_open_container() || !target.is_open_container())
return
if(!target.reagents.get_free_space())
return
source.reagents.trans_to(target, transfer_amount)
if(direc)
if(!target.reagents.get_free_space())
return
source.reagents.trans_to(target, transfer_amount)
else
if(!source.reagents.get_free_space())
return
target.reagents.trans_to(source, transfer_amount)
activate_pin(2)
/obj/item/integrated_circuit/reagent/storage
@@ -132,12 +245,18 @@
flags = OPENCONTAINER
complexity = 4
inputs = list()
outputs = list("volume used" = IC_PINTYPE_NUMBER)
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
volume = 60
/obj/item/integrated_circuit/reagent/storage/interact(mob/user)
set_pin_data(IC_OUTPUT, 2, weakref(src))
push_data()
..()
/obj/item/integrated_circuit/reagent/storage/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
@@ -150,4 +269,95 @@
flags = OPENCONTAINER | NOREACT
complexity = 8
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
origin_tech = list(TECH_MATERIALS = 4, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/storage/big
name = "big reagent storage"
desc = "Stores liquid inside, and away from electrical components. Can store up to 180u."
icon_state = "reagent_storage_big"
extended_desc = "This is effectively an internal beaker."
flags = OPENCONTAINER
complexity = 16
volume = 180
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_MATERIALS = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/storage/scan
name = "reagent scanner"
desc = "Stores liquid inside, and away from electrical components. Can store up to 60u. On pulse this beaker will send list of contained reagents."
icon_state = "reagent_scan"
extended_desc = "Mostly useful for reagent filter."
flags = OPENCONTAINER
complexity = 8
outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF,"list of reagents" = IC_PINTYPE_LIST)
activators = list("scan" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_MATERIALS = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/storage/scan/do_work()
var/cont[0]
for(var/datum/reagent/RE in reagents.reagent_list)
cont += RE.id
set_pin_data(IC_OUTPUT, 3, cont)
push_data()
/obj/item/integrated_circuit/reagent/filter
name = "reagent filter"
desc = "Filtering liquids by list of desired or unwanted reagents."
icon_state = "reagent_filter"
extended_desc = "This is a filter which will move liquids from the source ref to the target ref. \
It will move all reagents, except list, given in fourth pin if amount value is positive.\
Or it will move only desired reagents if amount is negative, The third pin determines \
how much reagent is moved per pulse, between 0 and 50. Amount is given for each separate reagent."
flags = OPENCONTAINER
complexity = 8
inputs = list("source" = IC_PINTYPE_REF, "target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER, "list of reagents" = IC_PINTYPE_LIST)
inputs_default = list("3" = 5)
outputs = list()
activators = list("transfer reagents" = IC_PINTYPE_PULSE_IN, "on transfer" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
var/transfer_amount = 10
var/direc = 1
power_draw_per_use = 10
/obj/item/integrated_circuit/reagent/filter/on_data_written()
var/new_amount = get_pin_data(IC_INPUT, 3)
if(new_amount < 0)
new_amount = -new_amount
direc = 0
else
direc = 1
if(isnum(new_amount))
new_amount = Clamp(new_amount, 0, 50)
transfer_amount = new_amount
/obj/item/integrated_circuit/reagent/filter/do_work()
var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable)
var/list/demand = get_pin_data(IC_INPUT, 4)
if(!istype(source) || !istype(target)) //Invalid input
return
var/turf/T = get_turf(src)
if(source.Adjacent(T) && target.Adjacent(T))
if(!source.reagents || !target.reagents)
return
if(ismob(source) || ismob(target))
return
if(!source.is_open_container() || !target.is_open_container())
return
if(!target.reagents.get_free_space())
return
for(var/datum/reagent/G in source.reagents.reagent_list)
if (!direc)
if(G.id in demand)
source.reagents.trans_id_to(target, G.id, transfer_amount)
else
if(!(G.id in demand))
source.reagents.trans_id_to(target, G.id, transfer_amount)
activate_pin(2)
push_data()
+7
View File
@@ -41,6 +41,7 @@
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Each point makes it 15% easier or harder, just like evasion.
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
var/icon_scale_percent // Makes the holder's icon get scaled up or down.
/datum/modifier/New(var/new_holder, var/new_origin)
holder = new_holder
@@ -62,6 +63,8 @@
holder.modifiers.Remove(src)
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
holder.update_modifier_visuals()
if(icon_scale_percent) // Correct the scaling.
holder.update_transform()
qdel(src)
// Override this for special effects when it gets removed.
@@ -117,6 +120,8 @@
modifiers.Add(mod)
if(mod.mob_overlay_state)
update_modifier_visuals()
if(mod.icon_scale_percent)
update_transform()
return mod
@@ -198,6 +203,8 @@
effects += "Your metabolism is [metabolism_percent > 1.0 ? "faster" : "slower"], \
causing reagents in your body to process, and hunger to occur [multipler_to_percentage(metabolism_percent, TRUE)] [metabolism_percent > 1.0 ? "faster" : "slower"]."
if(!isnull(icon_scale_percent))
effects += "Your appearance is [multipler_to_percentage(icon_scale_percent, TRUE)] [icon_scale_percent > 1 ? "larger" : "smaller"]."
return jointext(effects, "<br>")
+25 -1
View File
@@ -58,4 +58,28 @@
desc = "Your body's metabolism is slower than average."
metabolism_percent = 0.5
incoming_healing_percent = 0.6
incoming_healing_percent = 0.6
/datum/modifier/trait/larger
name = "Larger"
desc = "Your body is larger than average."
icon_scale_percent = 1.2
/datum/modifier/trait/large
name = "Large"
desc = "Your body is a bit larger than average."
icon_scale_percent = 1.1
/datum/modifier/trait/small
name = "Small"
desc = "Your body is a bit smaller than average."
icon_scale_percent = 0.95
/datum/modifier/trait/smaller
name = "Smaller"
desc = "Your body is smaller than average."
icon_scale_percent = 0.9
+3 -4
View File
@@ -316,19 +316,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!client)
return
var/mentor = is_eventM(usr.client)
if(!config.antag_hud_allowed && (!client.holder || mentor))
if(!config.antag_hud_allowed && !client.holder)
src << "<font color='red'>Admins have disabled this for this round.</font>"
return
var/mob/observer/dead/M = src
if(jobban_isbanned(M, "AntagHUD"))
src << "<font color='red'><B>You have been banned from using this feature</B></font>"
return
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && (!client.holder || mentor))
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !client.holder)
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
if(response == "No") return
M.can_reenter_corpse = 0
if(!M.has_enabled_antagHUD && (!client.holder || mentor))
if(!M.has_enabled_antagHUD && !client.holder)
M.has_enabled_antagHUD = 1
if(M.antagHUD)
M.antagHUD = 0
@@ -15,7 +15,7 @@
if (I_GRAB)
if (M == src)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, M, src )
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M, src )
M.put_in_active_hand(G)
@@ -56,4 +56,4 @@
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("<font color='red'><B>[] has attempted to punch []!</B></font>", M, src), 1)
return
return
@@ -18,17 +18,9 @@
var/skiparms = 0
var/skipfeet = 0
var/cloaked = 0 // 0 for normal, 1 for cloaked close
if(mind && mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer))
var/distance = get_dist(user, src)
if(distance > 2)
src.loc.examine(user)
return
else
cloaked = 1
if(alpha <= 50)
src.loc.examine(user)
return
var/looks_synth = looksSynthetic()
@@ -97,8 +89,6 @@
if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
T = gender_datums[PLURAL]
if(cloaked)
T = gender_datums[NEUTER]
else if(species && species.ambiguous_genders)
var/can_detect_gender = FALSE
@@ -458,25 +448,18 @@
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a> <a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>\n"
if(print_flavor_text() && !cloaked)
if(print_flavor_text())
msg += "[print_flavor_text()]\n"
msg += "*---------*</span><br>"
msg += applying_pressure
if (pose && !cloaked)
if (pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "[T.He] [pose]"
user << jointext(msg, null)
/mob/living/carbon/human/get_description_fluff()
if(mind && mind.changeling && mind.changeling.cloaked)
return ""
else
return ..()
//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
/proc/hasHUD(mob/M as mob, hudtype)
if(istype(M, /mob/living/carbon/human))
@@ -318,8 +318,6 @@
//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere
/mob/living/carbon/human/proc/get_visible_name()
if( mind && mind.changeling && mind.changeling.cloaked)
return "Unknown"
if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible
return get_id_name("Unknown")
if( head && (head.flags_inv&HIDEFACE) )
@@ -1136,6 +1134,9 @@
if(species.default_language)
add_language(species.default_language)
if(species.icon_scale != 1)
update_transform()
if(species.base_color && default_colour)
//Apply colour.
r_skin = hex2num(copytext(species.base_color,2,4))
@@ -29,7 +29,6 @@
var/g_synth //Same as above
var/b_synth //Same as above
var/size_multiplier = 1 //multiplier for the mob's icon size
var/damage_multiplier = 1 //multiplies melee combat damage
var/icon_update = 1 //whether icon updating shall take place
@@ -11,7 +11,6 @@
// Icon/appearance vars.
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/icobase_add // Icon set for highlight blends when applicable.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
var/speech_bubble_appearance = "normal" // Part of icon_state to use for speech bubbles when talking. See talk.dmi for available icons.
@@ -29,9 +28,10 @@
var/tail // Name of tail state in species effects icon file.
var/tail_animation // If set, the icon to obtain tail animation states from.
var/tail_animation_add // Highlight overlay for tail.
var/tail_hair
var/icon_scale = 1 // Makes the icon larger/smaller.
var/race_key = 0 // Used for mob icon cache string.
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
var/mob_size = MOB_MEDIUM
@@ -10,9 +10,6 @@
/datum/species/proc/get_tail_animation(var/mob/living/carbon/human/H)
return tail_animation
/datum/species/proc/get_tail_animation_a(var/mob/living/carbon/human/H)
return tail_animation_add
/datum/species/proc/get_tail_hair(var/mob/living/carbon/human/H)
return tail_hair
@@ -31,9 +28,6 @@
/datum/species/proc/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
return (get_deform ? deform : icobase)
/datum/species/proc/get_icobase_a(var/mob/living/carbon/human/H)
return icobase_add
/datum/species/proc/get_station_variant()
return name
@@ -85,7 +85,7 @@ var/datum/species/shapeshifter/promethean/prometheans
/mob/living/carbon/human/proc/regenerate
)
valid_transform_species = list("Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
valid_transform_species = list("Human", "Vatborn", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey")
monochromatic = 1
var/heal_rate = 0.5 // Temp. Regen per tick.
@@ -26,9 +26,8 @@
tail_hair = "feathers"
reagent_tag = IS_TESHARI
icobase = 'icons/mob/human_races/r_seromi_m.dmi'
icobase_add = 'icons/mob/human_races/r_seromi_a.dmi'
deform = 'icons/mob/human_races/r_seromi_m.dmi'
icobase = 'icons/mob/human_races/r_seromi.dmi'
deform = 'icons/mob/human_races/r_seromi.dmi'
damage_overlays = 'icons/mob/human_races/masks/dam_seromi.dmi'
damage_mask = 'icons/mob/human_races/masks/dam_mask_seromi.dmi'
blood_mask = 'icons/mob/human_races/masks/blood_seromi.dmi'
@@ -25,12 +25,10 @@
/datum/species/unathi
name = "Unathi"
name_plural = "Unathi"
icobase = 'icons/mob/human_races/r_lizard_m.dmi'
icobase_add = 'icons/mob/human_races/r_lizard_a.dmi'
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
tail = "sogtail"
tail_animation = 'icons/mob/species/unathi/tail_m.dmi'
tail_animation_add = 'icons/mob/species/unathi/tail_a.dmi'
tail_animation = 'icons/mob/species/unathi/tail.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
primitive_form = "Stok"
darksight = 3
@@ -41,6 +39,8 @@
burn_mod = 0.85
metabolic_rate = 0.85
item_slowdown_mod = 0.5
mob_size = MOB_LARGE
blood_volume = 840
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_UNATHI)
name_language = LANGUAGE_UNATHI
@@ -130,12 +130,10 @@
/datum/species/tajaran
name = "Tajara"
name_plural = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran_m.dmi'
icobase_add = 'icons/mob/human_races/r_tajaran_a.dmi'
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
tail = "tajtail"
tail_animation = 'icons/mob/species/tajaran/tail_m.dmi'
tail_animation_add = 'icons/mob/species/tajaran/tail_a.dmi'
tail_animation = 'icons/mob/species/tajaran/tail.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
darksight = 8
slowdown = -0.5
@@ -213,8 +211,7 @@
/datum/species/skrell
name = "Skrell"
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell_m.dmi'
icobase_add = 'icons/mob/human_races/r_skrell_a.dmi'
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
primitive_form = "Neaera"
unarmed_types = list(/datum/unarmed_attack/punch)
@@ -159,16 +159,29 @@ Please contact me on #coderbus IRC. ~Carn x
for(var/inner_entry in entry)
overlays += inner_entry
update_transform()
/mob/living/carbon/human/update_transform()
// First, get the correct size.
var/desired_scale = icon_scale
desired_scale *= species.icon_scale
for(var/datum/modifier/M in modifiers)
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
// Regular stuff again.
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
var/matrix/M = matrix()
M.Turn(90)
M.Scale(size_multiplier)
M.Scale(desired_scale)
M.Translate(1,-6)
src.transform = M
else
var/matrix/M = matrix()
M.Scale(size_multiplier)
M.Translate(0, 16*(size_multiplier-1))
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
var/global/list/damage_icon_parts = list()
@@ -293,6 +306,8 @@ var/global/list/damage_icon_parts = list()
base_icon = chest.get_icon()
for(var/obj/item/organ/external/part in organs)
if(isnull(part) || part.is_stump())
continue
var/icon/temp = part.get_icon(skeleton)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
@@ -1133,22 +1148,14 @@ var/global/list/damage_icon_parts = list()
if(!tail_icon)
//generate a new one
var/species_tail_anim = species.get_tail_animation(src)
var/species_tail_anim_a = species.get_tail_animation_a(src)
if(!species_tail_anim)
species_tail_anim = 'icons/effects/species.dmi'
if(!species_tail_anim_a)
species_tail_anim_a = 'icons/effects/species_a.dmi'
if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi'
tail_icon = new/icon(species_tail_anim)
var/tail_icon_a = new/icon(species_tail_anim_a)
tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_MULTIPLY)
tail_icon.Blend(tail_icon_a, ICON_ADD)
tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
// The following will not work with animated tails.
var/use_species_tail = species.get_tail_hair(src)
if(use_species_tail)
var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]")
var/icon/hair_icon_a = icon('icons/effects/species_a.dmi', "[species.get_tail(src)]_[use_species_tail]")
hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
hair_icon.Blend(hair_icon_a, ICON_ADD)
hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
tail_icon.Blend(hair_icon, ICON_OVERLAY)
tail_icon_cache[icon_key] = tail_icon
+14
View File
@@ -1004,3 +1004,17 @@ default behaviour is:
// Called by job_controller.
/mob/living/proc/equip_post_job()
return
/mob/living/update_transform()
// First, get the correct size.
var/desired_scale = icon_scale
for(var/datum/modifier/M in modifiers)
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
// Now for the regular stuff.
var/matrix/M = matrix()
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
+1 -15
View File
@@ -17,10 +17,6 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/show_laws_verb,
/mob/living/silicon/ai/proc/toggle_acceleration,
/mob/living/silicon/ai/proc/toggle_hologram_movement,
/mob/living/silicon/ai/proc/toggle_hidden_verbs,
)
var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.com/1172/,
/mob/living/silicon/ai/proc/ai_announcement,
/mob/living/silicon/ai/proc/ai_call_shuttle,
/mob/living/silicon/ai/proc/ai_camera_track,
@@ -160,6 +156,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
add_language(LANGUAGE_EAL, 1)
add_language(LANGUAGE_SCHECHI, 1)
add_language(LANGUAGE_SIGN, 1)
add_language(LANGUAGE_ROOTLOCAL, 1)
if(!safety)//Only used by AIize() to successfully spawn an AI.
if (!B)//If there is no player/brain inside.
@@ -794,16 +791,5 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
if(rig)
rig.force_rest(src)
/mob/living/silicon/ai/proc/toggle_hidden_verbs()
set name = "Toggle Hidden Verbs"
set category = "AI Settings"
if(/mob/living/silicon/ai/proc/ai_announcement in verbs)
src << "Extra verbs toggled off."
verbs -= ai_verbs_hidden
else
src << "Extra verbs toggled on."
verbs |= ai_verbs_hidden
#undef AI_CHECK_WIRELESS
#undef AI_CHECK_RADIO
@@ -394,6 +394,11 @@
C.toggled = 1
src << "<font color='red'>You enable [C.name].</font>"
/mob/living/silicon/robot/verb/spark_plug() //So you can still sparkle on demand without violence.
set category = "Robot Commands"
set name = "Emit Sparks"
spark_system.start()
// this function displays jetpack pressure in the stat panel
/mob/living/silicon/robot/proc/show_jetpack_pressure()
// if you have a jetpack, show the internal tank pressure
@@ -637,7 +642,8 @@
else
if( !(istype(W, /obj/item/device/robotanalyzer) || istype(W, /obj/item/device/healthanalyzer)) )
spark_system.start()
if(W.force > 0)
spark_system.start()
return ..()
/mob/living/silicon/robot/attack_hand(mob/user)
@@ -90,6 +90,7 @@
var/assist_distance = 25 // Radius in which I'll ask my comrades for help.
var/supernatural = 0 // If the mob is supernatural (used in null-rod stuff for banishing?)
var/grab_resist = 75 // Chance of me resisting a grab attempt.
var/taser_kill = 1 // Is the mob weak to tasers
//Attack ranged settings
var/ranged = 0 // Do I attack at range?
@@ -1439,16 +1440,17 @@
//Shot with taser/stunvolver
/mob/living/simple_animal/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null)
var/stunDam = 0
var/agonyDam = 0
if(taser_kill)
var/stunDam = 0
var/agonyDam = 0
if(stun_amount)
stunDam += stun_amount * 0.5
adjustFireLoss(stunDam)
if(stun_amount)
stunDam += stun_amount * 0.5
adjustFireLoss(stunDam)
if(agony_amount)
agonyDam += agony_amount * 0.5
adjustFireLoss(agonyDam)
if(agony_amount)
agonyDam += agony_amount * 0.5
adjustFireLoss(agonyDam)
/mob/living/simple_animal/emp_act(severity)
if(!isSynthetic())
+1
View File
@@ -534,6 +534,7 @@
if(M != usr) return
if(usr == src) return
if(!Adjacent(usr)) return
if(usr.incapacitated(INCAPACITATION_STUNNED | INCAPACITATION_FORCELYING | INCAPACITATION_KNOCKOUT | INCAPACITATION_RESTRAINED)) return //Incapacitated.
if(istype(M,/mob/living/silicon/ai)) return
show_inv(usr)
+1 -1
View File
@@ -400,7 +400,7 @@ proc/is_blind(A)
return // Can't talk in deadchat if you can't see it.
for(var/mob/M in player_list)
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_eventM(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
if(M.client && (!istype(M, /mob/new_player) && M.stat == DEAD) && M.is_preference_enabled(/datum/client_preference/show_dsay))
var/follow
var/lname
if(M.forbid_seeing_deadchat && !M.client.holder)
@@ -324,7 +324,7 @@
name = "Overeye Long"
icon_state = "hair_longovereye"
fag
flowhair
name = "Flow Hair"
icon_state = "hair_f"
+2
View File
@@ -18,6 +18,8 @@
return 0
/obj/item/organ/internal/appendix/process()
..()
if(!inflamed || !owner)
return
+15 -15
View File
@@ -44,21 +44,6 @@
tmp_owner.internal_organs_by_name[organ_tag] = new replace_path(tmp_owner, 1)
tmp_owner = null
/obj/item/organ/internal/pariah_brain
name = "brain remnants"
desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
organ_tag = "brain"
parent_organ = BP_HEAD
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
vital = 1
/obj/item/organ/internal/brain/xeno
name = "thinkpan"
desc = "It looks kind of like an enormous wad of purple bubblegum."
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
/obj/item/organ/internal/brain/New()
..()
health = config.default_brain_health
@@ -127,6 +112,21 @@
target.key = brainmob.key
..()
/obj/item/organ/internal/pariah_brain
name = "brain remnants"
desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
organ_tag = "brain"
parent_organ = BP_HEAD
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
vital = 1
/obj/item/organ/internal/brain/xeno
name = "thinkpan"
desc = "It looks kind of like an enormous wad of purple bubblegum."
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
/obj/item/organ/internal/brain/slime
name = "slime core"
desc = "A complex, organic knot of jelly and crystalline particles."
+1
View File
@@ -9,6 +9,7 @@
/obj/item/organ/internal/kidneys/process()
..()
if(!owner) return
// Coffee is really bad for you with busted kidneys.
@@ -58,5 +58,7 @@
if (prob(3))
take_damage(1,silent=prob(30))
//if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE, others are handled on each specific organ
//Nothing that generic internal organs do for this
if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE
if (prob(50))
take_damage(1,silent=prob(15))
+16 -11
View File
@@ -91,6 +91,9 @@ var/list/organ_cache = list()
if(owner && vital)
owner.death()
/obj/item/organ/proc/adjust_germ_level(var/amount) // Unless you're setting germ level directly to 0, use this proc instead
germ_level = Clamp(germ_level + amount, 0, INFECTION_LEVEL_MAX)
/obj/item/organ/process()
if(loc != owner)
@@ -117,9 +120,9 @@ var/list/organ_cache = list()
if(config.organs_decay) damage += rand(1,3)
if(damage >= max_damage)
damage = max_damage
germ_level += rand(2,6)
adjust_germ_level(rand(2,6))
if(germ_level >= INFECTION_LEVEL_TWO)
germ_level += rand(2,6)
adjust_germ_level(rand(2,6))
if(germ_level >= INFECTION_LEVEL_THREE)
die()
@@ -158,12 +161,12 @@ var/list/organ_cache = list()
owner.adjustToxLoss(infection_damage)
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
germ_level--
adjust_germ_level(-1)
if (germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(antibiotics < 5 && prob(round(germ_level/6)))
germ_level++
adjust_germ_level(1)
if(germ_level >= INFECTION_LEVEL_ONE)
. = 1 //Organ qualifies for effect-specific processing
@@ -179,7 +182,7 @@ var/list/organ_cache = list()
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30)
. = 3 //Organ qualifies for effect-specific processing
germ_level++ //Germ_level increases without overdose of antibiotics
adjust_germ_level(rand(5,10)) //Germ_level increases without overdose of antibiotics
/obj/item/organ/proc/handle_rejection()
// Process unsuitable transplants. TODO: consider some kind of
@@ -193,13 +196,13 @@ var/list/organ_cache = list()
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
switch(rejecting)
if(1 to 50)
germ_level++
adjust_germ_level(1)
if(51 to 200)
germ_level += rand(1,2)
adjust_germ_level(rand(1,2))
if(201 to 500)
germ_level += rand(2,3)
adjust_germ_level(rand(2,3))
if(501 to INFINITY)
germ_level += rand(3,5)
adjust_germ_level(rand(3,5))
owner.reagents.add_reagent("toxin", rand(1,2))
/obj/item/organ/proc/receive_chem(chemical as obj)
@@ -238,9 +241,11 @@ var/list/organ_cache = list()
if (germ_level < INFECTION_LEVEL_ONE)
germ_level = 0 //cure instantly
else if (germ_level < INFECTION_LEVEL_TWO)
germ_level -= 6 //at germ_level == 500, this should cure the infection in a minute
adjust_germ_level(-6) //at germ_level < 500, this should cure the infection in a minute
else if (germ_level < INFECTION_LEVEL_THREE)
adjust_germ_level(-2) //at germ_level < 1000, this will cure the infection in 5 minutes
else
germ_level -= 2 //at germ_level == 1000, this will cure the infection in 5 minutes
adjust_germ_level(-1) // You waited this long to get treated, you don't really deserve this organ
//Adds autopsy data for used_weapon.
/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
+16 -19
View File
@@ -71,7 +71,7 @@ var/global/list/limb_icon_cache = list()
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
//Head markings, duplicated (sadly) below.
//Head markings.
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
@@ -132,22 +132,21 @@ var/global/list/limb_icon_cache = list()
mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
//Body markings, does not include head, duplicated (sadly) above.
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], ICON_ADD)
overlays |= mark_s //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
//Body markings, actually does not include head this time. Done separately above.
if(!istype(src,/obj/item/organ/external/head))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], ICON_ADD)
overlays |= mark_s //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
var/icon/IA = icon(species.get_icobase_a(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY)
I.Blend(IA, ICON_ADD)
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_ADD)
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
@@ -163,7 +162,10 @@ var/global/list/limb_icon_cache = list()
if(nonsolid)
applying.MapColors("#4D4D4D","#969696","#1C1C1C", "#000000")
applying.SetIntensity(0.7)
if(species && species.get_bodytype(owner) != "Human")
applying.SetIntensity(1.5) // Unathi, Taj and Skrell have -very- dark base icons.
else
applying.SetIntensity(0.7)
else if(status & ORGAN_DEAD)
icon_cache_key += "_dead"
@@ -177,12 +179,7 @@ var/global/list/limb_icon_cache = list()
applying.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
icon_cache_key += "_tone_[s_tone]"
else if(s_col && s_col.len >= 3)
applying.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_MULTIPLY)
var/gender = "f"
if(owner && owner.gender == MALE)
gender = "m"
var/icon_a = new /icon(species.get_icobase_a(owner), "[icon_name][gendered_icon ? "_[gender]" : ""]")
applying.Blend(icon_a, ICON_ADD)
applying.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD)
icon_cache_key += "_color_[s_col[1]]_[s_col[2]]_[s_col[3]]"
// Translucency.
+2 -2
View File
@@ -119,8 +119,8 @@
/obj/item/weapon/pen/reagent/paralysis/New()
..()
reagents.add_reagent("zombiepowder", 10)
reagents.add_reagent("cryptobiolin", 15)
reagents.add_reagent("zombiepowder", 5)
reagents.add_reagent("cryptobiolin", 10)
/*
* Chameleon pen
+2
View File
@@ -4,6 +4,8 @@
than the alternative."
icon_state = "gridchecker_on"
circuit = /obj/item/weapon/circuitboard/grid_checker
density = 1
anchored = 1
var/power_failing = FALSE // Turns to TRUE when the grid check event is fired by the Game Master, or perhaps a cheeky antag.
// Wire stuff below.
var/datum/wires/grid_checker/wires
@@ -159,6 +159,34 @@
name = "ammo clip (.45 flash)"
ammo_type = /obj/item/ammo_casing/a45f
/obj/item/ammo_magazine/s45
name = "speedloader (.45)"
icon_state = "45s"
ammo_type = /obj/item/ammo_casing/a45
matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal
caliber = ".45"
max_ammo = 7
multiple_sprites = 1
/obj/item/ammo_magazine/s45/empty
initial_ammo = 0
/obj/item/ammo_magazine/s45/rubber
name = "speedloader (.45 rubber)"
ammo_type = /obj/item/ammo_casing/a45r
/obj/item/ammo_magazine/s45/practice
name = "speedloader (.45 practice)"
ammo_type = /obj/item/ammo_casing/a45p
/obj/item/ammo_magazine/s45/flash
name = "speedloader (.45 flash)"
ammo_type = /obj/item/ammo_casing/a45f
/obj/item/ammo_magazine/s45/ap
name = "speedloader (.45 AP)"
ammo_type = /obj/item/ammo_casing/a45ap
///////// 9mm /////////
/obj/item/ammo_magazine/m9mm
@@ -23,7 +23,7 @@
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/colt/detective
desc = "A Martian recreation of an old Terran pistol. Uses .45 rounds."
desc = "A Martian recreation of an old pistol. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/m45/rubber
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
@@ -60,7 +60,8 @@
options["H&K VP"] = "VP78"
options["P08 Luger"] = "p08"
options["P08 Luger, Brown"] = "p08b"
var/choice = input(M,"What do you want the gun's sprite to be?","Resprite Gun") in options
options["Glock 37"] = "enforcer_black"
var/choice = input(M,"Choose your sprite!","Resprite Gun") in options
if(src && choice && !M.stat && in_range(M,src))
icon_state = options[choice]
unique_reskin = options[choice]
@@ -66,6 +66,58 @@
M << "You name the gun [input]. Say hello to your new friend."
return 1
/obj/item/weapon/gun/projectile/revolver/detective45
name = ".45 revolver"
desc = "A fancy replica of an old revolver, modified for .45 rounds and a seven-shot cylinder."
icon_state = "detective"
caliber = ".45"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
fire_sound = 'sound/weapons/gunshot_heavy.ogg'
ammo_type = /obj/item/ammo_casing/a45r
max_shells = 7
obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
set name = "Name Gun"
set category = "Object"
set desc = "Rename your gun. If you're the Detective."
var/mob/M = usr
if(!M.mind) return 0
var/job = M.mind.assigned_role
if(job != "Detective")
M << "<span class='notice'>You don't feel cool enough to name this gun, chump.</span>"
return 0
var/input = sanitizeSafe(input("What do you want to name the gun?", ,""), MAX_NAME_LEN)
if(src && input && !M.stat && in_range(M,src))
name = input
M << "You name the gun [input]. Say hello to your new friend."
return 1
/obj/item/weapon/gun/projectile/revolver/detective45/verb/reskin_gun()
set name = "Resprite gun"
set category = "Object"
set desc = "Click to choose a sprite for your gun."
var/mob/M = usr
var/list/options = list()
options["Colt Detective Special"] = "detective"
options["Ruger GP100"] = "GP100"
options["Colt Single Action Army"] = "detective_peacemaker"
options["Colt Single Action Army, Dark"] = "detective_peacemaker_dark"
options["H&K PT"] = "detective_panther"
options["Vintage LeMat"] = "lemat_old"
options["Webley MKVI "] = "webley"
var/choice = input(M,"Choose your sprite!","Resprite Gun") in options
if(src && choice && !M.stat && in_range(M,src))
icon_state = options[choice]
M << "Your gun is now sprited as [choice]. Say hello to your new friend."
return 1
// Blade Runner pistol.
/obj/item/weapon/gun/projectile/revolver/deckard
name = "\improper Deckard .38"
@@ -210,6 +210,7 @@
icon_state = "vial"
matter = list("glass" = 250)
volume = 30
w_class = ITEMSIZE_TINY
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25)
flags = OPENCONTAINER
@@ -76,6 +76,13 @@
..()
reagents.add_reagent("water",1000)
/obj/structure/reagent_dispensers/watertank/high/New()
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold vast amounts of water.."
icon_state = "watertank_high"
..()
reagents.add_reagent("water",4000)
/obj/structure/reagent_dispensers/fueltank
name = "fueltank"
desc = "A fueltank."
+2 -2
View File
@@ -5,7 +5,7 @@
icon_state = "generator0"
var/active = 0
var/field_radius = 3
var/max_field_radius = 100
var/max_field_radius = 150
var/list/field = list()
density = 1
var/locked = 0
@@ -323,4 +323,4 @@
T = locate(gen_turf.x + field_radius, gen_turf.y + y_offset, gen_turf.z)
if (T) out += T
return out
return out
+2 -1
View File
@@ -24,6 +24,7 @@ em {font-style: normal;font-weight: bold;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #1b521f;}
.ooc .admin {color: #b82e00;}
.ooc .event_manager {color: #660033;}
.ooc .aooc {color: #960018;}
/* Admin: Private Messages */
@@ -36,7 +37,7 @@ em {font-style: normal;font-weight: bold;}
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
.event_channel {color: #009933; font-weight: bold;}
.event_channel {color: #cc3399; font-weight: bold;}
/* Radio: Misc */
.deadsay {color: #530FAD;}
+7 -1
View File
@@ -12,7 +12,8 @@
/area/holodeck,
/area/supply/station,
/area/mine,
/area/vacant/vacant_shop
/area/vacant/vacant_shop,
/area/turbolift
)
var/list/exempt_from_atmos = typesof(/area/maintenance,
@@ -33,6 +34,11 @@
/area/vacant/vacant_shop
)
// Some maps have areas specific to the map, so include those.
exempt_areas += using_map.unit_test_exempt_areas
exempt_from_atmos += using_map.unit_test_exempt_from_atmos
exempt_from_apc += using_map.unit_test_exempt_from_apc
for(var/area/A in world)
if(A.z == 1 && !(A.type in exempt_areas))
area_test_count++
+14
View File
@@ -53,6 +53,20 @@
-->
<div class="commit sansserif">
<h2 class="date">06 November 2017</h2>
<h3 class="author">Atermonera updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">AI's can speak local rootspeak.</li>
<li class="rscadd">Implements Virtual Reality.</li>
</ul>
<h3 class="author">Woodrat updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added 'see down' in open spaces from Vore.</li>
<li class="rscadd">Added talking and visible messages upward through open space from Vore.</li>
<li class="rscadd">Added a Syndicate ID with all access (admin spawn only).</li>
<li class="tweak">Port of 'Syndicate id cards now listen for owner destruction' from Bay.</li>
</ul>
<h2 class="date">24 September 2017</h2>
<h3 class="author">Belsima updated:</h3>
<ul class="changes bgimages16">
+9
View File
@@ -3706,3 +3706,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
bugged.
- rscadd: Cable ender file added. Allows power transfer between z-levels.
- tweak: Southern cross files for areas and defines in relation to z-level work.
2017-11-06:
Atermonera:
- bugfix: AI's can speak local rootspeak.
- rscadd: Implements Virtual Reality.
Woodrat:
- rscadd: Added 'see down' in open spaces from Vore.
- rscadd: Added talking and visible messages upward through open space from Vore.
- rscadd: Added a Syndicate ID with all access (admin spawn only).
- tweak: Port of 'Syndicate id cards now listen for owner destruction' from Bay.
+4
View File
@@ -0,0 +1,4 @@
author: Atermonera
delete-after: True
changes:
- bugfix: "AI verbs are no longer hidden on the tabs."
+4
View File
@@ -0,0 +1,4 @@
author: Atermonera
delete-after: True
changes:
- bugfix: "Incapacitated mobs can no longer open your inventory and steal your gubbins."
@@ -0,0 +1,5 @@
author: MoondancerPony
delete-after: True
changes:
- bugfix: "Fixed a mislabeled pulse pin on the microphone."
- bugfix: "Fixed an issue with reference pins and multiplexers, and reference pins in general."
-37
View File
@@ -1,37 +0,0 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Woodrat
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Added 'see down' in open spaces from Vore."
- rscadd: "Added talking and visible messages upward through open space from Vore."
-37
View File
@@ -1,37 +0,0 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Woodrat
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Added a Syndicate ID with all access (admin spawn only)."
- tweak: "Port of 'Syndicate id cards now listen for owner destruction' from Bay."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Some files were not shown because too many files have changed in this diff Show More