Merge branch 'master' of https://github.com/VOREStation/VOREStation
# Conflicts: # config/custom_items.txt
@@ -6,6 +6,7 @@
|
||||
#define OXY "oxy"
|
||||
#define CLONE "clone"
|
||||
#define HALLOSS "halloss"
|
||||
#define ELECTROCUTE "electrocute"
|
||||
|
||||
#define CUT "cut"
|
||||
#define BRUISE "bruise"
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -135,3 +135,4 @@
|
||||
name = "hand greatclaw"
|
||||
force = 20
|
||||
armor_penetration = 20
|
||||
pry = 1
|
||||
@@ -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"])
|
||||
|
||||
@@ -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)
|
||||
@@ -99,12 +99,12 @@
|
||||
if(R.is_stack)
|
||||
if(max_sheets && max_sheets > 0)
|
||||
max_sheets = min(max_sheets, R.max_stack) // Limit to the max allowed by stack type.
|
||||
multiplier_string += "<br>"
|
||||
multiplier_string += "<br>"
|
||||
for(var/i = 5;i<max_sheets;i*=2) //5,10,20,40...
|
||||
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)
|
||||
|
||||
@@ -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()
|
||||
222
code/game/machinery/vr_console.dm
Normal 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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) //todo pooling?
|
||||
if(reinf) new /obj/item/stack/rods(loc)
|
||||
index++
|
||||
else
|
||||
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)
|
||||
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)
|
||||
var/obj/item/stack/material/mats = 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"
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -243,9 +248,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
var/turf/location = get_turf(src)
|
||||
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
|
||||
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)
|
||||
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)
|
||||
|
||||
/mob/observer/dead/can_use_hands() return 0
|
||||
/mob/observer/dead/is_active() return 0
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
@@ -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]."
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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(..())
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
switch(T.identifying_gender)
|
||||
if(MALE)
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_him = "her"
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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,7 +530,16 @@ 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")
|
||||
standing.color = w_uniform.color
|
||||
|
||||
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
|
||||
if(w_uniform.blood_DNA)
|
||||
@@ -591,7 +603,15 @@ var/global/list/damage_icon_parts = list()
|
||||
bloodsies.color = gloves.blood_color
|
||||
standing.overlays += bloodsies
|
||||
gloves.screen_loc = ui_gloves
|
||||
standing.color = gloves.color
|
||||
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
|
||||
if(blood_DNA)
|
||||
@@ -612,7 +632,15 @@ 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]")
|
||||
standing.color = glasses.color
|
||||
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
|
||||
|
||||
else
|
||||
@@ -640,7 +668,15 @@ 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]")
|
||||
standing.color = l_ear.color
|
||||
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
|
||||
|
||||
if(r_ear)
|
||||
@@ -654,7 +690,15 @@ 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]")
|
||||
standing.color = r_ear.color
|
||||
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
|
||||
|
||||
overlays_standing[EARS_LAYER] = both
|
||||
@@ -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
|
||||
standing.color = shoes.color
|
||||
|
||||
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,7 +809,15 @@ var/global/list/damage_icon_parts = list()
|
||||
if(hat.on && light_overlay_cache[cache_key])
|
||||
standing.overlays |= light_overlay_cache[cache_key]
|
||||
|
||||
standing.color = head.color
|
||||
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
|
||||
|
||||
else
|
||||
@@ -790,7 +852,15 @@ 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]")
|
||||
|
||||
standing.color = belt.color
|
||||
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
|
||||
else
|
||||
@@ -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,7 +957,15 @@ 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]")
|
||||
standing.color = wear_mask.color
|
||||
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 )
|
||||
var/image/bloodsies = image("icon" = species.get_blood_mask(src), "icon_state" = "maskblood")
|
||||
@@ -918,7 +1007,15 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
//apply color
|
||||
var/image/standing = image(icon = overlay_icon, icon_state = overlay_state)
|
||||
standing.color = back.color
|
||||
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
|
||||
overlays_standing[BACK_LAYER] = standing
|
||||
@@ -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)
|
||||
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)
|
||||
var/tail_icon_a = new/icon(species_tail_anim_a)
|
||||
tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_MULTIPLY)
|
||||
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
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
/mob
|
||||
var/vantag_hud = 0 // Do I have the HUD enabled?
|
||||
var/flying = 0 //Allows flight
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
applying.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_MULTIPLY)
|
||||
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
|
||||
|
||||
|
||||
102
code/modules/paperwork/paperplane.dm
Normal 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>")
|
||||
@@ -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>")
|
||||
emagged = 1
|
||||
locked = 0
|
||||
to_chat(user,"<span class='notice'>You emag the APC interface.</span>")
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/machinery/power/apc/attack_hand(mob/user)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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///////
|
||||
///////////////////////////////
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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
|
After Width: | Height: | Size: 1.9 KiB |
BIN
icons/effects/128x72_vr.dmi
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
icons/effects/species_a.dmi
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 179 KiB |