Merge remote-tracking branch 'refs/remotes/PolarisSS13/master' into elevator-fix

This commit is contained in:
Spades
2016-09-15 18:44:51 -04:00
193 changed files with 3445 additions and 446 deletions

View File

@@ -35,9 +35,8 @@
#define ORGAN_BLEEDING (1<<1)
#define ORGAN_BROKEN (1<<2)
#define ORGAN_DESTROYED (1<<3)
#define ORGAN_SPLINTED (1<<4)
#define ORGAN_DEAD (1<<5)
#define ORGAN_MUTATED (1<<6)
#define ORGAN_DEAD (1<<4)
#define ORGAN_MUTATED (1<<5)
#define DROPLIMB_EDGE 0
#define DROPLIMB_BLUNT 1

View File

@@ -209,7 +209,7 @@ var/global/datum/shuttle_controller/shuttle_controller
shuttle.docking_controller_tag = "centcom_shuttle"
shuttle.dock_target_station = "centcom_shuttle_dock_airlock"
shuttle.dock_target_offsite = "centcom_shuttle_bay"
shuttles["Centcom"] = shuttle
shuttles["CentCom"] = shuttle
process_shuttles += shuttle
shuttle = new()

View File

@@ -10,7 +10,7 @@
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
..()
/******************** Nanotrasen/Malf ********************/
/******************** NanoTrasen/Malf ********************/
/datum/ai_laws/nanotrasen
name = "NT Default"
selectable = 1
@@ -30,7 +30,7 @@
set_zeroth_law(config.law_zero)
..()
/************* Nanotrasen Aggressive *************/
/************* NanoTrasen Aggressive *************/
/datum/ai_laws/nanotrasen_aggressive
name = "NT Aggressive"
selectable = 1

View File

@@ -43,15 +43,15 @@
/datum/locations/exodus
name = "NSS Exodus"
desc = "A highly profitable research, mining, and supply dock for Nanotrasen that serves as one of their many facilities in exploiting the \
desc = "A highly profitable research, mining, and supply dock for NanoTrasen that serves as one of their many facilities in exploiting the \
wonders of phoron. It is currently orbiting around Erebus and maintains close contact with the NAS Crescent. The station itself has been \
a target for a large number of Mercenaries and other companies wishing to steal Nanotrasen's secrets."
a target for a large number of Mercenaries and other companies wishing to steal NanoTrasen's secrets."
/datum/locations/crescent
name = "NAS Crescent"
desc = "The main hub for Nanotrasen in the Nyx system and is commonly referred to it by their workers as central command or \"Centcomm\". \
desc = "The main hub for NanoTrasen in the Nyx system and is commonly referred to it by their workers as central command or \"CentCom\". \
The Crescent refines and stores much of the products that stations (such as the Exodus) bring in. It is also a large refueling and supply \
station of phoron and tritium in the Nyx system due to Nanotrasen being able to outsell almost any other company."
station of phoron and tritium in the Nyx system due to NanoTrasen being able to outsell almost any other company."
/datum/locations/emerald_habitation
name = "Emerald Habitation"

View File

@@ -49,7 +49,7 @@
/datum/locations/northern_star //Inception joke here
name = "Northern Star"
desc = "The Northern Star is an asteroid colony owned and operated by Nanotrasen, among many other asteroid installations. \
desc = "The Northern Star is an asteroid colony owned and operated by NanoTrasen, among many other asteroid installations. \
Originally conceived as 'just another pitstop' for weary asteroid miners, it has grown to become a significant installation in the Kara subsystem."
/datum/locations/northern_star/New(var/creator)

View File

@@ -42,6 +42,11 @@
icon_state = "halterneck_bra"
has_color = TRUE
/datum/category_item/underwear/top/tubetop
name = "Tube Top"
icon_state = "tubetop"
has_color = TRUE
/datum/category_item/underwear/top/fishnet_base
name = "Fishnet top"
icon_state = "fishnet_body"

View File

@@ -68,3 +68,19 @@
/datum/category_item/underwear/undershirt/shirt_blue_striped
name = "Shirt, blue stripes"
icon_state = "shirt_stripes_s"
/datum/category_item/underwear/undershirt/bowling
name = "Bowling Shirt, Red"
icon_state = "bowling"
/datum/category_item/underwear/undershirt/bowlingp
name = "Bowling Shirt, Pink"
icon_state = "bowlingp"
/datum/category_item/underwear/undershirt/bowlinga
name = "Bowling Shirt, Aqua"
icon_state = "bowlinga"
/datum/category_item/underwear/undershirt/bowlingw
name = "Bowling Shirt, White"
icon_state = "bowlingw"

View File

@@ -41,6 +41,7 @@ var/datum/antagonist/mercenary/mercs
if(player.backbag == 2) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(player), slot_back)
if(player.backbag == 3) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(player), slot_back)
if(player.backbag == 4) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(player), slot_back)
if(player.backbag == 5) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(player), slot_back)
player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(player.back), slot_in_backpack)
player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack)
player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT

View File

@@ -83,6 +83,7 @@ var/datum/antagonist/wizard/wizards
if(wizard_mob.backbag == 2) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
if(wizard_mob.backbag == 3) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(wizard_mob), slot_back)
if(wizard_mob.backbag == 4) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(wizard_mob), slot_back)
if(wizard_mob.backbag == 5) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box(wizard_mob), slot_in_backpack)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand)

View File

@@ -166,7 +166,7 @@ area/space/atmosalert()
icon_state = "shuttle2"
/area/shuttle/escape/centcom
name = "\improper Emergency Shuttle Centcom"
name = "\improper Emergency Shuttle CentCom"
icon_state = "shuttle"
/area/shuttle/escape/transit // the area to pass through for 3 minute transit
@@ -304,7 +304,7 @@ area/space/atmosalert()
/area/shuttle/transport1/centcom
icon_state = "shuttle"
name = "\improper Transport Shuttle Centcom"
name = "\improper Transport Shuttle CentCom"
/area/shuttle/transport1/station
icon_state = "shuttle"
@@ -346,7 +346,7 @@ area/space/atmosalert()
icon_state = "shuttlered2"
/area/shuttle/administration/centcom
name = "\improper Administration Shuttle Centcom"
name = "\improper Administration Shuttle CentCom"
icon_state = "shuttlered"
/area/shuttle/administration/station
@@ -354,7 +354,7 @@ area/space/atmosalert()
icon_state = "shuttlered2"
/area/shuttle/trade/centcom
name = "\improper Trade Shuttle Centcom"
name = "\improper Trade Shuttle CentCom"
icon_state = "shuttlered"
/area/shuttle/trade/station
@@ -415,34 +415,34 @@ area/space/atmosalert()
// CENTCOM
/area/centcom
name = "\improper Centcom"
name = "\improper CentCom"
icon_state = "centcom"
requires_power = 0
lighting_use_dynamic = 0
/area/centcom/control
name = "\improper Centcom Control"
name = "\improper CentCom Control"
/area/centcom/evac
name = "\improper Centcom Emergency Shuttle"
name = "\improper CentCom Emergency Shuttle"
/area/centcom/suppy
name = "\improper Centcom Supply Shuttle"
name = "\improper CentCom Supply Shuttle"
/area/centcom/ferry
name = "\improper Centcom Transport Shuttle"
name = "\improper CentCom Transport Shuttle"
/area/centcom/shuttle
name = "\improper Centcom Administration Shuttle"
name = "\improper CentCom Administration Shuttle"
/area/centcom/test
name = "\improper Centcom Testing Facility"
name = "\improper CentCom Testing Facility"
/area/centcom/living
name = "\improper Centcom Living Quarters"
name = "\improper CentCom Living Quarters"
/area/centcom/specops
name = "\improper Centcom Special Ops"
name = "\improper CentCom Special Ops"
/area/centcom/creed
name = "Creed's Office"
@@ -458,15 +458,15 @@ area/space/atmosalert()
name = "\improper Tram Station"
/area/centcom/security
name = "\improper Centcom Security"
name = "\improper CentCom Security"
icon_state = "centcom_security"
/area/centcom/medical
name = "\improper Centcom Medical"
name = "\improper CentCom Medical"
icon_state = "centcom_medical"
/area/centcom/command
name = "\improper Centcom Command" //Central Command Command totally isn't RAS Syndrome in action.
name = "\improper CentCom Command" //Central Command Command totally isn't RAS Syndrome in action.
icon_state = "centcom_command"
/area/centcom/main_hall
@@ -474,15 +474,15 @@ area/space/atmosalert()
icon_state = "centcom_hallway1"
/area/centcom/bar
name = "\improper Centcom Bar"
name = "\improper CentCom Bar"
icon_state = "centcom_crew"
/area/centcom/restaurant
name = "\improper Centcom Restaurant"
name = "\improper CentCom Restaurant"
icon_state = "centcom_crew"
/area/centcom/bathroom
name = "\improper Centcom Bathroom"
name = "\improper CentCom Bathroom"
icon_state = "centcom_crew"
//SYNDICATES
@@ -2531,20 +2531,20 @@ area/space/atmosalert()
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcommsat/entrance
name = "\improper Telecoms Teleporter"
name = "\improper Telecomms Teleporter"
icon_state = "tcomsatentrance"
/area/tcommsat/chamber
name = "\improper Telecoms Central Compartment"
name = "\improper Telecomms Central Compartment"
icon_state = "tcomsatcham"
/area/tcomsat
name = "\improper Telecoms Satellite"
name = "\improper Telecomms Satellite"
icon_state = "tcomsatlob"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcomfoyer
name = "\improper Telecoms Foyer"
name = "\improper Telecomms Foyer"
icon_state = "tcomsatentrance"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
@@ -2559,7 +2559,7 @@ area/space/atmosalert()
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcommsat/computer
name = "\improper Telecoms Control Room"
name = "\improper Telecomms Control Room"
icon_state = "tcomsatcomp"
/area/tcommsat/lounge
@@ -2631,7 +2631,7 @@ area/space/atmosalert()
requires_power = 0
/area/awaymission/spacebattle/cruiser
name = "\improper Nanotrasen Cruiser"
name = "\improper NanoTrasen Cruiser"
/area/awaymission/spacebattle/syndicate1
name = "\improper Syndicate Assault Ship 1"

View File

@@ -463,11 +463,11 @@ its easier to just keep the beam vertical.
//spawn(0)
//if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
O.show_message( message, 1, blind_message, 2)
O.show_message(message, 1, blind_message, 2)
else if(ismob(I))
var/mob/M = I
if(M.see_invisible >= invisibility) // Cannot view the invisible
M.show_message( message, 1, blind_message, 2)
M.show_message(message, 1, blind_message, 2)
else if (blind_message)
M.show_message(blind_message, 2)
@@ -488,7 +488,24 @@ its easier to just keep the beam vertical.
spawn(0)
if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
O.show_message( message, 2, deaf_message, 1)
O.show_message(message, 2, deaf_message, 1)
else if(ismob(I))
var/mob/M = I
M.show_message( message, 2, deaf_message, 1)
M.show_message(message, 2, deaf_message, 1)
/atom/movable/proc/dropInto(var/atom/destination)
while(istype(destination))
var/atom/drop_destination = destination.onDropInto(src)
if(!istype(drop_destination) || drop_destination == destination)
return forceMove(destination)
destination = drop_destination
return forceMove(null)
/atom/proc/onDropInto(var/atom/movable/AM)
return // If onDropInto returns null, then dropInto will forceMove AM into us.
/atom/movable/onDropInto(var/atom/movable/AM)
return loc // If onDropInto returns something, then dropInto will attempt to drop AM there.
/atom/proc/InsertedContents()
return contents

View File

@@ -63,13 +63,35 @@
return
/atom/movable/proc/forceMove(atom/destination)
if(loc == destination)
return 0
var/is_origin_turf = isturf(loc)
var/is_destination_turf = isturf(destination)
// It is a new area if:
// Both the origin and destination are turfs with different areas.
// When either origin or destination is a turf and the other is not.
var/is_new_area = (is_origin_turf ^ is_destination_turf) || (is_origin_turf && is_destination_turf && loc.loc != destination.loc)
var/atom/origin = loc
loc = destination
if(origin)
origin.Exited(src, destination)
if(is_origin_turf)
for(var/atom/movable/AM in origin)
AM.Uncrossed(src)
if(is_new_area && is_origin_turf)
origin.loc.Exited(src, destination)
if(destination)
if(loc)
loc.Exited(src)
loc = destination
loc.Entered(src)
return 1
return 0
destination.Entered(src, origin)
if(is_destination_turf) // If we're entering a turf, cross all movable atoms
for(var/atom/movable/AM in loc)
if(AM != src)
AM.Crossed(src)
if(is_new_area && is_destination_turf)
destination.loc.Entered(src, origin)
return 1
//called when src is thrown into hit_atom
/atom/movable/proc/throw_impact(atom/hit_atom, var/speed)

View File

@@ -1,14 +1,19 @@
//This is a generic proc that should be called by other ling armor procs to equip them.
/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type, var/boot_type)
var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS)
if(!changeling)
return
/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type, var/boot_type, var/chem_cost)
if(!ishuman(src))
return 0
var/mob/living/carbon/human/M = src
if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
chem_cost = 0
var/datum/changeling/changeling = changeling_power(chem_cost, 1, 100, CONSCIOUS)
if(!changeling)
return
//First, check if we're already wearing the armor, and if so, take it off.
if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
M.visible_message("<span class='warning'>[M] casts off their [M.wear_suit.name]!</span>",
@@ -39,7 +44,7 @@
var/obj/item/clothing/shoes/B = new boot_type(src)
src.equip_to_slot_or_del(B, slot_shoes)
src.mind.changeling.chem_charges -= 20
src.mind.changeling.chem_charges -= chem_cost
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
M.update_inv_wear_suit()
M.update_inv_head()

View File

@@ -15,7 +15,6 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade/greater))
src << "<span class='notice'>We prepare an extra sharp blade.</span>"
src.mind.changeling.recursive_enhancement = 0
return 1
else

View File

