# Conflicts:
#	config/custom_items.txt
This commit is contained in:
Kelshark
2017-11-07 08:17:53 -05:00
148 changed files with 2032 additions and 626 deletions

View File

@@ -6,6 +6,7 @@
#define OXY "oxy"
#define CLONE "clone"
#define HALLOSS "halloss"
#define ELECTROCUTE "electrocute"
#define CUT "cut"
#define BRUISE "bruise"

View File

@@ -21,6 +21,48 @@
containertype = /obj/structure/closet/crate/engineering
containername = "Superconducting Magnetic Coil crate"
/datum/supply_packs/eng/shield_capacitor
name = "Shield Capacitor"
contains = list(/obj/machinery/shield_capacitor)
cost = 20
containertype = /obj/structure/closet/crate/engineering
containername = "shield capacitor crate"
/datum/supply_packs/eng/shield_capacitor/advanced
name = "Advanced Shield Capacitor"
contains = list(/obj/machinery/shield_capacitor/advanced)
cost = 30
containertype = /obj/structure/closet/crate/engineering
containername = "advanced shield capacitor crate"
/datum/supply_packs/eng/bubble_shield
name = "Bubble Shield Generator"
contains = list(/obj/machinery/shield_gen)
cost = 40
containertype = /obj/structure/closet/crate/engineering
containername = "shield bubble generator crate"
/datum/supply_packs/eng/bubble_shield/advanced
name = "Advanced Bubble Shield Generator"
contains = list(/obj/machinery/shield_gen/advanced)
cost = 60
containertype = /obj/structure/closet/crate/engineering
containername = "advanced bubble shield generator crate"
/datum/supply_packs/eng/hull_shield
name = "Hull Shield Generator"
contains = list(/obj/machinery/shield_gen/external)
cost = 80
containertype = /obj/structure/closet/crate/engineering
containername = "shield hull generator crate"
/datum/supply_packs/eng/hull_shield/advanced
name = "Advanced Hull Shield Generator"
contains = list(/obj/machinery/shield_gen/external/advanced)
cost = 120
containertype = /obj/structure/closet/crate/engineering
containername = "advanced hull shield generator crate"
/datum/supply_packs/eng/electrical
name = "Electrical maintenance crate"
contains = list(

View File

@@ -13,5 +13,5 @@ var/datum/antagonist/thug/thugs
Try to make sure other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \
and before taking extreme actions, please try to also contact the administration! \
Think through your actions and make the roleplay immersive! <b>Please remember all \
rules aside from those without explicit exceptions apply to antagonists.</b>"
rules aside from those with explicit exceptions apply to antagonists.</b>"
flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_RANDSPAWN | ANTAG_VOTABLE

View File

@@ -219,7 +219,11 @@ turf/proc/AdjacentTurfsRangedSting()
victims += C
var/mob/living/carbon/T = input(src, "Who will we sting?") as null|anything in victims
if(!T) return
if(!T)
return
if(T.isSynthetic())
src << "<span class='notice'>We are unable to pierce the outer shell of [T].</span>"
return
if(!(T in view(changeling.sting_range))) return
if(!sting_can_reach(T, changeling.sting_range)) return
if(!changeling_power(required_chems)) return

View File

@@ -135,3 +135,4 @@
name = "hand greatclaw"
force = 20
armor_penetration = 20
pry = 1

View File

@@ -123,7 +123,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
if(word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"])
return tearreality()
if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"])
return emp(src.loc,3)
return emp(src.loc,5)
if(word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"])
return drain()
if(word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"])

View File

@@ -56,31 +56,31 @@
if(shocked)
shock(user, 50)
var/dat = "<center><h1>Autolathe Control Panel</h1><hr/>"
var/list/dat = list()
dat += "<center><h1>Autolathe Control Panel</h1><hr/>"
if(!disabled)
dat += "<table width = '100%'>"
var/material_top = "<tr>"
var/material_bottom = "<tr>"
var/list/material_top = list("<tr>")
var/list/material_bottom = list("<tr>")
for(var/material in stored_material)
material_top += "<td width = '25%' align = center><b>[material]</b></td>"
material_bottom += "<td width = '25%' align = center>[stored_material[material]]<b>/[storage_capacity[material]]</b></td>"
dat += "[material_top]</tr>[material_bottom]</tr></table><hr>"
dat += "[material_top.Join()]</tr>[material_bottom.Join()]</tr></table><hr>"
dat += "<h2>Printable Designs</h2><h3>Showing: <a href='?src=\ref[src];change_category=1'>[current_category]</a>.</h3></center><table width = '100%'>"
for(var/datum/category_item/autolathe/R in current_category.items)
if(R.hidden && !hacked)
continue
var/can_make = 1
var/material_string = ""
var/multiplier_string = ""
var/list/material_string = list()
var/list/multiplier_string = list()
var/max_sheets
var/comma
if(!R.resources || !R.resources.len)
material_string = "No resources required.</td>"
material_string += "No resources required.</td>"
else
//Make sure it's buildable and list requires resources.
for(var/material in R.resources)
@@ -104,7 +104,7 @@
multiplier_string += "<a href='?src=\ref[src];make=\ref[R];multiplier=[i]'>\[x[i]\]</a>"
multiplier_string += "<a href='?src=\ref[src];make=\ref[R];multiplier=[max_sheets]'>\[x[max_sheets]\]</a>"
dat += "<tr><td width = 180>[R.hidden ? "<font color = 'red'>*</font>" : ""]<b>[can_make ? "<a href='?src=\ref[src];make=\ref[R];multiplier=1'>" : ""][R.name][can_make ? "</a>" : ""]</b>[R.hidden ? "<font color = 'red'>*</font>" : ""][multiplier_string]</td><td align = right>[material_string]</tr>"
dat += "<tr><td width = 180>[R.hidden ? "<font color = 'red'>*</font>" : ""]<b>[can_make ? "<a href='?src=\ref[src];make=\ref[R];multiplier=1'>" : ""][R.name][can_make ? "</a>" : ""]</b>[R.hidden ? "<font color = 'red'>*</font>" : ""][multiplier_string.Join()]</td><td align = right>[material_string.Join()]</tr>"
dat += "</table><hr>"
//Hacking.
@@ -114,7 +114,7 @@
dat += "<hr>"
user << browse(dat, "window=autolathe")
user << browse(dat.Join(), "window=autolathe")
onclose(user, "autolathe")
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)

View File

@@ -289,3 +289,27 @@
if(!usr.incapacitated())
return
go_in(usr)
/obj/machinery/recharge_station/ghost_pod_recharger
name = "drone pod"
desc = "This is a pod which used to contain a drone... Or maybe it still does?"
icon = 'icons/obj/structures.dmi'
/obj/machinery/recharge_station/ghost_pod_recharger/update_icon()
..()
if(stat & BROKEN)
icon_state = "borg_pod_closed"
desc = "It appears broken..."
return
if(occupant)
if((stat & NOPOWER) && !has_cell_power())
icon_state = "borg_pod_closed"
desc = "It appears to be unpowered..."
else
icon_state = "borg_pod_closed"
else
icon_state = "borg_pod_opened"
if(icon_update_tick == 0)
build_overlays()

View File

@@ -0,0 +1,222 @@
/obj/machinery/vr_sleeper
name = "VR sleeper"
desc = "A fancy bed with built-in sensory I/O ports and connectors to interface users' minds with their bodies in virtual reality."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "syndipod_0"
density = 1
anchored = 1
circuit = /obj/item/weapon/circuitboard/vr_sleeper
var/mob/living/carbon/human/occupant = null
var/mob/living/carbon/human/avatar = null
var/datum/mind/vr_mind = null
use_power = 1
idle_power_usage = 15
active_power_usage = 200
light_color = "#FF0000"
/obj/machinery/vr_sleeper/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/stack/material/glass/reinforced(src, 2)
RefreshParts()
/obj/machinery/vr_sleeper/initialize()
update_icon()
/obj/machinery/vr_sleeper/process()
if(stat & (NOPOWER|BROKEN))
return
/obj/machinery/vr_sleeper/update_icon()
icon_state = "syndipod_[occupant ? "1" : "0"]"
/obj/machinery/vr_sleeper/Topic(href, href_list)
if(..())
return 1
if(usr == occupant)
to_chat(usr, "<span class='warning'>You can't reach the controls from the inside.</span>")
return
add_fingerprint(usr)
if(href_list["eject"])
go_out()
return 1
/obj/machinery/vr_sleeper/attackby(var/obj/item/I, var/mob/user)
add_fingerprint(user)
if(default_deconstruction_screwdriver(user, I))
return
else if(default_deconstruction_crowbar(user, I))
return
/obj/machinery/vr_sleeper/MouseDrop_T(var/mob/target, var/mob/user)
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !isliving(target))
return
go_in(target, user)
/obj/machinery/sleeper/relaymove(var/mob/user)
..()
if(usr.incapacitated())
return
go_out()
/obj/machinery/vr_sleeper/emp_act(var/severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
return
if(occupant)
// This will eject the user from VR
// ### Fry the brain?
go_out()
..(severity)
/obj/machinery/vr_sleeper/verb/eject()
set src in oview(1)
set category = "Object"
set name = "Eject VR Capsule"
if(usr.incapacitated())
return
if(usr != occupant && avatar && alert(avatar, "Someone wants to remove you from virtual reality. Do you want to leave?", "Leave VR?", "Yes", "No") == "No")
return
// The player in VR is fine with leaving, kick them out and reset avatar
avatar.exit_vr()
avatar = null
go_out()
add_fingerprint(usr)
/obj/machinery/vr_sleeper/verb/climb_in()
set src in oview(1)
set category = "Object"
set name = "Enter VR Capsule"
if(usr.incapacitated())
return
go_in(usr, usr)
add_fingerprint(usr)
/obj/machinery/vr_sleeper/relaymove(mob/user as mob)
if(user.incapacitated())
return 0 //maybe they should be able to get out with cuffs, but whatever
go_out()
/obj/machinery/vr_sleeper/proc/go_in(var/mob/M, var/mob/user)
if(!M)
return
if(stat & (BROKEN|NOPOWER))
return
if(!ishuman(M))
user << "<span class='warning'>\The [src] rejects [M] with a sharp beep.</span>"
if(occupant)
user << "<span class='warning'>\The [src] is already occupied.</span>"
return
if(M == user)
visible_message("\The [user] starts climbing into \the [src].")
else
visible_message("\The [user] starts putting [M] into \the [src].")
if(do_after(user, 20))
if(occupant)
to_chat(user, "<span class='warning'>\The [src] is already occupied.</span>")
return
M.stop_pulling()
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
M.loc = src
update_use_power(2)
occupant = M
update_icon()
enter_vr()
return
/obj/machinery/vr_sleeper/proc/go_out()
if(!occupant)
return
if(occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
occupant.loc = src.loc
occupant = null
for(var/atom/movable/A in src) // In case an object was dropped inside or something
if(A == circuit)
continue
if(A in component_parts)
continue
A.loc = src.loc
update_use_power(1)
update_icon()
/obj/machinery/vr_sleeper/proc/enter_vr()
// No mob to transfer a mind from
if(!occupant)
return
// No mind to transfer
if(!occupant.mind)
return
// Mob doesn't have an active consciousness to send/receive from
if(occupant.stat != CONSCIOUS)
return
avatar = occupant.vr_link
// If they've already enterred VR, and are reconnecting, prompt if they want a new body
if(avatar && alert(occupant, "You already have a Virtual Reality avatar. Would you like to use it?", "New avatar", "Yes", "No") == "No")
// Delink the mob
occupant.vr_link = null
avatar = null
if(!avatar)
// Get the desired spawn location to put the body
var/S = null
var/list/vr_landmarks = list()
for(var/obj/effect/landmark/virtual_reality/sloc in landmarks_list)
vr_landmarks += sloc.name
S = input(occupant, "Please select a location to spawn your avatar at:", "Spawn location") as null|anything in vr_landmarks
if(!S)
return 0
for(var/obj/effect/landmark/virtual_reality/i in landmarks_list)
if(i.name == S)
S = i
break
avatar = new(S, "Virtual Reality Avatar")
// If the user has a non-default (Human) bodyshape, make it match theirs.
if(occupant.species.name != "Promethean" && occupant.species.name != "Human")
avatar.shapeshifter_change_shape(occupant.species.name)
avatar.forceMove(get_turf(S)) // Put the mob on the landmark, instead of inside it
avatar.Sleeping(1)
occupant.enter_vr(avatar)
// Prompt for username after they've enterred the body.
var/newname = sanitize(input(avatar, "You are enterring virtual reality. Your username is currently [src.name]. Would you like to change it to something else?", "Name change") as null|text, MAX_NAME_LEN)
if (newname)
avatar.real_name = newname
else
occupant.enter_vr(avatar)

View File

@@ -107,6 +107,18 @@
return 1
/obj/effect/landmark/virtual_reality
name = "virtual_reality"
icon = 'icons/mob/screen1.dmi'
icon_state = "x"
anchored = 1.0
/obj/effect/landmark/virtual_reality/New()
..()
tag = "virtual_reality*[name]"
invisibility = 101
return 1
//Costume spawner landmarks
/obj/effect/landmark/costume/New() //costume spawner, selects a random subclass and disappears

View File

@@ -80,6 +80,7 @@
var/list/sprite_sheets_obj = list()
var/toolspeed = 1.0 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast.
var/addblends // Icon overlay for ADD highlights when applicable.
/obj/item/New()
..()

View File

@@ -8,7 +8,7 @@
var/spamcheck = 0
var/emagged = 0
var/insults = 0
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!")
var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TERRORIST!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "GLORY TO ALMACH!")
/obj/item/device/megaphone/attack_self(mob/living/user as mob)
if (user.client)

View File

@@ -699,54 +699,6 @@
desc = "A \"Space Life\" brand Emergency Response Team Commander action figure."
icon_state = "ert"
/obj/item/toy/therapy_red
name = "red therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is red."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyred"
item_state = "egg4" // It's the red egg in items_left/righthand
w_class = ITEMSIZE_TINY
/obj/item/toy/therapy_purple
name = "purple therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is purple."
icon = 'icons/obj/toy.dmi'
icon_state = "therapypurple"
item_state = "egg1" // It's the magenta egg in items_left/righthand
w_class = ITEMSIZE_TINY
/obj/item/toy/therapy_blue
name = "blue therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is blue."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyblue"
item_state = "egg2" // It's the blue egg in items_left/righthand
w_class = ITEMSIZE_TINY
/obj/item/toy/therapy_yellow
name = "yellow therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is yellow."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyyellow"
item_state = "egg5" // It's the yellow egg in items_left/righthand
w_class = ITEMSIZE_TINY
/obj/item/toy/therapy_orange
name = "orange therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is orange."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyorange"
item_state = "egg4" // It's the red one again, lacking an orange item_state and making a new one is pointless
w_class = ITEMSIZE_TINY
/obj/item/toy/therapy_green
name = "green therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is green."
icon = 'icons/obj/toy.dmi'
icon_state = "therapygreen"
item_state = "egg3" // It's the green egg in items_left/righthand
w_class = ITEMSIZE_TINY
/*
* Plushies
*/
@@ -800,9 +752,10 @@
//Small plushies.
/obj/item/toy/plushie
name = "generic small plush"
desc = "A very generic small plushie. It seems to not want to exist."
desc = "A small toy plushie. It's very cute."
icon = 'icons/obj/toy.dmi'
icon_state = "nymphplushie"
w_class = ITEMSIZE_TINY
var/last_message = 0
/obj/item/toy/plushie/attack_self(mob/user as mob)
@@ -815,9 +768,24 @@
else if (user.a_intent == I_GRAB)
user.visible_message("<span class='warning'><b>\The [user]</b> attempts to strangle [src]!</span>","<span class='warning'>You attempt to strangle [src]!</span>")
else
user.visible_message("<span class='notice'><b>\The [user]</b> pokes the [src].</span>","<span class='notice'>You poke the [src].</span>")
user.visible_message("<span class='notice'><b>\The [user]</b> pokes [src].</span>","<span class='notice'>You poke [src].</span>")
last_message = world.time
obj/item/toy/plushie/verb/rename_plushie()
set name = "Name Plushie"
set category = "Object"
set desc = "Give your plushie a cute name!"
w_class = ITEMSIZE_TINY
var/mob/M = usr
if(!M.mind) return 0
var/input = sanitizeSafe(input("What do you want to name the plushie?", ,""), MAX_NAME_LEN)
if(src && input && !M.stat && in_range(M,src))
name = input
to_chat(M, "You name the plushie [input], giving it a hug for good luck.")
return 1
/obj/item/toy/plushie/nymph
name = "diona nymph plush"
desc = "A plushie of an adorable diona nymph! While its level of self-awareness is still being debated, its level of cuteness is not."
@@ -830,7 +798,7 @@
/obj/item/toy/plushie/kitten
name = "kitten plush"
desc = "A plushie of a cute kitten! Watch as it purrs it's way right into your heart."
desc = "A plushie of a cute kitten! Watch as it purrs its way right into your heart."
icon_state = "kittenplushie"
/obj/item/toy/plushie/lizard
@@ -848,6 +816,49 @@
desc = "A farwa plush doll. It's soft and comforting!"
icon_state = "farwaplushie"
/obj/item/toy/plushie/therapy/red
name = "red therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is red."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyred"
item_state = "egg4" // It's the red egg in items_left/righthand
/obj/item/toy/plushie/therapy/purple
name = "purple therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is purple."
icon = 'icons/obj/toy.dmi'
icon_state = "therapypurple"
item_state = "egg1" // It's the magenta egg in items_left/righthand
/obj/item/toy/plushie/therapy/blue
name = "blue therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is blue."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyblue"
item_state = "egg2" // It's the blue egg in items_left/righthand
/obj/item/toy/plushie/therapy/yellow
name = "yellow therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is yellow."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyyellow"
item_state = "egg5" // It's the yellow egg in items_left/righthand
/obj/item/toy/plushie/therapy/orange
name = "orange therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is orange."
icon = 'icons/obj/toy.dmi'
icon_state = "therapyorange"
item_state = "egg4" // It's the red one again, lacking an orange item_state and making a new one is pointless
/obj/item/toy/plushie/therapy/green
name = "green therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is green."
icon = 'icons/obj/toy.dmi'
icon_state = "therapygreen"
item_state = "egg3" // It's the green egg in items_left/righthand
//Toy cult sword
/obj/item/toy/cultsword
name = "foam sword"

View File

@@ -202,6 +202,15 @@
/obj/item/weapon/reagent_containers/syringe = 3,
/obj/item/stack/material/glass/reinforced = 2)
/obj/item/weapon/circuitboard/vr_sleeper
name = T_BOARD("VR sleeper")
build_path = /obj/machinery/vr_sleeper
board_type = new /datum/frame/frame_types/medical_pod
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
req_components = list(
/obj/item/weapon/stock_parts/scanning_module = 1,
/obj/item/stack/material/glass/reinforced = 2)
/obj/item/weapon/circuitboard/dna_analyzer
name = T_BOARD("dna analyzer")
build_path = /obj/machinery/dnaforensics

View File

@@ -373,8 +373,8 @@
job_access_type = /datum/job/bartender
/obj/item/weapon/card/id/civilian/botanist
assignment = "Gardener"
rank = "Gardener"
assignment = "Botanist"
rank = "Botanist"
job_access_type = /datum/job/hydro
/obj/item/weapon/card/id/civilian/chaplain

View File

@@ -2,8 +2,8 @@
name = "reagent generator implant"
desc = "This is an implant that has attached storage and generates a reagent."
implant_color = "r"
var/datum/reagent/generated_reagent = null
var/gen_amount = 2 //amount of reagent generated per process tick
var/list/generated_reagents = list("water" = 2) //Any number of reagents, the associated value is how many units are generated per process()
var/reagent_name = "water" //What is shown when reagents are removed, doesn't need to be an actual reagent
var/gen_cost = 0.5 //amount of nutrient taken from the host per process tick
var/transfer_amount = 30 //amount transferred when using verb
var/usable_volume = 120
@@ -15,7 +15,7 @@
var/list/random_emote = list() //An emote the person with the implant may be forced to perform after a prob check, such as [X] meows.
var/assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant
var/verb_name = "Transfer From Reagent Implant"
var/verb_desc = "Remove reagents from am internal reagent into a container"
var/verb_desc = "Remove reagents from an internal reagent into a container"
/obj/item/weapon/implant/reagent_generator/New()
..()
@@ -38,7 +38,7 @@
/obj/item/weapon/implant/reagent_generator/process()
var/before_gen
if(imp_in && generated_reagent)
if(imp_in && generated_reagents)
before_gen = reagents.total_volume
if(reagents.total_volume < reagents.maximum_volume)
if(imp_in.nutrition >= gen_cost)
@@ -57,7 +57,8 @@
/obj/item/weapon/implant/reagent_generator/proc/do_generation()
imp_in.nutrition -= gen_cost
reagents.add_reagent(generated_reagent, gen_amount)
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent])
/mob/living/carbon/human/proc/use_reagent_implant()
set name = "Transfer From Reagent Implant"
@@ -90,7 +91,7 @@
var/container_name = container.name
if(rimplant.reagents.trans_to(container, amount = rimplant.transfer_amount))
user.visible_message("<span class='notice'>[usr] [pick(rimplant.emote_descriptor)] into \the [container_name].</span>",
"<span class='notice'>You [pick(rimplant.self_emote_descriptor)] some [rimplant.generated_reagent] into \the [container_name].</span>")
"<span class='notice'>You [pick(rimplant.self_emote_descriptor)] some [rimplant.reagent_name] into \the [container_name].</span>")
if(prob(5))
src.visible_message("<span class='notice'>[src] [pick(rimplant.random_emote)].</span>") // M-mlem.
if(rimplant.reagents.total_volume == rimplant.reagents.maximum_volume * 0.05)

