Merge branch 'master' of https://github.com/PolarisSS13/Polaris into polaris-sync

# Conflicts:
#	code/modules/client/preference_setup/general/03_body.dm
#	code/modules/mob/new_player/sprite_accessories.dm
#	html/changelogs/.all_changelog.yml
#	icons/mob/human_races/markings.dmi
#	vorestation.dme
This commit is contained in:
Leshana
2017-04-01 19:07:55 -04:00
205 changed files with 1939 additions and 725 deletions

View File

@@ -228,13 +228,16 @@ mob/living/carbon/human/airflow_hit(atom/A)
var/b_loss = airflow_speed * vsc.airflow_damage var/b_loss = airflow_speed * vsc.airflow_damage
var/blocked = run_armor_check(BP_HEAD,"melee") 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") 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") 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) if(airflow_speed > 10)
Paralyse(round(airflow_speed * vsc.airflow_stun)) Paralyse(round(airflow_speed * vsc.airflow_stun))

View File

@@ -341,6 +341,7 @@
var/mob/living/carbon/C = usr var/mob/living/carbon/C = usr
C.swap_hand() C.swap_hand()
else else
var/turf/T = screen_loc2turf("screen-loc", get_turf(usr)) var/turf/T = screen_loc2turf(screen_loc, get_turf(usr))
T.Click(location, control, params) if(T)
T.Click(location, control, params)
. = 1 . = 1

View File

@@ -108,6 +108,7 @@ var/const/ERT_FREQ = 1345
var/const/AI_FREQ = 1343 var/const/AI_FREQ = 1343
var/const/DTH_FREQ = 1341 var/const/DTH_FREQ = 1341
var/const/SYND_FREQ = 1213 var/const/SYND_FREQ = 1213
var/const/RAID_FREQ = 1277
var/const/ENT_FREQ = 1461 //entertainment frequency. This is not a diona exclusive frequency. var/const/ENT_FREQ = 1461 //entertainment frequency. This is not a diona exclusive frequency.
// department channels // department channels
@@ -133,6 +134,7 @@ var/list/radiochannels = list(
"Response Team" = ERT_FREQ, "Response Team" = ERT_FREQ,
"Special Ops" = DTH_FREQ, "Special Ops" = DTH_FREQ,
"Mercenary" = SYND_FREQ, "Mercenary" = SYND_FREQ,
"Raider" = RAID_FREQ,
"Supply" = SUP_FREQ, "Supply" = SUP_FREQ,
"Service" = SRV_FREQ, "Service" = SRV_FREQ,
"AI Private" = AI_FREQ, "AI Private" = AI_FREQ,
@@ -145,7 +147,7 @@ var/list/radiochannels = list(
var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ) var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ)
// Antag channels, i.e. Syndicate // 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 //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) var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ)

View File

@@ -74,6 +74,10 @@
name = "request console electronics" name = "request console electronics"
path =/obj/item/weapon/circuitboard/request path =/obj/item/weapon/circuitboard/request
/datum/category_item/autolathe/engineering/pipelayer
name = "pipe layer electronics"
path =/obj/item/weapon/circuitboard/pipelayer
/datum/category_item/autolathe/engineering/motor /datum/category_item/autolathe/engineering/motor
name = "motor" name = "motor"
path =/obj/item/weapon/stock_parts/motor path =/obj/item/weapon/stock_parts/motor

View File

@@ -14,6 +14,11 @@
name = "welding tool" name = "welding tool"
path =/obj/item/weapon/weldingtool path =/obj/item/weapon/weldingtool
/datum/category_item/autolathe/tools/electric_welder
name = "electric welding tool"
path =/obj/item/weapon/weldingtool/electric/unloaded
hidden = 1
/datum/category_item/autolathe/tools/screwdriver /datum/category_item/autolathe/tools/screwdriver
name = "screwdriver" name = "screwdriver"
path =/obj/item/weapon/screwdriver path =/obj/item/weapon/screwdriver

View File

@@ -156,7 +156,7 @@ datum/supply_packs/costumes/witch
/obj/item/clothing/under/wedding/bride_blue, /obj/item/clothing/under/wedding/bride_blue,
/obj/item/clothing/under/wedding/bride_red, /obj/item/clothing/under/wedding/bride_red,
/obj/item/clothing/under/wedding/bride_white, /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_green,
/obj/item/clothing/under/dress/dress_pink, /obj/item/clothing/under/dress/dress_pink,
/obj/item/clothing/under/dress/dress_orange, /obj/item/clothing/under/dress/dress_orange,

View File

@@ -33,6 +33,15 @@
containertype = /obj/structure/closet/crate/engineering/electrical containertype = /obj/structure/closet/crate/engineering/electrical
containername = "Electrical maintenance crate" containername = "Electrical maintenance crate"
/datum/supply_packs/eng/e_welders
name = "Electric welder crate"
contains = list(
/obj/item/weapon/weldingtool/electric = 3
)
cost = 15
containertype = /obj/structure/closet/crate/engineering/electrical
containername = "Electric welder crate"
/datum/supply_packs/eng/mechanical /datum/supply_packs/eng/mechanical
name = "Mechanical maintenance crate" name = "Mechanical maintenance crate"
contains = list( contains = list(

View File

@@ -141,9 +141,10 @@
access = access_hydroponics access = access_hydroponics
/datum/supply_packs/hydro/tray /datum/supply_packs/hydro/tray
name = "Empty hydroponics tray" name = "Empty hydroponics trays"
cost = 20 cost = 50
containertype = /obj/structure/closet/crate/hydroponics containertype = /obj/structure/closet/crate/hydroponics
containername = "Hydroponics tray crate" containername = "Hydroponics tray crate"
contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0}) contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0} = 3)
access = access_hydroponics access = access_hydroponics

View File

@@ -66,6 +66,27 @@
containername = "Surgery crate" containername = "Surgery crate"
access = access_medical 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 /datum/supply_packs/med/sterile
name = "Sterile equipment crate" name = "Sterile equipment crate"
contains = list( contains = list(

View File

@@ -74,6 +74,14 @@
containername = "Energy marksman crate" containername = "Energy marksman crate"
access = access_armory access = access_armory
/datum/supply_packs/munitions/burstlaser
name = "Burst laser crate"
contains = list(/obj/item/weapon/gun/energy/gun/burst = 2)
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "Burst laser crate"
access = access_armory
/datum/supply_packs/munitions/ionweapons /datum/supply_packs/munitions/ionweapons
name = "Electromagnetic weapons crate" name = "Electromagnetic weapons crate"
contains = list( contains = list(
@@ -85,6 +93,17 @@
containername = "electromagnetic weapons crate" containername = "electromagnetic weapons crate"
access = access_armory access = access_armory
/datum/supply_packs/munitions/ionpistols
name = "Electromagnetic pistols crate"
contains = list(
/obj/item/weapon/gun/energy/ionrifle/pistol = 2,
/obj/item/weapon/storage/box/emps
)
cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "electromagnetic weapons crate"
access = access_armory
/datum/supply_packs/randomised/munitions/automatic /datum/supply_packs/randomised/munitions/automatic
name = "Automatic weapon crate" name = "Automatic weapon crate"
num_contained = 2 num_contained = 2

View File

@@ -159,3 +159,13 @@
/obj/item/device/kit/paint/gygax/recitence /obj/item/device/kit/paint/gygax/recitence
) )
name = "Random Gygax exosuit modkit" name = "Random Gygax exosuit modkit"
/datum/supply_packs/robotics/jumper_cables
name = "Jumper kit crate"
contains = list(
/obj/item/device/defib_kit/jumper_kit = 4
)
cost = 30
containertype = /obj/structure/closet/crate/secure/science
containername = "Jumper kit crate"
access = access_robotics

View File

@@ -40,6 +40,7 @@
name = "Exotic seeds crate" name = "Exotic seeds crate"
contains = list( contains = list(
/obj/item/seeds/replicapod = 2, /obj/item/seeds/replicapod = 2,
/obj/item/seeds/ambrosiavulgarisseed = 2,
/obj/item/seeds/libertymycelium, /obj/item/seeds/libertymycelium,
/obj/item/seeds/reishimycelium, /obj/item/seeds/reishimycelium,
/obj/item/seeds/random = 6, /obj/item/seeds/random = 6,
@@ -49,4 +50,3 @@
containertype = /obj/structure/closet/crate/hydroponics containertype = /obj/structure/closet/crate/hydroponics
containername = "Exotic Seeds crate" containername = "Exotic Seeds crate"
access = access_hydroponics access = access_hydroponics

View File

@@ -19,6 +19,16 @@
item_cost = 5 item_cost = 5
path = /obj/item/weapon/storage/box/ambrosia 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 /datum/uplink_item/item/medical/ambrosiadeusseeds
name = "Box of 7x ambrosia deus seed packets" name = "Box of 7x ambrosia deus seed packets"
item_cost = 10 item_cost = 10

View File

@@ -43,12 +43,15 @@
/datum/antagonist/proc/create_radio(var/freq, var/mob/living/carbon/human/player) /datum/antagonist/proc/create_radio(var/freq, var/mob/living/carbon/human/player)
var/obj/item/device/radio/R var/obj/item/device/radio/R
if(freq == SYND_FREQ) switch(freq)
R = new/obj/item/device/radio/headset/syndicate(player) if(SYND_FREQ)
else R = new/obj/item/device/radio/headset/syndicate(player)
R = new/obj/item/device/radio/headset(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) player.equip_to_slot_or_del(R, slot_l_ear)
return R return R

View File

@@ -232,7 +232,7 @@ var/datum/antagonist/raider/raiders
W.handle_item_insertion(id) W.handle_item_insertion(id)
player.equip_to_slot_or_del(W, slot_wear_id) player.equip_to_slot_or_del(W, slot_wear_id)
spawn_money(rand(50,150)*10,W) spawn_money(rand(50,150)*10,W)
create_radio(SYND_FREQ, player) create_radio(RAID_FREQ, player)
return 1 return 1

View File

@@ -305,7 +305,7 @@
if(subject.isSynthetic()) if(subject.isSynthetic())
scantemp = "Error: Majority of subject is non-organic." scantemp = "Error: Majority of subject is non-organic."
return return
if (subject.suiciding == 1) if (subject.suiciding)
scantemp = "Error: Subject's brain is not responding to scanning stimuli." scantemp = "Error: Subject's brain is not responding to scanning stimuli."
return return
if ((!subject.ckey) || (!subject.client)) if ((!subject.ckey) || (!subject.client))

View File

@@ -1,57 +1,104 @@
/obj/machinery/pipelayer /obj/machinery/pipelayer
name = "automatic pipe layer" name = "automatic pipe layer"
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "pipe_d" icon_state = "pipe_d"
density = 1 density = 1
var/turf/old_turf circuit = /obj/item/weapon/circuitboard/pipelayer
var/old_dir var/turf/old_turf // Last turf we were on.
var/on = 0 var/old_dir // Last direction we were facing.
var/a_dis = 0 var/on = 0 // Pipelaying online?
var/P_type = 0 var/a_dis = 0 // Auto-dismantling - If enabled it will remove floor tiles
var/P_type_t = "" var/P_type = 0 // Currently selected pipe type
var/max_metal = 50 var/P_type_t = "" // Name of currently selected pipe type
var/metal = 10 var/max_metal = 50 // Max capacity for internal metal storage
var/obj/item/weapon/wrench/W var/metal = 0 // Current amount in internal metal storage
var/pipe_cost = 0.25 // Cost in steel for each pipe.
var/obj/item/weapon/wrench/W // Internal wrench used for wrenching down the pipes
var/list/Pipes = list("regular pipes"=0,"scrubbers pipes"=31,"supply pipes"=29,"heat exchange pipes"=2) var/list/Pipes = list("regular pipes"=0,"scrubbers pipes"=31,"supply pipes"=29,"heat exchange pipes"=2)
/obj/machinery/pipelayer/New() /obj/machinery/pipelayer/New()
W = new(src) W = new(src)
..() ..()
default_apply_parts()
update_icon()
/obj/machinery/pipelayer/Destroy()
qdel(W)
W = null
..()
/obj/machinery/pipelayer/RefreshParts()
var/mb_rating = 0
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
mb_rating += M.rating
max_metal = mb_rating * initial(max_metal)
/obj/machinery/pipelayer/dismantle()
eject_metal()
..()
// Whenever we move, if enabled try and lay pipe
/obj/machinery/pipelayer/Move(new_turf,M_Dir) /obj/machinery/pipelayer/Move(new_turf,M_Dir)
..() ..()
if(on && a_dis) if(on && a_dis)
dismantleFloor(old_turf) dismantleFloor(old_turf)
layPipe(old_turf,M_Dir,old_dir) layPipe(old_turf, M_Dir, old_dir)
old_turf = new_turf old_turf = new_turf
old_dir = turn(M_Dir,180) old_dir = turn(M_Dir, 180)
/obj/machinery/pipelayer/attack_hand(mob/user as mob) /obj/machinery/pipelayer/attack_hand(mob/user as mob)
if(!metal&&!on) if(..())
return
if(panel_open)
if(metal < 1)
user << "\The [src] is empty."
return
var/answer = alert(user, "Do you want to eject all the metal in \the [src]?", , "Yes","No")
if(answer == "Yes")
var/amount_ejected = eject_metal()
user.visible_message("<span class='notice'>[user] removes [amount_ejected] sheet\s of [DEFAULT_WALL_MATERIAL] from the \the [src].</span>",
"<span class='notice'>You remove [amount_ejected] sheet\s of [DEFAULT_WALL_MATERIAL] from \the [src].</span>")
return
if(!metal && !on)
user << "<span class='warning'>\The [src] doesn't work without metal.</span>" user << "<span class='warning'>\The [src] doesn't work without metal.</span>"
return return
on=!on on = !on
old_turf = get_turf(src)
old_dir = dir
user.visible_message("<span class='notice'>[user] has [!on?"de":""]activated \the [src].</span>", "<span class='notice'>You [!on?"de":""]activate \the [src].</span>") user.visible_message("<span class='notice'>[user] has [!on?"de":""]activated \the [src].</span>", "<span class='notice'>You [!on?"de":""]activate \the [src].</span>")
return return
/obj/machinery/pipelayer/attackby(var/obj/item/W as obj, var/mob/user as mob) /obj/machinery/pipelayer/attackby(var/obj/item/W as obj, var/mob/user as mob)
if(default_deconstruction_screwdriver(user, W))
if (istype(W, /obj/item/weapon/wrench)) return
if(default_deconstruction_crowbar(user, W))
return
if(default_part_replacement(user, W))
return
if (!panel_open && iswrench(W))
P_type_t = input("Choose pipe type", "Pipe type") as null|anything in Pipes P_type_t = input("Choose pipe type", "Pipe type") as null|anything in Pipes
P_type = Pipes[P_type_t] P_type = Pipes[P_type_t]
user.visible_message("<span class='notice'>[user] has set \the [src] to manufacture [P_type_t].</span>", "<span class='notice'>You set \the [src] to manufacture [P_type_t].</span>") user.visible_message("<span class='notice'>[user] has set \the [src] to manufacture [P_type_t].</span>", "<span class='notice'>You set \the [src] to manufacture [P_type_t].</span>")
return return
if(!panel_open && iscrowbar(W))
if(istype(W, /obj/item/weapon/crowbar)) a_dis = !a_dis
a_dis=!a_dis
user.visible_message("<span class='notice'>[user] has [!a_dis?"de":""]activated auto-dismantling.</span>", "<span class='notice'>You [!a_dis?"de":""]activate auto-dismantling.</span>") user.visible_message("<span class='notice'>[user] has [!a_dis?"de":""]activated auto-dismantling.</span>", "<span class='notice'>You [!a_dis?"de":""]activate auto-dismantling.</span>")
return return
if(istype(W, /obj/item/pipe))
// NOTE - We must check for matter, otherwise the (free) pipe dispenser can be used to get infinite steel.
if(!W.matter || W.matter[DEFAULT_WALL_MATERIAL] < pipe_cost * SHEET_MATERIAL_AMOUNT)
user << "<span class='warning'>\The [W] doesn't contain enough [DEFAULT_WALL_MATERIAL] to recycle.</span>"
else if(metal + pipe_cost > max_metal)
user << "<span class='notice'>\The [src] is full.</span>"
else
user.drop_from_inventory(W)
metal += pipe_cost
usr << "<span class='notice'>You recycle \the [W].</span>"
qdel(W)
return
if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL) if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL)
var/result = load_metal(W) var/result = load_metal(W)
if(isnull(result)) if(isnull(result))
user << "<span class='warning'>Unable to load [W] - no metal found.</span>" user << "<span class='warning'>Unable to load [W] - no metal found.</span>"
@@ -59,23 +106,8 @@
user << "<span class='notice'>\The [src] is full.</span>" user << "<span class='notice'>\The [src] is full.</span>"
else else
user.visible_message("<span class='notice'>[user] has loaded metal into \the [src].</span>", "<span class='notice'>You load metal into \the [src]</span>") user.visible_message("<span class='notice'>[user] has loaded metal into \the [src].</span>", "<span class='notice'>You load metal into \the [src]</span>")
return return
if(istype(W, /obj/item/weapon/screwdriver))
if(metal)
var/m = round(input(usr,"Please specify the amount of metal to remove","Remove metal",min(round(metal),50)) as num, 1)
m = min(m, 50)
m = min(m, round(metal))
m = round(m)
if(m)
use_metal(m)
var/obj/item/stack/material/steel/MM = new (get_turf(src))
MM.amount = m
user.visible_message("<span class='notice'>[user] removes [m] sheet\s of metal from the \the [src].</span>", "<span class='notice'>You remove [m] sheet\s of metal from \the [src]</span>")
else
user << "\The [src] is empty."
return
..() ..()
/obj/machinery/pipelayer/examine(mob/user) /obj/machinery/pipelayer/examine(mob/user)
@@ -83,7 +115,7 @@
user << "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated." user << "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated."
/obj/machinery/pipelayer/proc/reset() /obj/machinery/pipelayer/proc/reset()
on=0 on = 0
return return
/obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/MM) /obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/MM)
@@ -100,12 +132,22 @@
return return
/obj/machinery/pipelayer/proc/use_metal(amount) /obj/machinery/pipelayer/proc/use_metal(amount)
if(!metal || metal<amount) if(!metal || metal < amount)
visible_message("\The [src] deactivates as its metal source depletes.") visible_message("\The [src] deactivates as its metal source depletes.")
return return
metal-=amount metal -= amount
return 1 return 1
/obj/machinery/pipelayer/proc/eject_metal()
var/amount_ejected = 0
while (metal >= 1)
var/material/M = get_material_by_name(DEFAULT_WALL_MATERIAL)
var/obj/item/stack/material/S = new M.stack_type(get_turf(src))
S.amount = min(metal, S.max_amount)
metal -= S.amount
amount_ejected += S.amount
return amount_ejected
/obj/machinery/pipelayer/proc/dismantleFloor(var/turf/new_turf) /obj/machinery/pipelayer/proc/dismantleFloor(var/turf/new_turf)
if(istype(new_turf, /turf/simulated/floor)) if(istype(new_turf, /turf/simulated/floor))
var/turf/simulated/floor/T = new_turf var/turf/simulated/floor/T = new_turf
@@ -114,11 +156,11 @@
return new_turf.is_plating() return new_turf.is_plating()
/obj/machinery/pipelayer/proc/layPipe(var/turf/w_turf,var/M_Dir,var/old_dir) /obj/machinery/pipelayer/proc/layPipe(var/turf/w_turf,var/M_Dir,var/old_dir)
if(!on || !(M_Dir in list(1, 2, 4, 8)) || M_Dir==old_dir) if(!on || !(M_Dir in list(NORTH, SOUTH, EAST, WEST)) || M_Dir==old_dir)
return reset() return reset()
if(!use_metal(0.25)) if(!use_metal(pipe_cost))
return reset() return reset()
var/fdirn = turn(M_Dir,180) var/fdirn = turn(M_Dir, 180)
var/p_type var/p_type
var/p_dir var/p_dir
@@ -130,6 +172,8 @@
p_dir=M_Dir p_dir=M_Dir
var/obj/item/pipe/P = new (w_turf, pipe_type=p_type, dir=p_dir) var/obj/item/pipe/P = new (w_turf, pipe_type=p_type, dir=p_dir)
// We used metal to make these, so should be reclaimable!
P.matter = list(DEFAULT_WALL_MATERIAL = pipe_cost * SHEET_MATERIAL_AMOUNT)
P.attackby(W , src) P.attackby(W , src)
return 1 return 1