@@ -9,7 +9,7 @@
/mob/proc/changeling_spacesuit()
set category = "Changeling"
set name = "Organic Space Suit (20)"
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling,/obj/item/clothing/shoes/magboots/changeling))
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling,/obj/item/clothing/shoes/magboots/changeling, 20))
return 1
return 0
@@ -25,7 +25,7 @@
set category = "Changeling"
set name = "Organic Spacearmor (20)"
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored,/obj/item/clothing/shoes/magboots/changeling/armored))
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored,/obj/item/clothing/shoes/magboots/changeling/armored, 20))
return 1
return 0

View File

@@ -26,7 +26,6 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent))
src << "<span class='notice'>We will shock others more efficently.</span>"
src.mind.changeling.recursive_enhancement = 0
return 1
else
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.

View File

@@ -21,7 +21,6 @@
if(src.mind.changeling.recursive_enhancement)
duration = duration + 150
src << "<span class='notice'>They will be deprived of sight for longer.</span>"
src.mind.changeling.recursive_enhancement = 0
spawn(duration)
T.disabilities &= ~NEARSIGHTED
T.eye_blind = 10

View File

@@ -23,7 +23,6 @@
if(src.mind.changeling.recursive_enhancement)
range = range + 3
src << "<span class='notice'>We can fire our next sting from five squares away.</span>"
src.mind.changeling.recursive_enhancement = 0
changeling.sting_range = range
src.verbs -= /mob/proc/changeling_boost_range
spawn(5)

View File

@@ -20,7 +20,6 @@
if(src.mind.changeling.recursive_enhancement)
inject_amount = inject_amount * 1.5
src << "<span class='notice'>We inject extra chemicals.</span>"
src.mind.changeling.recursive_enhancement = 0
if(T.reagents)
T.reagents.add_reagent("cryotoxin", inject_amount)
feedback_add_details("changeling_powers","CS")

View File

@@ -19,7 +19,6 @@
if(src.mind.changeling.recursive_enhancement)
duration = duration + 100
src << "<span class='notice'>They will be unable to hear for a little longer.</span>"
src.mind.changeling.recursive_enhancement = 0
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
T.sdisabilities |= DEAF
spawn(duration) T.sdisabilities &= ~DEAF

View File

@@ -20,7 +20,6 @@
if(src.mind.changeling.recursive_enhancement)
i = i * 2
src << "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>"
src.mind.changeling.recursive_enhancement = 0
spawn(2 MINUTES)
if(T) //We might not exist in two minutes, for whatever reason.
T << "<span class='danger'>You feel a burning sensation flowing through your veins!</span>"

View File

@@ -23,7 +23,6 @@
if(src.mind.changeling.recursive_enhancement)
effect = effect + 20
src << "<span class='notice'>We make them extremely weak.</span>"
src.mind.changeling.recursive_enhancement = 0
var/health_to_take_away = H.maxHealth * (effect / 100)
H.maxHealth -= health_to_take_away

View File

@@ -31,7 +31,6 @@
if(src.mind.changeling.recursive_enhancement)
src << "<span class='notice'>We feel unstoppable.</span>"
src.mind.changeling.recursive_enhancement = 0
spawn(1)
var/i = 30
while(i)

View File

@@ -23,7 +23,6 @@
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
src << "<span class='notice'>We will heal much faster.</span>"
src.mind.changeling.recursive_enhancement = 0
spawn(0)
src << "<span class='notice'>We begin to heal ourselves.</span>"

View File

@@ -32,7 +32,6 @@
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
src << "<span class='notice'>We will heal much faster.</span>"
src.mind.changeling.recursive_enhancement = 0
for(var/i = 0, i<10,i++)
if(C)

View File

@@ -25,7 +25,6 @@
if(src.mind.changeling.recursive_enhancement)
healing_amount = C.maxHealth
src << "<span class='notice'>We completely heal ourselves.</span>"
src.mind.changeling.recursive_enhancement = 0
spawn(0)
C.adjustBruteLoss(-healing_amount)
C.adjustFireLoss(-healing_amount)

View File

@@ -1,6 +1,6 @@
/datum/power/changeling/recursive_enhancement
name = "Recursive Enhancement"
desc = "We cause our next ability use to have increased or additional effects."
desc = "We cause our abilities to have increased or additional effects."
helptext = "To check the effects for each ability, check the blue text underneath the ability in the evolution menu."
ability_icon_state = "ling_recursive_enhancement"
genomecost = 3
@@ -9,16 +9,16 @@
//Increases macimum chemical storage
/mob/proc/changeling_recursive_enhancement()
set category = "Changeling"
set name = "Recursive Enhancement (10)"
set desc = "Empowers our next ability."
var/datum/changeling/changeling = changeling_power(10,0,100,UNCONSCIOUS)
set name = "Recursive Enhancement"
set desc = "Empowers our abilities."
var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS)
if(!changeling)
return 0
if(src.mind.changeling.recursive_enhancement)
src << "<span class='warning'>We have already prepared to enhance our next ability.</span>"
src << "<span class='warning'>We will no longer empower our abilities.</span>"
src.mind.changeling.recursive_enhancement = 0
return 0
src << "<span class='notice'>We empower ourselves. Our next ability will be extra potent.</span>"
src << "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>"
src.mind.changeling.recursive_enhancement = 1
src.mind.changeling.chem_charges -= 10
feedback_add_details("changeling_powers","RE")
return 1

View File

@@ -12,6 +12,8 @@
ling_datum.purchased_powers = list() //Then wipe all the powers we bought.
ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum.
ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade.
src.mind.changeling.recursive_enhancement = 0 //Ensures this is cleared
ling_datum.chem_storage = 50
if(ishuman(src))
var/mob/living/carbon/human/H = src

View File

@@ -40,7 +40,6 @@
if(src.mind.changeling.recursive_enhancement)
range = range * 2
src << "<span class='notice'>We are extra loud.</span>"
src.mind.changeling.recursive_enhancement = 0
for(var/mob/living/M in range(range, src))
if(iscarbon(M))

View File

@@ -19,7 +19,6 @@
if(src.mind.changeling.recursive_enhancement)
duration = duration + 10
src << "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>"
src.mind.changeling.recursive_enhancement = 0
T.silent += duration
feedback_add_details("changeling_powers","SS")
return 1

View File

@@ -39,7 +39,6 @@
if(src.mind.changeling.recursive_enhancement)
H.invisibility = INVISIBILITY_OBSERVER
src << "<span class='notice'>We are now truly invisible.</span>"
src.mind.changeling.recursive_enhancement = 0
while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks.
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.

View File

@@ -264,7 +264,7 @@ datum
target = targeta
job = joba
weight = get_points(job)
explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the Centcom station alive. We'll handle the rest from there."
explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the CentCom station alive. We'll handle the rest from there."
check_completion()
if(!emergency_shuttle.returned())

View File

@@ -9,8 +9,8 @@
the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and \
only hope this unknown assassin isn't here for you."
config_tag = "ninja"
required_players = 1
required_players_secret = 3
required_players = 5
required_players_secret = 5
required_enemies = 1
end_on_antag_death = 0
antag_tags = list(MODE_NINJA)

View File

@@ -7,8 +7,8 @@
their powers can be used for good or if their arrival foreshadows the destruction of the entire colony, or worse."
config_tag = "technomancer"
votable = 0
required_players = 8
required_players_secret = 10
required_players = 5
required_players_secret = 5
required_enemies = 1
end_on_antag_death = 0
antag_tags = list(MODE_TECHNOMANCER)

View File

@@ -23,5 +23,6 @@
config_tag = "autotraitor"
antag_tags = list(MODE_AUTOTRAITOR)
round_autoantag = 1
required_players_secret = 1
required_players_secret = 0
required_enemies = 0
antag_scaling_coeff = 5

View File

@@ -237,10 +237,10 @@ proc/get_all_job_icons() //For all existing HUD icons
return I.rank
var/centcom = get_all_centcom_jobs()
if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job
return "Centcom"
if(I.assignment in centcom) //Return with the NT logo if it is a CentCom job
return "CentCom"
if(I.rank in centcom)
return "Centcom"
return "CentCom"
else
return

View File

@@ -19,6 +19,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
if(has_alt_title(H, alt_title,"Visitor")) //I doubt someone visiting the station would want to wear an ugly grey uniform
H.equip_to_slot_or_del(new /obj/item/clothing/under/assistantformal(H), slot_w_uniform)
else if(has_alt_title(H, alt_title,"Resident"))

View File

@@ -30,6 +30,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/cap(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/com(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform)
if(H.age>49)
// Since we can have something other than the default uniform at this

View File

@@ -21,6 +21,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
@@ -86,6 +87,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/hydroponics(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/hyd(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/hyd(H), slot_back)
return 1
@@ -171,6 +173,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
@@ -265,6 +268,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)

View File

@@ -35,6 +35,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
@@ -73,6 +74,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
@@ -111,6 +113,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)

View File

@@ -33,6 +33,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
/datum/job/proc/equip_survival(var/mob/living/carbon/human/H)
if(!H) return 0

View File