View File

@@ -655,6 +655,61 @@
nextrefueltick = world.time + 10
reagents.add_reagent("fuel", 1)
/*
* Backpack Welder.
*/
/obj/item/weapon/weldingtool/tubefed
name = "tube-fed welding tool"
desc = "A bulky, cooler-burning welding tool that draws from a worn welding tank."
icon_state = "tubewelder"
max_fuel = 10
w_class = ITEMSIZE_NO_CONTAINER
matter = null
toolspeed = 1.25
change_icons = 0
flame_intensity = 1
eye_safety_modifier = 1
always_process = TRUE
var/obj/item/weapon/weldpack/mounted_pack = null
/obj/item/weapon/weldingtool/tubefed/New(location)
..()
if(istype(location, /obj/item/weapon/weldpack))
var/obj/item/weapon/weldpack/holder = location
mounted_pack = holder
else
qdel(src)
/obj/item/weapon/weldingtool/tubefed/Destroy()
mounted_pack.nozzle = null
mounted_pack = null
return ..()
/obj/item/weapon/weldingtool/tubefed/process()
if(mounted_pack)
if(!istype(mounted_pack.loc,/mob/living/carbon/human))
mounted_pack.return_nozzle()
else
var/mob/living/carbon/human/H = mounted_pack.loc
if(H.back != mounted_pack)
mounted_pack.return_nozzle()
if(mounted_pack.loc != src.loc && src.loc != mounted_pack)
mounted_pack.return_nozzle()
visible_message("<span class='notice'>\The [src] retracts to its fueltank.</span>")
if(get_fuel() <= get_max_fuel())
mounted_pack.reagents.trans_to_obj(src, 1)
..()
/obj/item/weapon/weldingtool/tubefed/dropped(mob/user)
..()
if(src.loc != user)
mounted_pack.return_nozzle()
to_chat(user, "<span class='notice'>\The [src] retracts to its fueltank.</span>")
/*
* Electric/Arc Welder
*/

View File

@@ -6,46 +6,140 @@
icon_state = "welderpack"
w_class = ITEMSIZE_LARGE
var/max_fuel = 350
var/obj/item/weapon/nozzle = null //Attached welder, or other spray device.
var/nozzle_attached = 0
/obj/item/weapon/weldpack/New()
var/datum/reagents/R = new/datum/reagents(max_fuel) //Lotsa refills
reagents = R
R.my_atom = src
R.add_reagent("fuel", max_fuel)
nozzle = new/obj/item/weapon/weldingtool/tubefed(src)
nozzle_attached = 1
/obj/item/weapon/weldpack/Destroy()
qdel(nozzle)
nozzle = null
return ..()
/obj/item/weapon/weldpack/dropped(mob/user)
..()
if(nozzle)
user.remove_from_mob(nozzle)
return_nozzle()
to_chat(user, "<span class='notice'>\The [nozzle] retracts to its fueltank.</span>")
/obj/item/weapon/weldpack/proc/get_nozzle(var/mob/living/user)
if(!ishuman(user))
return 0
var/mob/living/carbon/human/H = user
if(H.hands_are_full()) //Make sure our hands aren't full.
to_chat(H, "<span class='warning'>Your hands are full. Drop something first.</span>")
return 0
var/obj/item/weapon/F = nozzle
H.put_in_hands(F)
nozzle_attached = 0
return 1
/obj/item/weapon/weldpack/proc/return_nozzle(var/mob/living/user)
nozzle.forceMove(src)
nozzle_attached = 1
/obj/item/weapon/weldpack/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/weldingtool))
if(istype(W, /obj/item/weapon/weldingtool) && !(W == nozzle))
var/obj/item/weapon/weldingtool/T = W
if(T.welding & prob(50))
message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
log_game("[key_name(user)] triggered a fueltank explosion.")
user << "<span class='danger'>That was stupid of you.</span>"
to_chat(user,"<span class='danger'>That was stupid of you.</span>")
explosion(get_turf(src),-1,0,2)
if(src)
qdel(src)
return
else
else if(T.status)
if(T.welding)
user << "<span class='danger'>That was close!</span>"
to_chat(user,"<span class='danger'>That was close!</span>")
src.reagents.trans_to_obj(W, T.max_fuel)
user << "<span class='notice'>Welder refilled!</span>"
to_chat(user, "<span class='notice'>Welder refilled!</span>")
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
user << "<span class='warning'>The tank scoffs at your insolence. It only provides services to welders.</span>"
else if(nozzle)
if(nozzle == W)
if(!user.unEquip(W))
to_chat(user,"<span class='notice'>\The [W] seems to be stuck to your hand.</span>")
return
if(!nozzle_attached)
return_nozzle()
to_chat(user,"<span class='notice'>You attach \the [W] to the [src].</span>")
return
else
to_chat(user,"<span class='notice'>The [src] already has a nozzle!</span>")
else
to_chat(user,"<span class='warning'>The tank scoffs at your insolence. It only provides services to welders.</span>")
return
/obj/item/weapon/weldpack/attack_hand(mob/user as mob)
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/wearer = user
if(wearer.back == src)
if(nozzle && nozzle_attached)
if(!wearer.incapacitated())
get_nozzle(user)
else
to_chat(user,"<span class='notice'>\The [src] does not have a nozzle attached!</span>")
else
..()
else
..()
/obj/item/weapon/weldpack/afterattack(obj/O as obj, mob/user as mob, proximity)
if(!proximity) // this replaces and improves the get_dist(src,O) <= 1 checks used previously
return
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume < max_fuel)
O.reagents.trans_to_obj(src, max_fuel)
user << "<span class='notice'>You crack the cap off the top of the pack and fill it back up again from the tank.</span>"
to_chat(user,"<span class='notice'>You crack the cap off the top of the pack and fill it back up again from the tank.</span>")
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume == max_fuel)
user << "<span class='warning'>The pack is already full!</span>"
to_chat(user,"<span class='warning'>The pack is already full!</span>")
return
/obj/item/weapon/weldpack/MouseDrop(obj/over_object as obj) //This is terrifying.
if(!canremove)
return
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
return
if (!( istype(over_object, /obj/screen) ))
return ..()
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this.
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
return
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
return
switch(over_object.name)
if("r_hand")
usr.u_equip(src)
usr.put_in_r_hand(src)
if("l_hand")
usr.u_equip(src)
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/weapon/weldpack/examine(mob/user)
..(user)
user << text("\icon[] [] units of fuel left!", src, src.reagents.total_volume)

View File

