Merge branch 'master' into fourth_week_preparation_and_fixes

# Conflicts:
#	code/game/jobs/faction/zavodskoi.dm
This commit is contained in:
alberyk
2022-02-10 13:36:46 -03:00
65 changed files with 561 additions and 262 deletions

View File

@@ -169,6 +169,11 @@
return output
/proc/sanitize_readd_odd_symbols(var/input)
input = replacetext(input, "'", "\'")
input = replacetext(input, """, "\"")
return input
#undef NO_CHARS_DETECTED
#undef SPACES_DETECTED
#undef SYMBOLS_DETECTED
@@ -499,6 +504,13 @@
t = replacetext(t, "\[/small\]", "</font>")
t = replacetext(t, "\[station\]", current_map.station_name)
var/regex/redacted_text = new(@"(\[redacted\])(.*?)(\[\/redacted\])", "g")
while (redacted_text.Find(t))
var/new_content = ""
for(var/i = 1 to length(redacted_text.group[2]))
new_content += "|"
t = replacetext(t, redacted_text.match, "<span class='redacted'>[new_content]</span>")
// A break for signature customization code to use this proc as well.
if (limited)
return t

View File

@@ -8,27 +8,48 @@
military force across the Orion Spur. They are the main corporation found in the Empire of
Dominia, and are at the forefront of weapons development technology.
</p>
<p>Zavodskoi Interstellar employees can be in the following departments:
<ul>
<li><b>Security</b>
<li><b>Research</b>
<li><b>Engineering</b>
</ul></p>
"}
<p>Some character examples are:
<ul>
<li><b>Surgical Specialist</b>: Unit to unit Zavodskoi ships the most firearms and weapons compared
to any other corporation in the known galaxy and you're proud of it, but know the business comes with
its hazards. Your medical experience has allowed you to survive the closing of many genetics testing
centers during the recent transfer of leadership, and you know it. Zeng-Hu may have a reputation for
being the best in the Orion Spur, but they are in the past - Zavodskoi is the future. You are a
professional through-and-through, and consider yourself a (literal) cut above whatever washouts
NanoTrasen can hire as surgeons. Just remember, you need to prove that you're better than Zeng-Hu.
We need these medical contracts, lest we have to cut back the medical division just like the genetics one.</li>
<li><b>Personal Security Professional</b>: Excellent customer service and client
care is why Zavodskoi's private security personnel win security contracts and
you know this. A cut above the rest, you are clear, calm, concise and polite when
working. As a security force you were voted the most professional private security
force to work for and as such, you have corporate standards to uphold! The protection
of Zavodskoi staff is your first priority, but every member of the crew
should be treated as a valued customer. After all, imagine how bad it would look to
the shareholders if you were found beating a drunk like some kind of NanoTrasen officer.
The reputation would last, but your career certainly wouldn't.</li>
</ul></p>"}
title_suffix = "Zavod"
allowed_role_types = ZAVOD_ROLES
allowed_role_types = list(
/datum/job/visitor,
/datum/job/officer,
/datum/job/warden,
/datum/job/scientist,
/datum/job/roboticist,
/datum/job/surgeon,
/datum/job/representative
)
allowed_species_types = list(
/datum/species/human,
/datum/species/skrell,
/datum/species/unathi,
/datum/species/diona,
/datum/species/machine,
/datum/species/bug = TRUE,
/datum/species/bug/type_b = TRUE,
/datum/species/bug/type_e = TRUE,
/datum/species/machine
/datum/species/bug/type_e = TRUE
)
job_species_blacklist = list(
@@ -43,102 +64,51 @@
SPECIES_UNATHI,
SPECIES_TAJARA,
SPECIES_TAJARA_MSAI,
SPECIES_TAJARA_ZHAN
SPECIES_TAJARA_ZHAN,
SPECIES_VAURCA_WORKER,
SPECIES_VAURCA_WARRIOR,
SPECIES_VAURCA_BREEDER,
SPECIES_VAURCA_BULWARK
)
)
titles_to_loadout = list(
"Security Officer" = /datum/outfit/job/officer/zavodskoi,
"Surgeon" = /datum/outfit/job/doctor/zavodskoi,
"Warden" = /datum/outfit/job/warden/zavodskoi,
"Security Cadet" = /datum/outfit/job/intern_sec/zavodskoi,
"Investigator" =/datum/outfit/job/forensics/zavodskoi,
"Scientist" = /datum/outfit/job/scientist/zavodskoi,
"Xenobiologist" = /datum/outfit/job/scientist/zavodskoi/xenobio,
"Xenobotanist" = /datum/outfit/job/scientist/zavodskoi,
"Lab Assistant" = /datum/outfit/job/intern_sci/zavodskoi,
"Xenoarcheologist"= /datum/outfit/job/scientist/xenoarcheologist/zavodskoi,
"Engineer" = /datum/outfit/job/engineer/zavodskoi,
"Atmospheric Technician" = /datum/outfit/job/atmos/zavodskoi,
"Engineering Apprentice" = /datum/outfit/job/intern_eng/zavodskoi,
"Phoron Researcher" = /datum/outfit/job/scientist/zavodskoi,
"Xenoarcheologist" = /datum/outfit/job/scientist/zavodskoi,
"Anomalist" = /datum/outfit/job/scientist/zavodskoi,
"Roboticist" = /datum/outfit/job/roboticist/zavodskoi,
"Biomechanical Engineer" = /datum/outfit/job/roboticist/zavodskoi,
"Mechatronic Engineer" = /datum/outfit/job/roboticist/zavodskoi,
"Corporate Liaison" = /datum/outfit/job/representative/zavodskoi
)
/datum/outfit/job/officer/zavodskoi
name = "Security Officer - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/security/zavod
uniform = /obj/item/clothing/under/rank/security/zavodskoi
id = /obj/item/card/id/zavodskoi/sec
head = /obj/item/clothing/head/beret/security/zavodskoi/alt
/datum/outfit/job/warden/zavodskoi
name = "Warden - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/warden/zavod
uniform = /obj/item/clothing/under/rank/security/zavodskoi
id = /obj/item/card/id/zavodskoi/sec
head = /obj/item/clothing/head/warden/zavod
/datum/outfit/job/intern_sec/zavodskoi
name = "Security Cadet - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/cadet/zavod
id = /obj/item/card/id/zavodskoi/sec
suit = null
head = /obj/item/clothing/head/beret/security/zavodskoi/alt
/datum/outfit/job/forensics/zavodskoi
name = "Investigator - Zavodskoi Interstellar"
id = /obj/item/card/id/zavodskoi/sec
uniform = /obj/item/clothing/under/det/zavod
suit = /obj/item/clothing/suit/storage/det_jacket/zavod
head = null
/datum/outfit/job/scientist/zavodskoi
name = "Scientist - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/scientist/zavod
suit = /obj/item/clothing/suit/storage/toggle/labcoat/zavodskoi
id = /obj/item/card/id/zavodskoi
suit = null
/datum/outfit/job/scientist/zavodskoi/xenobio
name = "Xenobiologist - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/scientist/xenobio/zavod
suit = /obj/item/clothing/suit/storage/toggle/labcoat/zavodskoi
id = /obj/item/card/id/zavodskoi
suit = null
/datum/outfit/job/scientist/xenoarcheologist/zavodskoi
name = "Xenoarcheologist - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/xenoarcheologist/zavod
suit = /obj/item/clothing/suit/storage/toggle/labcoat/zavodskoi
id = /obj/item/card/id/zavodskoi
suit = null
/datum/outfit/job/intern_sci/zavodskoi
name = "Lab Assistant - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/scientist/intern/zavod
uniform = /obj/item/clothing/under/rank/zavodskoi/research
id = /obj/item/card/id/zavodskoi
/datum/outfit/job/engineer/zavodskoi
name = "Engineer - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/engineer/zavod
/datum/outfit/job/roboticist/zavodskoi
name = "Roboticist - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/zavodskoi/research
id = /obj/item/card/id/zavodskoi
/datum/outfit/job/atmos/zavodskoi
name = "Atmospheric Technician - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/atmospheric_technician/zavod
id = /obj/item/card/id/zavodskoi
/datum/outfit/job/intern_eng/zavodskoi
name = "Engineering Apprentice - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/engineer/apprentice/zavod
/datum/outfit/job/doctor/zavodskoi
name = "Physician - Zavodskoi Interstellar"
uniform = /obj/item/clothing/under/rank/zavodskoi/research
id = /obj/item/card/id/zavodskoi
/datum/outfit/job/representative/zavodskoi
@@ -153,4 +123,4 @@
/obj/item/device/camera = 1,
/obj/item/gun/projectile/pistol = 1,
/obj/item/stamp/zavodskoi = 1
)
)

View File

@@ -6,6 +6,7 @@
var/mob/living/carbon/human/attached = null
var/mode = 1 // 1 is injecting, 0 is taking blood.
var/toggle_stop = 1
var/transfer_amount = REM
var/obj/item/reagent_containers/beaker = null
var/blood_message_sent = FALSE
@@ -104,6 +105,16 @@
beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_BLOOD)
update_icon()
if(toggle_stop) // Automatically detaches if the blood volume is at 100%
if(beaker.reagents.has_reagent(/decl/reagent/blood) && attached.get_blood_volume() >= 100)
visible_message("[icon2html(src, viewers(get_turf(src)))] \The <b>[src]</b> flashes a warning light, disengaging from [attached] automatically!")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
src.attached = null
src.update_icon()
blood_message_sent = FALSE
update_icon()
return
// Take blood
else
var/amount = REAGENTS_FREE_SPACE(beaker.reagents)
@@ -148,6 +159,22 @@
mode = !mode
to_chat(usr, "[src] is now [mode ? "injecting" : "taking blood"].")
/obj/machinery/iv_drip/verb/toggle_stop()
set category = "Object"
set name = "Toggle Stop"
set src in view(1)
if(!isliving(usr))
to_chat(usr, SPAN_WARNING("You can't do that."))
return
if(usr.incapacitated())
return
toggle_stop = !toggle_stop
usr.visible_message("<b>[usr]</b> toggles \the [src]'s automatic stop mode [toggle_stop ? "on" : "off"]", SPAN_NOTICE("You toggle \the [src]'s automatic stop mode [toggle_stop ? "on" : "off"]."))
playsound(usr, 'sound/machines/click.ogg', 50)
/obj/machinery/iv_drip/examine(mob/user)
..(user)
if (!(user in view(2)) && user!=src.loc) return

View File

@@ -1199,30 +1199,31 @@
vend_id = "battlemonsters"
products = list(
/obj/item/book/manual/wiki/battlemonsters = 10,
/obj/item/battle_monsters/wrapped/basic = 5,
/obj/item/battle_monsters/wrapped = 10,
/obj/item/battle_monsters/wrapped/pro = 10,
/obj/item/battle_monsters/wrapped/species = 4, //Human monsters
/obj/item/battle_monsters/wrapped/species/lizard = 4, //Reptile Monsters
/obj/item/battle_monsters/wrapped/species/cat = 4, //Feline Monsters
/obj/item/battle_monsters/wrapped/species/ant = 4, //Ant Monsters
/obj/item/battle_monsters/wrapped/rare = 4
/obj/item/battle_monsters/wrapped/basic = 20,
/obj/item/battle_monsters/wrapped = 20,
/obj/item/battle_monsters/wrapped/pro = 20,
/obj/item/battle_monsters/wrapped/species = 10, //Human monsters
/obj/item/battle_monsters/wrapped/species/lizard = 10, //Reptile Monsters
/obj/item/battle_monsters/wrapped/species/cat = 10, //Feline Monsters
/obj/item/battle_monsters/wrapped/species/ant = 10, //Ant Monsters
/obj/item/battle_monsters/wrapped/rare = 10
)
prices = list(
/obj/item/book/manual/wiki/battlemonsters = 12,
/obj/item/battle_monsters/wrapped = 100,
/obj/item/battle_monsters/wrapped/pro = 75,
/obj/item/battle_monsters/wrapped/species = 100,
/obj/item/battle_monsters/wrapped/species/lizard = 125,
/obj/item/battle_monsters/wrapped/species/cat = 125,
/obj/item/battle_monsters/wrapped/species/ant = 125,
/obj/item/battle_monsters/wrapped/rare = 200
/obj/item/battle_monsters/wrapped/species = 50,
/obj/item/battle_monsters/wrapped/species/lizard = 50,
/obj/item/battle_monsters/wrapped/species/cat = 50,
/obj/item/battle_monsters/wrapped/species/ant = 50,
/obj/item/battle_monsters/wrapped/rare = 100
)
contraband = list(
/obj/item/battle_monsters/wrapped/legendary = 4
/obj/item/battle_monsters/wrapped/legendary = 5
)
premium = list(
/obj/item/coin/battlemonsters = 10
)
restock_items = 0
restock_items = FALSE
random_itemcount = FALSE
light_color = COLOR_BABY_BLUE

View File

@@ -35,7 +35,6 @@
icon_state = ""
var/coming_state = "blood1"
var/going_state = "blood2"
var/updated_tracks = 0
// dir = id in stack
var/list/setdirs = list(
@@ -97,7 +96,6 @@
track = new /datum/fluidtrack(b, footprint_color, t)
stack.Add(track)
setdirs["[b]"] = stack.Find(track)
updated_tracks |= b
updated=1
// GOING BIT (shift up 4)
@@ -114,7 +112,6 @@
track= new /datum/fluidtrack(b, footprint_color, t)
stack.Add(track)
setdirs["[b]"] = stack.Find(track)
updated_tracks |= b
updated = 1
dirs |= comingdir|realgoing
@@ -146,7 +143,6 @@
track.overlay = I
stack[stack_idx] = track
add_overlay(I)
updated_tracks = 0 // Clear our memory of updated tracks.
/obj/effect/decal/cleanable/blood/tracks/footprints
name = "wet footprints"
@@ -157,6 +153,13 @@
going_state = "human2"
amount = 0
/obj/effect/decal/cleanable/blood/tracks/footprints/barefoot
desc = "They look like still wet tracks left by bare feet."
drydesc = "They look like dried tracks left by bare feet."
/obj/effect/decal/cleanable/blood/tracks/footprints/barefoot/del_dry/dry()
qdel(src)
/obj/effect/decal/cleanable/blood/tracks/wheels
name = "wet tracks"
dryname = "dried tracks"
@@ -194,4 +197,4 @@
desc = "A still-wet trail left by someone crawling."
drydesc = "A dried trail left by someone crawling."
coming_state = "trail1"
going_state = "trail2"
going_state = "trail2"

View File

@@ -14,12 +14,9 @@
/obj/item/clothing/ring,
/obj/item/device/flashlight/pen,
/obj/item/seeds,
/obj/item/stack/medical,
/obj/item/coin,
/obj/item/stack/dice,
/obj/item/disk,
/obj/item/implanter,
/obj/item/flame/lighter,
/obj/item/flame/match,
/obj/item/lipstick,
/obj/item/haircomb,
@@ -27,17 +24,12 @@
/obj/item/paper_bundle,
/obj/item/pen,
/obj/item/photo,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/syringe,
/obj/item/reagent_containers/pill,
/obj/item/reagent_containers/hypospray/autoinjector,
/obj/item/screwdriver,
/obj/item/stamp,
/obj/item/device/paicard,
/obj/item/device/encryptionkey,
/obj/item/fluff,
/obj/item/storage/business_card_holder,
/obj/item/clothing/head/bandana,
/obj/item/sample
)
slot_flags = SLOT_ID

View File

@@ -77,7 +77,14 @@
set category = "Object"
set src in oview(1)
do_climb(usr)
if(can_climb(usr))
do_climb(usr)
/obj/structure/handle_middle_mouse_click(mob/user)
if(can_climb(user))
do_climb(usr)
return TRUE
return FALSE
/obj/structure/MouseDrop_T(mob/target, mob/user)

View File

@@ -437,6 +437,7 @@
new /obj/item/gun/energy/xray(src)
new /obj/item/clothing/accessory/holster/armpit/brown(src)
new /obj/item/gun/energy/crossbow/largecrossbow(src)
new /obj/item/melee/energy/sword/red(src)
/obj/structure/closet/crate/secure/gear_loadout/ninja/techno
associated_hardsuit = /obj/item/rig/light/offworlder/techno/ninja

View File

@@ -8,6 +8,8 @@
climbable = TRUE
layer = OBJ_LAYER
anchored = FALSE
flags = ON_BORDER
obj_flags = OBJ_FLAG_ROTATABLE
build_amt = 2
@@ -278,35 +280,49 @@
/obj/structure/railing/ex_act(severity)
qdel(src)
/obj/structure/railing/can_climb(var/mob/living/user, climb_dir, post_climb_check=0)
/obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0)
. = ..()
var/turf/dest = get_step(user, climb_dir)
if(. && get_turf(user) == get_turf(src))
if(turf_is_crowded(TRUE) || !user.Adjacent(dest) || turf_contains_dense_objects(dest) && get_turf(src) != dest)
if(!.)
return
var/turf/destination_turf = get_destination_turf(user)
if(destination_turf.density)
to_chat(user, SPAN_DANGER("You can't climb into \the [destination_turf]."))
return FALSE
if(!Adjacent(destination_turf))
to_chat(user, SPAN_DANGER("You can't climb there, the way is blocked."))
return FALSE
for(var/atom/A in destination_turf.contents - src)
if(A.density && !(A.flags & ON_BORDER))
to_chat(user, SPAN_DANGER("You can't climb there, the way is blocked."))
return FALSE
/obj/structure/railing/do_climb(mob/living/user)
var/climb_dir = get_dir(user, src)
if(get_turf(src) == get_turf(user))
climb_dir = src.dir
if(!can_climb(user, climb_dir))
return
return TRUE
/obj/structure/railing/do_climb(mob/living/user)
user.visible_message(SPAN_WARNING("\The [user] starts climbing over \the [src]!"))
LAZYADD(climbers, user)
if(!do_after(user, 50))
if(!do_after(user, 2 SECONDS))
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, climb_dir, post_climb_check = TRUE))
if(!can_climb(user, post_climb_check = TRUE))
LAZYREMOVE(climbers, user)
return
user.forceMove(get_step(user, climb_dir))
var/turf/destination_turf = get_destination_turf(user)
user.forceMove(destination_turf)
user.visible_message(SPAN_WARNING("\The [user] climbs over \the [src]!"))
LAZYREMOVE(climbers, user)
if(!anchored || material.is_brittle())
take_damage(maxhealth) // Fatboy
take_damage(maxhealth) // Fatboy
/obj/structure/railing/proc/get_destination_turf(var/mob/user)
. = get_turf(src) // by default, we pop into the turf the railing's on
if(get_turf(user) == . || !(get_dir(src, user) & dir)) // if the user's inside our turf or behind us, go in front of us
. = get_step(src, dir)

View File

@@ -246,36 +246,9 @@ var/const/enterloopsanity = 100
H.update_inv_shoes(TRUE)
if(istype(AM, /mob/living/carbon/human))
if(tracks_footprint && ishuman(AM))
var/mob/living/carbon/human/H = AM
// Tracking blood
var/list/footprint_DNA = list()
var/footprint_color
var/will_track = FALSE
if(H.shoes)
var/obj/item/clothing/shoes/S = H.shoes
if(istype(S))
S.handle_movement(src, H.m_intent == M_RUN ? TRUE : FALSE)
if(S.track_footprint)
if(S.blood_DNA)
footprint_DNA = S.blood_DNA
footprint_color = S.blood_color
S.track_footprint--
will_track = TRUE
else
if(H.track_footprint)
if(H.feet_blood_DNA)
footprint_DNA = H.feet_blood_DNA
footprint_color = H.footprint_color
H.track_footprint--
will_track = TRUE
if(tracks_footprint && will_track)
add_tracks(H.species.get_move_trail(H), footprint_DNA, H.dir, 0, footprint_color) // Coming
var/turf/simulated/from = get_step(H, reverse_direction(H.dir))
if(istype(from) && from)
from.add_tracks(H.species.get_move_trail(H), footprint_DNA, 0, H.dir, footprint_color) // Going
footprint_DNA = null
H.species.deploy_trail(H, src)
..()

View File

@@ -28,7 +28,7 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.change_appearance(APPEARANCE_ALL, H, TRUE, H.generate_valid_species(), null, default_state, src)
var/getName = sanitize(input(H, "Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
var/getName = sanitizeName(sanitize_readd_odd_symbols(sanitize(input(H, "Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)))
if(getName)
H.real_name = getName
H.name = getName

View File

@@ -1,7 +1,7 @@
/obj/item/battle_monsters/wrapped/species
name = "battle monsters human boosterpack"
desc = "A battle monsters 10 card boosterpack, containing exclusively human monsters."
contained_cards = 10
desc = "A battle monsters 15 card boosterpack, containing exclusively human monsters."
contained_cards = 15
var/list/species = list(
"human_male" = 1,
"human_female" = 1,
@@ -30,7 +30,7 @@
/obj/item/battle_monsters/wrapped/species/lizard
name = "battle monsters reptilian boosterpack"
desc = "A battle monsters 10 card boosterpack, containing exclusively reptilian monsters."
desc = "A battle monsters 15 card boosterpack, containing exclusively reptilian monsters."
species = list(
"dragon" = 0.5,
"dragon_hybrid" = 0.25,
@@ -42,7 +42,7 @@
/obj/item/battle_monsters/wrapped/species/cat
name = "battle monsters feline boosterpack"
desc = "A battle monsters 10 card boosterpack, containing exclusively feline monsters."
desc = "A battle monsters 15 card boosterpack, containing exclusively feline monsters."
species = list(
"catman" = 1,
"catwoman" = 1
@@ -50,8 +50,8 @@
/obj/item/battle_monsters/wrapped/species/ant
name = "battle monsters insect boosterpack"
desc = "A battle monsters 10 card boosterpack, containing exclusively insect monsters."
desc = "A battle monsters 15 card boosterpack, containing exclusively insect monsters."
species = list(
"antman" = 1,
"antwoman" = 0.25
)
)

View File

@@ -50,24 +50,24 @@
/obj/item/battle_monsters/wrapped/pro
name = "battle monsters booster pack"
desc = "A pack of 10 rare battle monster cards, with a chance of having legendary cards."
desc = "A pack of 15 rare battle monster cards, with a chance of having legendary cards."
icon_state = "pack2"
contained_cards = 10
contained_cards = 15
rarity_max = BATTLE_MONSTERS_RARITY_UNCOMMON
rarity_min = BATTLE_MONSTERS_RARITY_LEGENDARY
/obj/item/battle_monsters/wrapped/rare
name = "battle monsters rare booster pack"
desc = "A pack of 10 ultra-rare battle monster cards."
desc = "A pack of 15 ultra-rare battle monster cards."
icon_state = "pack2"
contained_cards = 10
contained_cards = 15
rarity_max = BATTLE_MONSTERS_RARITY_RARE
rarity_min = BATTLE_MONSTERS_RARITY_LEGENDARY
/obj/item/battle_monsters/wrapped/legendary
name = "battle monsters rare booster pack"
desc = "A pack of 4 legendary battle monster cards."
name = "battle monsters legendary booster pack"
desc = "A pack of 8 legendary battle monster cards."
icon_state = "pack2"
contained_cards = 4
contained_cards = 8
rarity_max = BATTLE_MONSTERS_RARITY_LEGENDARY
rarity_min = BATTLE_MONSTERS_RARITY_LEGENDARY
rarity_min = BATTLE_MONSTERS_RARITY_LEGENDARY

View File

@@ -253,7 +253,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
++ind
if(ind > 1)
out += ", "
out += "\tMechanical [organ_name]"
var/datum/robolimb/R
if(pref.rlimb_data[name] && all_robolimbs[pref.rlimb_data[name]])
R = all_robolimbs[pref.rlimb_data[name]]
else
R = basic_robolimb
out += "\t[R.company] Mechanical [organ_name]"
else if(status == "nymph")
++ind
if(ind > 1)
@@ -732,7 +737,28 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if("Assisted")
pref.organ_data[organ_name] = "assisted"
if("Mechanical")
var/tmp_species = pref.species ? pref.species : SPECIES_HUMAN
var/list/usable_manufacturers = list()
for(var/company in internal_robolimbs)
var/datum/robolimb/M = chargen_robolimbs[company]
if(!(tmp_species in M.species_can_use))
continue
usable_manufacturers[company] = M
if(!usable_manufacturers.len)
return
var/choice = input(user, "Which manufacturer do you wish to use for this organ?") as null|anything in usable_manufacturers
if(!choice)
return
var/datum/robolimb/R = all_robolimbs[choice]
if(!(organ_name in R.allowed_internal_organs))
alert(user, "You can not select this manufacturer for this organ.")
return
pref.rlimb_data[organ_name] = choice
pref.organ_data[organ_name] = "mechanical"
if("Removed")
pref.organ_data[organ_name] = "removed"

View File

@@ -165,6 +165,15 @@
desc = "Super comfortable white shoes, capable of keeping you on your feet during any station-wide disaster."
icon = 'icons/clothing/kit/captain_white.dmi'
/obj/item/clothing/under/rank/captain/white_dress
name = "captain's white dress"
desc = "The white variant of feminine fashion for the style conscious captain."
icon = 'icons/clothing/kit/captain_white.dmi'
icon_state = "uniform_fem"
item_state = "uniform_fem"
worn_state = "uniform_fem"
is_open = -1
/obj/item/storage/briefcase/nt/captain_white
name = "captain white uniform briefcase"
desc = "An NT-branded briefcase containing various pieces of the captain's white uniform, for use when wine spillage is unlikely."
@@ -173,7 +182,8 @@
/obj/item/clothing/head/caphat/cap/white = 1,
/obj/item/clothing/under/rank/captain/white = 1,
/obj/item/clothing/gloves/captain/white = 1,
/obj/item/clothing/shoes/captain/white = 1
/obj/item/clothing/shoes/captain/white = 1,
/obj/item/clothing/under/rank/captain/white_dress = 1
)
// Formal

View File

@@ -1,4 +1,4 @@
// Light rigs are not space-capable, but don't suffer excessive slowdown or sight issues when depowered.
// Light rigs are not space-capable, but don't suffer excessive slowdown or sight issues when depowered.
/obj/item/rig/light
name = "light suit control module"
desc = "A lighter, less armored hardsuit."
@@ -14,8 +14,9 @@
energy = ARMOR_MELEE_MINOR,
bomb = ARMOR_BOMB_PADDED
)
emp_protection = 10
slowdown = 0
emp_protection = 100
slowdown = -1
species_restricted = list(BODYTYPE_HUMAN, BODYTYPE_UNATHI, BODYTYPE_SKRELL, BODYTYPE_VAURCA)
item_flags = THICKMATERIAL
offline_slowdown = 0
offline_vision_restriction = 0
@@ -94,7 +95,8 @@
/obj/item/rig_module/vision,
/obj/item/rig_module/teleporter,
/obj/item/rig_module/actuators/combat,
/obj/item/rig_module/device/door_hack
/obj/item/rig_module/device/door_hack,
/obj/item/rig_module/fabricator/energy_net
)

View File

@@ -2148,7 +2148,7 @@ All custom items with worn sprites must follow the contained sprite system: http
/obj/item/clothing/suit/storage/toggle/fluff/sezrak_coat //red Domelkoan Coat - Sezrak Han'san - captaingecko
name = "red Domelkoan Coa"
name = "red Domelkoan Coat"
desc = "A warm coat made in Domelkos. This red coat is stuffed with yupmi fur and made out of reinforced cloth-like synthetic materials, both to keep the wearer warm in the cold winters of \
Moroz, and to resist all but the rougher treatments... All the while remaining good-looking enough. Both shoulders on this coat feature the standard of the Han'san clan-house, presented in a \
gilded color."
@@ -2223,7 +2223,7 @@ All custom items with worn sprites must follow the contained sprite system: http
icon_state = "quoro_suit"
item_state = "quoro_suit"
contained_sprite = TRUE
/obj/item/clothing/accessory/poncho/shouldercape/qeblak/zeng/fluff/eden_cloak // Zeng-Hu Jargon division cloak - Eden Li - Huntime
name = "Zeng-Hu cloak: Jargon Division"
@@ -2233,3 +2233,14 @@ All custom items with worn sprites must follow the contained sprite system: http
icon_state = "ZH_cape_custom"
item_state = "ZH_cape_custom"
/obj/item/clothing/head/welding/fluff/akara_mask //Steel Face Mask - Akara Seuseisak - aticius
name = "steel face mask"
desc = "A slab of steel that has been hammered into the shape of a full-face mask with crude tools. It seems quite old and an appreciable layer of rust has built up."
icon = 'icons/obj/custom_items/akara_mask.dmi'
icon_override = 'icons/obj/custom_items/akara_mask.dmi'
icon_state = "akara_mask"
item_state = "akara_mask"
contained_sprite = TRUE
action_button_name = "Adjust mask"
flash_protection = FLASH_PROTECTION_NONE
tint = TINT_NONE

View File

@@ -30,8 +30,8 @@
/decl/emote/human/stopsway,
/decl/emote/audible/lizard_bellow,
/decl/emote/audible/hiss,
/decl/emote/audible/growl,
/decl/emote/audible/hiss/short
/decl/emote/audible/hiss/long,
/decl/emote/audible/growl
)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/roar, /decl/emote/audible/whimper, /decl/emote/audible/moan) = 70,

View File

@@ -241,14 +241,14 @@
/decl/emote/audible/growl
key = "growl"
emote_message_3p_target = "USER growls softly at TARGET."
emote_message_3p = "USER growls softly."
emote_message_3p_target = "USER growls at TARGET."
emote_message_3p = "USER growls."
emote_sound = 'sound/voice/Lizardgrowl.ogg'
/decl/emote/audible/hiss/short
/decl/emote/audible/hiss/long
key = "hiss2"
emote_message_3p_target = "USER hisses softly at TARGET."
emote_message_3p = "USER hisses softly."
emote_message_3p_target = "USER hisses loudly at TARGET!"
emote_message_3p = "USER hisses loudly!"
emote_sound = 'sound/voice/lizardhiss2.ogg'
/decl/emote/audible/lizard_bellow

View File

@@ -5,7 +5,7 @@
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
if((H.client && H.stat != DEAD) && (!player_is_antag(H.mind)))
var/obj/item/organ/internal/appendix/A = H.internal_organs_by_name[BP_APPENDIX]
if(!istype(A) || (A && A.inflamed))
if(!istype(A) || (A && A.inflamed && !(A.status & ORGAN_ROBOT)))
continue
A.inflamed = 1
A.update_icon()

View File

@@ -356,6 +356,10 @@ h1.alert, h2.alert {color: #a4bad6;}
.tajaran_signlang {color: #cc2c2c;}
.skrell {color: #00CED1;}
.vaurca {color: #b9b943;}
.vaurca_zora {color: #c74444;}
.vaurca_cthur {color: #438eb9;}
.vaurca_klax {color: #43b97e;}
.vaurca_liidra {color: #af43b9;}
.soghun {color: #2cad2c;}
.solcom {color: #5f5fd4;}
.elyran {color: #e2bb4e;}

View File

@@ -353,6 +353,10 @@ h1.alert, h2.alert {color: #000080;}
.tajaran_signlang {color: #941C1C;}
.skrell {color: #00CED1;}
.vaurca {color: #9e9e39;}
.vaurca_zora {color: #9e3939;}
.vaurca_cthur {color: #39719e;}
.vaurca_klax {color: #399e4a;}
.vaurca_liidra {color: #b350b3;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
.elyran {color: #c79322;}

View File

@@ -21,7 +21,7 @@
list(
new /datum/stack_recipe("[display_name] door", /obj/structure/simple_door, BUILD_AMT, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, BUILD_AMT, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] railing", /obj/structure/railing, BUILD_AMT, time = 50, one_per_turf = FALSE, on_floor = TRUE, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] railing", /obj/structure/railing, BUILD_AMT, time = 25, one_per_turf = FALSE, on_floor = TRUE, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] stool", /obj/structure/bed/stool, BUILD_AMT, one_per_turf = 1, on_floor = 1, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] chair", /obj/structure/bed/stool/chair, BUILD_AMT, one_per_turf = 1, on_floor = 1, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] bed", /obj/structure/bed, BUILD_AMT, one_per_turf = 1, on_floor = 1, supplied_material = "[name]"),

View File

@@ -348,17 +348,10 @@ var/list/holder_mob_icon_cache = list()
sync(contained)
/obj/item/holder/proc/sync(var/mob/living/M)
dir = SOUTH
cut_overlays()
icon = M.icon
icon_state = M.icon_state
item_state = M.item_state
color = M.color
name = M.name
desc = M.desc
overlays |= M.overlays
update_held_icon()
overlays = M.overlays
dir = M.dir
reagents = M.reagents
//#TODO-MERGE
//Port the reduced-duplication holder method from baystation upstream:

View File

@@ -223,9 +223,9 @@
log_say("[key_name(speaker)] : ([name]) [message]",ckey=key_name(speaker))
if(!speaker_mask)
speaker_mask = speaker.name
speaker_mask = speaker.real_name
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span>[format_message(message, get_spoken_verb(message))]</span></i>"
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span>[format_message(message, get_spoken_verb(message), speaker_mask)]</span></i>"
if(isvaurca(speaker))
speaker.custom_emote(VISIBLE_MESSAGE, "[pick("twitches their antennae", "twitches their antennae rhythmically")].")
@@ -240,6 +240,22 @@
if(istype(player,/mob/abstract/observer) || ((src in player.languages && !within_jamming_range(player)) || check_special_condition(player)))
to_chat(player, msg)
/datum/language/bug/format_message(message, verb, speaker_mask)
var/message_color = colour
var/list/speaker_surname = splittext(speaker_mask, " ")
switch(speaker_surname[2])
if("Zo'ra")
message_color = "vaurca_zora"
if("C'thur")
message_color = "vaurca_cthur"
if("K'lax")
message_color = "vaurca_klax"
if("Lii'dra")
message_color = "vaurca_liidra"
if(copytext(message, 1, 2) == "!")
return " projects <span class='message'><span class='[message_color]'>[copytext(message, 2)]</span></span>"
return "[verb], <span class='message'><span class='[message_color]'>\"[capitalize(message)]\"</span></span>"
/datum/language/bug/check_special_condition(var/mob/other)
if(istype(other, /mob/living/silicon))
return 1

View File

@@ -122,7 +122,10 @@
if ("assisted")
I.mechassist()
if ("mechanical")
I.robotize()
if (rlimb_data[name])
I.robotize(rlimb_data[name])
else
I.robotize()
if ("removed")
qdel(I)

View File

@@ -260,7 +260,7 @@
var/pass_flags = 0
var/obj/effect/decal/cleanable/blood/tracks/move_trail = /obj/effect/decal/cleanable/blood/tracks/footprints // What marks are left when walking
var/obj/effect/decal/cleanable/blood/tracks/move_trail = /obj/effect/decal/cleanable/blood/tracks/footprints/barefoot // What marks are left when walking
var/default_h_style = "Bald"
var/default_f_style = "Shaved"
@@ -637,6 +637,35 @@
/datum/species/proc/can_breathe_water()
return FALSE
/datum/species/proc/handle_trail(var/mob/living/carbon/human/H, var/turf/T)
var/list/trail_info = list()
if(H.shoes)
var/obj/item/clothing/shoes/S = H.shoes
if(istype(S))
S.handle_movement(T, H.m_intent == M_RUN ? TRUE : FALSE)
if(S.track_footprint)
if(S.blood_DNA)
trail_info["footprint_DNA"] = S.blood_DNA
trail_info["footprint_color"] = S.blood_color
S.track_footprint--
else
if(H.track_footprint)
if(H.feet_blood_DNA)
trail_info["footprint_DNA"] = H.feet_blood_DNA
trail_info["footprint_color"] = H.footprint_color
H.track_footprint--
return trail_info
/datum/species/proc/deploy_trail(var/mob/living/carbon/human/H, var/turf/T)
var/list/trail_info = handle_trail(H, T)
if(length(trail_info))
var/track_path = trail_info["footprint_type"]
T.add_tracks(track_path ? track_path : H.species.get_move_trail(H), trail_info["footprint_DNA"], H.dir, 0, trail_info["footprint_color"]) // Coming
var/turf/simulated/from = get_step(H, reverse_direction(H.dir))
if(istype(from))
from.add_tracks(track_path ? track_path : H.species.get_move_trail(H), trail_info["footprint_DNA"], 0, H.dir, trail_info["footprint_color"]) // Going
/datum/species/proc/get_move_trail(var/mob/living/carbon/human/H)
if(H.lying)
return /obj/effect/decal/cleanable/blood/tracks/body

View File

@@ -94,6 +94,18 @@
zombie_type = SPECIES_ZOMBIE_SKRELL
bodyfall_sound = /decl/sound_category/bodyfall_skrell_sound
alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH)
/datum/species/skrell/handle_trail(var/mob/living/carbon/human/H, var/turf/T)
var/list/trail_info = ..()
if(!length(trail_info) && !H.shoes)
var/list/blood_data = REAGENT_DATA(H.vessel, /decl/reagent/blood)
trail_info["footprint_DNA"] = list(blood_data["blood_DNA"] = blood_data["blood_type"])
trail_info["footprint_color"] = rgb(H.r_skin, H.g_skin, H.b_skin, 25)
trail_info["footprint_type"] = /obj/effect/decal/cleanable/blood/tracks/footprints/barefoot/del_dry // makes skrellprints del on dry
return trail_info
/datum/species/skrell/handle_post_spawn(mob/living/carbon/human/H)
..()
H.set_psi_rank(PSI_COERCION, PSI_RANK_OPERANT)

View File

@@ -109,6 +109,8 @@
BP_EYES = /obj/item/organ/internal/eyes/unathi
)
alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/wheeze, /decl/emote/audible/roar, /decl/emote/audible/bellow) = 80,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/wheeze, /decl/emote/audible/hiss) = 50,

View File

@@ -55,7 +55,8 @@
var/id_card_type = /obj/item/card/id/synthetic
var/list/possible_accents = list(ACCENT_TTS, ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_LUNA, ACCENT_MARTIAN, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_JUPITER, ACCENT_COC, ACCENT_ELYRA, ACCENT_ERIDANI,
ACCENT_SILVERSUN_EXPATRIATE, ACCENT_KONYAN, ACCENT_EARTH)
ACCENT_SILVERSUN_EXPATRIATE, ACCENT_KONYAN, ACCENT_EARTH, ACCENT_PERSEPOLIS, ACCENT_MEDINA, ACCENT_AEMAQ, ACCENT_NEWSUEZ, ACCENT_DAMASCUS, ACCENT_ERIDANI, ACCENT_PHONG,
ACCENT_VISEGRAD, ACCENT_HIMEO, ACCENT_PLUTO)
// Misc
uv_intensity = 175 //Lights cast by robots have reduced effect on diona

View File

@@ -93,7 +93,7 @@
return
attacker.visible_message("<span class='danger'>[attacker] thrusts [attacker.get_pronoun("his")] head into [target]'s skull!</span>")
var/damage = 20
var/damage = 15
if(attacker.mob_size >= 10)
damage += min(attacker.mob_size, 20)

View File

@@ -63,16 +63,31 @@
. += "[get_wound_severity(get_scarring_level())] scarring"
/obj/item/organ/internal/is_usable()
return ..() && !is_broken()
if(robotize_type)
var/datum/robolimb/R = all_robolimbs[robotize_type]
if(!R.malfunctioning_check(owner))
return TRUE
else
return ..() && !is_broken()
/obj/item/organ/internal/proc/is_damaged()
return damage > 0
/obj/item/organ/internal/robotize()
/obj/item/organ/internal/robotize(var/company = "Unbranded")
..()
min_bruised_damage += 5
min_broken_damage += 10
if(company)
model = company
var/datum/robolimb/R = all_robolimbs[company]
if(R)
if(robotic_sprite)
icon_state = "[initial(icon_state)]-[R.internal_organ_suffix]"
robotize_type = company
/obj/item/organ/internal/proc/getToxLoss()
if(BP_IS_ROBOTIC(src))
return damage * 0.5

View File

@@ -14,7 +14,7 @@
/obj/item/organ/internal/appendix/process()
..()
if(inflamed && owner)
if(inflamed && owner && !(status & ORGAN_ROBOT))
inflamed++
if(prob(5))
if(owner.can_feel_pain())

View File

@@ -5,7 +5,6 @@
organ_tag = BP_EYES
parent_organ = BP_HEAD
robotic_name = "optical sensors"
robotic_sprite = "eyes-prosthetic"
max_damage = 45
relative_size = 5
var/list/eye_colour = list(0,0,0)

View File

@@ -5,7 +5,6 @@
parent_organ = BP_CHEST
dead_icon = "heart-off"
robotic_name = "circulatory pump"
robotic_sprite = "heart-prosthetic"
toxin_type = CE_CARDIOTOXIC
max_damage = 45

View File

@@ -5,7 +5,6 @@
organ_tag = BP_KIDNEYS
parent_organ = BP_GROIN
robotic_name = "prosthetic kidneys"
robotic_sprite = "kidneys-prosthetic"
min_bruised_damage = 25
min_broken_damage = 45
max_damage = 70

View File

@@ -4,7 +4,6 @@
organ_tag = BP_LIVER
parent_organ = BP_GROIN
robotic_name = "toxin filter"
robotic_sprite = "liver-prosthetic"
toxin_type = CE_HEPATOTOXIC
min_bruised_damage = 25
min_broken_damage = 55

View File

@@ -7,7 +7,6 @@
organ_tag = BP_LUNGS
parent_organ = BP_CHEST
robotic_name = "gas exchange system"
robotic_sprite = "lungs-prosthetic"
min_bruised_damage = 30
min_broken_damage = 45
toxin_type = CE_PNEUMOTOXIC

View File

@@ -1,7 +1,7 @@
/obj/item/organ/internal/eyes/night
name = "light sensitive eyes"
desc = "A pair of Tajaran eyes accustomed to the low light conditions of Adhomai."
icon_state = "tajaran_eyes"
icon = 'icons/obj/organs/tajara_organs.dmi'
action_button_name = "Activate Low Light Vision"
default_action_type = /datum/action/item_action/organ/night_eyes
relative_size = 8
@@ -109,31 +109,31 @@
/obj/item/organ/internal/stomach/tajara
name = "reinforced stomach"
desc = "A Tajara stomach adapted to help the body conserve energy during digestion."
icon_state = "tajaran_stomach"
icon = 'icons/obj/organs/tajara_organs.dmi'
stomach_volume = 80
/obj/item/organ/internal/lungs/tajara
name = "insulated lungs"
desc = "A pair of Tajaran lungs that help preserve the warmth of the air while breathing."
icon_state = "tajaran_lungs"
icon = 'icons/obj/organs/tajara_organs.dmi'
/obj/item/organ/internal/liver/tajara
desc = "An alien liver capable of filtering Adhomian toxins and chemicals."
icon_state = "tajaran_liver"
icon = 'icons/obj/organs/tajara_organs.dmi'
/obj/item/organ/internal/heart/tajara
desc = "A robust heart capable of helping to preserve body temperature through blood circulation."
icon_state = "tajaran_heart"
dead_icon = "tajaran_heart"
icon = 'icons/obj/organs/tajara_organs.dmi'
/obj/item/organ/internal/kidneys/tajara
desc = "Alien kidneys adapted to the Tajaran physiology."
icon_state = "tajaran_kidneys"
icon = 'icons/obj/organs/tajara_organs.dmi'
/obj/item/organ/internal/brain/tajara
icon_state = "tajaran_brain"
icon = 'icons/obj/organs/tajara_organs.dmi'
/obj/item/organ/internal/appendix/tajara
name = "fat reservoir"
icon_state = "tajaran_appendix"
icon = 'icons/obj/organs/tajara_organs.dmi'
desc = "An Adhomian organ that stores fat and nutrients for the winter."
possible_modifications = list("Normal","Assisted","Mechanical", "Removed")

View File

@@ -1,28 +1,28 @@
/obj/item/organ/internal/stomach/unathi
name = "massive gizzard"
desc = "A much larger stomach than what humans have. Looks to belong to a carnivore."
icon_state = "unathi_stomach"
icon = 'icons/obj/organs/unathi_organs.dmi'
/obj/item/organ/internal/brain/unathi
icon_state = "unathi_brain"
icon = 'icons/obj/organs/unathi_organs.dmi'
/obj/item/organ/internal/lungs/unathi
name = "large lungs"
desc = "A pair of two large lungs belonging to Unathi, similar in appearance to yet much larger than Human lungs."
icon_state = "unathi_lungs"
icon = 'icons/obj/organs/unathi_organs.dmi'
/obj/item/organ/internal/heart/unathi
name = "large heart"
desc = "A single large heart almost triple the size of your hand, used to effectively pump blood throughout a body without transporting much heat. It looks to have only one ventricle."
icon_state = "unathi_heart"
icon = 'icons/obj/organs/unathi_organs.dmi'
/obj/item/organ/internal/liver/unathi
icon_state = "unathi_liver"
icon = 'icons/obj/organs/unathi_organs.dmi'
/obj/item/organ/internal/kidneys/unathi
icon_state = "unathi_kidneys"
icon = 'icons/obj/organs/unathi_organs.dmi'
/obj/item/organ/internal/eyes/unathi
name = "reptilian eyes"
desc = "A pair of reptilian eyes. The pupil is slit and never dialating; you can almost feel it staring at you."
icon_state = "unathi_eyes"
icon = 'icons/obj/organs/unathi_organs.dmi'

View File

@@ -1,8 +1,8 @@
/obj/item/organ/internal/eyes/night/vaurca
name = "vaurcaesian eyes"
desc = "A set of four vaurcaesian eyes, adapted to the low or no light tunnels of Sedantis."
icon_state = "eyes_vaurca"
robotic_sprite = null
icon = 'icons/obj/organs/vaurca_organs.dmi'
robotic_sprite = FALSE
vision_color = /datum/client_color/vaurca
vision_mechanical_color = /datum/client_color/monochrome
eye_emote = "'s eyes gently shift."

View File

@@ -8,7 +8,6 @@
organ_tag = BP_STOMACH
parent_organ = BP_GROIN
robotic_name = "digestive pump"
robotic_sprite = "stomach-prosthetic"
var/datum/reagents/metabolism/ingested
var/next_cramp = 0
var/should_process_alcohol = TRUE

View File

@@ -1,6 +1,6 @@
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
icon = 'icons/obj/organs/organs.dmi'
drop_sound = 'sound/items/drop/flesh.ogg'
pickup_sound = 'sound/items/pickup/flesh.ogg'
default_action_type = /datum/action/item_action/organ
@@ -31,8 +31,9 @@
var/robotic = 0 //For being a robot
var/robotize_type // If set, this organ type will automatically be roboticized with this manufacturer.
var/robotic_name
var/robotic_sprite
var/robotic_sprite = TRUE
var/emp_coeff = 1 //coefficient for damages taken by EMP, if the organ is robotic.
var/model
//Lists.
var/list/transplant_data
@@ -361,10 +362,10 @@
robotic = ROBOTIC_MECHANICAL
status = ORGAN_ROBOT
status |= ORGAN_ASSISTED
drop_sound = 'sound/items/drop/metalweapon.ogg'
pickup_sound = 'sound/items/pickup/metalweapon.ogg'
if(robotic_name)
name = robotic_name
if(robotic_sprite)
icon_state = robotic_sprite
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
robotize()

View File

@@ -21,7 +21,7 @@
var/icon_name = null
var/body_part = null
var/icon_position = 0
var/model
var/damage_state = "00"
//Damage variables.

View File

@@ -1,4 +1,5 @@
var/global/list/all_robolimbs = list()
var/global/list/internal_robolimbs = list()
var/global/list/chargen_robolimbs = list()
var/global/list/fabricator_robolimbs = list()
var/global/datum/robolimb/basic_robolimb
@@ -12,6 +13,8 @@ var/global/datum/robolimb/basic_robolimb
chargen_robolimbs[R.company] = R
if(R.fabricator_available)
fabricator_robolimbs[R.company] = R
if(R.allows_internal)
internal_robolimbs[R.company] = R
/datum/robolimb
var/company = "Unbranded" // Shown when selecting the limb.
@@ -39,6 +42,9 @@ var/global/datum/robolimb/basic_robolimb
var/brute_mod = 0.9 //how resistant is this mode to brute damage
var/burn_mod = 1.1 //how resistant is this mode to burn damage
var/fabricator_available = FALSE //if you can print this limb in the robotics fabricator
var/internal_organ_suffix = "prosthetic" //this is used to define the icon
var/list/allowed_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH)//what organs can be augmented by this brand
var/allows_internal = TRUE
/datum/robolimb/proc/malfunctioning_check()
return FALSE
@@ -49,6 +55,7 @@ var/global/datum/robolimb/basic_robolimb
icon = 'icons/mob/human_races/ipc/r_ind_bishop.dmi'
linked_frame = SPECIES_IPC_BISHOP
fabricator_available = TRUE
allows_internal = FALSE
/datum/robolimb/hesphaistos
company = PROSTHETIC_HI
@@ -56,6 +63,7 @@ var/global/datum/robolimb/basic_robolimb
icon = 'icons/mob/human_races/ipc/r_ind_hephaestus.dmi'
linked_frame = SPECIES_IPC_G2
fabricator_available = TRUE
allows_internal = FALSE
/datum/robolimb/zenghu
company = PROSTHETIC_ZH
@@ -63,6 +71,7 @@ var/global/datum/robolimb/basic_robolimb
icon = 'icons/mob/human_races/ipc/r_ind_zenghu.dmi'
linked_frame = SPECIES_IPC_ZENGHU
fabricator_available = TRUE
allows_internal = FALSE
/datum/robolimb/xion
company = PROSTHETIC_XMG
@@ -70,6 +79,7 @@ var/global/datum/robolimb/basic_robolimb
icon = 'icons/mob/human_races/ipc/r_ind_xion.dmi'
linked_frame = SPECIES_IPC_XION
fabricator_available = TRUE
allows_internal = FALSE
/datum/robolimb/ipc
company = PROSTHETIC_IPC
@@ -79,6 +89,7 @@ var/global/datum/robolimb/basic_robolimb
paintable = 1
linked_frame = SPECIES_IPC
fabricator_available = TRUE
allows_internal = FALSE
/datum/robolimb/industrial
company = PROSTHETIC_IND
@@ -87,12 +98,14 @@ var/global/datum/robolimb/basic_robolimb
unavailable_at_chargen = 1
linked_frame = SPECIES_IPC_G1
fabricator_available = TRUE
allows_internal = FALSE
/datum/robolimb/terminator
company = PROSTHETIC_HK
desc = "A ludicrously expensive and EMP shielded component, these types of limbs are best suited for highly specialized cyborgs."
icon = 'icons/mob/human_races/ipc/r_terminator.dmi'
unavailable_at_chargen = 1
unavailable_at_chargen = TRUE
allows_internal = FALSE
/datum/robolimb/human
company = PROSTHETIC_SYNTHSKIN
@@ -103,19 +116,23 @@ var/global/datum/robolimb/basic_robolimb
fabricator_available = TRUE
paintable = TRUE
lifelike = TRUE
allows_internal = FALSE
/datum/robolimb/autakh
company = PROSTHETIC_AUTAKH
desc = "This limb has been designed by the Aut'akh unathi sect."
icon = 'icons/mob/human_races/unathi/r_autakh.dmi'
species_can_use = list(SPECIES_UNATHI)
paintable = 1
paintable = TRUE
allows_internal = FALSE
/datum/robolimb/tesla
company = PROSTHETIC_TESLA
desc = "A limb designed to be used by the People's Republic of Adhomai Tesla Brigade. This civilian version is issued to disabled veterans and civilians."
icon = 'icons/mob/human_races/tajara/tesla_limbs.dmi'
species_can_use = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI)
internal_organ_suffix = "tesla"
allowed_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH, BP_APPENDIX)
/datum/robolimb/tesla/malfunctioning_check(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/augment/tesla/T = H.internal_organs_by_name[BP_AUG_TESLA]
@@ -128,4 +145,5 @@ var/global/datum/robolimb/basic_robolimb
company = PROSTHETIC_VAURCA
desc = "This limb design is from old Sedantis, still manufactured by the Hives when providing maintenace to most of the basic Vaurcesian bioforms."
icon = 'icons/mob/human_races/vaurca/r_vaurcalimbs.dmi'
species_can_use = list(SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR)
species_can_use = list(SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR)
allows_internal = FALSE

View File

@@ -1,5 +1,6 @@
/obj/item/organ/internal/augment
name = "augment"
icon = 'icons/obj/organs/augments.dmi'
icon_state = "augment"
parent_organ = BP_CHEST
organ_tag = "augment"
@@ -11,6 +12,7 @@
SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1,
SPECIES_IPC_G2, SPECIES_IPC_XION,
SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL)
robotic_sprite = FALSE
var/cooldown = 150
var/action_button_icon = "augment"
var/activable = FALSE

View File

@@ -1,21 +1,20 @@
/obj/item/organ/internal/heart/skrell
icon_state = "skrell_heart-on"
dead_icon = "skrell_heart-off"
icon = 'icons/obj/organs/skrell_organs.dmi'
/obj/item/organ/internal/lungs/skrell
icon_state = "lungs_skrell"
icon = 'icons/obj/organs/skrell_organs.dmi'
/obj/item/organ/internal/kidneys/skrell
icon_state = "kidney_skrell"
icon = 'icons/obj/organs/skrell_organs.dmi'
/obj/item/organ/internal/eyes/skrell
icon_state = "eyes_skrell"
icon = 'icons/obj/organs/skrell_organs.dmi'
/obj/item/organ/internal/liver/skrell
icon_state = "liver_skrell"
icon = 'icons/obj/organs/skrell_organs.dmi'
/obj/item/organ/internal/brain/skrell
icon_state = "brain_skrell"
icon = 'icons/obj/organs/skrell_organs.dmi'
/obj/item/organ/external/head/skrell
var/obj/item/storage/internal/skrell/storage

View File

@@ -1,50 +1,50 @@
/obj/item/organ/internal/heart/vaurca
name = "double heart system"
desc = "A double heart capable of pushing blood in an open circulatory system."
icon_state = "vaurca_heart_d-on"
icon = 'icons/obj/organs/vaurca_organs.dmi'
organ_tag = BP_HEART
parent_organ = BP_CHEST
dead_icon = "vaurca_heart_d-off"
max_damage = 90 //two hearts = stronger hearts
/obj/item/organ/internal/lungs/vaurca
icon_state = "lungs_vaurca"
icon = 'icons/obj/organs/vaurca_organs.dmi'
/obj/item/organ/internal/kidneys/vaurca
icon_state = "kidney_vaurca"
icon = 'icons/obj/organs/vaurca_organs.dmi'
/obj/item/organ/internal/kidneys/vaurca/robo
icon_state = "kidney_vaurca"
icon = 'icons/obj/organs/vaurca_organs.dmi'
organ_tag = BP_VAURCA_KIDNEYS
robotic = ROBOTIC_MECHANICAL
robotic_name = null
robotic_sprite = null
robotic_sprite = FALSE
/obj/item/organ/internal/liver/vaurca/robo
icon_state = "liver_vaurca"
icon = 'icons/obj/organs/vaurca_organs.dmi'
organ_tag = BP_VAURCA_LIVER
robotic = ROBOTIC_MECHANICAL
robotic_name = null
robotic_sprite = null
robotic_sprite = FALSE
/obj/item/organ/internal/liver/vaurca
icon_state = "liver_vaurca"
icon = 'icons/obj/organs/vaurca_organs.dmi'
/obj/item/organ/internal/stomach/vaurca
/obj/item/organ/internal/stomach/vaurca
name = "private stomach"
icon_state = "stomach_vaurca"
icon = 'icons/obj/organs/vaurca_organs.dmi'
/obj/item/organ/internal/appendix/vaurca
/obj/item/organ/internal/appendix/vaurca
name = "social stomach"
desc = "A vestigial organ that stores food for throphallaxis. It has not seen a practical use since the rise of modern Hives."
icon_state = "vaurca_appendix"
icon = 'icons/obj/organs/vaurca_organs.dmi'
/obj/item/organ/internal/brain/vaurca
name = "vaurca brain"
desc = "The brain of a Vaurca, being similar to that of an insect; and that of a mammal."
icon_state = "brain_vaurca"
desc = "The brain of a Vaurca, being similar to that of an insect; and that of a mammal."
icon = 'icons/obj/organs/vaurca_organs.dmi'
/obj/item/organ/vaurca/reservoir
icon = 'icons/obj/organs/vaurca_organs.dmi'
name = BP_PHORON_RESERVOIR
organ_tag = BP_PHORON_RESERVOIR
parent_organ = BP_CHEST
@@ -52,6 +52,7 @@
robotic = ROBOTIC_ASSISTED
/obj/item/organ/vaurca/filtrationbit
icon = 'icons/obj/organs/vaurca_organs.dmi'
name = BP_FILTRATION_BIT
organ_tag = BP_FILTRATION_BIT
parent_organ = BP_HEAD
@@ -59,6 +60,7 @@
robotic = ROBOTIC_MECHANICAL
/obj/item/organ/vaurca/neuralsocket
icon = 'icons/obj/organs/vaurca_organs.dmi'
name = BP_NEURAL_SOCKET
organ_tag = BP_NEURAL_SOCKET
icon_state = "neural_socket"
@@ -90,6 +92,7 @@ obj/item/organ/vaurca/neuralsocket/process()
..()
/obj/item/organ/vaurca/preserve
icon = 'icons/obj/organs/vaurca_organs.dmi'
name = BP_PHORON_RESERVE
organ_tag = BP_PHORON_RESERVE
parent_organ = BP_CHEST

View File

@@ -25,6 +25,7 @@ Pen and crayon commands
\[i\] - \[/i\] : Makes the text italic.
\[u\] - \[/u\] : Makes the text underlined.
\[large\] - \[/large\] : Increases the size of the text.
\[redacted\] - \[/redacted\] : Covers the text in an unbreachable black box.
\[sign\] : Inserts a signature of your name in a foolproof way.
\[field\] : Inserts an invisible field which lets you start type from there. Useful for forms.
\[date\] : Inserts today's station date.

View File

@@ -113,6 +113,7 @@
desc_info = "Autoinjectors are spent after using them. To re-use, use a screwdriver to open the back panel, then simply pour any desired reagent inside. Use in-hand, or click it while it's in your active hand to prepare it for reuse."
icon_state = "autoinjector"
item_state = "autoinjector"
slot_flags = SLOT_EARS
var/name_label
var/spent = TRUE
amount_per_transfer_from_this = 5
@@ -296,4 +297,4 @@
/obj/item/reagent_containers/hypospray/combat/empty
name = "combat hypospray"
desc = "A sleek black hypospray. Its needle has the ability to bypass armor."
reagents_to_add = FALSE
reagents_to_add = FALSE