@@ -30,6 +30,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
@@ -63,6 +64,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
if(has_alt_title(H, alt_title,"Emergency Physician"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
@@ -78,6 +80,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/viro(H), slot_back)
else if(has_alt_title(H, alt_title,"Medical Doctor"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
@@ -128,6 +131,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/chem(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/chem(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
return 1
@@ -185,6 +189,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
if(has_alt_title(H, alt_title,"Psychiatrist"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
else if(has_alt_title(H, alt_title,"Psychologist"))
@@ -221,6 +226,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
if(has_alt_title(H, alt_title,"Emergency Medical Technician"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)

View File

@@ -37,6 +37,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
return 1
@@ -70,6 +71,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
@@ -101,6 +103,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1

View File

@@ -30,6 +30,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
@@ -70,6 +71,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
@@ -108,6 +110,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
@@ -151,6 +154,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)

View File

@@ -329,7 +329,7 @@
organStatus["broken"] = E.broken_description
if(E.status & ORGAN_ROBOT)
organStatus["robotic"] = 1
if(E.status & ORGAN_SPLINTED)
if(E.splinted)
organStatus["splinted"] = 1
if(E.status & ORGAN_BLEEDING)
organStatus["bleeding"] = 1
@@ -483,7 +483,7 @@
break
if(istype(e, /obj/item/organ/external/chest) && occupant.is_lung_ruptured())
lung_ruptured = "Lung ruptured:"
if(e.status & ORGAN_SPLINTED)
if(e.splinted)
splint = "Splinted:"
if(e.status & ORGAN_BLEEDING)
bled = "Bleeding:"

View File

@@ -222,7 +222,7 @@ mob/living/proc/near_camera()
/mob/living/proc/tracking_status()
// Easy checks first.
// Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
// Don't detect mobs on CentCom. Since the wizard den is on CentCom, we only need this.
var/obj/item/weapon/card/id/id = GetIdCard()
if(id && id.prevent_tracking())
return TRACKING_TERMINATE

View File

@@ -173,7 +173,7 @@
src.updateDialog()
// OMG CENTCOMM LETTERHEAD
if("MessageCentcomm")
if("MessageCentCom")
if(src.authenticated==2)
if(centcomm_message_cooldown)
usr << "\red Arrays recycling. Please stand by."
@@ -181,7 +181,7 @@
var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || !(usr in view(1,src)))
return
Centcomm_announce(input, usr)
CentCom_announce(input, usr)
usr << "\blue Message transmitted."
log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]")
centcomm_message_cooldown = 1
@@ -295,7 +295,7 @@
if (src.authenticated==2)
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=announce'>Make An Announcement</A> \]"
if(src.emagged == 0)
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentcomm'>Send an emergency message to [boss_short]</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentCom'>Send an emergency message to [boss_short]</A> \]"
else
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageSyndicate'>Send an emergency message to \[UNKNOWN\]</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=RestoreBackup'>Restore Backup Routing Data</A> \]"

View File

@@ -22,8 +22,8 @@
/datum/file/program/communications
name = "Centcom communications relay"
desc = "Used to connect to Centcom."
name = "CentCom communications relay"
desc = "Used to connect to CentCom."
active_state = "comm"
req_access = list(access_heads)
@@ -185,7 +185,7 @@
computer.updateDialog()
// OMG CENTCOMM LETTERHEAD
if("MessageCentcomm" in href_list)
if("MessageCentCom" in href_list)
if(!computer.radio.subspace)
return
if(authenticated==2)
@@ -195,7 +195,7 @@
var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", ""))
if(!input || !interactable())
return
Centcomm_announce(input, usr)
CentCom_announce(input, usr)
usr << "Message transmitted."
log_say("[key_name(usr)] has made a [boss_short] announcement: [input]")
centcomm_message_cooldown = 1
@@ -288,7 +288,7 @@
if (authenticated==2)
dat += "<BR>\[ <A HREF='?src=\ref[src];announce'>Make An Announcement</A> \]"
if(computer.emagged == 0)
dat += "<BR>\[ <A HREF='?src=\ref[src];MessageCentcomm'>Send an emergency message to [boss_short]</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];MessageCentCom'>Send an emergency message to [boss_short]</A> \]"
else
dat += "<BR>\[ <A HREF='?src=\ref[src];MessageSyndicate'>Send an emergency message to \[UNKNOWN\]</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];RestoreBackup'>Restore Backup Routing Data</A> \]"

View File

@@ -62,13 +62,13 @@
return 1
/*
Centcom root authorization certificate
CentCom root authorization certificate
Non-destructive, officially sanctioned.
Has the same effect on computers as an emag.
*/
/datum/file/centcom_auth
name = "Centcom Root Access Token"
name = "CentCom Root Access Token"
extension = "auth"
volume = 100
copy()

View File

@@ -178,7 +178,7 @@
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call [boss_short] Support.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentCom Support.</span>"
else
transfer_and_vend(CH, C)
@@ -328,7 +328,7 @@
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call [boss_short] Support.</span>"
return 0
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentCom Support.</span>"
return 0
else
transfer_and_reimburse(CH)

View File

@@ -586,7 +586,7 @@
var/electrified = 0
//Departments that the cycler can paint suits to look like.
var/list/departments = list("Engineering","Mining","Medical","Security","Atmos")
var/list/departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard")
//Species that the suits can be configured to fit.
var/list/species = list("Human","Skrell","Unathi","Tajara", "Teshari")
@@ -616,7 +616,7 @@
name = "Engineering suit cycler"
model_text = "Engineering"
req_access = list(access_construction)
departments = list("Engineering","Atmos")
departments = list("Engineering","Atmos","HAZMAT","Construction")
/obj/machinery/suit_cycler/mining
name = "Mining suit cycler"
@@ -634,7 +634,7 @@
name = "Medical suit cycler"
model_text = "Medical"
req_access = list(access_medical)
departments = list("Medical")
departments = list("Medical","Biohazard")
/obj/machinery/suit_cycler/syndicate
name = "Nonstandard suit cycler"
@@ -751,7 +751,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","^%###^%$")
departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","^%###^%$")
species = list("Human","Tajara","Skrell","Unathi", "Teshari")
emagged = 1
@@ -1018,6 +1018,33 @@
suit.name = "atmospherics voidsuit"
suit.icon_state = "rig-atmos"
suit.item_state = "atmos_voidsuit"
if("HAZMAT")
if(helmet)
helmet.name = "HAZMAT voidsuit helmet"
helmet.icon_state = "rig0-engineering_rad"
helmet.item_state = "rig0-engineering_rad"
if(suit)
suit.name = "HAZMAT voidsuit"
suit.icon_state = "rig-engineering_rad"
suit.item_state = "eng_voidsuit_rad"
if("Construction")
if(helmet)
helmet.name = "Construction voidsuit helmet"
helmet.icon_state = "rig0-engineering_con"
helmet.item_state = "rig0-engineering_con"
if(suit)
suit.name = "Construction voidsuit"
suit.icon_state = "rig-engineering_con"
suit.item_state = "eng_voidsuit_con"
if("Biohazard")
if(helmet)
helmet.name = "Biohazard voidsuit helmet"
helmet.icon_state = "rig0-medical_bio"
helmet.item_state = "rig0-medical_bio"
if(suit)
suit.name = "Biohazard voidsuit"
suit.icon_state = "rig-medical_bio"
suit.item_state = "medical_voidsuit_bio"
if("^%###^%$" || "Mercenary")
if(helmet)
helmet.name = "blood-red voidsuit helmet"

View File

@@ -25,7 +25,7 @@
autolinkers = list("r_relay")
/obj/machinery/telecomms/relay/preset/centcom
id = "Centcom Relay"
id = "CentCom Relay"
hide = 1
toggled = 1
//anchored = 1
@@ -44,7 +44,7 @@
"receiverA", "broadcasterA")
/obj/machinery/telecomms/hub/preset_cent
id = "CentComm Hub"
id = "CentCom Hub"
network = "tcommsat"
produces_heat = 0
autolinkers = list("hub_cent", "c_relay", "s_relay", "m_relay", "r_relay",
@@ -65,7 +65,7 @@
..()
/obj/machinery/telecomms/receiver/preset_cent
id = "CentComm Receiver"
id = "CentCom Receiver"
network = "tcommsat"
produces_heat = 0
autolinkers = list("receiverCent")
@@ -106,7 +106,7 @@
autolinkers = list("processor4", "engineering", "common")
/obj/machinery/telecomms/bus/preset_cent
id = "CentComm Bus"
id = "CentCom Bus"
network = "tcommsat"
freq_listening = list(ERT_FREQ, DTH_FREQ)
produces_heat = 0
@@ -135,7 +135,7 @@
autolinkers = list("processor4")
/obj/machinery/telecomms/processor/preset_cent
id = "CentComm Processor"
id = "CentCom Processor"
network = "tcommsat"
produces_heat = 0
autolinkers = list("processorCent")
@@ -200,7 +200,7 @@
autolinkers = list("security")
/obj/machinery/telecomms/server/presets/centcomm
id = "CentComm Server"
id = "CentCom Server"
freq_listening = list(ERT_FREQ, DTH_FREQ)
produces_heat = 0
autolinkers = list("centcomm")
@@ -216,7 +216,7 @@
autolinkers = list("broadcasterA")
/obj/machinery/telecomms/broadcaster/preset_cent
id = "CentComm Broadcaster"
id = "CentCom Broadcaster"
network = "tcommsat"
produces_heat = 0
autolinkers = list("broadcasterCent")

View File

@@ -41,10 +41,10 @@
/datum/poster/tg_9
name = "Missing Gloves"
desc = "This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases."
desc = "This poster is about the uproar that followed NanoTrasen's financial cuts towards insulated-glove purchases."
icon_state="poster9"
/datum/poster/tg_10
name = "Hacking Guide"
desc = "This poster details the internal workings of the common Nanotrasen airlock."
desc = "This poster details the internal workings of the common NanoTrasen airlock."
icon_state="poster10"

View File

@@ -97,6 +97,7 @@ var/list/civilian_cartridges = list(
name = "\improper ChemWhiz cartridge"
icon_state = "cart-chem"
access_reagent_scanner = 1
access_medical = 1
/obj/item/weapon/cartridge/security
name = "\improper R.O.B.U.S.T. cartridge"

View File

@@ -143,13 +143,25 @@ REAGENT SCANNER
user.show_message("<span class='warning'>Significant brain damage detected. Subject may have had a concussion.</span>")
if(ishuman(M))
var/mob/living/carbon/human/H = M
for(var/name_i in H.internal_organs_by_name)
var/obj/item/organ/internal/i = H.internal_organs_by_name[name_i]
if(istype(i, /obj/item/organ/internal/appendix))
var/obj/item/organ/internal/appendix/a = H.internal_organs_by_name[name_i]
if(a.inflamed > 3)
user.show_message(text("<span class='warning'>Severe inflamation detected in subject [a.name].</span>"), 1)
else if(a.inflamed > 2)
user.show_message(text("<span class='warning'>Moderate inflamation detected in subject [a.name].</span>"), 1)
else if(a.inflamed >= 1)
user.show_message(text("<span class='warning'>Mild inflamation detected in subject [a.name].</span>"), 1)
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
if(!e)
continue
var/limb = e.name
if(e.status & ORGAN_BROKEN)
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & ORGAN_SPLINTED)))
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!e.splinted))
user << "<span class='warning'>Unsecured fracture in subject [limb]. Splinting recommended for transport.</span>"
if(e.has_infected_wound())
user << "<span class='warning'>Infected wound detected in subject [limb]. Disinfection recommended.</span>"
@@ -165,6 +177,7 @@ REAGENT SCANNER
for(var/datum/wound/W in e.wounds) if(W.internal)
user.show_message(text("<span class='warning'>Internal bleeding detected. Advanced scanner required for location.</span>"), 1)
break
if(M:vessel)
var/blood_volume = H.vessel.get_reagent_amount("blood")
var/blood_percent = round((blood_volume / H.species.blood_volume)*100)

View File

@@ -264,7 +264,7 @@
if(!(affecting.organ_tag in splintable_organs))
user << "<span class='danger'>You can't use \the [src] to apply a splint there!</span>"
return
if(affecting.status & ORGAN_SPLINTED)
if(affecting.splinted)
user << "<span class='danger'>[M]'s [limb] is already splinted!</span>"
return
if (M != user)
@@ -275,17 +275,21 @@
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))
if (M != user)
user.visible_message("<span class='danger'>[user] finishes applying \the [src] to [M]'s [limb].</span>", "<span class='danger'>You finish applying \the [src] to [M]'s [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
else
if(prob(25))
user.visible_message("<span class='danger'>[user] successfully applies \the [src] to their [limb].</span>", "<span class='danger'>You successfully apply \the [src] to your [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
else
user.visible_message("<span class='danger'>[user] fumbles \the [src].</span>", "<span class='danger'>You fumble \the [src].</span>", "<span class='danger'>You hear something being wrapped.</span>")
if(do_after(user, 50, M))
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
var/obj/item/stack/medical/splint/S = split(1)
if(S)
if(affecting.apply_splint(S))
S.forceMove(affecting)
if (M != user)
user.visible_message("<span class='danger'>\The [user] finishes applying [src] to [M]'s [limb].</span>", "<span class='danger'>You finish applying \the [src] to [M]'s [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
else
user.visible_message("<span class='danger'>\The [user] successfully applies [src] to their [limb].</span>", "<span class='danger'>You successfully apply \the [src] to your [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
return
affecting.status |= ORGAN_SPLINTED
use(1)
S.dropInto(src.loc) //didn't get applied, so just drop it
user.visible_message("<span class='danger'>\The [user] fails to apply [src].</span>", "<span class='danger'>You fail to apply [src].</span>", "<span class='danger'>You hear something being wrapped.</span>")
return

View File

@@ -115,6 +115,11 @@ var/last_chew = 0
last_chew = world.time
/obj/item/weapon/handcuffs/fuzzy
name = "fuzzy cuffs"
icon_state = "fuzzycuff"
desc = "Use this to keep... 'prisoners' in line."
/obj/item/weapon/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."

View File

@@ -164,12 +164,10 @@ Implant Specifics:<BR>"}
if (malfunction == MALFUNCTION_PERMANENT)
return
var/need_gib = null
if(istype(imp_in, /mob/))
var/mob/T = imp_in
message_admins("Explosive implant triggered in [T] ([T.key]). (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>) ")
log_game("Explosive implant triggered in [T] ([T.key]).")
need_gib = 1
if(ishuman(imp_in))
if (elevel == "Localized Limb")
@@ -180,11 +178,11 @@ Implant Specifics:<BR>"}
if (istype(part,/obj/item/organ/external/chest) || \
istype(part,/obj/item/organ/external/groin) || \
istype(part,/obj/item/organ/external/head))
part.createwound(BRUISE, 60) //mangle them instead
explosion(get_turf(imp_in), -1, -1, 2, 3)
part.createwound(BRUISE, 80) //mangle them instead
explosion(get_turf(imp_in), -1, -1, 1, 3)
qdel(src)
else
explosion(get_turf(imp_in), -1, -1, 2, 3)
explosion(get_turf(imp_in), -1, -1, 1, 3)
part.droplimb(0,DROPLIMB_BLUNT)
qdel(src)
if (elevel == "Destroy Body")
@@ -197,9 +195,6 @@ Implant Specifics:<BR>"}
else
explosion(get_turf(imp_in), 0, 1, 3, 6)
if(need_gib)
imp_in.gib()
var/turf/t = get_turf(imp_in)
if(t)
@@ -249,10 +244,10 @@ Implant Specifics:<BR>"}
if (istype(part,/obj/item/organ/external/chest) || \
istype(part,/obj/item/organ/external/groin) || \
istype(part,/obj/item/organ/external/head))
part.createwound(BRUISE, 60) //mangle them instead
part.createwound(BRUISE, 80) //mangle them instead
else
part.droplimb(0,DROPLIMB_BLUNT)
explosion(get_turf(imp_in), -1, -1, 2, 3)
explosion(get_turf(imp_in), -1, -1, 1, 3)
qdel(src)
/obj/item/weapon/implant/chem

View File

@@ -280,3 +280,59 @@
name = "emergency response team medical backpack"
desc = "A spacious backpack with lots of pockets, worn by medical members of an Emergency Response Team."
icon_state = "ert_medical"
/*
* Courier Bags
*/
/obj/item/weapon/storage/backpack/messenger
name = "messenger bag"
desc = "A sturdy backpack worn over one shoulder."
icon_state = "courierbag"
item_state_slots = list(slot_r_hand_str = "backpack", slot_l_hand_str = "backpack")
/obj/item/weapon/storage/backpack/messenger/chem
name = "chemistry messenger bag"
desc = "A serile backpack worn over one shoulder. This one is in Chemsitry colors."
icon_state = "courierbagchem"
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
/obj/item/weapon/storage/backpack/messenger/med
name = "medical messenger bag"
desc = "A sterile backpack worn over one shoulder used in medical departments."
icon_state = "courierbagmed"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
/obj/item/weapon/storage/backpack/messenger/viro
name = "virology messenger bag"
desc = "A sterile backpack worn over one shoulder. This one is in Virology colors."
icon_state = "courierbagviro"
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
/obj/item/weapon/storage/backpack/messenger/tox
name = "research messenger bag"
desc = "A backpack worn over one shoulder. Useful for holding science materials."
icon_state = "courierbagtox"
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
/obj/item/weapon/storage/backpack/messenger/com
name = "command messenger bag"
desc = "A special backpack worn over one shoulder. This one is made specifically for officers."
icon_state = "courierbagcom"
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
/obj/item/weapon/storage/backpack/messenger/engi
name = "engineering messenger bag"
icon_state = "courierbagengi"
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
/obj/item/weapon/storage/backpack/messenger/hyd
name = "hydroponics messenger bag"
desc = "A backpack worn over one shoulder. This one is designed for plant-related work."
icon_state = "courierbaghyd"
/obj/item/weapon/storage/backpack/messenger/sec
name = "security messenger bag"
desc = "A tactical backpack worn over one shoulder. This one is in Security colors."
icon_state = "courierbagsec"
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")

View File

@@ -56,6 +56,7 @@
/obj/item/weapon/extinguisher/mini,
/obj/item/device/flashlight/maglight,
/obj/item/weapon/tape_roll,
/obj/item/device/integrated_electronics/wirer,
)
/obj/item/weapon/storage/belt/utility/full/New()

View File

@@ -127,10 +127,10 @@
filled = TRUE
/obj/item/weapon/storage/toolbox/lunchbox/nt
name = "Nanotrasen brand lunchbox"
name = "NanoTrasen brand lunchbox"
icon_state = "lunchbox_nanotrasen"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
desc = "A little lunchbox. This one is branded with the Nanotrasen logo!"
desc = "A little lunchbox. This one is branded with the NanoTrasen logo!"
/obj/item/weapon/storage/toolbox/lunchbox/nt/filled
filled = TRUE

View File

@@ -11,11 +11,9 @@
..()
if (!prob(spawn_nothing_percentage))
spawn_item()
/obj/random/initialize()
..()
qdel(src)
// this function should return a specific item to spawn
/obj/random/proc/item_to_spawn()
return 0

View File

@@ -394,3 +394,6 @@
var/shake_dir = pick(-1, 1)
animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
/obj/structure/closet/onDropInto(var/atom/movable/AM)
return

View File

@@ -517,9 +517,9 @@
new /obj/item/clothing/under/color/yellow(src)
new /obj/item/clothing/under/color/green(src)
new /obj/item/clothing/under/color/pink(src)
new /obj/item/clothing/under/skirt/plaid_blue(src)
new /obj/item/clothing/under/skirt/plaid_red(src)
new /obj/item/clothing/under/skirt/plaid_purple(src)
new /obj/item/clothing/under/skirt/outfit/plaid_blue(src)
new /obj/item/clothing/under/skirt/outfit/plaid_red(src)
new /obj/item/clothing/under/skirt/outfit/plaid_purple(src)
new /obj/item/clothing/shoes/blue(src)
new /obj/item/clothing/shoes/yellow(src)
new /obj/item/clothing/shoes/green(src)

View File

@@ -265,7 +265,7 @@
/obj/structure/closet/crate/contraband
name = "Poster crate"
desc = "A random assortment of posters manufactured by providers NOT listed under Nanotrasen's whitelist."
desc = "A random assortment of posters manufactured by providers NOT listed under NanoTrasen's whitelist."
icon_state = "crate"
icon_opened = "crateopen"
icon_closed = "crate"

View File

@@ -238,7 +238,7 @@
#define FOOTSTEP_SPRITE_AMT 2
/turf/snow/Entered(atom/A)
if(ismob(A))
if(isliving(A))
var/mdir = "[A.dir]"
if(crossed_dirs[mdir])
crossed_dirs[mdir] = min(crossed_dirs[mdir] + 1, FOOTSTEP_SPRITE_AMT)

View File

@@ -30,7 +30,7 @@ var/const/station_orig = "Northern Star" //station_name can't be const due to ev
var/const/station_short = "Northern Star"
var/const/dock_name = "Vir Interstellar Spaceport"
var/const/boss_name = "Central Command"
var/const/boss_short = "Centcomm"
var/const/boss_short = "CentCom"
var/const/company_name = "NanoTrasen"
var/const/company_short = "NT"
var/const/star_name = "Vir"

View File

@@ -1323,19 +1323,19 @@
M.Weaken(20)
M.stuttering = 20
else if(href_list["CentcommReply"])
var/mob/living/L = locate(href_list["CentcommReply"])
else if(href_list["CentComReply"])
var/mob/living/L = locate(href_list["CentComReply"])
if(!istype(L))
usr << "This can only be used on instances of type /mob/living/"
return
if(L.can_centcom_reply())
var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from Centcomm", ""))
var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from CentCom", ""))
if(!input) return
src.owner << "You sent [input] to [L] via a secure channel."
log_admin("[src.owner] replied to [key_name(L)]'s Centcomm message with the message [input].")
message_admins("[src.owner] replied to [key_name(L)]'s Centcom message with: \"[input]\"")
log_admin("[src.owner] replied to [key_name(L)]'s CentCom message with the message [input].")
message_admins("[src.owner] replied to [key_name(L)]'s CentCom message with: \"[input]\"")
if(!isAI(L))
L << "<span class='info'>You hear something crackle in your headset for a moment before a voice speaks.</span>"
L << "<span class='info'>Please stand by for a message from Central Command.</span>"

View File

@@ -27,8 +27,8 @@
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
/proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage)
msg = "\blue <b><font color=orange>[uppertext(boss_short)]M[iamessage ? " IA" : ""]:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
/proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage)
msg = "\blue <b><font color=orange>[uppertext(boss_short)]M[iamessage ? " IA" : ""]:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentComReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg

View File

@@ -34,7 +34,7 @@
pref.all_underwear -= underwear_category_name
// TODO - Looks like this is duplicating the work of sanitize_character() if so, remove
if(pref.backbag > 4 || pref.backbag < 1)
if(pref.backbag > 5 || pref.backbag < 1)
pref.backbag = 1 //Same as above
character.backbag = pref.backbag

View File

@@ -248,3 +248,23 @@
/datum/gear/head/beretg/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/head/sombrero
display_name = "sombrero"
path = /obj/item/clothing/head/sombrero
/datum/gear/head/flatcapg
display_name = "flat cap"
path = /obj/item/clothing/head/flatcap/grey
/datum/gear/head/flatcapg/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/head/bow
display_name = "hair bow"
path = /obj/item/clothing/head/hairflower/bow
/datum/gear/head/bow/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)