@@ -518,12 +518,12 @@
/obj/random/toy/item_to_spawn()
return pick(/obj/item/toy/bosunwhistle,
/obj/item/toy/therapy_red,
/obj/item/toy/therapy_purple,
/obj/item/toy/therapy_blue,
/obj/item/toy/therapy_yellow,
/obj/item/toy/therapy_orange,
/obj/item/toy/therapy_green,
/obj/item/toy/plushie/therapy/red,
/obj/item/toy/plushie/therapy/purple,
/obj/item/toy/plushie/therapy/blue,
/obj/item/toy/plushie/therapy/yellow,
/obj/item/toy/plushie/therapy/orange,
/obj/item/toy/plushie/therapy/green,
/obj/item/toy/cultsword,
/obj/item/toy/katana,
/obj/item/toy/snappop,

View File

@@ -258,8 +258,8 @@
new /obj/item/device/tape/random(src)
new /obj/item/device/tape/random(src)
new /obj/item/device/camera(src)
new /obj/item/toy/therapy_blue(src)
new /obj/item/weapon/storage/fancy/vials(src) //VOREStation Edit - adding vials for new hypo
new /obj/item/toy/plushie/therapy/blue(src)
return
/obj/structure/closet/secure_closet/psych

View File

@@ -22,6 +22,8 @@
if(winner.len)
var/mob/observer/dead/D = winner[1]
create_occupant(D)
new /obj/machinery/recharge_station/ghost_pod_recharger(src.loc)
del(src)
return TRUE
else
return FALSE
@@ -29,7 +31,6 @@
// Override this to create whatever mob you need. Be sure to call ..() if you don't want it to make infinite mobs.
/obj/structure/ghost_pod/proc/create_occupant(var/mob/M)
used = TRUE
icon_state = icon_state_opened
return TRUE

View File

@@ -20,7 +20,7 @@
var/material/material
var/material/padding_material
var/base_icon = "bed"
var/applies_material_colour = 1 //VOREStation Add - For special color beds/chairs
var/applies_material_colour = 1
/obj/structure/bed/New(var/newloc, var/new_material, var/new_padding_material)
..(newloc)
@@ -47,6 +47,7 @@
var/cache_key = "[base_icon]-[material.name]"
if(isnull(stool_cache[cache_key]))
var/image/I = image(icon, base_icon) //VOREStation Edit
//var/image/I = image('icons/obj/furniture.dmi', base_icon) //From Polaris Sync. Not sure if this is a better way of doing it or not. Uncomment if so.
if(applies_material_colour) //VOREStation Add - Goes with added var
I.color = material.icon_colour
stool_cache[cache_key] = I

View File

@@ -83,7 +83,6 @@
src.set_dir(turn(src.dir, 90))
return
//VOREStation Add - Shuttle Chair
/obj/structure/bed/chair/shuttle
name = "chair"
desc = "You sit in this. Either by will or force."
@@ -91,7 +90,7 @@
color = null
base_icon = "shuttle_chair"
applies_material_colour = 0
//VOREStation Add End
// Leaving this in for the sake of compilation.
/obj/structure/bed/chair/comfy
desc = "It's a chair. It looks comfy."

View File

@@ -91,16 +91,13 @@
playsound(src, "shatter", 70, 1)
if(display_message)
visible_message("[src] shatters!")
if(dir == SOUTHWEST)
var/index = null
index = 0
while(index < 2)
new shardtype(loc)
if(reinf)
new /obj/item/stack/rods(loc)
if(is_fulltile())
new shardtype(loc) //todo pooling?
if(reinf) new /obj/item/stack/rods(loc)
index++
else
new shardtype(loc) //todo pooling?
if(reinf) new /obj/item/stack/rods(loc)
if(reinf)
new /obj/item/stack/rods(loc)
qdel(src)
return
@@ -290,11 +287,9 @@
else
playsound(src, W.usesound, 75, 1)
visible_message("<span class='notice'>[user] dismantles \the [src].</span>")
if(dir == SOUTHWEST)
var/obj/item/stack/material/mats = new glasstype(loc)
mats.amount = is_fulltile() ? 4 : 2
else
new glasstype(loc)
if(is_fulltile())
mats.amount = 4
qdel(src)
else if(istype(W,/obj/item/frame) && anchored)
var/obj/item/frame/F = W
@@ -329,6 +324,9 @@
if(usr.incapacitated())
return 0
if(is_fulltile())
return 0
if(anchored)
usr << "It is fastened to the floor therefore you can't rotate it!"
return 0
@@ -348,6 +346,9 @@
if(usr.incapacitated())
return 0
if(is_fulltile())
return 0
if(anchored)
usr << "It is fastened to the floor therefore you can't rotate it!"
return 0
@@ -361,13 +362,16 @@
/obj/structure/window/New(Loc, start_dir=null, constructed=0)
..()
if (start_dir)
set_dir(start_dir)
//player-constructed windows
if (constructed)
anchored = 0
state = 0
update_verbs()
if (start_dir)
set_dir(start_dir)
if(is_fulltile())
maxhealth *= 2
health = maxhealth
@@ -406,10 +410,10 @@
//Updates the availabiliy of the rotation verbs
/obj/structure/window/proc/update_verbs()
if(anchored)
if(anchored || is_fulltile())
verbs -= /obj/structure/window/proc/rotate
verbs -= /obj/structure/window/proc/revrotate
else
else if(!is_fulltile())
verbs += /obj/structure/window/proc/rotate
verbs += /obj/structure/window/proc/revrotate
@@ -507,14 +511,6 @@
glasstype = /obj/item/stack/material/glass/reinforced
force_threshold = 6
/obj/structure/window/New(Loc, constructed=0)
..()
//player-constructed windows
if (constructed)
state = 0
/obj/structure/window/reinforced/full
dir = SOUTHWEST
icon_state = "fwindow"

View File

@@ -4,6 +4,7 @@
to_chat(M, "<span class='warning'>You just [pick("ran", "slammed")] into \the [src]!</span>")
M.apply_damage(5, BRUTE)
M.Weaken(2)
M.stop_flying()
/obj/structure/table/stumble_into(mob/living/M)
var/obj/occupied = turf_is_crowded()
@@ -17,6 +18,7 @@
M.apply_damage(5, BRUTE)
M.Weaken(2)
M.forceMove(get_turf(src))
M.stop_flying()
/obj/machinery/disposal/stumble_into(mob/living/M)
playsound(get_turf(src), 'sound/effects/clang.ogg', 25, 1, -1)
@@ -27,18 +29,21 @@
M.apply_damage(5, BRUTE)
M.Weaken(2)
M.forceMove(src)
M.stop_flying()
update()
/obj/structure/inflatable/stumble_into(mob/living/M)
playsound(get_turf(M), "sound/effects/Glasshit.ogg", 25, 1, -1)
visible_message("<span class='warning'>[M] [pick("ran", "slammed")] into \the [src]!</span>")
M.Weaken(1)
M.stop_flying()
/obj/structure/kitchenspike/stumble_into(mob/living/M)
playsound(get_turf(M), "sound/weapons/pierce.ogg", 25, 1, -1)
visible_message("<span class='warning'>[M] [pick("ran", "slammed")] into the spikes on \the [src]!</span>")
M.apply_damage(15, BRUTE, sharp=1)
M.Weaken(5)
M.stop_flying()
/obj/structure/m_tray/stumble_into(mob/living/M)
playsound(get_turf(src), 'sound/weapons/tablehit1.ogg', 25, 1, -1)
@@ -46,6 +51,7 @@
M.apply_damage(5, BRUTE)
M.Weaken(2)
M.forceMove(get_turf(src))
M.stop_flying()
/obj/structure/c_tray/stumble_into(mob/living/M)
playsound(get_turf(src), 'sound/weapons/tablehit1.ogg', 25, 1, -1)
@@ -53,12 +59,14 @@
M.apply_damage(5, BRUTE)
M.Weaken(2)
M.forceMove(get_turf(src))
M.stop_flying()
/obj/structure/window/stumble_into(mob/living/M)
visible_message("<span class='warning'>[M] [pick("ran", "slammed")] into \the [src]!</span>")
M.apply_damage(5, BRUTE)
M.Weaken(2)
hitby(M)
M.stop_flying()
/obj/structure/railing/stumble_into(mob/living/M)
var/obj/occupied = turf_is_crowded()
@@ -67,6 +75,7 @@
playsound(get_turf(src), 'sound/misc/slip.ogg', 25, 1, -1)
visible_message("<span class='warning'>[M] [pick("tripped", "stumbled")] over \the [src]!</span>")
M.Weaken(2)
M.stop_flying()
if(get_turf(M) == get_turf(src))
M.forceMove(get_step(src, src.dir))
else
@@ -81,6 +90,7 @@
M.apply_damage(15, BURN)
M.Weaken(5)
M.emote("scream")
M.stop_flying()
/obj/machinery/atmospherics/unary/cryo_cell/stumble_into(mob/living/M)
if((stat & (NOPOWER|BROKEN)) || !istype(M, /mob/living/carbon) || occupant || M.abiotic() || !node)
@@ -90,6 +100,7 @@
M.apply_damage(5, BRUTE)
M.Weaken(2)
put_mob(M)
M.stop_flying()
/obj/machinery/porta_turret/stumble_into(mob/living/M)
..()
@@ -119,6 +130,7 @@
update_icon()
add_fingerprint(M)
updateUsrDialog()
M.stop_flying()
/obj/machinery/vending/stumble_into(mob/living/M)
..()

View File

@@ -145,6 +145,9 @@ var/const/enterloopsanity = 100
M.lastarea = get_area(M.loc)
if(M.lastarea.has_gravity == 0)
inertial_drift(M)
if(M.flying) //VORESTATION Edit Start. This overwrites the above is_space without touching it all that much.
inertial_drift(M)
M.make_floating(1) //VOREStation Edit End.
else if(!is_space())
M.inertia_dir = 0
M.make_floating(0)

View File

@@ -104,7 +104,7 @@
// Note that the current station being used will be pruned from this list upon being instantiated
destination_names = list(
"NSS Exodus in Nyx",
"NCS Northern Star in Vir",
//"NCS Northern Star in Vir",
"NLS Southern Cross in Vir",
"NAS Vir Central Command",
"a dockyard orbiting Sif",

View File

@@ -3,6 +3,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
/datum/preferences
var/equip_preview_mob = EQUIP_PREVIEW_ALL
var/icon/bgstate = "000"
var/list/bgstate_options = list("000", "fff", "steel", "white")
/datum/category_item/player_setup_item/general/body
name = "Body"
sort_order = 3
@@ -34,6 +37,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_green"] >> pref.g_synth
S["synth_blue"] >> pref.b_synth
pref.preview_icon = null
S["bgstate"] >> pref.bgstate
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
S["species"] << pref.species
@@ -61,6 +65,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_red"] << pref.r_synth
S["synth_green"] << pref.g_synth
S["synth_blue"] << pref.b_synth
S["bgstate"] << pref.bgstate
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
if(!pref.species || !(pref.species in playable_species))
@@ -87,6 +92,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(!pref.rlimb_data) pref.rlimb_data = list()
if(!pref.body_markings) pref.body_markings = list()
else pref.body_markings &= body_marking_styles_list
if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options))
pref.bgstate = "000"
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character)
@@ -268,6 +275,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "</td><td><b>Preview</b><br>"
. += "<div class='statusDisplay'><center><img src=previewicon.png width=[pref.preview_icon.Width()] height=[pref.preview_icon.Height()]></center></div>"
. += "<br><a href='?src=\ref[src];cycle_bg=1'>Cycle background</a>"
. += "<br><a href='?src=\ref[src];toggle_preview_value=[EQUIP_PREVIEW_LOADOUT]'>[pref.equip_preview_mob & EQUIP_PREVIEW_LOADOUT ? "Hide loadout" : "Show loadout"]</a>"
. += "<br><a href='?src=\ref[src];toggle_preview_value=[EQUIP_PREVIEW_JOB]'>[pref.equip_preview_mob & EQUIP_PREVIEW_JOB ? "Hide job gear" : "Show job gear"]</a>"
. += "</td></tr></table>"
@@ -701,6 +709,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_synth = hex2num(copytext(new_color, 6, 8))
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["cycle_bg"])
pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options)
return TOPIC_REFRESH_UPDATE_PREVIEW
return ..()
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()

View File

@@ -34,6 +34,18 @@
display_name = "Spaceball booster pack"
path = /obj/item/weapon/pack/spaceball
/datum/gear/plushie
display_name = "plushie selection"
path = /obj/item/toy/plushie/
/datum/gear/plushie/New()
..()
var/list/plushies = list()
for(var/plushie in subtypesof(/obj/item/toy/plushie/) - /obj/item/toy/plushie/therapy)
var/obj/item/toy/plushie/plushie_type = plushie
plushies[initial(plushie_type.name)] = plushie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(plushies))
/datum/gear/flask
display_name = "flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask

View File

@@ -154,34 +154,10 @@
path = /obj/item/clothing/head/fedora/grey
/datum/gear/head/hairflower
display_name = "hair flower pin, red"
path = /obj/item/clothing/head/hairflower
/datum/gear/head/hairflower/yellow
display_name = "hair flower pin, yellow"
path = /obj/item/clothing/head/hairflower/yellow
/datum/gear/head/hairflower/pink
display_name = "hair flower pin, pink"
path = /obj/item/clothing/head/hairflower/pink
/datum/gear/head/hairflower/blue
display_name = "hair flower pin, blue"
path = /obj/item/clothing/head/hairflower/blue
/datum/gear/head/hairflower/violet
display_name = "hair flower pin, violet"
path = /obj/item/clothing/head/hairflower/violet
/datum/gear/head/hairflower/orange
display_name = "hair flower pin, orange"
path = /obj/item/clothing/head/hairflower/orange
/datum/gear/head/hairflower/white
display_name = "hair flower pin"
path = /obj/item/clothing/head/hairflower/white
/datum/gear/head/hairflower/white/New()
/datum/gear/head/hairflower/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)

View File

