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:
Leshana
2017-05-08 21:07:45 -04:00
211 changed files with 1840 additions and 1237 deletions
+5 -1
View File
@@ -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
+3 -2
View File
@@ -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
+42 -2
View File
@@ -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
*/
+59 -1
View File
@@ -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."
+157
View File
@@ -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 )
+73 -27
View File
@@ -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)
-43
View File
@@ -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
+15 -3
View File
@@ -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
+135
View File
@@ -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))
+1 -3
View File
@@ -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
+8 -3
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+9 -7
View File
@@ -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
+5
View File
@@ -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
+2 -2
View File
@@ -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
+1
View File
@@ -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.
+6
View File
@@ -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
+1 -1
View File
@@ -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
+28 -3
View File
@@ -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"
/*
///////////////////////////////////
/ =---------------------------= /
+1
View File
@@ -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)
+1 -1
View File
@@ -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))
+4 -4
View File
@@ -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)
+8
View File
@@ -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."
+2 -2
View File
@@ -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)
+12 -4
View File
@@ -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!"
+1 -1
View File
@@ -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"
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+5 -4
View File
@@ -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
+3 -3
View File
@@ -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)
+7
View File
@@ -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] = "#"