View File

@@ -1,5 +1,5 @@
/obj/item/clothing/head/centhat
name = "\improper CentComm. hat"
name = "\improper CentCom. hat"
icon_state = "centcom"
desc = "It's good to be emperor."
siemens_coefficient = 0.9
@@ -32,6 +32,12 @@
/obj/item/clothing/head/hairflower/orange
icon_state = "hairflower_orange"
/obj/item/clothing/head/hairflower/bow
icon_state = "bow"
name = "hair bow"
desc = "A ribbon tied into a bow with a clip on the back to attach to hair."
item_state_slots = list(slot_r_hand_str = "pill", slot_l_hand_str = "pill")
/obj/item/clothing/head/powdered_wig
name = "powdered wig"
desc = "A powdered wig."
@@ -144,6 +150,10 @@
item_state_slots = list(slot_r_hand_str = "detective", slot_l_hand_str = "detective")
siemens_coefficient = 0.9 //...what?
/obj/item/clothing/head/flatcap/grey
icon_state = "flat_capg"
item_state_slots = list(slot_r_hand_str = "greysoft", slot_l_hand_str = "greysoft")
/obj/item/clothing/head/pirate
name = "pirate hat"
desc = "Yarr."
@@ -300,3 +310,9 @@
desc = "A beret, an artists favorite headwear."
icon_state = "beret_g"
body_parts_covered = 0
/obj/item/clothing/head/sombrero
name = "sombrero"
desc = "A wide-brimmed hat popularly worn in Mexico."
icon_state = "sombrero"
body_parts_covered = 0

View File

@@ -173,15 +173,25 @@
usable = 1
active = 1
permanent = 1
var/datum/effect/effect/system/smoke_spread/bad/smoke
var/smoke_strength = 8
engage_string = "Detonate"
interface_name = "dead man's switch"
interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button."
var/list/explosion_values = list(1,2,4,5)
interface_desc = "An integrated self-destruct module. When the wearer dies, they vanish in smoke. Do not press this button."
/obj/item/rig_module/self_destruct/New()
..()
src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad)
src.smoke.attach(src)
/obj/item/rig_module/self_destruct/Destroy()
qdel(smoke)
smoke = null
return ..()
/obj/item/rig_module/self_destruct/small
explosion_values = list(0,0,3,4)
/obj/item/rig_module/self_destruct/activate()
return
@@ -202,8 +212,8 @@
/obj/item/rig_module/self_destruct/engage(var/skip_check)
if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No")
return
explosion(get_turf(src), explosion_values[1], explosion_values[2], explosion_values[3], explosion_values[4])
if(holder && holder.wearer)
holder.wearer.drop_from_inventory(src)
qdel(holder)
qdel(src)
smoke.set_up(10, 0, holder.loc)
for(var/i = 1 to smoke_strength)
smoke.start(272727)
holder.wearer.ash()

View File

@@ -63,7 +63,7 @@
var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit.
/obj/item/clothing/suit/space/equipped(mob/M)
check_limb_support()
check_limb_support(M)
..()
/obj/item/clothing/suit/space/dropped(var/mob/user)
@@ -77,14 +77,24 @@
/obj/item/clothing/suit/space/proc/check_limb_support(var/mob/living/carbon/human/user)
// If this isn't set, then we don't need to care.
if(!supporting_limbs || !supporting_limbs.len)
if(!istype(user) || isnull(supporting_limbs))
return
if(!istype(user) || user.wear_suit == src)
return
if(user.wear_suit == src)
for(var/obj/item/organ/external/E in user.bad_external_organs)
if(E.is_broken() && E.apply_splint(src))
user << "You feel [src] constrict about your [E.name], supporting it."
supporting_limbs |= E
else
// Otherwise, remove the splints.
for(var/obj/item/organ/external/E in supporting_limbs)
if(E.splinted == src && E.remove_splint(src))
user << "\The [src] stops supporting your [E.name]."
supporting_limbs.Cut()
// Otherwise, remove the splints.
for(var/obj/item/organ/external/E in supporting_limbs)
E.status &= ~ ORGAN_SPLINTED
user << "The suit stops supporting your [E.name]."
supporting_limbs = list()
/obj/item/clothing/suit/space/proc/handle_fracture(var/mob/living/carbon/human/user, var/obj/item/organ/external/E)
if(!istype(user) || isnull(supporting_limbs))
return
if(E.is_broken() && E.apply_splint(src))
user << "You feel [src] constrict about your [E.name], supporting it."
supporting_limbs |= E

View File

@@ -7,6 +7,16 @@
item_state_slots = list(slot_r_hand_str = "eng_helm", slot_l_hand_str = "eng_helm")
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
/obj/item/clothing/head/helmet/space/void/engineering/hazmat
name = "HAZMAT voidsuit helmet"
icon_state = "rig0-engineering_rad"
item_state_slots = list(slot_r_hand_str = "eng_helm_rad", slot_l_hand_str = "eng_helm_rad")
/obj/item/clothing/head/helmet/space/void/engineering/construction
name = "construction voidsuit helmet"
icon_state = "rig0-engineering_con"
item_state_slots = list(slot_r_hand_str = "eng_helm_con", slot_l_hand_str = "eng_helm_con")
/obj/item/clothing/suit/space/void/engineering
name = "engineering voidsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
@@ -16,6 +26,16 @@
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
/obj/item/clothing/suit/space/void/engineering/hazmat
name = "HAZMAT voidsuit"
icon_state = "rig-engineering_rad"
item_state_slots = list(slot_r_hand_str = "eng_voidsuit_rad", slot_l_hand_str = "eng_voidsuit_rad")
/obj/item/clothing/suit/space/void/engineering/construction
name = "contstruction voidsuit"
icon_state = "rig-engineering_con"
item_state_slots = list(slot_r_hand_str = "eng_voidsuit_con", slot_l_hand_str = "eng_voidsuit_con")
//Mining
/obj/item/clothing/head/helmet/space/void/mining
name = "mining voidsuit helmet"
@@ -40,6 +60,11 @@
item_state_slots = list(slot_r_hand_str = "medical_helm", slot_l_hand_str = "medical_helm")
armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/void/medical/bio
name = "biohazard voidsuit helmet"
icon_state = "rig0-medical_bio"
item_state_slots = list(slot_r_hand_str = "medical_helm_bio", slot_l_hand_str = "medical_helm_bio")
/obj/item/clothing/suit/space/void/medical
name = "medical voidsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has minor radiation shielding."
@@ -48,6 +73,11 @@
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 = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
/obj/item/clothing/suit/space/void/medical/bio
name = "biohazard voidsuit"
icon_state = "rig-medical_bio"
item_state_slots = list(slot_r_hand_str = "medical_voidsuit_bio", slot_l_hand_str = "medical_voidsuit_bio")
//Security
/obj/item/clothing/head/helmet/space/void/security
name = "security voidsuit helmet"

View File

@@ -323,6 +323,12 @@
icon_badge = "detectivevest_badge"
icon_nobadge = "detectivevest_nobadge"
/obj/item/clothing/suit/storage/vest/press
name = "press vest"
desc = "A simple kevlar plate carrier. This one has the word 'Press' embroidered on patches on the back and front."
item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor")
allowed = list(/obj/item/device/flashlight,/obj/item/device/taperecorder,/obj/item/weapon/pen,/obj/item/device/camera_film,/obj/item/device/camera)
/obj/item/clothing/suit/storage/vest/heavy
name = "heavy armor vest"
desc = "A heavy kevlar plate carrier with webbing attached."

View File

@@ -91,10 +91,10 @@
//Argh, skirts be below this line -> ------------------------------
/obj/item/clothing/under/skirt
name = "black skirt"
desc = "A black skirt, very fancy!"
icon_state = "blackskirt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
name = "short black skirt"
desc = "A skirt that is a shiny black."
icon_state = "skirt_short_black"
body_parts_covered = LOWER_TORSO
rolled_sleeves = -1
/obj/item/clothing/under/skirt/khaki
@@ -102,11 +102,6 @@
desc = "A skirt that is a khaki color."
icon_state = "skirt_khaki"
/obj/item/clothing/under/skirt/black
name = "short black skirt"
desc = "A skirt that is a shiny black."
icon_state = "skirt_short_black"
/obj/item/clothing/under/skirt/blue
name = "short blue skirt"
desc = "A skirt that is a shiny blue."
@@ -122,19 +117,25 @@
desc = "A skirt that is swept to one side."
icon_state = "skirt_swept"
/obj/item/clothing/under/skirt/plaid_blue
/obj/item/clothing/under/skirt/outfit
name = "black skirt"
desc = "A black skirt, very fancy!"
icon_state = "blackskirt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/skirt/outfit/plaid_blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
icon_state = "plaid_blue"
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
/obj/item/clothing/under/skirt/plaid_red
/obj/item/clothing/under/skirt/outfit/plaid_red
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
icon_state = "plaid_red"
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
/obj/item/clothing/under/skirt/plaid_purple
/obj/item/clothing/under/skirt/outfit/plaid_purple
name = "blue purple skirt"
desc = "A preppy purple skirt with a white blouse."
icon_state = "plaid_purple"

View File

@@ -18,7 +18,7 @@ var/list/weighted_mundaneevent_locations = list()
//distance is measured in AU and co-relates to travel time
/datum/trade_destination/centcomm
name = "CentComm"
name = "CentCom"
description = "NanoTrasen's administrative centre for Tau Ceti."
distance = 1.2
willing_to_buy = list()

View File

