mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-13 08:04:22 +01:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into polaris-sync-2017-05-08
# Conflicts: # code/modules/mob/dead/observer/observer.dm # code/modules/mob/living/carbon/human/life.dm # code/modules/mob/mob_defines.dm # html/changelogs/.all_changelog.yml # vorestation.dme
This commit is contained in:
@@ -249,7 +249,11 @@
|
||||
"Anything Legal Considered",
|
||||
"New Toy",
|
||||
"Me, I'm Always Counting",
|
||||
"Just Five More Minutes"
|
||||
"Just Five More Minutes",
|
||||
"Are You Feeling It",
|
||||
"Great White Snark",
|
||||
"No Shirt No Shoes",
|
||||
"Callsign"
|
||||
|
||||
|
||||
)
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
display_name = "dice pack (gaming)"
|
||||
path = /obj/item/weapon/storage/pill_bottle/dice_nerd
|
||||
|
||||
/datum/gear/dice/cup
|
||||
display_name = "dice cup and dice"
|
||||
path = /obj/item/weapon/storage/dicecup/loaded
|
||||
|
||||
/datum/gear/cards
|
||||
display_name = "deck of cards"
|
||||
path = /obj/item/weapon/deck/cards
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
slot = slot_w_uniform
|
||||
sort_category = "Uniforms and Casual Dress"
|
||||
|
||||
/datum/gear/uniform/blazerskirt
|
||||
display_name = "blazer, blue with skirt"
|
||||
path = /obj/item/clothing/under/blazer/skirt
|
||||
|
||||
/datum/gear/uniform/cheongsam
|
||||
display_name = "cheongsam selection"
|
||||
|
||||
@@ -190,26 +194,50 @@
|
||||
display_name = "suit, shiny-black"
|
||||
path = /obj/item/clothing/under/lawyer/black
|
||||
|
||||
/datum/gear/uniform/suit/shinyblackskirt
|
||||
display_name = "suit, shiny-black skirt"
|
||||
path = /obj/item/clothing/under/lawyer/black/skirt
|
||||
|
||||
/datum/gear/uniform/suit/blue
|
||||
display_name = "suit, blue"
|
||||
path = /obj/item/clothing/under/lawyer/blue
|
||||
|
||||
/datum/gear/uniform/suit/blueskirt
|
||||
display_name = "suit, blue skirt"
|
||||
path = /obj/item/clothing/under/lawyer/blue/skirt
|
||||
|
||||
/datum/gear/uniform/suit/burgundy
|
||||
display_name = "suit, burgundy"
|
||||
path = /obj/item/clothing/under/suit_jacket/burgundy
|
||||
|
||||
/datum/gear/uniform/suit/burgundyskirt
|
||||
display_name = "suit, burgundy skirt"
|
||||
path = /obj/item/clothing/under/suit_jacket/burgundy/skirt
|
||||
|
||||
/datum/gear/uniform/suit/checkered
|
||||
display_name = "suit, checkered"
|
||||
path = /obj/item/clothing/under/suit_jacket/checkered
|
||||
|
||||
/datum/gear/uniform/suit/checkeredskirt
|
||||
display_name = "suit, checkered skirt"
|
||||
path = /obj/item/clothing/under/suit_jacket/checkered/skirt
|
||||
|
||||
/datum/gear/uniform/suit/charcoal
|
||||
display_name = "suit, charcoal"
|
||||
path = /obj/item/clothing/under/suit_jacket/charcoal
|
||||
|
||||
/datum/gear/uniform/suit/charcoalskirt
|
||||
display_name = "suit, charcoal skirt"
|
||||
path = /obj/item/clothing/under/suit_jacket/charcoal/skirt
|
||||
|
||||
/datum/gear/uniform/suit/exec
|
||||
display_name = "suit, executive"
|
||||
path = /obj/item/clothing/under/suit_jacket/really_black
|
||||
|
||||
/datum/gear/uniform/suit/execskirt
|
||||
display_name = "suit, executive skirt"
|
||||
path = /obj/item/clothing/under/suit_jacket/really_black/skirt
|
||||
|
||||
/datum/gear/uniform/suit/femaleexec
|
||||
display_name = "suit, female-executive"
|
||||
path = /obj/item/clothing/under/suit_jacket/female
|
||||
@@ -218,18 +246,34 @@
|
||||
display_name = "suit, gentlemen"
|
||||
path = /obj/item/clothing/under/gentlesuit
|
||||
|
||||
/datum/gear/uniform/suit/gentleskirt
|
||||
display_name = "suit, lady"
|
||||
path = /obj/item/clothing/under/gentlesuit/skirt
|
||||
|
||||
/datum/gear/uniform/suit/navy
|
||||
display_name = "suit, navy"
|
||||
path = /obj/item/clothing/under/suit_jacket/navy
|
||||
|
||||
/datum/gear/uniform/suit/navyskirt
|
||||
display_name = "suit, navy skirt"
|
||||
path = /obj/item/clothing/under/suit_jacket/navy/skirt
|
||||
|
||||
/datum/gear/uniform/suit/red
|
||||
display_name = "suit, red"
|
||||
path = /obj/item/clothing/under/suit_jacket/red
|
||||
|
||||
/datum/gear/uniform/suit/redskirt
|
||||
display_name = "suit, red skirt"
|
||||
path = /obj/item/clothing/under/suit_jacket/red/skirt
|
||||
|
||||
/datum/gear/uniform/suit/redlawyer
|
||||
display_name = "suit, lawyer-red"
|
||||
path = /obj/item/clothing/under/lawyer/red
|
||||
|
||||
/datum/gear/uniform/suit/redlawyerskirt
|
||||
display_name = "suit, lawyer-red skirt"
|
||||
path = /obj/item/clothing/under/lawyer/red/skirt
|
||||
|
||||
/datum/gear/uniform/suit/oldman
|
||||
display_name = "suit, old-man"
|
||||
path = /obj/item/clothing/under/lawyer/oldman
|
||||
@@ -238,18 +282,49 @@
|
||||
display_name = "suit, purple"
|
||||
path = /obj/item/clothing/under/lawyer/purpsuit
|
||||
|
||||
/datum/gear/uniform/suit/purpleskirt
|
||||
display_name = "suit, purple skirt"
|
||||
path = /obj/item/clothing/under/lawyer/purpsuit/skirt
|
||||
|
||||
/datum/gear/uniform/suit/tan
|
||||
display_name = "suit, tan"
|
||||
path = /obj/item/clothing/under/suit_jacket/tan
|
||||
|
||||
/datum/gear/uniform/suit/tanskirt
|
||||
display_name = "suit, tan skirt"
|
||||
path = /obj/item/clothing/under/suit_jacket/tan/skirt
|
||||
|
||||
/datum/gear/uniform/suit/white
|
||||
display_name = "suit, white"
|
||||
path = /obj/item/clothing/under/scratch
|
||||
|
||||
/datum/gear/uniform/suit/whiteskirt
|
||||
display_name = "suit, white skirt"
|
||||
path = /obj/item/clothing/under/scratch/skirt
|
||||
|
||||
/datum/gear/uniform/suit/whiteblue
|
||||
display_name = "suit, white-blue"
|
||||
path = /obj/item/clothing/under/lawyer/bluesuit
|
||||
|
||||
/datum/gear/uniform/suit/whiteblueskirt
|
||||
display_name = "suit, white-blue skirt"
|
||||
path = /obj/item/clothing/under/lawyer/bluesuit/skirt
|
||||
|
||||
/datum/gear/uniform/suit/detectiveskirt
|
||||
display_name = "suit, detective skirt (Detective)"
|
||||
path = /obj/item/clothing/under/det/skirt
|
||||
allowed_roles = list("Detective")
|
||||
|
||||
/datum/gear/uniform/suit/iaskirt
|
||||
display_name = "suit, Internal Affairs skirt (Internal Affairs)"
|
||||
path = /obj/item/clothing/under/rank/internalaffairs/skirt
|
||||
allowed_roles = list("Internal Affairs Agent")
|
||||
|
||||
/datum/gear/uniform/suit/bartenderskirt
|
||||
display_name = "suit, bartender skirt (Bartender)"
|
||||
path = /obj/item/clothing/under/rank/bartender/skirt
|
||||
allowed_roles = list("Bartender")
|
||||
|
||||
/datum/gear/uniform/scrubs
|
||||
display_name = "scrubs, black"
|
||||
path = /obj/item/clothing/under/rank/medical/black
|
||||
@@ -271,6 +346,10 @@
|
||||
display_name = "scrubs, navy blue"
|
||||
path = /obj/item/clothing/under/rank/medical/navyblue
|
||||
|
||||
/datum/gear/uniform/oldwoman
|
||||
display_name = "old woman attire"
|
||||
path = /obj/item/clothing/under/lawyer/oldwoman
|
||||
|
||||
/datum/gear/uniform/sundress
|
||||
display_name = "sundress"
|
||||
path = /obj/item/clothing/under/sundress
|
||||
|
||||
@@ -132,7 +132,7 @@ BLIND // can't see anything
|
||||
|
||||
eye = !eye
|
||||
if(eye)
|
||||
icon_state = "[icon_state]_r"
|
||||
icon_state = "[icon_state]_1"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
update_clothing_icon()
|
||||
@@ -395,7 +395,8 @@ BLIND // can't see anything
|
||||
toggleable = 1
|
||||
action_button_name = "Toggle Goggles"
|
||||
vision_flags = SEE_MOBS
|
||||
see_invisible = INVISIBILITY_LEVEL_TWO
|
||||
see_invisible = SEE_INVISIBLE_NOLIGHTING
|
||||
|
||||
|
||||
emp_act(severity)
|
||||
if(istype(src.loc, /mob/living/carbon/human))
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
|
||||
/obj/item/rig_module/self_destruct/New()
|
||||
..()
|
||||
src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad)
|
||||
src.smoke = new /datum/effect/effect/system/smoke_spread/bad()
|
||||
src.smoke.attach(src)
|
||||
|
||||
/obj/item/rig_module/self_destruct/Destroy()
|
||||
|
||||
@@ -257,6 +257,14 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
|
||||
|
||||
/obj/item/clothing/suit/straight_jacket/attack_hand(mob/living/user as mob)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(src == H.wear_suit)
|
||||
to_chat(H, "<span class='notice'>You need help taking this off!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/ianshirt
|
||||
name = "worn shirt"
|
||||
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in."
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
if(!H.holstered)
|
||||
var/obj/item/W = usr.get_active_hand()
|
||||
if(!istype(W, /obj/item))
|
||||
usr << "<span class='warning'>You need your gun equiped to holster it.</span>"
|
||||
usr << "<span class='warning'>You need your gun equipped to holster it.</span>"
|
||||
return
|
||||
H.holster(W, usr)
|
||||
else
|
||||
|
||||
@@ -6,6 +6,12 @@
|
||||
icon_state = "ba_suit"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/rank/bartender/skirt
|
||||
desc = "Short and cute."
|
||||
name = "bartender's skirt"
|
||||
icon_state = "ba_suit_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit")
|
||||
|
||||
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
|
||||
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Colony Director\"."
|
||||
name = "colony director's jumpsuit"
|
||||
@@ -97,6 +103,11 @@
|
||||
rolled_sleeves = 0
|
||||
starting_accessories = list(/obj/item/clothing/accessory/black)
|
||||
|
||||
/obj/item/clothing/under/rank/internalaffairs/skirt
|
||||
desc = "The plain, professional attire of an Internal Affairs Agent. The top button is sewn shut."
|
||||
name = "Internal Affairs skirt"
|
||||
icon_state = "internalaffairs_skirt"
|
||||
|
||||
/obj/item/clothing/under/rank/janitor
|
||||
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
|
||||
name = "janitor's jumpsuit"
|
||||
@@ -112,6 +123,11 @@
|
||||
name = "black Lawyer suit"
|
||||
icon_state = "lawyer_black"
|
||||
|
||||
/obj/item/clothing/under/lawyer/black/skirt
|
||||
name = "black Lawyer skirt"
|
||||
icon_state = "lawyer_black_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
|
||||
|
||||
/obj/item/clothing/under/lawyer/female
|
||||
name = "black Lawyer suit"
|
||||
icon_state = "black_suit_fem"
|
||||
@@ -121,28 +137,52 @@
|
||||
name = "red Lawyer suit"
|
||||
icon_state = "lawyer_red"
|
||||
|
||||
/obj/item/clothing/under/lawyer/red/skirt
|
||||
name = "red Lawyer skirt"
|
||||
icon_state = "lawyer_red_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
|
||||
|
||||
/obj/item/clothing/under/lawyer/blue
|
||||
name = "blue Lawyer suit"
|
||||
icon_state = "lawyer_blue"
|
||||
|
||||
/obj/item/clothing/under/lawyer/blue/skirt
|
||||
name = "blue Lawyer skirt"
|
||||
icon_state = "lawyer_blue_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
|
||||
/obj/item/clothing/under/lawyer/bluesuit
|
||||
name = "Blue Suit"
|
||||
name = "blue suit"
|
||||
desc = "A classy suit."
|
||||
icon_state = "bluesuit"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
starting_accessories = list(/obj/item/clothing/accessory/red)
|
||||
|
||||
/obj/item/clothing/under/lawyer/bluesuit/skirt
|
||||
name = "blue skirt suit"
|
||||
icon_state = "bluesuit_skirt"
|
||||
|
||||
/obj/item/clothing/under/lawyer/purpsuit
|
||||
name = "Purple Suit"
|
||||
name = "purple Suit"
|
||||
icon_state = "lawyer_purp"
|
||||
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
|
||||
|
||||
/obj/item/clothing/under/lawyer/purpsuit/skirt
|
||||
name = "purple skirt suit"
|
||||
icon_state = "lawyer_purp_skirt"
|
||||
|
||||
/obj/item/clothing/under/lawyer/oldman
|
||||
name = "Old Man's Suit"
|
||||
desc = "A classic suit for the older gentleman with built in back support."
|
||||
icon_state = "oldman"
|
||||
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
|
||||
|
||||
/obj/item/clothing/under/lawyer/oldwoman
|
||||
name = "Old Woman's Attire"
|
||||
desc = "A typical outfit for the older woman, a lovely cardigan and comfortable skirt."
|
||||
icon_state = "oldwoman"
|
||||
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
|
||||
|
||||
/obj/item/clothing/under/librarian
|
||||
name = "sensible suit"
|
||||
desc = "It's very... sensible."
|
||||
|
||||
@@ -113,6 +113,12 @@
|
||||
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat."
|
||||
starting_accessories = list(/obj/item/clothing/accessory/red_long, /obj/item/clothing/accessory/wcoat)
|
||||
|
||||
/obj/item/clothing/under/det/skirt
|
||||
name = "detective's skirt"
|
||||
icon_state = "detective_skirt"
|
||||
desc = "A serious-looking white blouse paired with a formal black pencil skirt."
|
||||
item_state_slots = list(slot_r_hand_str = "sl_suit", slot_l_hand_str = "sl_suit")
|
||||
|
||||
/*
|
||||
* Head of Security
|
||||
*/
|
||||
|
||||
@@ -21,6 +21,11 @@
|
||||
desc = "A white suit, suitable for an excellent host"
|
||||
icon_state = "scratch"
|
||||
|
||||
/obj/item/clothing/under/scratch/skirt
|
||||
name = "white skirt suit"
|
||||
icon_state = "scratch_skirt"
|
||||
item_state_slots = list(slot_r_hand_str = "scratch", slot_l_hand_str = "scratch")
|
||||
|
||||
/obj/item/clothing/under/sl_suit
|
||||
desc = "It's a very amish looking suit."
|
||||
name = "amish suit"
|
||||
@@ -98,6 +103,11 @@
|
||||
rolled_sleeves = 0
|
||||
starting_accessories = list(/obj/item/clothing/accessory/darkgreen)
|
||||
|
||||
/obj/item/clothing/under/gov/skirt
|
||||
name = "Green formal skirt uniform"
|
||||
desc = "A neat proper uniform of someone on offical business. The top button is sewn shut."
|
||||
icon_state = "greensuit_skirt"
|
||||
|
||||
/obj/item/clothing/under/space
|
||||
name = "\improper NASA jumpsuit"
|
||||
desc = "It has a NASA logo on it and is made of space-proofed materials."
|
||||
@@ -147,24 +157,37 @@
|
||||
|
||||
/obj/item/clothing/under/gentlesuit
|
||||
name = "gentlemans suit"
|
||||
desc = "A silk black shirt with a white tie and a matching gray vest and slacks. Feels proper."
|
||||
desc = "A silk black shirt with matching gray slacks. Feels proper."
|
||||
icon_state = "gentlesuit"
|
||||
item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey")
|
||||
rolled_sleeves = 0
|
||||
starting_accessories = list(/obj/item/clothing/accessory/white, /obj/item/clothing/accessory/wcoat/gentleman)
|
||||
|
||||
/obj/item/clothing/under/gentlesuit/skirt
|
||||
name = "lady's suit"
|
||||
desc = "A silk black blouse with a matching gray skirt. Feels proper."
|
||||
icon_state = "gentlesuit_skirt"
|
||||
|
||||
/obj/item/clothing/under/gimmick/rank/captain/suit
|
||||
name = "colony director's suit"
|
||||
desc = "A green suit and yellow necktie. Exemplifies authority."
|
||||
icon_state = "green_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom")
|
||||
|
||||
/obj/item/clothing/under/gimmick/rank/captain/suit/skirt
|
||||
name = "colony director's skirt suit"
|
||||
icon_state = "green_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit
|
||||
name = "head of personnel's suit"
|
||||
desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble."
|
||||
icon_state = "teal_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "green", slot_l_hand_str = "green")
|
||||
|
||||
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt
|
||||
name = "head of personnel's skirt suit"
|
||||
icon_state = "teal_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/suit_jacket
|
||||
name = "black suit"
|
||||
desc = "A black suit and red tie. Very formal."
|
||||
@@ -177,6 +200,11 @@
|
||||
icon_state = "really_black_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/really_black/skirt
|
||||
name = "executive skirt suit"
|
||||
desc = "A formal black suit and red necktie, intended for the station's finest."
|
||||
icon_state = "really_black_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/female
|
||||
name = "executive suit"
|
||||
desc = "A formal trouser suit for women, intended for the station's finest."
|
||||
@@ -196,6 +224,11 @@
|
||||
icon_state = "red_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/red/skirt
|
||||
name = "red skirt suit"
|
||||
desc = "A red suit and blue necktie. Somewhat formal."
|
||||
icon_state = "red_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/schoolgirl
|
||||
name = "schoolgirl uniform"
|
||||
desc = "It's just like one of my Japanese animes!"
|
||||
@@ -421,6 +454,10 @@
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
|
||||
starting_accessories = list(/obj/item/clothing/accessory/navy, /obj/item/clothing/accessory/charcoal_jacket)
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/charcoal/skirt
|
||||
name = "charcoal skirt"
|
||||
icon_state = "charcoal_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/navy
|
||||
name = "navy suit"
|
||||
desc = "A navy suit and red tie, intended for the station's finest."
|
||||
@@ -428,6 +465,10 @@
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
starting_accessories = list(/obj/item/clothing/accessory/red, /obj/item/clothing/accessory/navy_jacket)
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/navy/skirt
|
||||
name = "navy skirt"
|
||||
icon_state = "navy_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/burgundy
|
||||
name = "burgundy suit"
|
||||
desc = "A burgundy suit and black tie. Somewhat formal."
|
||||
@@ -435,6 +476,10 @@
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red")
|
||||
starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/burgundy_jacket)
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/burgundy/skirt
|
||||
name = "burgundy skirt"
|
||||
icon_state = "burgundy_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/checkered
|
||||
name = "checkered suit"
|
||||
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
|
||||
@@ -442,6 +487,10 @@
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black")
|
||||
starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/checkered_jacket)
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/checkered/skirt
|
||||
name = "checkered skirt"
|
||||
icon_state = "checkered_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/tan
|
||||
name = "tan suit"
|
||||
desc = "A tan suit. Smart, but casual."
|
||||
@@ -449,6 +498,10 @@
|
||||
item_state_slots = list(slot_r_hand_str = "tan_suit", slot_l_hand_str = "tan_suit")
|
||||
starting_accessories = list(/obj/item/clothing/accessory/yellow, /obj/item/clothing/accessory/tan_jacket)
|
||||
|
||||
/obj/item/clothing/under/suit_jacket/tan/skirt
|
||||
name = "tan skirt"
|
||||
icon_state = "tan_suit_skirt"
|
||||
|
||||
/obj/item/clothing/under/serviceoveralls
|
||||
name = "workman outfit"
|
||||
desc = "The very image of a working man. Not that you're probably doing work."
|
||||
@@ -483,6 +536,11 @@
|
||||
icon_state = "blue_blazer"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
|
||||
/obj/item/clothing/under/blazer/skirt
|
||||
name = "ladies blue blazer"
|
||||
desc = "A bold but yet conservative outfit, a red pencil skirt and a navy blazer."
|
||||
icon_state = "blue_blazer_skirt"
|
||||
|
||||
/obj/item/clothing/under/croptop
|
||||
name = "crop top"
|
||||
desc = "A shirt that has had the top cropped. This one is NT sponsored."
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
/obj/item/weapon/dice
|
||||
name = "d6"
|
||||
desc = "A dice with six sides."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "d66"
|
||||
w_class = ITEMSIZE_TINY
|
||||
var/sides = 6
|
||||
var/result = 6
|
||||
attack_verb = list("diced")
|
||||
|
||||
/obj/item/weapon/dice/New()
|
||||
icon_state = "[name][rand(1,sides)]"
|
||||
|
||||
/obj/item/weapon/dice/d4
|
||||
name = "d4"
|
||||
desc = "A dice with four sides."
|
||||
icon_state = "d44"
|
||||
sides = 4
|
||||
result = 4
|
||||
|
||||
/obj/item/weapon/dice/d8
|
||||
name = "d8"
|
||||
desc = "A dice with eight sides."
|
||||
icon_state = "d88"
|
||||
sides = 8
|
||||
result = 8
|
||||
|
||||
/obj/item/weapon/dice/d10
|
||||
name = "d10"
|
||||
desc = "A dice with ten sides."
|
||||
icon_state = "d1010"
|
||||
sides = 10
|
||||
result = 10
|
||||
|
||||
/obj/item/weapon/dice/d12
|
||||
name = "d12"
|
||||
desc = "A dice with twelve sides."
|
||||
icon_state = "d1212"
|
||||
sides = 12
|
||||
result = 12
|
||||
|
||||
/obj/item/weapon/dice/d20
|
||||
name = "d20"
|
||||
desc = "A dice with twenty sides."
|
||||
icon_state = "d2020"
|
||||
sides = 20
|
||||
result = 20
|
||||
|
||||
/obj/item/weapon/dice/d100
|
||||
name = "d100"
|
||||
desc = "A dice with ten sides. This one is for the tens digit."
|
||||
icon_state = "d10010"
|
||||
sides = 10
|
||||
result = 10
|
||||
|
||||
/obj/item/weapon/dice/attack_self(mob/user as mob)
|
||||
rollDice(user, 0)
|
||||
|
||||
/obj/item/weapon/dice/proc/rollDice(mob/user as mob, var/silent = 0)
|
||||
result = rand(1, sides)
|
||||
icon_state = "[name][result]"
|
||||
|
||||
if(!silent)
|
||||
var/comment = ""
|
||||
if(sides == 20 && result == 20)
|
||||
comment = "Nat 20!"
|
||||
else if(sides == 20 && result == 1)
|
||||
comment = "Ouch, bad luck."
|
||||
|
||||
user.visible_message("<span class='notice'>[user] has thrown [src]. It lands on [result]. [comment]</span>", \
|
||||
"<span class='notice'>You throw [src]. It lands on a [result]. [comment]</span>", \
|
||||
"<span class='notice'>You hear [src] landing on a [result]. [comment]</span>")
|
||||
|
||||
/*
|
||||
* Dice packs
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice //7d6
|
||||
name = "bag of dice"
|
||||
desc = "It's a small bag with dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "dicebag"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice/New()
|
||||
..()
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/weapon/dice( src )
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd //DnD dice
|
||||
name = "bag of gaming dice"
|
||||
desc = "It's a small bag with gaming dice inside."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "magicdicebag"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dice_nerd/New()
|
||||
..()
|
||||
new /obj/item/weapon/dice/d4( src )
|
||||
new /obj/item/weapon/dice( src )
|
||||
new /obj/item/weapon/dice/d8( src )
|
||||
new /obj/item/weapon/dice/d10( src )
|
||||
new /obj/item/weapon/dice/d12( src )
|
||||
new /obj/item/weapon/dice/d20( src )
|
||||
new /obj/item/weapon/dice/d100( src )
|
||||
|
||||
/*
|
||||
*Liar's Dice cup
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/dicecup
|
||||
name = "dice cup"
|
||||
desc = "A cup used to conceal and hold dice."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "dicecup"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
storage_slots = 5
|
||||
can_hold = list(
|
||||
/obj/item/weapon/dice,
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/dicecup/attack_self(mob/user as mob)
|
||||
user.visible_message("<span class='notice'>[user] shakes [src].</span>", \
|
||||
"<span class='notice'>You shake [src].</span>", \
|
||||
"<span class='notice'>You hear dice rolling.</span>")
|
||||
rollCup(user)
|
||||
|
||||
/obj/item/weapon/storage/dicecup/proc/rollCup(mob/user as mob)
|
||||
for(var/obj/item/weapon/dice/I in src.contents)
|
||||
var/obj/item/weapon/dice/D = I
|
||||
D.rollDice(user, 1)
|
||||
|
||||
/obj/item/weapon/storage/dicecup/proc/revealDice(var/mob/viewer)
|
||||
for(var/obj/item/weapon/dice/I in src.contents)
|
||||
var/obj/item/weapon/dice/D = I
|
||||
to_chat(viewer, "The [D.name] shows a [D.result].")
|
||||
|
||||
/obj/item/weapon/storage/dicecup/verb/peekAtDice()
|
||||
set category = "Object"
|
||||
set name = "Peek at Dice"
|
||||
set desc = "Peek at the dice under your cup."
|
||||
|
||||
revealDice(usr)
|
||||
|
||||
/obj/item/weapon/storage/dicecup/verb/revealDiceHand()
|
||||
|
||||
set category = "Object"
|
||||
set name = "Reveal Dice"
|
||||
set desc = "Reveal the dice hidden under your cup."
|
||||
|
||||
for(var/mob/living/player in viewers(3))
|
||||
to_chat(player, "[usr] reveals their dice.")
|
||||
revealDice(player)
|
||||
|
||||
|
||||
/obj/item/weapon/storage/dicecup/loaded/New()
|
||||
..()
|
||||
for(var/i = 1 to 5)
|
||||
new /obj/item/weapon/dice( src )
|
||||
@@ -18,23 +18,57 @@
|
||||
var/mob/last_to_emag = null
|
||||
var/last_change = 0
|
||||
var/last_gravity_change = 0
|
||||
var/list/supported_programs = list( \
|
||||
"Empty Court" = "emptycourt", \
|
||||
"Basketball Court" = "basketball", \
|
||||
"Thunderdome Court" = "thunderdomecourt", \
|
||||
"Boxing Ring"="boxingcourt", \
|
||||
"Beach" = "beach", \
|
||||
"Desert" = "desert", \
|
||||
"Space" = "space", \
|
||||
"Picnic Area" = "picnicarea", \
|
||||
"Snow Field" = "snowfield", \
|
||||
"Theatre" = "theatre", \
|
||||
"Meeting Hall" = "meetinghall", \
|
||||
"Courtroom" = "courtroom", \
|
||||
"Turn Off" = "turnoff" \
|
||||
|
||||
var/area/projection_area = /area/holodeck/alphadeck
|
||||
var/current_program
|
||||
var/powerdown_program = "Turn Off"
|
||||
var/default_program = "Empty Court"
|
||||
|
||||
var/list/supported_programs = list(
|
||||
"Empty Court" = new/datum/holodeck_program(/area/holodeck/source_emptycourt, list('sound/music/THUNDERDOME.ogg')),
|
||||
"Boxing Ring" = new/datum/holodeck_program(/area/holodeck/source_boxingcourt, list('sound/music/THUNDERDOME.ogg')),
|
||||
"Basketball" = new/datum/holodeck_program(/area/holodeck/source_basketball, list('sound/music/THUNDERDOME.ogg')),
|
||||
"Thunderdome" = new/datum/holodeck_program(/area/holodeck/source_thunderdomecourt, list('sound/music/THUNDERDOME.ogg')),
|
||||
"Beach" = new/datum/holodeck_program(/area/holodeck/source_beach),
|
||||
"Desert" = new/datum/holodeck_program(/area/holodeck/source_desert,
|
||||
list(
|
||||
'sound/effects/wind/wind_2_1.ogg',
|
||||
'sound/effects/wind/wind_2_2.ogg',
|
||||
'sound/effects/wind/wind_3_1.ogg',
|
||||
'sound/effects/wind/wind_4_1.ogg',
|
||||
'sound/effects/wind/wind_4_2.ogg',
|
||||
'sound/effects/wind/wind_5_1.ogg'
|
||||
)
|
||||
),
|
||||
"Snowfield" = new/datum/holodeck_program(/area/holodeck/source_snowfield,
|
||||
list(
|
||||
'sound/effects/wind/wind_2_1.ogg',
|
||||
'sound/effects/wind/wind_2_2.ogg',
|
||||
'sound/effects/wind/wind_3_1.ogg',
|
||||
'sound/effects/wind/wind_4_1.ogg',
|
||||
'sound/effects/wind/wind_4_2.ogg',
|
||||
'sound/effects/wind/wind_5_1.ogg'
|
||||
)
|
||||
),
|
||||
"Space" = new/datum/holodeck_program(/area/holodeck/source_space,
|
||||
list(
|
||||
'sound/ambience/ambispace.ogg',
|
||||
'sound/music/main.ogg',
|
||||
'sound/music/space.ogg',
|
||||
'sound/music/traitor.ogg',
|
||||
)
|
||||
),
|
||||
"Picnic Area" = new/datum/holodeck_program(/area/holodeck/source_picnicarea, list('sound/music/title2.ogg')),
|
||||
"Theatre" = new/datum/holodeck_program(/area/holodeck/source_theatre),
|
||||
"Meetinghall" = new/datum/holodeck_program(/area/holodeck/source_meetinghall),
|
||||
"Courtroom" = new/datum/holodeck_program(/area/holodeck/source_courtroom, list('sound/music/traitor.ogg')),
|
||||
"Turn Off" = new/datum/holodeck_program(/area/holodeck/source_plating, list())
|
||||
)
|
||||
|
||||
var/list/restricted_programs = list(
|
||||
"Burnoff Test Simulation" = new/datum/holodeck_program(/area/holodeck/source_burntest, list()),
|
||||
"Wildlife Simulation" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list())
|
||||
)
|
||||
var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "Wildlife Simulation" = "wildlifecarp")
|
||||
var/current_program = "turnoff"
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
@@ -59,10 +93,10 @@
|
||||
var/restricted_program_list[0]
|
||||
|
||||
for(var/P in supported_programs)
|
||||
program_list[++program_list.len] = list("name" = P, "program" = supported_programs[P])
|
||||
program_list[++program_list.len] = P
|
||||
|
||||
for(var/P in restricted_programs)
|
||||
restricted_program_list[++restricted_program_list.len] = list("name" = P, "program" = restricted_programs[P])
|
||||
restricted_program_list[++restricted_program_list.len] = P
|
||||
|
||||
data["supportedPrograms"] = program_list
|
||||
data["restrictedPrograms"] = restricted_program_list
|
||||
@@ -93,9 +127,9 @@
|
||||
|
||||
if(href_list["program"])
|
||||
var/prog = href_list["program"]
|
||||
if(prog in holodeck_programs)
|
||||
loadProgram(holodeck_programs[prog])
|
||||
current_program = href_list["program"]
|
||||
if(prog in (supported_programs + restricted_programs))
|
||||
loadProgram(prog)
|
||||
current_program = prog
|
||||
|
||||
else if(href_list["AIoverride"])
|
||||
if(!issilicon(usr))
|
||||
@@ -150,7 +184,10 @@
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/New()
|
||||
..()
|
||||
linkedholodeck = locate(/area/holodeck/alphadeck)
|
||||
current_program = powerdown_program
|
||||
linkedholodeck = locate(projection_area)
|
||||
if(!linkedholodeck)
|
||||
world << "<span class='danger'>Holodeck computer at [x],[y],[z] failed to locate projection area.</span>"
|
||||
|
||||
//This could all be done better, but it works for now.
|
||||
/obj/machinery/computer/HolodeckControl/Destroy()
|
||||
@@ -185,7 +222,7 @@
|
||||
|
||||
if(!checkInteg(linkedholodeck))
|
||||
damaged = 1
|
||||
loadProgram(holodeck_programs["turnoff"], 0)
|
||||
loadProgram(powerdown_program, 0)
|
||||
active = 0
|
||||
use_power = 1
|
||||
for(var/mob/M in range(10,src))
|
||||
@@ -227,9 +264,9 @@
|
||||
//Why is it called toggle if it doesn't toggle?
|
||||
/obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0)
|
||||
if(toggleOn)
|
||||
loadProgram(holodeck_programs["emptycourt"], 0)
|
||||
loadProgram(default_program, 0)
|
||||
else
|
||||
loadProgram(holodeck_programs["turnoff"], 0)
|
||||
loadProgram(powerdown_program, 0)
|
||||
|
||||
if(!linkedholodeck.has_gravity)
|
||||
linkedholodeck.gravitychange(1,linkedholodeck)
|
||||
@@ -238,9 +275,18 @@
|
||||
use_power = 1
|
||||
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/datum/holodeck_program/HP, var/check_delay = 1)
|
||||
/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/prog, var/check_delay = 1)
|
||||
if(!prog)
|
||||
return
|
||||
|
||||
var/datum/holodeck_program/HP
|
||||
if(prog in supported_programs)
|
||||
HP = supported_programs[prog]
|
||||
else if(prog in restricted_programs)
|
||||
HP = restricted_programs[prog]
|
||||
if(!HP)
|
||||
return
|
||||
|
||||
var/area/A = locate(HP.target)
|
||||
if(!A)
|
||||
return
|
||||
@@ -324,7 +370,7 @@
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
|
||||
//Turn it back to the regular non-holographic room
|
||||
loadProgram(holodeck_programs["turnoff"], 0)
|
||||
loadProgram(powerdown_program, 0)
|
||||
|
||||
if(!linkedholodeck.has_gravity)
|
||||
linkedholodeck.gravitychange(1,linkedholodeck)
|
||||
|
||||
@@ -1,46 +1,3 @@
|
||||
var/global/list/holodeck_programs = list(
|
||||
"emptycourt" = new/datum/holodeck_program(/area/holodeck/source_emptycourt, list('sound/music/THUNDERDOME.ogg')),
|
||||
"boxingcourt" = new/datum/holodeck_program(/area/holodeck/source_boxingcourt, list('sound/music/THUNDERDOME.ogg')),
|
||||
"basketball" = new/datum/holodeck_program(/area/holodeck/source_basketball, list('sound/music/THUNDERDOME.ogg')),
|
||||
"thunderdomecourt" = new/datum/holodeck_program(/area/holodeck/source_thunderdomecourt, list('sound/music/THUNDERDOME.ogg')),
|
||||
"beach" = new/datum/holodeck_program(/area/holodeck/source_beach),
|
||||
"desert" = new/datum/holodeck_program(/area/holodeck/source_desert,
|
||||
list(
|
||||
'sound/effects/wind/wind_2_1.ogg',
|
||||
'sound/effects/wind/wind_2_2.ogg',
|
||||
'sound/effects/wind/wind_3_1.ogg',
|
||||
'sound/effects/wind/wind_4_1.ogg',
|
||||
'sound/effects/wind/wind_4_2.ogg',
|
||||
'sound/effects/wind/wind_5_1.ogg'
|
||||
)
|
||||
),
|
||||
"snowfield" = new/datum/holodeck_program(/area/holodeck/source_snowfield,
|
||||
list(
|
||||
'sound/effects/wind/wind_2_1.ogg',
|
||||
'sound/effects/wind/wind_2_2.ogg',
|
||||
'sound/effects/wind/wind_3_1.ogg',
|
||||
'sound/effects/wind/wind_4_1.ogg',
|
||||
'sound/effects/wind/wind_4_2.ogg',
|
||||
'sound/effects/wind/wind_5_1.ogg'
|
||||
)
|
||||
),
|
||||
"space" = new/datum/holodeck_program(/area/holodeck/source_space,
|
||||
list(
|
||||
'sound/ambience/ambispace.ogg',
|
||||
'sound/music/main.ogg',
|
||||
'sound/music/space.ogg',
|
||||
'sound/music/traitor.ogg',
|
||||
)
|
||||
),
|
||||
"picnicarea" = new/datum/holodeck_program(/area/holodeck/source_picnicarea, list('sound/music/title2.ogg')),
|
||||
"theatre" = new/datum/holodeck_program(/area/holodeck/source_theatre),
|
||||
"meetinghall" = new/datum/holodeck_program(/area/holodeck/source_meetinghall),
|
||||
"courtroom" = new/datum/holodeck_program(/area/holodeck/source_courtroom, list('sound/music/traitor.ogg')),
|
||||
"burntest" = new/datum/holodeck_program(/area/holodeck/source_burntest, list()),
|
||||
"wildlifecarp" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list()),
|
||||
"turnoff" = new/datum/holodeck_program(/area/holodeck/source_plating, list())
|
||||
)
|
||||
|
||||
/datum/holodeck_program
|
||||
var/target
|
||||
var/list/ambience = null
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
if(!holder) return
|
||||
|
||||
if(!plant_controller || !plant_controller.gene_tag_masks)
|
||||
usr << "Gene masks not set."
|
||||
to_chat(usr, "Gene masks not set.")
|
||||
return
|
||||
|
||||
for(var/mask in plant_controller.gene_tag_masks)
|
||||
usr << "[mask]: [plant_controller.gene_tag_masks[mask]]"
|
||||
to_chat(usr, "[mask]: [plant_controller.gene_tag_masks[mask]]")
|
||||
|
||||
var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
|
||||
@@ -33,6 +33,8 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
var/list/plant_sprites = list() // List of all harvested product sprites.
|
||||
var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages.
|
||||
var/processing = 0 // Off/on.
|
||||
var/list/gene_masked_list = list() // Stored gene masked list, rather than recreating it when needed.
|
||||
var/list/plant_gene_datums = list() // Stored datum versions of the gene masked list.
|
||||
|
||||
/datum/controller/plants/New()
|
||||
if(plant_controller && plant_controller != src)
|
||||
@@ -83,6 +85,7 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
S.update_seed()
|
||||
|
||||
//Might as well mask the gene types while we're at it.
|
||||
var/list/gene_datums = decls_repository.decls_of_subtype(/decl/plantgene)
|
||||
var/list/used_masks = list()
|
||||
var/list/plant_traits = ALL_GENES
|
||||
while(plant_traits && plant_traits.len)
|
||||
@@ -92,9 +95,18 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
while(gene_mask in used_masks)
|
||||
gene_mask = "[uppertext(num2hex(rand(0,255)))]"
|
||||
|
||||
var/decl/plantgene/G
|
||||
|
||||
for(var/D in gene_datums)
|
||||
var/decl/plantgene/P = gene_datums[D]
|
||||
if(gene_tag == P.gene_tag)
|
||||
G = P
|
||||
gene_datums -= D
|
||||
used_masks += gene_mask
|
||||
plant_traits -= gene_tag
|
||||
gene_tag_masks[gene_tag] = gene_mask
|
||||
plant_gene_datums[gene_mask] = G
|
||||
gene_masked_list.Add(list(list("tag" = gene_tag, "mask" = gene_mask)))
|
||||
|
||||
// Proc for creating a random seed type.
|
||||
/datum/controller/plants/proc/create_random_seed(var/survive_on_station)
|
||||
@@ -147,4 +159,4 @@ var/global/datum/controller/plants/plant_controller // Set in New().
|
||||
plant_queue |= plant
|
||||
|
||||
/datum/controller/plants/proc/remove_plant(var/obj/effect/plant/plant)
|
||||
plant_queue -= plant
|
||||
plant_queue -= plant
|
||||
@@ -0,0 +1,135 @@
|
||||
/datum/seed/proc/diverge_mutate_gene(var/decl/plantgene/G, var/turf/T)
|
||||
if(!istype(G))
|
||||
log_debug("Attempted to mutate [src] with a non-plantgene var.")
|
||||
return src
|
||||
|
||||
var/datum/seed/S = diverge() //Let's not modify all of the seeds.
|
||||
T.visible_message("<span class='notice'>\The [S.display_name] quivers!</span>") //Mimicks the normal mutation.
|
||||
G.mutate(S, T)
|
||||
|
||||
return S
|
||||
|
||||
/decl/plantgene
|
||||
var/gene_tag
|
||||
|
||||
/decl/plantgene/biochem
|
||||
gene_tag = GENE_BIOCHEMISTRY
|
||||
|
||||
/decl/plantgene/hardiness
|
||||
gene_tag = GENE_HARDINESS
|
||||
|
||||
/decl/plantgene/environment
|
||||
gene_tag = GENE_ENVIRONMENT
|
||||
|
||||
/decl/plantgene/metabolism
|
||||
gene_tag = GENE_METABOLISM
|
||||
|
||||
/decl/plantgene/structure
|
||||
gene_tag = GENE_STRUCTURE
|
||||
|
||||
/decl/plantgene/diet
|
||||
gene_tag = GENE_DIET
|
||||
|
||||
/decl/plantgene/pigment
|
||||
gene_tag = GENE_PIGMENT
|
||||
|
||||
/decl/plantgene/output
|
||||
gene_tag = GENE_OUTPUT
|
||||
|
||||
/decl/plantgene/atmosphere
|
||||
gene_tag = GENE_ATMOSPHERE
|
||||
|
||||
/decl/plantgene/vigour
|
||||
gene_tag = GENE_VIGOUR
|
||||
|
||||
/decl/plantgene/fruit
|
||||
gene_tag = GENE_FRUIT
|
||||
|
||||
/decl/plantgene/special
|
||||
gene_tag = GENE_SPECIAL
|
||||
|
||||
/decl/plantgene/proc/mutate(var/datum/seed/S)
|
||||
return
|
||||
|
||||
/decl/plantgene/biochem/mutate(var/datum/seed/S)
|
||||
S.set_trait(TRAIT_POTENCY, S.get_trait(TRAIT_POTENCY)+rand(-20,20),200, 0)
|
||||
|
||||
/decl/plantgene/hardiness/mutate(var/datum/seed/S)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_TOXINS_TOLERANCE, S.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_PEST_TOLERANCE, S.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_WEED_TOLERANCE, S.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_ENDURANCE, S.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0)
|
||||
|
||||
/decl/plantgene/environment/mutate(var/datum/seed/S)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_IDEAL_HEAT, S.get_trait(TRAIT_IDEAL_HEAT)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_IDEAL_LIGHT, S.get_trait(TRAIT_IDEAL_LIGHT)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_LIGHT_TOLERANCE, S.get_trait(TRAIT_LIGHT_TOLERANCE)+rand(-5,5),100,0)
|
||||
|
||||
/decl/plantgene/metabolism/mutate(var/datum/seed/S)
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_REQUIRES_NUTRIENTS, S.get_trait(TRAIT_REQUIRES_NUTRIENTS)+rand(-2,2),10,0)
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_REQUIRES_WATER, S.get_trait(TRAIT_REQUIRES_WATER)+rand(-2,2),10,0)
|
||||
if(prob(40))
|
||||
S.set_trait(TRAIT_ALTER_TEMP, S.get_trait(TRAIT_ALTER_TEMP)+rand(-5,5),100,0)
|
||||
|
||||
/decl/plantgene/diet/mutate(var/datum/seed/S)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_CARNIVOROUS, S.get_trait(TRAIT_CARNIVOROUS)+rand(-1,1),2,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_PARASITE, !S.get_trait(TRAIT_PARASITE))
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_NUTRIENT_CONSUMPTION, S.get_trait(TRAIT_NUTRIENT_CONSUMPTION)+rand(-0.1,0.1),5,0)
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_WATER_CONSUMPTION, S.get_trait(TRAIT_WATER_CONSUMPTION)+rand(-1,1),50,0)
|
||||
|
||||
/decl/plantgene/output/mutate(var/datum/seed/S, var/turf/T)
|
||||
if(prob(50))
|
||||
S.set_trait(TRAIT_BIOLUM, !S.get_trait(TRAIT_BIOLUM))
|
||||
if(S.get_trait(TRAIT_BIOLUM))
|
||||
T.visible_message("<span class='notice'>\The [S.display_name] begins to glow!</span>")
|
||||
if(prob(50))
|
||||
S.set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190))
|
||||
T.visible_message("<span class='notice'>\The [S.display_name]'s glow </span><font color='[S.get_trait(TRAIT_BIOLUM_COLOUR)]'>changes colour</font>!")
|
||||
else
|
||||
T.visible_message("<span class='notice'>\The [S.display_name]'s glow dims...</span>")
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_PRODUCES_POWER, !S.get_trait(TRAIT_PRODUCES_POWER))
|
||||
|
||||
/decl/plantgene/atmosphere/mutate(var/datum/seed/S)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_TOXINS_TOLERANCE, S.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_PEST_TOLERANCE, S.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_WEED_TOLERANCE, S.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0)
|
||||
if(prob(60))
|
||||
S.set_trait(TRAIT_ENDURANCE, S.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0)
|
||||
|
||||
/decl/plantgene/vigour/mutate(var/datum/seed/S, var/turf/T)
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_PRODUCTION, S.get_trait(TRAIT_PRODUCTION)+rand(-1,1),10,0)
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_MATURATION, S.get_trait(TRAIT_MATURATION)+rand(-1,1),30,0)
|
||||
if(prob(55))
|
||||
S.set_trait(TRAIT_SPREAD, S.get_trait(TRAIT_SPREAD)+rand(-1,1),2,0)
|
||||
T.visible_message("<span class='notice'>\The [S.display_name] spasms visibly, shifting in the tray.</span>")
|
||||
|
||||
/decl/plantgene/fruit/mutate(var/datum/seed/S)
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_STINGS, !S.get_trait(TRAIT_STINGS))
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_EXPLOSIVE, !S.get_trait(TRAIT_EXPLOSIVE))
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_JUICY, !S.get_trait(TRAIT_JUICY))
|
||||
|
||||
/decl/plantgene/special/mutate(var/datum/seed/S)
|
||||
if(prob(65))
|
||||
S.set_trait(TRAIT_TELEPORTING, !S.get_trait(TRAIT_TELEPORTING))
|
||||
@@ -137,9 +137,7 @@
|
||||
|
||||
var/list/data = list()
|
||||
|
||||
var/list/geneMasks[0]
|
||||
for(var/gene_tag in plant_controller.gene_tag_masks)
|
||||
geneMasks.Add(list(list("tag" = gene_tag, "mask" = plant_controller.gene_tag_masks[gene_tag])))
|
||||
var/list/geneMasks = plant_controller.gene_masked_list
|
||||
data["geneMasks"] = geneMasks
|
||||
|
||||
data["activity"] = active
|
||||
|
||||
@@ -181,9 +181,14 @@
|
||||
return
|
||||
|
||||
//Override for somatoray projectiles.
|
||||
if(istype(Proj ,/obj/item/projectile/energy/floramut) && prob(20))
|
||||
mutate(1)
|
||||
return
|
||||
if(istype(Proj ,/obj/item/projectile/energy/floramut)&& prob(20))
|
||||
if(istype(Proj, /obj/item/projectile/energy/floramut/gene))
|
||||
var/obj/item/projectile/energy/floramut/gene/G = Proj
|
||||
if(seed)
|
||||
seed = seed.diverge_mutate_gene(G.gene, get_turf(loc)) //get_turf just in case it's not in a turf.
|
||||
else
|
||||
mutate(1)
|
||||
return
|
||||
else if(istype(Proj ,/obj/item/projectile/energy/florayield) && prob(20))
|
||||
yield_mod = min(10,yield_mod+rand(1,2))
|
||||
return
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE."
|
||||
complexity = 3
|
||||
outputs = list("result")
|
||||
activators = list("\<PULSE IN\> compare", "\<PULSE OUT\> on true result", "\<PULSE OUT\> on false result")
|
||||
activators = list("\<PULSE IN\> compare")
|
||||
category_text = "Logic"
|
||||
autopulse = 1
|
||||
power_draw_per_use = 1
|
||||
@@ -15,13 +15,10 @@
|
||||
|
||||
/obj/item/integrated_circuit/logic/do_work()
|
||||
push_data()
|
||||
if(get_pin_data(IC_INPUT, 1))
|
||||
activate_pin(1)
|
||||
else
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/logic/binary
|
||||
inputs = list("\<ANY\> A","\<ANY\> B")
|
||||
activators = list("\<PULSE IN\> compare", "\<PULSE OUT\> on true result", "\<PULSE OUT\> on false result")
|
||||
|
||||
/obj/item/integrated_circuit/logic/binary/do_work()
|
||||
pull_data()
|
||||
@@ -29,6 +26,11 @@
|
||||
var/datum/integrated_io/B = inputs[2]
|
||||
var/datum/integrated_io/O = outputs[1]
|
||||
O.data = do_compare(A, B) ? TRUE : FALSE
|
||||
|
||||
if(get_pin_data(IC_OUTPUT, 1))
|
||||
activate_pin(2)
|
||||
else
|
||||
activate_pin(3)
|
||||
..()
|
||||
|
||||
/obj/item/integrated_circuit/logic/binary/proc/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B)
|
||||
@@ -36,6 +38,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/logic/unary
|
||||
inputs = list("\<ANY\> A")
|
||||
activators = list("\<PULSE IN\> compare", "\<PULSE OUT\> on compare")
|
||||
|
||||
/obj/item/integrated_circuit/logic/unary/do_work()
|
||||
pull_data()
|
||||
@@ -43,6 +46,7 @@
|
||||
var/datum/integrated_io/O = outputs[1]
|
||||
O.data = do_check(A) ? TRUE : FALSE
|
||||
..()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/logic/unary/proc/do_check(var/datum/integrated_io/A)
|
||||
return FALSE
|
||||
@@ -124,6 +128,7 @@
|
||||
desc = "This gate inverts what's fed into it."
|
||||
icon_state = "not"
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
activators = list("\<PULSE IN\> invert", "\<PULSE OUT\> on inverted")
|
||||
|
||||
/obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A)
|
||||
return !A.data
|
||||
|
||||
@@ -212,7 +212,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
set name = "Ghost"
|
||||
set desc = "Relinquish your life and enter the land of the dead."
|
||||
|
||||
if(stat == DEAD)
|
||||
if(stat == DEAD && !forbid_seeing_deadchat)
|
||||
announce_ghost_joinleave(ghostize(1))
|
||||
else
|
||||
var/response
|
||||
@@ -223,7 +223,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return
|
||||
src.client.admin_ghost()
|
||||
else
|
||||
response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") // VOREStation edit because we don't make players stay dead for 30 minutes.
|
||||
response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") // VOREStation edit because we don't make players stay dead for 30 minutes.
|
||||
if(response != "Ghost")
|
||||
return
|
||||
resting = 1
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
/mob/living/silicon/ai/proc/create_eyeobj(var/newloc)
|
||||
if(eyeobj) destroy_eyeobj()
|
||||
if(!newloc) newloc = src.loc
|
||||
eyeobj = PoolOrNew(/mob/observer/eye/aiEye, newloc)
|
||||
eyeobj = new /mob/observer/eye/aiEye(newloc)
|
||||
eyeobj.owner = src
|
||||
eyeobj.name = "[src.name] (AI Eye)" // Give it a name
|
||||
if(client) client.eye = eyeobj
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
/mob/living/silicon/ai/special_mentions()
|
||||
return list("AI") // AI door!
|
||||
|
||||
// Converts specific characters, like *, |, and _ to formatted output.
|
||||
// Converts specific characters, like +, |, and _ to formatted output.
|
||||
/mob/proc/say_emphasis(var/message)
|
||||
message = encode_html_emphasis(message, "|", "i")
|
||||
message = encode_html_emphasis(message, "+", "b")
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
flags = WHITELISTED
|
||||
syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr",
|
||||
"mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r",
|
||||
"ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
|
||||
"ka","aasi","far","wa","baq","ara","qara","zir","saam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
|
||||
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
|
||||
|
||||
/datum/language/tajaran/get_random_name(var/gender)
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
if(building == 1)
|
||||
I = new /obj/item/stack/tile/floor(src)
|
||||
else
|
||||
I = PoolOrNew(/obj/item/stack/rods, src)
|
||||
I = new /obj/item/stack/rods(src)
|
||||
A.attackby(I, src)
|
||||
target = null
|
||||
busy = 0
|
||||
|
||||
@@ -268,8 +268,8 @@
|
||||
|
||||
var/turf/Tsec = get_turf(src)
|
||||
new /obj/item/device/assembly/prox_sensor(Tsec)
|
||||
PoolOrNew(/obj/item/stack/rods, Tsec)
|
||||
PoolOrNew(/obj/item/stack/rods, Tsec)
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
new /obj/item/stack/cable_coil/cut(Tsec)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
|
||||
@@ -41,6 +41,13 @@
|
||||
species.handle_death(src)
|
||||
animate_tail_stop()
|
||||
|
||||
//Handle snowflake ling stuff.
|
||||
if(mind && mind.changeling)
|
||||
// If the ling is capable of revival, don't allow them to see deadchat.
|
||||
if(mind.changeling.chem_charges >= CHANGELING_STASIS_COST)
|
||||
if(mind.changeling.max_geneticpoints >= 0) // Absorbed lings don't count, as they can't revive.
|
||||
forbid_seeing_deadchat = TRUE
|
||||
|
||||
//Handle brain slugs.
|
||||
var/obj/item/organ/external/Hd = get_organ(BP_HEAD)
|
||||
var/mob/living/simple_animal/borer/B
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
miss_type = 1
|
||||
|
||||
if(prob(80))
|
||||
hit_zone = ran_zone(hit_zone)
|
||||
hit_zone = ran_zone(hit_zone, 70) //70% chance to hit what you're aiming at seems fair?
|
||||
if(prob(15) && hit_zone != BP_TORSO) // Missed!
|
||||
if(!src.lying)
|
||||
attack_message = "[H] attempted to strike [src], but missed!"
|
||||
@@ -261,13 +261,13 @@
|
||||
rand_damage *= 2
|
||||
real_damage = max(1, real_damage)
|
||||
|
||||
var/armour = run_armor_check(affecting, "melee")
|
||||
var/soaked = get_armor_soak(affecting, "melee")
|
||||
var/armour = run_armor_check(hit_zone, "melee")
|
||||
var/soaked = get_armor_soak(hit_zone, "melee")
|
||||
// Apply additional unarmed effects.
|
||||
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
|
||||
|
||||
// Finally, apply damage to target
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
|
||||
if(I_DISARM)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
|
||||
@@ -185,6 +185,26 @@
|
||||
wearing_rig.notify_ai("<span class='danger'>Warning: user consciousness failure. Mobility control passed to integrated intelligence system.</span>")
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/proc/Stasis(amount)
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
in_stasis = 0
|
||||
else
|
||||
in_stasis = amount
|
||||
|
||||
/mob/living/carbon/human/proc/getStasis()
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
return 0
|
||||
|
||||
return in_stasis
|
||||
|
||||
//This determines if, RIGHT NOW, the life() tick is being skipped due to stasis
|
||||
/mob/living/carbon/human/proc/inStasisNow()
|
||||
var/stasisValue = getStasis()
|
||||
if(stasisValue && (life_tick % stasisValue))
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/getCloneLoss()
|
||||
if((species.flags & NO_SCAN) || isSynthetic())
|
||||
cloneloss = 0
|
||||
|
||||
@@ -13,9 +13,11 @@
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
|
||||
if(force_max_speed)
|
||||
return -3 // Returning -1 will actually result in a slowdown for Teshari.
|
||||
return -3
|
||||
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.haste) && M.haste == TRUE)
|
||||
return -3 // Returning -1 will actually result in a slowdown for Teshari.
|
||||
if(!isnull(M.slowdown))
|
||||
tally += M.slowdown
|
||||
|
||||
@@ -90,9 +92,7 @@
|
||||
if(T && T.movement_cost)
|
||||
tally += T.movement_cost
|
||||
|
||||
if(species.item_slowdown_halved)
|
||||
if(item_tally > 0)
|
||||
item_tally *= 0.5
|
||||
item_tally *= species.item_slowdown_mod
|
||||
|
||||
tally += item_tally
|
||||
|
||||
|
||||
@@ -62,8 +62,12 @@
|
||||
|
||||
voice = GetVoice()
|
||||
|
||||
var/stasis = inStasisNow()
|
||||
if(getStasis() > 2)
|
||||
Sleeping(20)
|
||||
|
||||
//No need to update all of these procs if the guy is dead.
|
||||
if(stat != DEAD && !in_stasis)
|
||||
if(stat != DEAD && !stasis)
|
||||
//Updates the number of stored chemicals for powers
|
||||
handle_changeling()
|
||||
|
||||
@@ -82,8 +86,6 @@
|
||||
if(!client)
|
||||
species.handle_npc(src)
|
||||
|
||||
else //VOREStation Addition - Stasis bags op pls nerf
|
||||
if(in_stasis) Sleeping(5)
|
||||
if(!handle_some_updates())
|
||||
return //We go ahead and process them 5 times for HUD images and other stuff though.
|
||||
|
||||
@@ -98,7 +100,7 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/breathe()
|
||||
if(!in_stasis)
|
||||
if(!inStasisNow())
|
||||
..()
|
||||
|
||||
// Calculate how vulnerable the human is to under- and overpressure.
|
||||
@@ -208,7 +210,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/handle_mutations_and_radiation()
|
||||
if(in_stasis)
|
||||
if(inStasisNow())
|
||||
return
|
||||
|
||||
if(getFireLoss())
|
||||
@@ -789,7 +791,7 @@
|
||||
|
||||
/mob/living/carbon/human/handle_chemicals_in_body()
|
||||
|
||||
if(in_stasis)
|
||||
if(inStasisNow())
|
||||
return
|
||||
|
||||
if(reagents)
|
||||
@@ -1345,7 +1347,7 @@
|
||||
if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
/mob/living/carbon/human/handle_random_events()
|
||||
if(in_stasis)
|
||||
if(inStasisNow())
|
||||
return
|
||||
|
||||
// Puke if toxloss is too high
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
var/appearance_flags = 0 // Appearance/display related features.
|
||||
var/spawn_flags = 0 // Flags that specify who can spawn as this species
|
||||
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
|
||||
var/item_slowdown_halved = 0 // If this is on, they're not as affected by item weights for slowdown
|
||||
var/item_slowdown_mod = 1 // How affected by item slowdown the species is.
|
||||
var/primitive_form // Lesser form, if any (ie. monkey for humans)
|
||||
var/greater_form // Greater form, if any, ie. human for monkeys.
|
||||
var/holder_type
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
brute_mod = 0.85
|
||||
burn_mod = 0.85
|
||||
metabolic_rate = 0.85
|
||||
item_slowdown_halved = 1
|
||||
item_slowdown_mod = 0.5
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_UNATHI)
|
||||
name_language = LANGUAGE_UNATHI
|
||||
@@ -256,6 +256,7 @@
|
||||
secondary_langs = list(LANGUAGE_ROOTGLOBAL)
|
||||
name_language = LANGUAGE_ROOTLOCAL
|
||||
health_hud_intensity = 2.5
|
||||
item_slowdown_mod = 0.25
|
||||
|
||||
min_age = 1
|
||||
max_age = 300
|
||||
|
||||
@@ -131,10 +131,11 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
#define LEGCUFF_LAYER 23
|
||||
#define L_HAND_LAYER 24
|
||||
#define R_HAND_LAYER 25
|
||||
#define FIRE_LAYER 26 //If you're on fire
|
||||
#define WATER_LAYER 27 //If you're submerged in water.
|
||||
#define TARGETED_LAYER 28 //BS12: Layer for the target overlay from weapon targeting system
|
||||
#define TOTAL_LAYERS 29
|
||||
#define MODIFIER_EFFECTS_LAYER 26
|
||||
#define FIRE_LAYER 27 //If you're on fire
|
||||
#define WATER_LAYER 28 //If you're submerged in water.
|
||||
#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system
|
||||
#define TOTAL_LAYERS 30
|
||||
//////////////////////////////////
|
||||
|
||||
/mob/living/carbon/human
|
||||
@@ -1146,6 +1147,18 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
if(update_icons) update_icons()
|
||||
|
||||
/mob/living/carbon/human/update_modifier_visuals(var/update_icons=1)
|
||||
overlays_standing[MODIFIER_EFFECTS_LAYER] = null
|
||||
var/image/effects = new()
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(M.mob_overlay_state)
|
||||
var/image/I = image("icon" = 'icons/mob/modifier_effects.dmi', "icon_state" = M.mob_overlay_state)
|
||||
effects.overlays += I
|
||||
|
||||
overlays_standing[MODIFIER_EFFECTS_LAYER] = effects
|
||||
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
|
||||
/mob/living/carbon/human/update_fire(var/update_icons=1)
|
||||
overlays_standing[FIRE_LAYER] = null
|
||||
|
||||
@@ -975,6 +975,11 @@ default behaviour is:
|
||||
update_icons()
|
||||
return canmove
|
||||
|
||||
// Adds overlays for specific modifiers.
|
||||
// You'll have to add your own implementation for non-humans currently, just override this proc.
|
||||
/mob/living/proc/update_modifier_visuals()
|
||||
return
|
||||
|
||||
/mob/living/proc/update_water() // Involves overlays for humans. Maybe we'll get submerged sprites for borgs in the future?
|
||||
return
|
||||
|
||||
|
||||
@@ -439,3 +439,11 @@
|
||||
hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1)
|
||||
//hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1)
|
||||
client.screen += hud_used.hide_actions_toggle
|
||||
|
||||
// Returns a number to determine if something is harder or easier to hit than normal.
|
||||
/mob/living/proc/get_evasion()
|
||||
var/result = evasion // First we get the 'base' evasion. Generally this is zero.
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.evasion))
|
||||
result += M.evasion
|
||||
return result
|
||||
|
||||
@@ -141,7 +141,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
|
||||
//Redirect to say_dead if talker is dead
|
||||
if(stat)
|
||||
if(stat == DEAD)
|
||||
if(stat == DEAD && !forbid_seeing_deadchat)
|
||||
return say_dead(message)
|
||||
return
|
||||
|
||||
@@ -308,7 +308,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(M && src) //If we still exist, when the spawn processes
|
||||
var/dst = get_dist(get_turf(M),get_turf(src))
|
||||
|
||||
if(dst <= message_range || M.stat == DEAD) //Inside normal message range, or dead with ears (handled in the view proc)
|
||||
if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
|
||||
M << speech_bubble
|
||||
M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
|
||||
time_last_drone = world.time
|
||||
if(player.mob && player.mob.mind) player.mob.mind.reset()
|
||||
var/mob/living/silicon/robot/drone/new_drone = PoolOrNew(drone_type, get_turf(src))
|
||||
var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
|
||||
new_drone.transfer_personality(player)
|
||||
new_drone.master_fabricator = src
|
||||
|
||||
|
||||
@@ -176,16 +176,16 @@
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
|
||||
//rods
|
||||
O = PoolOrNew(/obj/item/stack/rods, src.loc)
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(75))
|
||||
O = PoolOrNew(/obj/item/stack/rods, src.loc)
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(50))
|
||||
O = PoolOrNew(/obj/item/stack/rods, src.loc)
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
if(prob(25))
|
||||
O = PoolOrNew(/obj/item/stack/rods, src.loc)
|
||||
O = new /obj/item/stack/rods(src.loc)
|
||||
step_to(O, get_turf(pick(view(7, src))))
|
||||
|
||||
//plasteel
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
if(istype(I, /obj/effect/spider/eggcluster))
|
||||
eggcount ++
|
||||
if(!eggcount)
|
||||
var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/small, list(O, src))
|
||||
var/eggs = new /obj/effect/spider/eggcluster/small(O, src)
|
||||
O.implants += eggs
|
||||
H << "<span class='warning'>The [src] injects something into your [O.name]!</span>"
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
if(busy == LAYING_EGGS)
|
||||
E = locate() in get_turf(src)
|
||||
if(!E)
|
||||
PoolOrNew(/obj/effect/spider/eggcluster, list(loc, src))
|
||||
new /obj/effect/spider/eggcluster(loc, src)
|
||||
fed--
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
@@ -208,3 +208,4 @@
|
||||
var/list/active_genes=list()
|
||||
var/mob_size = MOB_MEDIUM
|
||||
var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping
|
||||
var/forbid_seeing_deadchat = FALSE // Used for lings to not see deadchat, and to have ghosting behave as if they were not really dead.
|
||||
|
||||
@@ -390,10 +390,16 @@ proc/is_blind(A)
|
||||
else
|
||||
name = realname
|
||||
|
||||
if(subject && subject.forbid_seeing_deadchat && !subject.client.holder)
|
||||
return // Can't talk in deadchat if you can't see it.
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
|
||||
var/follow
|
||||
var/lname
|
||||
if(M.forbid_seeing_deadchat && !M.client.holder)
|
||||
continue
|
||||
|
||||
if(subject)
|
||||
if(M.is_key_ignored(subject.client.key)) // If we're ignored, do nothing.
|
||||
continue
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
if(S.victim == mob)
|
||||
return
|
||||
|
||||
if(mob.stat==DEAD && isliving(mob))
|
||||
if(mob.stat==DEAD && isliving(mob) && !mob.forbid_seeing_deadchat)
|
||||
mob.ghostize()
|
||||
return
|
||||
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
var/stacks = MODIFIER_STACK_FORBID // If true, attempts to add a second instance of this type will refresh expire_at instead.
|
||||
var/flags = 0 // Flags for the modifier, see mobs.dm defines for more details.
|
||||
|
||||
var/light_color = null // If set, the mob possessing the modifier will glow in this color. Not implemented yet.
|
||||
var/light_range = null // How far the light for the above var goes. Not implemented yet.
|
||||
var/light_intensity = null // Ditto. Not implemented yet.
|
||||
var/mob_overlay_state = null // Icon_state for an overlay to apply to a (human) mob while this exists. This is actually implemented.
|
||||
|
||||
// Now for all the different effects.
|
||||
// Percentage modifiers are expressed as a multipler. (e.g. +25% damage should be written as 1.25)
|
||||
var/max_health_flat // Adjusts max health by a flat (e.g. +20) amount. Note this is added to base health.
|
||||
@@ -29,6 +34,8 @@
|
||||
var/incoming_healing_percent // Adjusts amount of healing received.
|
||||
var/outgoing_melee_damage_percent // Adjusts melee damage inflicted by holder by a percentage. Affects attacks by melee weapons and hand-to-hand.
|
||||
var/slowdown // Negative numbers speed up, positive numbers slow down movement.
|
||||
var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
|
||||
var/evasion // Positive numbers reduce the odds of being hit by 15% each. Negative numbers increase the odds.
|
||||
|
||||
/datum/modifier/New(var/new_holder)
|
||||
holder = new_holder
|
||||
@@ -44,12 +51,18 @@
|
||||
to_chat(holder, on_expired_text)
|
||||
on_expire()
|
||||
holder.modifiers.Remove(src)
|
||||
if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain.
|
||||
holder.update_modifier_visuals()
|
||||
qdel(src)
|
||||
|
||||
// Override this for special effects when it gets removed.
|
||||
/datum/modifier/proc/on_expire()
|
||||
return
|
||||
|
||||
// Called every Life() tick. Override for special behaviour.
|
||||
/datum/modifier/proc/tick()
|
||||
return
|
||||
|
||||
/mob/living
|
||||
var/list/modifiers = list() // A list of modifier datums, which can adjust certain mob numbers.
|
||||
|
||||
@@ -64,13 +77,16 @@
|
||||
// Get rid of anything we shouldn't have.
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
M.check_if_valid()
|
||||
// Remaining modifiers will now receive a tick(). This is in a second loop for safety in order to not tick() an expired modifier.
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
M.tick()
|
||||
|
||||
// Call this to add a modifier to a mob. First argument is the modifier type you want, second is how long it should last, in ticks.
|
||||
// The SECONDS/MINUTES macro is very helpful for this. E.g. M.add_modifier(/datum/modifier/example, 5 MINUTES)
|
||||
/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null)
|
||||
// First, check if the mob already has this modifier.
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(ispath(modifier_type, M.type))
|
||||
if(istype(modifier_type, M))
|
||||
switch(M.stacks)
|
||||
if(MODIFIER_STACK_FORBID)
|
||||
return // Stop here.
|
||||
@@ -89,6 +105,8 @@
|
||||
if(mod.on_created_text)
|
||||
to_chat(src, mod.on_created_text)
|
||||
modifiers.Add(mod)
|
||||
if(mod.mob_overlay_state)
|
||||
update_modifier_visuals()
|
||||
|
||||
// Removes a specific instance of modifier
|
||||
/mob/living/proc/remove_specific_modifier(var/datum/modifier/M, var/silent = FALSE)
|
||||
@@ -97,10 +115,17 @@
|
||||
// Removes all modifiers of a type
|
||||
/mob/living/proc/remove_modifiers_of_type(var/modifier_type, var/silent = FALSE)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(ispath(modifier_type, M.type))
|
||||
if(istype(M, modifier_type))
|
||||
M.expire(silent)
|
||||
|
||||
// Removes all modifiers, useful if the mob's being deleted
|
||||
/mob/living/proc/remove_all_modifiers(var/silent = FALSE)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
M.expire(silent)
|
||||
M.expire(silent)
|
||||
|
||||
// Checks if the mob has a modifier type.
|
||||
/mob/living/proc/has_modifier_of_type(var/modifier_type)
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(istype(M, modifier_type))
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -206,6 +206,10 @@
|
||||
icon_state = "hair_bobcut"
|
||||
species_allowed = list("Human","Unathi")
|
||||
|
||||
bobcutalt
|
||||
name = "Chin Length Bob"
|
||||
icon_state = "hair_bobcutalt"
|
||||
|
||||
bun
|
||||
name = "Bun"
|
||||
icon_state = "hair_bun"
|
||||
@@ -361,6 +365,14 @@
|
||||
name = "Hime Cut"
|
||||
icon_state = "hair_himecut"
|
||||
|
||||
shorthime
|
||||
name = "Short Hime Cut"
|
||||
icon_state = "hair_shorthime"
|
||||
|
||||
grandebraid
|
||||
name = "Grande Braid"
|
||||
icon_state = "hair_grande"
|
||||
|
||||
mbraid
|
||||
name = "Medium Braid"
|
||||
icon_state = "hair_shortbraid"
|
||||
@@ -369,6 +381,10 @@
|
||||
name = "Long Braid"
|
||||
icon_state = "hair_hbraid"
|
||||
|
||||
braid
|
||||
name = "Floorlength Braid"
|
||||
icon_state = "hair_braid"
|
||||
|
||||
odango
|
||||
name = "Odango"
|
||||
icon_state = "hair_odango"
|
||||
@@ -398,6 +414,10 @@
|
||||
name = "Drillruru"
|
||||
icon_state = "hair_drillruru"
|
||||
|
||||
fringetail
|
||||
name = "Fringetail"
|
||||
icon_state = "hair_fringetail"
|
||||
|
||||
dandypomp
|
||||
name = "Dandy Pompadour"
|
||||
icon_state = "hair_dandypompadour"
|
||||
@@ -549,7 +569,53 @@
|
||||
icon_state = "hair_shavedpart"
|
||||
gender = MALE
|
||||
|
||||
hightight
|
||||
name = "High and Tight"
|
||||
icon_state = "hair_hightight"
|
||||
|
||||
rowbun
|
||||
name = "Row Bun"
|
||||
icon_state = "hair_rowbun"
|
||||
|
||||
rowdualbraid
|
||||
name = "Row Dual Braid"
|
||||
icon_state = "hair_rowdualtail"
|
||||
|
||||
rowbraid
|
||||
name = "Row Braid"
|
||||
icon_state = "hair_rowbraid"
|
||||
|
||||
regulationmohawk
|
||||
name = "Regulation Mohawk"
|
||||
icon_state = "hair_shavedmohawk"
|
||||
|
||||
topknot
|
||||
name = "Topknot"
|
||||
icon_state = "hair_topknot"
|
||||
|
||||
ronin
|
||||
name = "Ronin"
|
||||
icon_state = "hair_ronin"
|
||||
|
||||
bowlcut2
|
||||
name = "Bowl2"
|
||||
icon_state = "hair_bowlcut2"
|
||||
|
||||
thinning
|
||||
name = "Thinning"
|
||||
icon_state = "hair_thinning"
|
||||
|
||||
thinningfront
|
||||
name = "Thinning Front"
|
||||
icon_state = "hair_thinningfront"
|
||||
|
||||
thinningback
|
||||
name = "Thinning Back"
|
||||
icon_state = "hair_thinningrear"
|
||||
|
||||
manbun
|
||||
name = "Manbun"
|
||||
icon_state = "hair_manbun"
|
||||
/*
|
||||
///////////////////////////////////
|
||||
/ =---------------------------= /
|
||||
@@ -674,6 +740,13 @@
|
||||
name = "Walrus Moustache"
|
||||
icon_state = "facial_walrus"
|
||||
|
||||
croppedbeard
|
||||
name = "Full Cropped Beard"
|
||||
icon_state = "facial_croppedfullbeard"
|
||||
|
||||
chinless
|
||||
name = "Chinless Beard"
|
||||
icon_state = "facial_chinlessbeard"
|
||||
/*
|
||||
///////////////////////////////////
|
||||
/ =---------------------------= /
|
||||
|
||||
@@ -97,6 +97,7 @@ obj/machinery/atmospherics/pipe/zpipe/pipeline_expansion()
|
||||
return list(node1, node2)
|
||||
|
||||
obj/machinery/atmospherics/pipe/zpipe/update_icon()
|
||||
color = pipe_color
|
||||
return
|
||||
|
||||
obj/machinery/atmospherics/pipe/zpipe/disconnect(obj/machinery/atmospherics/reference)
|
||||
|
||||
@@ -37,7 +37,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/handle_blood()
|
||||
if(in_stasis)
|
||||
if(inStasisNow())
|
||||
return
|
||||
|
||||
if(!should_have_organ(O_HEART))
|
||||
|
||||
@@ -882,7 +882,7 @@ Note that amputating the affected organ does in fact remove the infection from t
|
||||
if(!clean)
|
||||
// Throw limb around.
|
||||
if(src && istype(loc,/turf))
|
||||
throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
|
||||
throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
|
||||
dir = 2
|
||||
if(DROPLIMB_BURN)
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(victim))
|
||||
@@ -901,19 +901,19 @@ Note that amputating the affected organ does in fact remove the infection from t
|
||||
gore.basecolor = use_blood_colour
|
||||
gore.update_icon()
|
||||
|
||||
gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
|
||||
gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
|
||||
|
||||
for(var/obj/item/organ/I in internal_organs)
|
||||
I.removed()
|
||||
if(istype(loc,/turf))
|
||||
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
|
||||
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
|
||||
|
||||
for(var/obj/item/I in src)
|
||||
if(I.w_class <= ITEMSIZE_SMALL)
|
||||
qdel(I)
|
||||
continue
|
||||
I.loc = get_turf(src)
|
||||
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
|
||||
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -44,6 +44,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
|
||||
var/parts = BP_ALL //Defines what parts said brand can replace on a body.
|
||||
var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator.
|
||||
|
||||
/datum/robolimb/unbranded_monitor
|
||||
company = "Unbranded Monitor"
|
||||
desc = "A generic unbranded interpretation of a popular prosthetic head model. It looks rudimentary and cheaply constructed."
|
||||
icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_monitor.dmi'
|
||||
parts = list(BP_HEAD)
|
||||
monitor_styles = standard_monitor_styles
|
||||
unavailable_to_build = 1
|
||||
|
||||
/datum/robolimb/nanotrasen
|
||||
company = "NanoTrasen"
|
||||
desc = "A simple but efficient robotic limb, created by NanoTrasen."
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
if(!paperamount)
|
||||
return
|
||||
paperamount--
|
||||
return PoolOrNew(/obj/item/weapon/shreddedp, get_turf(src))
|
||||
return new /obj/item/weapon/shreddedp(get_turf(src))
|
||||
|
||||
/obj/machinery/papershredder/power_change()
|
||||
..()
|
||||
@@ -185,5 +185,5 @@
|
||||
var/mob/living/M = loc
|
||||
if(istype(M))
|
||||
M.drop_from_inventory(src)
|
||||
PoolOrNew(/obj/effect/decal/cleanable/ash,get_turf(src))
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -182,7 +182,11 @@
|
||||
if (A == user && user.zone_sel.selecting == O_MOUTH && !mouthshoot)
|
||||
handle_suicide(user)
|
||||
else if(user.a_intent == I_HURT) //point blank shooting
|
||||
Fire(A, user, pointblank=1)
|
||||
if(user && user.client && user.aiming && user.aiming.active && user.aiming.aiming_at != A && A != user)
|
||||
PreFire(A,user) //They're using the new gun system, locate what they're aiming at.
|
||||
return
|
||||
else
|
||||
Fire(A, user, pointblank=1)
|
||||
else
|
||||
return ..() //Pistolwhippin'
|
||||
|
||||
@@ -326,6 +330,8 @@
|
||||
user.setMoveCooldown(move_delay)
|
||||
next_fire_time = world.time + fire_delay
|
||||
|
||||
accuracy = initial(accuracy) //Reset the gun's accuracy
|
||||
|
||||
if(muzzle_flash)
|
||||
set_light(0)
|
||||
|
||||
@@ -396,6 +402,8 @@
|
||||
//update timing
|
||||
next_fire_time = world.time + fire_delay
|
||||
|
||||
accuracy = initial(accuracy) //Reset the gun's accuracy
|
||||
|
||||
if(muzzle_flash)
|
||||
set_light(0)
|
||||
|
||||
@@ -482,11 +490,11 @@
|
||||
|
||||
// Certain statuses make it harder to aim, blindness especially. Same chances as melee, however guns accuracy uses multiples of 15.
|
||||
if(user.eye_blind)
|
||||
accuracy -= 5
|
||||
P.accuracy -= 5
|
||||
if(user.eye_blurry)
|
||||
accuracy -= 2
|
||||
P.accuracy -= 2
|
||||
if(user.confused)
|
||||
accuracy -= 3
|
||||
P.accuracy -= 3
|
||||
|
||||
//accuracy bonus from aiming
|
||||
if (aim_targets && (target in aim_targets))
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
name = "practice laser carbine"
|
||||
desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."
|
||||
projectile_type = /obj/item/projectile/beam/practice
|
||||
charge_cost = 48
|
||||
|
||||
cell_type = /obj/item/weapon/cell/device
|
||||
|
||||
|
||||
@@ -44,10 +44,12 @@
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
|
||||
modifystate = "floramut"
|
||||
self_recharge = 1
|
||||
var/decl/plantgene/gene = null
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="induce mutations", projectile_type=/obj/item/projectile/energy/floramut, modifystate="floramut"),
|
||||
list(mode_name="increase yield", projectile_type=/obj/item/projectile/energy/florayield, modifystate="florayield"),
|
||||
list(mode_name="induce specific mutations", projectile_type=/obj/item/projectile/energy/floramut/gene, modifystate="floramut"),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/floragun/afterattack(obj/target, mob/user, adjacent_flag)
|
||||
@@ -58,6 +60,28 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/energy/floragun/verb/select_gene()
|
||||
set name = "Select Gene"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
var/genemask = input("Choose a gene to modify.") as null|anything in plant_controller.plant_gene_datums
|
||||
|
||||
if(!genemask)
|
||||
return
|
||||
|
||||
gene = plant_controller.plant_gene_datums[genemask]
|
||||
|
||||
to_chat(usr, "<span class='info'>You set the [src]'s targeted genetic area to [genemask].</span>")
|
||||
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/floragun/consume_next_projectile()
|
||||
. = ..()
|
||||
var/obj/item/projectile/energy/floramut/gene/G = .
|
||||
if(istype(G))
|
||||
G.gene = gene
|
||||
|
||||
/obj/item/weapon/gun/energy/meteorgun
|
||||
name = "meteor gun"
|
||||
desc = "For the love of god, make sure you're aiming this the right way!"
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
return
|
||||
|
||||
//roll to-hit
|
||||
miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier + round(15*target_mob.evasion), 0)
|
||||
miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier + round(15*target_mob.get_evasion()), 0)
|
||||
var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss
|
||||
|
||||
var/result = PROJECTILE_FORCE_MISS
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
playsound(src, 'sound/effects/snap.ogg', 50, 1)
|
||||
src.visible_message("<span class='warning'>\The [src] explodes in a bright flash!</span>")
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(2, 1, T)
|
||||
sparks.start()
|
||||
|
||||
|
||||
@@ -121,6 +121,15 @@
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/energy/floramut/gene
|
||||
name = "gamma somatoray"
|
||||
icon_state = "energy2"
|
||||
damage = 0
|
||||
damage_type = TOX
|
||||
nodamage = 1
|
||||
check_armour = "energy"
|
||||
var/decl/plantgene/gene = null
|
||||
|
||||
/obj/item/projectile/energy/florayield
|
||||
name = "beta somatoray"
|
||||
icon_state = "energy2"
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
if(1)
|
||||
new_growth = 2
|
||||
var/obj/structure/diona/vines/existing = locate() in T
|
||||
if(!istype(existing)) existing = PoolOrNew(/obj/structure/diona/vines, T)
|
||||
if(!istype(existing)) existing = new /obj/structure/diona/vines(T)
|
||||
if(existing.growth < new_growth)
|
||||
existing.growth = new_growth
|
||||
existing.update_icon()
|
||||
@@ -161,11 +161,11 @@
|
||||
|
||||
switch(value)
|
||||
if(ARTIFACT_CHAR)
|
||||
PoolOrNew(/obj/structure/diona/bulb,T)
|
||||
new /obj/structure/diona/bulb(T)
|
||||
if(MONSTER_CHAR)
|
||||
spawn_diona_nymph(T)
|
||||
if(DOOR_CHAR)
|
||||
var/obj/structure/diona/vines/V = PoolOrNew(/obj/structure/diona/vines,T)
|
||||
var/obj/structure/diona/vines/V = new /obj/structure/diona/vines(T)
|
||||
V.growth = 3
|
||||
V.update_icon()
|
||||
spawn(1)
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
if(alien == IS_SKRELL)
|
||||
strength_mod *= 5
|
||||
if(alien == IS_TAJARA)
|
||||
strength_mod *= 1.75
|
||||
strength_mod *= 1.25
|
||||
if(alien == IS_UNATHI)
|
||||
strength_mod *= 0.75
|
||||
if(alien == IS_DIONA)
|
||||
|
||||
@@ -1799,6 +1799,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#7F00FF"
|
||||
strength = 10
|
||||
druggy = 15
|
||||
|
||||
glass_name = "Pan-Galactic Gargle Blaster"
|
||||
glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy."
|
||||
@@ -2232,8 +2233,8 @@
|
||||
glass_name = "special blend whiskey"
|
||||
glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
|
||||
|
||||
/datum/reagent/ethanol/unathiliquor //Needs a better name
|
||||
name = "Unathi Liquor"
|
||||
/datum/reagent/ethanol/unathiliquor
|
||||
name = "Redeemer's Brew"
|
||||
id = "unathiliquor"
|
||||
description = "This barely qualifies as a drink, and could give jetfuel a run for its money. Also known to cause feelings of euphoria and numbness."
|
||||
taste_description = "spiced numbness"
|
||||
|
||||
@@ -407,6 +407,16 @@
|
||||
..()
|
||||
reagents.add_reagent("pwine", 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew
|
||||
name = "Redeemer's Brew"
|
||||
desc = "Just opening the top of this bottle makes you feel a bit tipsy. Not for the faint of heart."
|
||||
icon_state = "redeemersbrew"
|
||||
center_of_mass = list("x"=16, "y"=3)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew/New()
|
||||
..()
|
||||
reagents.add_reagent("unathiliquor", 100)
|
||||
|
||||
//////////////////////////JUICES AND STUFF ///////////////////////
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice
|
||||
|
||||
@@ -14,11 +14,19 @@
|
||||
possible_transfer_amounts = null
|
||||
flags = OPENCONTAINER
|
||||
slot_flags = SLOT_BELT
|
||||
var/reusable = 1
|
||||
var/used = 0
|
||||
var/filled = 0
|
||||
var/list/filled_reagents = list()
|
||||
|
||||
///obj/item/weapon/reagent_containers/hypospray/New() //comment this to make hypos start off empty
|
||||
// ..()
|
||||
// reagents.add_reagent("tricordrazine", 30)
|
||||
// return
|
||||
/obj/item/weapon/reagent_containers/hypospray/New()
|
||||
..()
|
||||
if(filled)
|
||||
if(filled_reagents)
|
||||
for(var/r in filled_reagents)
|
||||
reagents.add_reagent(r, filled_reagents[r])
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/do_surgery(mob/living/carbon/M, mob/living/user)
|
||||
if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool
|
||||
@@ -53,6 +61,9 @@
|
||||
admin_inject_log(user, M, src, contained, trans)
|
||||
user << "<span class='notice'>[trans] units injected. [reagents.total_volume] units remaining in \the [src].</span>"
|
||||
|
||||
if(!reusable && !used)
|
||||
used = !used
|
||||
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector
|
||||
@@ -62,59 +73,52 @@
|
||||
item_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 5
|
||||
volume = 5
|
||||
reusable = 0
|
||||
filled = 1
|
||||
filled_reagents = list("inaprovaline" = 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/New()
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/on_reagent_change()
|
||||
..()
|
||||
reagents.add_reagent("inaprovaline", 5)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty
|
||||
filled = 0
|
||||
filled_reagents = list()
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/used
|
||||
used = 1
|
||||
filled_reagents = list()
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob)
|
||||
..()
|
||||
if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled.
|
||||
if(used) //Prevents autoinjectors to be refilled.
|
||||
flags &= ~OPENCONTAINER
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon()
|
||||
if(reagents.total_volume > 0)
|
||||
if(!used && reagents.reagent_list.len)
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
else
|
||||
else if(used)
|
||||
icon_state = "[initial(icon_state)]0"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]2"
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/examine(mob/user)
|
||||
..(user)
|
||||
if(reagents && reagents.reagent_list.len)
|
||||
user << "<span class='notice'>It is currently loaded.</span>"
|
||||
else
|
||||
else if(used)
|
||||
user << "<span class='notice'>It is spent.</span>"
|
||||
else
|
||||
user << "<span class='notice'>It is currently unloaded.</span>"
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting
|
||||
name = "clotting agent"
|
||||
desc = "A rapid and safe way to administer clotting drugs by untrained or trained personnel."
|
||||
icon_state = "autoinjector"
|
||||
item_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 10
|
||||
volume = 10
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at treating bleeding wounds and internal bleeding."
|
||||
filled_reagents = list("inaprovaline" = 5, "myelamine" = 10)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting/New()
|
||||
..()
|
||||
reagents.remove_reagent("inaprovaline", 5)
|
||||
reagents.add_reagent("myelamine", 10)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed
|
||||
name = "bone repair injector"
|
||||
desc = "A rapid and safe way to administer advanced drugs by untrained or trained personnel."
|
||||
icon_state = "autoinjector"
|
||||
item_state = "autoinjector"
|
||||
amount_per_transfer_from_this = 10
|
||||
volume = 10
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/New()
|
||||
..()
|
||||
reagents.remove_reagent("inaprovaline", 5)
|
||||
reagents.add_reagent("osteodaxon", 10)
|
||||
update_icon()
|
||||
return
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This one excels at treating damage to bones."
|
||||
filled_reagents = list("inaprovaline" = 5, "osteodaxon" = 10)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
/obj/item/projectile/spell_projectile/before_move()
|
||||
if(proj_trail && src && src.loc) //pretty trails
|
||||
var/obj/effect/overlay/trail = PoolOrNew(/obj/effect/overlay, src.loc)
|
||||
var/obj/effect/overlay/trail = new /obj/effect/overlay(src.loc)
|
||||
trails += trail
|
||||
trail.icon = proj_trail_icon
|
||||
trail.icon_state = proj_trail_icon_state
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
current_floor = next_floor
|
||||
control_panel_interior.visible_message("The elevator [moving_upwards ? "rises" : "descends"] smoothly.")
|
||||
|
||||
return 1
|
||||
return (next_floor.delay_time || move_delay || 30)
|
||||
|
||||
/datum/turbolift/proc/queue_move_to(var/datum/turbolift_floor/floor)
|
||||
if(!floor || !(floor in floors) || (floor in queued_floors))
|
||||
|
||||
@@ -9,3 +9,4 @@
|
||||
var/lift_floor_name = null
|
||||
var/lift_announce_str = "Ding!"
|
||||
var/arrival_sound = 'sound/machines/ding.ogg'
|
||||
var/delay_time
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
dat += "<a href='?src=\ref[src];emergency_stop=1'>Emergency Stop</a>"
|
||||
dat += "<hr></body></html>"
|
||||
|
||||
var/datum/browser/popup = new(user, "turbolift_panel", "Lift Panel", 230, 260)
|
||||
var/datum/browser/popup = new(user, "turbolift_panel", "Lift Panel", 250, 320)
|
||||
popup.set_content(jointext(dat, null))
|
||||
popup.open()
|
||||
return
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
var/name
|
||||
var/announce_str
|
||||
var/arrival_sound
|
||||
var/delay_time
|
||||
|
||||
var/list/doors = list()
|
||||
var/obj/structure/lift/button/ext_panel
|
||||
@@ -20,6 +21,7 @@
|
||||
name = A.lift_floor_name ? A.lift_floor_name : A.name
|
||||
announce_str = A.lift_announce_str
|
||||
arrival_sound = A.arrival_sound
|
||||
delay_time = A.delay_time
|
||||
|
||||
//called when a lift has queued this floor as a destination
|
||||
/datum/turbolift_floor/proc/pending_move(var/datum/turbolift/lift)
|
||||
|
||||
@@ -20,16 +20,17 @@ var/datum/controller/process/turbolift/turbolift_controller
|
||||
continue
|
||||
spawn(0)
|
||||
lift.busy = 1
|
||||
if(!lift.do_move())
|
||||
var/floor_delay
|
||||
if(!(floor_delay = lift.do_move()))
|
||||
moving_lifts[liftref] = null
|
||||
moving_lifts -= liftref
|
||||
if(lift.target_floor)
|
||||
lift.target_floor.ext_panel.reset()
|
||||
lift.target_floor = null
|
||||
else
|
||||
lift_is_moving(lift)
|
||||
lift_is_moving(lift,floor_delay)
|
||||
lift.busy = 0
|
||||
SCHECK
|
||||
|
||||
/datum/controller/process/turbolift/proc/lift_is_moving(var/datum/turbolift/lift)
|
||||
moving_lifts["\ref[lift]"] = world.time + lift.move_delay
|
||||
/datum/controller/process/turbolift/proc/lift_is_moving(var/datum/turbolift/lift,var/floor_delay)
|
||||
moving_lifts["\ref[lift]"] = world.time + floor_delay
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
/obj/vehicle/emp_act(severity)
|
||||
var/was_on = on
|
||||
stat |= EMPED
|
||||
var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc)
|
||||
var/obj/effect/overlay/pulse2 = new /obj/effect/overlay(src.loc)
|
||||
pulse2.icon = 'icons/effects/effects.dmi'
|
||||
pulse2.icon_state = "empdisable"
|
||||
pulse2.name = "emp sparks"
|
||||
@@ -192,8 +192,8 @@
|
||||
src.visible_message("\red <B>[src] blows apart!</B>", 1)
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
PoolOrNew(/obj/item/stack/rods, Tsec)
|
||||
PoolOrNew(/obj/item/stack/rods, Tsec)
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
new /obj/item/stack/rods(Tsec)
|
||||
new /obj/item/stack/cable_coil/cut(Tsec)
|
||||
|
||||
if(cell)
|
||||
|
||||
@@ -244,7 +244,7 @@
|
||||
apply_material_decorations = 0
|
||||
if(23)
|
||||
apply_prefix = 0
|
||||
new_item = PoolOrNew(/obj/item/stack/rods, src.loc)
|
||||
new_item = new /obj/item/stack/rods(src.loc)
|
||||
apply_image_decorations = 0
|
||||
apply_material_decorations = 0
|
||||
if(24)
|
||||
|
||||
@@ -6,6 +6,7 @@ Proc for metabolism
|
||||
Proc for mutating
|
||||
Procs for copying speech, if applicable
|
||||
Procs for targeting
|
||||
Divergence proc, used in mutation to make unique datums.
|
||||
*/
|
||||
/mob/living/simple_animal/xeno/proc/ProcessTraits()
|
||||
if(maleable >= MAX_MALEABLE)
|
||||
@@ -84,8 +85,14 @@ Procs for targeting
|
||||
return 1 //Everything worked out okay.
|
||||
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/xeno/proc/diverge()
|
||||
var/datum/xeno/traits/newtraits = new()
|
||||
newtraits.copy_traits(traitdat)
|
||||
return newtraits
|
||||
|
||||
/mob/living/simple_animal/xeno/proc/Mutate()
|
||||
traitdat = diverge()
|
||||
nameVar = "mutated"
|
||||
if((COLORMUT & mutable))
|
||||
traitdat.traits[TRAIT_XENO_COLOR] = "#"
|
||||
|
||||
Reference in New Issue
Block a user