Merge branch 'master' of https://github.com/PolarisSS13/Polaris into engineering_sprites

This commit is contained in:
Cerebulon
2017-03-29 06:24:06 +01:00
184 changed files with 5575 additions and 4668 deletions
+6 -3
View File
@@ -228,13 +228,16 @@ mob/living/carbon/human/airflow_hit(atom/A)
var/b_loss = airflow_speed * vsc.airflow_damage
var/blocked = run_armor_check(BP_HEAD,"melee")
apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, 0, "Airflow")
var/soaked = get_armor_soak(BP_HEAD,"melee")
apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, soaked, 0, "Airflow")
blocked = run_armor_check(BP_TORSO,"melee")
apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, 0, "Airflow")
soaked = get_armor_soak(BP_TORSO,"melee")
apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, soaked, 0, "Airflow")
blocked = run_armor_check(BP_GROIN,"melee")
apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, 0, "Airflow")
soaked = get_armor_soak(BP_GROIN,"melee")
apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, soaked, 0, "Airflow")
if(airflow_speed > 10)
Paralyse(round(airflow_speed * vsc.airflow_stun))
+4 -1
View File
@@ -7,4 +7,7 @@
#define TURF_HAS_EDGES 64
#define TURF_HAS_CORNERS 128
#define TURF_IS_FRAGILE 256
#define TURF_ACID_IMMUNE 512
#define TURF_ACID_IMMUNE 512
#define isCardinal(x) (x == NORTH || x == SOUTH || x == EAST || x == WEST)
#define isDiagonal(x) (x == NORTHEAST || x == SOUTHEAST || x == NORTHWEST || x == SOUTHWEST)
+41 -57
View File
@@ -753,9 +753,6 @@ proc/GaussRandRound(var/sigma,var/roundto)
C.x_pos = (T.x - trg_min_x)
C.y_pos = (T.y - trg_min_y)
var/list/fromupdate = new/list()
var/list/toupdate = new/list()
moving:
for (var/turf/T in refined_src)
var/datum/coords/C_src = refined_src[T]
@@ -763,19 +760,40 @@ proc/GaussRandRound(var/sigma,var/roundto)
var/datum/coords/C_trg = refined_trg[B]
if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos)
var/old_dir1 = T.dir
var/old_icon_state1 = T.icon_state
var/old_icon1 = T.icon
var/old_overlays = T.overlays.Copy()
var/old_underlays = T.underlays.Copy()
//You can stay, though.
if(istype(T,/turf/space))
refined_src -= T
refined_trg -= B
continue moving
var/turf/X = B.ChangeTurf(T.type)
X.set_dir(old_dir1)
X.icon_state = old_icon_state1
X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
X.overlays = old_overlays
X.underlays = old_underlays
var/turf/X //New Destination Turf
//Are we doing shuttlework? Just to save another type check later.
var/shuttlework = 0
//Shuttle turfs handle their own fancy moving.
if(istype(T,/turf/simulated/shuttle))
shuttlework = 1
var/turf/simulated/shuttle/SS = T
if(!SS.landed_holder) SS.landed_holder = new(turf = SS)
X = SS.landed_holder.land_on(B)
//Generic non-shuttle turf move.
else
var/old_dir1 = T.dir
var/old_icon_state1 = T.icon_state
var/old_icon1 = T.icon
var/old_overlays = T.overlays.Copy()
var/old_underlays = T.underlays.Copy()
X = B.ChangeTurf(T.type)
X.set_dir(old_dir1)
X.icon_state = old_icon_state1
X.icon = old_icon1
X.overlays = old_overlays
X.underlays = old_underlays
//Move the air from source to dest
var/turf/simulated/ST = T
if(istype(ST) && ST.zone)
var/turf/simulated/SX = X
@@ -784,55 +802,22 @@ proc/GaussRandRound(var/sigma,var/roundto)
SX.air.copy_from(ST.zone.air)
ST.zone.remove(ST)
/* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */
if(direction && findtext(X.icon_state, "swall_s"))
// Spawn a new shuttle corner object
var/obj/corner = new()
corner.loc = X
corner.density = 1
corner.anchored = 1
corner.icon = X.icon
corner.icon_state = replacetext(X.icon_state, "_s", "_f")
corner.tag = "delete me"
corner.name = "wall"
// Find a new turf to take on the property of
var/turf/nextturf = get_step(corner, direction)
if(!nextturf || !istype(nextturf, /turf/space))
nextturf = get_step(corner, turn(direction, 180))
// Take on the icon of a neighboring scrolling space icon
X.icon = nextturf.icon
X.icon_state = nextturf.icon_state
//Move the objects. Not forceMove because the object isn't "moving" really, it's supposed to be on the "same" turf.
for(var/obj/O in T)
// Reset the shuttle corners
if(O.tag == "delete me")
X.icon = 'icons/turf/shuttle.dmi'
X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state
X.name = "wall"
qdel(O) // prevents multiple shuttle corners from stacking
continue
if(!istype(O,/obj)) continue
O.loc = X
//Move the mobs unless it's an AI eye or other eye type.
for(var/mob/M in T)
if(!istype(M,/mob) || istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable
if(istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable
M.loc = X
// var/area/AR = X.loc
if(shuttlework)
var/turf/simulated/shuttle/SS = T
SS.landed_holder.leave_turf()
// if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn
// X.opacity = !X.opacity
// X.SetOpacity(!X.opacity)
else if(turftoleave)
T.ChangeTurf(turftoleave)
toupdate += X
if(turftoleave)
fromupdate += T.ChangeTurf(turftoleave)
else
T.ChangeTurf(get_base_turf_by_area(T))
@@ -840,7 +825,6 @@ proc/GaussRandRound(var/sigma,var/roundto)
refined_trg -= B
continue moving
proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
if(!original)
return null
+3 -1
View File
@@ -108,6 +108,7 @@ var/const/ERT_FREQ = 1345
var/const/AI_FREQ = 1343
var/const/DTH_FREQ = 1341
var/const/SYND_FREQ = 1213
var/const/RAID_FREQ = 1277
var/const/ENT_FREQ = 1461 //entertainment frequency. This is not a diona exclusive frequency.
// department channels
@@ -133,6 +134,7 @@ var/list/radiochannels = list(
"Response Team" = ERT_FREQ,
"Special Ops" = DTH_FREQ,
"Mercenary" = SYND_FREQ,
"Raider" = RAID_FREQ,
"Supply" = SUP_FREQ,
"Service" = SRV_FREQ,
"AI Private" = AI_FREQ,
@@ -145,7 +147,7 @@ var/list/radiochannels = list(
var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ)
// Antag channels, i.e. Syndicate
var/list/ANTAG_FREQS = list(SYND_FREQ)
var/list/ANTAG_FREQS = list(SYND_FREQ, RAID_FREQ)
//Department channels, arranged lexically
var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ)
+1 -1
View File
@@ -156,7 +156,7 @@ datum/supply_packs/costumes/witch
/obj/item/clothing/under/wedding/bride_blue,
/obj/item/clothing/under/wedding/bride_red,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/clothing/under/dress/sundress,
/obj/item/clothing/under/sundress,
/obj/item/clothing/under/dress/dress_green,
/obj/item/clothing/under/dress/dress_pink,
/obj/item/clothing/under/dress/dress_orange,
+21
View File
@@ -66,6 +66,27 @@
containername = "Surgery crate"
access = access_medical
/datum/supply_packs/med/deathalarm
name = "Death Alarm crate"
contains = list(
/obj/item/weapon/storage/box/cdeathalarm_kit,
/obj/item/weapon/storage/box/cdeathalarm_kit
)
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Death Alarm crate"
access = access_medical
/datum/supply_packs/med/clotting
name = "Clotting Medicine crate"
contains = list(
/obj/item/weapon/storage/firstaid/clotting
)
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Clotting Medicine crate"
access = access_medical
/datum/supply_packs/med/sterile
name = "Sterile equipment crate"
contains = list(
+10
View File
@@ -19,6 +19,16 @@
item_cost = 5
path = /obj/item/weapon/storage/box/ambrosia
/datum/uplink_item/item/medical/clotting
name = "Clotting Medicine injector"
item_cost = 10
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting
/datum/uplink_item/item/medical/bonemeds
name = "Bone Repair injector"
item_cost = 10
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed
/datum/uplink_item/item/medical/ambrosiadeusseeds
name = "Box of 7x ambrosia deus seed packets"
item_cost = 10
+8 -5
View File
@@ -43,12 +43,15 @@
/datum/antagonist/proc/create_radio(var/freq, var/mob/living/carbon/human/player)
var/obj/item/device/radio/R
if(freq == SYND_FREQ)
R = new/obj/item/device/radio/headset/syndicate(player)
else
R = new/obj/item/device/radio/headset(player)
switch(freq)
if(SYND_FREQ)
R = new/obj/item/device/radio/headset/syndicate(player)
if(RAID_FREQ)
R = new/obj/item/device/radio/headset/raider(player)
else
R = new/obj/item/device/radio/headset(player)
R.set_frequency(freq)
R.set_frequency(freq)
player.equip_to_slot_or_del(R, slot_l_ear)
return R
+1 -1
View File
@@ -232,7 +232,7 @@ var/datum/antagonist/raider/raiders
W.handle_item_insertion(id)
player.equip_to_slot_or_del(W, slot_wear_id)
spawn_money(rand(50,150)*10,W)
create_radio(SYND_FREQ, player)
create_radio(RAID_FREQ, player)
return 1
+1 -1
View File
@@ -305,7 +305,7 @@
if(subject.isSynthetic())
scantemp = "Error: Majority of subject is non-organic."
return
if (subject.suiciding == 1)
if (subject.suiciding)
scantemp = "Error: Subject's brain is not responding to scanning stimuli."
return
if ((!subject.ckey) || (!subject.client))
+2 -2
View File
@@ -13,12 +13,12 @@
if(src.locked) return
..()
return
/obj/machinery/door/unpowered/emag_act()
return -1
/obj/machinery/door/unpowered/shuttle
icon = 'icons/turf/shuttle.dmi'
icon = 'icons/turf/shuttle_white.dmi'
name = "door"
icon_state = "door1"
opacity = 1
@@ -374,6 +374,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(SYND_FREQ)
blackbox.msg_syndicate += blackbox_msg
if(RAID_FREQ)
blackbox.msg_raider += blackbox_msg
if(SUP_FREQ)
blackbox.msg_cargo += blackbox_msg
if(SRV_FREQ)
@@ -554,6 +556,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(SYND_FREQ)
blackbox.msg_syndicate += blackbox_msg
if(RAID_FREQ)
blackbox.msg_raider += blackbox_msg
if(SUP_FREQ)
blackbox.msg_cargo += blackbox_msg
if(SRV_FREQ)
+1 -1
View File
@@ -226,7 +226,7 @@
delete_me = 1
/obj/effect/landmark/costume/cutewitch/New()
new /obj/item/clothing/under/dress/sundress(src.loc)
new /obj/item/clothing/under/sundress(src.loc)
new /obj/item/clothing/head/witchwig(src.loc)
new /obj/item/weapon/staff/broom(src.loc)
delete_me = 1
+1
View File
@@ -44,6 +44,7 @@
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N
var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
var/list/armorsoak = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
var/list/allowed = null //suit storage stuff.
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
var/zoomdevicename = null //name used for message when binoculars/scope is used
@@ -19,6 +19,12 @@
origin_tech = list(TECH_ILLEGAL = 3)
syndie = 1//Signifies that it de-crypts Syndicate transmissions
/obj/item/device/encryptionkey/raider
icon_state = "cypherkey"
channels = list("Raider" = 1)
origin_tech = list(TECH_ILLEGAL = 2)
syndie = 1
/obj/item/device/encryptionkey/binary
icon_state = "cypherkey"
translate_binary = 1
@@ -75,6 +75,15 @@
syndie = 1
ks1type = /obj/item/device/encryptionkey/syndicate
/obj/item/device/radio/headset/raider
origin_tech = list(TECH_ILLEGAL = 2)
syndie = 1
ks1type = /obj/item/device/encryptionkey/raider
/obj/item/device/radio/headset/raider/initialize()
..()
set_frequency(RAID_FREQ)
/obj/item/device/radio/headset/binary
origin_tech = list(TECH_ILLEGAL = 3)
ks1type = /obj/item/device/encryptionkey/binary
@@ -289,6 +298,7 @@
desc = "The headset of the boss's boss."
icon_state = "com_headset"
item_state = "headset"
centComm = 1
// freerange = 1
ks2type = /obj/item/device/encryptionkey/ert
@@ -27,6 +27,8 @@
/obj/item/device/radio/intercom/specops
name = "\improper Spec Ops intercom"
frequency = ERT_FREQ
subspace_transmission = 1
centComm = 1
/obj/item/device/radio/intercom/department
canhear_range = 5
@@ -81,6 +83,17 @@
..()
internal_channels[num2text(SYND_FREQ)] = list(access_syndicate)
/obj/item/device/radio/intercom/raider
name = "illicit intercom"
desc = "Pirate radio, but not in the usual sense of the word."
frequency = RAID_FREQ
subspace_transmission = 1
syndie = 1
/obj/item/device/radio/intercom/raider/New()
..()
internal_channels[num2text(RAID_FREQ)] = list(access_syndicate)
/obj/item/device/radio/intercom/Destroy()
processing_objects -= src
..()
@@ -40,6 +40,7 @@ var/global/list/default_medbay_channels = list(
var/list/channels = list() //see communications.dm for full list. First channel is a "default" for :h
var/subspace_transmission = 0
var/syndie = 0//Holder to see if it's a syndicate encrypted radio
var/centComm = 0//Holder to see if it's a CentComm encrypted radio
flags = CONDUCT
slot_flags = SLOT_BELT
throw_speed = 2
@@ -508,6 +509,9 @@ var/global/list/default_medbay_channels = list(
if(freq in ANTAG_FREQS)
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
return -1
if(freq in CENT_FREQS)
if(!(src.centComm))//Checks to see if it's allowed on that frequency, based on the encryption keys
return -1
if (!on)
return -1
if (!freq) //recieved on main frequency
@@ -452,23 +452,27 @@ the implant may become unstable and either pre-maturely inject the subject or si
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
//give the syndies a bit of stealth
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "General")
// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
else
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "General")
// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
qdel(a)
processing_objects.Remove(src)
if ("emp")
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
var/name = prob(50) ? t.name : pick(teleportlocs)
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "General")
// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
qdel(a)
else
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "General")
// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
qdel(a)
processing_objects.Remove(src)
@@ -68,3 +68,40 @@
qdel(src)
user.put_in_hands(finished)
update_icon(user)
/obj/item/woodcirclet
name = "wood circlet"
desc = "A small wood circlet for making a flower crown."
icon = 'icons/obj/buildingobject.dmi'
icon_state = "woodcirclet"
w_class = ITEMSIZE_SMALL
/obj/item/woodcirclet/attackby(obj/item/W as obj, mob/user as mob)
var/obj/item/complete
if(istype(W,/obj/item/seeds/poppyseed))
user << "You attach the poppy to the circlet and create a beautiful flower crown."
complete = new /obj/item/clothing/head/poppy_crown(get_turf(user))
user.drop_from_inventory(W)
user.drop_from_inventory(src)
qdel(W)
qdel(src)
user.put_in_hands(complete)
return
else if(istype(W,/obj/item/seeds/sunflowerseed))
user << "You attach the sunflower to the circlet and create a beautiful flower crown."
complete = new /obj/item/clothing/head/sunflower_crown(get_turf(user))
user.drop_from_inventory(W)
user.drop_from_inventory(src)
qdel(W)
qdel(src)
user.put_in_hands(complete)
return
else if(istype(W,/obj/item/seeds/lavenderseed))
user << "You attach the lavender to the circlet and create a beautiful flower crown."
complete = new /obj/item/clothing/head/lavender_crown(get_turf(user))
user.drop_from_inventory(W)
user.drop_from_inventory(src)
qdel(W)
qdel(src)
user.put_in_hands(complete)
return
@@ -35,6 +35,13 @@
icon_state = "switchblade"
unbreakable = 1
/obj/item/weapon/material/butterfly/boxcutter
name = "box cutter"
desc = "A thin, inexpensive razor-blade knife designed to open cardboard boxes."
icon_state = "boxcutter"
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
thrown_force_divisor = 0.2 // 4 when thrown with weight 20 (steel)
/obj/item/weapon/material/butterfly/attack_self(mob/user)
active = !active
if(active)
@@ -90,7 +90,7 @@
if(affecting.take_damage(force, 0))
H.UpdateDamageIcon()
H.updatehealth()
if(affecting.can_feel_pain())
if(affecting.organ_can_feel_pain())
H.Weaken(3)
return
check -= picked
@@ -126,6 +126,7 @@
new /obj/item/weapon/storage/pill_bottle/dylovene(src)
new /obj/item/weapon/storage/pill_bottle/tramadol(src)
new /obj/item/weapon/storage/pill_bottle/spaceacillin(src)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
new /obj/item/stack/medical/splint(src)
return
@@ -150,6 +151,19 @@
new /obj/item/stack/medical/advanced/bruise_pack(src)
return
/obj/item/weapon/storage/firstaid/clotting
name = "clotting kit"
desc = "Contains chemicals to stop bleeding."
max_storage_space = ITEMSIZE_COST_SMALL * 7
/obj/item/weapon/storage/firstaid/clotting/New()
..()
if (empty)
return
for(var/i = 1 to 8)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
return
/*
* Pill Bottles
*/
+123 -16
View File
@@ -172,7 +172,8 @@
/obj/item/weapon/weldingtool/examine(mob/user)
if(..(user, 0))
user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
if(max_fuel)
user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
@@ -234,18 +235,22 @@
/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
if(!proximity) return
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding)
O.reagents.trans_to_obj(src, max_fuel)
user << "<span class='notice'>Welder refueled</span>"
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding)
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
user << "<span class='danger'>You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.</span>"
var/obj/structure/reagent_dispensers/fueltank/tank = O
tank.explode()
return
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !welding)
if(!welding && max_fuel)
O.reagents.trans_to_obj(src, max_fuel)
user << "<span class='notice'>Welder refueled</span>"
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
else if(!welding)
user << "<span class='notice'>[src] doesn't use fuel.</span>"
return
else
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
user << "<span class='danger'>You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.</span>"
var/obj/structure/reagent_dispensers/fueltank/tank = O
tank.explode()
return
if (src.welding)
remove_fuel(1)
var/turf/location = get_turf(user)
@@ -286,7 +291,7 @@
/obj/item/weapon/weldingtool/update_icon()
..()
icon_state = welding ? "welder1" : "welder"
icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]"
var/mob/M = loc
if(istype(M))
M.update_inv_l_hand()
@@ -313,7 +318,8 @@
processing_objects |= src
else
if(M)
M << "<span class='notice'>You need more welding fuel to complete this task.</span>"
var/msg = max_fuel ? "welding fuel" : "charge"
M << "<span class='notice'>You need more [msg] to complete this task.</span>"
return
//Otherwise
else if(!set_welding && welding)
@@ -370,7 +376,6 @@
user.disabilities &= ~NEARSIGHTED
return
/obj/item/weapon/weldingtool/largetank
name = "industrial welding tool"
max_fuel = 40
@@ -405,6 +410,108 @@
if(get_fuel() < max_fuel && nextrefueltick < world.time)
nextrefueltick = world.time + 10
reagents.add_reagent("fuel", 1)
/*
* Electric/Arc Welder
*/
/obj/item/weapon/weldingtool/electric //AND HIS WELDING WAS ELECTRIC
name = "electric welding tool"
icon_state = "arcwelder"
max_fuel = 0 //We'll handle the consumption later.
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
var/charge_cost = 24 //The rough equivalent of 1 unit of fuel, based on us wanting 10 welds per battery
var/cell_type = null
var/use_external_power = 0 //If in a borg or hardsuit, this needs to = 1
/obj/item/weapon/weldingtool/electric/New()
..()
if(cell_type)
power_supply = new cell_type(src)
else
power_supply = new /obj/item/weapon/cell/device(src)
update_icon()
/obj/item/weapon/weldingtool/electric/examine(mob/user)
..()
if(power_supply)
user << text("\icon[] [] has [] charge left.", src, src.name, get_fuel())
else
user << text("\icon[] [] has power for no power cell!", src, src.name)
/obj/item/weapon/weldingtool/electric/get_fuel()
if(use_external_power)
var/obj/item/weapon/cell/external = get_external_power_supply()
return external.charge
else if(power_supply)
return power_supply.charge
else
return 0
/obj/item/weapon/weldingtool/electric/remove_fuel(var/amount = 1, var/mob/M = null)
if(!welding)
return 0
if(get_fuel() >= amount)
power_supply.checked_use(charge_cost)
if(use_external_power)
var/obj/item/weapon/cell/external = get_external_power_supply()
if(!external || !external.use(charge_cost)) //Take power from the borg...
power_supply.give(charge_cost) //Give it back to the cell.
if(M)
eyecheck(M)
return 1
else
if(M)
M << "<span class='notice'>You need more energy to complete this task.</span>"
return 0
/obj/item/weapon/weldingtool/electric/attack_hand(mob/user as mob)
if(user.get_inactive_hand() == src)
if(power_supply)
power_supply.update_icon()
user.put_in_hands(power_supply)
power_supply = null
user << "<span class='notice'>You remove the cell from the [src].</span>"
setWelding(0)
update_icon()
return
..()
else
return ..()
/obj/item/weapon/weldingtool/electric/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/weapon/cell))
if(istype(W, /obj/item/weapon/cell/device))
if(!power_supply)
user.drop_item()
W.loc = src
power_supply = W
user << "<span class='notice'>You install a cell in \the [src].</span>"
update_icon()
else
user << "<span class='notice'>\The [src] already has a cell.</span>"
else
user << "<span class='notice'>\The [src] cannot use that type of cell.</span>"
else
..()
/obj/item/weapon/weldingtool/electric/proc/get_external_power_supply()
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
return R.cell
if(istype(src.loc, /obj/item/rig_module))
var/obj/item/rig_module/module = src.loc
if(module.holder && module.holder.wearer)
var/mob/living/carbon/human/H = module.holder.wearer
if(istype(H) && H.back)
var/obj/item/weapon/rig/suit = H.back
if(istype(suit))
return suit.cell
return null
/obj/item/weapon/weldingtool/electric/mounted
use_external_power = 1
/*
* Crowbar
*/
+5 -1
View File
@@ -77,11 +77,15 @@
//armour
var/blocked = L.run_armor_check(target_zone, "melee")
var/soaked = L.get_armor_soak(target_zone, "melee")
if(blocked >= 100)
return
if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src))
if(soaked >= 30)
return
if(!L.apply_damage(30, BRUTE, target_zone, blocked, soaked, used_weapon=src))
return 0
//trap the victim in place
+1 -1
View File
@@ -174,7 +174,7 @@
return 0
if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
return 0
if (issilicon(user))
if (isAI(user))
user << "<span class='notice'>You need hands for this.</span>"
return 0
return 1
@@ -45,7 +45,7 @@
/obj/structure/closet/chefcloset/New()
..()
new /obj/item/clothing/under/dress/sundress(src)
new /obj/item/clothing/under/sundress(src)
new /obj/item/clothing/under/waiter(src)
new /obj/item/clothing/under/waiter(src)
new /obj/item/device/radio/headset/headset_service(src)
@@ -150,20 +150,22 @@
var/def_zone = ran_zone()
var/blocked = occupant.run_armor_check(def_zone, "melee")
var/soaked = occupant.get_armor_soak(def_zone, "melee")
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, blocked)
occupant.apply_effect(6, WEAKEN, blocked)
occupant.apply_effect(6, STUTTER, blocked)
occupant.apply_damage(10, BRUTE, def_zone, blocked)
occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked)
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living))
var/mob/living/victim = A
def_zone = ran_zone()
blocked = victim.run_armor_check(def_zone, "melee")
soaked = victim.get_armor_soak(def_zone, "melee")
victim.apply_effect(6, STUN, blocked)
victim.apply_effect(6, WEAKEN, blocked)
victim.apply_effect(6, STUTTER, blocked)
victim.apply_damage(10, BRUTE, def_zone, blocked)
victim.apply_damage(10, BRUTE, def_zone, blocked, soaked)
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
/obj/structure/bed/chair/office/light
@@ -149,20 +149,22 @@
var/def_zone = ran_zone()
var/blocked = occupant.run_armor_check(def_zone, "melee")
var/soaked = occupant.get_armor_soak(def_zone, "melee")
occupant.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, blocked)
occupant.apply_effect(6, WEAKEN, blocked)
occupant.apply_effect(6, STUTTER, blocked)
occupant.apply_damage(10, BRUTE, def_zone)
occupant.apply_damage(10, BRUTE, def_zone, soaked)
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living))
var/mob/living/victim = A
def_zone = ran_zone()
blocked = victim.run_armor_check(def_zone, "melee")
soaked = victim.get_armor_soak(def_zone, "melee")
victim.apply_effect(6, STUN, blocked)
victim.apply_effect(6, WEAKEN, blocked)
victim.apply_effect(6, STUTTER, blocked)
victim.apply_damage(10, BRUTE, def_zone)
victim.apply_damage(10, BRUTE, def_zone, soaked)
if(pulling)
occupant.visible_message("<span class='danger'>[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!</span>")
+35 -5
View File
@@ -1,18 +1,48 @@
/obj/structure/shuttle
name = "shuttle"
icon = 'icons/turf/shuttle.dmi'
icon = 'icons/turf/shuttle_parts.dmi'
/obj/structure/shuttle/window
name = "shuttle window"
icon = 'icons/obj/podwindows.dmi'
icon_state = "1"
icon_state = "0_0" //The states are a bitflag for connecting window directions, then connecting shuttle wall directions
density = 1
opacity = 0
anchored = 1
CanPass(atom/movable/mover, turf/target, height, air_group)
if(!height || air_group) return 0
else return ..()
var/window_flags = 0 // Bitflags to indicate connected windows
var/wall_flags = 0 // Bitflags to indicate connected walls
/obj/structure/shuttle/window/CanPass(atom/movable/mover, turf/target, height, air_group)
if(!height || air_group) return 0
else return ..()
/obj/structure/shuttle/window/initialize()
..()
auto_join()
/obj/structure/shuttle/window/proc/auto_join()
match_windows(NORTH, NORTH)
match_windows(EAST, EAST)
match_windows(SOUTH, SOUTH)
match_windows(WEST, WEST)
icon_state = "[window_flags]_[wall_flags]"
return icon_state
/obj/structure/shuttle/window/proc/match_windows(direction, flag, mask=0)
var/turf/adj = get_step(src, direction)
if(istype(adj,/turf/simulated/shuttle/wall))
wall_flags |= flag // turn on the bit flag
else
var/obj/structure/shuttle/window/window = locate(src.type) in adj
if(window)
window_flags |= flag // turn on the bit flag
else
window_flags &= ~flag // turn off the bit flag
wall_flags &= ~flag // turn off the bit flag
/obj/structure/shuttle/engine
name = "engine"
+2
View File
@@ -178,3 +178,5 @@
this.blood_DNA["UNKNOWN BLOOD"] = "X*"
else if( istype(M, /mob/living/silicon/robot ))
new /obj/effect/decal/cleanable/blood/oil(src)
else if(ishuman(M))
add_blood(M)
+179 -42
View File
@@ -5,79 +5,216 @@
/turf/simulated/floor/diona/attackby()
return
//Shuttle Floors
/obj/landed_holder
name = "landed turf holder"
desc = "holds all the info about the turf this turf 'landed on'"
var/turf/turf_type
var/turf/simulated/shuttle/my_turf
var/image/turf_image
New(var/location = null, var/turf/simulated/shuttle/turf)
my_turf = turf
/obj/landed_holder/proc/land_on(var/turf/T)
//Gather destination information
var/old_dest_type = T.type
var/old_dest_dir = T.dir
var/old_dest_icon_state = T.icon_state
var/old_dest_icon = T.icon
var/list/old_dest_overlays = T.overlays.Copy()
var/list/old_dest_underlays = T.underlays.Copy()
//Set the destination to be like us
T.Destroy()
var/turf/simulated/shuttle/new_dest = T.ChangeTurf(my_turf.type,,1)
new_dest.set_dir(my_turf.dir)
new_dest.icon_state = my_turf.icon_state
new_dest.icon = my_turf.icon
new_dest.overlays = my_turf.overlays
new_dest.underlays = my_turf.underlays
//Shuttle specific stuff
new_dest.interior_corner = my_turf.interior_corner
new_dest.takes_underlays = my_turf.takes_underlays
new_dest.under_turf = my_turf.under_turf
new_dest.join_flags = my_turf.join_flags
new_dest.join_group = my_turf.join_group
//Tell the new turf about what was there before
new_dest.landed_holder = new(turf = new_dest)
new_dest.landed_holder.turf_type = old_dest_type
new_dest.landed_holder.dir = old_dest_dir
new_dest.landed_holder.icon = old_dest_icon
new_dest.landed_holder.icon_state = old_dest_icon_state
new_dest.landed_holder.overlays = old_dest_overlays
new_dest.landed_holder.underlays = old_dest_underlays
//Update underlays if necessary (interior corners won't have changed).
if(new_dest.takes_underlays && !new_dest.interior_corner)
new_dest.underlay_update()
return new_dest
/obj/landed_holder/proc/leave_turf()
var/turf/new_source
//Change our source to whatever it was before
if(turf_type)
new_source = my_turf.ChangeTurf(turf_type,,1)
new_source.set_dir(dir)
new_source.icon_state = icon_state
new_source.icon = icon
new_source.overlays = overlays
new_source.underlays = underlays
else
new_source = my_turf.ChangeTurf(get_base_turf_by_area(my_turf),,1)
return new_source
/turf/simulated/shuttle
name = "shuttle"
icon = 'icons/turf/shuttle.dmi'
icon = 'icons/turf/shuttle_white.dmi'
thermal_conductivity = 0.05
heat_capacity = 0
layer = 2
/turf/simulated/shuttle/wall
name = "wall"
icon_state = "wall1"
opacity = 1
density = 1
blocks_air = 1
var/obj/landed_holder/landed_holder
var/interior_corner = 0
var/takes_underlays = 0
var/turf/under_turf //Underlay override turf path.
var/join_flags = 0 //Bitstring to represent adjacency of joining walls
var/join_group = "shuttle" //A tag for what other walls to join with. Null if you don't want them to.
/turf/simulated/shuttle/wall/voidcraft
name = "voidcraft wall"
icon = 'icons/turf/voidcraft_walls.dmi'
icon_state = "voidcraft_wall_alone"
var/stripe_color = null // If set, generates a colored stripe overlay. Accepts #XXXXXX as input.
/turf/simulated/shuttle/wall/voidcraft/red
stripe_color = "#FF0000"
/turf/simulated/shuttle/wall/voidcraft/blue
stripe_color = "#0000FF"
/turf/simulated/shuttle/wall/voidcraft/green
stripe_color = "#00FF00"
/turf/simulated/shuttle/wall/voidcraft/New()
/turf/simulated/shuttle/Destroy()
landed_holder = null
..()
update_icon()
/turf/simulated/shuttle/wall/voidcraft/update_icon()
var/list/icon_states = icon_states(src.icon)
if(("[icon_state]_stripe" in icon_states) && stripe_color)
overlays.Cut()
var/image/I = image(icon = src.icon, dir = src.dir, icon_state = "[icon_state]_stripe")
if(stripe_color)
I.color = stripe_color
overlays.Add(I)
/turf/simulated/shuttle/proc/underlay_update()
if(!takes_underlays)
//Basically, if it's not forced, and we don't care, don't do it.
return 0
var/turf/under //May be a path or a turf
//Mapper wanted something specific
if(under_turf)
under = under_turf
//Well if this isn't our first rodeo, we know EXACTLY what we landed on, and it looks like this.
if(landed_holder && !interior_corner)
underlays.Cut()
underlays += image(landed_holder,layer=FLOAT_LAYER)
return
if(!under)
var/turf/T1
var/turf/T2
var/turf/T3
T1 = get_step(src, turn(join_flags,135)) // 45 degrees before opposite
T2 = get_step(src, turn(join_flags,225)) // 45 degrees beyond opposite
T3 = get_step(src, turn(join_flags,180)) // Opposite from the diagonal
if(isfloor(T1) && ((T1.type == T2.type) || (T1.type == T3.type)))
under = T1
else if(isfloor(T2) && T2.type == T3.type)
under = T2
else if(isfloor(T3) || istype(T3,/turf/space/transit))
under = T3
else
under = get_base_turf_by_area(src)
var/use_icon = ispath(under) ? initial(under.icon) : under.icon
var/use_icon_state
if(istype(under,/turf/simulated/shuttle))
interior_corner = 1 //Prevents us from 'landing on grass' and having interior corners update.
if(ispath(under,/turf/space))
use_icon_state = "[rand(1,25)]" //Space turfs should be random.
else
use_icon_state = ispath(under) ? initial(under.icon_state) : under.icon_state
var/image/under_image = new(use_icon,icon_state = use_icon_state)
underlays.Cut()
underlays |= under_image
return under
/turf/simulated/shuttle/floor
name = "floor"
icon_state = "floor"
icon = 'icons/turf/flooring/shuttle.dmi'
icon_state = "floor_blue"
/turf/simulated/shuttle/floor/red
icon_state = "floor_red"
/turf/simulated/shuttle/floor/yellow
icon_state = "floor_yellow"
/turf/simulated/shuttle/floor/darkred
icon_state = "floor_dred"
/turf/simulated/shuttle/floor/purple
icon_state = "floor_purple"
/turf/simulated/shuttle/floor/white
icon_state = "floor_white"
/turf/simulated/shuttle/floor/black
icon_state = "floor_black"
/turf/simulated/shuttle/floor/glass
icon_state = "floor_glass"
takes_underlays = 1
/turf/simulated/shuttle/plating
name = "plating"
icon = 'icons/turf/floors.dmi'
icon_state = "plating"
/turf/simulated/shuttle/plating/airless
oxygen = 0
nitrogen = 0
//For 'carrying' otherwise empty turfs or stuff in space turfs with you or having holes in the floor or whatever.
/turf/simulated/shuttle/plating/carry
name = "carry turf"
icon = 'icons/turf/shuttle_parts.dmi'
icon_state = "carry"
takes_underlays = 1
blocks_air = 1 //I'd make these unsimulated but it just fucks with so much stuff so many other places.
initialize()
icon_state = "carry_ingame"
/turf/simulated/shuttle/plating/airless/carry
name = "airless carry turf"
icon = 'icons/turf/shuttle_parts.dmi'
icon_state = "carry"
takes_underlays = 1
blocks_air = 1
initialize()
icon_state = "carry_ingame"
/turf/simulated/shuttle/plating/skipjack //Skipjack plating
oxygen = 0
nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD
/turf/simulated/shuttle/floor4 // Added this floor tile so that I have a seperate turf to check in the shuttle -- Polymorph
name = "Brig floor" // Also added it into the 2x3 brig area of the shuttle.
icon_state = "floor4"
/turf/simulated/shuttle/floor4/skipjack //skipjack floors
/turf/simulated/shuttle/floor/skipjack //Skipjack floors
name = "skipjack floor"
icon_state = "floor_dred"
oxygen = 0
nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD
/turf/simulated/shuttle/floor/voidcraft
name = "voidcraft tiles"
icon_state = "voidcraft_floor"
icon_state = "void"
/turf/simulated/shuttle/floor/voidcraft/dark
name = "voidcraft tiles"
icon_state = "voidcraft_floor_dark"
icon_state = "void_dark"
/turf/simulated/shuttle/floor/voidcraft/light
name = "voidcraft tiles"
icon_state = "voidcraft_floor_light"
icon_state = "void_light"
+146 -1
View File
@@ -51,4 +51,149 @@
..(newloc,"wood")
/turf/simulated/wall/sifwood/New(var/newloc)
..(newloc,"alien wood")
..(newloc,"alien wood")
// Shuttle Walls
/turf/simulated/shuttle/wall
name = "autojoin wall"
icon_state = "light"
opacity = 1
density = 1
blocks_air = 1
var/base_state = "light" //The base iconstate to base sprites on
var/hard_corner = 0 //Forces hard corners (as opposed to diagonals)
var/true_name = "wall" //What to rename this to on init
//Extra things this will try to locate and act like we're joining to. You can put doors, or whatever.
//Carefully means only if it's on a /turf/simulated/shuttle subtype turf.
var/static/list/join_carefully = list(
/obj/structure/grille,
/obj/machinery/door/blast/regular
)
var/static/list/join_always = list(
/obj/structure/shuttle/engine,
/obj/structure/shuttle/window,
/obj/machinery/door/airlock/voidcraft
)
/turf/simulated/shuttle/wall/hard_corner
name = "hardcorner wall"
icon_state = "light-hc"
hard_corner = 1
/turf/simulated/shuttle/wall/no_join
icon_state = "light-nj"
join_group = null
/turf/simulated/shuttle/wall/dark
icon = 'icons/turf/shuttle_dark.dmi'
icon_state = "dark"
base_state = "dark"
/turf/simulated/shuttle/wall/dark/hard_corner
name = "hardcorner wall"
icon_state = "dark-hc"
hard_corner = 1
/turf/simulated/shuttle/wall/dark/no_join
name = "nojoin wall"
icon_state = "dark-nj"
join_group = null
/turf/simulated/shuttle/wall/New()
..()
//To allow mappers to rename shuttle walls to like "redfloor interior" or whatever for ease of use.
name = true_name
/turf/simulated/shuttle/wall/initialize()
..()
if(join_group)
src.auto_join()
else
icon_state = base_state
if(takes_underlays)
underlay_update()
/turf/simulated/shuttle/wall/proc/auto_join()
match_turf(NORTH, NORTH)
match_turf(EAST, EAST)
match_turf(SOUTH, SOUTH)
match_turf(WEST, WEST)
icon_state = "[base_state][join_flags]"
if(isDiagonal(join_flags))
if(hard_corner) //You are using 'hard' (aka full-tile) corners.
icon_state += "h" //Hard corners have 'h' at the end of the state
else //Diagonals need an underlay to not look ugly.
takes_underlays = 1
else //Everything else doesn't deserve our time!
takes_underlays = initial(takes_underlays)
return join_flags
/turf/simulated/shuttle/wall/proc/match_turf(direction, flag, mask=0)
if((join_flags & mask) == mask)
var/turf/simulated/shuttle/wall/adj = get_step(src, direction)
if(istype(adj, /turf/simulated/shuttle/wall) && adj.join_group == src.join_group)
join_flags |= flag // turn on the bit flag
return
else if(istype(adj, /turf/simulated/shuttle))
var/turf/simulated/shuttle/adj_cast = adj
if(adj_cast.join_group == src.join_group)
var/found
for(var/E in join_carefully)
found = locate(E) in adj
if(found) break
if(found)
join_flags |= flag // turn on the bit flag
return
var/always_found
for(var/E in join_always)
always_found = locate(E) in adj
if(always_found) break
if(always_found)
join_flags |= flag // turn on the bit flag
else
join_flags &= ~flag // turn off the bit flag
/turf/simulated/shuttle/wall/voidcraft
name = "voidcraft wall"
icon = 'icons/turf/shuttle_void.dmi'
icon_state = "void"
base_state = "void"
var/stripe_color = null // If set, generates a colored stripe overlay. Accepts #XXXXXX as input.
/turf/simulated/shuttle/wall/voidcraft/hard_corner
name = "hardcorner wall"
icon_state = "void-hc"
hard_corner = 1
/turf/simulated/shuttle/wall/voidcraft/no_join
name = "nojoin wall"
icon_state = "void-nj"
join_group = null
/turf/simulated/shuttle/wall/voidcraft/red
stripe_color = "#FF0000"
/turf/simulated/shuttle/wall/voidcraft/blue
stripe_color = "#0000FF"
/turf/simulated/shuttle/wall/voidcraft/green
stripe_color = "#00FF00"
/turf/simulated/shuttle/wall/voidcraft/initialize()
..()
update_icon()
/turf/simulated/shuttle/wall/voidcraft/update_icon()
if(stripe_color)
overlays.Cut()
var/image/I = image(icon = src.icon, icon_state = "o_[icon_state]")
I.color = stripe_color
overlays.Add(I)
+27
View File
@@ -0,0 +1,27 @@
/turf/unsimulated/shuttle
name = "shuttle"
icon = 'icons/turf/shuttle_white.dmi'
thermal_conductivity = 0.05
heat_capacity = 0
layer = 2
/turf/unsimulated/shuttle/wall
name = "wall"
icon_state = "light"
opacity = 1
density = 1
blocks_air = 1
/turf/unsimulated/shuttle/wall/dark
icon = 'icons/turf/shuttle_dark.dmi'
icon_state = "dark"
/turf/unsimulated/shuttle/floor
name = "floor"
icon = 'icons/turf/flooring/shuttle.dmi'
icon_state = "floor_blue"
/turf/unsimulated/shuttle/plating
name = "plating"
icon = 'icons/turf/floors.dmi'
icon_state = "plating"
+9 -3
View File
@@ -26,7 +26,7 @@
if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
return
suiciding = 1
suiciding = 15
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
var/obj/item/held_item = get_active_hand()
if(held_item)
@@ -73,10 +73,16 @@
return
log_and_message_admins("[key_name(src)] commited suicide")
viewers(src) << pick("<span class='danger'>[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.</span>", \
var/suicidemsg
suicidemsg = pick("<span class='danger'>[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.</span>", \
"<span class='danger'>[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.</span>", \
"<span class='danger'>[src] is twisting \his own neck! It looks like \he's trying to commit suicide.</span>", \
"<span class='danger'>[src] is holding \his breath! It looks like \he's trying to commit suicide.</span>")
if(isSynthetic())
suicidemsg = "<span class='danger'>[src] is attempting to switch \his power off! It looks like \he's trying to commit suicide.</span>"
visible_message(suicidemsg)
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
@@ -172,7 +178,7 @@
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
suiciding = 1
suiciding = 30
setOxyLoss(100)
adjustBruteLoss(100 - getBruteLoss())
setToxLoss(100)
@@ -273,11 +273,11 @@
/datum/gear/uniform/sundress
display_name = "sundress"
path = /obj/item/clothing/under/dress/sundress
path = /obj/item/clothing/under/sundress
/datum/gear/uniform/sundress/white
display_name = "sundress, white"
path = /obj/item/clothing/under/dress/sundress/white
path = /obj/item/clothing/under/sundress_white
/datum/gear/uniform/dress_fire
display_name = "flame dress"
@@ -446,10 +446,10 @@
display_name = "jumpsuit, hephaestus"
path = /obj/item/clothing/under/hephaestus
/datum/gear/uniform/yoga
/datum/gear/uniform/yogapants
display_name = "yoga pants"
path = /obj/item/clothing/under/pants/yoga
path = /obj/item/clothing/under/pants/yogapants
/datum/gear/uniform/yoga/New()
/datum/gear/uniform/yogapants/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
@@ -39,32 +39,24 @@
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes))
/datum/gear/ears/skrell/cloth/male
display_name = "male headtail cloth selection (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male
display_name = "male headtail cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/black
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/cloth/male/New()
..()
var/list/clothtypes = list()
for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_male))
var/obj/item/clothing/ears/skrell/cloth_male/cloth = cloth_style
clothtypes[initial(cloth.name)] = cloth
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes))
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/ears/skrell/cloth/female
display_name = "female headtail cloth selection (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female
display_name = "female headtail cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/black
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/cloth/female/New()
..()
var/list/clothtypes = list()
for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_female))
var/obj/item/clothing/ears/skrell/cloth_female/cloth = cloth_style
clothtypes[initial(cloth.name)] = cloth
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes))
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/ears/skrell/colored/band
display_name = "Colored bands (Skrell)"
+25 -9
View File
@@ -525,10 +525,6 @@
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/uniform.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/uniform.dmi',
"Tajaran" = 'icons/mob/species/tajaran/uniforms/uniform.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/uniform.dmi',
"Teshari" = 'icons/mob/species/seromi/uniform.dmi',
"Vox" = 'icons/mob/species/vox/uniform.dmi'
)
@@ -539,6 +535,9 @@
valid_accessory_slots = list("utility","armband","decor","over")
restricted_accessory_slots = list("utility", "armband")
var/icon/rolled_down_icon = 'icons/mob/uniform_rolled_down.dmi'
var/icon/rolled_down_sleeves_icon = 'icons/mob/uniform_sleeves_rolled.dmi'
/obj/item/clothing/under/attack_hand(var/mob/user)
if(accessories && accessories.len)
@@ -558,7 +557,7 @@
//autodetect rollability
if(rolled_down < 0)
if((worn_state + "_d_s") in icon_states('icons/mob/uniform.dmi'))
if(("[worn_state]_d_s" in icon_states(INV_W_UNIFORM_DEF_ICON)) || ("[worn_state]_s" in icon_states(rolled_down_icon)) || ("[worn_state]_d_s" in icon_states(icon_override)))
rolled_down = 0
/obj/item/clothing/under/proc/update_rolldown_status()
@@ -573,11 +572,13 @@
under_icon = sprite_sheets[H.species.get_bodytype(H)]
else if(item_icons && item_icons[slot_w_uniform_str])
under_icon = item_icons[slot_w_uniform_str]
else if ("[worn_state]_s" in icon_states(rolled_down_icon))
under_icon = rolled_down_icon
else
under_icon = INV_W_UNIFORM_DEF_ICON
// The _s is because the icon update procs append it.
if(("[worn_state]_d_s") in icon_states(under_icon))
if((under_icon == rolled_down_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_d_s" in icon_states(under_icon)))
if(rolled_down != 1)
rolled_down = 0
else
@@ -596,11 +597,13 @@
under_icon = sprite_sheets[H.species.get_bodytype(H)]
else if(item_icons && item_icons[slot_w_uniform_str])
under_icon = item_icons[slot_w_uniform_str]
else if ("[worn_state]_s" in icon_states(rolled_down_sleeves_icon))
under_icon = rolled_down_sleeves_icon
else
under_icon = INV_W_UNIFORM_DEF_ICON
// The _s is because the icon update procs append it.
if(("[worn_state]_r_s") in icon_states(under_icon))
if((under_icon == rolled_down_sleeves_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_r_s" in icon_states(under_icon)))
if(rolled_sleeves != 1)
rolled_sleeves = 0
else
@@ -682,10 +685,17 @@
if(rolled_down)
body_parts_covered = initial(body_parts_covered)
body_parts_covered &= ~(UPPER_TORSO|ARMS)
item_state_slots[slot_w_uniform_str] = "[worn_state]_d"
if("[worn_state]_s" in icon_states(rolled_down_icon))
icon_override = rolled_down_icon
item_state_slots[slot_w_uniform_str] = "[worn_state]"
else
item_state_slots[slot_w_uniform_str] = "[worn_state]_d"
usr << "<span class='notice'>You roll down your [src].</span>"
else
body_parts_covered = initial(body_parts_covered)
if(icon_override == rolled_down_icon)
icon_override = initial(icon_override)
item_state_slots[slot_w_uniform_str] = "[worn_state]"
usr << "<span class='notice'>You roll up your [src].</span>"
update_clothing_icon()
@@ -708,10 +718,16 @@
rolled_sleeves = !rolled_sleeves
if(rolled_sleeves)
body_parts_covered &= ~(ARMS)
item_state_slots[slot_w_uniform_str] = "[worn_state]_r"
if("[worn_state]_s" in icon_states(rolled_down_sleeves_icon))
icon_override = rolled_down_sleeves_icon
item_state_slots[slot_w_uniform_str] = "[worn_state]"
else
item_state_slots[slot_w_uniform_str] = "[worn_state]_r"
usr << "<span class='notice'>You roll up your [src]'s sleeves.</span>"
else
body_parts_covered = initial(body_parts_covered)
if(icon_override == rolled_down_sleeves_icon)
icon_override = initial(icon_override)
item_state_slots[slot_w_uniform_str] = "[worn_state]"
usr << "<span class='notice'>You roll down your [src]'s sleeves.</span>"
update_clothing_icon()
+21
View File
@@ -347,3 +347,24 @@
desc = "A wide-brimmed hat popularly worn in Mexico."
icon_state = "sombrero"
body_parts_covered = 0
//Flower crowns
/obj/item/clothing/head/sunflower_crown
name = "sunflower crown"
desc = "A flower crown weaved with sunflowers."
icon_state = "sunflower_crown"
body_parts_covered = 0
/obj/item/clothing/head/lavender_crown
name = "lavender crown"
desc = "A flower crown weaved with lavender."
icon_state = "lavender_crown"
body_parts_covered = 0
/obj/item/clothing/head/poppy_crown
name = "poppy crown"
desc = "A flower crown weaved with poppies."
icon_state = "poppy_crown"
body_parts_covered = 0
@@ -157,6 +157,7 @@
list("antibiotics", "spaceacillin", 0, 20),
list("antitoxins", "anti_toxin", 0, 20),
list("nutrients", "glucose", 0, 80),
list("clotting agent", "myelamine", 0, 80),
list("hyronalin", "hyronalin", 0, 20),
list("radium", "radium", 0, 20)
)
@@ -246,6 +247,7 @@
list("hyperzine", "hyperzine", 0, 30),
list("oxycodone", "oxycodone", 0, 30),
list("nutrients", "glucose", 0, 80),
list("clotting agent", "myelamine", 0, 80)
)
interface_name = "combat chem dispenser"
@@ -263,6 +265,20 @@
interface_name = "mounted chem injector"
interface_desc = "Dispenses loaded chemicals via an arm-mounted injector."
/obj/item/rig_module/chem_dispenser/injector/advanced
charges = list(
list("tricordrazine", "tricordrazine", 0, 80),
list("tramadol", "tramadol", 0, 80),
list("dexalin plus", "dexalinp", 0, 80),
list("antibiotics", "spaceacillin", 0, 80),
list("antitoxins", "anti_toxin", 0, 80),
list("nutrients", "glucose", 0, 80),
list("hyronalin", "hyronalin", 0, 80),
list("radium", "radium", 0, 80),
list("clotting agent", "myelamine", 0, 80)
)
/obj/item/rig_module/voice
name = "hardsuit voice synthesiser"
@@ -161,6 +161,7 @@
piece.permeability_coefficient = permeability_coefficient
piece.unacidable = unacidable
if(islist(armor)) piece.armor = armor.Copy()
if(islist(armorsoak)) piece.armorsoak = armorsoak.Copy()
update_icon(1)
@@ -49,7 +49,7 @@
/obj/item/rig_module/ai_container,
/obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/device/healthscanner,
/obj/item/rig_module/chem_dispenser/injector
/obj/item/rig_module/chem_dispenser/injector/advanced
)
/obj/item/weapon/rig/ert/security
-8
View File
@@ -1,11 +1,3 @@
/obj/item/clothing/under/color
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/color.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/color.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/color.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/color.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/color.dmi'
)
/obj/item/clothing/under/color/black
name = "black jumpsuit"
icon_state = "black"
+2 -31
View File
@@ -255,13 +255,6 @@
*/
/obj/item/clothing/under/dress
body_parts_covered = UPPER_TORSO|LOWER_TORSO
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/dresses.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
)
/obj/item/clothing/under/dress/blacktango
name = "black tango dress"
@@ -353,14 +346,6 @@
*/
/obj/item/clothing/under/wedding
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/dresses.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
)
/obj/item/clothing/under/wedding/bride_orange
name = "orange wedding dress"
@@ -393,13 +378,13 @@
flags_inv = HIDESHOES
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/dress/sundress
/obj/item/clothing/under/sundress
name = "sundress"
desc = "Makes you want to frolic in a field of daisies."
icon_state = "sundress"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/dress/sundress/white
/obj/item/clothing/under/sundress_white
name = "white sundress"
desc = "A white sundress decorated with purple lilies."
icon_state = "sundress_white"
@@ -474,13 +459,6 @@
/obj/item/clothing/under/cheongsam
name = "white cheongsam"
desc = "It is a white cheongsam dress."
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/dresses.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
)
icon_state = "mai_yang"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
@@ -508,13 +486,6 @@
/obj/item/clothing/under/croptop
name = "crop top"
desc = "A shirt that has had the top cropped. This one is NT sponsored."
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/dresses.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
)
icon_state = "croptop"
item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey")
+2 -9
View File
@@ -2,13 +2,6 @@
/obj/item/clothing/under/pants
name = "jeans"
desc = "A nondescript pair of tough blue jeans."
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/pants.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/pants.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/pants.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/pants.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/pants.dmi'
)
icon_state = "jeans"
gender = PLURAL
body_parts_covered = LOWER_TORSO|LEGS
@@ -124,10 +117,10 @@
desc = "A pair of sexy, tight black leather chaps."
icon_state = "chapsbl"
/obj/item/clothing/under/pants/yoga
/obj/item/clothing/under/pants/yogapants
name = "yoga pants"
desc = "A pair of tight-fitting yoga pants for those lazy days."
icon_state = "yoga"
icon_state = "yogapants"
/*
* Baggy Pants
-16
View File
@@ -2,13 +2,6 @@
/obj/item/clothing/under/shorts
name = "athletic shorts"
desc = "95% Polyester, 5% Spandex!"
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/pants.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/pants.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/pants.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/pants.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/pants.dmi'
)
gender = PLURAL
body_parts_covered = LOWER_TORSO
@@ -103,13 +96,6 @@
/obj/item/clothing/under/skirt
name = "short black skirt"
desc = "A skirt that is a shiny black."
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/dresses.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
)
icon_state = "skirt_short_black"
body_parts_covered = LOWER_TORSO
rolled_sleeves = -1
@@ -168,8 +154,6 @@
icon_state = "plaid_purple"
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
//Job skirts
/obj/item/clothing/under/rank/cargo/skirt
name = "quartermaster's jumpskirt"
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
+2 -27
View File
@@ -4,12 +4,6 @@
/obj/item/clothing/under/pt
name = "pt uniform"
desc = "Shorts! Shirt! Miami! Sexy!"
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/military.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi'
)
icon_state = "miami"
worn_state = "miami"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -40,13 +34,6 @@
/obj/item/clothing/under/utility
name = "utility uniform"
desc = "A comfortable turtleneck and black utility trousers."
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/military.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/military.dmi'
)
icon_state = "blackutility"
worn_state = "blackutility"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -107,6 +94,7 @@
icon_state = "blackutility_com"
worn_state = "blackutility_com"
/obj/item/clothing/under/utility/fleet
name = "fleet coveralls"
desc = "The utility uniform of the SCG Fleet, made from an insulated material."
@@ -145,6 +133,7 @@
icon_state = "navyutility_com"
worn_state = "navyutility_com"
/obj/item/clothing/under/utility/marine
name = "marine fatigues"
desc = "The utility uniform of the SCG Marine Corps, made from durable material."
@@ -199,13 +188,6 @@
/obj/item/clothing/under/service
name = "service uniform"
desc = "A service uniform of some kind."
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/military.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/military.dmi'
)
icon_state = "whiteservice"
worn_state = "whiteservice"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -233,13 +215,6 @@
/obj/item/clothing/under/mildress
name = "dress uniform"
desc = "A dress uniform of some kind."
sprite_sheets = list(
"Human" = 'icons/mob/uniforms/military.dmi',
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi',
"Diona" = 'icons/mob/species/diona/uniforms/military.dmi'
)
icon_state = "greydress"
worn_state = "greydress"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+4 -4
View File
@@ -105,7 +105,7 @@ I said no!
/datum/recipe/xenoburger
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat
/obj/item/weapon/reagent_containers/food/snacks/spidermeat // /obj/item/weapon/reagent_containers/food/snacks/xenomeat
)
result = /obj/item/weapon/reagent_containers/food/snacks/xenoburger
@@ -224,9 +224,9 @@ I said no!
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
+4 -1
View File
@@ -114,8 +114,11 @@
if(!target_limb) target_limb = pick(BP_ALL)
var/blocked = target.run_armor_check(target_limb, "melee")
var/soaked = target.get_armor_soak(target_limb, "melee")
if(blocked >= 100)
return
var/obj/item/organ/external/affecting = target.get_organ(target_limb)
var/damage = 0
var/has_edge = 0
@@ -125,7 +128,7 @@
if(affecting)
to_chat(target, "<span class='danger'>\The [fruit]'s thorns pierce your [affecting.name] greedily!</span>")
target.apply_damage(damage, BRUTE, target_limb, blocked, "Thorns", sharp=1, edge=has_edge)
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, "Thorns", sharp=1, edge=has_edge)
else
to_chat(target, "<span class='danger'>\The [fruit]'s thorns pierce your flesh greedily!</span>")
target.adjustBruteLoss(damage)
@@ -120,6 +120,7 @@
/material/wood/generate_recipes()
..()
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1)
recipes += new/datum/stack_recipe("wood circlet", /obj/item/woodcirclet, 1)
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1)
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
+2 -2
View File
@@ -101,9 +101,9 @@
/mob/living/silicon/ai/special_mentions()
return list("AI") // AI door!
// Converts specific characters, like *, /, and _ to formatted output.
// Converts specific characters, like *, |, and _ to formatted output.
/mob/proc/say_emphasis(var/message)
message = encode_html_emphasis(message, "/", "i")
message = encode_html_emphasis(message, "|", "i")
message = encode_html_emphasis(message, "+", "b")
message = encode_html_emphasis(message, "_", "u")
return message
@@ -71,15 +71,11 @@
/mob/living/carbon/brain/handle_chemicals_in_body()
chem_effects.Cut()
analgesic = 0
if(touching) touching.metabolize()
if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize()
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
confused = max(0, confused - 1)
// decrement dizziness counter, clamped to 0
if(resting)
@@ -4,7 +4,7 @@
return null
..()
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
if(!effective_force || blocked >= 100)
return 0
@@ -12,6 +12,10 @@
if(HULK in user.mutations)
effective_force *= 2
//If the armor soaks all of the damage, it just skips the rest of the checks
if(effective_force <= soaked)
return 0
//Apply weapon damage
var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I)
@@ -7,8 +7,7 @@
var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm
var/life_tick = 0 // The amount of life ticks that have processed on this mob.
var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain
// life should decrease this by 1 every tick
// total amount of wounds on mob, used to spread out healing and the like over all wounds
var/number_wounds = 0
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
@@ -1050,7 +1050,7 @@
"<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>", \
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>")
src << msg
custom_pain(msg, 40)
organ.take_damage(rand(1,3), 0, 0)
if(!(organ.robotic >= ORGAN_ROBOT) && (should_have_organ(O_HEART))) //There is no blood in protheses.
@@ -1489,7 +1489,7 @@
if(check_organ)
if(!istype(check_organ))
return 0
return check_organ.can_feel_pain()
return check_organ.organ_can_feel_pain()
return !(species.flags & NO_PAIN)
/mob/living/carbon/human/is_muzzled()
@@ -43,6 +43,7 @@
return 0
var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
var/armor_soak = get_armor_soak(affecting, "melee")
if(HULK in H.mutations)
damage += 5
@@ -51,7 +52,10 @@
visible_message("\red <B>[H] has punched [src]!</B>")
apply_damage(damage, HALLOSS, affecting, armor_block)
if(armor_soak >= damage)
return
apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak)
if(damage >= 9)
visible_message("\red <B>[H] has weakened [src]!</B>")
apply_effect(4, WEAKEN, armor_block)
@@ -245,11 +249,12 @@
real_damage = max(1, real_damage)
var/armour = run_armor_check(affecting, "melee")
var/soaked = get_armor_soak(affecting, "melee")
// Apply additional unarmed effects.
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
// Finally, apply damage to target
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, sharp=attack.sharp, edge=attack.edge)
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, soaked, sharp=attack.sharp, edge=attack.edge)
if(I_DISARM)
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
@@ -325,7 +330,8 @@
var/dam_zone = pick(organs_by_name)
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
var/armor_soak = get_armor_soak(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block, armor_soak)
updatehealth()
return 1
@@ -376,7 +376,7 @@ This function restores all organs.
if((damagetype != BRUTE) && (damagetype != BURN))
if(damagetype == HALLOSS)
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
if(organ && organ.can_feel_pain())
if(organ && organ.organ_can_feel_pain())
emote("scream")
..(damage, damagetype, def_zone, blocked)
return 1
@@ -67,7 +67,7 @@ emp_act
emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!")
else
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
emote("me", 1, "[affected.can_feel_pain() ? "" : emote_scream]drops what they were holding in their [affected.name]!")
emote("me", 1, "[affected.organ_can_feel_pain() ? "" : emote_scream] drops what they were holding in their [affected.name]!")
..(stun_amount, agony_amount, def_zone)
@@ -93,6 +93,29 @@ emp_act
total += weight
return (armorval/max(total, 1))
//Like getarmor, but the value it returns will be numerical damage reduction
/mob/living/carbon/human/getsoak(var/def_zone, var/type)
var/soakval = 0
var/total = 0
if(def_zone)
if(isorgan(def_zone))
return getsoak_organ(def_zone, type)
var/obj/item/organ/external/affecting = get_organ(def_zone)
if(affecting)
return getsoak_organ(affecting, type)
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
for(var/organ_name in organs_by_name)
if (organ_name in organ_rel_size)
var/obj/item/organ/external/organ = organs_by_name[organ_name]
if(organ)
var/weight = organ_rel_size[organ_name]
soakval += getsoak_organ(organ, type) * weight
total += weight
return (soakval/max(total, 1))
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone)
if (!def_zone)
@@ -119,6 +142,17 @@ emp_act
protection += C.armor[type]
return protection
/mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type)
if(!type || !def_zone) return 0
var/soaked = 0
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
for(var/gear in protective_gear)
if(gear && istype(gear ,/obj/item/clothing))
var/obj/item/clothing/C = gear
if(istype(C) && C.body_parts_covered & def_zone.body_part)
soaked += C.armorsoak[type]
return soaked
/mob/living/carbon/human/proc/check_head_coverage()
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
@@ -195,25 +229,35 @@ emp_act
visible_message("<span class='danger'>[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!</span>")
var/soaked = get_armor_soak(hit_zone, "melee", I.armor_penetration)
if(soaked >= effective_force)
src << "Your armor absorbs the force of [I.name]!"
return
var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].")
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
return blocked
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
var/obj/item/organ/external/affecting = get_organ(hit_zone)
if(!affecting)
return 0
if(soaked >= effective_force)
return 0
// Handle striking to cripple.
if(user.a_intent == I_DISARM)
effective_force *= 0.5 //reduced effective force...
if(!..(I, user, effective_force, blocked, hit_zone))
if(!..(I, user, effective_force, blocked, soaked, hit_zone))
return 0
//set the dislocate mult less than the effective force mult so that
//dislocating limbs on disarm is a bit easier than breaking limbs on harm
attack_joint(affecting, I, effective_force, 0.75, blocked) //...but can dislocate joints
attack_joint(affecting, I, effective_force, 0.75, blocked, soaked) //...but can dislocate joints
else if(!..())
return 0
@@ -243,7 +287,7 @@ emp_act
switch(hit_zone)
if("head")//Harder to score a stun but if you do it lasts a bit longer
if(prob(effective_force))
apply_effect(20, PARALYZE, blocked)
apply_effect(20, PARALYZE, blocked, soaked)
visible_message("<span class='danger'>\The [src] has been knocked unconscious!</span>")
if(bloody)//Apply blood
if(wear_mask)
@@ -257,15 +301,15 @@ emp_act
update_inv_glasses(0)
if("chest")//Easier to score a stun but lasts less time
if(prob(effective_force + 10))
apply_effect(6, WEAKEN, blocked)
apply_effect(6, WEAKEN, blocked, soaked)
visible_message("<span class='danger'>\The [src] has been knocked down!</span>")
if(bloody)
bloody_body(src)
return 1
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked)
if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100)
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked, var/soaked)
if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100 || soaked > effective_force)
return 0
if(W.damtype != BRUTE)
@@ -338,10 +382,6 @@ emp_act
var/hit_area = affecting.name
src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
if(armor < 100)
apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
if(ismob(O.thrower))
var/mob/M = O.thrower
@@ -352,12 +392,25 @@ emp_act
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
//If the armor absorbs all of the damage, skip the rest of the calculations
var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration)
if(soaked >= throw_damage)
src << "Your armor absorbs the force of [O.name]!"
return
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
if(armor < 100)
apply_damage(throw_damage, dtype, zone, armor, soaked, is_sharp(O), has_edge(O), O)
//thrown weapon embedded object code.
if(dtype == BRUTE && istype(O,/obj/item))
var/obj/item/I = O
if (!is_robot_module(I))
var/sharp = is_sharp(I)
var/damage = throw_damage
if (soaked)
damage -= soaked
if (armor)
damage /= armor+1
@@ -56,7 +56,7 @@
if (!lying && !buckled && world.time - l_move_time < 15)
//Moving around with fractured ribs won't do you any good
if (prob(10) && !stat && can_feel_pain() && analgesic < 50 && E.is_broken() && E.internal_organs.len)
if (prob(10) && !stat && can_feel_pain() && chem_effects[CE_PAINKILLER] < 50 && E.is_broken() && E.internal_organs.len)
custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50)
drop_item(loc)
Stun(2)
@@ -100,7 +100,7 @@
else if (E.is_dislocated())
stance_damage += 0.5
if(E) limb_pain = E.can_feel_pain()
if(E) limb_pain = E.organ_can_feel_pain()
// Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot.
@@ -159,7 +159,7 @@
drop_from_inventory(r_hand)
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
emote("me", 1, "[(E.can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
emote("me", 1, "[(can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
else if(E.is_malfunctioning())
switch(E.body_part)
+18 -13
View File
@@ -186,7 +186,7 @@
var/rn = rand(0, 200)
if(getBrainLoss() >= 5)
if(0 <= rn && rn <= 3)
custom_pain("Your head feels numb and painful.")
custom_pain("Your head feels numb and painful.", 10)
if(getBrainLoss() >= 15)
if(4 <= rn && rn <= 6) if(eye_blurry <= 0)
src << "<span class='warning'>It becomes hard to see for some reason.</span>"
@@ -328,17 +328,20 @@
if(status_flags & GODMODE)
return
if(suiciding)
failed_last_breath = 1
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
oxygen_alert = max(oxygen_alert, 1)
suiciding --
return 0
if(does_not_breathe)
failed_last_breath = 0
adjustOxyLoss(-5)
return
if(!breath || (breath.total_moles == 0) || suiciding)
if(!breath || (breath.total_moles == 0))
failed_last_breath = 1
if(suiciding)
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
oxygen_alert = max(oxygen_alert, 1)
return 0
if(health > config.health_threshold_crit)
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
else
@@ -350,8 +353,11 @@
rupture_lung()
if(should_have_organ("brain"))
var/brainOxPercent = 0.02 //Default2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
if(CE_STABLE in chem_effects)
brainOxPercent = 0.01 //Halved in effect
if(prob(5))
adjustBrainLoss(0.02 * oxyloss) //2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
adjustBrainLoss(brainOxPercent * oxyloss)
oxygen_alert = max(oxygen_alert, 1)
@@ -794,7 +800,6 @@
if(reagents)
chem_effects.Cut()
analgesic = 0
if(!isSynthetic())
@@ -802,9 +807,6 @@
if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize()
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
var/total_phoronloss = 0
for(var/obj/item/I in src)
if(I.contaminated)
@@ -1155,7 +1157,7 @@
see_invisible = SEE_INVISIBLE_LIVING
if(healths)
if (analgesic > 100)
if (chem_effects[CE_PAINKILLER] > 100)
healths.icon_state = "health_numb"
else
// Generate a by-limb health display.
@@ -1437,8 +1439,11 @@
shock_stage = max(shock_stage-1, 0)
return
if(stat)
return 0
if(shock_stage == 10)
src << "<span class='danger'>[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!</span>"
custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40)
if(shock_stage >= 30)
if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.")
@@ -97,7 +97,7 @@ var/global/list/sparring_attack_cache = list()
if(eyes)
eyes.take_damage(rand(3,4), 1)
user.visible_message("<span class='danger'>[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!</span>")
var/eye_pain = eyes.can_feel_pain()
var/eye_pain = eyes.organ_can_feel_pain()
target << "<span class='danger'>You experience[(eye_pain) ? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(eye_pain)? "." : "!"]</span>"
return
user.visible_message("<span class='danger'>[user] attempts to press \his [eye_attack_text] into [target]'s eyes, but they don't have any!</span>")
@@ -67,15 +67,11 @@
/mob/living/carbon/slime/handle_chemicals_in_body()
chem_effects.Cut()
analgesic = 0
if(touching) touching.metabolize()
if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize()
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
src.updatehealth()
return //TODO: DEFERRED
@@ -60,7 +60,7 @@
var/painMes = pick("You can feel your body becoming weak!", "You feel like you're about to die!", "You feel every part of your body screaming in agony!", "A low, rolling pain passes through your body!", "Your body feels as if it's falling apart!", "You feel extremely weak!", "A sharp, deep pain bathes every inch of your body!")
if (ishuman(M))
var/mob/living/carbon/human/H = M
H.custom_pain(painMes)
H.custom_pain(painMes, 100)
else if (istype(M, /mob/living/carbon))
var/mob/living/carbon/C = M
if (C.can_feel_pain())
+1 -1
View File
@@ -14,7 +14,7 @@
1.2 * src.getShockBruteLoss() + \
1.7 * src.getCloneLoss() + \
2 * src.halloss + \
-1 * src.analgesic
-1 * src.chem_effects[CE_PAINKILLER]
if(src.slurring)
src.traumatic_shock -= 20
+4 -2
View File
@@ -8,11 +8,13 @@
Returns
standard 0 if fail
*/
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0)
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0)
if(Debug2)
world.log << "## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]."
if(!damage || (blocked >= 100))
if(!damage || (blocked >= 100) || soaked >= damage)
return 0
if(soaked)
damage -= soaked
blocked = (100-blocked)/100
switch(damagetype)
if(BRUTE)
+10 -1
View File
@@ -716,11 +716,20 @@ default behaviour is:
src << "<span class='warning'>You feel like you are about to throw up!</span>"
sleep(100) //and you have 10 more for mad dash to the bucket
//Damaged livers cause you to vomit blood.
if(!blood_vomit)
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(!H.isSynthetic())
var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"]
if(L.is_broken())
blood_vomit = 1
Stun(5)
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/turf/simulated/T = get_turf(src)
var/turf/simulated/T = get_turf(src) //TODO: Make add_blood_floor remove blood from human mobs
if(istype(T))
if(blood_vomit)
T.add_blood_floor(src)
+34 -10
View File
@@ -77,10 +77,20 @@
return 0
*/
//Certain pieces of armor actually absorb flat amounts of damage from income attacks
/mob/living/proc/get_armor_soak(var/def_zone = null, var/attack_flag = "melee", var/armour_pen = 0)
var/soaked = getsoak(def_zone, attack_flag)
//5 points of armor pen negate one point of soak
if(armour_pen)
soaked = max(soaked - (armour_pen/5), 0)
return soaked
//if null is passed for def_zone, then this should return something appropriate for all zones (e.g. area effect damage)
/mob/living/proc/getarmor(var/def_zone, var/type)
return 0
/mob/living/proc/getsoak(var/def_zone, var/type)
return 0
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
@@ -93,6 +103,7 @@
signaler.signal()
//Armor
var/soaked = get_armor_soak(def_zone, P.check_armour, P.armor_penetration)
var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration)
var/proj_sharp = is_sharp(P)
var/proj_edge = has_edge(P)
@@ -105,13 +116,13 @@
stun_effect_act(0, P.agony, def_zone, P)
src <<"\red You have been hit by [P]!"
if(!P.nodamage)
apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge)
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge)
qdel(P)
return
if(!P.nodamage)
apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge)
P.on_hit(src, absorb, def_zone)
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge)
P.on_hit(src, absorb, soaked, def_zone)
if(absorb == 100)
return 2
@@ -153,17 +164,21 @@
/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone)
visible_message("<span class='danger'>[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!</span>")
var/soaked = get_armor_soak(hit_zone, "melee")
var/blocked = run_armor_check(hit_zone, "melee")
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too
var/turf/simulated/location = get_turf(src)
if(istype(location)) location.add_blood_floor(src)
//If the armor absorbs all of the damage, skip the damage calculation and the blood
if(!soaked > effective_force)
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too
var/turf/simulated/location = get_turf(src)
if(istype(location)) location.add_blood_floor(src)
return blocked
//returns 0 if the effects failed to apply for some reason, 1 otherwise.
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
if(!effective_force || blocked >= 100)
return 0
@@ -171,6 +186,10 @@
if(HULK in user.mutations)
effective_force *= 2
//Armor soak
if(soaked >= effective_force)
return 0
//Apply weapon damage
var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I)
@@ -178,7 +197,7 @@
weapon_sharp = 0
weapon_edge = 0
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)
return 1
@@ -200,8 +219,10 @@
src.visible_message("\red [src] has been hit by [O].")
var/armor = run_armor_check(null, "melee")
var/soaked = get_armor_soak(null, "melee")
apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O)
apply_damage(throw_damage, dtype, null, armor, soaked, is_sharp(O), has_edge(O), O)
O.throwing = 0 //it hit, so stop moving
@@ -230,6 +251,9 @@
if(!O || !src) return
if(O.sharp) //Projectile is suitable for pinning.
if(soaked >= throw_damage) //Don't embed if it didn't actually damage
return
//Handles embedding for non-humans and simple_animals.
embed(O)
+2
View File
@@ -11,6 +11,7 @@ var/list/department_radio_keys = list(
":s" = "Security", ".s" = "Security",
":w" = "whisper", ".w" = "whisper",
":t" = "Mercenary", ".t" = "Mercenary",
":x" = "Raider", ".x" = "Raider",
":u" = "Supply", ".u" = "Supply",
":v" = "Service", ".v" = "Service",
":p" = "AI Private", ".p" = "AI Private",
@@ -26,6 +27,7 @@ var/list/department_radio_keys = list(
":S" = "Security", ".S" = "Security",
":W" = "whisper", ".W" = "whisper",
":T" = "Mercenary", ".T" = "Mercenary",
":X" = "Raider", ".X" = "Raider",
":U" = "Supply", ".U" = "Supply",
":V" = "Service", ".V" = "Service",
":P" = "AI Private", ".P" = "AI Private",
+35 -20
View File
@@ -548,7 +548,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
var/choice = alert("Would you like to select a hologram based on a (visible) crew member, switch to unique avatar, or load your character from your character slot?",,"Crew Member","Unique","My Character")
switch(choice)
if("Crew Member")
if("Crew Member") //A seeable crew member (or a dog)
var/list/targets = trackable_mobs()
if(targets.len)
input = input("Select a crew member:") as null|anything in targets //The definition of "crew member" is a little loose...
@@ -561,7 +561,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
else
alert("No suitable records found. Aborting.")
if("My Character")
if("My Character") //Loaded character slot
if(!client || !client.prefs) return
var/mob/living/carbon/human/dummy/dummy = new ()
//This doesn't include custom_items because that's ... hard.
@@ -574,25 +574,30 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
qdel(dummy)
holo_icon = new_holo
else //One from the dmi.
else //A premade from the dmi
var/icon_list[] = list(
"default",
"floating face",
"carp",
"ian",
"runtime",
"poly",
"pun pun",
"male human",
"female human",
"male unathi",
"female unathi",
"male tajara",
"female tajara",
"male tesharii",
"female tesharii",
"male skrell",
"female skrell"
"default",
"floating face",
"singularity",
"drone",
"carp",
"spider",
"bear",
"slime",
"ian",
"runtime",
"poly",
"pun pun",
"male human",
"female human",
"male unathi",
"female unathi",
"male tajara",
"female tajara",
"male tesharii",
"female tesharii",
"male skrell",
"female skrell"
)
input = input("Please select a hologram:") as null|anything in icon_list
if(input)
@@ -602,8 +607,18 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
if("floating face")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
if("singularity")
holo_icon = getHologramIcon(icon('icons/obj/singularity.dmi',"singularity_s1"))
if("drone")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"drone0"))
if("carp")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
if("spider")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"nurse"))
if("bear")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"brownbear"))
if("slime")
holo_icon = getHologramIcon(icon('icons/mob/slimes.dmi',"cerulean adult slime"))
if("ian")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi"))
if("runtime")
+22 -1
View File
@@ -28,11 +28,14 @@ var/list/datum/ai_icon/ai_icons
name = "Red"
alive_icon = "ai-red"
alive_light = "#F04848"
dead_icon = "ai-red_dead"
dead_light = "#F04848"
/datum/ai_icon/green
name = "Green"
alive_icon = "ai-wierd"
alive_light = "#00FF99"
dead_icon = "ai-weird_dead"
/datum/ai_icon/blue
name = "Blue"
@@ -44,6 +47,11 @@ var/list/datum/ai_icon/ai_icons
alive_icon = "ai-angryface"
alive_light = "#FFFF33"
/datum/ai_icon/angel
name = "Angel"
alive_icon = "ai-angel"
dead_icon = "ai-angel_dead"
/datum/ai_icon/bliss
name = "Bliss"
alive_icon = "ai-bliss"
@@ -57,6 +65,7 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/database
name = "Database"
alive_icon = "ai-database"
dead_icon = "ai-database_dead"
/datum/ai_icon/dorf
name = "Dorf"
@@ -80,6 +89,8 @@ var/list/datum/ai_icon/ai_icons
name = "Goon"
alive_icon = "ai-goon"
alive_light = "#3E5C80"
dead_icon = "ai-goon-crash"
dead_light = "#3E5C80"
/datum/ai_icon/heartline
name = "Heartline"
@@ -91,6 +102,10 @@ var/list/datum/ai_icon/ai_icons
alive_icon = "ai-helios"
alive_light = "#F2CF73"
/datum/ai_icon/hourglass
name = "Hourglass"
alive_icon = "ai-hourglass"
/datum/ai_icon/inverted
name = "Inverted"
alive_icon = "ai-u"
@@ -100,6 +115,7 @@ var/list/datum/ai_icon/ai_icons
name = "Lonestar"
alive_icon = "ai-lonestar"
alive_light = "#58751C"
dead_icon = "ai-lonestar_dead"
/datum/ai_icon/matrix
name = "Matrix"
@@ -110,6 +126,7 @@ var/list/datum/ai_icon/ai_icons
name = "Monochrome"
alive_icon = "ai-mono"
alive_light = "#585858"
dead_icon = "ai-mono_dead"
/datum/ai_icon/nanotrasen
name = "NanoTrasen"
@@ -128,13 +145,16 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/soviet
name = "Soviet"
alive_icon = "ai-redoctober"
alive_icon = "ai-soviet"
alive_light = "#FF4307"
dead_icon = "ai-soviet_dead"
dead_light = "#FF4307"
/datum/ai_icon/Static
name = "Static"
alive_icon = "ai-static"
alive_light = "#4784C1"
alive_icon = "ai-static_dead"
/datum/ai_icon/text
name = "Text"
@@ -143,6 +163,7 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/trapped
name = "Trapped"
alive_icon = "ai-hades"
dead_icon = "ai-hades_dead"
/datum/ai_icon/triumvirate_static
name = "Triumvirate"
@@ -158,9 +158,19 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/standard
name = "standard robot module"
sprites = list( "Basic" = "robot_old",
sprites = list(
"M-USE NanoTrasen" = "robot",
"Cabeiri" = "eyebot-standard",
"CUPCAKE" = "Noble-STD",
"Haruka" = "marinaSD",
"Usagi" = "tallflower",
"Telemachus" = "toiletbot",
"WTOperator" = "sleekstandard",
"WTOmni" = "omoikane",
"XI-GUS" = "spider",
"XI-ALP" = "heavyStandard",
"Basic" = "robot_old",
"Android" = "droid",
"Default" = "robot",
"Drone" = "drone-standard"
)
@@ -181,8 +191,16 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/medical/surgeon
name = "surgeon robot module"
sprites = list(
"M-USE NanoTrasen" = "robotMedi",
"Cabeiri" = "eyebot-medical",
"CUPCAKE" = "Noble-MED",
"Haruka" = "marinaMD",
"Minako" = "arachne",
"Usagi" = "tallwhite",
"Telemachus" = "toiletbotsurgeon",
"WTOperator" = "sleekcmo",
"XI-ALP" = "heavyMed",
"Basic" = "Medbot",
"Standard" = "surgeon",
"Advanced Droid" = "droid-medical",
"Needles" = "medicalrobot",
"Drone" = "drone-surgery"
@@ -230,8 +248,16 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/medical/crisis
name = "crisis robot module"
sprites = list(
"M-USE NanoTrasen" = "robotMedi",
"Cabeiri" = "eyebot-medical",
"CUPCAKE" = "Noble-MED",
"Haruka" = "marinaMD",
"Minako" = "arachne",
"Usagi" = "tallwhite",
"Telemachus" = "toiletbotmedical",
"WTOperator" = "sleekmedic",
"XI-ALP" = "heavyMed",
"Basic" = "Medbot",
"Standard" = "surgeon",
"Advanced Droid" = "droid-medical",
"Needles" = "medicalrobot",
"Drone - Medical" = "drone-medical",
@@ -295,6 +321,15 @@ var/global/list/robot_modules = list(
networks = list(NETWORK_ENGINEERING)
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
sprites = list(
"M-USE NanoTrasen" = "robotEngi",
"Cabeiri" = "eyebot-engineering",
"CUPCAKE" = "Noble-ENG",
"Haruka" = "marinaENG",
"Usagi" = "tallyellow",
"Telemachus" = "toiletbotengineering",
"WTOperator" = "sleekce",
"XI-GUS" = "spidereng",
"XI-ALP" = "heavyEng",
"Basic" = "Engineering",
"Antique" = "engineerrobot",
"Landmate" = "landmate",
@@ -312,7 +347,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
@@ -348,7 +383,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/engineering/general/New()
..()
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/wirecutters(src)
@@ -408,11 +443,19 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/security/general
sprites = list(
"M-USE NanoTrasen" = "robotSecy",
"Cabeiri" = "eyebot-security",
"Cerberus" = "bloodhound",
"Cerberus - Treaded" = "treadhound",
"CUPCAKE" = "Noble-SEC",
"Haruka" = "marinaSC",
"Usagi" = "tallred",
"Telemachus" = "toiletbotsecurity",
"WTOperator" = "sleeksecurity",
"XI-GUS" = "spidersec",
"XI-ALP" = "heavySec",
"Basic" = "secborg",
"Red Knight" = "Security",
"Black Knight" = "securityrobot",
"Bloodhound" = "bloodhound",
"Bloodhound - Treaded" = "secborg+tread",
"Drone" = "drone-sec"
)
@@ -448,6 +491,13 @@ var/global/list/robot_modules = list(
name = "janitorial robot module"
channels = list("Service" = 1)
sprites = list(
"M-USE NanoTrasen" = "robotJani",
"Cabeiri" = "eyebot-janitor",
"CUPCAKE" = "Noble-CLN",
"Haruka" = "marinaJN",
"Telemachus" = "toiletbotjanitor",
"WTOperator" = "sleekjanitor",
"XI-ALP" = "heavyRes",
"Basic" = "JanBot2",
"Mopbot" = "janitorrobot",
"Mop Gear Rex" = "mopgearrex",
@@ -488,11 +538,21 @@ var/global/list/robot_modules = list(
)
/obj/item/weapon/robot_module/robot/clerical/butler
sprites = list( "Waitress" = "Service",
"Kent" = "toiletbot",
sprites = list(
"M-USE NanoTrasen" = "robotServ",
"Cabeiri" = "eyebot-standard",
"CUPCAKE" = "Noble-SRV",
"Haruka" = "marinaSV",
"Usagi" = "tallgreen",
"Telemachus" = "toiletbot",
"WTOperator" = "sleekservice",
"WTOmni" = "omoikane",
"XI-GUS" = "spider",
"XI-ALP" = "heavyServ",
"Standard" = "Service2",
"Waitress" = "Service",
"Bro" = "Brobot",
"Rich" = "maximillion",
"Default" = "Service2",
"Drone - Service" = "drone-service",
"Drone - Hydro" = "drone-hydro"
)
@@ -532,12 +592,21 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/clerical/general
name = "clerical robot module"
sprites = list(
"M-USE NanoTrasen" = "robotCler",
"Cabeiri" = "eyebot-standard",
"CUPCAKE" = "Noble-SRV",
"Haruka" = "marinaSV",
"Usagi" = "tallgreen",
"Telemachus" = "toiletbot",
"WTOperator" = "sleekclerical",
"WTOmni" = "omoikane",
"XI-GUS" = "spidercom",
"XI-ALP" = "heavyServ",
"Waitress" = "Service",
"Kent" = "toiletbot",
"Bro" = "Brobot",
"Rich" = "maximillion",
"Default" = "Service2",
"Drone" = "drone-service"
"Drone" = "drone-blu"
)
/obj/item/weapon/robot_module/robot/clerical/general/New()
@@ -563,6 +632,14 @@ var/global/list/robot_modules = list(
channels = list("Supply" = 1)
networks = list(NETWORK_MINE)
sprites = list(
"NM-USE NanoTrasen" = "robotMine",
"Cabeiri" = "eyebot-miner",
"CUPCAKE" = "Noble-DIG",
"Haruka" = "marinaMN",
"Telemachus" = "toiletbotminer",
"WTOperator" = "sleekminer",
"XI-GUS" = "spidermining",
"XI-ALP" = "heavyMiner",
"Basic" = "Miner_old",
"Advanced Droid" = "droid-miner",
"Treadhead" = "Miner",
@@ -586,6 +663,10 @@ var/global/list/robot_modules = list(
name = "research module"
channels = list("Science" = 1)
sprites = list(
"L'Ouef" = "peaceborg",
"Cabeiri" = "eyebot-science",
"Haruka" = "marinaSCI",
"WTOperator" = "sleekscience",
"Droid" = "droid-science",
"Drone" = "drone-science"
)
@@ -599,7 +680,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
src.modules += new /obj/item/device/robotanalyzer(src)
src.modules += new /obj/item/weapon/card/robot(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/wirecutters(src)
@@ -641,7 +722,13 @@ var/global/list/robot_modules = list(
LANGUAGE_SIGN = 0
)
sprites = list(
"Dread" = "securityrobot",
"Cerberus" = "syndie_bloodhound",
"Cerberus - Treaded" = "syndie_treadhound",
"Ares" = "squats",
"Telemachus" = "toiletbotantag",
"WTOperator" = "hosborg",
"XI-GUS" = "spidersyndi",
"XI-ALP" = "syndi-heavy"
)
var/id
@@ -666,7 +753,10 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/security/combat
name = "combat robot module"
hide_on_manifest = 1
sprites = list("Combat Android" = "droid-combat")
sprites = list(
"Haruka" = "marinaCB",
"Combat Android" = "droid-combat"
)
/obj/item/weapon/robot_module/robot/security/combat/New()
..()
@@ -686,7 +776,8 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot)
..()
src.modules += new /obj/item/weapon/weldingtool(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
@@ -774,4 +865,4 @@ var/global/list/robot_modules = list(
var/obj/item/device/lightreplacer/LR = locate() in src.modules
LR.Charge(R, amount)
..()
return
return
@@ -1,125 +1,125 @@
//Space bears!
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "RawrRawr!!"
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
icon_gib = "bear_gib"
faction = "russian"
cooperative = 1
maxHealth = 60
health = 60
turns_per_move = 5
see_in_dark = 6
stop_when_pulled = 0
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "pokes"
melee_damage_lower = 20
melee_damage_upper = 30
//Space bears aren't affected by atmos.
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
speak_chance = 1
speak = list("RAWR!","Rawr!","GRR!","Growl!")
speak_emote = list("growls", "roars")
emote_hear = list("rawrs","grumbles","grawls")
emote_see = list("stares ferociously", "stomps")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
var/stance_step = 0
/mob/living/simple_animal/hostile/bear/handle_stance()
switch(stance)
if(STANCE_TIRED)
stop_automated_movement = 1
stance_step++
if(stance_step >= 10) //rests for 10 ticks
if(target_mob && target_mob in ListTargets(10))
handle_stance(STANCE_ATTACK) //If the mob he was chasing is still nearby, resume the attack, otherwise go idle.
else
handle_stance(STANCE_IDLE)
if(STANCE_ALERT)
stop_automated_movement = 1
var/found_mob = 0
if(target_mob && target_mob in ListTargets(10))
if(!(SA_attackable(target_mob)))
stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again.
stance_step++
found_mob = 1
src.set_dir(get_dir(src,target_mob)) //Keep staring at the mob
if(stance_step in list(1,4,7)) //every 3 ticks
var/action = pick( list( "growls at [target_mob]", "stares angrily at [target_mob]", "prepares to attack [target_mob]", "closely watches [target_mob]" ) )
if(action)
custom_emote(1,action)
if(!found_mob)
stance_step--
if(stance_step <= -20) //If we have not found a mob for 20-ish ticks, revert to idle mode
handle_stance(STANCE_IDLE)
if(stance_step >= 7) //If we have been staring at a mob for 7 ticks,
handle_stance(STANCE_ATTACK)
if(STANCE_ATTACKING)
if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest
custom_emote(1, "is worn out and needs to rest." )
handle_stance(STANCE_TIRED)
stance_step = 0
walk(src, 0) //This stops the bear's walking
return
else
..()
/mob/living/simple_animal/hostile/bear/update_icons()
..()
if(!stat)
if(loc && istype(loc,/turf/space))
icon_state = "bear"
else
icon_state = "bearfloor"
/mob/living/simple_animal/hostile/bear/Process_Spacemove(var/check_drift = 0)
return
/mob/living/simple_animal/hostile/bear/FindTarget()
. = ..()
if(.)
custom_emote(1,"stares alertly at [.]")
handle_stance(STANCE_ALERT)
/mob/living/simple_animal/hostile/bear/PunchTarget()
if(!Adjacent(target_mob))
return
custom_emote(1, pick( list("slashes at [target_mob]", "bites [target_mob]") ) )
var/damage = rand(melee_damage_lower, melee_damage_upper)
if(ishuman(target_mob))
var/mob/living/carbon/human/H = target_mob
var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG)
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1)
return H
else if(isliving(target_mob))
var/mob/living/L = target_mob
L.adjustBruteLoss(damage)
return L
else
..()
//Space bears!
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "RawrRawr!!"
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
icon_gib = "bear_gib"
faction = "russian"
cooperative = 1
maxHealth = 60
health = 60
turns_per_move = 5
see_in_dark = 6
stop_when_pulled = 0
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "pokes"
melee_damage_lower = 20
melee_damage_upper = 30
//Space bears aren't affected by atmos.
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
speak_chance = 1
speak = list("RAWR!","Rawr!","GRR!","Growl!")
speak_emote = list("growls", "roars")
emote_hear = list("rawrs","grumbles","grawls")
emote_see = list("stares ferociously", "stomps")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
var/stance_step = 0
/mob/living/simple_animal/hostile/bear/handle_stance()
switch(stance)
if(STANCE_TIRED)
stop_automated_movement = 1
stance_step++
if(stance_step >= 10) //rests for 10 ticks
if(target_mob && target_mob in ListTargets(10))
handle_stance(STANCE_ATTACK) //If the mob he was chasing is still nearby, resume the attack, otherwise go idle.
else
handle_stance(STANCE_IDLE)
if(STANCE_ALERT)
stop_automated_movement = 1
var/found_mob = 0
if(target_mob && target_mob in ListTargets(10))
if(!(SA_attackable(target_mob)))
stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again.
stance_step++
found_mob = 1
src.set_dir(get_dir(src,target_mob)) //Keep staring at the mob
if(stance_step in list(1,4,7)) //every 3 ticks
var/action = pick( list( "growls at [target_mob]", "stares angrily at [target_mob]", "prepares to attack [target_mob]", "closely watches [target_mob]" ) )
if(action)
custom_emote(1,action)
if(!found_mob)
stance_step--
if(stance_step <= -20) //If we have not found a mob for 20-ish ticks, revert to idle mode
handle_stance(STANCE_IDLE)
if(stance_step >= 7) //If we have been staring at a mob for 7 ticks,
handle_stance(STANCE_ATTACK)
if(STANCE_ATTACKING)
if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest
custom_emote(1, "is worn out and needs to rest." )
handle_stance(STANCE_TIRED)
stance_step = 0
walk(src, 0) //This stops the bear's walking
return
else
..()
/mob/living/simple_animal/hostile/bear/update_icons()
..()
if(!stat)
if(loc && istype(loc,/turf/space))
icon_state = "bear"
else
icon_state = "bearfloor"
/mob/living/simple_animal/hostile/bear/Process_Spacemove(var/check_drift = 0)
return
/mob/living/simple_animal/hostile/bear/FindTarget()
. = ..()
if(.)
custom_emote(1,"stares alertly at [.]")
handle_stance(STANCE_ALERT)
/mob/living/simple_animal/hostile/bear/PunchTarget()
if(!Adjacent(target_mob))
return
custom_emote(1, pick( list("slashes at [target_mob]", "bites [target_mob]") ) )
var/damage = rand(melee_damage_lower, melee_damage_upper)
if(ishuman(target_mob))
var/mob/living/carbon/human/H = target_mob
var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG)
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1, edge=1)
return H
else if(isliving(target_mob))
var/mob/living/L = target_mob
L.adjustBruteLoss(damage)
return L
else
..()
@@ -36,7 +36,7 @@
speak_emote = list("chitters")
emote_hear = list("chitters")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidermeat
var/busy = 0
var/poison_per_bite = 5
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -903,7 +903,7 @@ mob/proc/yank_out_object()
if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-.
var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15))
affected.wounds += I
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50)
if (ishuman(U))
var/mob/living/carbon/human/human_user = U
+6 -4
View File
@@ -20,7 +20,7 @@
user << "<span class='notice'>You must stand still to feel [E] for fractures.</span>"
else if(E.status & ORGAN_BROKEN)
user << "<span class='warning'>The [E.encased ? E.encased : "bone in the [E.name]"] moves slightly when you poke it!</span>"
H.custom_pain("Your [E.name] hurts where it's poked.")
H.custom_pain("Your [E.name] hurts where it's poked.", 40)
else
user << "<span class='notice'>The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine.</span>"
@@ -56,7 +56,8 @@
return
var/armor = target.run_armor_check(target, "melee")
if(armor < 60)
var/soaked = target.get_armor_soak(target, "melee")
if(armor + soaked < 60)
target << "<span class='danger'>You feel extreme pain!</span>"
var/max_halloss = round(target.species.total_health * 0.8) //up to 80% of passing out
@@ -100,8 +101,9 @@
damage += hat.force * 3
var/armor = target.run_armor_check(BP_HEAD, "melee")
target.apply_damage(damage, BRUTE, BP_HEAD, armor)
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD, "melee"))
var/soaked = target.get_armor_soak(BP_HEAD, "melee")
target.apply_damage(damage, BRUTE, BP_HEAD, armor, soaked)
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD), attacker.get_armor_soak(BP_HEAD), "melee")
if(!armor && target.headcheck(BP_HEAD) && prob(damage))
target.apply_effect(20, PARALYZE)
@@ -715,15 +715,25 @@
species_allowed = list("Unathi")
//Skrell 'hairstyles'
skr_tentacle_m
name = "Skrell Male Tentacles"
icon_state = "skrell_hair_m"
skr_tentacle_veryshort
name = "Skrell Very Short Tentacles"
icon_state = "skrell_hair_veryshort"
species_allowed = list("Skrell")
gender = MALE
skr_tentacle_f
name = "Skrell Female Tentacles"
icon_state = "skrell_hair_f"
skr_tentacle_short
name = "Skrell Short Tentacles"
icon_state = "skrell_hair_short"
species_allowed = list("Skrell")
skr_tentacle_average
name = "Skrell Average Tentacles"
icon_state = "skrell_hair_average"
species_allowed = list("Skrell")
skr_tentacle_verylong
name = "Skrell Long Tentacles"
icon_state = "skrell_hair_verylong"
species_allowed = list("Skrell")
gender = FEMALE
+27 -14
View File
@@ -6,6 +6,7 @@ var/const/BLOOD_VOLUME_SAFE = 85
var/const/BLOOD_VOLUME_OKAY = 75
var/const/BLOOD_VOLUME_BAD = 60
var/const/BLOOD_VOLUME_SURVIVE = 40
var/const/CE_STABLE_THRESHOLD = 0.5
/mob/living/carbon/human/var/datum/reagents/vessel // Container for blood and BLOOD ONLY. Do not transfer other chems here.
/mob/living/carbon/human/var/var/pale = 0 // Should affect how mob sprite is drawn, but currently doesn't.
@@ -68,14 +69,24 @@ var/const/BLOOD_VOLUME_SURVIVE = 40
if(!heart)
blood_volume = 0
else if(heart.damage > 1 && heart.damage < heart.min_bruised_damage)
blood_volume *= 0.8
else if(heart.damage >= heart.min_bruised_damage && heart.damage < heart.min_broken_damage)
blood_volume *= 0.6
else if(heart.damage >= heart.min_broken_damage && heart.damage < INFINITY)
else if(heart.is_broken())
blood_volume *= 0.3
else if(heart.is_bruised())
blood_volume *= 0.7
else if(heart.damage)
blood_volume *= 0.8
//Effects of bloodloss
var/dmg_coef = 1 //Lower means less damage taken
var/threshold_coef = 1 //Lower means the damage caps off lower
if(CE_STABLE in chem_effects)
dmg_coef = 0.5
threshold_coef = 0.75
// These are Bay bits, do some sort of calculation.
// dmg_coef = min(1, 10/chem_effects[CE_STABLE]) //TODO: add effect for increased damage
// threshold_coef = min(dmg_coef / CE_STABLE_THRESHOLD, 1)
if(blood_volume >= BLOOD_VOLUME_SAFE)
if(pale)
pale = 0
@@ -89,23 +100,23 @@ var/const/BLOOD_VOLUME_SURVIVE = 40
if(prob(1))
var/word = pick("dizzy","woosey","faint")
src << "\red You feel [word]"
if(oxyloss < 20)
oxyloss += 3
if(getOxyLoss() < 20 * threshold_coef)
adjustOxyLoss(3 * dmg_coef)
else if(blood_volume >= BLOOD_VOLUME_BAD)
if(!pale)
pale = 1
update_body()
eye_blurry = max(eye_blurry,6)
if(oxyloss < 50)
oxyloss += 10
oxyloss += 1
if(getOxyLoss() < 50 * threshold_coef)
adjustOxyLoss(10 * dmg_coef)
adjustOxyLoss(1 * dmg_coef)
if(prob(15))
Paralyse(rand(1,3))
var/word = pick("dizzy","woosey","faint")
src << "\red You feel extremely [word]"
else if(blood_volume >= BLOOD_VOLUME_SURVIVE)
oxyloss += 5
toxloss += 3
adjustOxyLoss(5 * dmg_coef)
adjustToxLoss(3 * dmg_coef)
if(prob(15))
var/word = pick("dizzy","woosey","faint")
src << "\red You feel extremely [word]"
@@ -115,8 +126,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 40
update_body()
eye_blurry = max(eye_blurry,6)
Paralyse(3)
toxloss += 3
oxyloss += 75 // 15 more than dexp fixes (also more than dex+dexp+tricord)
adjustToxLoss(3 * dmg_coef)
adjustOxyLoss(75 * dmg_coef) // 15 more than dexp fixes (also more than dex+dexp+tricord)
// Without enough blood you slowly go hungry.
if(blood_volume < BLOOD_VOLUME_SAFE)
@@ -144,6 +155,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 40
blood_loss_divisor += 5
else if((temp.organ_tag == BP_L_HAND) || (temp.organ_tag == BP_R_HAND) || (temp.organ_tag == BP_L_FOOT) || (temp.organ_tag == BP_R_FOOT))
blood_loss_divisor += 10
if(CE_STABLE in chem_effects) //Inaprov slows bloodloss
blood_loss_divisor += 10
if(temp.applied_pressure)
if(ishuman(temp.applied_pressure))
var/mob/living/carbon/human/H = temp.applied_pressure
+1 -1
View File
@@ -24,7 +24,7 @@
/obj/item/organ/internal/lungs/proc/rupture()
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
if(istype(parent))
owner.custom_pain("You feel a stabbing pain in your [parent.name]!", 1)
owner.custom_pain("You feel a stabbing pain in your [parent.name]!", 50)
bruise()
/obj/item/organ/internal/lungs/handle_germ_effects()
+9 -3
View File
@@ -256,7 +256,7 @@ var/list/organ_cache = list()
if(owner && parent_organ && amount > 0)
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
if(parent && !silent)
owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
owner.custom_pain("Something inside your [parent.name] hurts a lot.", amount)
/obj/item/organ/proc/bruise()
damage = max(damage, min_bruised_damage)
@@ -372,5 +372,11 @@ var/list/organ_cache = list()
bitten(user)
return
/obj/item/organ/proc/can_feel_pain()
return !(robotic >= (ORGAN_ROBOT|ORGAN_DESTROYED)) && !(species.flags & NO_PAIN)
/obj/item/organ/proc/organ_can_feel_pain()
if(species.flags & NO_PAIN)
return 0
if(status & ORGAN_DESTROYED)
return 0
if(robotic && robotic < ORGAN_LIFELIKE) //Super fancy humanlike robotics probably have sensors, or something?
return 0
return 1
+4 -4
View File
@@ -267,7 +267,7 @@
if(status & ORGAN_BROKEN && brute)
jostle_bone(brute)
if(can_feel_pain() && prob(40))
if(organ_can_feel_pain() && prob(40))
owner.emote("scream") //getting hit on broken hand hurts
if(used_weapon)
add_autopsy_data("[used_weapon]", brute + burn)
@@ -487,7 +487,7 @@ This function completely restores a damaged organ to perfect condition.
if((damage > 15) && (type != BURN) && (local_damage > 30) && prob(damage) && (robotic < ORGAN_ROBOT))
var/datum/wound/internal_bleeding/I = new (min(damage - 15, 15))
wounds += I
owner.custom_pain("You feel something rip in your [name]!", 1)
owner.custom_pain("You feel something rip in your [name]!", 50)
//Burn damage can cause fluid loss due to blistering and cook-off
if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT))
@@ -705,7 +705,7 @@ Note that amputating the affected organ does in fact remove the infection from t
owner.vessel.remove_reagent("blood", wound_update_accuracy * W.damage/40) //line should possibly be moved to handle_blood, so all the bleeding stuff is in one place.
if(prob(1 * wound_update_accuracy))
owner.custom_pain("You feel a stabbing pain in your [name]!",1)
owner.custom_pain("You feel a stabbing pain in your [name]!", 50)
// slow healing
var/heal_amt = 0
@@ -1010,7 +1010,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"<span class='danger'>Something feels like it shattered in your [name]!</span>",\
"<span class='danger'>You hear a sickening crack.</span>")
jostle_bone()
if(can_feel_pain())
if(organ_can_feel_pain())
owner.emote("scream")
playsound(src.loc, "fracture", 10, 1, -2)
+9 -6
View File
@@ -248,20 +248,23 @@
if(inflamed == 1)
if(prob(5))
owner << "<span class='warning'>You feel a stinging pain in your abdomen!</span>"
owner.emote("me", 1, "winces slightly.")
if(owner.can_feel_pain())
owner.custom_pain("You feel a stinging pain in your abdomen!", 25)
if(inflamed > 1)
if(prob(3))
owner << "<span class='warning'>You feel a stabbing pain in your abdomen!</span>"
owner.emote("me", 1, "winces painfully.")
if(owner.can_feel_pain())
owner.custom_pain("You feel a stabbing pain in your abdomen!", 50)
owner.adjustToxLoss(1)
if(inflamed > 2)
if(prob(1))
owner.vomit()
if(owner.can_feel_pain())
owner.custom_pain("You feel a horrible pain in your abdomen!", 70)
if(inflamed > 3)
if(prob(1))
owner << "<span class='danger'>Your abdomen is a world of pain!</span>"
owner.Weaken(10)
if(owner.can_feel_pain())
owner.custom_pain("You feel a stinging pain in your abdomen!", 100)
owner.Weaken(10)
var/obj/item/organ/external/groin = owner.get_organ(BP_GROIN)
var/datum/wound/W = new /datum/wound/internal_bleeding(20)
+46 -91
View File
@@ -5,118 +5,73 @@ mob/var/list/pain_stored = list()
mob/var/last_pain_message = ""
mob/var/next_pain_time = 0
// partname is the name of a body part
// amount is a num from 1 to 100
mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0)
if(stat >= 1)
return
if(!can_feel_pain())
return
if(analgesic > 40)
return
if(world.time < next_pain_time && !force)
return
if(amount > 10 && istype(src,/mob/living/carbon/human))
if(src:paralysis)
src:paralysis = max(0, src:paralysis-round(amount/10))
if(amount > 50 && prob(amount / 5))
src:drop_item()
var/msg
if(burning)
switch(amount)
if(1 to 10)
msg = "<span class='danger'>Your [partname] burns.</span>"
if(11 to 90)
flash_weak_pain()
msg = "<span class='danger'><font size=2>Your [partname] burns badly!</font></span>"
if(91 to 10000)
flash_pain()
msg = "<span class='danger'><font size=3>OH GOD! Your [partname] is on fire!</font></span>"
else
switch(amount)
if(1 to 10)
msg = "<b>Your [partname] hurts.</b>"
if(11 to 90)
flash_weak_pain()
msg = "<b><font size=2>Your [partname] hurts badly.</font></b>"
if(91 to 10000)
flash_pain()
msg = "<b><font size=3>OH GOD! Your [partname] is hurting terribly!</font></b>"
if(msg && (msg != last_pain_message || prob(10)))
last_pain_message = msg
src << msg
next_pain_time = world.time + (100 - amount)
// message is the custom message to be displayed
// flash_strength is 0 for weak pain flash, 1 for strong pain flash
mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
if(stat >= 1)
return
if(!can_feel_pain())
return
if(reagents.has_reagent("tramadol"))
return
if(reagents.has_reagent("oxycodone"))
return
if(analgesic)
return
var/msg = "<span class='danger'>[message]</span>"
if(flash_strength >= 1)
msg = "<span class='danger'><font size=3>[message]</font></span>"
// power decides how much painkillers will stop the message
// force means it ignores anti-spam timer
mob/living/carbon/proc/custom_pain(message, power, force)
if(!message || stat || !can_feel_pain() || chem_effects[CE_PAINKILLER] > power)
return 0
message = "<span class='danger'>[message]</span>"
if(power >= 50)
message = "<font size=3>[message]</font>"
// Anti message spam checks
if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time)))
last_pain_message = msg
src << msg
next_pain_time = world.time + 100
if(force || (message != last_pain_message) || (world.time >= next_pain_time))
last_pain_message = message
src << message
next_pain_time = world.time + (100-power)
mob/living/carbon/human/proc/handle_pain()
// not when sleeping
if(stat)
return
if(!can_feel_pain()) return
if(!can_feel_pain())
return
if(stat >= 2) return
if(analgesic > 70)
if(world.time < next_pain_time)
return
var/maxdam = 0
var/obj/item/organ/external/damaged_organ = null
for(var/obj/item/organ/external/E in organs)
if((E.status & ORGAN_DEAD) || E.robotic >= ORGAN_ROBOT) continue
if(!E.organ_can_feel_pain()) continue
var/dam = E.get_damage()
// make the choice of the organ depend on damage,
// but also sometimes use one of the less damaged ones
if(dam > maxdam && (maxdam == 0 || prob(70)) )
damaged_organ = E
maxdam = dam
if(damaged_organ)
pain(damaged_organ.name, maxdam, 0)
if(damaged_organ && chem_effects[CE_PAINKILLER] < maxdam)
if(maxdam > 10 && paralysis)
paralysis = max(0, paralysis - round(maxdam/10))
if(maxdam > 50 && prob(maxdam / 5))
drop_item()
var/burning = damaged_organ.burn_dam > damaged_organ.brute_dam
var/msg
switch(maxdam)
if(1 to 10)
msg = "Your [damaged_organ.name] [burning ? "burns" : "hurts"]."
if(11 to 90)
flash_weak_pain()
msg = "<font size=2>Your [damaged_organ.name] [burning ? "burns" : "hurts"] badly!</font>"
if(91 to 10000)
flash_pain()
msg = "<font size=3>OH GOD! Your [damaged_organ.name] is [burning ? "on fire" : "hurting terribly"]!</font>"
custom_pain(msg, maxdam, prob(10))
// Damage to internal organs hurts a lot.
for(var/obj/item/organ/I in internal_organs)
if((I.status & ORGAN_DEAD) || I.robotic >= ORGAN_ROBOT) continue
if(I.damage > 2) if(prob(2))
var/obj/item/organ/external/parent = get_organ(I.parent_organ)
src.custom_pain("You feel a sharp pain in your [parent.name]", 1)
src.custom_pain("You feel a sharp pain in your [parent.name]", 50)
var/toxDamageMessage = null
var/toxMessageProb = 1
switch(getToxLoss())
if(1 to 5)
toxMessageProb = 1
toxDamageMessage = "Your body stings slightly."
if(6 to 10)
toxMessageProb = 2
toxDamageMessage = "Your whole body hurts a little."
if(11 to 15)
toxMessageProb = 2
toxDamageMessage = "Your whole body hurts."
if(15 to 25)
toxMessageProb = 3
toxDamageMessage = "Your whole body hurts badly."
if(26 to INFINITY)
toxMessageProb = 5
toxDamageMessage = "Your body aches all over, it's driving you mad."
if(toxDamageMessage && prob(toxMessageProb))
src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
if(prob(2))
switch(getToxLoss())
if(1 to 10)
custom_pain("Your body stings slightly.", getToxLoss())
if(11 to 30)
custom_pain("Your body hurts a little.", getToxLoss())
if(31 to 60)
custom_pain("Your whole body hurts badly.", getToxLoss())
if(61 to INFINITY)
custom_pain("Your body aches all over, it's driving you mad.", getToxLoss())
+5 -1
View File
@@ -265,11 +265,15 @@
var/target_zone = pick(BP_ALL)
var/amount_blocked = L.run_armor_check(target_zone, "melee")
var/amount_soaked = L.get_armor_soak(target_zone, "melee")
if(amount_blocked >= 100)
return // No need to apply damage.
L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, used_weapon = "hail")
if(amount_soaked >= 10)
return // No need to apply damage.
L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
to_chat(L, "<span class='warning'>The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!</span>")
/datum/weather/sif/blood_moon
@@ -372,9 +372,6 @@
src.updateUsrDialog()
return 0
/obj/machinery/reagentgrinder/attack_ai(mob/user as mob)
return 0
/obj/machinery/reagentgrinder/attack_hand(mob/user as mob)
user.set_machine(src)
interact(user)
@@ -349,7 +349,7 @@
if(affecting.take_damage(0, removed * power * 0.1))
H.UpdateDamageIcon()
if(prob(100 * removed / meltdose)) // Applies disfigurement
if (affecting.can_feel_pain())
if (affecting.organ_can_feel_pain())
H.emote("scream")
H.status_flags |= DISFIGURED
else
@@ -14,8 +14,8 @@
/datum/reagent/inaprovaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien != IS_DIONA)
M.add_chemical_effect(CE_STABLE)
M.add_chemical_effect(CE_PAINKILLER, 25)
M.add_chemical_effect(CE_STABLE, 15)
M.add_chemical_effect(CE_PAINKILLER, 10)
/datum/reagent/bicaridine
name = "Bicaridine"
@@ -76,6 +76,29 @@
M.hallucination = max(0, M.hallucination - 9 * removed)
M.adjustToxLoss(-4 * removed)
/datum/reagent/carthatoline
name = "carthatoline"
id = "carthatoline"
description = "Carthatoline is strong evacuant used to treat severe poisoning."
reagent_state = LIQUID
color = "#225722"
scannable = 1
/datum/reagent/carthatoline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
if(M.getToxLoss() && prob(10))
M.vomit(1)
M.adjustToxLoss(-8 * removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/liver/L = H.internal_organs_by_name[O_LIVER]
if(istype(L))
if(L.robotic >= ORGAN_ROBOT)
return
if(L.damage > 0)
L.damage = max(L.damage - 2 * removed, 0)
/datum/reagent/dexalin
name = "Dexalin"
id = "dexalin"
@@ -109,7 +132,7 @@
if(alien == IS_VOX)
M.adjustToxLoss(removed * 9)
else if(alien != IS_DIONA)
M.adjustOxyLoss(-300 * removed)
M.adjustOxyLoss(-150 * removed)
holder.remove_reagent("lexorin", 3 * removed)
@@ -179,7 +202,7 @@
mrate_static = TRUE
/datum/reagent/paracetamol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.add_chemical_effect(CE_PAINKILLER, 50)
M.add_chemical_effect(CE_PAINKILLER, 25)
/datum/reagent/paracetamol/overdose(var/mob/living/carbon/M, var/alien)
..()
@@ -217,6 +240,8 @@
/datum/reagent/oxycodone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.add_chemical_effect(CE_PAINKILLER, 200)
M.eye_blurry += 10
M.confused += 5
/datum/reagent/oxycodone/overdose(var/mob/living/carbon/M, var/alien)
..()
@@ -246,7 +271,7 @@
holder.remove_reagent("mindbreaker", 5)
M.hallucination = max(0, M.hallucination - 10)
M.adjustToxLoss(5 * removed) // It used to be incredibly deadly due to an oversight. Not anymore!
M.add_chemical_effect(CE_PAINKILLER, 40)
M.add_chemical_effect(CE_PAINKILLER, 20)
/datum/reagent/alkysine
name = "Alkysine"
@@ -307,9 +332,60 @@
continue
if(I.damage > 0) //Peridaxon heals only non-robotic organs
I.damage = max(I.damage - removed, 0)
H.confused += 5
if(I.damage <= 5 && I.organ_tag == O_EYES)
H.eye_blurry += 10 //Eyes need to reset, or something
H.sdisabilities &= ~BLIND
/datum/reagent/osteodaxon
name = "Osteodaxon"
id = "osteodaxon"
description = "An experimental drug used to heal bone fractures."
reagent_state = LIQUID
color = "#C9BCE3"
metabolism = REM * 0.5
overdose = REAGENTS_OVERDOSE * 0.5
scannable = 1
/datum/reagent/osteodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
M.heal_organ_damage(3 * removed, 0) //Gives the bones a chance to set properly even without other meds
if(ishuman(M))
var/mob/living/carbon/human/H = M
for(var/obj/item/organ/external/O in H.bad_external_organs)
if(O.status & ORGAN_BROKEN)
O.mend_fracture() //Only works if the bone won't rebreak, as usual
H.custom_pain("You feel a terrible agony tear through your bones!",60)
H.AdjustWeakened(1) //Bones being regrown will knock you over
/datum/reagent/myelamine
name = "Myelamine"
id = "myelamine"
description = "Used to rapidly clot internal hemorrhages by increasing the effectiveness of platelets."
reagent_state = LIQUID
color = "#4246C7"
metabolism = REM * 0.5
overdose = REAGENTS_OVERDOSE * 0.5
scannable = 1
/datum/reagent/myelamine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
M.eye_blurry += (3 * removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
for(var/obj/item/organ/external/O in H.bad_external_organs)
for(var/datum/wound/W in O.wounds)
if(W.bleeding())
W.damage = max(W.damage - removed, 0)
if(W.damage <= 0)
O.wounds -= W
if(W.internal)
W.damage = max(W.damage - removed, 0)
if(W.damage <= 0)
O.wounds -= W
/datum/reagent/ryetalyn
name = "Ryetalyn"
id = "ryetalyn"
@@ -364,6 +440,8 @@
scannable = 1
/datum/reagent/hyronalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
M.radiation = max(M.radiation - 30 * removed, 0)
/datum/reagent/arithrazine
@@ -378,6 +456,8 @@
scannable = 1
/datum/reagent/arithrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
M.radiation = max(M.radiation - 70 * removed, 0)
M.adjustToxLoss(-10 * removed)
if(prob(60))
@@ -432,11 +512,35 @@
scannable = 1
/datum/reagent/leporazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
if(M.bodytemperature > 310)
M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
else if(M.bodytemperature < 311)
M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
/datum/reagent/rezadone
name = "Rezadone"
id = "rezadone"
description = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects."
reagent_state = SOLID
color = "#669900"
overdose = REAGENTS_OVERDOSE
scannable = 1
/datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
M.adjustCloneLoss(-20 * removed)
M.adjustOxyLoss(-2 * removed)
M.heal_organ_damage(20 * removed, 20 * removed)
M.adjustToxLoss(-20 * removed)
if(dose > 3)
M.status_flags &= ~DISFIGURED
if(dose > 10)
M.make_dizzy(5)
M.make_jittery(5)
/* Antidepressants */
#define ANTIDEPRESSANT_MESSAGE_DELAY 5*60*10
@@ -43,6 +43,13 @@
color = "#003333"
strength = 10
/datum/reagent/toxin/spidertoxin
name = "Spidertoxin"
id = "spidertoxin"
description = "A liquifying toxin produced by giant spiders."
color = "#2CE893"
strength = 5
/datum/reagent/toxin/phoron
name = "Phoron"
id = "phoron"
@@ -160,6 +160,14 @@
required_reagents = list("silicon" = 1, "potassium" = 1, "nitrogen" = 1)
result_amount = 3
/datum/chemical_reaction/carthatoline
name = "Carthatoline"
id = "carthatoline"
result = "carthatoline"
required_reagents = list("dylovene" = 1, "carbon" = 2, "phoron" = 0.1)
catalysts = list("phoron" = 1)
result_amount = 2
/datum/chemical_reaction/tramadol
name = "Tramadol"
id = "tramadol"
@@ -282,6 +290,15 @@
catalysts = list("phoron" = 5)
result_amount = 2
/datum/chemical_reaction/osteodaxon
name = "Osteodaxon"
id = "osteodaxon"
result = "osteodaxon"
required_reagents = list("bicaridine" = 2, "phoron" = 0.1, "carpotoxin" = 1)
catalysts = list("phoron" = 5)
inhibitors = list("clonexadone" = 1) // Messes with cryox
result_amount = 2
/datum/chemical_reaction/virus_food
name = "Virus Food"
id = "virusfood"
@@ -349,6 +366,13 @@
inhibitors = list("sugar" = 1) // Messes up with inaprovaline
result_amount = 2
/datum/chemical_reaction/myelamine
name = "Myelamine"
id = "myelamine"
result = "myelamine"
required_reagents = list("bicaridine" = 1, "iron" = 2, "spidertoxin" = 1)
result_amount = 2
/datum/chemical_reaction/hyperzine
name = "Hyperzine"
id = "hyperzine"
@@ -734,6 +734,19 @@
reagents.add_reagent("pacid",6)
src.bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/spidermeat
name = "meat"
desc = "A slab of green meat."
icon_state = "xenomeat"
filling_color = "#43DE18"
center_of_mass = list("x"=16, "y"=10)
/obj/item/weapon/reagent_containers/food/snacks/spidermeat/New()
..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("spidertoxin",6)
src.bitesize = 6
/obj/item/weapon/reagent_containers/food/snacks/meatball
name = "meatball"
desc = "A great meal all round."
@@ -88,3 +88,33 @@
user << "<span class='notice'>It is currently loaded.</span>"
else
user << "<span class='notice'>It is spent.</span>"
/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting
name = "clotting agent"
desc = "A rapid and safe way to administer clotting drugs by untrained or trained personnel."
icon_state = "autoinjector"
item_state = "autoinjector"
amount_per_transfer_from_this = 10
volume = 10
/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting/New()
..()
reagents.remove_reagent("inaprovaline", 5)
reagents.add_reagent("myelamine", 10)
update_icon()
return
/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed
name = "bone repair injector"
desc = "A rapid and safe way to administer advanced drugs by untrained or trained personnel."
icon_state = "autoinjector"
item_state = "autoinjector"
amount_per_transfer_from_this = 10
volume = 10
/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/New()
..()
reagents.remove_reagent("inaprovaline", 5)
reagents.add_reagent("osteodaxon", 10)
update_icon()
return
+1
View File
@@ -242,6 +242,7 @@ var/obj/machinery/blackbox_recorder/blackbox
var/list/msg_security = list()
var/list/msg_deathsquad = list()
var/list/msg_syndicate = list()
var/list/msg_raider = list()
var/list/msg_cargo = list()
var/list/msg_service = list()
+1 -3
View File
@@ -104,8 +104,6 @@
var/turf/D = locate(T.x, throwy - 1, 1)
for(var/atom/movable/AM as mob|obj in T)
AM.Move(D)
if(istype(T, /turf/simulated))
qdel(T)
for(var/mob/living/carbon/bug in destination)
bug.gib()
@@ -119,7 +117,7 @@
if(M.client)
spawn(0)
if(M.buckled)
M << "\red Sudden acceleration presses you into your chair!"
M << "\red Sudden acceleration presses you into \the [M.buckled]!"
shake_camera(M, 3, 1)
else
M << "\red The floor lurches beneath you!"
+1 -1
View File
@@ -50,7 +50,7 @@
var/public_alert = 0 //Stick to Engineering frequency except for big warnings when integrity bad
var/warning_point = 100
var/warning_alert = "Danger! Crystal hyperstructure instability!"
var/emergency_point = 700
var/emergency_point = 500
var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT."
var/explosion_point = 1000
+2 -2
View File
@@ -25,7 +25,7 @@
if (affected.stage == 0)
user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \
"You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].")
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1)
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -58,7 +58,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool]." , \
"You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool].")
target.custom_pain("The pain in your [affected.name] is going to make you pass out!",1)
target.custom_pain("The pain in your [affected.name] is going to make you pass out!", 50)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+4 -4
View File
@@ -38,7 +38,7 @@
user.visible_message("[user] begins to cut through [target]'s [affected.encased] with \the [tool].", \
"You begin to cut through [target]'s [affected.encased] with \the [tool].")
target.custom_pain("Something hurts horribly in your [affected.name]!",1)
target.custom_pain("Something hurts horribly in your [affected.name]!", 60)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -88,7 +88,7 @@
var/msg = "[user] starts to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
var/self_msg = "You start to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your [affected.name]!",1)
target.custom_pain("Something hurts horribly in your [affected.name]!", 40)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -145,7 +145,7 @@
var/msg = "[user] starts bending [target]'s [affected.encased] back into place with \the [tool]."
var/self_msg = "You start bending [target]'s [affected.encased] back into place with \the [tool]."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your [affected.name]!",1)
target.custom_pain("Something hurts horribly in your [affected.name]!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -202,7 +202,7 @@
var/msg = "[user] starts applying \the [tool] to [target]'s [affected.encased]."
var/self_msg = "You start applying \the [tool] to [target]'s [affected.encased]."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your [affected.name]!",1)
target.custom_pain("Something hurts horribly in your [affected.name]!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+7 -7
View File
@@ -42,7 +42,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts the bloodless incision on [target]'s [affected.name] with \the [tool].", \
"You start the bloodless incision on [target]'s [affected.name] with \the [tool].")
target.custom_pain("You feel a horrible, searing pain in your [affected.name]!",1)
target.custom_pain("You feel a horrible, searing pain in your [affected.name]!", 50)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -81,7 +81,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].", \
"You start to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].")
target.custom_pain("You feel a horrible, searing pain in your [affected.name] as it is pushed apart!",1)
target.custom_pain("You feel a horrible, searing pain in your [affected.name] as it is pushed apart!", 50)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -124,7 +124,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts the incision on [target]'s [affected.name] with \the [tool].", \
"You start the incision on [target]'s [affected.name] with \the [tool].")
target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!",1)
target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!", 40)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -163,7 +163,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts clamping bleeders in [target]'s [affected.name] with \the [tool].", \
"You start clamping bleeders in [target]'s [affected.name] with \the [tool].")
target.custom_pain("The pain in your [affected.name] is maddening!",1)
target.custom_pain("The pain in your [affected.name] is maddening!", 40)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -205,7 +205,7 @@
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
user.visible_message(msg, self_msg)
target.custom_pain("It feels like the skin on your [affected.name] is on fire!",1)
target.custom_pain("It feels like the skin on your [affected.name] is on fire!", 40)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -254,7 +254,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.name] with \the [tool]." , \
"You are beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].")
target.custom_pain("Your [affected.name] is being burned!",1)
target.custom_pain("Your [affected.name] is being burned!", 40)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -295,7 +295,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning to amputate [target]'s [affected.name] with \the [tool]." , \
"You are beginning to cut through [target]'s [affected.amputation_point] with \the [tool].")
target.custom_pain("Your [affected.amputation_point] is being ripped apart!",1)
target.custom_pain("Your [affected.amputation_point] is being ripped apart!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+5 -5
View File
@@ -56,7 +56,7 @@
user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
"You start treating damage to [target]'s [I.name] with [tool_name]." )
target.custom_pain("The pain in your [affected.name] is living hell!",1)
target.custom_pain("The pain in your [affected.name] is living hell!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -146,7 +146,7 @@
user.visible_message("[user] starts to separate [target]'s [target.op_stage.current_organ] with \the [tool].", \
"You start to separate [target]'s [target.op_stage.current_organ] with \the [tool]." )
target.custom_pain("The pain in your [affected.name] is living hell!",1)
target.custom_pain("The pain in your [affected.name] is living hell!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -197,7 +197,7 @@
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] starts removing [target]'s [target.op_stage.current_organ] with \the [tool].", \
"You start removing [target]'s [target.op_stage.current_organ] with \the [tool].")
target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!",1)
target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -271,7 +271,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \
"You start transplanting \the [tool] into [target]'s [affected.name].")
target.custom_pain("Someone's rooting around in your [affected.name]!",1)
target.custom_pain("Someone's rooting around in your [affected.name]!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -322,7 +322,7 @@
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \
"You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].")
target.custom_pain("Someone's digging needles into your [target.op_stage.current_organ]!",1)
target.custom_pain("Someone's digging needles into your [target.op_stage.current_organ]!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+3 -3
View File
@@ -33,7 +33,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.name] with \the [tool]." , \
"You start patching the damaged vein in [target]'s [affected.name] with \the [tool].")
target.custom_pain("The pain in [affected.name] is unbearable!",1)
target.custom_pain("The pain in [affected.name] is unbearable!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -81,7 +81,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts cutting away necrotic tissue in [target]'s [affected.name] with \the [tool]." , \
"You start cutting away necrotic tissue in [target]'s [affected.name] with \the [tool].")
target.custom_pain("The pain in [affected.name] is unbearable!",1)
target.custom_pain("The pain in [affected.name] is unbearable!", 100)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -133,7 +133,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts applying medication to the affected tissue in [target]'s [affected.name] with \the [tool]." , \
"You start applying medication to the affected tissue in [target]'s [affected.name] with \the [tool].")
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1)
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+1 -3
View File
@@ -121,13 +121,11 @@
stage = 4
badness = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.suiciding = 1
mob.suiciding = 30
//instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
viewers(mob) << "\red <b>[mob.name] is holding \his breath. It looks like \he's trying to commit suicide.</b>"
mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss())
mob.updatehealth()
spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds
mob.suiciding = 0
/datum/disease2/effect/killertoxins
name = "Toxification Syndrome"

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