@@ -8,7 +8,7 @@
that while in space, across star systems, and that the consumer can afford and use without training, is much more recent, and is thanks to the backbone \
that is the Exonet.<br>\
<br>\
The Exonet is the predominant interstellar telecom system, servicing trillions of devices across a large portion of human-controlled space. \
The Exonet is the predominant interstellar telecomm system, servicing trillions of devices across a large portion of human-controlled space. \
It is distributed by a massive network of telecommunication satellites, some privately owned and others owned by the systems<6D> local governments, \
that utilize FTL technologies to bounce data between satellites at speeds that would not be possible at sub-light technology. This communicator \
uses a protocol called Exonet Protocol Version 2, generally shortened to EPv2.<br>\

View File

@@ -30,7 +30,7 @@
Exonets at the root node(s), and is typically arranged in a tree structure. The root node(s) are generally government-owned and are very secure \
and resilient to failure.<br>\
<br>\
This node is privately owned and maintained by Nanotrasen, and allows the colonists of the "+station_orig+" to have access to the Exonet."
This node is privately owned and maintained by NanoTrasen, and allows the colonists of the "+station_orig+" to have access to the Exonet."
description_antag = "An EMP will disable this device for a short period of time. A longer downage can be achieved by turning it off, or rigging \
the APC it uses to turn off remotely, such as with a signaler in the right wire."

View File

@@ -146,7 +146,7 @@
for(var/datum/playingcard/P in cards)
H.cards += P
H.concealed = src.concealed
user.drop_from_inventory(src,user.loc)
user.drop_from_inventory(src)
qdel(src)
H.update_icon()
return

View File

@@ -0,0 +1,368 @@
#define DATA_CHANNEL "data channel"
#define PULSE_CHANNEL "pulse channel"
/obj/item/integrated_circuit
name = "integrated circuit"
desc = "It's a tiny chip! This one doesn't seem to do much, however."
icon = 'icons/obj/electronic_assemblies.dmi'
icon_state = "template"
w_class = 1
var/extended_desc = null
var/list/inputs = list()
var/list/outputs = list()
var/list/activators = list()
var/number_of_inputs = 0 //This is how many input pins are created
var/number_of_outputs = 0 //Likewise for output
var/number_of_activators = 0 //Guess
var/list/input_names = list()
var/list/output_names = list()
var/list/activator_names = list()
var/last_used = 0 //Uses world.time
var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'.
var/power_required = 5 //w
/obj/item/integrated_circuit/examine(mob/user)
..()
user << "This board has [inputs.len] input [inputs.len != 1 ? "pins" : "pin"] and \
[outputs.len] output [outputs.len != 1 ? "pins" : "pin"]."
for(var/datum/integrated_io/input/I in inputs)
if(I.linked.len)
user << "\The [I.name] is connected to [I.get_linked_to_desc()]."
for(var/datum/integrated_io/output/O in outputs)
if(O.linked.len)
user << "\The [O.name] is connected to [O.get_linked_to_desc()]."
for(var/datum/integrated_io/activate/A in activators)
if(A.linked.len)
user << "\The [A.name] is connected to [A.get_linked_to_desc()]."
interact(user)
/obj/item/integrated_circuit/New()
..()
var/i = 0
if(number_of_inputs)
for(i = number_of_inputs, i > 0, i--)
inputs.Add(new /datum/integrated_io/input(src))
if(number_of_outputs)
for(i = number_of_outputs, i > 0, i--)
outputs.Add(new /datum/integrated_io/output(src))
if(number_of_activators)
for(i = number_of_activators, i > 0, i--)
activators.Add(new /datum/integrated_io/activate(src))
apply_names_to_io()
/obj/item/integrated_circuit/proc/apply_names_to_io()
var/i = 1
if(input_names.len)
for(var/datum/integrated_io/input/I in inputs)
I.name = "[input_names[i]]"
i++
i = 1
if(output_names.len)
for(var/datum/integrated_io/output/O in outputs)
O.name = "[output_names[i]]"
i++
i = 1
if(activator_names.len)
for(var/datum/integrated_io/activate/A in activators)
A.name = "[activator_names[i]]"
i++
/obj/item/integrated_circuit/Destroy()
for(var/datum/integrated_io/I in inputs)
qdel(I)
for(var/datum/integrated_io/O in outputs)
qdel(O)
for(var/datum/integrated_io/A in activators)
qdel(A)
..()
/obj/item/integrated_circuit/emp_act(severity)
for(var/datum/integrated_io/io in inputs + outputs + activators)
io.scramble()
/obj/item/integrated_circuit/verb/rename_component()
set name = "Rename Circuit"
set category = "Object"
set desc = "Rename your circuit, useful to stay organized."
var/mob/M = usr
if(!M.canmove || M.stat || M.restrained())
return
var/input = sanitizeSafe(input("What do you want to name the circuit?", ,""), MAX_NAME_LEN)
if(src && input)
M << "<span class='notice'>The circuit '[src.name]' is now labeled '[input]'.</span>"
name = input
/obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number)
switch(pin_type)
if("input")
if(pin_number > inputs.len)
return null
return inputs[pin_number]
if("output")
if(pin_number > outputs.len)
return null
return outputs[pin_number]
if("activator")
if(pin_number > activators.len)
return null
return activators[pin_number]
return null
/obj/item/integrated_circuit/interact(mob/user)
if(get_dist(get_turf(src), user) > 1)
user.unset_machine(src)
return
var/HTML = "<html><head><title>[src.name]</title></head><body>"
HTML += "<div align='center'>"
HTML += "<table border='1' style='undefined;table-layout: fixed; width: 424px'>"
HTML += "<br><a href='?src=\ref[src];user=\ref[user]'>\[Refresh\]</a> | "
HTML += "<a href='?src=\ref[src];user=\ref[user];rename=1'>\[Rename\]</a><br>"
HTML += "<colgroup>"
HTML += "<col style='width: 121px'>"
HTML += "<col style='width: 181px'>"
HTML += "<col style='width: 122px'>"
HTML += "</colgroup>"
var/column_width = 3
var/row_height = max(inputs.len, outputs.len, 1)
var/i
var/j
for(i = 1, i < row_height+1, i++)
HTML += "<tr>"
for(j = 1, j < column_width+1, j++)
var/datum/integrated_io/io = null
var/words = null
var/height = 1
switch(j)
if(1)
io = get_pin_ref("input",i)
if(io)
if(io.linked.len)
words = "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]><b>[io.name] [io.display_data()]</b></a><br>"
for(var/datum/integrated_io/linked in io.linked)
words += "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>\[[linked.name]\]</a> \
@ <a href=?src=\ref[linked.holder];examine=1;user=\ref[user]>[linked.holder]</a><br>"
else // "Click <a href=?src=\ref[src];action=start>here</a>!"
words = "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>[io.name] [io.display_data()]</a><br>"
for(var/datum/integrated_io/linked in io.linked)
words += "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>\[[linked.name]\]</a> \
@ <a href=?src=\ref[linked.holder];examine=1;user=\ref[user]>[linked.holder]</a><br>"
if(outputs.len > inputs.len)
// height = Floor(outputs.len / inputs.len)
height = 1 // Because of bugs, if there's more outputs than inputs, it causes the output side to be hidden.
//world << "I wrote [words] at ([i],[j]). Height = [height]."
if(2)
if(i == 1)
words = "[src.name]<br><br>[src.desc]"
height = row_height
//world << "I wrote the center piece because i was equal to 1, at ([i],[j]). Height = [height]."
else
continue
if(3)
io = get_pin_ref("output",i)
if(io)
if(io.linked.len)
words = "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]><b>[io.name] [io.display_data()]</b></a><br>"
for(var/datum/integrated_io/linked in io.linked)
words += "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>\[[linked.name]\]</a> \
@ <a href=?src=\ref[linked.holder];examine=1;user=\ref[user]>[linked.holder]</a><br>"
else
words = "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>[io.name] [io.display_data()]</a><br>"
for(var/datum/integrated_io/linked in io.linked)
words += "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>\[[linked.name]\]</a> \
@ <a href=?src=\ref[linked.holder];examine=1;user=\ref[user]>[linked.holder]</a><br>"
if(inputs.len > outputs.len)
// height = Floor(inputs.len / outputs.len)
height = 1 // See above.
//world << "I wrote [words] at ([i],[j]). Height = [height]."
HTML += "<td align='center' rowspan='[height]'>[words]</td>"
//HTML += "<td align='center'>[words]</td>"
//world << "Writing to ([i],[j])."
HTML += "</tr>"
if(activators.len)
for(i = 1, i < activators.len+1, i++)
var/datum/integrated_io/io = null
var/words = null
io = get_pin_ref("activator",i)
if(io)
if(io.linked.len)
words = "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]><font color='FF0000'><b>[io.name]</b></font></a><br>"
for(var/datum/integrated_io/linked in io.linked)
words += "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>\[[linked.name]\]</a> \
@ <a href=?src[src];examine=1;user=\ref[user]>[linked.holder]</a><br>"
else // "Click <a href=?src=\ref[src];action=start>here</a>!"
words = "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]><font color='FF0000'>[io.name]</font></a><br>"
for(var/datum/integrated_io/linked in io.linked)
words += "<a href=?src=\ref[src];wire=1;user=\ref[user];pin=\ref[io]>\[[linked.name]\]</a> \
@ <a href=?src=\ref[linked.holder];examine=1;user=\ref[user]>[linked.holder]</a><br>"
HTML += "<tr>"
HTML += "<td colspan='3' align='center'>[words]</td>"
HTML += "</tr>"
HTML += "</table>"
HTML += "</div>"
HTML += "<br><font color='0000FF'>Complexity: [complexity]</font>"
HTML += "<br><font color='0000FF'>[extended_desc]</font>"
HTML += "</body></html>"
user << browse(HTML, "window=circuit-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1")
//user << sanitize(HTML, "window=debug;size=400x400;border=1;can_resize=1;can_close=1;can_minimize=1")
//world << sanitize(HTML)
user.set_machine(src)
onclose(user, "circuit-\ref[src]")
/obj/item/integrated_circuit/Topic(href, href_list[])
var/mob/living/user = locate(href_list["user"]) in mob_list
var/pin = locate(href_list["pin"]) in inputs + outputs + activators
if(!user || !user.Adjacent(get_turf(src)) )
return 1
if(!user.canmove || user.stat || user.restrained())
return
if(href_list["wire"])
if(ishuman(user) && Adjacent(user))
var/mob/living/carbon/human/H = user
var/obj/item/device/integrated_electronics/wirer/wirer = null
if(istype(H.r_hand, /obj/item/device/integrated_electronics/wirer))
wirer = H.r_hand
else if(istype(H.l_hand, /obj/item/device/integrated_electronics/wirer))
wirer = H.l_hand
if(wirer && pin)
wirer.wire(pin, user)
else
user << "<span class='warning'>You can't do a whole lot without tools.</span>"
if(href_list["examine"])
examine(user)
if(href_list["rename"])
rename_component(user)
interact(user) // To refresh the UI.
/datum/integrated_io
var/name = "input/output"
var/obj/item/integrated_circuit/holder = null
var/data = null
var/list/linked = list()
var/io_type = DATA_CHANNEL
/datum/integrated_io/New(var/newloc)
..()
holder = newloc
if(!holder)
message_admins("ERROR: An integrated_io ([src.name]) spawned without a holder! This is a bug.")
/datum/integrated_io/Destroy()
disconnect()
holder = null
..()
/datum/integrated_io/proc/display_data()
if(isnull(data))
return "(null)" // Empty data means nothing to show.
if(istext(data))
return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'.
if(istype(data, /atom))
var/atom/A = data
return "([A.name] \[Ref\])" // For refs, we want just the name displayed.
return "([data])" // Nothing special needed for numbers or other stuff.
/datum/integrated_io/activate/display_data()
return "(\[pulse\])"
/datum/integrated_io/proc/scramble()
if(isnull(data))
return
if(isnum(data))
data = rand(-10000, 10000)
if(istext(data))
data = "ERROR"
push_data()
/datum/integrated_io/activate/scramble()
push_data()
/datum/integrated_io/proc/push_data()
if(linked.len)
for(var/datum/integrated_io/io in linked)
io.data = data
/datum/integrated_io/activate/push_data()
if(linked.len)
for(var/datum/integrated_io/io in linked)
io.holder.work()
/datum/integrated_io/proc/pull_data()
if(linked.len)
for(var/datum/integrated_io/io in linked)
data = io.data
/datum/integrated_io/proc/get_linked_to_desc()
if(linked.len)
var/result = english_list(linked)
return "the [result]"
return "nothing"
/datum/integrated_io/proc/disconnect()
if(linked.len)
//First we iterate over everything we are linked to.
for(var/datum/integrated_io/their_io in linked)
//While doing that, we iterate them as well, and disconnect ourselves from them.
for(var/datum/integrated_io/their_linked_io in their_io.linked)
if(their_linked_io == src)
their_io.linked.Remove(src)
else
continue
//Now that we're removed from them, we gotta remove them from us.
src.linked.Remove(their_io)
/datum/integrated_io/input
name = "input pin"
/datum/integrated_io/output
name = "output pin"
/datum/integrated_io/activate
name = "activation pin"
io_type = PULSE_CHANNEL
/obj/item/integrated_circuit/proc/push_data()
for(var/datum/integrated_io/output/O in outputs)
O.push_data()
/obj/item/integrated_circuit/proc/pull_data()
for(var/datum/integrated_io/input/I in inputs)
I.push_data()
/obj/item/integrated_circuit/proc/work()
if(last_used + 2 SECONDS > world.time) // All intergrated circuits have an internal cooldown of two seconds to protect from spam.
return 0
last_used = world.time
return 1
/obj/item/integrated_circuit/proc/disconnect_all()
for(var/datum/integrated_io/input/I in inputs)
I.disconnect()
for(var/datum/integrated_io/output/O in outputs)
O.disconnect()
for(var/datum/integrated_io/activate/A in activators)
A.disconnect()

View File