View File

@@ -8,7 +8,7 @@ obj/machinery/recharger
idle_power_usage = 4 idle_power_usage = 4
active_power_usage = 40000 //40 kW active_power_usage = 40000 //40 kW
var/obj/item/charging = null var/obj/item/charging = null
var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly) var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric)
var/icon_state_charged = "recharger2" var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1" var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered var/icon_state_idle = "recharger0" //also when unpowered
@@ -33,19 +33,19 @@ obj/machinery/recharger
if(allowed) if(allowed)
if(charging) if(charging)
user << "<span class='warning'>\A [charging] is already charging here.</span>" to_chat(user, "<span class='warning'>\A [charging] is already charging here.</span>")
return return
// Checks to make sure he's not in space doing it, and that the area got proper power. // Checks to make sure he's not in space doing it, and that the area got proper power.
if(!powered()) if(!powered())
user << "<span class='warning'>The [name] blinks red as you try to insert the item!</span>" to_chat(user, "<span class='warning'>The [name] blinks red as you try to insert the item!</span>")
return return
if(istype(G, /obj/item/weapon/gun/energy)) if(istype(G, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = G var/obj/item/weapon/gun/energy/E = G
if(!E.power_supply) if(!E.power_supply)
user << "<span class='notice'>Your gun has no power cell.</span>" to_chat(user, "<span class='notice'>Your gun has no power cell.</span>")
return return
if(E.self_recharge) if(E.self_recharge)
user << "<span class='notice'>Your gun has no recharge port.</span>" to_chat(user, "<span class='notice'>Your gun has no recharge port.</span>")
return return
if(istype(G, /obj/item/weapon/gun/energy/staff)) if(istype(G, /obj/item/weapon/gun/energy/staff))
return return
@@ -65,16 +65,22 @@ obj/machinery/recharger
if(!assembly.battery) if(!assembly.battery)
to_chat(user, "<span class='warning'>The assembly doesn't have a power cell.</span>") to_chat(user, "<span class='warning'>The assembly doesn't have a power cell.</span>")
return return
if(istype(G, /obj/item/weapon/weldingtool/electric))
var/obj/item/weapon/weldingtool/electric/welder = G
if(!welder.power_supply)
to_chat(user, "<span class='notice'>Your welder has no power cell.</span>")
return
user.drop_item() user.drop_item()
G.loc = src G.loc = src
charging = G charging = G
update_icon() update_icon()
else if(portable && istype(G, /obj/item/weapon/wrench)) else if(portable && istype(G, /obj/item/weapon/wrench))
if(charging) if(charging)
user << "<span class='warning'>Remove [charging] first!</span>" to_chat(user, "<span class='warning'>Remove [charging] first!</span>")
return return
anchored = !anchored anchored = !anchored
user << "You [anchored ? "attached" : "detached"] the recharger." to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.")
playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
else if(default_deconstruction_screwdriver(user, G)) else if(default_deconstruction_screwdriver(user, G))
return return
@@ -208,8 +214,8 @@ obj/machinery/recharger
name = "wall recharger" name = "wall recharger"
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "wrecharger0" icon_state = "wrecharger0"
active_power_usage = 25000 //25 kW , It's more specialized than the standalone recharger (guns and batons only) so make it more powerful active_power_usage = 25000 //25 kW , It's more specialized than the standalone recharger (guns, batons, and flashlights only) so make it more powerful
allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/weapon/cell/device) allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/flashlight, /obj/item/weapon/cell/device)
icon_state_charged = "wrecharger2" icon_state_charged = "wrecharger2"
icon_state_charging = "wrecharger1" icon_state_charging = "wrecharger1"
icon_state_idle = "wrecharger0" icon_state_idle = "wrecharger0"

View File

@@ -374,6 +374,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg blackbox.msg_deathsquad += blackbox_msg
if(SYND_FREQ) if(SYND_FREQ)
blackbox.msg_syndicate += blackbox_msg blackbox.msg_syndicate += blackbox_msg
if(RAID_FREQ)
blackbox.msg_raider += blackbox_msg
if(SUP_FREQ) if(SUP_FREQ)
blackbox.msg_cargo += blackbox_msg blackbox.msg_cargo += blackbox_msg
if(SRV_FREQ) 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 blackbox.msg_deathsquad += blackbox_msg
if(SYND_FREQ) if(SYND_FREQ)
blackbox.msg_syndicate += blackbox_msg blackbox.msg_syndicate += blackbox_msg
if(RAID_FREQ)
blackbox.msg_raider += blackbox_msg
if(SUP_FREQ) if(SUP_FREQ)
blackbox.msg_cargo += blackbox_msg blackbox.msg_cargo += blackbox_msg
if(SRV_FREQ) if(SRV_FREQ)

View File

@@ -226,7 +226,7 @@
delete_me = 1 delete_me = 1
/obj/effect/landmark/costume/cutewitch/New() /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/clothing/head/witchwig(src.loc)
new /obj/item/weapon/staff/broom(src.loc) new /obj/item/weapon/staff/broom(src.loc)
delete_me = 1 delete_me = 1

View File

@@ -44,6 +44,7 @@
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up 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/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/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/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/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 var/zoomdevicename = null //name used for message when binoculars/scope is used

View File

@@ -2,7 +2,7 @@
name = "inteliCard" name = "inteliCard"
icon = 'icons/obj/pda.dmi' icon = 'icons/obj/pda.dmi'
icon_state = "aicard" // aicard-full icon_state = "aicard" // aicard-full
item_state = "electronic" item_state = "aicard"
w_class = ITEMSIZE_SMALL w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
show_messages = 0 show_messages = 0

View File

@@ -8,6 +8,8 @@
var/state //0 off, 1 open, 2 working, 3 dead var/state //0 off, 1 open, 2 working, 3 dead
var/uses = 2 //Calculates initial uses based on starting cell size var/uses = 2 //Calculates initial uses based on starting cell size
var/use_on_synthetic = 0 //If 1, this is only useful on FBPs, if 0, this is only useful on fleshies
var/pad_name = "defib pads" //Just the name given for some cosmetic things
var/chance = 75 //Percent chance of working var/chance = 75 //Percent chance of working
var/charge_cost //Set in New() based on uses var/charge_cost //Set in New() based on uses
var/obj/item/weapon/cell/cell //The size is mostly irrelevant, see 'uses' var/obj/item/weapon/cell/cell //The size is mostly irrelevant, see 'uses'
@@ -32,13 +34,31 @@
if(istype(onto) && Adjacent(usr) && !usr.restrained() && !usr.stat) if(istype(onto) && Adjacent(usr) && !usr.restrained() && !usr.stat)
var/mob/living/carbon/human/user = usr var/mob/living/carbon/human/user = usr
//<--Feel free to code clothing checks right here //<--Feel free to code clothing checks right here
user.visible_message("<span class='warning'>[user] begins applying defib pads to [onto].</span>", if(can_defib(onto))
"<span class='warning'>You begin applying defib pads to [onto].</span>") user.visible_message("<span class='warning'>[user] begins applying [pad_name] to [onto].</span>",
"<span class='warning'>You begin applying [pad_name] to [onto].</span>")
if(do_after(user, 100, onto)) if(do_after(user, 100, onto))
patient = onto patient = onto
statechange(1,patient) statechange(1,patient)
user.visible_message("<span class='warning'>[user] applies defib pads to [onto].</span>", user.visible_message("<span class='warning'>[user] applies [pad_name] to [onto].</span>",
"<span class='warning'>You finish applying defib pads to [onto].</span>") "<span class='warning'>You finish applying [pad_name] to [onto].</span>")
//can_defib() check is where all of the qualifying conditions should go
//Could probably toss in checks here for damage, organs, etc, but for now I'll leave it as just this
/obj/item/device/defib_kit/proc/can_defib(var/mob/living/carbon/human/target)
var/mob/living/carbon/human/user = usr
if(use_on_synthetic && !target.isSynthetic())
to_chat(user, "[src] isn't designed for organics!")
return 0
else if(!use_on_synthetic && target.isSynthetic())
to_chat(user, "[src] isn't designed for synthetics!")
return 0
else if(!target.isSynthetic() && ((world.time - target.timeofdeath) > (10 MINUTES)))//Can only revive organics within a few minutes
to_chat(user, "There is no spark of life in [target.name], they've been dead too long to revive this way.")
return 0
return 1
/obj/item/device/defib_kit/attackby(var/obj/item/A as obj, mob/living/user as mob) /obj/item/device/defib_kit/attackby(var/obj/item/A as obj, mob/living/user as mob)
..() ..()
@@ -94,7 +114,7 @@
//Patient moved too far //Patient moved too far
if(patient && !(get_dist(src,patient) <= 1)) //You separated the kit and pads too far if(patient && !(get_dist(src,patient) <= 1)) //You separated the kit and pads too far
audible_message("<span class='warning'>There's a clatter as the defib pads are yanked off of [patient].</span>") audible_message("<span class='warning'>There is a clatter as the [pad_name] are yanked off of [patient].</span>")
statechange(0) statechange(0)
patient = null patient = null
return return
@@ -111,7 +131,7 @@
patient.visible_message("<span class='warning'>[patient] convulses!</span>") patient.visible_message("<span class='warning'>[patient] convulses!</span>")
playsound(src.loc, 'sound/effects/sparks2.ogg', 75, 1) playsound(src.loc, 'sound/effects/sparks2.ogg', 75, 1)
//Actual rezzing code //Actual rezzing code
if(prob(chance) && ((world.time - patient.timeofdeath) < (10 MINUTES))) //Can only revive within a few minutes if(prob(chance))
if(!patient.client && patient.mind) //Don't force the dead person to come back if they don't want to. if(!patient.client && patient.mind) //Don't force the dead person to come back if they don't want to.
for(var/mob/observer/dead/ghost in player_list) for(var/mob/observer/dead/ghost in player_list)
if(ghost.mind == patient.mind) if(ghost.mind == patient.mind)
@@ -155,3 +175,10 @@
break break
return return
/obj/item/device/defib_kit/jumper_kit
name = "jumper cable kit"
desc = "This Morpheus-branded FBP defib kit is a semi-automated model. Apply cables, step back, wait."
icon_state = "jumper_kit"
use_on_synthetic = 1
pad_name = "jumper cables"