@@ -73,10 +73,6 @@
display_name = "shoes, yellow"
path = /obj/item/clothing/shoes/yellow
/datum/gear/shoes/flats
display_name = "flats, black"
path = /obj/item/clothing/shoes/flats
/datum/gear/shoes/hitops/
display_name = "high-top, white"
path = /obj/item/clothing/shoes/hitops/
@@ -109,30 +105,6 @@
display_name = "high-top, yellow"
path = /obj/item/clothing/shoes/hitops/yellow
/datum/gear/shoes/flats/blue
display_name = "flats, blue"
path = /obj/item/clothing/shoes/flats/blue
/datum/gear/shoes/flats/brown
display_name = "flats, brown"
path = /obj/item/clothing/shoes/flats/brown
/datum/gear/shoes/flats/orange
display_name = "flats, orange"
path = /obj/item/clothing/shoes/flats/orange
/datum/gear/shoes/flats/purple
display_name = "flats, purple"
path = /obj/item/clothing/shoes/flats/purple
/datum/gear/shoes/flats/red
display_name = "flats, red"
path = /obj/item/clothing/shoes/flats/red
/datum/gear/shoes/flats/white
display_name = "flats, white"
path = /obj/item/clothing/shoes/flats/white
/datum/gear/shoes/flipflops
display_name = "flip flops"
path = /obj/item/clothing/shoes/flipflop
@@ -157,11 +129,11 @@
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/shoes/flats/color
/datum/gear/shoes/flats
display_name = "flats"
path = /obj/item/clothing/shoes/flats/white/color
/datum/gear/shoes/flats/color/New()
/datum/gear/shoes/flats/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)

View File

@@ -6,19 +6,22 @@
dress_preview_mob(mannequin)
var/icon/bgstate = pick("000", "FFF", "steel", "white", "plating", "reinforced")
preview_icon = icon('icons/effects/128x48_vr.dmi', bgstate)
preview_icon.Scale(64+64, 16+32)
preview_icon = icon('icons/effects/128x72_vr.dmi', bgstate)
preview_icon.Scale(128, 72)
mannequin.dir = NORTH
var/icon/stamp = getFlatIcon(mannequin)
preview_icon.Blend(stamp, ICON_OVERLAY, 49, 9)
stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
preview_icon.Blend(stamp, ICON_OVERLAY, 65-stamp.Width()/2, 5)
mannequin.dir = WEST
stamp = getFlatIcon(mannequin)
preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9)
stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
preview_icon.Blend(stamp, ICON_OVERLAY, 15-stamp.Width()/2, 5)
mannequin.dir = SOUTH
stamp = getFlatIcon(mannequin)
preview_icon.Blend(stamp, ICON_OVERLAY, 83, 9)
stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
preview_icon.Blend(stamp, ICON_OVERLAY, 115-stamp.Width()/2, 5)
preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.

View File

@@ -77,6 +77,7 @@
desc = "A pair of gloves that reach past the elbow. Fancy!"
name = "evening gloves"
icon_state = "evening_gloves"
addblends = "evening_gloves_a"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE

View File

@@ -34,9 +34,11 @@
/obj/item/clothing/head/hairflower/white
icon_state = "hairflower_white"
addblends = "hairflower_white_a"
/obj/item/clothing/head/hairflower/bow
icon_state = "bow"
addblends = "bow_a"
name = "hair bow"
desc = "A ribbon tied into a bow with a clip on the back to attach to hair."
item_state_slots = list(slot_r_hand_str = "pill", slot_l_hand_str = "pill")
@@ -155,6 +157,7 @@
/obj/item/clothing/head/flatcap/grey
icon_state = "flat_capw"
addblends = "flat_capw_a"
item_state_slots = list(slot_r_hand_str = "greysoft", slot_l_hand_str = "greysoft")
/obj/item/clothing/head/pirate
@@ -300,6 +303,7 @@
name = "hijab"
desc = "A veil that is wrapped to cover the head and chest"
icon_state = "hijab"
addblends = "hijab_a"
item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
body_parts_covered = 0
flags_inv = BLOCKHAIR
@@ -308,12 +312,14 @@
name = "kippa"
desc = "A small, brimless cap."
icon_state = "kippa"
addblends = "kippa_a"
body_parts_covered = 0
/obj/item/clothing/head/turban
name = "turban"
desc = "A cloth used to wind around the head"
icon_state = "turban"
addblends = "turban_a"
item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
body_parts_covered = 0
flags_inv = BLOCKHEADHAIR
@@ -322,24 +328,28 @@
name = "taqiyah"
desc = "A short, rounded skullcap usually worn for religious purposes."
icon_state = "taqiyah"
addblends = "taqiyah_a"
item_state_slots = list(slot_r_hand_str = "taq", slot_l_hand_str = "taq")
/obj/item/clothing/head/beanie
name = "beanie"
desc = "A head-hugging brimless winter cap. This one is tight."
icon_state = "beanie"
addblends = "beanie_a"
body_parts_covered = 0
/obj/item/clothing/head/beanie_loose
name = "loose beanie"
desc = "A head-hugging brimless winter cap. This one is loose."
icon_state = "beanie_hang"
addblends = "beanie_hang_a"
body_parts_covered = 0
/obj/item/clothing/head/beretg
name = "beret"
desc = "A beret, an artists favorite headwear."
icon_state = "beret_g"
addblends = "beret_g_a"
body_parts_covered = 0
/obj/item/clothing/head/sombrero

View File

@@ -54,6 +54,7 @@
name = "white flats"
desc = "Shiny white flats."
icon_state = "flatswhite"
addblends = "flatswhite_a"
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
/obj/item/clothing/shoes/flats/white/color

View File

@@ -124,23 +124,27 @@
name = "flip flops"
desc = "A pair of foam flip flops. For those not afraid to show a little ankle."
icon_state = "thongsandal"
addblends = "thongsandal_a"
/obj/item/clothing/shoes/athletic
name = "athletic shoes"
desc = "A pair of sleek atheletic shoes. Made by and for the sporty types."
icon_state = "sportshoe"
addblends = "sportshoe_a"
item_state_slots = list(slot_r_hand_str = "sportheld", slot_l_hand_str = "sportheld")
/obj/item/clothing/shoes/skater
name = "skater shoes"
desc = "A pair of wide shoes with thick soles. Designed for skating."
icon_state = "skatershoe"
addblends = "skatershoe_a"
item_state_slots = list(slot_r_hand_str = "skaterheld", slot_l_hand_str = "skaterheld")
/obj/item/clothing/shoes/heels
name = "high heels"
desc = "A pair of high-heeled shoes. Fancy!"
icon_state = "heels"
addblends = "heels_a"
/obj/item/clothing/shoes/footwraps
name = "cloth footwraps"

View File

@@ -54,7 +54,7 @@
//Breach thresholds, should ideally be inherited by most (if not all) voidsuits.
//With 0.2 resiliance, will reach 10 breach damage after 3 laser carbine blasts or 8 smg hits.
breach_threshold = 18
breach_threshold = 12
can_breach = 1
//Inbuilt devices.

View File