@@ -0,0 +1,157 @@
//These circuits do simple math.
/obj/item/integrated_circuit/arithmetic
complexity = 1
number_of_inputs = 8
number_of_outputs = 1
number_of_activators = 1
input_names = list(
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H"
)
output_names = list(
"result"
)
activator_names = list(
"compute"
)
// +Adding+ //
/obj/item/integrated_circuit/arithmetic/addition
name = "addition circuit"
desc = "This circuit can add numbers together."
icon_state = "addition"
/obj/item/integrated_circuit/arithmetic/addition/work()
if(..())
var/result = 0
for(var/datum/integrated_io/input/I in inputs)
I.pull_data()
if(isnum(I.data))
result = result + I.data
for(var/datum/integrated_io/output/O in outputs)
O.data = result
O.push_data()
// -Subtracting- //
/obj/item/integrated_circuit/arithmetic/subtraction
name = "subtraction circuit"
desc = "This circuit can subtract numbers."
icon_state = "subtraction"
/obj/item/integrated_circuit/arithmetic/subtraction/work()
if(..())
var/result = 0
for(var/datum/integrated_io/input/I in inputs)
I.pull_data()
if(isnum(I.data))
result = result - I.data
for(var/datum/integrated_io/output/O in outputs)
O.data = result
O.push_data()
// *Multiply* //
/obj/item/integrated_circuit/arithmetic/multiplication
name = "multiplication circuit"
desc = "This circuit can multiply numbers."
icon_state = "multiplication"
/obj/item/integrated_circuit/arithmetic/subtraction/work()
if(..())
var/result = 0
for(var/datum/integrated_io/input/I in inputs)
I.pull_data()
if(isnum(I.data))
result = result * I.data
for(var/datum/integrated_io/output/O in outputs)
O.data = result
O.push_data()
// /Division/ //
/obj/item/integrated_circuit/arithmetic/division
name = "division circuit"
desc = "This circuit can divide numbers, just don't think about trying to divide by zero!"
icon_state = "division"
/obj/item/integrated_circuit/arithmetic/division/work()
if(..())
var/result = 0
for(var/datum/integrated_io/input/I in inputs)
I.pull_data()
if(isnum(I.data) && I.data != 0) //No runtimes here.
result = result / I.data
for(var/datum/integrated_io/output/O in outputs)
O.data = result
O.push_data()
// Absolute //
/obj/item/integrated_circuit/arithmetic/absolute
name = "absolute circuit"
desc = "This outputs a non-negative version of the number you put in. This may also be thought of as its distance from zero."
icon_state = "absolute"
number_of_inputs = 1
number_of_outputs = 1
/obj/item/integrated_circuit/arithmetic/absolute/work()
if(..())
var/result = 0
for(var/datum/integrated_io/input/I in inputs)
I.pull_data()
if(isnum(I.data) && I.data != 0)
result = abs(result)
for(var/datum/integrated_io/output/O in outputs)
O.data = result
O.push_data()
// Averaging //
/obj/item/integrated_circuit/arithmetic/average
name = "average circuit"
desc = "This circuit is of average quality, however it will compute the average for numbers you give it."
icon_state = "average"
/obj/item/integrated_circuit/arithmetic/average/work()
if(..())
var/result = 0
var/inputs_used = 0
for(var/datum/integrated_io/input/I in inputs)
I.pull_data()
if(isnum(I.data))
inputs_used++
result = result + I.data
if(inputs_used)
result = result / inputs_used
for(var/datum/integrated_io/output/O in outputs)
O.data = result
O.push_data()
// Pi, because why the hell not? //
/obj/item/integrated_circuit/arithmetic/pi
name = "pi constant circuit"
desc = "Not recommended for cooking. Outputs '3.14159' when it receives a pulse."
icon_state = "pi"
number_of_inputs = 0
number_of_outputs = 1
/obj/item/integrated_circuit/arithmetic/pi/work()
if(..())
var/datum/integrated_io/output/O = outputs[1]
O.data = 3.14159
O.push_data()

View File

@@ -0,0 +1,120 @@
/obj/item/device/electronic_assembly
name = "electronic assembly"
desc = "It's a case, for building electronics with."
w_class = 2
icon = 'icons/obj/electronic_assemblies.dmi'
icon_state = "setup_small"
var/max_components = 10
var/max_complexity = 30
var/opened = 0
/obj/item/device/electronic_assembly/medium
name = "electronic mechanism"
icon_state = "setup_medium"
w_class = 3
max_components = 20
max_complexity = 50
/obj/item/device/electronic_assembly/large
name = "electronic machine"
icon_state = "setup"
w_class = 4
max_components = 30
max_complexity = 60
/*
/obj/item/device/electronic_assembly/New()
..()
processing_objects |= src
/obj/item/device/electronic_assembly/Destroy()
processing_objects.Remove(src)
..()
/obj/item/device/electronic_assembly/process()
for(var/obj/item/integrated_circuit/IC in contents)
IC.work()
*/
/obj/item/device/electronic_assembly/update_icon()
if(opened)
icon_state = initial(icon_state) + "-open"
else
icon_state = initial(icon_state)
/obj/item/device/electronic_assembly/examine(mob/user)
..()
if(user.Adjacent(src))
if(!opened)
for(var/obj/item/integrated_circuit/output/screen/S in contents)
if(S.stuff_to_display)
user << "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'."
else
var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents
if(IC)
IC.examine(user)
/obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/integrated_circuit))
if(!opened)
user << "<span class='warning'>\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.</span>"
return 0
var/obj/item/integrated_circuit/IC = I
var/total_parts = 0
var/total_complexity = 0
for(var/obj/item/integrated_circuit/part in contents)
total_parts++
total_complexity = total_complexity + part.complexity
if( (total_parts + 1) >= max_components)
user << "<span class='warning'>You can't seem to add this [IC.name], since there's no more room.</span>"
return 0
if( (total_complexity + IC.complexity) >= max_complexity)
user << "<span class='warning'>You can't seem to add this [IC.name], since this setup's too complicated for the case.</span>"
return 0
user << "<span class='notice'>You slide \the [IC] inside \the [src].</span>"
user.drop_item()
IC.forceMove(src)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(istype(I, /obj/item/weapon/screwdriver))
if(!opened)
user << "<span class='warning'>\The [src] isn't opened, so you can't remove anything inside. Try using a crowbar.</span>"
return 0
if(!contents.len)
user << "<span class='warning'>There's nothing inside this to remove!</span>"
return 0
var/obj/item/integrated_circuit/option = input("What do you want to remove?", "Component Removal") as null|anything in contents
if(option)
option.disconnect_all()
option.forceMove(get_turf(src))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "<span class='notice'>You pop \the [option] out of the case, and slide it out.</span>"
if(istype(I, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
opened = !opened
user << "<span class='notice'>You [opened ? "opened" : "closed"] \the [src].</span>"
update_icon()
if(istype(I, /obj/item/device/integrated_electronics/wirer))
if(opened)
var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents
if(IC)
IC.examine(user)
else
user << "<span class='warning'>\The [src] isn't opened, so you can't fiddle with the internal components. \
Try using a crowbar.</span>"
/obj/item/device/electronic_assembly/attack_self(mob/user)
var/list/available_inputs = list()
for(var/obj/item/integrated_circuit/input/input in contents)
if(input.can_be_asked_input)
available_inputs.Add(input)
var/obj/item/integrated_circuit/input/choice = input(user, "What do you want to interact with?", "Interaction") as null|anything in available_inputs
if(choice)
choice.ask_for_input(user)
/obj/item/device/electronic_assembly/emp_act(severity)
..()
for(var/atom/movable/AM in contents)
AM.emp_act(severity)

View File

@@ -0,0 +1,96 @@
//These circuits convert one variable to another.
/obj/item/integrated_circuit/converter
complexity = 2
number_of_inputs = 1
number_of_outputs = 1
number_of_activators = 1
input_names = list(
"input",
)
output_names = list(
"result"
)
activator_names = list(
"convert"
)
/obj/item/integrated_circuit/converter/num2text
name = "number to string"
desc = "This circuit can convert a number variable into a string."
icon_state = "addition"
/obj/item/integrated_circuit/converter/num2text/work()
if(..())
var/result = null
var/datum/integrated_io/incoming = inputs[1]
var/datum/integrated_io/outgoing = outputs[1]
if(incoming.data && isnum(incoming.data))
result = num2text(incoming.data)
outgoing.data = result
outgoing.push_data()
/obj/item/integrated_circuit/converter/text2num
name = "string to number"
desc = "This circuit can convert a string variable into a number."
icon_state = "addition"
/obj/item/integrated_circuit/converter/text2num/work()
if(..())
var/result = null
var/datum/integrated_io/incoming = inputs[1]
var/datum/integrated_io/outgoing = outputs[1]
if(incoming.data && istext(incoming.data))
result = text2num(incoming.data)
outgoing.data = result
outgoing.push_data()
/obj/item/integrated_circuit/converter/ref2text
name = "reference to string"
desc = "This circuit can convert a reference to something else to a string, specifically the name of that reference."
icon_state = "addition"
/obj/item/integrated_circuit/converter/ref2text/work()
if(..())
var/result = null
var/datum/integrated_io/incoming = inputs[1]
var/datum/integrated_io/outgoing = outputs[1]
if(incoming.data && istype(incoming.data, /atom/))
var/atom/A = incoming.data
result = A.name
outgoing.data = result
outgoing.push_data()
/obj/item/integrated_circuit/converter/lowercase
name = "lowercase string converter"
desc = "this will cause a string to come out in all lowercase."
icon_state = "addition"
/obj/item/integrated_circuit/converter/lowercase/work()
if(..())
var/result = null
var/datum/integrated_io/incoming = inputs[1]
var/datum/integrated_io/outgoing = outputs[1]
if(incoming.data && istext(incoming.data))
result = lowertext(incoming.data)
outgoing.data = result
outgoing.push_data()
/obj/item/integrated_circuit/converter/uppercase
name = "uppercase string converter"
desc = "THIS WILL CAUSE A STRING TO COME OUT IN ALL UPPERCASE."
icon_state = "addition"
/obj/item/integrated_circuit/converter/uppercase/work()
if(..())
var/result = null
var/datum/integrated_io/incoming = inputs[1]
var/datum/integrated_io/outgoing = outputs[1]
if(incoming.data && istext(incoming.data))
result = uppertext(incoming.data)
outgoing.data = result
outgoing.push_data()

View File

@@ -0,0 +1,74 @@
//This circuit gives information on where the machine is.
/obj/item/integrated_circuit/gps
name = "global positioning system"
desc = "This allows you to easily know the position of a machine containing this device."
complexity = 4
number_of_inputs = 0
number_of_outputs = 2
number_of_activators = 1
input_names = list(
)
output_names = list(
"X (abs)",
"Y (abs)"
)
activator_names = list(
"get coordinates"
)
/obj/item/integrated_circuit/gps/work()
if(..())
var/turf/T = get_turf(src)
var/datum/integrated_io/result_x = outputs[1]
var/datum/integrated_io/result_y = outputs[2]
result_x.data = null
result_y.data = null
if(!T)
return
result_x.data = T.x
result_y.data = T.y
for(var/datum/integrated_io/output/O in outputs)
O.push_data()
/obj/item/integrated_circuit/abs_to_rel_coords
name = "abs to rel coordinate converter"
desc = "Easily convert absolute coordinates to relative coordinates with this."
complexity = 4
number_of_inputs = 0
number_of_outputs = 4
number_of_activators = 1
input_names = list(
"X1 (abs)",
"Y1 (abs)",
"X2 (abs)",
"Y2 (abs)"
)
output_names = list(
"X (rel)",
"Y (rel)"
)
activator_names = list(
"compute rel coordinates"
)
/obj/item/integrated_circuit/abs_to_rel_coords/work()
var/datum/integrated_io/x1 = inputs[1]
var/datum/integrated_io/y1 = inputs[2]
var/datum/integrated_io/x2 = inputs[3]
var/datum/integrated_io/y2 = inputs[4]
var/datum/integrated_io/result_x = outputs[1]
var/datum/integrated_io/result_y = outputs[2]
if(x1.data && y1.data && x2.data && y2.data)
result_x.data = x1.data - x2.data
result_y.data = y1.data - y2.data
for(var/datum/integrated_io/output/O in outputs)
O.push_data()
..()

View File

@@ -0,0 +1,79 @@
/obj/item/integrated_circuit/transfer/splitter
name = "splitter"
desc = "Splits incoming data into all of the output pins."
icon_state = "splitter"
complexity = 3
number_of_inputs = 1
number_of_outputs = 2
input_names = list(
"data to split"
)
output_names = list(
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H"
)
/obj/item/integrated_circuit/transfer/splitter/medium
name = "four splitter"
icon_state = "splitter4"
complexity = 5
number_of_inputs = 1
number_of_outputs = 4
/obj/item/integrated_circuit/transfer/splitter/large
name = "eight splitter"
icon_state = "splitter8"
complexity = 9
number_of_inputs = 1
number_of_outputs = 8
/obj/item/integrated_circuit/transfer/splitter/work()
if(..())
var/datum/integrated_io/I = inputs[1]
for(var/datum/integrated_io/output/O in outputs)
O.data = I.data
/obj/item/integrated_circuit/transfer/activator_splitter
name = "activator splitter"
desc = "Splits incoming activation pulses into all of the output pins."
icon_state = "splitter"
complexity = 3
number_of_activators = 3
activator_names = list(
"incoming pulse",
"outgoing pulse A",
"outgoing pulse B",
"outgoing pulse C",
"outgoing pulse D",
"outgoing pulse E",
"outgoing pulse F",
"outgoing pulse G",
"outgoing pulse H"
)
/obj/item/integrated_circuit/transfer/activator_splitter/work()
if(..())
for(var/datum/integrated_io/activate/A in outputs)
if(A == activators[1])
continue
if(A.linked.len)
for(var/datum/integrated_io/activate/target in A.linked)
target.holder.work()
/obj/item/integrated_circuit/transfer/activator_splitter/medium
name = "four activator splitter"
icon_state = "splitter4"
complexity = 5
number_of_activators = 5
/obj/item/integrated_circuit/transfer/activator_splitter/large
name = "eight activator splitter"
icon_state = "splitter4"
complexity = 9
number_of_activators = 9

View File

@@ -0,0 +1,218 @@
/obj/item/integrated_circuit/input
var/can_be_asked_input = 0
/obj/item/integrated_circuit/input/proc/ask_for_input(mob/user)
return
/obj/item/integrated_circuit/input/button
name = "button"
desc = "This tiny button must do something, right?"
icon_state = "button"
number_of_inputs = 0
number_of_outputs = 0
number_of_activators = 1
complexity = 1
can_be_asked_input = 1
activator_names = list(
"on pressed"
)
/obj/item/integrated_circuit/input/button/ask_for_input(mob/user) //Bit misleading name for this specific use.
var/datum/integrated_io/A = activators[1]
if(A.linked.len)
for(var/datum/integrated_io/activate/target in A.linked)
target.holder.work()
user << "<span class='notice'>You press the button labeled '[src.name]'.</span>"
/obj/item/integrated_circuit/input/numberpad
name = "number pad"
desc = "This small number pad allows someone to input a number into the system."
icon_state = "numberpad"
number_of_inputs = 0
number_of_outputs = 1
number_of_activators = 1
complexity = 2
can_be_asked_input = 1
output_names = list(
"number entered"
)
activator_names = list(
"on entered"
)
/obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user)
var/new_input = input(user, "Enter a number, please.","Number pad") as null|num
if(isnum(new_input))
var/datum/integrated_io/O = outputs[1]
O.data = new_input
O.push_data()
var/datum/integrated_io/A = activators[1]
if(A.linked)
A.holder.work()
/obj/item/integrated_circuit/input/textpad
name = "text pad"
desc = "This small text pad allows someone to input a string into the system."
icon_state = "numberpad"
number_of_inputs = 0
number_of_outputs = 1
number_of_activators = 1
complexity = 2
can_be_asked_input = 1
output_names = list(
"string entered"
)
activator_names = list(
"on entered"
)
/obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user)
var/new_input = input(user, "Enter some words, please.","Number pad") as null|text
if(new_input && istext(new_input))
var/datum/integrated_io/O = outputs[1]
O.data = new_input
O.push_data()
var/datum/integrated_io/A = activators[1]
if(A.linked)
A.holder.work()
/obj/item/integrated_circuit/input/med_scanner
name = "integrated medical analyser"
desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is."
number_of_inputs = 1
number_of_outputs = 2
number_of_activators = 1
complexity = 4
input_names = list(
"target ref"
)
output_names = list(
"total health %",
"total missing health"
)
activator_names = list(
"scan"
)
/obj/item/integrated_circuit/input/med_scanner/work()
if(..())
var/datum/integrated_io/I = inputs[1]
if(!I.data || !ishuman(I.data)) //Invalid input
return
var/mob/living/carbon/human/H = I.data
if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range.
var/total_health = round(H.health/H.maxHealth, 0.1)*100
var/missing_health = H.maxHealth - H.health
var/datum/integrated_io/total = outputs[1]
var/datum/integrated_io/missing = outputs[2]
total.data = total_health
missing.data = missing_health
for(var/datum/integrated_io/output/O in outputs)
O.push_data()
/obj/item/integrated_circuit/input/adv_med_scanner
name = "integrated advanced medical analyser"
desc = "A very small version of the common medical analyser. 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."
number_of_inputs = 1
number_of_outputs = 7
number_of_activators = 1
complexity = 12
input_names = list(
"target ref"
)
output_names = list(
"total health %",
"total missing health",
"brute damage",
"burn damage",
"tox damage",
"oxy damage",
"clone damage"
)
activator_names = list(
"scan"
)
/obj/item/integrated_circuit/input/adv_med_scanner/work()
if(..())
var/datum/integrated_io/I = inputs[1]
if(!I.data || !ishuman(I.data)) //Invalid input
return
var/mob/living/carbon/human/H = I.data
if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range.
var/total_health = round(H.health/H.maxHealth, 0.1)*100
var/missing_health = H.maxHealth - H.health
var/datum/integrated_io/total = outputs[1]
var/datum/integrated_io/missing = outputs[2]
var/datum/integrated_io/brute = outputs[3]
var/datum/integrated_io/burn = outputs[4]
var/datum/integrated_io/tox = outputs[5]
var/datum/integrated_io/oxy = outputs[6]
var/datum/integrated_io/clone = outputs[7]
total.data = total_health
missing.data = missing_health
brute.data = H.getBruteLoss()
burn.data = H.getFireLoss()
tox.data = H.getToxLoss()
oxy.data = H.getOxyLoss()
clone.data = H.getCloneLoss()
for(var/datum/integrated_io/output/O in outputs)
O.push_data()
/obj/item/integrated_circuit/input/local_locator
name = "local locator"
desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \
that is holding the machine containing it."
number_of_inputs = 0
number_of_outputs = 1
number_of_activators = 1
complexity = 4
output_names = list(
"located ref"
)
activator_names = list(
"locate"
)
/obj/item/integrated_circuit/input/local_locator/work()
if(..())
var/mob/living/L = null
var/datum/integrated_io/O = outputs[1]
O.data = null
if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine.
var/obj/item/device/electronic_assembly/assembly = src.loc
if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us.
L = assembly.loc
if(L)
O.data = L
O.push_data()
/obj/item/integrated_circuit/output/screen
name = "screen"
desc = "This small screen can display a single piece of data, when the machine is examined closely."
icon_state = "screen"
complexity = 4
number_of_inputs = 1
number_of_outputs = 0
number_of_activators = 1
input_names = list(
"displayed data"
)
activator_names = list(
"load data"
)
var/stuff_to_display = null
/obj/item/integrated_circuit/output/screen/work()
var/datum/integrated_io/I = inputs[1]
stuff_to_display = I.data