View File

@@ -181,6 +181,38 @@
else else
return ..() return ..()
/obj/item/device/flashlight/MouseDrop(obj/over_object as obj)
if(!canremove)
return
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
return
if (!( istype(over_object, /obj/screen) ))
return ..()
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this.
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
return
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
return
switch(over_object.name)
if("r_hand")
usr.u_equip(src)
usr.put_in_r_hand(src)
if("l_hand")
usr.u_equip(src)
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/device/flashlight/attackby(obj/item/weapon/W, mob/user as mob) /obj/item/device/flashlight/attackby(obj/item/weapon/W, mob/user as mob)
if(power_use) if(power_use)
if(istype(W, /obj/item/weapon/cell)) if(istype(W, /obj/item/weapon/cell))
@@ -210,6 +242,26 @@
w_class = ITEMSIZE_TINY w_class = ITEMSIZE_TINY
power_use = 0 power_use = 0
/obj/item/device/flashlight/color //Default color is blue, just roll with it.
name = "blue flashlight"
desc = "A hand-held emergency light. This one is blue."
icon_state = "flashlight_blue"
/obj/item/device/flashlight/color/red
name = "red flashlight"
desc = "A hand-held emergency light. This one is red."
icon_state = "flashlight_red"
/obj/item/device/flashlight/color/orange
name = "orange flashlight"
desc = "A hand-held emergency light. This one is orange."
icon_state = "flashlight_orange"
/obj/item/device/flashlight/color/yellow
name = "yellow flashlight"
desc = "A hand-held emergency light. This one is yellow."
icon_state = "flashlight_yellow"
/obj/item/device/flashlight/maglight /obj/item/device/flashlight/maglight
name = "maglight" name = "maglight"
desc = "A very, very heavy duty flashlight." desc = "A very, very heavy duty flashlight."

View File

@@ -19,6 +19,12 @@
origin_tech = list(TECH_ILLEGAL = 3) origin_tech = list(TECH_ILLEGAL = 3)
syndie = 1//Signifies that it de-crypts Syndicate transmissions 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 /obj/item/device/encryptionkey/binary
icon_state = "cypherkey" icon_state = "cypherkey"
translate_binary = 1 translate_binary = 1

View File

@@ -75,6 +75,15 @@
syndie = 1 syndie = 1
ks1type = /obj/item/device/encryptionkey/syndicate 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 /obj/item/device/radio/headset/binary
origin_tech = list(TECH_ILLEGAL = 3) origin_tech = list(TECH_ILLEGAL = 3)
ks1type = /obj/item/device/encryptionkey/binary ks1type = /obj/item/device/encryptionkey/binary
@@ -289,6 +298,7 @@
desc = "The headset of the boss's boss." desc = "The headset of the boss's boss."
icon_state = "com_headset" icon_state = "com_headset"
item_state = "headset" item_state = "headset"
centComm = 1
// freerange = 1 // freerange = 1
ks2type = /obj/item/device/encryptionkey/ert ks2type = /obj/item/device/encryptionkey/ert

View File

@@ -27,6 +27,8 @@
/obj/item/device/radio/intercom/specops /obj/item/device/radio/intercom/specops
name = "\improper Spec Ops intercom" name = "\improper Spec Ops intercom"
frequency = ERT_FREQ frequency = ERT_FREQ
subspace_transmission = 1
centComm = 1
/obj/item/device/radio/intercom/department /obj/item/device/radio/intercom/department
canhear_range = 5 canhear_range = 5
@@ -81,6 +83,17 @@
..() ..()
internal_channels[num2text(SYND_FREQ)] = list(access_syndicate) 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() /obj/item/device/radio/intercom/Destroy()
processing_objects -= src processing_objects -= src
..() ..()

View File

@@ -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/list/channels = list() //see communications.dm for full list. First channel is a "default" for :h
var/subspace_transmission = 0 var/subspace_transmission = 0
var/syndie = 0//Holder to see if it's a syndicate encrypted radio 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 flags = CONDUCT
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
throw_speed = 2 throw_speed = 2
@@ -508,6 +509,9 @@ var/global/list/default_medbay_channels = list(
if(freq in ANTAG_FREQS) if(freq in ANTAG_FREQS)
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
return -1 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) if (!on)
return -1 return -1
if (!freq) //recieved on main frequency if (!freq) //recieved on main frequency

View File

@@ -4,9 +4,9 @@
name = "\improper T-ray scanner" name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
icon_state = "t-ray0" icon_state = "t-ray0"
item_state = "t-ray"
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
w_class = ITEMSIZE_SMALL w_class = ITEMSIZE_SMALL
item_state = "electronic"
matter = list(DEFAULT_WALL_MATERIAL = 150) matter = list(DEFAULT_WALL_MATERIAL = 150)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)

View File

@@ -21,6 +21,7 @@
name = "robotic module reset board" name = "robotic module reset board"
desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
icon_state = "cyborg_upgrade1" icon_state = "cyborg_upgrade1"
item_state = "cyborg_upgrade"
require_module = 1 require_module = 1
/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R) /obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
@@ -43,6 +44,7 @@
name = "robot reclassification board" name = "robot reclassification board"
desc = "Used to rename a cyborg." desc = "Used to rename a cyborg."
icon_state = "cyborg_upgrade1" icon_state = "cyborg_upgrade1"
item_state = "cyborg_upgrade"
var/heldname = "default name" var/heldname = "default name"
/obj/item/borg/upgrade/rename/attack_self(mob/user as mob) /obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
@@ -61,6 +63,7 @@
name = "robot emergency restart module" name = "robot emergency restart module"
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
icon_state = "cyborg_upgrade1" icon_state = "cyborg_upgrade1"
item_state = "cyborg_upgrade"
/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) /obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
@@ -84,6 +87,7 @@
name = "robotic VTEC Module" name = "robotic VTEC Module"
desc = "Used to kick in a robot's VTEC systems, increasing their speed." desc = "Used to kick in a robot's VTEC systems, increasing their speed."
icon_state = "cyborg_upgrade2" icon_state = "cyborg_upgrade2"
item_state = "cyborg_upgrade"
require_module = 1 require_module = 1
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R) /obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
@@ -100,6 +104,7 @@
name = "robotic Rapid Taser Cooling Module" name = "robotic Rapid Taser Cooling Module"
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
require_module = 1 require_module = 1
@@ -134,6 +139,7 @@
name = "mining robot jetpack" name = "mining robot jetpack"
desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
require_module = 1 require_module = 1
/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) /obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
@@ -155,6 +161,7 @@
name = "illegal equipment module" name = "illegal equipment module"
desc = "Unlocks the hidden, deadlier functions of a robot" desc = "Unlocks the hidden, deadlier functions of a robot"
icon_state = "cyborg_upgrade3" icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
require_module = 1 require_module = 1
/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R) /obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R)

View File

@@ -87,6 +87,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/icon_on var/icon_on
var/type_butt = null var/type_butt = null
var/chem_volume = 0 var/chem_volume = 0
var/max_smoketime = 0 //Related to sprites
var/smoketime = 0 var/smoketime = 0
var/is_pipe = 0 //Prevents a runtime with pipes var/is_pipe = 0 //Prevents a runtime with pipes
var/matchmes = "USER lights NAME with FLAME" var/matchmes = "USER lights NAME with FLAME"
@@ -100,8 +101,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..() ..()
flags |= NOREACT // so it doesn't react until you light it flags |= NOREACT // so it doesn't react until you light it
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
if(smoketime && !max_smoketime)
max_smoketime = smoketime
/obj/item/clothing/mask/smokable/proc/smoke(amount) /obj/item/clothing/mask/smokable/proc/smoke(amount)
if(smoketime > max_smoketime)
smoketime = max_smoketime
smoketime -= amount smoketime -= amount
if(reagents && reagents.total_volume) // check if it has any reagents at all if(reagents && reagents.total_volume) // check if it has any reagents at all
if(ishuman(loc)) if(ishuman(loc))
@@ -120,11 +125,29 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(location) if(location)
location.hotspot_expose(700, 5) location.hotspot_expose(700, 5)
/obj/item/clothing/mask/smokable/update_icon()
if(lit)
icon_state = "[initial(icon_state)]_on"
item_state = "[initial(item_state)]_on"
else if(smoketime < max_smoketime)
if(is_pipe)
icon_state = initial(icon_state)
item_state = initial(item_state)
else
icon_state = "[initial(icon_state)]_burnt"
item_state = "[initial(item_state)]_burnt"
if(ismob(loc))
var/mob/living/M = loc
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
..()
/obj/item/clothing/mask/smokable/examine(mob/user) /obj/item/clothing/mask/smokable/examine(mob/user)
..() ..()
if(is_pipe) if(is_pipe)
return return
var/smoke_percent = round((smoketime / initial(smoketime)) * 100) var/smoke_percent = round((smoketime / max_smoketime) * 100)
switch(smoke_percent) switch(smoke_percent)
if(90 to INFINITY) if(90 to INFINITY)
user << "[src] is still fresh." user << "[src] is still fresh."
@@ -156,15 +179,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return return
flags &= ~NOREACT // allowing reagents to react after being lit flags &= ~NOREACT // allowing reagents to react after being lit
reagents.handle_reactions() reagents.handle_reactions()
icon_state = icon_on
item_state = icon_on
if(ismob(loc))
var/mob/living/M = loc
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
T.visible_message(flavor_text) T.visible_message(flavor_text)
update_icon()
set_light(2, 0.25, "#E38F46") set_light(2, 0.25, "#E38F46")
processing_objects.Add(src) processing_objects.Add(src)
@@ -205,14 +222,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/proc/quench() /obj/item/clothing/mask/smokable/proc/quench()
lit = 0 lit = 0
processing_objects.Remove(src) processing_objects.Remove(src)
icon_state = initial(icon_state) update_icon()
item_state = initial(item_state)
if(ismob(loc))
var/mob/living/M = loc
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
/obj/item/clothing/mask/smokable/attack(mob/living/carbon/human/H, mob/user, def_zone) /obj/item/clothing/mask/smokable/attack(mob/living/carbon/human/H, mob/user, def_zone)
if(lit && H == user && istype(H)) if(lit && H == user && istype(H))
@@ -259,15 +269,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette /obj/item/clothing/mask/smokable/cigarette
name = "cigarette" name = "cigarette"
desc = "A roll of tobacco and nicotine." desc = "A roll of tobacco and nicotine."
icon_state = "cigoff" icon_state = "cig"
item_state = "cig"
throw_speed = 0.5 throw_speed = 0.5
item_state = "cigoff"
w_class = ITEMSIZE_TINY w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS | SLOT_MASK slot_flags = SLOT_EARS | SLOT_MASK
attack_verb = list("burnt", "singed") attack_verb = list("burnt", "singed")
icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
type_butt = /obj/item/weapon/cigbutt type_butt = /obj/item/weapon/cigbutt
chem_volume = 15 chem_volume = 15
max_smoketime = 300
smoketime = 300 smoketime = 300
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>" matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
lightermes = "<span class='notice'>USER manages to light their NAME with FLAME.</span>" lightermes = "<span class='notice'>USER manages to light their NAME with FLAME.</span>"
@@ -315,11 +325,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette/cigar /obj/item/clothing/mask/smokable/cigarette/cigar
name = "premium cigar" name = "premium cigar"
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!" desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
icon_state = "cigar2off" icon_state = "cigar2"
icon_on = "cigar2on"
type_butt = /obj/item/weapon/cigbutt/cigarbutt type_butt = /obj/item/weapon/cigbutt/cigarbutt
throw_speed = 0.5 throw_speed = 0.5
item_state = "cigaroff" item_state = "cigar"
max_smoketime = 1500
smoketime = 1500 smoketime = 1500
chem_volume = 20 chem_volume = 20
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>" matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
@@ -331,14 +341,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba
name = "\improper Cohiba Robusto cigar" name = "\improper Cohiba Robusto cigar"
desc = "There's little more you could want from a cigar." desc = "There's little more you could want from a cigar."
icon_state = "cigar2off" icon_state = "cigar2"
icon_on = "cigar2on"
/obj/item/clothing/mask/smokable/cigarette/cigar/havana /obj/item/clothing/mask/smokable/cigarette/cigar/havana
name = "premium Havanian cigar" name = "premium Havanian cigar"
desc = "A cigar fit for only the best of the best." desc = "A cigar fit for only the best of the best."
icon_state = "cigar2off" icon_state = "cigar2"
icon_on = "cigar2on" max_smoketime = 7200
smoketime = 7200 smoketime = 7200
chem_volume = 30 chem_volume = 30
@@ -375,9 +384,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/pipe /obj/item/clothing/mask/smokable/pipe
name = "smoking pipe" name = "smoking pipe"
desc = "A pipe, for smoking. Made of fine, stained cherry wood." desc = "A pipe, for smoking. Made of fine, stained cherry wood."
icon_state = "pipeoff" icon_state = "pipe"
item_state = "pipeoff" item_state = "pipe"
icon_on = "pipeon" //Note - these are in masks.dmi
smoketime = 0 smoketime = 0
chem_volume = 50 chem_volume = 50
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>" matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
@@ -429,6 +437,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if (smoketime) if (smoketime)
user << "<span class='notice'>[src] is already packed.</span>" user << "<span class='notice'>[src] is already packed.</span>"
return return
max_smoketime = 1000
smoketime = 1000 smoketime = 1000
if(G.reagents) if(G.reagents)
G.reagents.trans_to_obj(src, G.reagents.total_volume) G.reagents.trans_to_obj(src, G.reagents.total_volume)
@@ -455,9 +464,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/pipe/cobpipe /obj/item/clothing/mask/smokable/pipe/cobpipe
name = "corn cob pipe" name = "corn cob pipe"
desc = "A nicotine delivery system popularized by folksy backwoodsmen, kept popular in the modern age and beyond by space hipsters." desc = "A nicotine delivery system popularized by folksy backwoodsmen, kept popular in the modern age and beyond by space hipsters."
icon_state = "cobpipeoff" icon_state = "cobpipe"
item_state = "cobpipeoff" item_state = "cobpipe"
icon_on = "cobpipeon" //Note - these are in masks.dmi
chem_volume = 35 chem_volume = 35
///////// /////////