@@ -277,6 +277,7 @@ obj/item/clothing/suit/kimono
name = "kimono"
desc = "A traditional Japanese kimono."
icon_state = "kimono"
addblends = "kimono_a"
/*
* coats
@@ -344,6 +345,7 @@ obj/item/clothing/suit/storage/toggle/peacoat
name = "peacoat"
desc = "A well-tailored, stylish peacoat."
icon_state = "peacoat"
addblends = "peacoat_a"
item_state_slots = list(slot_r_hand_str = "peacoat", slot_l_hand_str = "peacoat")
flags_inv = HIDEHOLSTER
/*

View File

@@ -45,6 +45,16 @@
mob_overlay = image("icon" = sprite_sheets[wearer.species.get_bodytype(wearer)], "icon_state" = "[tmp_icon_state]")
else
mob_overlay = image("icon" = INV_ACCESSORIES_DEF_ICON, "icon_state" = "[tmp_icon_state]")
if(addblends)
var/icon/base = new/icon("icon" = mob_overlay.icon, "icon_state" = mob_overlay.icon_state)
var/addblend_icon = new/icon("icon" = mob_overlay.icon, "icon_state" = src.addblends)
if(color)
base.Blend(src.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
mob_overlay = image(base)
else
mob_overlay.color = src.color
return mob_overlay
//when user attached an accessory to S

View File

@@ -37,6 +37,7 @@
/obj/item/clothing/accessory/armband/med/color
name = "armband"
desc = "A fancy armband."
addblends = "med_a"
/obj/item/clothing/accessory/armband/medblue
name = "EMT armband"

View File

@@ -627,17 +627,20 @@
name = "long dress"
desc = "A long dress."
icon_state = "whitedress2"
addblends = "whitedress2_a"
flags_inv = HIDESHOES
/obj/item/clothing/under/dress/white3
name = "short dress"
desc = "A short, plain dress."
icon_state = "whitedress3"
addblends = "whitedress3_a"
/obj/item/clothing/under/dress/white4
name = "long flared dress"
desc = "A long white dress that flares out at the bottom."
icon_state = "whitedress4"
addblends = "whitedress4_a"
flags_inv = HIDESHOES
/obj/item/clothing/under/dress/darkred

View File

@@ -121,6 +121,7 @@
name = "yoga pants"
desc = "A pair of tight-fitting yoga pants for those lazy days."
icon_state = "yogapants"
addblends = "yogapants_a"
/*
* Baggy Pants

View File

@@ -619,3 +619,235 @@
activate_pin(2)
/obj/item/integrated_circuit/input/atmo_scanner
name = "integrated atmospheric analyser"
desc = "The same atmospheric analysis module that is integrated into every PDA. \
This allows the machine to know the composition, temperature and pressure of the surrounding atmosphere."
icon_state = "medscan_adv"
complexity = 9
inputs = list()
outputs = list(
"pressure" = IC_PINTYPE_NUMBER,
"temperature" = IC_PINTYPE_NUMBER,
"oxygen" = IC_PINTYPE_NUMBER,
"nitrogen" = IC_PINTYPE_NUMBER,
"carbon dioxide" = IC_PINTYPE_NUMBER,
"phoron" = IC_PINTYPE_NUMBER,
"other" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 60
/obj/item/integrated_circuit/input/atmo_scanner/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles
if (total_moles)
var/o2_level = environment.gas["oxygen"]/total_moles
var/n2_level = environment.gas["nitrogen"]/total_moles
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
var/phoron_level = environment.gas["phoron"]/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level)
set_pin_data(IC_OUTPUT, 1, pressure)
set_pin_data(IC_OUTPUT, 2, round(environment.temperature-T0C,0.1))
set_pin_data(IC_OUTPUT, 3, round(o2_level*100,0.1))
set_pin_data(IC_OUTPUT, 4, round(n2_level*100,0.1))
set_pin_data(IC_OUTPUT, 5, round(co2_level*100,0.1))
set_pin_data(IC_OUTPUT, 6, round(phoron_level*100,0.01))
set_pin_data(IC_OUTPUT, 7, round(unknown_level, 0.01))
else
set_pin_data(IC_OUTPUT, 1, 0)
set_pin_data(IC_OUTPUT, 2, -273.15)
set_pin_data(IC_OUTPUT, 3, 0)
set_pin_data(IC_OUTPUT, 4, 0)
set_pin_data(IC_OUTPUT, 5, 0)
set_pin_data(IC_OUTPUT, 6, 0)
set_pin_data(IC_OUTPUT, 7, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/pressure_sensor
name = "integrated pressure sensor"
desc = "A tiny pressure sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"pressure" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/pressure_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles
if (total_moles)
set_pin_data(IC_OUTPUT, 1, pressure)
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/temperature_sensor
name = "integrated temperature sensor"
desc = "A tiny temperature sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"temperature" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/temperature_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
set_pin_data(IC_OUTPUT, 1, round(environment.temperature-T0C,0.1))
else
set_pin_data(IC_OUTPUT, 1, -273.15)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/oxygen_sensor
name = "integrated oxygen sensor"
desc = "A tiny oxygen sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"oxygen" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/oxygen_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/o2_level = environment.gas["oxygen"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(o2_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/co2_sensor
name = "integrated co2 sensor"
desc = "A tiny carbon dioxide sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"co2" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/co2_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(co2_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/nitrogen_sensor
name = "integrated nitrogen sensor"
desc = "A tiny nitrogen sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"nitrogen" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/nitrogen_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/n2_level = environment.gas["nitrogen"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(n2_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/input/phoron_sensor
name = "integrated phoron sensor"
desc = "A tiny phoron gas sensor module similar to that found in a PDA atmosphere analyser."
icon_state = "medscan_adv"
complexity = 3
inputs = list()
outputs = list(
"phoron" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3)
power_draw_per_use = 20
/obj/item/integrated_circuit/input/phoron_sensor/do_work()
var/turf/T = get_turf(src)
if(!istype(T)) //Invalid input
return
var/datum/gas_mixture/environment = T.return_air()
var/total_moles = environment.total_moles
if (total_moles)
var/phoron_level = environment.gas["phoron"]/total_moles
set_pin_data(IC_OUTPUT, 1, round(phoron_level*100,0.1))
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
activate_pin(2)

View File

@@ -86,7 +86,11 @@ note dizziness decrements automatically in the mob's Life() proc.
if(anchored||buckled)
make_floating(0)
return
if(ishuman(src)) //VOREStation Edit Start. Floating code.
var/mob/living/carbon/human/H = src
if(H.flying)
make_floating(1)
return //VOREStation Edit End
var/turf/turf = get_turf(src)
if(!istype(turf,/turf/space))
var/area/A = turf.loc

View File

@@ -201,6 +201,11 @@ Works together with spawning an observer, noted above.
/mob/proc/ghostize(var/can_reenter_corpse = 1)
if(key)
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.vr_holder && !can_reenter_corpse)
H.exit_vr()
return 0
var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
@@ -244,6 +249,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
message_admins("[key_name_admin(usr)] has ghosted. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
log_game("[key_name_admin(usr)] has ghosted.")
var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
if(ghost)
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
announce_ghost_joinleave(ghost)

View File

@@ -109,20 +109,28 @@
playsound(loc, "sparks", 50, 1, -1)
if (shock_damage > 15)
src.visible_message(
"<font color='red'>[src] was shocked by \the [source]!</font>", \
"<font color='red'><B>You feel a powerful shock course through your body!</B></font>", \
"<font color='red'>You hear a heavy electrical crack.</font>" \
"<span class='warning'>[src] was electrocuted[source ? " by the [source]" : ""]!</span>", \
"<span class='danger'>You feel a powerful shock course through your body!</span>", \
"<span class='warning'>You hear a heavy electrical crack.</span>" \
)
if(stun)
Stun(10)//This should work for now, more is really silly and makes you lay there forever
Weaken(10)
else
src.visible_message(
"<font color='red'>[src] was mildly shocked by \the [source].</font>", \
"<font color='red'>You feel a mild shock course through your body.</font>", \
"<font color='red'>You hear a light zapping.</font>" \
"<span class='warning'>[src] was shocked[source ? " by the [source]" : ""].</span>", \
"<span class='warning'>You feel a shock course through your body.</span>", \
"<span class='warning'>You hear a zapping sound.</span>" \
)
if(stun)
switch(shock_damage)
if(16 to 20)
Stun(2)
if(21 to 25)
Weaken(2)
if(26 to 30)
Weaken(5)
if(31 to INFINITY)
Weaken(10) //This should work for now, more is really silly and makes you lay there forever
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, loc)
s.start()

View File

@@ -25,7 +25,7 @@
weapon_edge = 0
hit_embed_chance = I.force/(I.w_class*3)
apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
//Melee weapon embedded object code.
if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I) && I.embed_chance > 0)

View File

@@ -1,5 +1,15 @@
/mob/living/carbon/human/gib()
if(vr_holder)
exit_vr()
// Delete the link, because this mob won't be around much longer
vr_holder.vr_link = null
if(vr_link)
vr_link.exit_vr()
vr_link.vr_holder = null
vr_link = null
for(var/obj/item/organ/I in internal_organs)
I.removed()
if(istype(loc,/turf))
@@ -40,6 +50,7 @@
//Handle species-specific deaths.
species.handle_death(src)
animate_tail_stop()
stop_flying() //VOREStation Edit.
//Handle snowflake ling stuff.
if(mind && mind.changeling)
@@ -80,6 +91,20 @@
if(wearing_rig)
wearing_rig.notify_ai("<span class='danger'>Warning: user death event. Mobility control passed to integrated intelligence system.</span>")
// If the body is in VR, move the mind back to the real world
if(vr_holder)
src.exit_vr()
src.vr_holder.vr_link = null
for(var/obj/item/W in src)
src.drop_from_inventory(W)
// If our mind is in VR, bring it back to the real world so it can die with its body
if(vr_link)
vr_link.exit_vr()
vr_link.vr_holder = null
vr_link = null
to_chat(src, "<span class='danger'>Everything abruptly stops.</span>")
return ..(gibbed,species.get_death_message(src))
/mob/living/carbon/human/proc/ChangeToHusk()

View File

@@ -1202,12 +1202,16 @@
species.update_attack_types() //VOREStation Edit Start Required for any trait that updates unarmed_types in setup.
if(species.gets_food_nutrition != 1) //Bloodsucker trait. Tacking this on here.
verbs |= /mob/living/carbon/human/proc/bloodsuck
if(species.can_drain_prey == 1)
if(species.can_drain_prey)
verbs |= /mob/living/carbon/human/proc/succubus_drain //Succubus drain trait.
verbs |= /mob/living/carbon/human/proc/succubus_drain_finialize
verbs |= /mob/living/carbon/human/proc/succubus_drain_lethal
if(species.hard_vore_enabled == 1) //Hardvore verb.
verbs |= /mob/living/carbon/human/proc/shred_limb //VOREStation Edit End
if(species.hard_vore_enabled) //Hardvore verb.
verbs |= /mob/living/carbon/human/proc/shred_limb
if(species.can_fly)
verbs |= /mob/living/proc/flying_toggle //Flying wings!
verbs |= /mob/living/proc/start_wings_hovering
//VOREStation Edit End
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
if(client && client.screen)
@@ -1447,6 +1451,8 @@
/mob/living/carbon/human/Check_Shoegrip()
if(shoes && (shoes.item_flags & NOSLIP) && istype(shoes, /obj/item/clothing/shoes/magboots)) //magboots + dense_object = no floating
return 1
if(flying) //VOREStation Edit. Checks to see if they have wings and are flying.
return 1 //VOREStation Edit.
return 0
//Puts the item into our active hand if possible. returns 1 on success.
@@ -1563,3 +1569,54 @@
var/obj/item/clothing/accessory/permit/drone/permit = new(T)
permit.set_name(real_name)
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
// enter_vr is called on the original mob, and puts the mind into the supplied vr mob
/mob/living/carbon/human/proc/enter_vr(var/mob/living/carbon/human/avatar) // Avatar is currently a human, because we have preexisting setup code for appearance manipulation, etc.
if(!istype(avatar))
return
// Link the two mobs for client transfer
avatar.vr_holder = src
src.teleop = avatar
src.vr_link = avatar // Can't reuse vr_holder so that death can automatically eject users from VR
// Move the mind
avatar.Sleeping(1)
src.mind.transfer_to(avatar)
to_chat(avatar, "<b>You have enterred Virtual Reality!\nAll normal gameplay rules still apply.\nWounds you suffer here won't persist when you leave VR, but some of the pain will.\nYou can leave VR at any time by using the \"Exit Virtual Reality\" verb in the Abilities tab, or by ghosting.\nYou can modify your appearance by using various \"Change \[X\]\" verbs in the Abilities tab.</b>")
to_chat(avatar, "<span class='notice'> You black out for a moment, and wake to find yourself in a new body in virtual reality.</span>") // So this is what VR feels like?
// exit_vr is called on the vr mob, and puts the mind back into the original mob
/mob/living/carbon/human/verb/exit_vr()
set name = "Exit Virtual Reality"
set category = "Abilities"
if(!vr_holder)
return
if(!mind)
return
var/total_damage
// Tally human damage
if(ishuman(src))
var/mob/living/carbon/human/H = src
total_damage = H.getBruteLoss() + H.getFireLoss() + H.getOxyLoss() + H.getToxLoss()
// Move the mind back to the original mob
// vr_holder.Sleeping(1)
src.mind.transfer_to(vr_holder)
to_chat(vr_holder, "<span class='notice'>You black out for a moment, and wake to find yourself back in your own body.</span>")
// Two-thirds damage is transferred as agony for /humans
// Getting hurt in VR doesn't damage the physical body, but you still got hurt.
if(ishuman(vr_holder) && total_damage)
var/mob/living/carbon/human/V = vr_holder
V.stun_effect_act(0, total_damage*2/3, null) // 200 damage leaves the user in paincrit for several seconds, agony reaches 0 after around 2m.
to_chat(vr_holder, "<span class='warning'>Pain from your time in VR lingers.</span>") // 250 damage leaves the user unconscious for several seconds in addition to paincrit
// Maintain a link with the mob, but don't use teleop
vr_holder.vr_link = src
vr_holder.teleop = null
if(istype(vr_holder.loc, /obj/machinery/vr_sleeper))
var/obj/machinery/vr_sleeper/V = vr_holder.loc
V.go_out()

View File

@@ -429,9 +429,9 @@ This function restores all organs.
zone = BP_HEAD
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
if(Debug2)
world.log << "## DEBUG: human/apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]."
world.log << "## DEBUG: human/apply_damage() was called on [src], with [damage] damage, an armor value of [blocked], and a soak value of [soaked]."
var/obj/item/organ/external/organ = null
if(isorgan(def_zone))
@@ -446,7 +446,7 @@ This function restores all organs.
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
if(organ && organ.organ_can_feel_pain())
emote("scream")
..(damage, damagetype, def_zone, blocked)
..(damage, damagetype, def_zone, blocked, soaked)
return 1
//Handle BRUTE and BURN damage
@@ -455,12 +455,18 @@ This function restores all organs.
if(blocked >= 100)
return 0
if(soaked >= damage)
return 0
if(!organ) return 0
if(blocked)
blocked = (100-blocked)/100
damage = (damage * blocked)
if(soaked)
damage -= soaked
if(Debug2)
world.log << "## DEBUG: [src] was hit for [damage]."

View File

@@ -103,3 +103,8 @@
var/step_count = 0 // Track how many footsteps have been taken to know when to play footstep sounds
can_be_antagged = TRUE
// Used by mobs in virtual reality to point back to the "real" mob the client belongs to.
var/mob/living/carbon/human/vr_holder = null
// Used by "real" mobs after they leave a VR session
var/mob/living/carbon/human/vr_link = null

View File

@@ -141,6 +141,8 @@
if(((!check_drift) || (check_drift && thrust.stabilization_on)) && (!lying) && (thrust.allow_thrust(0.01, src)))
inertia_dir = 0
return 1
if(flying) //VOREStation Edit. If you're flying, you glide around!
return 0 //VOREStation Edit.
//If no working jetpack then use the other checks
if(..())

View File

@@ -67,6 +67,7 @@
Sleeping(20)
//No need to update all of these procs if the guy is dead.
fall() //VORESTATION EDIT. Prevents people from floating
if(stat != DEAD && !stasis)
//Updates the number of stored chemicals for powers
handle_changeling()

View File

@@ -11,6 +11,7 @@
// Icon/appearance vars.
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/icobase_add // Icon set for highlight blends when applicable.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
var/speech_bubble_appearance = "normal" // Part of icon_state to use for speech bubbles when talking. See talk.dmi for available icons.
@@ -28,6 +29,7 @@
var/tail // Name of tail state in species effects icon file.
var/tail_animation // If set, the icon to obtain tail animation states from.
var/tail_animation_add // Highlight overlay for tail.
var/tail_hair
var/race_key = 0 // Used for mob icon cache string.
@@ -274,11 +276,14 @@
var/t_him = "them"
if(ishuman(target))
var/mob/living/carbon/human/T = target
if(!T.species.ambiguous_genders || (T.species.ambiguous_genders && H.species == T.species))
switch(T.identifying_gender)
if(MALE)
t_him = "him"
if(FEMALE)
t_him = "her"
else
t_him = "them"
else
switch(target.gender)
if(MALE)

View File

@@ -10,6 +10,9 @@
/datum/species/proc/get_tail_animation(var/mob/living/carbon/human/H)
return tail_animation
/datum/species/proc/get_tail_animation_a(var/mob/living/carbon/human/H)
return tail_animation_add
/datum/species/proc/get_tail_hair(var/mob/living/carbon/human/H)
return tail_hair
@@ -28,6 +31,9 @@
/datum/species/proc/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
return (get_deform ? deform : icobase)
/datum/species/proc/get_icobase_a(var/mob/living/carbon/human/H)
return icobase_add
/datum/species/proc/get_station_variant()
return name

View File

@@ -148,9 +148,16 @@ var/list/wrapped_species_by_ref = list()
last_special = world.time + 50
var/new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src)
var/new_species = null
new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src)
if(!new_species || !all_species[new_species] || wrapped_species_by_ref["\ref[src]"] == new_species)
return
shapeshifter_change_shape(new_species)
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null)
if(!new_species)
return
wrapped_species_by_ref["\ref[src]"] = new_species
visible_message("<span class='notice'>\The [src] shifts and contorts, taking the form of \a [new_species]!</span>")

View File

@@ -27,3 +27,15 @@
unarmed_types += /datum/unarmed_attack/bite/sharp/numbing
for(var/u_type in unarmed_types)
unarmed_attacks += new u_type()
/datum/species/create_organs(var/mob/living/carbon/human/H)
if(H.nif)
var/type = H.nif.type
var/durability = H.nif.durability
var/list/nifsofts = H.nif.nifsofts
..()
var/obj/item/device/nif/nif = new type(H,durability)
nif.nifsofts = nifsofts
else
..()

View File

@@ -5,6 +5,7 @@
var/can_drain_prey = 0 //Determines if the person can use the succubus drain or not.
var/hard_vore_enabled = 0 //Determines if the person has the hardvore verb or not.
var/metabolism = 0.0015
var/can_fly = 0 //Determines if the species can fly if they have wings.
/datum/species/custom
name = "Custom Species"

View File

@@ -26,8 +26,9 @@
tail_hair = "feathers"
reagent_tag = IS_TESHARI
icobase = 'icons/mob/human_races/r_seromi.dmi'
deform = 'icons/mob/human_races/r_seromi.dmi'
icobase = 'icons/mob/human_races/r_seromi_m.dmi'
icobase_add = 'icons/mob/human_races/r_seromi_a.dmi'
deform = 'icons/mob/human_races/r_seromi_m.dmi'
damage_overlays = 'icons/mob/human_races/masks/dam_seromi.dmi'
damage_mask = 'icons/mob/human_races/masks/dam_mask_seromi.dmi'
blood_mask = 'icons/mob/human_races/masks/blood_seromi.dmi'

View File

@@ -25,10 +25,12 @@
/datum/species/unathi
name = "Unathi"
name_plural = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
icobase = 'icons/mob/human_races/r_lizard_m.dmi'
icobase_add = 'icons/mob/human_races/r_lizard_a.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
tail = "sogtail"
tail_animation = 'icons/mob/species/unathi/tail.dmi'
tail_animation = 'icons/mob/species/unathi/tail_m.dmi'
tail_animation_add = 'icons/mob/species/unathi/tail_a.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
primitive_form = "Stok"
darksight = 3
@@ -127,10 +129,12 @@
/datum/species/tajaran
name = "Tajara"
name_plural = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
icobase = 'icons/mob/human_races/r_tajaran_m.dmi'
icobase_add = 'icons/mob/human_races/r_tajaran_a.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
tail = "tajtail"
tail_animation = 'icons/mob/species/tajaran/tail.dmi'
tail_animation = 'icons/mob/species/tajaran/tail_m.dmi'
tail_animation_add = 'icons/mob/species/tajaran/tail_a.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
darksight = 8
slowdown = -0.5
@@ -212,7 +216,8 @@
/datum/species/skrell
name = "Skrell"
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
icobase = 'icons/mob/human_races/r_skrell_m.dmi'
icobase_add = 'icons/mob/human_races/r_skrell_a.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
primitive_form = "Neaera"
unarmed_types = list(/datum/unarmed_attack/punch)

View File

@@ -720,3 +720,56 @@
T.apply_damage(25, BRUTE, D)
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") //Keep it vague. Let the /me's do the talking.
log_and_message_admins("shreded [D] of [T].", C)
/mob/living/proc/flying_toggle()
set name = "Toggle Flight"
set desc = "While flying over open spaces, you will use up some nutrition. If you run out nutrition, you will fall. Additionally, you can't fly if you are too heavy."
set category = "Abilities"
var/mob/living/carbon/human/C = src
if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person.
to_chat(src, "You cannot fly without wings!!")
return
if(C.incapacitated(INCAPACITATION_ALL))
to_chat(src, "You cannot fly in this state!")
return
if(C.nutrition < 25 && !C.flying) //Don't have any food in you?" You can't fly.
to_chat(C, "<span class='notice'>You lack the nutrition to fly.</span>")
return
if(C.nutrition > 1000 && !C.flying)
to_chat(C, "<span class='notice'>You have eaten too much to fly! You need to lose some nutrition.</span>")
return
C.flying = !C.flying
update_floating()
to_chat(C, "<span class='notice'>You have [C.flying?"started":"stopped"] flying.</span>")
//Proc to stop inertial_drift. Exchange nutrition in order to stop gliding around.
/mob/living/proc/start_wings_hovering()
set name = "Hover"
set desc = "Allows you to stop gliding and hover. This will take a fair amount of nutrition to perform."
set category = "Abilities"
var/mob/living/carbon/human/C = src
if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person.
to_chat(src, "You don't have wings!")
return
if(C.incapacitated(INCAPACITATION_ALL))
to_chat(src, "You cannot hover in your current state!")
return
if(C.nutrition < 50 && !C.flying) //Don't have any food in you?" You can't hover, since it takes up 25 nutrition. And it's not 25 since we don't want them to immediately fall.
to_chat(C, "<span class='notice'>You lack the nutrition to fly.</span>")
return
if(C.anchored)
to_chat(C, "<span class='notice'>You are already hovering and/or anchored in place!</span>")
return
if(!C.anchored && !C.pulledby) //Not currently anchored, and not pulled by anyone.
C.anchored = 1 //This is the only way to stop the inertial_drift.
C.nutrition -= 25
update_floating()
to_chat(C, "<span class='notice'>You hover in place.</span>")
spawn(6) //.6 seconds.
C.anchored = 0
else
return

View File

@@ -14,6 +14,7 @@
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
burn_mod = 1.15 //As vulnerable to burn as a Tajara.
can_fly = 1 //They have wings by default.
num_alternate_languages = 2
secondary_langs = list("Sol Common")

View File

@@ -76,6 +76,7 @@
secondary_langs = list(LANGUAGE_SKRELLIAN)
name_language = LANGUAGE_SKRELLIAN
color_mult = 1
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
min_age = 18
max_age = 110
@@ -119,6 +120,7 @@
secondary_langs = list(LANGUAGE_BIRDSONG)
name_language = LANGUAGE_BIRDSONG
color_mult = 1
can_fly = 1
min_age = 18
max_age = 110
@@ -355,6 +357,7 @@ datum/species/harpy
secondary_langs = list(LANGUAGE_BIRDSONG)
name_language = null
color_mult = 1
can_fly = 1
min_age = 18
max_age = 80

View File

@@ -119,3 +119,9 @@
desc = "Decreases stun duration from flashes and other light-based stuns and disabilities by 50%"
cost = 1
var_changes = list("flash_mod" = 0.5)
/datum/trait/winged_flight
name = "Winged Flight"
desc = "Allows you to fly by using your wings."
cost = 2 //Some in game value.
var_changes = list("can_fly" = 1)

View File

@@ -0,0 +1,32 @@
// ### Wooo, inheritance. Basically copying everything I don't need to edit from prometheans, because they mostly work already.
// ### Any and all of this is open to change for balance or whatever.
// ###
// ###
// Species definition follows.
/datum/species/shapeshifter/promethean/avatar
name = "Virtual Reality Avatar"
name_plural = "Virtual Reality Avatars"
blurb = "A 3-dimensional representation of some sort of animate object used to display the presence and actions of some-one or -thing using a virtual reality program."
show_ssd = "eerily still"
death_message = "flickers briefly, their gear falling in a heap on the floor around their motionless body."
knockout_message = "has been knocked unconscious!"
spawn_flags = SPECIES_IS_RESTRICTED
speech_bubble_appearance = "cyber"
male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
female_sneeze_sound = 'sound/effects/mob_effects/f_sneeze.ogg'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime, O_EYES = /obj/item/organ/internal/eyes) // Slime core.
heal_rate = 0 // Avatars don't naturally heal like prometheans, at least not for now
/datum/species/shapeshifter/promethean/avatar/handle_death(var/mob/living/carbon/human/H)
return
/datum/species/shapeshifter/promethean/avatar/handle_environment_special(var/mob/living/carbon/human/H)
return

View File

@@ -400,11 +400,14 @@ var/global/list/damage_icon_parts = list()
face_standing.Blend(facial_s, ICON_OVERLAY)
if(h_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY) //VOREStation edit
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
overlays |= hair_s //VOREStation edit? Sync note: The new Polaris doesn't have this, but looking elsewhere I assume this is needed. Comment out/remove if not.
face_standing.Blend(hair_s, ICON_OVERLAY)
@@ -527,6 +530,15 @@ var/global/list/damage_icon_parts = list()
//need to append _s to the icon state for legacy compatibility
var/image/standing = image(icon = under_icon, icon_state = "[under_state]_s")
if(w_uniform.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = w_uniform.addblends)
if(w_uniform.color)
base.Blend(w_uniform.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = w_uniform.color
//apply blood overlay
@@ -591,6 +603,14 @@ var/global/list/damage_icon_parts = list()
bloodsies.color = gloves.blood_color
standing.overlays += bloodsies
gloves.screen_loc = ui_gloves
if(gloves.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = gloves.addblends)
if(gloves.color)
base.Blend(gloves.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = gloves.color
overlays_standing[GLOVES_LAYER] = standing
else
@@ -612,6 +632,14 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = glasses.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[glasses.icon_state]")
else
standing = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]")
if(glasses.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = glasses.addblends)
if(glasses.color)
base.Blend(glasses.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = glasses.color
overlays_standing[GLASSES_LAYER] = standing
@@ -640,6 +668,14 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = l_ear.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[t_type]")
else
standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
if(l_ear.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = l_ear.addblends)
if(l_ear.color)
base.Blend(l_ear.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = l_ear.color
both.overlays += standing
@@ -654,6 +690,14 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = r_ear.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[t_type]")
else
standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
if(r_ear.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = r_ear.addblends)
if(r_ear.color)
base.Blend(r_ear.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = r_ear.color
both.overlays += standing
@@ -688,8 +732,18 @@ var/global/list/damage_icon_parts = list()
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
if(shoes.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = shoes.addblends)
if(shoes.color)
base.Blend(shoes.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = shoes.color
overlays_standing[shoe_layer] = standing
else
if(feet_blood_DNA)
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "shoeblood")
@@ -755,6 +809,14 @@ var/global/list/damage_icon_parts = list()
if(hat.on && light_overlay_cache[cache_key])
standing.overlays |= light_overlay_cache[cache_key]
if(head.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = head.addblends)
if(head.color)
base.Blend(head.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = head.color
overlays_standing[HEAD_LAYER] = standing
@@ -790,6 +852,14 @@ var/global/list/damage_icon_parts = list()
if(!i_state) i_state = i.icon_state
standing.overlays += image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[i_state]")
if(belt.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = belt.addblends)
if(belt.color)
base.Blend(belt.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = belt.color
overlays_standing[belt_layer] = standing
@@ -819,6 +889,17 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.icon_override && wear_suit.item_state)
t_state = wear_suit.item_state
//VOREStation Code End
standing = image("icon" = t_icon, "icon_state" = "[wear_suit.icon_state]")
if(wear_suit.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = wear_suit.addblends)
if(wear_suit.color)
base.Blend(wear_suit.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = wear_suit.color
standing = image("icon" = t_icon, "icon_state" = t_state) //VOREStation Edit
standing.color = wear_suit.color
@@ -876,6 +957,14 @@ var/global/list/damage_icon_parts = list()
standing = image("icon" = wear_mask.sprite_sheets[species.get_bodytype(src)], "icon_state" = "[wear_mask.icon_state]")
else
standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
if(wear_mask.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = wear_mask.addblends)
if(wear_mask.color)
base.Blend(wear_mask.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = wear_mask.color
if( !istype(wear_mask, /obj/item/clothing/mask/smokable/cigarette) && wear_mask.blood_DNA )
@@ -918,6 +1007,14 @@ var/global/list/damage_icon_parts = list()
//apply color
var/image/standing = image(icon = overlay_icon, icon_state = overlay_state)
if(back.addblends)
var/icon/base = new/icon("icon" = standing.icon, "icon_state" = standing.icon_state)
var/addblend_icon = new/icon("icon" = standing.icon, "icon_state" = back.addblends)
if(back.color)
base.Blend(back.color, ICON_MULTIPLY)
base.Blend(addblend_icon, ICON_ADD)
standing = image(base)
else
standing.color = back.color
//create the image
@@ -1082,19 +1179,22 @@ var/global/list/damage_icon_parts = list()
if(!tail_icon)
//generate a new one
var/species_tail_anim = species.get_tail_animation(src)
if(species.icobase_tail) species_tail_anim = species.icobase //VOREStation Code
if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi'
var/species_tail_anim_a = species.get_tail_animation_a(src)
if(!species_tail_anim)
species_tail_anim = 'icons/effects/species.dmi'
if(!species_tail_anim_a)
species_tail_anim_a = 'icons/effects/species_a.dmi'
tail_icon = new/icon(species_tail_anim)
//VOREStation Code Start
if(species.color_mult)
var/tail_icon_a = new/icon(species_tail_anim_a)
tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_MULTIPLY)
else
tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
tail_icon.Blend(tail_icon_a, ICON_ADD)
// The following will not work with animated tails.
var/use_species_tail = species.get_tail_hair(src)
if(use_species_tail)
var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]")
hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY) //VOREStation Edit
var/icon/hair_icon_a = icon('icons/effects/species_a.dmi', "[species.get_tail(src)]_[use_species_tail]")
hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
hair_icon.Blend(hair_icon_a, ICON_ADD)
tail_icon.Blend(hair_icon, ICON_OVERLAY)
tail_icon_cache[icon_key] = tail_icon

View File

@@ -63,3 +63,9 @@
if(update_icons)
update_icons()
return
/mob/proc/stop_flying(var/update_icons=1)
flying = 0
if(update_icons)
update_icons()

View File

@@ -34,6 +34,8 @@
adjustCloneLoss(damage * blocked)
if(HALLOSS)
adjustHalLoss(damage * blocked)
if(ELECTROCUTE)
electrocute_act(damage, used_weapon, 1.0, def_zone)
flash_weak_pain()
updatehealth()
return 1

View File

@@ -146,7 +146,7 @@ default behaviour is:
..()
if (!istype(AM, /atom/movable) || AM.anchored)
//VOREStation Edit - object-specific proc for running into things
if((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run")
if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying)
AM.stumble_into(src)
//VOREStation Edit End
/* VOREStation Removal - See above

View File

@@ -9,7 +9,7 @@
health = 200
mob_bump_flag = ROBOT
mob_swap_flags = ROBOT|MONKEY|SLIME|SIMPLE_ANIMAL
mob_swap_flags = ~HEAVY
mob_push_flags = ~HEAVY //trundle trundle
var/lights_on = 0 // Is our integrated light on?

View File

@@ -1,8 +1,8 @@
/mob/living/simple_animal/mouse
no_vore = 1 //Mice can't eat others due to the amount of bugs caused by it.
/mob/living/simple_animal/mouse/Bump(atom/movable/AM, yes)
return
/mob/living/simple_animal/mouse/attack_hand(mob/living/hander)
src.get_scooped(hander) //For one-click mouse scooping under any conditions. They knew what they were getting into!

View File

@@ -107,7 +107,9 @@
var/friendly = "nuzzles" // What mobs do to people when they aren't really hostile
var/attack_sound = null // Sound to play when I attack
var/environment_smash = 0 // How much environment damage do I do when I hit stuff?
var/melee_miss_chance = 25 // percent chance to miss a melee attack.
var/melee_miss_chance = 15 // percent chance to miss a melee attack.
var/melee_attack_minDelay = 5 // How long between attacks at least
var/melee_attack_maxDelay = 10 // How long between attacks at most
//Special attacks
var/spattack_prob = 0 // Chance of the mob doing a special attack (0 for never)
@@ -1175,7 +1177,7 @@
if(!Adjacent(target_mob))
return
if(!client)
sleep(rand(8) + 8)
sleep(rand(melee_attack_minDelay, melee_attack_maxDelay))
if(isliving(target_mob))
var/mob/living/L = target_mob
@@ -1455,6 +1457,19 @@
agonyDam += agony_amount * 0.5
adjustFireLoss(agonyDam)
/mob/living/simple_animal/emp_act(severity)
if(!isSynthetic())
return
switch(severity)
if(1)
adjustFireLoss(rand(15, 25))
if(2)
adjustFireLoss(rand(10, 18))
if(3)
adjustFireLoss(rand(5, 12))
if(4)
adjustFireLoss(rand(1, 6))
// Force it to target something
/mob/living/simple_animal/proc/taunt(var/mob/living/new_target, var/forced = FALSE)
if(intelligence_level == SA_HUMANOID && !forced)

View File

@@ -1,2 +1,3 @@
/mob
var/vantag_hud = 0 // Do I have the HUD enabled?
var/flying = 0 //Allows flight

View File

@@ -517,6 +517,8 @@
return dense_object
/mob/proc/Check_Shoegrip()
if(flying) //VOREStation Edit. Checks to see if they and are flying.
return 1 //VOREStation Edit. Checks to see if they are flying. Mostly for this to be ported to Polaris.
return 0
/mob/proc/Process_Spaceslipping(var/prob_slip = 5)

View File

@@ -259,7 +259,7 @@
mannequin.delete_inventory(TRUE)
dress_preview_mob(mannequin)
preview_icon = icon('icons/effects/effects.dmi', "nothing")
preview_icon = icon('icons/effects/128x48.dmi', bgstate)
preview_icon.Scale(48+32, 16+32)
mannequin.dir = NORTH

View File

@@ -45,7 +45,8 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/Human_face.dmi' // default icon for all hairs
icon = 'icons/mob/Human_face_m.dmi' // default icon for all hairs
var/icon_add = 'icons/mob/human_face.dmi'
bald
name = "Bald"

View File

@@ -7,12 +7,14 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face_or_vr.dmi'
//var/icon_add = 'icons/mob/human_face.dmi' //Already defined in sprite_accessories.dm line 49.
var/color_blend_mode = ICON_MULTIPLY
species_allowed = list("Human","Skrell","Unathi","Tajara", "Teshari", "Nevrean", "Akula", "Sergal", "Flatland Zorren", "Highlander Zorren", "Vulpkanin", "Xenochimera", "Xenomorph Hybrid", "Vasilissan", "Rapala") //This lets all races use the default hairstyles.
awoohair
name = "Shoulder-length Messy"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "momijihair"
citheronia
@@ -25,36 +27,42 @@
citheronia_colorable
name = "Citheronia Hair"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "citheronia_hair_c"
do_colouration = 1
sergal_plain
name = "Sergal Plain"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_plain"
species_allowed = list("Sergal")
sergal_medicore
name = "Sergal Medicore"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_medicore"
species_allowed = list("Sergal")
sergal_tapered
name = "Sergal Tapered"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_tapered"
species_allowed = list("Sergal")
sergal_fairytail
name = "Sergal Fairytail"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_fairytail"
species_allowed = list("Sergal")
braid
name = "Floorlength Braid"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_braid"
bald
@@ -66,12 +74,14 @@
ponytail6_fixed //Eggnerd's done with waiting for upstream fixes lmao.
name = "Ponytail 6 but fixed"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_ponytail6"
species_allowed = list("Human","Skrell","Unathi","Tajara", "Nevrean", "Akula", "Sergal", "Flatland Zorren", "Highlander Zorren", "Vulpkanin", "Xenochimera", "Xenomorph Hybrid", "Rapala")
una_hood
name = "Cobra Hood"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "soghun_hood"
una_spines_long
@@ -123,6 +133,7 @@
una_doublehorns
name = "Double Unathi Horns"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "soghun_dubhorns"
species_allowed = list("Unathi", "Xenochimera")
@@ -221,6 +232,7 @@
vulp_hair_kajam
name = "Kajam"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "kajam"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -228,6 +240,7 @@
vulp_hair_keid
name = "Keid"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "keid"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -235,6 +248,7 @@
vulp_hair_adhara
name = "Adhara"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "adhara"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -242,6 +256,7 @@
vulp_hair_kleeia
name = "Kleeia"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "kleeia"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -249,6 +264,7 @@
vulp_hair_mizar
name = "Mizar"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "mizar"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -256,6 +272,7 @@
vulp_hair_apollo
name = "Apollo"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "apollo"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -263,6 +280,7 @@
vulp_hair_belle
name = "Belle"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "belle"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -270,6 +288,7 @@
vulp_hair_bun
name = "Bun"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "bun"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -277,6 +296,7 @@
vulp_hair_jagged
name = "Jagged"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "jagged"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -284,6 +304,7 @@
vulp_hair_curl
name = "Curl"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "curl"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -291,6 +312,7 @@
vulp_hair_hawk
name = "Hawk"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hawk"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -298,6 +320,7 @@
vulp_hair_anita
name = "Anita"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "anita"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -305,6 +328,7 @@
vulp_hair_short
name = "Short"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "short"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -312,6 +336,7 @@
vulp_hair_spike
name = "Spike"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "spike"
species_allowed = list("Vulpkanin", "Xenochimera", "Tajara", "Sergal", "Flatland Zorren", "Highlander Zorren")
gender = NEUTER
@@ -320,6 +345,7 @@
xeno_head_drone_color
name = "Drone dome"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "cxeno_drone"
species_allowed = list("Xenomorph Hybrid")
gender = NEUTER
@@ -327,6 +353,7 @@
xeno_head_sentinel_color
name = "Sentinal dome"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "cxeno_sentinel"
species_allowed = list("Xenomorph Hybrid")
gender = NEUTER
@@ -334,6 +361,7 @@
xeno_head_queen_color
name = "Queen dome"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "cxeno_queen"
species_allowed = list("Xenomorph Hybrid")
gender = NEUTER
@@ -341,6 +369,7 @@
xeno_head_hunter_color
name = "Hunter dome"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "cxeno_hunter"
species_allowed = list("Xenomorph Hybrid")
gender = NEUTER
@@ -348,6 +377,7 @@
xeno_head_praetorian_color
name = "Praetorian dome"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "cxeno_praetorian"
species_allowed = list("Xenomorph Hybrid")
gender = NEUTER

View File

@@ -49,6 +49,25 @@
else
to_chat(src, "<span class='warning'>You gave up on pulling yourself up.</span>")
return 0
else if(ismob(src)) //VOREStation Edit Start. Are they a mob, and are they currently flying??
var/mob/H = src
if(H.flying)
if(H.incapacitated(INCAPACITATION_ALL))
to_chat(src, "<span class='notice'>You can't fly in your current state.</span>")
H.stop_flying() //Should already be done, but just in case.
return 0
var/fly_time = max(7 SECONDS + (H.movement_delay() * 10), 1) //So it's not too useful for combat. Could make this variable somehow, but that's down the road.
to_chat(src, "<span class='notice'>You begin to fly upwards...</span>")
destination.audible_message("<span class='notice'>You hear the flapping of wings.</span>")
H.audible_message("<span class='notice'>[H] begins to flap \his wings, preparing to move upwards!</span>")
if(do_after(H, fly_time) && H.flying)
to_chat(src, "<span class='notice'>You fly upwards.</span>")
else
to_chat(src, "<span class='warning'>You stopped flying upwards.</span>")
return 0
else
to_chat(src, "<span class='warning'>Gravity stops you from moving upward.</span>")
return 0 //VOREStation Edit End.
else
to_chat(src, "<span class='warning'>Gravity stops you from moving upward.</span>")
return 0
@@ -85,6 +104,9 @@
if(incapacitated())
return 0
if(flying) //VOREStation Edit. Allows movement up/down with wings.
return 1 //VOREStation Edit
if(Process_Spacemove())
return 1
@@ -140,6 +162,38 @@
if(throwing)
return
if(ismob(src))
var/mob/H = src //VOREStation Edit Start. Flight on mobs.
if(H.flying) //Some other checks are done in the wings_toggle proc
if(H.nutrition > 2)
H.nutrition -= 2 //You use up 2 nutrition per TILE and tick of flying above open spaces. If people wanna flap their wings in the hallways, shouldn't penalize them for it.
if(H.incapacitated(INCAPACITATION_ALL))
H.stop_flying()
//Just here to see if the person is KO'd, stunned, etc. If so, it'll move onto can_fall.
else if (H.nutrition > 1000) //Eat too much while flying? Get fat and fall.
to_chat(H, "<span class='danger'>You're too heavy! Your wings give out and you plummit to the ground!</span>")
H.stop_flying() //womp womp.
else if(H.nutrition < 300 && H.nutrition > 289) //290 would be risky, as metabolism could mess it up. Let's do 289.
to_chat(H, "<span class='danger'>You are starting to get fatigued... You probably have a good minute left in the air, if that. Even less if you continue to fly around! You should get to the ground soon!</span>") //Ticks are, on average, 3 seconds. So this would most likely be 90 seconds, but lets just say 60.
H.nutrition -= 10
return
else if(H.nutrition < 100 && H.nutrition > 89)
to_chat(H, "<span class='danger'>You're seriously fatigued! You need to get to the ground immediately and eat before you fall!</span>")
return
else if(H.nutrition < 2) //Should have listened to the warnings!
to_chat(H, "<span class='danger'>You lack the strength to keep yourself up in the air...</span>")
H.stop_flying()
else
return
else if(ishuman(H)) //Needed to prevent 2 people from grabbing eachother in the air.
var/mob/living/carbon/human/F = H
if(F.grabbed_by.len) //If you're grabbed (presumably by someone flying) let's not have you fall. This also allows people to grab onto you while you jump over a railing to prevent you from falling!
var/obj/item/weapon/grab/G = F.get_active_hand()
var/obj/item/weapon/grab/J = F.get_inactive_hand()
if(istype(G) || istype(J))
//fall
else
return
if(can_fall())
// We spawn here to let the current move operation complete before we start falling. fall() is normally called from

View File

@@ -89,11 +89,13 @@ var/global/list/limb_icon_cache = list()
overlays |= facial_s
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style]
if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) // VOREStation edit
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
overlays |= hair_s
return mob_icon
@@ -143,7 +145,9 @@ var/global/list/limb_icon_cache = list()
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
var/icon/IA = icon(species.get_icobase_a(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY)
I.Blend(IA, ICON_ADD)
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
@@ -176,10 +180,7 @@ var/global/list/limb_icon_cache = list()
if(nonsolid)
applying.MapColors("#4D4D4D","#969696","#1C1C1C", "#000000")
if(species && species.get_bodytype(owner) != "Human")
applying.SetIntensity(1) // Unathi, Taj and Skrell have -very- dark base icons. VOREStation edit fixes this and brings the number back to 1
else
applying.SetIntensity(1) //VOREStation edit to make Prometheans not look like shit with mob coloring.
applying.SetIntensity(0.7)
else if(status & ORGAN_DEAD)
icon_cache_key += "_dead"
@@ -193,12 +194,14 @@ var/global/list/limb_icon_cache = list()
applying.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
icon_cache_key += "_tone_[s_tone]"
else if(s_col && s_col.len >= 3)
//VOREStation Edit - Support for species.color_mult
if(species && species.color_mult)
applying.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_MULTIPLY)
else
applying.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD)
//VOREStation Edit End
var/gender = "f"
if(owner && owner.gender == MALE)
gender = "m"
var/icon_a = new /icon(species.get_icobase_a(owner), "[icon_name][gendered_icon ? "_[gender]" : ""]")
applying.Blend(icon_a, ICON_ADD)
icon_cache_key += "_color_[s_col[1]]_[s_col[2]]_[s_col[3]]"
// Translucency.
if(nonsolid) applying += rgb(,,,180) // SO INTUITIVE TY BYOND

View File

@@ -0,0 +1,102 @@
// Ported from TG. Known issue: Throw hit can possibly double-proc. Seems to be throw code.
/obj/item/weapon/paperplane
name = "paper plane"
desc = "Paper folded into the shape of a plane."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paperplane"
throw_range = 7
throw_speed = 1
throwforce = 0
w_class = ITEMSIZE_TINY
var/obj/item/weapon/paper/internalPaper
/obj/item/weapon/paperplane/New(loc, obj/item/weapon/paper/newPaper)
. = ..()
pixel_y = rand(-8, 8)
pixel_x = rand(-9, 9)
if(newPaper)
internalPaper = newPaper
flags = newPaper.flags
color = newPaper.color
newPaper.forceMove(src)
else
internalPaper = new /obj/item/weapon/paper(src)
update_icon()
/obj/item/weapon/paperplane/Destroy()
if(internalPaper)
qdel(internalPaper)
internalPaper = null
return ..()
/obj/item/weapon/paperplane/update_icon()
overlays.Cut()
var/list/stamped = internalPaper.stamped
if(!stamped)
stamped = new
else if(stamped)
for(var/S in stamped)
var/obj/item/weapon/stamp/ = S
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi', "paperplane_[initial(stamp.icon_state)]")
overlays += stampoverlay
/obj/item/weapon/paperplane/attack_self(mob/user)
to_chat(user, "<span class='notice'>You unfold [src].</span>")
var/atom/movable/internal_paper_tmp = internalPaper
internal_paper_tmp.forceMove(loc)
internalPaper = null
qdel(src)
user.put_in_hands(internal_paper_tmp)
/obj/item/weapon/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params)
..()
if(istype(P, /obj/item/weapon/pen))
to_chat(user, "<span class='notice'>You should unfold [src] before changing it.</span>")
return
else if(istype(P, /obj/item/weapon/stamp)) //we don't randomize stamps on a paperplane
internalPaper.attackby(P, user) //spoofed attack to update internal paper.
update_icon()
else if(is_hot(P))
if(user.disabilities & CLUMSY && prob(10))
user.visible_message("<span class='warning'>[user] accidentally ignites themselves!</span>", \
"<span class='userdanger'>You miss the [src] and accidentally light yourself on fire!</span>")
user.unEquip(P)
user.adjust_fire_stacks(1)
user.IgniteMob()
return
if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper
return
user.unEquip(src)
user.visible_message("<span class='danger'>[user] lights [src] ablaze with [P]!</span>", "<span class='danger'>You light [src] on fire!</span>")
fire_act()
add_fingerprint(user)
/obj/item/weapon/paperplane/throw_impact(atom/hit_atom)
if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman
return
var/mob/living/carbon/human/H = hit_atom
if(prob(2))
if((H.head && H.head.body_parts_covered & EYES) || (H.wear_mask && H.wear_mask.body_parts_covered & EYES) || (H.glasses && H.glasses.body_parts_covered & EYES))
return
visible_message("<span class='danger'>\The [src] hits [H] in the eye!</span>")
H.eye_blurry += 10
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
if(E)
E.damage += 2.5
H.emote("scream")
/obj/item/weapon/paper/AltClick(mob/living/carbon/user, obj/item/I)
if ( istype(user) )
if( (!in_range(src, user)) || user.stat || user.restrained() )
return
to_chat(user, "<span class='notice'>You fold [src] into the shape of a plane!</span>")
user.unEquip(src)
I = new /obj/item/weapon/paperplane(user, src)
user.put_in_hands(I)
else
to_chat(user, "<span class='notice'> You lack the dexterity to fold \the [src]. </span>")

View File

@@ -681,13 +681,10 @@
else
flick("apc-spark", src)
if (do_after(user,6))
if(prob(50))
emagged = 1
locked = 0
to_chat(user,"<span class='notice'>You emag the APC interface.</span>")
update_icon()
else
to_chat(user,"<span class='warning'>The APC interface refused to unlock.</span>")
return 1
/obj/machinery/power/apc/attack_hand(mob/user)

View File

@@ -6,3 +6,25 @@
M.overeatduration = 0
if(M.nutrition < 0)
M.nutrition = 0
/datum/reagent/ethanol/deathbell
name = "Deathbell"
id = "deathbell"
description = "A successful experiment to make the most alcoholic thing possible."
taste_description = "your brains smashed out by a smooth brick of hard, ice cold alcohol"
color = "#9f6aff"
taste_mult = 5
strength = 10
adj_temp = 10
targ_temp = 330
glass_name = "Deathbell"
glass_desc = "The perfect blend of the most alcoholic things a bartender can get their hands on."
/datum/reagent/ethanol/deathbell/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
if(dose * strength >= strength) // Early warning
M.make_dizzy(24) // Intentionally higher than normal to compensate for it's previous effects.
if(dose * strength >= strength * 2.5) // Slurring takes longer. Again, intentional.
M.slurring = max(M.slurring, 30)

View File

@@ -90,6 +90,13 @@
required_reagents = list("shockchem" = 5, "water" = 25)
result_amount = 30
/datum/chemical_reaction/drinks/deathbell
name = "Deathbell"
id = "deathbell"
result = "deathbell"
required_reagents = list("antifreeze" = 1, "gargleblaster" = 1, "syndicatebomb" =1)
result_amount = 3
///////////////////////////////
//SLIME CORES BELOW HERE///////
///////////////////////////////

View File

@@ -60,6 +60,56 @@
used = !used
return
//A vial-loaded hypospray. Cartridge-based!
/obj/item/weapon/reagent_containers/hypospray/vial
name = "hypospray mkII"
desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping."
var/obj/item/weapon/reagent_containers/glass/beaker/vial/loaded_vial //Wow, what a name.
volume = 0
/obj/item/weapon/reagent_containers/hypospray/vial/New()
..()
loaded_vial = new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) //Comes with an empty vial
volume = loaded_vial.volume
reagents.maximum_volume = loaded_vial.reagents.maximum_volume
/obj/item/weapon/reagent_containers/hypospray/vial/attack_hand(mob/user as mob)
if(user.get_inactive_hand() == src)
if(loaded_vial)
reagents.trans_to_holder(loaded_vial.reagents,volume)
reagents.maximum_volume = 0
loaded_vial.update_icon()
user.put_in_hands(loaded_vial)
loaded_vial = null
user << "<span class='notice'>You remove the vial from the [src].</span>"
update_icon()
playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
return
..()
else
return ..()
/obj/item/weapon/reagent_containers/hypospray/vial/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/weapon/reagent_containers/glass/beaker/vial))
if(!loaded_vial)
user.visible_message("<span class='notice'>[user] begins loading [W] into \the [src].</span>","<span class='notice'>You start loading [W] into \the [src].</span>")
if(!do_after(user,30) || loaded_vial || !(W in user))
return 0
if(W.is_open_container())
W.flags ^= OPENCONTAINER
W.update_icon()
user.drop_item()
W.loc = src
loaded_vial = W
reagents.maximum_volume = loaded_vial.reagents.maximum_volume
loaded_vial.reagents.trans_to_holder(reagents,volume)
user.visible_message("<span class='notice'>[user] has loaded [W] into \the [src].</span>","<span class='notice'>You have loaded [W] into \the [src].</span>")
update_icon()
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
else
user << "<span class='notice'>\The [src] already has a vial.</span>"
else
..()
/obj/item/weapon/reagent_containers/hypospray/autoinjector
name = "autoinjector"

View File

@@ -405,7 +405,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
return
/obj/machinery/computer/rdconsole/proc/GetResearchLevelsInfo()
var/dat
var/list/dat = list()
dat += "<UL>"
for(var/datum/tech/T in files.known_tech)
if(T.level < 1)
@@ -416,23 +416,23 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "<LI>Level: [T.level]"
dat += "<LI>Summary: [T.desc]"
dat += "</UL>"
return dat
return dat.Join()
/obj/machinery/computer/rdconsole/proc/GetResearchListInfo()
var/dat
var/list/dat = list()
dat += "<UL>"
for(var/datum/design/D in files.known_designs)
if(D.build_path)
dat += "<LI><B>[D.name]</B>: [D.desc]"
dat += "</UL>"
return dat
return dat.Join()
/obj/machinery/computer/rdconsole/attack_hand(mob/user as mob)
if(stat & (BROKEN|NOPOWER))
return
user.set_machine(src)
var/dat = ""
var/list/dat = list()
files.RefreshResearch()
switch(screen) //A quick check to make sure you get the right screen when a device is disconnected.
if(2 to 2.9)
@@ -774,7 +774,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "List of Researched Technologies and Designs:"
dat += GetResearchListInfo()
user << browse("<TITLE>Research and Development Console</TITLE><HR>[dat]", "window=rdconsole;size=850x600")
user << browse("<TITLE>Research and Development Console</TITLE><HR>[dat.Join()]", "window=rdconsole;size=850x600")
onclose(user, "rdconsole")
/obj/machinery/computer/rdconsole/robotics

View File

@@ -105,6 +105,16 @@
return 1
/obj/machinery/clonepod/transhuman/process()
var/visible_message = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/meat in range(1, src))
qdel(meat)
biomass += 50
visible_message = 1 // Prevent chatspam if multiple meat are near
if(visible_message)
visible_message("[src] sucks in and processes the nearby biomass.")
if(stat & NOPOWER)
if(occupant)
locked = 0

View File

@@ -4,7 +4,7 @@
/obj/machinery/shield_capacitor
name = "shield capacitor"
desc = "Machine that charges a shield generator."
desc = "A machine that charges a shield generator."
icon = 'icons/obj/machines/shielding.dmi'
icon_state = "capacitor"
var/active = 0
@@ -19,6 +19,12 @@
var/charge_rate = 100000 //100 kW
var/obj/machinery/shield_gen/owned_gen
/obj/machinery/shield_capacitor/advanced
name = "advanced shield capacitor"
desc = "A machine that charges a shield generator. This version can store, input, and output more electricity."
max_charge = 12e6
max_charge_rate = 600000
/obj/machinery/shield_capacitor/emag_act(var/remaining_charges, var/mob/user)
if(prob(75))
src.locked = !src.locked

View File

@@ -1,6 +1,6 @@
/obj/machinery/shield_gen
name = "bubble shield generator"
desc = "Machine that generates an impenetrable field of energy when activated."
desc = "A machine that generates a field of energy optimized for blocking meteorites when activated."
icon = 'icons/obj/machines/shielding.dmi'
icon_state = "generator0"
var/active = 0
@@ -20,10 +20,15 @@
var/target_field_strength = 10
var/max_field_strength = 10
var/time_since_fail = 100
var/energy_conversion_rate = 0.0002 //how many renwicks per watt?
var/energy_conversion_rate = 0.0002 //how many renwicks per watt? Higher numbers equals more effiency.
var/z_range = 0 // How far 'up and or down' to extend the shield to, in z-levels. Only works on MultiZ supported z-levels.
use_power = 0 //doesn't use APC power
/obj/machinery/shield_gen/advanced
name = "advanced bubble shield generator"
desc = "A machine that generates a field of energy optimized for blocking meteorites when activated. This version comes with a more efficent shield matrix."
energy_conversion_rate = 0.0004
/obj/machinery/shield_gen/New()
spawn(1 SECOND)
if(anchored)
@@ -259,11 +264,14 @@
/obj/machinery/shield_gen/update_icon()
if(stat & BROKEN)
icon_state = "broke"
set_light(0)
else
if (src.active)
icon_state = "generator1"
set_light(4, 2, "#00CCFF")
else
icon_state = "generator0"
set_light(0)
//grab the border tiles in a circle around this machine
/obj/machinery/shield_gen/proc/get_shielded_turfs()

View File

@@ -7,8 +7,11 @@
/turf/space,
/turf/simulated/floor/outdoors,
)
/obj/machinery/shield_gen/external/New()
..()
/obj/machinery/shield_gen/external/advanced
name = "advanced hull shield generator"
desc = "A machine that generates a field of energy optimized for blocking meteorites when activated. This version comes with a more efficent shield matrix."
energy_conversion_rate = 0.0004
//Search for space turfs within range that are adjacent to a simulated turf.
/obj/machinery/shield_gen/external/get_shielded_turfs_on_z_level(var/turf/gen_turf)

View File

@@ -266,7 +266,9 @@
// Indigestable items are removed, and M is deleted.
/datum/belly/proc/digestion_death(var/mob/living/M)
is_full = 1
M.death(1)
//M.death(1) // "Stop it he's already dead..." Basically redundant and the reason behind screaming mouse carcasses.
if(M.ckey)
message_admins("[key_name(owner)] has digested [key_name(M)] in their [name] ([owner ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[owner.x];Y=[owner.y];Z=[owner.z]'>JMP</a>" : "null"])")
internal_contents -= M
// If digested prey is also a pred... anyone inside their bellies gets moved up.

View File

@@ -666,7 +666,8 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
//WickedTempest: Chakat Tempest
/obj/item/weapon/implant/reagent_generator/tempest
generated_reagent = "milk"
generated_reagents = list("milk" = 2)
reagent_name = "milk"
usable_volume = 1000
empty_message = list("Your breasts are almost completely drained!")
@@ -683,7 +684,8 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
//Hottokeeki: Belle Day
/obj/item/weapon/implant/reagent_generator/belle
generated_reagent = "milk"
generated_reagents = list("milk" = 2)
reagent_name = "milk"
usable_volume = 5000
empty_message = list("Your breasts and or udder feel almost completely drained!", "You're feeling a liittle on the empty side...")
@@ -702,7 +704,8 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
/obj/item/weapon/implant/reagent_generator/eldi
name = "lactation implant"
desc = "This is an implant that allows the user to lactate."
generated_reagent = "milk"
generated_reagents = list("milk" = 2)
reagent_name = "milk"
usable_volume = 1000
empty_message = list("Your breasts feel unusually empty.", "Your chest feels lighter - your milk supply is empty!", "Your milk reserves have run dry.", "Your grateful nipples ache as the last of your milk leaves them.")
@@ -718,7 +721,8 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
//Vorrarkul: Theodora Lindt
/obj/item/weapon/implant/reagent_generator/vorrarkul
generated_reagent = "chocolate_milk"
generated_reagents = list("chocolate_milk" = 2)
reagent_name = "chocalate milk"
usable_volume = 1000
empty_message = list("Your nipples are sore from being milked!")
@@ -739,7 +743,7 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
/obj/item/weapon/implant/reagent_generator/roiz
name = "egg laying implant"
desc = "This is an implant that allows the user to lay eggs."
generated_reagent = "egg"
generated_reagents = list("egg" = 2)
usable_volume = 500
transfer_amount = 50
@@ -801,12 +805,12 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
if(prob(15))
src.visible_message("<span class='notice'>[src] [pick(rimplant.random_emote)].</span>") // M-mlem.
rimplant.reagents.remove_reagent(rimplant.generated_reagent, rimplant.transfer_amount)
rimplant.reagents.remove_any(rimplant.transfer_amount)
/obj/item/weapon/implant/reagent_generator/pumila_apple
name = "apple laying implant"
desc = "This is an implant that allows the user to grow apples."
generated_reagent = "sugar" //This actually allows them to.
generated_reagents = list("sugar" = 2) //This actually allows them to.
usable_volume = 250 //Five apples. Let's not get /too/ crazy here.
transfer_amount = 50
@@ -866,10 +870,11 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
src.visible_message("<span class='notice'>[src] [pick(rimplant.short_emote_descriptor)] an apple.</span>",
"<span class='notice'>You [pick(rimplant.self_emote_descriptor)] an apple.</span>")
rimplant.reagents.remove_reagent(rimplant.generated_reagent, rimplant.transfer_amount)
rimplant.reagents.remove_any(rimplant.transfer_amount)
/*
/obj/item/weapon/implant/reagent_generator/pumila_nectar //Bugged. Two implants at once messes things up.
generated_reagent = "honey"
generated_reagents = list("honey" = 2)
reagent_name = "honey"
usable_volume = 5000
empty_message = list("You appear to be all out of nectar", "You feel as though you are lacking a majority of your nectar.")

View File

@@ -154,7 +154,6 @@
/obj/item/weapon/implant/reagent_generator/roiz/anoki
name = "egg laying implant"
desc = "This is an implant that allows the user to lay eggs."
generated_reagent = "egg"
usable_volume = 500
transfer_amount = 50
@@ -209,7 +208,6 @@
/obj/item/weapon/implant/reagent_generator/yw/mira
name = "lactation implant"
desc = "This is an implant that allows the user to lactate."
generated_reagent = "milk"
usable_volume = 1000
empty_message = list("Your breasts feel unusually empty.", "Your chest feels lighter - your milk supply is empty!", "Your milk reserves have run dry.", "Your grateful nipples ache as the last of your milk leaves them.")
@@ -228,7 +226,6 @@
/obj/item/weapon/implant/reagent_generator/yw/natalya
name = "lactation implant"
desc = "This is an implant that allows the user to lactate."
generated_reagent = "milk"
usable_volume = 1000
empty_message = list("Your breasts feel unusually empty.", "Your chest feels lighter - your milk supply is empty!", "Your milk reserves have run dry.", "Your grateful nipples ache as the last of your milk leaves them.")

View File

@@ -141,6 +141,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
now_pushing = 0
if(src.get_effective_size() > tmob.get_effective_size())
var/mob/living/carbon/human/H = src
if(H.flying)
return 1 //Silently pass without a message.
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You carefully slither around [tmob]."
tmob << "[src]'s huge tail slithers past beside you!"
@@ -166,6 +168,14 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
*/
/mob/living/proc/handle_micro_bump_other(var/mob/living/tmob)
ASSERT(istype(tmob)) // Baby don't hurt me
if(ishuman(src))
var/mob/living/carbon/human/P = src
if(P.flying) //If they're flying, don't do any special interactions.
return
if(ishuman(tmob))
var/mob/living/carbon/human/D = tmob
if(D.flying) //if the prey is flying, don't smush them.
return
if(src.a_intent == I_DISARM && src.canmove && !src.buckled)
// If bigger than them by at least 0.75, move onto them and print message.
@@ -190,7 +200,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
tmob.apply_damage(damage, HALLOSS)
tmob.resting = 1
var/mob/living/carbon/human/H = src
log_and_message_admins("has stomped on, [tmob] pinning them to the ground and dealing [damage] HALLOSS.") //Both humans and mobs, since stepping on mobs can be abused.
log_and_message_admins("has stomped on [tmob], pinning them to the ground and dealing [damage] HALLOSS.") //Both humans and mobs, since stepping on mobs can be abused.
admin_attack_log(src, tmob, "Pinned [tmob.name] under foot for [damage] HALLOSS.", "Was pinned under foot by [src.name] for [damage] HALLOSS.", "Pinned [tmob.name] under foot for [damage] HALLOSS.")
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You push down on [tmob] with your tail, pinning them down under you!"

BIN
icons/effects/128x48.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
icons/effects/128x72_vr.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
icons/effects/species_a.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 179 KiB

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