View File

@@ -0,0 +1,172 @@
/obj/item/integrated_circuit/logic
name = "logic gate"
desc = "This tiny chip will decide for you!"
complexity = 3
number_of_inputs = 2
number_of_outputs = 1
number_of_activators = 2
input_names = list(
"A",
"B"
)
output_names = list(
"result"
)
activator_names = list(
"compare",
"on true result"
)
/obj/item/integrated_circuit/logic/equals
name = "equal gate"
desc = "This gate compares two values, and outputs the number one if both are the same."
icon_state = "equal"
/obj/item/integrated_circuit/logic/equals/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
var/datum/integrated_io/P = activators[2]
if(A.data == B.data)
O.data = 1
O.push_data()
P.push_data()
else
O.data = 0
/obj/item/integrated_circuit/logic/not
name = "not gate"
desc = "This gate inverts what's fed into it."
icon_state = "not"
number_of_inputs = 1
number_of_outputs = 1
number_of_activators = 1
output_names = list(
"invert"
)
/obj/item/integrated_circuit/logic/not/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/O = outputs[1]
if(A.data)
O.data = !A.data
O.push_data()
else
O.data = 0
/obj/item/integrated_circuit/logic/and
name = "and gate"
desc = "This gate will output 'one' if both inputs evaluate to true."
icon_state = "and"
/obj/item/integrated_circuit/logic/and/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
var/datum/integrated_io/P = activators[2]
if(A.data && B.data)
O.data = 1
O.push_data()
A.push_data()
P.push_data()
else
O.data = 0
/obj/item/integrated_circuit/logic/or
name = "or gate"
desc = "This gate will output 'one' if one of the inputs evaluate to true."
icon_state = "or"
/obj/item/integrated_circuit/logic/or/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
var/datum/integrated_io/P = activators[2]
if(A.data || B.data)
O.data = 1
O.push_data()
A.push_data()
P.push_data()
else
O.data = 0
/obj/item/integrated_circuit/logic/less_than
name = "less than gate"
desc = "This will output 'one' if the first input is less than the second input."
icon_state = "less_than"
/obj/item/integrated_circuit/logic/less_than/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
var/datum/integrated_io/P = activators[2]
if(A.data < B.data)
O.data = 1
O.push_data()
A.push_data()
P.push_data()
else
O.data = 0
/obj/item/integrated_circuit/logic/less_than_or_equal
name = "less than or equal gate"
desc = "This will output 'one' if the first input is less than, or equal to the second input."
icon_state = "less_than_or_equal"
/obj/item/integrated_circuit/logic/less_than_or_equal/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
var/datum/integrated_io/P = activators[2]
if(A.data <= B.data)
O.data = 1
O.push_data()
A.push_data()
P.push_data()
else
O.data = 0
/obj/item/integrated_circuit/logic/greater_than
name = "greater than gate"
desc = "This will output 'one' if the first input is greater than the second input."
icon_state = "greater_than"
/obj/item/integrated_circuit/logic/greater_than/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
var/datum/integrated_io/P = activators[2]
if(A.data > B.data)
O.data = 1
O.push_data()
A.push_data()
P.push_data()
else
O.data = 0
/obj/item/integrated_circuit/logic/greater_than_or_equal
name = "greater_than or equal gate"
desc = "This will output 'one' if the first input is greater than, or equal to the second input."
icon_state = "greater_than_or_equal"
/obj/item/integrated_circuit/logic/greater_than_or_equal/work()
if(..())
var/datum/integrated_io/A = inputs[1]
var/datum/integrated_io/B = inputs[2]
var/datum/integrated_io/O = outputs[1]
var/datum/integrated_io/P = activators[2]
if(A.data >= B.data)
O.data = 1
O.push_data()
A.push_data()
P.push_data()
else
O.data = 0

View File

@@ -0,0 +1,116 @@
/obj/item/integrated_circuit/manipulation/weapon_firing
name = "weapon firing mechanism"
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
extended_desc = "The firing mechanism can slot in most ranged weapons, ballistic and energy. \
The first and second inputs need to be numbers. They are coordinates for the gun to fire at, relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Note that the \
normal limitations to firearms, such as ammunition requirements and firing delays, still hold true if fired by the mechanism."
complexity = 20
number_of_inputs = 2
number_of_outputs = 0
number_of_activators = 1
input_names = list(
"target X rel",
"target Y rel"
)
activator_names = list(
"fire"
)
var/obj/item/weapon/gun/installed_gun = null
/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
qdel(installed_gun)
..()
/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user)
if(istype(O, /obj/item/weapon/gun))
var/obj/item/weapon/gun/gun = O
if(installed_gun)
user << "<span class='warning'>There's already a weapon installed.</span>"
return
user.drop_from_inventory(gun)
installed_gun = gun
gun.forceMove(src)
user << "<span class='notice'>You slide \the [gun] into the firing mechanism.</span>"
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
else
..()
/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
if(installed_gun)
installed_gun.forceMove(get_turf(src))
user << "<span class='notice'>You slide \the [installed_gun] out of the firing mechanism.</span>"
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
installed_gun = null
else
user << "<span class='notice'>There's no weapon to remove from the mechanism.</span>"
/obj/item/integrated_circuit/manipulation/weapon_firing/work()
if(!installed_gun)
return
var/datum/integrated_io/target_x = inputs[1]
var/datum/integrated_io/target_y = inputs[2]
if(target_x.data && target_y.data && isnum(target_x.data) && isnum(target_y.data))
var/turf/T = get_turf(src)
if(target_x.data == 0 && target_y.data == 0) // Don't shoot ourselves.
return
// We need to do this in order to enable relative coordinates, as locate() only works for absolute coordinates.
var/i
if(target_x.data > 0)
i = abs(target_x.data)
while(i)
T = get_step(T, EAST)
i--
else if(target_x.data < 0)
i = abs(target_x.data)
while(i)
T = get_step(T, WEST)
i--
if(target_y.data > 0)
i = abs(target_y.data)
while(i)
T = get_step(T, NORTH)
i--
else if(target_y.data < 0)
i = abs(target_y.data)
while(i)
T = get_step(T, SOUTH)
i--
if(!T)
return
installed_gun.Fire_userless(T)
/obj/item/integrated_circuit/manipulation/smoke
name = "smoke generator"
desc = "Unlike most electronics, creating smoke is completely intentional."
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
into the smoke clouds when activated."
flags = OPENCONTAINER
complexity = 20
number_of_inputs = 0
number_of_outputs = 0
number_of_activators = 1
input_names = list()
activator_names = list(
"create smoke"
)
/obj/item/integrated_circuit/manipulation/smoke/New()
..()
create_reagents(100)
/obj/item/integrated_circuit/manipulation/smoke/work()
if(..())
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new()
smoke_system.set_up(reagents, 10, 0, get_turf(src))
spawn(0)
for(var/i = 1 to 8)
smoke_system.start()
reagents.clear_reagents()

View File