View File

@@ -8,7 +8,6 @@
name = "circuit board" name = "circuit board"
icon = 'icons/obj/module.dmi' icon = 'icons/obj/module.dmi'
icon_state = "id_mod" icon_state = "id_mod"
item_state = "electronic"
origin_tech = list(TECH_DATA = 2) origin_tech = list(TECH_DATA = 2)
density = 0 density = 0
anchored = 0 anchored = 0

View File

@@ -0,0 +1,13 @@
#ifndef T_BOARD
#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/pipelayer
name = T_BOARD("pipe layer")
build_path = /obj/machinery/pipelayer
board_type = new /datum/frame/frame_types/machine
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/motor = 1,
/obj/item/weapon/stock_parts/gear = 1,
/obj/item/weapon/stock_parts/matter_bin = 1)

View File

@@ -7,7 +7,6 @@
name = "exosuit circuit board" name = "exosuit circuit board"
icon = 'icons/obj/module.dmi' icon = 'icons/obj/module.dmi'
icon_state = "std_mod" icon_state = "std_mod"
item_state = "electronic"
board_type = "other" board_type = "other"
/obj/item/weapon/circuitboard/mecha/ripley /obj/item/weapon/circuitboard/mecha/ripley

View File

@@ -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) 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) ) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
//give the syndies a bit of stealth //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", "General")
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical") // 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 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", "General")
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", "Security")
// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
qdel(a) qdel(a)
processing_objects.Remove(src) processing_objects.Remove(src)
if ("emp") if ("emp")
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
var/name = prob(50) ? t.name : pick(teleportlocs) 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", "General")
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical") // 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) qdel(a)
else else
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) 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", "General")
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", "Security")
// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
qdel(a) qdel(a)
processing_objects.Remove(src) processing_objects.Remove(src)

View File

@@ -68,40 +68,3 @@
qdel(src) qdel(src)
user.put_in_hands(finished) user.put_in_hands(finished)
update_icon(user) 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

View File

@@ -35,6 +35,13 @@
icon_state = "switchblade" icon_state = "switchblade"
unbreakable = 1 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) /obj/item/weapon/material/butterfly/attack_self(mob/user)
active = !active active = !active
if(active) if(active)

View File

@@ -90,7 +90,7 @@
if(affecting.take_damage(force, 0)) if(affecting.take_damage(force, 0))
H.UpdateDamageIcon() H.UpdateDamageIcon()
H.updatehealth() H.updatehealth()
if(affecting.can_feel_pain()) if(affecting.organ_can_feel_pain())
H.Weaken(3) H.Weaken(3)
return return
check -= picked check -= picked

View File

@@ -126,6 +126,7 @@
new /obj/item/weapon/storage/pill_bottle/dylovene(src) 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/tramadol(src)
new /obj/item/weapon/storage/pill_bottle/spaceacillin(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) new /obj/item/stack/medical/splint(src)
return return
@@ -150,6 +151,19 @@
new /obj/item/stack/medical/advanced/bruise_pack(src) new /obj/item/stack/medical/advanced/bruise_pack(src)
return 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 * Pill Bottles
*/ */

View File

@@ -28,6 +28,38 @@
update_icon() update_icon()
return return
/obj/item/weapon/melee/baton/MouseDrop(obj/over_object as obj)
if(!canremove)
return
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
return
if (!( istype(over_object, /obj/screen) ))
return ..()
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this.
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
return
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
return
switch(over_object.name)
if("r_hand")
usr.u_equip(src)
usr.put_in_r_hand(src)
if("l_hand")
usr.u_equip(src)
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed. /obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
..() ..()
bcell = new/obj/item/weapon/cell/device/weapon(src) bcell = new/obj/item/weapon/cell/device/weapon(src)

View File

@@ -172,7 +172,8 @@
/obj/item/weapon/weldingtool/examine(mob/user) /obj/item/weapon/weldingtool/examine(mob/user)
if(..(user, 0)) 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) /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) /obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
if(!proximity) return if(!proximity) return
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding) if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !welding)
O.reagents.trans_to_obj(src, max_fuel) if(!welding && max_fuel)
user << "<span class='notice'>Welder refueled</span>" O.reagents.trans_to_obj(src, max_fuel)
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) user << "<span class='notice'>Welder refueled</span>"
return playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding) return
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.") else if(!welding)
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.") user << "<span class='notice'>[src] doesn't use fuel.</span>"
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>" return
var/obj/structure/reagent_dispensers/fueltank/tank = O else
tank.explode() message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
return 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) if (src.welding)
remove_fuel(1) remove_fuel(1)
var/turf/location = get_turf(user) var/turf/location = get_turf(user)
@@ -286,12 +291,44 @@
/obj/item/weapon/weldingtool/update_icon() /obj/item/weapon/weldingtool/update_icon()
..() ..()
icon_state = welding ? "welder1" : "welder" icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]"
var/mob/M = loc var/mob/M = loc
if(istype(M)) if(istype(M))
M.update_inv_l_hand() M.update_inv_l_hand()
M.update_inv_r_hand() M.update_inv_r_hand()
/obj/item/weapon/weldingtool/MouseDrop(obj/over_object as obj)
if(!canremove)
return
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
return
if (!( istype(over_object, /obj/screen) ))
return ..()
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this.
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
return
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
return
switch(over_object.name)
if("r_hand")
usr.u_equip(src)
usr.put_in_r_hand(src)
if("l_hand")
usr.u_equip(src)
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
//Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1) //Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1)
//so that the welding tool updates accordingly //so that the welding tool updates accordingly
/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M) /obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
@@ -313,7 +350,8 @@
processing_objects |= src processing_objects |= src
else else
if(M) 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 return
//Otherwise //Otherwise
else if(!set_welding && welding) else if(!set_welding && welding)
@@ -370,7 +408,6 @@
user.disabilities &= ~NEARSIGHTED user.disabilities &= ~NEARSIGHTED
return return
/obj/item/weapon/weldingtool/largetank /obj/item/weapon/weldingtool/largetank
name = "industrial welding tool" name = "industrial welding tool"
max_fuel = 40 max_fuel = 40
@@ -405,6 +442,113 @@
if(get_fuel() < max_fuel && nextrefueltick < world.time) if(get_fuel() < max_fuel && nextrefueltick < world.time)
nextrefueltick = world.time + 10 nextrefueltick = world.time + 10
reagents.add_reagent("fuel", 1) 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 = /obj/item/weapon/cell/device
var/use_external_power = 0 //If in a borg or hardsuit, this needs to = 1
/obj/item/weapon/weldingtool/electric/New()
..()
if(cell_type == null)
update_icon()
else 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/unloaded/New()
cell_type = null
/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 * Crowbar
*/ */

View File

@@ -77,11 +77,15 @@
//armour //armour
var/blocked = L.run_armor_check(target_zone, "melee") var/blocked = L.run_armor_check(target_zone, "melee")
var/soaked = L.get_armor_soak(target_zone, "melee")
if(blocked >= 100) if(blocked >= 100)
return 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 return 0
//trap the victim in place //trap the victim in place

View File

@@ -174,7 +174,7 @@
return 0 return 0
if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened) if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
return 0 return 0
if (issilicon(user)) if (isAI(user))
user << "<span class='notice'>You need hands for this.</span>" user << "<span class='notice'>You need hands for this.</span>"
return 0 return 0
return 1 return 1

View File

@@ -45,7 +45,7 @@
/obj/structure/closet/chefcloset/New() /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/clothing/under/waiter(src) new /obj/item/clothing/under/waiter(src)
new /obj/item/device/radio/headset/headset_service(src) new /obj/item/device/radio/headset/headset_service(src)

View File

@@ -150,20 +150,22 @@
var/def_zone = ran_zone() var/def_zone = ran_zone()
var/blocked = occupant.run_armor_check(def_zone, "melee") 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.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, blocked) occupant.apply_effect(6, STUN, blocked)
occupant.apply_effect(6, WEAKEN, blocked) occupant.apply_effect(6, WEAKEN, blocked)
occupant.apply_effect(6, STUTTER, 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) playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living)) if(istype(A, /mob/living))
var/mob/living/victim = A var/mob/living/victim = A
def_zone = ran_zone() def_zone = ran_zone()
blocked = victim.run_armor_check(def_zone, "melee") 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, STUN, blocked)
victim.apply_effect(6, WEAKEN, blocked) victim.apply_effect(6, WEAKEN, blocked)
victim.apply_effect(6, STUTTER, 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>") occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
/obj/structure/bed/chair/office/light /obj/structure/bed/chair/office/light

View File

@@ -149,20 +149,22 @@
var/def_zone = ran_zone() var/def_zone = ran_zone()
var/blocked = occupant.run_armor_check(def_zone, "melee") 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.throw_at(A, 3, propelled)
occupant.apply_effect(6, STUN, blocked) occupant.apply_effect(6, STUN, blocked)
occupant.apply_effect(6, WEAKEN, blocked) occupant.apply_effect(6, WEAKEN, blocked)
occupant.apply_effect(6, STUTTER, 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) playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
if(istype(A, /mob/living)) if(istype(A, /mob/living))
var/mob/living/victim = A var/mob/living/victim = A
def_zone = ran_zone() def_zone = ran_zone()
blocked = victim.run_armor_check(def_zone, "melee") 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, STUN, blocked)
victim.apply_effect(6, WEAKEN, blocked) victim.apply_effect(6, WEAKEN, blocked)
victim.apply_effect(6, STUTTER, blocked) victim.apply_effect(6, STUTTER, blocked)
victim.apply_damage(10, BRUTE, def_zone) victim.apply_damage(10, BRUTE, def_zone, soaked)
if(pulling) if(pulling)
occupant.visible_message("<span class='danger'>[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!</span>") occupant.visible_message("<span class='danger'>[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!</span>")

View File

@@ -178,3 +178,5 @@
this.blood_DNA["UNKNOWN BLOOD"] = "X*" this.blood_DNA["UNKNOWN BLOOD"] = "X*"
else if( istype(M, /mob/living/silicon/robot )) else if( istype(M, /mob/living/silicon/robot ))
new /obj/effect/decal/cleanable/blood/oil(src) new /obj/effect/decal/cleanable/blood/oil(src)
else if(ishuman(M))
add_blood(M)

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 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.))" src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
return return
suiciding = 1 suiciding = 15
does_not_breathe = 0 //Prevents ling-suicide zombies, or something does_not_breathe = 0 //Prevents ling-suicide zombies, or something
var/obj/item/held_item = get_active_hand() var/obj/item/held_item = get_active_hand()
if(held_item) if(held_item)
@@ -73,10 +73,16 @@
return return
log_and_message_admins("[key_name(src)] commited suicide") 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 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 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>") "<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)) adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth() updatehealth()
@@ -172,7 +178,7 @@
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes") if(confirm == "Yes")
suiciding = 1 suiciding = 30
setOxyLoss(100) setOxyLoss(100)
adjustBruteLoss(100 - getBruteLoss()) adjustBruteLoss(100 - getBruteLoss())
setToxLoss(100) setToxLoss(100)

View File

@@ -218,7 +218,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
++ind ++ind
if(ind > 1) if(ind > 1)
. += ", " . += ", "
. += "\tSynthetic [organ_name]" switch(organ_name)
if ("brain")
. += "\tPositronic [organ_name]"
else
. += "\tSynthetic [organ_name]"
else if(status == "digital") else if(status == "digital")
++ind ++ind
if(ind > 1) if(ind > 1)
@@ -612,15 +616,23 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
organ = O_LUNGS organ = O_LUNGS
if("Brain") if("Brain")
if(pref.organ_data[BP_HEAD] != "cyborg") if(pref.organ_data[BP_HEAD] != "cyborg")
user << "<span class='warning'>You may only select an assisted or synthetic brain if you have a full prosthetic body.</span>" user << "<span class='warning'>You may only select a cybernetic or synthetic brain if you have a full prosthetic body.</span>"
return return
organ = "brain" organ = "brain"
var/list/organ_choices = list("Normal","Assisted","Mechanical") var/list/organ_choices = list("Normal")
if(pref.organ_data[BP_TORSO] == "cyborg") if(pref.organ_data[BP_TORSO] == "cyborg")
organ_choices -= "Normal" organ_choices -= "Normal"
if(organ_name == "Brain") if(organ_name == "Brain")
organ_choices += "Digital" organ_choices += "Cybernetic"
organ_choices += "Positronic"
organ_choices += "Drone"
else
organ_choices += "Assisted"
organ_choices += "Mechanical"
else
organ_choices += "Assisted"
organ_choices += "Mechanical"
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices
if(!new_state) return if(!new_state) return
@@ -630,10 +642,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.organ_data[organ] = null pref.organ_data[organ] = null
if("Assisted") if("Assisted")
pref.organ_data[organ] = "assisted" pref.organ_data[organ] = "assisted"
if("Mechanical") if("Cybernetic")
pref.organ_data[organ] = "assisted"
if ("Mechanical")
pref.organ_data[organ] = "mechanical" pref.organ_data[organ] = "mechanical"
if("Digital") if("Drone")
pref.organ_data[organ] = "digital" pref.organ_data[organ] = "digital"
if("Positronic")
pref.organ_data[organ] = "mechanical"
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["disabilities"]) else if(href_list["disabilities"])

View File

@@ -356,6 +356,22 @@
..() ..()
gear_tweaks = list(gear_tweak_free_color_choice) gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/suit/miscellaneous/redandblackjacket /datum/gear/suit/miscellaneous/sec_dep_jacket
display_name = "red and black jacket" display_name = "department jacket, security"
path = /obj/item/clothing/suit/storage/toggle/redandblackjacket path = /obj/item/clothing/suit/storage/toggle/sec_dep_jacket
/datum/gear/suit/miscellaneous/engi_dep_jacket
display_name = "department jacket, engineering"
path = /obj/item/clothing/suit/storage/toggle/engi_dep_jacket
/datum/gear/suit/miscellaneous/supply_dep_jacket
display_name = "department jacket, supply"
path = /obj/item/clothing/suit/storage/toggle/supply_dep_jacket
/datum/gear/suit/miscellaneous/sci_dep_jacket
display_name = "department jacket, science"
path = /obj/item/clothing/suit/storage/toggle/sci_dep_jacket
/datum/gear/suit/miscellaneous/med_dep_jacket
display_name = "department jacket, medical"
path = /obj/item/clothing/suit/storage/toggle/med_dep_jacket

View File

@@ -273,11 +273,11 @@
/datum/gear/uniform/sundress /datum/gear/uniform/sundress
display_name = "sundress" display_name = "sundress"
path = /obj/item/clothing/under/dress/sundress path = /obj/item/clothing/under/sundress
/datum/gear/uniform/sundress/white /datum/gear/uniform/sundress/white
display_name = "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 /datum/gear/uniform/dress_fire
display_name = "flame dress" display_name = "flame dress"
@@ -446,10 +446,10 @@
display_name = "jumpsuit, hephaestus" display_name = "jumpsuit, hephaestus"
path = /obj/item/clothing/under/hephaestus path = /obj/item/clothing/under/hephaestus
/datum/gear/uniform/yoga /datum/gear/uniform/yogapants
display_name = "yoga pants" 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) gear_tweaks = list(gear_tweak_free_color_choice)

View File

@@ -46,6 +46,22 @@
display_name = "flashlight" display_name = "flashlight"
path = /obj/item/device/flashlight path = /obj/item/device/flashlight
/datum/gear/utility/flashlight_blue
display_name = "flashlight, blue"
path = /obj/item/device/flashlight/color
/datum/gear/utility/flashlight_orange
display_name = "flashlight, orange"
path = /obj/item/device/flashlight/color/orange
/datum/gear/utility/flashlight_red
display_name = "flashlight, red"
path = /obj/item/device/flashlight/color/red
/datum/gear/utility/flashlight_yellow
display_name = "flashlight, yellow"
path = /obj/item/device/flashlight/color/yellow
/datum/gear/utility/maglight /datum/gear/utility/maglight
display_name = "flashlight, maglight" display_name = "flashlight, maglight"
path = /obj/item/device/flashlight/maglight path = /obj/item/device/flashlight/maglight

View File

@@ -39,32 +39,24 @@
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes)) gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes))
/datum/gear/ears/skrell/cloth/male /datum/gear/ears/skrell/cloth/male
display_name = "male headtail cloth selection (Skrell)" display_name = "male headtail cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male path = /obj/item/clothing/ears/skrell/cloth_male/black
sort_category = "Xenowear" sort_category = "Xenowear"
whitelisted = "Skrell" whitelisted = "Skrell"
/datum/gear/ears/skrell/cloth/male/New() /datum/gear/ears/skrell/cloth/male/New()
..() ..()
var/list/clothtypes = list() gear_tweaks = list(gear_tweak_free_color_choice)
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))
/datum/gear/ears/skrell/cloth/female /datum/gear/ears/skrell/cloth/female
display_name = "female headtail cloth selection (Skrell)" display_name = "female headtail cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female path = /obj/item/clothing/ears/skrell/cloth_female/black
sort_category = "Xenowear" sort_category = "Xenowear"
whitelisted = "Skrell" whitelisted = "Skrell"
/datum/gear/ears/skrell/cloth/female/New() /datum/gear/ears/skrell/cloth/female/New()
..() ..()
var/list/clothtypes = list() gear_tweaks = list(gear_tweak_free_color_choice)
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))
/datum/gear/ears/skrell/colored/band /datum/gear/ears/skrell/colored/band
display_name = "Colored bands (Skrell)" display_name = "Colored bands (Skrell)"

View File

@@ -525,10 +525,6 @@
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
sprite_sheets = list( 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', "Teshari" = 'icons/mob/species/seromi/uniform.dmi',
"Vox" = 'icons/mob/species/vox/uniform.dmi' "Vox" = 'icons/mob/species/vox/uniform.dmi'
) )
@@ -539,6 +535,9 @@
valid_accessory_slots = list("utility","armband","decor","over") valid_accessory_slots = list("utility","armband","decor","over")
restricted_accessory_slots = list("utility", "armband") 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) /obj/item/clothing/under/attack_hand(var/mob/user)
if(accessories && accessories.len) if(accessories && accessories.len)
@@ -558,7 +557,7 @@
//autodetect rollability //autodetect rollability
if(rolled_down < 0) 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 rolled_down = 0
/obj/item/clothing/under/proc/update_rolldown_status() /obj/item/clothing/under/proc/update_rolldown_status()
@@ -573,11 +572,13 @@
under_icon = sprite_sheets[H.species.get_bodytype(H)] under_icon = sprite_sheets[H.species.get_bodytype(H)]
else if(item_icons && item_icons[slot_w_uniform_str]) else if(item_icons && item_icons[slot_w_uniform_str])
under_icon = 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 else
under_icon = INV_W_UNIFORM_DEF_ICON under_icon = INV_W_UNIFORM_DEF_ICON
// The _s is because the icon update procs append it. // 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) if(rolled_down != 1)
rolled_down = 0 rolled_down = 0
else else
@@ -596,11 +597,13 @@
under_icon = sprite_sheets[H.species.get_bodytype(H)] under_icon = sprite_sheets[H.species.get_bodytype(H)]
else if(item_icons && item_icons[slot_w_uniform_str]) else if(item_icons && item_icons[slot_w_uniform_str])
under_icon = 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 else
under_icon = INV_W_UNIFORM_DEF_ICON under_icon = INV_W_UNIFORM_DEF_ICON
// The _s is because the icon update procs append it. // 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) if(rolled_sleeves != 1)
rolled_sleeves = 0 rolled_sleeves = 0
else else
@@ -682,10 +685,17 @@
if(rolled_down) if(rolled_down)
body_parts_covered = initial(body_parts_covered) body_parts_covered = initial(body_parts_covered)
body_parts_covered &= ~(UPPER_TORSO|ARMS) 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>" usr << "<span class='notice'>You roll down your [src].</span>"
else else
body_parts_covered = initial(body_parts_covered) 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]" item_state_slots[slot_w_uniform_str] = "[worn_state]"
usr << "<span class='notice'>You roll up your [src].</span>" usr << "<span class='notice'>You roll up your [src].</span>"
update_clothing_icon() update_clothing_icon()
@@ -708,10 +718,16 @@
rolled_sleeves = !rolled_sleeves rolled_sleeves = !rolled_sleeves
if(rolled_sleeves) if(rolled_sleeves)
body_parts_covered &= ~(ARMS) 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>" usr << "<span class='notice'>You roll up your [src]'s sleeves.</span>"
else else
body_parts_covered = initial(body_parts_covered) 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]" item_state_slots[slot_w_uniform_str] = "[worn_state]"
usr << "<span class='notice'>You roll down your [src]'s sleeves.</span>" usr << "<span class='notice'>You roll down your [src]'s sleeves.</span>"
update_clothing_icon() update_clothing_icon()

View File

@@ -197,7 +197,7 @@ BLIND // can't see anything
name = "welding goggles" name = "welding goggles"
desc = "Protects the eyes from welders, approved by the mad scientist association." desc = "Protects the eyes from welders, approved by the mad scientist association."
icon_state = "welding-g" icon_state = "welding-g"
item_state_slots = list(slot_r_hand_str = "g", slot_l_hand_str = "g") item_state_slots = list(slot_r_hand_str = "welding-g", slot_l_hand_str = "welding-g")
action_button_name = "Flip Welding Goggles" action_button_name = "Flip Welding Goggles"
matter = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 1000) matter = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 1000)
var/up = 0 var/up = 0

View File

@@ -0,0 +1,56 @@
/obj/item/clothing/head/woodcirclet
name = "wood circlet"
desc = "A small wood circlet for making a flower crown."
icon_state = "woodcirclet"
w_class = ITEMSIZE_SMALL
body_parts_covered = 0
/obj/item/clothing/head/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
//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

View File

@@ -347,24 +347,3 @@
desc = "A wide-brimmed hat popularly worn in Mexico." desc = "A wide-brimmed hat popularly worn in Mexico."
icon_state = "sombrero" icon_state = "sombrero"
body_parts_covered = 0 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

View File

@@ -157,6 +157,7 @@
list("antibiotics", "spaceacillin", 0, 20), list("antibiotics", "spaceacillin", 0, 20),
list("antitoxins", "anti_toxin", 0, 20), list("antitoxins", "anti_toxin", 0, 20),
list("nutrients", "glucose", 0, 80), list("nutrients", "glucose", 0, 80),
list("clotting agent", "myelamine", 0, 80),
list("hyronalin", "hyronalin", 0, 20), list("hyronalin", "hyronalin", 0, 20),
list("radium", "radium", 0, 20) list("radium", "radium", 0, 20)
) )
@@ -246,6 +247,7 @@
list("hyperzine", "hyperzine", 0, 30), list("hyperzine", "hyperzine", 0, 30),
list("oxycodone", "oxycodone", 0, 30), list("oxycodone", "oxycodone", 0, 30),
list("nutrients", "glucose", 0, 80), list("nutrients", "glucose", 0, 80),
list("clotting agent", "myelamine", 0, 80)
) )
interface_name = "combat chem dispenser" interface_name = "combat chem dispenser"
@@ -263,6 +265,20 @@
interface_name = "mounted chem injector" interface_name = "mounted chem injector"
interface_desc = "Dispenses loaded chemicals via an arm-mounted 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 /obj/item/rig_module/voice
name = "hardsuit voice synthesiser" name = "hardsuit voice synthesiser"

View File

@@ -161,6 +161,7 @@
piece.permeability_coefficient = permeability_coefficient piece.permeability_coefficient = permeability_coefficient
piece.unacidable = unacidable piece.unacidable = unacidable
if(islist(armor)) piece.armor = armor.Copy() if(islist(armor)) piece.armor = armor.Copy()
if(islist(armorsoak)) piece.armorsoak = armorsoak.Copy()
update_icon(1) update_icon(1)

View File

@@ -49,7 +49,7 @@
/obj/item/rig_module/ai_container, /obj/item/rig_module/ai_container,
/obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/device/healthscanner, /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 /obj/item/weapon/rig/ert/security

View File

@@ -574,12 +574,6 @@ obj/item/clothing/suit/kimono
icon_state = "smw_hoodie" icon_state = "smw_hoodie"
item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black")
/obj/item/clothing/suit/storage/toggle/redandblackjacket
name = "red and black jacket"
desc = "A cool red and black jacket to keep you stylish and cozy."
icon_state = "redandblackjacket"
flags_inv = HIDEHOLSTER
/obj/item/clothing/suit/whitedress /obj/item/clothing/suit/whitedress
name = "white dress" name = "white dress"
desc = "A fancy white dress." desc = "A fancy white dress."
@@ -776,6 +770,44 @@ obj/item/clothing/suit/kimono
name = "brown varsity jacket" name = "brown varsity jacket"
icon_state = "varsity_brown" icon_state = "varsity_brown"
/*
* Department Jackets
*/
/obj/item/clothing/suit/storage/toggle/sec_dep_jacket
name = "department jacket, security"
desc = "A cozy jacket in security's colors. Show your department pride!"
icon_state = "sec_dep_jacket"
item_state_slots = list(slot_r_hand_str = "sec_dep_jacket", slot_l_hand_str = "sec_dep_jacket")
flags_inv = HIDEHOLSTER
/obj/item/clothing/suit/storage/toggle/engi_dep_jacket
name = "department jacket, engineering"
desc = "A cozy jacket in engineering's colors. Show your department pride!"
icon_state = "engi_dep_jacket"
item_state_slots = list(slot_r_hand_str = "engi_dep_jacket", slot_l_hand_str = "engi_dep_jacket")
flags_inv = HIDEHOLSTER
/obj/item/clothing/suit/storage/toggle/supply_dep_jacket
name = "department jacket, supply"
desc = "A cozy jacket in supply's colors. Show your department pride!"
icon_state = "supply_dep_jacket"
item_state_slots = list(slot_r_hand_str = "supply_dep_jacket", slot_l_hand_str = "supply_dep_jacket")
flags_inv = HIDEHOLSTER
/obj/item/clothing/suit/storage/toggle/sci_dep_jacket
name = "department jacket, science"
desc = "A cozy jacket in science's colors. Show your department pride!"
icon_state = "sci_dep_jacket"
item_state_slots = list(slot_r_hand_str = "sci_dep_jacket", slot_l_hand_str = "sci_dep_jacket")
flags_inv = HIDEHOLSTER
/obj/item/clothing/suit/storage/toggle/med_dep_jacket
name = "department jacket, medical"
desc = "A cozy jacket in medical's colors. Show your department pride!"
icon_state = "med_dep_jacket"
item_state_slots = list(slot_r_hand_str = "med_dep_jacket", slot_l_hand_str = "med_dep_jacket")
flags_inv = HIDEHOLSTER
/* /*
* Track Jackets * Track Jackets
*/ */

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 /obj/item/clothing/under/color/black
name = "black jumpsuit" name = "black jumpsuit"
icon_state = "black" icon_state = "black"

View File

@@ -255,13 +255,6 @@
*/ */
/obj/item/clothing/under/dress /obj/item/clothing/under/dress
body_parts_covered = UPPER_TORSO|LOWER_TORSO 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 /obj/item/clothing/under/dress/blacktango
name = "black tango dress" name = "black tango dress"
@@ -353,14 +346,6 @@
*/ */
/obj/item/clothing/under/wedding /obj/item/clothing/under/wedding
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS 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 /obj/item/clothing/under/wedding/bride_orange
name = "orange wedding dress" name = "orange wedding dress"
@@ -393,13 +378,13 @@
flags_inv = HIDESHOES flags_inv = HIDESHOES
body_parts_covered = UPPER_TORSO|LOWER_TORSO body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/dress/sundress /obj/item/clothing/under/sundress
name = "sundress" name = "sundress"
desc = "Makes you want to frolic in a field of daisies." desc = "Makes you want to frolic in a field of daisies."
icon_state = "sundress" icon_state = "sundress"
body_parts_covered = UPPER_TORSO|LOWER_TORSO body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/dress/sundress/white /obj/item/clothing/under/sundress_white
name = "white sundress" name = "white sundress"
desc = "A white sundress decorated with purple lilies." desc = "A white sundress decorated with purple lilies."
icon_state = "sundress_white" icon_state = "sundress_white"
@@ -474,13 +459,6 @@
/obj/item/clothing/under/cheongsam /obj/item/clothing/under/cheongsam
name = "white cheongsam" name = "white cheongsam"
desc = "It is a white cheongsam dress." 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" icon_state = "mai_yang"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
@@ -508,13 +486,6 @@
/obj/item/clothing/under/croptop /obj/item/clothing/under/croptop
name = "crop top" name = "crop top"
desc = "A shirt that has had the top cropped. This one is NT sponsored." 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" icon_state = "croptop"
item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey") item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey")