@@ -0,0 +1,98 @@
/obj/item/integrated_circuit/memory
name = "memory chip"
desc = "This tiny chip can store one piece of data."
icon_state = "memory"
complexity = 1
number_of_inputs = 1
number_of_outputs = 1
number_of_activators = 1
activator_names = list(
"set"
)
/obj/item/integrated_circuit/memory/examine(mob/user)
..()
var/i
for(i = 1, i <= outputs.len, i++)
var/datum/integrated_io/O = outputs[i]
user << "\The [src] has [O.data ? "'O.data'" : "nothing"] saved to address [i]."
/obj/item/integrated_circuit/memory/work()
if(..())
var/i
for(i = 1, i <= inputs.len, i++)
var/datum/integrated_io/I = inputs[i]
var/datum/integrated_io/O = outputs[i]
O.data = I.data
/obj/item/integrated_circuit/memory/medium
name = "memory circuit"
desc = "This circuit can store four pieces of data."
icon_state = "memory4"
complexity = 4
number_of_inputs = 4
number_of_outputs = 4
/obj/item/integrated_circuit/memory/large
name = "large memory circuit"
desc = "This big circuit can hold eight pieces of data."
icon_state = "memory8"
complexity = 8
number_of_inputs = 8
number_of_outputs = 8
/obj/item/integrated_circuit/memory/huge
name = "large memory stick"
desc = "This stick of memory can hold up up to sixteen pieces of data."
icon_state = "memory16"
complexity = 16
number_of_inputs = 16
number_of_outputs = 16
/obj/item/integrated_circuit/memory/constant
name = "constant chip"
desc = "This tiny chip can store one piece of data, which cannot be overwritten without disassembly."
icon_state = "memory"
complexity = 1
number_of_inputs = 0
number_of_outputs = 1
number_of_activators = 1
activator_names = list(
"push data"
)
var/accepting_refs = 0
/obj/item/integrated_circuit/memory/constant/work()
var/datum/integrated_io/O = outputs[1]
O.push_data()
/obj/item/integrated_circuit/memory/constant/attack_self(mob/user)
var/datum/integrated_io/O = outputs[1]
var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref")
var/new_data = null
switch(type_to_use)
if("string")
accepting_refs = 0
new_data = input("Now type in a string.","[src] string writing") as null|text
if(istext(new_data))
O.data = new_data
user << "<span class='notice'>You set \the [src]'s memory to [O.display_data()].</span>"
if("number")
accepting_refs = 0
new_data = input("Now type in a number.","[src] number writing") as null|num
if(isnum(new_data))
O.data = new_data
user << "<span class='notice'>You set \the [src]'s memory to [O.display_data()].</span>"
if("ref")
accepting_refs = 1
user << "<span class='notice'>You turn \the [src]'s ref scanner on. Slide it across \
an object for a ref of that object to save it in memory.</span>"
/obj/item/integrated_circuit/memory/constant/afterattack(atom/target, mob/living/user, proximity)
if(accepting_refs && proximity)
var/datum/integrated_io/O = outputs[1]
O.data = target
visible_message("<span class='notice'>[user] slides \a [src]'s over \the [target].</span>")
user << "<span class='notice'>You set \the [src]'s memory to a reference to [O.display_data()]. The ref scanner is \
now off.</span>"
accepting_refs = 0

View File

@@ -0,0 +1,134 @@
/obj/item/integrated_circuit/time
name = "time circuit"
desc = "Now you can build your own clock!"
complexity = 2
number_of_inputs = 0
number_of_outputs = 0
/obj/item/integrated_circuit/time/delay
name = "two-sec delay circuit"
desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
This circuit is set to send a pulse after a delay of two seconds."
number_of_activators = 2
var/delay = 20
activator_names = list(
"incoming pulse",
"outgoing pulse"
)
/obj/item/integrated_circuit/time/delay/work()
if(..())
var/datum/integrated_io/out_pulse = activators[2]
sleep(delay)
out_pulse.push_data()
/obj/item/integrated_circuit/time/delay/five_sec
name = "five-sec delay circuit"
desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
This circuit is set to send a pulse after a delay of five seconds."
delay = 50
/obj/item/integrated_circuit/time/delay/one_sec
name = "one-sec delay circuit"
desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
This circuit is set to send a pulse after a delay of one second."
delay = 10
/obj/item/integrated_circuit/time/delay/half_sec
name = "half-sec delay circuit"
desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
This circuit is set to send a pulse after a delay of half a second."
delay = 5
/obj/item/integrated_circuit/time/delay/tenth_sec
name = "tenth-sec delay circuit"
desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
This circuit is set to send a pulse after a delay of 1/10th of a second."
delay = 1
/obj/item/integrated_circuit/time/delay/custom
name = "custom delay circuit"
desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
This circuit's delay can be customized, between 1/10th of a second to one hour. The delay is updated upon receiving a pulse."
number_of_inputs = 1
input_names = list(
"delay time",
)
/obj/item/integrated_circuit/time/delay/custom/work()
var/datum/integrated_io/delay_input = inputs[1]
if(delay_input.data && isnum(delay_input.data) )
var/new_delay = min(delay_input.data, 1)
new_delay = max(new_delay, 36000) //An hour.
delay = new_delay
..()
/obj/item/integrated_circuit/time/ticker
name = "ticker circuit"
desc = "This circuit sends an automatic pulse every four seconds."
complexity = 8
number_of_inputs = 1
number_of_activators = 1
var/ticks_to_pulse = 2
var/ticks_completed = 0
input_names = list(
"toggle ticking"
)
activator_names = list(
"outgoing pulse"
)
/obj/item/integrated_circuit/time/ticker/New()
..()
processing_objects |= src
/obj/item/integrated_circuit/time/ticker/Destroy()
processing_objects -= src
/obj/item/integrated_circuit/time/ticker/process()
ticks_completed++
if( (ticks_completed % ticks_to_pulse) == 0)
var/datum/integrated_io/pulser = activators[1]
pulser.push_data()
/obj/item/integrated_circuit/time/ticker/fast
name = "fast ticker"
desc = "This advanced circuit sends an automatic pulse every two seconds."
complexity = 12
ticks_to_pulse = 1
/obj/item/integrated_circuit/time/ticker/slow
name = "slow ticker"
desc = "This simple circuit sends an automatic pulse every six seconds."
complexity = 4
ticks_to_pulse = 3
/obj/item/integrated_circuit/time/clock
name = "integrated clock"
desc = "Tells you what the local time is, specific to your station or planet."
number_of_inputs = 0
number_of_outputs = 4
number_of_activators = 1
output_names = list(
"time (string)",
"hours (number)",
"minutes (number)",
"seconds (number)"
)
/obj/item/integrated_circuit/time/clock/work()
if(..())
var/datum/integrated_io/time = outputs[1]
var/datum/integrated_io/hour = outputs[2]
var/datum/integrated_io/min = outputs[3]
var/datum/integrated_io/sec = outputs[4]
time.data = time2text(station_time_in_ticks, "hh:mm:ss")
hour.data = text2num(time2text(station_time_in_ticks, "hh"))
min.data = text2num(time2text(station_time_in_ticks, "mm"))
sec.data = text2num(time2text(station_time_in_ticks, "ss"))
for(var/datum/integrated_io/output/O in outputs)
O.push_data()

View File

@@ -0,0 +1,199 @@
#define WIRE "wire"
#define WIRING "wiring"
#define UNWIRE "unwire"
#define UNWIRING "unwiring"
/obj/item/device/integrated_electronics/wirer
name = "circuit wirer"
desc = "It's a small wiring tool, with a wire roll, electric soldering iron, wire cutter, and more in one package. \
The wires used are generally useful for small electronics, such as circuitboards and breadboards, as opposed to larger wires \
used for power or data transmission."
icon = 'icons/obj/hacktool.dmi'
icon_state = "hacktool-g"
flags = CONDUCT
w_class = 2
var/datum/integrated_io/selected_io = null
var/mode = WIRE
/obj/item/device/integrated_electronics/wirer/New()
..()
/obj/item/device/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user)
if(mode == WIRE)
selected_io = io
user << "<span class='notice'>You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel.</span>"
mode = WIRING
else if(mode == WIRING)
if(io == selected_io)
user << "<span class='warning'>Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.</span>"
return
if(io.io_type != selected_io.io_type)
user << "<span class='warning'>Those two types of channels are incompatable. The first is a [selected_io.io_type], \
while the second is a [io.io_type].</span>"
return
selected_io.linked |= io
io.linked |= selected_io
user << "<span class='notice'>You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name].</span>"
mode = WIRE
//io.updateDialog()
//selected_io.updateDialog()
selected_io.holder.interact(user) // This is to update the UI.
selected_io = null
else if(mode == UNWIRE)
selected_io = io
if(!io.linked.len)
user << "<span class='warning'>There is nothing connected to \the [selected_io] data channel.</span>"
selected_io = null
return
user << "<span class='notice'>You prepare to detach a data wire from \the [selected_io.holder]'s [selected_io.name] data channel.</span>"
mode = UNWIRING
return
else if(mode == UNWIRING)
if(io == selected_io)
user << "<span class='warning'>You can't wire a pin into each other, so unwiring \the [selected_io.holder] from \
the same pin is rather moot.</span>"
return
if(selected_io in io.linked)
io.linked.Remove(selected_io)
selected_io.linked.Remove(io)
user << "<span class='notice'>You disconnect \the [selected_io.holder]'s [selected_io.name] from \
\the [io.holder]'s [io.name].</span>"
//io.updateDialog()
//selected_io.updateDialog()
selected_io.holder.interact(user) // This is to update the UI.
selected_io = null
mode = UNWIRE
else
user << "<span class='warning'>\The [selected_io.holder]'s [selected_io.name] and \the [io.holder]'s \
[io.name] are not connected.</span>"
return
return
/obj/item/device/integrated_electronics/wirer/attack_self(mob/user)
switch(mode)
if(WIRE)
mode = UNWIRE
if(WIRING)
if(selected_io)
user << "<span class='notice'>You decide not to wire the data channel.</span>"
selected_io = null
mode = UNWIRE
if(UNWIRE)
mode = WIRE
if(UNWIRING)
if(selected_io)
user << "<span class='notice'>You decide not to disconnect the data channel.</span>"
selected_io = null
mode = UNWIRE
user << "<span class='notice'>You set \the [src] to [mode].</span>"
#undef WIRE
#undef WIRING
#undef UNWIRE
#undef UNWIRING
/obj/item/weapon/storage/bag/circuits
name = "circuit satchel"
desc = "This bag's essential for any circuitry projects."
icon = 'icons/obj/mining.dmi'
icon_state = "satchel"
slot_flags = SLOT_BELT | SLOT_POCKET
w_class = 2
storage_slots = 200
max_storage_space = 400
max_w_class = 3
display_contents_with_number = 1
can_hold = list(/obj/item/integrated_circuit)
/obj/item/weapon/storage/bag/circuits/pre_filled/New()
..()
var/i = 10
while(i)
new /obj/item/integrated_circuit/arithmetic/addition(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/arithmetic/subtraction(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/arithmetic/multiplication(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/arithmetic/division(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/arithmetic/absolute(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/arithmetic/average(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/logic/equals(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/logic/less_than(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/logic/less_than_or_equal(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/logic/greater_than(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/logic/greater_than_or_equal(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/logic/not(src)
i--
i = 10
while(i)
new /obj/item/integrated_circuit/memory(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/memory/medium(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/memory/large(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/memory/huge(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/input/numberpad(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/input/button(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/output/screen(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/transfer/splitter(src)
i--
i = 5
while(i)
new /obj/item/integrated_circuit/transfer/activator_splitter(src)
i--
new /obj/item/device/electronic_assembly(src)
new /obj/item/device/integrated_electronics/wirer(src)

View File

@@ -3,3 +3,6 @@
/mob/observer/gib() //ghosts can't be gibbed.
return
/mob/observer/ash()
return //ghosts can't be ashed.

View File

@@ -46,6 +46,25 @@
if(animation) qdel(animation)
if(src) qdel(src)
/mob/proc/ash(anim="dust-m")
death(1)
var/atom/movable/overlay/animation = null
transforming = 1
canmove = 0
icon = null
invisibility = 101
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick(anim, animation)
dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
/mob/proc/death(gibbed,deathmessage="seizes up and falls limp...")

View File

@@ -50,6 +50,11 @@ var/list/holder_mob_icon_cache = list()
continue
M.forceMove(get_turf(src))
/obj/item/weapon/holder/onDropInto(var/atom/movable/AM)
if(ismob(loc)) // Bypass our holding mob and drop directly to its loc
return loc.loc
return ..()
/obj/item/weapon/holder/GetID()
for(var/mob/M in contents)
var/obj/item/I = M.GetIdCard()

View File

@@ -126,16 +126,12 @@ var/list/slot_equipment_priority = list( \
// Removes an item from inventory and places it in the target atom.
// If canremove or other conditions need to be checked then use unEquip instead.
/mob/proc/drop_from_inventory(var/obj/item/W, var/atom/Target = null)
/mob/proc/drop_from_inventory(var/obj/item/W, var/atom/target = null)
if(W)
if(!Target)
Target = loc
remove_from_mob(W)
if(!(W && W.loc)) return 1 // self destroying objects (tk, grabs)
W.forceMove(Target)
remove_from_mob(W, target)
if(!(W && W.loc))
return 1 // self destroying objects (tk, grabs)
update_icons()
return 1
return 0
@@ -194,7 +190,9 @@ var/list/slot_equipment_priority = list( \
//Attemps to remove an object on a mob.
/mob/proc/remove_from_mob(var/obj/O)
/mob/proc/remove_from_mob(var/obj/O, var/atom/target)
if(!O) // Nothing to remove, so we succeed.
return 1
src.u_equip(O)
if (src.client)
src.client.screen -= O
@@ -202,7 +200,10 @@ var/list/slot_equipment_priority = list( \
O.screen_loc = null
if(istype(O, /obj/item))
var/obj/item/I = O
I.forceMove(src.loc)
if(target)
I.forceMove(target)
else
I.dropInto(loc)
I.dropped(src)
return 1

View File

@@ -23,6 +23,12 @@
else
..()
/mob/living/carbon/human/ash()
if(species)
..(species.dusted_anim)
else
..()
/mob/living/carbon/human/death(gibbed)
if(stat == DEAD) return

View File

@@ -589,12 +589,15 @@
if("swag", "stopsway")
src.animate_tail_stop()
if("vomit")
vomit()
return
if ("help")
src << {"blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough,
cry, custom, deathgasp, drool, eyebrow, frown, gasp, giggle, groan, grumble, handshake, hug-(none)/mob, glare-(none)/mob,
grin, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, raise, salute, shake, shiver, shrug,
sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, tremble, twitch, twitch_s, whimper,
wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"}
src << {"blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag,
frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom,
raise, salute, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch,
twitch_s, vomit, whimper, wink, yawn"}
else
src << "\blue Unusable emote '[act]'. Say *help for a list."

View File

@@ -251,8 +251,8 @@
//splints
for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/o = get_organ(organ)
if(o && o.status & ORGAN_SPLINTED)
msg += "<span class='warning'>[T.He] [T.has] a splint on [T.his] [o.name]!</span>\n"
if(o && o.splinted && o.splinted.loc == o)
msg += "<span class='warning'>[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!</span>\n"
if(suiciding)
msg += "<span class='warning'>[T.He] appears to have commited suicide... there is no hope of recovery.</span>\n"

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