View File

@@ -2,13 +2,6 @@
/obj/item/clothing/under/pants /obj/item/clothing/under/pants
name = "jeans" name = "jeans"
desc = "A nondescript pair of tough blue 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" icon_state = "jeans"
gender = PLURAL gender = PLURAL
body_parts_covered = LOWER_TORSO|LEGS body_parts_covered = LOWER_TORSO|LEGS
@@ -124,10 +117,10 @@
desc = "A pair of sexy, tight black leather chaps." desc = "A pair of sexy, tight black leather chaps."
icon_state = "chapsbl" icon_state = "chapsbl"
/obj/item/clothing/under/pants/yoga /obj/item/clothing/under/pants/yogapants
name = "yoga pants" name = "yoga pants"
desc = "A pair of tight-fitting yoga pants for those lazy days." desc = "A pair of tight-fitting yoga pants for those lazy days."
icon_state = "yoga" icon_state = "yogapants"
/* /*
* Baggy Pants * Baggy Pants

View File

@@ -2,13 +2,6 @@
/obj/item/clothing/under/shorts /obj/item/clothing/under/shorts
name = "athletic shorts" name = "athletic shorts"
desc = "95% Polyester, 5% Spandex!" 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 gender = PLURAL
body_parts_covered = LOWER_TORSO body_parts_covered = LOWER_TORSO
@@ -103,13 +96,6 @@
/obj/item/clothing/under/skirt /obj/item/clothing/under/skirt
name = "short black skirt" name = "short black skirt"
desc = "A skirt that is a shiny black." 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" icon_state = "skirt_short_black"
body_parts_covered = LOWER_TORSO body_parts_covered = LOWER_TORSO
rolled_sleeves = -1 rolled_sleeves = -1
@@ -168,8 +154,6 @@
icon_state = "plaid_purple" icon_state = "plaid_purple"
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple") item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
//Job skirts
/obj/item/clothing/under/rank/cargo/skirt /obj/item/clothing/under/rank/cargo/skirt
name = "quartermaster's jumpskirt" 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." desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."

View File

@@ -4,12 +4,6 @@
/obj/item/clothing/under/pt /obj/item/clothing/under/pt
name = "pt uniform" name = "pt uniform"
desc = "Shorts! Shirt! Miami! Sexy!" 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" icon_state = "miami"
worn_state = "miami" worn_state = "miami"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) 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 /obj/item/clothing/under/utility
name = "utility uniform" name = "utility uniform"
desc = "A comfortable turtleneck and black utility trousers." 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" icon_state = "blackutility"
worn_state = "blackutility" worn_state = "blackutility"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
@@ -107,6 +94,7 @@
icon_state = "blackutility_com" icon_state = "blackutility_com"
worn_state = "blackutility_com" worn_state = "blackutility_com"
/obj/item/clothing/under/utility/fleet /obj/item/clothing/under/utility/fleet
name = "fleet coveralls" name = "fleet coveralls"
desc = "The utility uniform of the SCG Fleet, made from an insulated material." desc = "The utility uniform of the SCG Fleet, made from an insulated material."
@@ -145,6 +133,7 @@
icon_state = "navyutility_com" icon_state = "navyutility_com"
worn_state = "navyutility_com" worn_state = "navyutility_com"
/obj/item/clothing/under/utility/marine /obj/item/clothing/under/utility/marine
name = "marine fatigues" name = "marine fatigues"
desc = "The utility uniform of the SCG Marine Corps, made from durable material." desc = "The utility uniform of the SCG Marine Corps, made from durable material."
@@ -199,13 +188,6 @@
/obj/item/clothing/under/service /obj/item/clothing/under/service
name = "service uniform" name = "service uniform"
desc = "A service uniform of some kind." 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" icon_state = "whiteservice"
worn_state = "whiteservice" worn_state = "whiteservice"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) 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 /obj/item/clothing/under/mildress
name = "dress uniform" name = "dress uniform"
desc = "A dress uniform of some kind." 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" icon_state = "greydress"
worn_state = "greydress" worn_state = "greydress"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)

View File

@@ -105,7 +105,7 @@ I said no!
/datum/recipe/xenoburger /datum/recipe/xenoburger
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun, /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 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/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/spidermeat, //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/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, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge,

View File

@@ -114,8 +114,11 @@
if(!target_limb) target_limb = pick(BP_ALL) if(!target_limb) target_limb = pick(BP_ALL)
var/blocked = target.run_armor_check(target_limb, "melee") var/blocked = target.run_armor_check(target_limb, "melee")
var/soaked = target.get_armor_soak(target_limb, "melee")
if(blocked >= 100) if(blocked >= 100)
return return
var/obj/item/organ/external/affecting = target.get_organ(target_limb) var/obj/item/organ/external/affecting = target.get_organ(target_limb)
var/damage = 0 var/damage = 0
var/has_edge = 0 var/has_edge = 0
@@ -125,7 +128,7 @@
if(affecting) if(affecting)
to_chat(target, "<span class='danger'>\The [fruit]'s thorns pierce your [affecting.name] greedily!</span>") 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 else
to_chat(target, "<span class='danger'>\The [fruit]'s thorns pierce your flesh greedily!</span>") to_chat(target, "<span class='danger'>\The [fruit]'s thorns pierce your flesh greedily!</span>")
target.adjustBruteLoss(damage) target.adjustBruteLoss(damage)

View File

@@ -11,6 +11,7 @@
used for power or data transmission." used for power or data transmission."
icon = 'icons/obj/electronic_assemblies.dmi' icon = 'icons/obj/electronic_assemblies.dmi'
icon_state = "wirer-wire" icon_state = "wirer-wire"
item_state = "wirer"
flags = CONDUCT flags = CONDUCT
w_class = 2 w_class = 2
var/datum/integrated_io/selected_io = null var/datum/integrated_io/selected_io = null

View File

@@ -120,7 +120,7 @@
/material/wood/generate_recipes() /material/wood/generate_recipes()
..() ..()
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1) 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("wood circlet", /obj/item/clothing/head/woodcirclet, 1)
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 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("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) recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)

View File

@@ -101,9 +101,9 @@
/mob/living/silicon/ai/special_mentions() /mob/living/silicon/ai/special_mentions()
return list("AI") // AI door! 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) /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, "+", "b")
message = encode_html_emphasis(message, "_", "u") message = encode_html_emphasis(message, "_", "u")
return message return message

View File

@@ -71,15 +71,11 @@
/mob/living/carbon/brain/handle_chemicals_in_body() /mob/living/carbon/brain/handle_chemicals_in_body()
chem_effects.Cut() chem_effects.Cut()
analgesic = 0
if(touching) touching.metabolize() if(touching) touching.metabolize()
if(ingested) ingested.metabolize() if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize() if(bloodstr) bloodstr.metabolize()
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
confused = max(0, confused - 1) confused = max(0, confused - 1)
// decrement dizziness counter, clamped to 0 // decrement dizziness counter, clamped to 0
if(resting) if(resting)

View File

@@ -4,7 +4,7 @@
return null 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) if(!effective_force || blocked >= 100)
return 0 return 0
@@ -12,6 +12,10 @@
if(HULK in user.mutations) if(HULK in user.mutations)
effective_force *= 2 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 //Apply weapon damage
var/weapon_sharp = is_sharp(I) var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I) var/weapon_edge = has_edge(I)

View File

@@ -7,8 +7,7 @@
var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm 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/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 // total amount of wounds on mob, used to spread out healing and the like over all wounds
var/number_wounds = 0 var/number_wounds = 0
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed var/obj/item/handcuffed = null //Whether or not the mob is handcuffed

View File

@@ -282,7 +282,7 @@
msg += "<span class='warning'>[T.He] [T.is] twitching ever so slightly.</span>\n" msg += "<span class='warning'>[T.He] [T.is] twitching ever so slightly.</span>\n"
//splints //splints
for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)) for(var/organ in BP_ALL)
var/obj/item/organ/external/o = get_organ(organ) var/obj/item/organ/external/o = get_organ(organ)
if(o && o.splinted && o.splinted.loc == o) if(o && o.splinted && o.splinted.loc == o)
msg += "<span class='warning'>[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!</span>\n" msg += "<span class='warning'>[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!</span>\n"

View File

@@ -1071,7 +1071,7 @@
"<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \ "<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>", \
"<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) organ.take_damage(rand(1,3), 0, 0)
if(!(organ.robotic >= ORGAN_ROBOT) && (should_have_organ(O_HEART))) //There is no blood in protheses. if(!(organ.robotic >= ORGAN_ROBOT) && (should_have_organ(O_HEART))) //There is no blood in protheses.
@@ -1473,6 +1473,7 @@
if(stat) return if(stat) return
var/datum/category_group/underwear/UWC = input(usr, "Choose underwear:", "Show/hide underwear") as null|anything in global_underwear.categories var/datum/category_group/underwear/UWC = input(usr, "Choose underwear:", "Show/hide underwear") as null|anything in global_underwear.categories
if(!UWC) return
var/datum/category_item/underwear/UWI = all_underwear[UWC.name] var/datum/category_item/underwear/UWI = all_underwear[UWC.name]
if(!UWI || UWI.name == "None") if(!UWI || UWI.name == "None")
src << "<span class='notice'>You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"].</span>" src << "<span class='notice'>You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"].</span>"
@@ -1510,7 +1511,7 @@
if(check_organ) if(check_organ)
if(!istype(check_organ)) if(!istype(check_organ))
return 0 return 0
return check_organ.can_feel_pain() return check_organ.organ_can_feel_pain()
return !(species.flags & NO_PAIN) return !(species.flags & NO_PAIN)
/mob/living/carbon/human/is_muzzled() /mob/living/carbon/human/is_muzzled()

View File

@@ -30,7 +30,7 @@
// Should this all be in Touch()? // Should this all be in Touch()?
if(istype(H)) if(istype(H))
if(get_accuracy_penalty(H)) //Should only trigger if they're not aiming well if(get_accuracy_penalty(H) && H != src) //Should only trigger if they're not aiming well
var/hit_zone = get_zone_with_miss_chance(H.zone_sel.selecting, src, get_accuracy_penalty(H)) var/hit_zone = get_zone_with_miss_chance(H.zone_sel.selecting, src, get_accuracy_penalty(H))
if(!hit_zone) if(!hit_zone)
H.do_attack_animation(src) H.do_attack_animation(src)
@@ -51,6 +51,7 @@
return 0 return 0
var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting)) var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee") var/armor_block = run_armor_check(affecting, "melee")
var/armor_soak = get_armor_soak(affecting, "melee")
if(HULK in H.mutations) if(HULK in H.mutations)
damage += 5 damage += 5
@@ -59,7 +60,10 @@
visible_message("\red <B>[H] has punched [src]!</B>") 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) if(damage >= 9)
visible_message("\red <B>[H] has weakened [src]!</B>") visible_message("\red <B>[H] has weakened [src]!</B>")
apply_effect(4, WEAKEN, armor_block) apply_effect(4, WEAKEN, armor_block)
@@ -258,11 +262,12 @@
real_damage = max(1, real_damage) real_damage = max(1, real_damage)
var/armour = run_armor_check(affecting, "melee") var/armour = run_armor_check(affecting, "melee")
var/soaked = get_armor_soak(affecting, "melee")
// Apply additional unarmed effects. // Apply additional unarmed effects.
attack.apply_effects(H, src, armour, rand_damage, hit_zone) attack.apply_effects(H, src, armour, rand_damage, hit_zone)
// Finally, apply damage to target // 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) if(I_DISARM)
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>") M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
@@ -338,7 +343,8 @@
var/dam_zone = pick(organs_by_name) var/dam_zone = pick(organs_by_name)
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
var/armor_block = run_armor_check(affecting, "melee") 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() updatehealth()
return 1 return 1

View File

@@ -376,7 +376,7 @@ This function restores all organs.
if((damagetype != BRUTE) && (damagetype != BURN)) if((damagetype != BRUTE) && (damagetype != BURN))
if(damagetype == HALLOSS) if(damagetype == HALLOSS)
if((damage > 25 && prob(20)) || (damage > 50 && prob(60))) if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
if(organ && organ.can_feel_pain()) if(organ && organ.organ_can_feel_pain())
emote("scream") emote("scream")
..(damage, damagetype, def_zone, blocked) ..(damage, damagetype, def_zone, blocked)
return 1 return 1

View File

@@ -67,7 +67,7 @@ emp_act
emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!") emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!")
else else
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") 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) ..(stun_amount, agony_amount, def_zone)
@@ -93,6 +93,29 @@ emp_act
total += weight total += weight
return (armorval/max(total, 1)) 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. //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) /mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone)
if (!def_zone) if (!def_zone)
@@ -119,6 +142,17 @@ emp_act
protection += C.armor[type] protection += C.armor[type]
return protection 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() /mob/living/carbon/human/proc/check_head_coverage()
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform) 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>") 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].") 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 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) var/obj/item/organ/external/affecting = get_organ(hit_zone)
if(!affecting) if(!affecting)
return 0 return 0
if(soaked >= effective_force)
return 0
// Handle striking to cripple. // Handle striking to cripple.
if(user.a_intent == I_DISARM) if(user.a_intent == I_DISARM)
effective_force *= 0.5 //reduced effective force... 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 return 0
//set the dislocate mult less than the effective force mult so that //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 //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(!..()) else if(!..())
return 0 return 0
@@ -243,7 +287,7 @@ emp_act
switch(hit_zone) switch(hit_zone)
if("head")//Harder to score a stun but if you do it lasts a bit longer if("head")//Harder to score a stun but if you do it lasts a bit longer
if(prob(effective_force)) 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>") visible_message("<span class='danger'>\The [src] has been knocked unconscious!</span>")
if(bloody)//Apply blood if(bloody)//Apply blood
if(wear_mask) if(wear_mask)
@@ -257,15 +301,15 @@ emp_act
update_inv_glasses(0) update_inv_glasses(0)
if("chest")//Easier to score a stun but lasts less time if("chest")//Easier to score a stun but lasts less time
if(prob(effective_force + 10)) 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>") visible_message("<span class='danger'>\The [src] has been knocked down!</span>")
if(bloody) if(bloody)
bloody_body(src) bloody_body(src)
return 1 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) /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) if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100 || soaked > effective_force)
return 0 return 0
if(W.damtype != BRUTE) if(W.damtype != BRUTE)
@@ -338,10 +382,6 @@ emp_act
var/hit_area = affecting.name var/hit_area = affecting.name
src.visible_message("\red [src] has been hit in the [hit_area] by [O].") 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)) if(ismob(O.thrower))
var/mob/M = O.thrower var/mob/M = O.thrower
@@ -352,12 +392,25 @@ emp_act
if(!istype(src,/mob/living/simple_animal/mouse)) 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>)") 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. //thrown weapon embedded object code.
if(dtype == BRUTE && istype(O,/obj/item)) if(dtype == BRUTE && istype(O,/obj/item))
var/obj/item/I = O var/obj/item/I = O
if (!is_robot_module(I)) if (!is_robot_module(I))
var/sharp = is_sharp(I) var/sharp = is_sharp(I)
var/damage = throw_damage var/damage = throw_damage
if (soaked)
damage -= soaked
if (armor) if (armor)
damage /= armor+1 damage /= armor+1

View File

@@ -56,7 +56,7 @@
if (!lying && !buckled && world.time - l_move_time < 15) if (!lying && !buckled && world.time - l_move_time < 15)
//Moving around with fractured ribs won't do you any good //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) custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50)
drop_item(loc) drop_item(loc)
Stun(2) Stun(2)
@@ -100,7 +100,7 @@
else if (E.is_dislocated()) else if (E.is_dislocated())
stance_damage += 0.5 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) // Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot. // One cane mitigates a broken leg+foot, or a missing foot.
@@ -159,7 +159,7 @@
drop_from_inventory(r_hand) drop_from_inventory(r_hand)
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") 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()) else if(E.is_malfunctioning())
switch(E.body_part) switch(E.body_part)

View File

@@ -187,7 +187,7 @@
var/rn = rand(0, 200) var/rn = rand(0, 200)
if(getBrainLoss() >= 5) if(getBrainLoss() >= 5)
if(0 <= rn && rn <= 3) 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(getBrainLoss() >= 15)
if(4 <= rn && rn <= 6) if(eye_blurry <= 0) if(4 <= rn && rn <= 6) if(eye_blurry <= 0)
src << "<span class='warning'>It becomes hard to see for some reason.</span>" src << "<span class='warning'>It becomes hard to see for some reason.</span>"
@@ -329,17 +329,20 @@
if(status_flags & GODMODE) if(status_flags & GODMODE)
return 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) if(does_not_breathe)
failed_last_breath = 0 failed_last_breath = 0
adjustOxyLoss(-5) adjustOxyLoss(-5)
return return
if(!breath || (breath.total_moles == 0) || suiciding) if(!breath || (breath.total_moles == 0))
failed_last_breath = 1 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) if(health > config.health_threshold_crit)
adjustOxyLoss(HUMAN_MAX_OXYLOSS) adjustOxyLoss(HUMAN_MAX_OXYLOSS)
else else
@@ -350,10 +353,6 @@
if(!L.is_bruised() && prob(8)) if(!L.is_bruised() && prob(8))
rupture_lung() rupture_lung()
if(should_have_organ("brain"))
if(prob(5))
adjustBrainLoss(0.02 * oxyloss) //2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
oxygen_alert = max(oxygen_alert, 1) oxygen_alert = max(oxygen_alert, 1)
return 0 return 0
@@ -372,8 +371,9 @@
safe_pressure_min *= 1.25 safe_pressure_min *= 1.25
else if(breath) else if(breath)
if(breath.total_moles < BREATH_MOLES / 10 || breath.total_moles > BREATH_MOLES * 5) if(breath.total_moles < BREATH_MOLES / 10 || breath.total_moles > BREATH_MOLES * 5)
if (prob(8)) if(is_below_sound_pressure(get_turf(src))) //No more popped lungs from choking/drowning
rupture_lung() if (prob(8))
rupture_lung()
var/safe_exhaled_max = 10 var/safe_exhaled_max = 10
var/safe_toxins_max = 0.2 var/safe_toxins_max = 0.2
@@ -794,7 +794,6 @@
if(reagents) if(reagents)
chem_effects.Cut() chem_effects.Cut()
analgesic = 0
if(!isSynthetic()) if(!isSynthetic())
@@ -802,9 +801,6 @@
if(ingested) ingested.metabolize() if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize() if(bloodstr) bloodstr.metabolize()
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
var/total_phoronloss = 0 var/total_phoronloss = 0
for(var/obj/item/I in src) for(var/obj/item/I in src)
if(I.contaminated) if(I.contaminated)
@@ -923,6 +919,14 @@
for(var/atom/a in hallucinations) for(var/atom/a in hallucinations)
qdel(a) qdel(a)
//Brain damage from Oxyloss
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(oxyloss >= 20 && prob(5))
adjustBrainLoss(brainOxPercent * oxyloss)
if(halloss >= species.total_health) if(halloss >= species.total_health)
src << "<span class='notice'>You're in too much pain to keep going...</span>" src << "<span class='notice'>You're in too much pain to keep going...</span>"
src.visible_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.") src.visible_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.")
@@ -1155,7 +1159,7 @@
see_invisible = SEE_INVISIBLE_LIVING see_invisible = SEE_INVISIBLE_LIVING
if(healths) if(healths)
if (analgesic > 100) if (chem_effects[CE_PAINKILLER] > 100)
healths.icon_state = "health_numb" healths.icon_state = "health_numb"
else else
// Generate a by-limb health display. // Generate a by-limb health display.
@@ -1443,8 +1447,11 @@
shock_stage = max(shock_stage-1, 0) shock_stage = max(shock_stage-1, 0)
return return
if(stat)
return 0
if(shock_stage == 10) 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)
if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.") if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.")

View File

@@ -72,6 +72,7 @@
var/toxins_mod = 1 // Toxloss modifier var/toxins_mod = 1 // Toxloss modifier
var/radiation_mod = 1 // Radiation modifier var/radiation_mod = 1 // Radiation modifier
var/flash_mod = 1 // Stun from blindness modifier. var/flash_mod = 1 // Stun from blindness modifier.
var/chemOD_mod = 1 // Damage modifier for overdose
var/vision_flags = SEE_SELF // Same flags as glasses. var/vision_flags = SEE_SELF // Same flags as glasses.
// Death vars. // Death vars.

View File

@@ -174,6 +174,7 @@
darksight = 4 darksight = 4
flash_mod = 1.2 flash_mod = 1.2
chemOD_mod = 0.9
ambiguous_genders = TRUE ambiguous_genders = TRUE

View File

@@ -97,7 +97,7 @@ var/global/list/sparring_attack_cache = list()
if(eyes) if(eyes)
eyes.take_damage(rand(3,4), 1) 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>") 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>" 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 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>") 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>")

View File

@@ -67,15 +67,11 @@
/mob/living/carbon/slime/handle_chemicals_in_body() /mob/living/carbon/slime/handle_chemicals_in_body()
chem_effects.Cut() chem_effects.Cut()
analgesic = 0
if(touching) touching.metabolize() if(touching) touching.metabolize()
if(ingested) ingested.metabolize() if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize() if(bloodstr) bloodstr.metabolize()
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
src.updatehealth() src.updatehealth()
return //TODO: DEFERRED return //TODO: DEFERRED

View File

@@ -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!") 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)) if (ishuman(M))
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
H.custom_pain(painMes) H.custom_pain(painMes, 100)
else if (istype(M, /mob/living/carbon)) else if (istype(M, /mob/living/carbon))
var/mob/living/carbon/C = M var/mob/living/carbon/C = M
if (C.can_feel_pain()) if (C.can_feel_pain())

View File

@@ -14,7 +14,7 @@
1.2 * src.getShockBruteLoss() + \ 1.2 * src.getShockBruteLoss() + \
1.7 * src.getCloneLoss() + \ 1.7 * src.getCloneLoss() + \
2 * src.halloss + \ 2 * src.halloss + \
-1 * src.analgesic -1 * src.chem_effects[CE_PAINKILLER]
if(src.slurring) if(src.slurring)
src.traumatic_shock -= 20 src.traumatic_shock -= 20

View File

@@ -8,11 +8,13 @@
Returns Returns
standard 0 if fail 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) if(Debug2)
world.log << "## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]." 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 return 0
if(soaked)
damage -= soaked
blocked = (100-blocked)/100 blocked = (100-blocked)/100
switch(damagetype) switch(damagetype)
if(BRUTE) if(BRUTE)

View File

@@ -733,11 +733,20 @@ default behaviour is:
src << "<span class='warning'>You feel like you are about to throw up!</span>" 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 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) Stun(5)
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>") 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) 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(istype(T))
if(blood_vomit) if(blood_vomit)
T.add_blood_floor(src) T.add_blood_floor(src)

View File

@@ -77,10 +77,20 @@
return 0 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) //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) /mob/living/proc/getarmor(var/def_zone, var/type)
return 0 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) /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
@@ -93,6 +103,7 @@
signaler.signal() signaler.signal()
//Armor //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/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration)
var/proj_sharp = is_sharp(P) var/proj_sharp = is_sharp(P)
var/proj_edge = has_edge(P) var/proj_edge = has_edge(P)
@@ -105,13 +116,13 @@
stun_effect_act(0, P.agony, def_zone, P) stun_effect_act(0, P.agony, def_zone, P)
src <<"\red You have been hit by [P]!" src <<"\red You have been hit by [P]!"
if(!P.nodamage) 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) qdel(P)
return return
if(!P.nodamage) 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)
P.on_hit(src, absorb, def_zone) P.on_hit(src, absorb, soaked, def_zone)
if(absorb == 100) if(absorb == 100)
return 2 return 2
@@ -153,17 +164,21 @@
/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) /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>") 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") 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 //If the armor absorbs all of the damage, skip the damage calculation and the blood
var/turf/simulated/location = get_turf(src) if(!soaked > effective_force)
if(istype(location)) location.add_blood_floor(src) 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 return blocked
//returns 0 if the effects failed to apply for some reason, 1 otherwise. //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) if(!effective_force || blocked >= 100)
return 0 return 0
@@ -171,6 +186,10 @@
if(HULK in user.mutations) if(HULK in user.mutations)
effective_force *= 2 effective_force *= 2
//Armor soak
if(soaked >= effective_force)
return 0
//Apply weapon damage //Apply weapon damage
var/weapon_sharp = is_sharp(I) var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I) var/weapon_edge = has_edge(I)
@@ -178,7 +197,7 @@
weapon_sharp = 0 weapon_sharp = 0
weapon_edge = 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 return 1
@@ -200,8 +219,10 @@
src.visible_message("\red [src] has been hit by [O].") src.visible_message("\red [src] has been hit by [O].")
var/armor = run_armor_check(null, "melee") 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 O.throwing = 0 //it hit, so stop moving
@@ -230,6 +251,9 @@
if(!O || !src) return if(!O || !src) return
if(O.sharp) //Projectile is suitable for pinning. 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. //Handles embedding for non-humans and simple_animals.
embed(O) embed(O)

View File

@@ -11,6 +11,7 @@ var/list/department_radio_keys = list(
":s" = "Security", ".s" = "Security", ":s" = "Security", ".s" = "Security",
":w" = "whisper", ".w" = "whisper", ":w" = "whisper", ".w" = "whisper",
":t" = "Mercenary", ".t" = "Mercenary", ":t" = "Mercenary", ".t" = "Mercenary",
":x" = "Raider", ".x" = "Raider",
":u" = "Supply", ".u" = "Supply", ":u" = "Supply", ".u" = "Supply",
":v" = "Service", ".v" = "Service", ":v" = "Service", ".v" = "Service",
":p" = "AI Private", ".p" = "AI Private", ":p" = "AI Private", ".p" = "AI Private",
@@ -26,6 +27,7 @@ var/list/department_radio_keys = list(
":S" = "Security", ".S" = "Security", ":S" = "Security", ".S" = "Security",
":W" = "whisper", ".W" = "whisper", ":W" = "whisper", ".W" = "whisper",
":T" = "Mercenary", ".T" = "Mercenary", ":T" = "Mercenary", ".T" = "Mercenary",
":X" = "Raider", ".X" = "Raider",
":U" = "Supply", ".U" = "Supply", ":U" = "Supply", ".U" = "Supply",
":V" = "Service", ".V" = "Service", ":V" = "Service", ".V" = "Service",
":P" = "AI Private", ".P" = "AI Private", ":P" = "AI Private", ".P" = "AI Private",

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") 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) switch(choice)
if("Crew Member") if("Crew Member") //A seeable crew member (or a dog)
var/list/targets = trackable_mobs() var/list/targets = trackable_mobs()
if(targets.len) if(targets.len)
input = input("Select a crew member:") as null|anything in targets //The definition of "crew member" is a little loose... 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 else
alert("No suitable records found. Aborting.") alert("No suitable records found. Aborting.")
if("My Character") if("My Character") //Loaded character slot
if(!client || !client.prefs) return if(!client || !client.prefs) return
var/mob/living/carbon/human/dummy/dummy = new () var/mob/living/carbon/human/dummy/dummy = new ()
//This doesn't include custom_items because that's ... hard. //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) qdel(dummy)
holo_icon = new_holo holo_icon = new_holo
else //One from the dmi. else //A premade from the dmi
var/icon_list[] = list( var/icon_list[] = list(
"default", "default",
"floating face", "floating face",
"carp", "singularity",
"ian", "drone",
"runtime", "carp",
"poly", "spider",
"pun pun", "bear",
"male human", "slime",
"female human", "ian",
"male unathi", "runtime",
"female unathi", "poly",
"male tajara", "pun pun",
"female tajara", "male human",
"male tesharii", "female human",
"female tesharii", "male unathi",
"male skrell", "female unathi",
"female skrell" "male tajara",
"female tajara",
"male tesharii",
"female tesharii",
"male skrell",
"female skrell"
) )
input = input("Please select a hologram:") as null|anything in icon_list input = input("Please select a hologram:") as null|anything in icon_list
if(input) 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")) holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
if("floating face") if("floating face")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2")) 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") if("carp")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4")) 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") if("ian")
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi")) holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi"))
if("runtime") if("runtime")

View File

@@ -28,11 +28,14 @@ var/list/datum/ai_icon/ai_icons
name = "Red" name = "Red"
alive_icon = "ai-red" alive_icon = "ai-red"
alive_light = "#F04848" alive_light = "#F04848"
dead_icon = "ai-red_dead"
dead_light = "#F04848"
/datum/ai_icon/green /datum/ai_icon/green
name = "Green" name = "Green"
alive_icon = "ai-wierd" alive_icon = "ai-wierd"
alive_light = "#00FF99" alive_light = "#00FF99"
dead_icon = "ai-weird_dead"
/datum/ai_icon/blue /datum/ai_icon/blue
name = "Blue" name = "Blue"
@@ -44,6 +47,11 @@ var/list/datum/ai_icon/ai_icons
alive_icon = "ai-angryface" alive_icon = "ai-angryface"
alive_light = "#FFFF33" alive_light = "#FFFF33"
/datum/ai_icon/angel
name = "Angel"
alive_icon = "ai-angel"
dead_icon = "ai-angel_dead"
/datum/ai_icon/bliss /datum/ai_icon/bliss
name = "Bliss" name = "Bliss"
alive_icon = "ai-bliss" alive_icon = "ai-bliss"
@@ -57,6 +65,7 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/database /datum/ai_icon/database
name = "Database" name = "Database"
alive_icon = "ai-database" alive_icon = "ai-database"
dead_icon = "ai-database_dead"
/datum/ai_icon/dorf /datum/ai_icon/dorf
name = "Dorf" name = "Dorf"
@@ -80,6 +89,8 @@ var/list/datum/ai_icon/ai_icons
name = "Goon" name = "Goon"
alive_icon = "ai-goon" alive_icon = "ai-goon"
alive_light = "#3E5C80" alive_light = "#3E5C80"
dead_icon = "ai-goon-crash"
dead_light = "#3E5C80"
/datum/ai_icon/heartline /datum/ai_icon/heartline
name = "Heartline" name = "Heartline"
@@ -91,6 +102,10 @@ var/list/datum/ai_icon/ai_icons
alive_icon = "ai-helios" alive_icon = "ai-helios"
alive_light = "#F2CF73" alive_light = "#F2CF73"
/datum/ai_icon/hourglass
name = "Hourglass"
alive_icon = "ai-hourglass"
/datum/ai_icon/inverted /datum/ai_icon/inverted
name = "Inverted" name = "Inverted"
alive_icon = "ai-u" alive_icon = "ai-u"
@@ -100,6 +115,7 @@ var/list/datum/ai_icon/ai_icons
name = "Lonestar" name = "Lonestar"
alive_icon = "ai-lonestar" alive_icon = "ai-lonestar"
alive_light = "#58751C" alive_light = "#58751C"
dead_icon = "ai-lonestar_dead"
/datum/ai_icon/matrix /datum/ai_icon/matrix
name = "Matrix" name = "Matrix"
@@ -110,6 +126,7 @@ var/list/datum/ai_icon/ai_icons
name = "Monochrome" name = "Monochrome"
alive_icon = "ai-mono" alive_icon = "ai-mono"
alive_light = "#585858" alive_light = "#585858"
dead_icon = "ai-mono_dead"
/datum/ai_icon/nanotrasen /datum/ai_icon/nanotrasen
name = "NanoTrasen" name = "NanoTrasen"
@@ -128,13 +145,16 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/soviet /datum/ai_icon/soviet
name = "Soviet" name = "Soviet"
alive_icon = "ai-redoctober" alive_icon = "ai-soviet"
alive_light = "#FF4307" alive_light = "#FF4307"
dead_icon = "ai-soviet_dead"
dead_light = "#FF4307"
/datum/ai_icon/Static /datum/ai_icon/Static
name = "Static" name = "Static"
alive_icon = "ai-static" alive_icon = "ai-static"
alive_light = "#4784C1" alive_light = "#4784C1"
alive_icon = "ai-static_dead"
/datum/ai_icon/text /datum/ai_icon/text
name = "Text" name = "Text"
@@ -143,6 +163,7 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/trapped /datum/ai_icon/trapped
name = "Trapped" name = "Trapped"
alive_icon = "ai-hades" alive_icon = "ai-hades"
dead_icon = "ai-hades_dead"
/datum/ai_icon/triumvirate_static /datum/ai_icon/triumvirate_static
name = "Triumvirate" name = "Triumvirate"

View File

@@ -158,9 +158,19 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/standard /obj/item/weapon/robot_module/robot/standard
name = "standard robot module" 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", "Android" = "droid",
"Default" = "robot",
"Drone" = "drone-standard" "Drone" = "drone-standard"
) )
@@ -181,8 +191,16 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/medical/surgeon /obj/item/weapon/robot_module/robot/medical/surgeon
name = "surgeon robot module" name = "surgeon robot module"
sprites = list( 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", "Basic" = "Medbot",
"Standard" = "surgeon",
"Advanced Droid" = "droid-medical", "Advanced Droid" = "droid-medical",
"Needles" = "medicalrobot", "Needles" = "medicalrobot",
"Drone" = "drone-surgery" "Drone" = "drone-surgery"
@@ -230,8 +248,16 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/medical/crisis /obj/item/weapon/robot_module/robot/medical/crisis
name = "crisis robot module" name = "crisis robot module"
sprites = list( 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", "Basic" = "Medbot",
"Standard" = "surgeon",
"Advanced Droid" = "droid-medical", "Advanced Droid" = "droid-medical",
"Needles" = "medicalrobot", "Needles" = "medicalrobot",
"Drone - Medical" = "drone-medical", "Drone - Medical" = "drone-medical",
@@ -295,6 +321,15 @@ var/global/list/robot_modules = list(
networks = list(NETWORK_ENGINEERING) networks = list(NETWORK_ENGINEERING)
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
sprites = list( 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", "Basic" = "Engineering",
"Antique" = "engineerrobot", "Antique" = "engineerrobot",
"Landmate" = "landmate", "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/rcd/borg(src)
src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(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/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_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() /obj/item/weapon/robot_module/robot/engineering/general/New()
..() ..()
src.modules += new /obj/item/borg/sight/meson(src) 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/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/wirecutters(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 /obj/item/weapon/robot_module/robot/security/general
sprites = list( 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", "Basic" = "secborg",
"Red Knight" = "Security",
"Black Knight" = "securityrobot", "Black Knight" = "securityrobot",
"Bloodhound" = "bloodhound",
"Bloodhound - Treaded" = "secborg+tread",
"Drone" = "drone-sec" "Drone" = "drone-sec"
) )
@@ -448,6 +491,13 @@ var/global/list/robot_modules = list(
name = "janitorial robot module" name = "janitorial robot module"
channels = list("Service" = 1) channels = list("Service" = 1)
sprites = list( sprites = list(
"M-USE NanoTrasen" = "robotJani",
"Cabeiri" = "eyebot-janitor",
"CUPCAKE" = "Noble-CLN",
"Haruka" = "marinaJN",
"Telemachus" = "toiletbotjanitor",
"WTOperator" = "sleekjanitor",
"XI-ALP" = "heavyRes",
"Basic" = "JanBot2", "Basic" = "JanBot2",
"Mopbot" = "janitorrobot", "Mopbot" = "janitorrobot",
"Mop Gear Rex" = "mopgearrex", "Mop Gear Rex" = "mopgearrex",
@@ -488,11 +538,21 @@ var/global/list/robot_modules = list(
) )
/obj/item/weapon/robot_module/robot/clerical/butler /obj/item/weapon/robot_module/robot/clerical/butler
sprites = list( "Waitress" = "Service", sprites = list(
"Kent" = "toiletbot", "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", "Bro" = "Brobot",
"Rich" = "maximillion", "Rich" = "maximillion",
"Default" = "Service2",
"Drone - Service" = "drone-service", "Drone - Service" = "drone-service",
"Drone - Hydro" = "drone-hydro" "Drone - Hydro" = "drone-hydro"
) )
@@ -532,12 +592,21 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/clerical/general /obj/item/weapon/robot_module/robot/clerical/general
name = "clerical robot module" name = "clerical robot module"
sprites = list( 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", "Waitress" = "Service",
"Kent" = "toiletbot",
"Bro" = "Brobot", "Bro" = "Brobot",
"Rich" = "maximillion", "Rich" = "maximillion",
"Default" = "Service2", "Default" = "Service2",
"Drone" = "drone-service" "Drone" = "drone-blu"
) )
/obj/item/weapon/robot_module/robot/clerical/general/New() /obj/item/weapon/robot_module/robot/clerical/general/New()
@@ -563,6 +632,14 @@ var/global/list/robot_modules = list(
channels = list("Supply" = 1) channels = list("Supply" = 1)
networks = list(NETWORK_MINE) networks = list(NETWORK_MINE)
sprites = list( 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", "Basic" = "Miner_old",
"Advanced Droid" = "droid-miner", "Advanced Droid" = "droid-miner",
"Treadhead" = "Miner", "Treadhead" = "Miner",
@@ -586,6 +663,10 @@ var/global/list/robot_modules = list(
name = "research module" name = "research module"
channels = list("Science" = 1) channels = list("Science" = 1)
sprites = list( sprites = list(
"L'Ouef" = "peaceborg",
"Cabeiri" = "eyebot-science",
"Haruka" = "marinaSCI",
"WTOperator" = "sleekscience",
"Droid" = "droid-science", "Droid" = "droid-science",
"Drone" = "drone-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/weapon/gripper/no_use/loader(src)
src.modules += new /obj/item/device/robotanalyzer(src) src.modules += new /obj/item/device/robotanalyzer(src)
src.modules += new /obj/item/weapon/card/robot(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/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/wirecutters(src) src.modules += new /obj/item/weapon/wirecutters(src)
@@ -641,7 +722,13 @@ var/global/list/robot_modules = list(
LANGUAGE_SIGN = 0 LANGUAGE_SIGN = 0
) )
sprites = list( 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 var/id
@@ -666,7 +753,10 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/security/combat /obj/item/weapon/robot_module/robot/security/combat
name = "combat robot module" name = "combat robot module"
hide_on_manifest = 1 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() /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) /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/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/weapon/crowbar(src)

View File

@@ -115,7 +115,7 @@
var/mob/living/carbon/human/H = 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/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)) 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) H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1, edge=1)
return H return H
else if(isliving(target_mob)) else if(isliving(target_mob))
var/mob/living/L = target_mob var/mob/living/L = target_mob

View File

@@ -0,0 +1,73 @@
// Different types of fish! They are all subtypes of this tho
/mob/living/simple_animal/fish
name = "fish"
desc = "Its a fishy. No touchy fishy."
icon = 'icons/mob/fish.dmi'
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
// By defautl they can be in any water turf. Subtypes might restrict to deep/shallow etc
var/global/list/suitable_turf_types = list(
/turf/simulated/floor/beach/water,
/turf/simulated/floor/beach/coastline,
/turf/simulated/floor/holofloor/beach/water,
/turf/simulated/floor/holofloor/beach/coastline,
/turf/simulated/floor/water
)
// Don't swim out of the water
/mob/living/simple_animal/fish/handle_wander_movement()
if(isturf(src.loc) && !resting && !buckled && canmove) //Physically capable of moving?
lifes_since_move++ //Increment turns since move (turns are life() cycles)
if(lifes_since_move >= turns_per_move)
if(!(stop_when_pulled && pulledby)) //Some animals don't move when pulled
var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND
moving_to = pick(cardinal)
dir = moving_to //How about we turn them the direction they are moving, yay.
var/turf/T = get_step(src,moving_to)
if(T && is_type_in_list(T, suitable_turf_types))
Move(T)
lifes_since_move = 0
// Take damage if we are not in water
/mob/living/simple_animal/fish/handle_breathing()
var/turf/T = get_turf(src)
if(T && !is_type_in_list(T, suitable_turf_types))
if(prob(50))
say(pick("Blub", "Glub", "Burble"))
adjustBruteLoss(unsuitable_atoms_damage)
/mob/living/simple_animal/fish/bass
name = "bass"
icon_state = "bass-swim"
icon_living = "bass-swim"
icon_dead = "bass-dead"
/mob/living/simple_animal/fish/trout
name = "trout"
icon_state = "trout-swim"
icon_living = "trout-swim"
icon_dead = "trout-dead"
/mob/living/simple_animal/fish/salmon
name = "salmon"
icon_state = "salmon-swim"
icon_living = "salmon-swim"
icon_dead = "salmon-dead"
/mob/living/simple_animal/fish/perch
name = "perch"
icon_state = "perch-swim"
icon_living = "perch-swim"
icon_dead = "perch-dead"
/mob/living/simple_animal/fish/pike
name = "pike"
icon_state = "pike-swim"
icon_living = "pike-swim"
icon_dead = "pike-dead"
/mob/living/simple_animal/fish/koi
name = "koi"
icon_state = "koi-swim"
icon_living = "koi-swim"
icon_dead = "koi-dead"

View File

@@ -36,7 +36,7 @@
speak_emote = list("chitters") speak_emote = list("chitters")
emote_hear = 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/busy = 0
var/poison_per_bite = 5 var/poison_per_bite = 5

View File

@@ -481,7 +481,7 @@
var/mob/living/carbon/human/H = parrot_interest var/mob/living/carbon/human/H = parrot_interest
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone))) var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone)))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1) H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1)
visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons.")) visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons."))
else else

View File

@@ -904,7 +904,7 @@ mob/proc/yank_out_object()
if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-. 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)) var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15))
affected.wounds += I 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)) if (ishuman(U))
var/mob/living/carbon/human/human_user = U var/mob/living/carbon/human/human_user = U

View File

@@ -20,7 +20,7 @@
user << "<span class='notice'>You must stand still to feel [E] for fractures.</span>" user << "<span class='notice'>You must stand still to feel [E] for fractures.</span>"
else if(E.status & ORGAN_BROKEN) 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>" 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 else
user << "<span class='notice'>The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine.</span>" user << "<span class='notice'>The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine.</span>"
@@ -56,7 +56,8 @@
return return
var/armor = target.run_armor_check(target, "melee") 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>" 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 var/max_halloss = round(target.species.total_health * 0.8) //up to 80% of passing out
@@ -100,8 +101,9 @@
damage += hat.force * 3 damage += hat.force * 3
var/armor = target.run_armor_check(BP_HEAD, "melee") var/armor = target.run_armor_check(BP_HEAD, "melee")
target.apply_damage(damage, BRUTE, BP_HEAD, armor) var/soaked = target.get_armor_soak(BP_HEAD, "melee")
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(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)) if(!armor && target.headcheck(BP_HEAD) && prob(damage))
target.apply_effect(20, PARALYZE) target.apply_effect(20, PARALYZE)

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