mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
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:
@@ -228,13 +228,16 @@ mob/living/carbon/human/airflow_hit(atom/A)
|
||||
var/b_loss = airflow_speed * vsc.airflow_damage
|
||||
|
||||
var/blocked = run_armor_check(BP_HEAD,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, 0, "Airflow")
|
||||
var/soaked = get_armor_soak(BP_HEAD,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, soaked, 0, "Airflow")
|
||||
|
||||
blocked = run_armor_check(BP_TORSO,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, 0, "Airflow")
|
||||
soaked = get_armor_soak(BP_TORSO,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, soaked, 0, "Airflow")
|
||||
|
||||
blocked = run_armor_check(BP_GROIN,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, 0, "Airflow")
|
||||
soaked = get_armor_soak(BP_GROIN,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, soaked, 0, "Airflow")
|
||||
|
||||
if(airflow_speed > 10)
|
||||
Paralyse(round(airflow_speed * vsc.airflow_stun))
|
||||
|
||||
@@ -341,6 +341,7 @@
|
||||
var/mob/living/carbon/C = usr
|
||||
C.swap_hand()
|
||||
else
|
||||
var/turf/T = screen_loc2turf("screen-loc", get_turf(usr))
|
||||
var/turf/T = screen_loc2turf(screen_loc, get_turf(usr))
|
||||
if(T)
|
||||
T.Click(location, control, params)
|
||||
. = 1
|
||||
|
||||
@@ -108,6 +108,7 @@ var/const/ERT_FREQ = 1345
|
||||
var/const/AI_FREQ = 1343
|
||||
var/const/DTH_FREQ = 1341
|
||||
var/const/SYND_FREQ = 1213
|
||||
var/const/RAID_FREQ = 1277
|
||||
var/const/ENT_FREQ = 1461 //entertainment frequency. This is not a diona exclusive frequency.
|
||||
|
||||
// department channels
|
||||
@@ -133,6 +134,7 @@ var/list/radiochannels = list(
|
||||
"Response Team" = ERT_FREQ,
|
||||
"Special Ops" = DTH_FREQ,
|
||||
"Mercenary" = SYND_FREQ,
|
||||
"Raider" = RAID_FREQ,
|
||||
"Supply" = SUP_FREQ,
|
||||
"Service" = SRV_FREQ,
|
||||
"AI Private" = AI_FREQ,
|
||||
@@ -145,7 +147,7 @@ var/list/radiochannels = list(
|
||||
var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ)
|
||||
|
||||
// Antag channels, i.e. Syndicate
|
||||
var/list/ANTAG_FREQS = list(SYND_FREQ)
|
||||
var/list/ANTAG_FREQS = list(SYND_FREQ, RAID_FREQ)
|
||||
|
||||
//Department channels, arranged lexically
|
||||
var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ)
|
||||
|
||||
@@ -74,6 +74,10 @@
|
||||
name = "request console electronics"
|
||||
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
|
||||
name = "motor"
|
||||
path =/obj/item/weapon/stock_parts/motor
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
name = "welding tool"
|
||||
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
|
||||
name = "screwdriver"
|
||||
path =/obj/item/weapon/screwdriver
|
||||
|
||||
@@ -156,7 +156,7 @@ datum/supply_packs/costumes/witch
|
||||
/obj/item/clothing/under/wedding/bride_blue,
|
||||
/obj/item/clothing/under/wedding/bride_red,
|
||||
/obj/item/clothing/under/wedding/bride_white,
|
||||
/obj/item/clothing/under/dress/sundress,
|
||||
/obj/item/clothing/under/sundress,
|
||||
/obj/item/clothing/under/dress/dress_green,
|
||||
/obj/item/clothing/under/dress/dress_pink,
|
||||
/obj/item/clothing/under/dress/dress_orange,
|
||||
|
||||
@@ -33,6 +33,15 @@
|
||||
containertype = /obj/structure/closet/crate/engineering/electrical
|
||||
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
|
||||
name = "Mechanical maintenance crate"
|
||||
contains = list(
|
||||
|
||||
@@ -141,9 +141,10 @@
|
||||
access = access_hydroponics
|
||||
|
||||
/datum/supply_packs/hydro/tray
|
||||
name = "Empty hydroponics tray"
|
||||
cost = 20
|
||||
name = "Empty hydroponics trays"
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
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
|
||||
|
||||
|
||||
@@ -66,6 +66,27 @@
|
||||
containername = "Surgery crate"
|
||||
access = access_medical
|
||||
|
||||
/datum/supply_packs/med/deathalarm
|
||||
name = "Death Alarm crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/box/cdeathalarm_kit,
|
||||
/obj/item/weapon/storage/box/cdeathalarm_kit
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Death Alarm crate"
|
||||
access = access_medical
|
||||
|
||||
/datum/supply_packs/med/clotting
|
||||
name = "Clotting Medicine crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Clotting Medicine crate"
|
||||
access = access_medical
|
||||
|
||||
/datum/supply_packs/med/sterile
|
||||
name = "Sterile equipment crate"
|
||||
contains = list(
|
||||
|
||||
@@ -74,6 +74,14 @@
|
||||
containername = "Energy marksman crate"
|
||||
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
|
||||
name = "Electromagnetic weapons crate"
|
||||
contains = list(
|
||||
@@ -85,6 +93,17 @@
|
||||
containername = "electromagnetic weapons crate"
|
||||
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
|
||||
name = "Automatic weapon crate"
|
||||
num_contained = 2
|
||||
|
||||
@@ -159,3 +159,13 @@
|
||||
/obj/item/device/kit/paint/gygax/recitence
|
||||
)
|
||||
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
|
||||
@@ -40,6 +40,7 @@
|
||||
name = "Exotic seeds crate"
|
||||
contains = list(
|
||||
/obj/item/seeds/replicapod = 2,
|
||||
/obj/item/seeds/ambrosiavulgarisseed = 2,
|
||||
/obj/item/seeds/libertymycelium,
|
||||
/obj/item/seeds/reishimycelium,
|
||||
/obj/item/seeds/random = 6,
|
||||
@@ -49,4 +50,3 @@
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containername = "Exotic Seeds crate"
|
||||
access = access_hydroponics
|
||||
|
||||
|
||||
@@ -19,6 +19,16 @@
|
||||
item_cost = 5
|
||||
path = /obj/item/weapon/storage/box/ambrosia
|
||||
|
||||
/datum/uplink_item/item/medical/clotting
|
||||
name = "Clotting Medicine injector"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting
|
||||
|
||||
/datum/uplink_item/item/medical/bonemeds
|
||||
name = "Bone Repair injector"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed
|
||||
|
||||
/datum/uplink_item/item/medical/ambrosiadeusseeds
|
||||
name = "Box of 7x ambrosia deus seed packets"
|
||||
item_cost = 10
|
||||
|
||||
@@ -43,12 +43,15 @@
|
||||
/datum/antagonist/proc/create_radio(var/freq, var/mob/living/carbon/human/player)
|
||||
var/obj/item/device/radio/R
|
||||
|
||||
if(freq == SYND_FREQ)
|
||||
switch(freq)
|
||||
if(SYND_FREQ)
|
||||
R = new/obj/item/device/radio/headset/syndicate(player)
|
||||
if(RAID_FREQ)
|
||||
R = new/obj/item/device/radio/headset/raider(player)
|
||||
else
|
||||
R = new/obj/item/device/radio/headset(player)
|
||||
|
||||
R.set_frequency(freq)
|
||||
|
||||
player.equip_to_slot_or_del(R, slot_l_ear)
|
||||
return R
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ var/datum/antagonist/raider/raiders
|
||||
W.handle_item_insertion(id)
|
||||
player.equip_to_slot_or_del(W, slot_wear_id)
|
||||
spawn_money(rand(50,150)*10,W)
|
||||
create_radio(SYND_FREQ, player)
|
||||
create_radio(RAID_FREQ, player)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -305,7 +305,7 @@
|
||||
if(subject.isSynthetic())
|
||||
scantemp = "Error: Majority of subject is non-organic."
|
||||
return
|
||||
if (subject.suiciding == 1)
|
||||
if (subject.suiciding)
|
||||
scantemp = "Error: Subject's brain is not responding to scanning stimuli."
|
||||
return
|
||||
if ((!subject.ckey) || (!subject.client))
|
||||
|
||||
@@ -1,57 +1,104 @@
|
||||
/obj/machinery/pipelayer
|
||||
|
||||
name = "automatic pipe layer"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "pipe_d"
|
||||
density = 1
|
||||
var/turf/old_turf
|
||||
var/old_dir
|
||||
var/on = 0
|
||||
var/a_dis = 0
|
||||
var/P_type = 0
|
||||
var/P_type_t = ""
|
||||
var/max_metal = 50
|
||||
var/metal = 10
|
||||
var/obj/item/weapon/wrench/W
|
||||
circuit = /obj/item/weapon/circuitboard/pipelayer
|
||||
var/turf/old_turf // Last turf we were on.
|
||||
var/old_dir // Last direction we were facing.
|
||||
var/on = 0 // Pipelaying online?
|
||||
var/a_dis = 0 // Auto-dismantling - If enabled it will remove floor tiles
|
||||
var/P_type = 0 // Currently selected pipe type
|
||||
var/P_type_t = "" // Name of currently selected pipe type
|
||||
var/max_metal = 50 // Max capacity for internal metal storage
|
||||
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)
|
||||
|
||||
/obj/machinery/pipelayer/New()
|
||||
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)
|
||||
..()
|
||||
|
||||
if(on && a_dis)
|
||||
dismantleFloor(old_turf)
|
||||
layPipe(old_turf,M_Dir,old_dir)
|
||||
layPipe(old_turf, M_Dir, old_dir)
|
||||
|
||||
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)
|
||||
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>"
|
||||
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>")
|
||||
return
|
||||
|
||||
/obj/machinery/pipelayer/attackby(var/obj/item/W as obj, var/mob/user as mob)
|
||||
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
if(default_deconstruction_screwdriver(user, W))
|
||||
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 = 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>")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
a_dis=!a_dis
|
||||
if(!panel_open && iscrowbar(W))
|
||||
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>")
|
||||
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)
|
||||
|
||||
var/result = load_metal(W)
|
||||
if(isnull(result))
|
||||
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>"
|
||||
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>")
|
||||
|
||||
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)
|
||||
@@ -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."
|
||||
|
||||
/obj/machinery/pipelayer/proc/reset()
|
||||
on=0
|
||||
on = 0
|
||||
return
|
||||
|
||||
/obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/MM)
|
||||
@@ -100,12 +132,22 @@
|
||||
return
|
||||
|
||||
/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.")
|
||||
return
|
||||
metal-=amount
|
||||
metal -= amount
|
||||
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)
|
||||
if(istype(new_turf, /turf/simulated/floor))
|
||||
var/turf/simulated/floor/T = new_turf
|
||||
@@ -114,11 +156,11 @@
|
||||
return new_turf.is_plating()
|
||||
|
||||
/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()
|
||||
if(!use_metal(0.25))
|
||||
if(!use_metal(pipe_cost))
|
||||
return reset()
|
||||
var/fdirn = turn(M_Dir,180)
|
||||
var/fdirn = turn(M_Dir, 180)
|
||||
var/p_type
|
||||
var/p_dir
|
||||
|
||||
@@ -130,6 +172,8 @@
|
||||
p_dir=M_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)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -8,7 +8,7 @@ obj/machinery/recharger
|
||||
idle_power_usage = 4
|
||||
active_power_usage = 40000 //40 kW
|
||||
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_charging = "recharger1"
|
||||
var/icon_state_idle = "recharger0" //also when unpowered
|
||||
@@ -33,19 +33,19 @@ obj/machinery/recharger
|
||||
|
||||
if(allowed)
|
||||
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
|
||||
// Checks to make sure he's not in space doing it, and that the area got proper power.
|
||||
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
|
||||
if(istype(G, /obj/item/weapon/gun/energy))
|
||||
var/obj/item/weapon/gun/energy/E = G
|
||||
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
|
||||
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
|
||||
if(istype(G, /obj/item/weapon/gun/energy/staff))
|
||||
return
|
||||
@@ -65,16 +65,22 @@ obj/machinery/recharger
|
||||
if(!assembly.battery)
|
||||
to_chat(user, "<span class='warning'>The assembly doesn't have a power cell.</span>")
|
||||
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()
|
||||
G.loc = src
|
||||
charging = G
|
||||
update_icon()
|
||||
else if(portable && istype(G, /obj/item/weapon/wrench))
|
||||
if(charging)
|
||||
user << "<span class='warning'>Remove [charging] first!</span>"
|
||||
to_chat(user, "<span class='warning'>Remove [charging] first!</span>")
|
||||
return
|
||||
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)
|
||||
else if(default_deconstruction_screwdriver(user, G))
|
||||
return
|
||||
@@ -208,8 +214,8 @@ obj/machinery/recharger
|
||||
name = "wall recharger"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
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
|
||||
allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/weapon/cell/device)
|
||||
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/device/flashlight, /obj/item/weapon/cell/device)
|
||||
icon_state_charged = "wrecharger2"
|
||||
icon_state_charging = "wrecharger1"
|
||||
icon_state_idle = "wrecharger0"
|
||||
|
||||
@@ -374,6 +374,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
blackbox.msg_deathsquad += blackbox_msg
|
||||
if(SYND_FREQ)
|
||||
blackbox.msg_syndicate += blackbox_msg
|
||||
if(RAID_FREQ)
|
||||
blackbox.msg_raider += blackbox_msg
|
||||
if(SUP_FREQ)
|
||||
blackbox.msg_cargo += blackbox_msg
|
||||
if(SRV_FREQ)
|
||||
@@ -554,6 +556,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
blackbox.msg_deathsquad += blackbox_msg
|
||||
if(SYND_FREQ)
|
||||
blackbox.msg_syndicate += blackbox_msg
|
||||
if(RAID_FREQ)
|
||||
blackbox.msg_raider += blackbox_msg
|
||||
if(SUP_FREQ)
|
||||
blackbox.msg_cargo += blackbox_msg
|
||||
if(SRV_FREQ)
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/cutewitch/New()
|
||||
new /obj/item/clothing/under/dress/sundress(src.loc)
|
||||
new /obj/item/clothing/under/sundress(src.loc)
|
||||
new /obj/item/clothing/head/witchwig(src.loc)
|
||||
new /obj/item/weapon/staff/broom(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
|
||||
var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N
|
||||
var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
var/list/armorsoak = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
var/list/allowed = null //suit storage stuff.
|
||||
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
|
||||
var/zoomdevicename = null //name used for message when binoculars/scope is used
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "inteliCard"
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "aicard" // aicard-full
|
||||
item_state = "electronic"
|
||||
item_state = "aicard"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
show_messages = 0
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
var/state //0 off, 1 open, 2 working, 3 dead
|
||||
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/charge_cost //Set in New() based on 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)
|
||||
var/mob/living/carbon/human/user = usr
|
||||
//<--Feel free to code clothing checks right here
|
||||
user.visible_message("<span class='warning'>[user] begins applying defib pads to [onto].</span>",
|
||||
"<span class='warning'>You begin applying defib pads to [onto].</span>")
|
||||
if(can_defib(onto))
|
||||
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))
|
||||
patient = onto
|
||||
statechange(1,patient)
|
||||
user.visible_message("<span class='warning'>[user] applies defib pads to [onto].</span>",
|
||||
"<span class='warning'>You finish applying defib pads to [onto].</span>")
|
||||
user.visible_message("<span class='warning'>[user] applies [pad_name] 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)
|
||||
..()
|
||||
@@ -94,7 +114,7 @@
|
||||
|
||||
//Patient moved 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)
|
||||
patient = null
|
||||
return
|
||||
@@ -111,7 +131,7 @@
|
||||
patient.visible_message("<span class='warning'>[patient] convulses!</span>")
|
||||
playsound(src.loc, 'sound/effects/sparks2.ogg', 75, 1)
|
||||
//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.
|
||||
for(var/mob/observer/dead/ghost in player_list)
|
||||
if(ghost.mind == patient.mind)
|
||||
@@ -155,3 +175,10 @@
|
||||
break
|
||||
|
||||
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"
|
||||
|
||||
@@ -181,6 +181,38 @@
|
||||
else
|
||||
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)
|
||||
if(power_use)
|
||||
if(istype(W, /obj/item/weapon/cell))
|
||||
@@ -210,6 +242,26 @@
|
||||
w_class = ITEMSIZE_TINY
|
||||
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
|
||||
name = "maglight"
|
||||
desc = "A very, very heavy duty flashlight."
|
||||
|
||||
@@ -19,6 +19,12 @@
|
||||
origin_tech = list(TECH_ILLEGAL = 3)
|
||||
syndie = 1//Signifies that it de-crypts Syndicate transmissions
|
||||
|
||||
/obj/item/device/encryptionkey/raider
|
||||
icon_state = "cypherkey"
|
||||
channels = list("Raider" = 1)
|
||||
origin_tech = list(TECH_ILLEGAL = 2)
|
||||
syndie = 1
|
||||
|
||||
/obj/item/device/encryptionkey/binary
|
||||
icon_state = "cypherkey"
|
||||
translate_binary = 1
|
||||
|
||||
@@ -75,6 +75,15 @@
|
||||
syndie = 1
|
||||
ks1type = /obj/item/device/encryptionkey/syndicate
|
||||
|
||||
/obj/item/device/radio/headset/raider
|
||||
origin_tech = list(TECH_ILLEGAL = 2)
|
||||
syndie = 1
|
||||
ks1type = /obj/item/device/encryptionkey/raider
|
||||
|
||||
/obj/item/device/radio/headset/raider/initialize()
|
||||
..()
|
||||
set_frequency(RAID_FREQ)
|
||||
|
||||
/obj/item/device/radio/headset/binary
|
||||
origin_tech = list(TECH_ILLEGAL = 3)
|
||||
ks1type = /obj/item/device/encryptionkey/binary
|
||||
@@ -289,6 +298,7 @@
|
||||
desc = "The headset of the boss's boss."
|
||||
icon_state = "com_headset"
|
||||
item_state = "headset"
|
||||
centComm = 1
|
||||
// freerange = 1
|
||||
ks2type = /obj/item/device/encryptionkey/ert
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
/obj/item/device/radio/intercom/specops
|
||||
name = "\improper Spec Ops intercom"
|
||||
frequency = ERT_FREQ
|
||||
subspace_transmission = 1
|
||||
centComm = 1
|
||||
|
||||
/obj/item/device/radio/intercom/department
|
||||
canhear_range = 5
|
||||
@@ -81,6 +83,17 @@
|
||||
..()
|
||||
internal_channels[num2text(SYND_FREQ)] = list(access_syndicate)
|
||||
|
||||
/obj/item/device/radio/intercom/raider
|
||||
name = "illicit intercom"
|
||||
desc = "Pirate radio, but not in the usual sense of the word."
|
||||
frequency = RAID_FREQ
|
||||
subspace_transmission = 1
|
||||
syndie = 1
|
||||
|
||||
/obj/item/device/radio/intercom/raider/New()
|
||||
..()
|
||||
internal_channels[num2text(RAID_FREQ)] = list(access_syndicate)
|
||||
|
||||
/obj/item/device/radio/intercom/Destroy()
|
||||
processing_objects -= src
|
||||
..()
|
||||
|
||||
@@ -40,6 +40,7 @@ var/global/list/default_medbay_channels = list(
|
||||
var/list/channels = list() //see communications.dm for full list. First channel is a "default" for :h
|
||||
var/subspace_transmission = 0
|
||||
var/syndie = 0//Holder to see if it's a syndicate encrypted radio
|
||||
var/centComm = 0//Holder to see if it's a CentComm encrypted radio
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
throw_speed = 2
|
||||
@@ -508,6 +509,9 @@ var/global/list/default_medbay_channels = list(
|
||||
if(freq in ANTAG_FREQS)
|
||||
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
return -1
|
||||
if(freq in CENT_FREQS)
|
||||
if(!(src.centComm))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
return -1
|
||||
if (!on)
|
||||
return -1
|
||||
if (!freq) //recieved on main frequency
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
name = "\improper T-ray scanner"
|
||||
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
|
||||
icon_state = "t-ray0"
|
||||
item_state = "t-ray"
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_SMALL
|
||||
item_state = "electronic"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 150)
|
||||
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
name = "robotic module reset board"
|
||||
desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
|
||||
@@ -43,6 +44,7 @@
|
||||
name = "robot reclassification board"
|
||||
desc = "Used to rename a cyborg."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
item_state = "cyborg_upgrade"
|
||||
var/heldname = "default name"
|
||||
|
||||
/obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
|
||||
@@ -61,6 +63,7 @@
|
||||
name = "robot emergency restart module"
|
||||
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
item_state = "cyborg_upgrade"
|
||||
|
||||
|
||||
/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
|
||||
@@ -84,6 +87,7 @@
|
||||
name = "robotic VTEC Module"
|
||||
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
|
||||
icon_state = "cyborg_upgrade2"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
|
||||
@@ -100,6 +104,7 @@
|
||||
name = "robotic Rapid Taser Cooling Module"
|
||||
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
|
||||
@@ -134,6 +139,7 @@
|
||||
name = "mining robot jetpack"
|
||||
desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
|
||||
@@ -155,6 +161,7 @@
|
||||
name = "illegal equipment module"
|
||||
desc = "Unlocks the hidden, deadlier functions of a robot"
|
||||
icon_state = "cyborg_upgrade3"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R)
|
||||
|
||||
@@ -87,6 +87,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
var/icon_on
|
||||
var/type_butt = null
|
||||
var/chem_volume = 0
|
||||
var/max_smoketime = 0 //Related to sprites
|
||||
var/smoketime = 0
|
||||
var/is_pipe = 0 //Prevents a runtime with pipes
|
||||
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
|
||||
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)
|
||||
if(smoketime > max_smoketime)
|
||||
smoketime = max_smoketime
|
||||
smoketime -= amount
|
||||
if(reagents && reagents.total_volume) // check if it has any reagents at all
|
||||
if(ishuman(loc))
|
||||
@@ -120,11 +125,29 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
if(location)
|
||||
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)
|
||||
..()
|
||||
if(is_pipe)
|
||||
return
|
||||
var/smoke_percent = round((smoketime / initial(smoketime)) * 100)
|
||||
var/smoke_percent = round((smoketime / max_smoketime) * 100)
|
||||
switch(smoke_percent)
|
||||
if(90 to INFINITY)
|
||||
user << "[src] is still fresh."
|
||||
@@ -156,15 +179,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
return
|
||||
flags &= ~NOREACT // allowing reagents to react after being lit
|
||||
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)
|
||||
T.visible_message(flavor_text)
|
||||
update_icon()
|
||||
set_light(2, 0.25, "#E38F46")
|
||||
processing_objects.Add(src)
|
||||
|
||||
@@ -205,14 +222,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/proc/quench()
|
||||
lit = 0
|
||||
processing_objects.Remove(src)
|
||||
icon_state = initial(icon_state)
|
||||
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)
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/mask/smokable/attack(mob/living/carbon/human/H, mob/user, def_zone)
|
||||
if(lit && H == user && istype(H))
|
||||
@@ -259,15 +269,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/cigarette
|
||||
name = "cigarette"
|
||||
desc = "A roll of tobacco and nicotine."
|
||||
icon_state = "cigoff"
|
||||
icon_state = "cig"
|
||||
item_state = "cig"
|
||||
throw_speed = 0.5
|
||||
item_state = "cigoff"
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_EARS | SLOT_MASK
|
||||
attack_verb = list("burnt", "singed")
|
||||
icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
|
||||
type_butt = /obj/item/weapon/cigbutt
|
||||
chem_volume = 15
|
||||
max_smoketime = 300
|
||||
smoketime = 300
|
||||
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>"
|
||||
@@ -315,11 +325,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar
|
||||
name = "premium cigar"
|
||||
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
|
||||
icon_state = "cigar2off"
|
||||
icon_on = "cigar2on"
|
||||
icon_state = "cigar2"
|
||||
type_butt = /obj/item/weapon/cigbutt/cigarbutt
|
||||
throw_speed = 0.5
|
||||
item_state = "cigaroff"
|
||||
item_state = "cigar"
|
||||
max_smoketime = 1500
|
||||
smoketime = 1500
|
||||
chem_volume = 20
|
||||
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
|
||||
name = "\improper Cohiba Robusto cigar"
|
||||
desc = "There's little more you could want from a cigar."
|
||||
icon_state = "cigar2off"
|
||||
icon_on = "cigar2on"
|
||||
icon_state = "cigar2"
|
||||
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
|
||||
name = "premium Havanian cigar"
|
||||
desc = "A cigar fit for only the best of the best."
|
||||
icon_state = "cigar2off"
|
||||
icon_on = "cigar2on"
|
||||
icon_state = "cigar2"
|
||||
max_smoketime = 7200
|
||||
smoketime = 7200
|
||||
chem_volume = 30
|
||||
|
||||
@@ -375,9 +384,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/pipe
|
||||
name = "smoking pipe"
|
||||
desc = "A pipe, for smoking. Made of fine, stained cherry wood."
|
||||
icon_state = "pipeoff"
|
||||
item_state = "pipeoff"
|
||||
icon_on = "pipeon" //Note - these are in masks.dmi
|
||||
icon_state = "pipe"
|
||||
item_state = "pipe"
|
||||
smoketime = 0
|
||||
chem_volume = 50
|
||||
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
|
||||
@@ -429,6 +437,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
if (smoketime)
|
||||
user << "<span class='notice'>[src] is already packed.</span>"
|
||||
return
|
||||
max_smoketime = 1000
|
||||
smoketime = 1000
|
||||
if(G.reagents)
|
||||
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
|
||||
name = "corn cob pipe"
|
||||
desc = "A nicotine delivery system popularized by folksy backwoodsmen, kept popular in the modern age and beyond by space hipsters."
|
||||
icon_state = "cobpipeoff"
|
||||
item_state = "cobpipeoff"
|
||||
icon_on = "cobpipeon" //Note - these are in masks.dmi
|
||||
icon_state = "cobpipe"
|
||||
item_state = "cobpipe"
|
||||
chem_volume = 35
|
||||
|
||||
/////////
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
name = "circuit board"
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "id_mod"
|
||||
item_state = "electronic"
|
||||
origin_tech = list(TECH_DATA = 2)
|
||||
density = 0
|
||||
anchored = 0
|
||||
|
||||
@@ -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)
|
||||
@@ -7,7 +7,6 @@
|
||||
name = "exosuit circuit board"
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "std_mod"
|
||||
item_state = "electronic"
|
||||
board_type = "other"
|
||||
|
||||
/obj/item/weapon/circuitboard/mecha/ripley
|
||||
|
||||
@@ -452,23 +452,27 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
|
||||
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
|
||||
//give the syndies a bit of stealth
|
||||
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
|
||||
else
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
qdel(a)
|
||||
processing_objects.Remove(src)
|
||||
if ("emp")
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
|
||||
var/name = prob(50) ? t.name : pick(teleportlocs)
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
qdel(a)
|
||||
else
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
|
||||
qdel(a)
|
||||
processing_objects.Remove(src)
|
||||
|
||||
|
||||
@@ -68,40 +68,3 @@
|
||||
qdel(src)
|
||||
user.put_in_hands(finished)
|
||||
update_icon(user)
|
||||
|
||||
/obj/item/woodcirclet
|
||||
name = "wood circlet"
|
||||
desc = "A small wood circlet for making a flower crown."
|
||||
icon = 'icons/obj/buildingobject.dmi'
|
||||
icon_state = "woodcirclet"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
/obj/item/woodcirclet/attackby(obj/item/W as obj, mob/user as mob)
|
||||
var/obj/item/complete
|
||||
if(istype(W,/obj/item/seeds/poppyseed))
|
||||
user << "You attach the poppy to the circlet and create a beautiful flower crown."
|
||||
complete = new /obj/item/clothing/head/poppy_crown(get_turf(user))
|
||||
user.drop_from_inventory(W)
|
||||
user.drop_from_inventory(src)
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
user.put_in_hands(complete)
|
||||
return
|
||||
else if(istype(W,/obj/item/seeds/sunflowerseed))
|
||||
user << "You attach the sunflower to the circlet and create a beautiful flower crown."
|
||||
complete = new /obj/item/clothing/head/sunflower_crown(get_turf(user))
|
||||
user.drop_from_inventory(W)
|
||||
user.drop_from_inventory(src)
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
user.put_in_hands(complete)
|
||||
return
|
||||
else if(istype(W,/obj/item/seeds/lavenderseed))
|
||||
user << "You attach the lavender to the circlet and create a beautiful flower crown."
|
||||
complete = new /obj/item/clothing/head/lavender_crown(get_turf(user))
|
||||
user.drop_from_inventory(W)
|
||||
user.drop_from_inventory(src)
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
user.put_in_hands(complete)
|
||||
return
|
||||
@@ -35,6 +35,13 @@
|
||||
icon_state = "switchblade"
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/butterfly/boxcutter
|
||||
name = "box cutter"
|
||||
desc = "A thin, inexpensive razor-blade knife designed to open cardboard boxes."
|
||||
icon_state = "boxcutter"
|
||||
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
|
||||
thrown_force_divisor = 0.2 // 4 when thrown with weight 20 (steel)
|
||||
|
||||
/obj/item/weapon/material/butterfly/attack_self(mob/user)
|
||||
active = !active
|
||||
if(active)
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
if(affecting.take_damage(force, 0))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
if(affecting.can_feel_pain())
|
||||
if(affecting.organ_can_feel_pain())
|
||||
H.Weaken(3)
|
||||
return
|
||||
check -= picked
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
new /obj/item/weapon/storage/pill_bottle/dylovene(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/tramadol(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/spaceacillin(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
new /obj/item/stack/medical/splint(src)
|
||||
return
|
||||
|
||||
@@ -150,6 +151,19 @@
|
||||
new /obj/item/stack/medical/advanced/bruise_pack(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
name = "clotting kit"
|
||||
desc = "Contains chemicals to stop bleeding."
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 7
|
||||
|
||||
/obj/item/weapon/storage/firstaid/clotting/New()
|
||||
..()
|
||||
if (empty)
|
||||
return
|
||||
for(var/i = 1 to 8)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
return
|
||||
|
||||
/*
|
||||
* Pill Bottles
|
||||
*/
|
||||
|
||||
@@ -28,6 +28,38 @@
|
||||
update_icon()
|
||||
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.
|
||||
..()
|
||||
bcell = new/obj/item/weapon/cell/device/weapon(src)
|
||||
|
||||
@@ -172,6 +172,7 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/examine(mob/user)
|
||||
if(..(user, 0))
|
||||
if(max_fuel)
|
||||
user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
|
||||
|
||||
|
||||
@@ -234,12 +235,16 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding)
|
||||
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !welding)
|
||||
if(!welding && max_fuel)
|
||||
O.reagents.trans_to_obj(src, max_fuel)
|
||||
user << "<span class='notice'>Welder refueled</span>"
|
||||
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
|
||||
return
|
||||
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding)
|
||||
else if(!welding)
|
||||
user << "<span class='notice'>[src] doesn't use fuel.</span>"
|
||||
return
|
||||
else
|
||||
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
|
||||
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
|
||||
user << "<span class='danger'>You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.</span>"
|
||||
@@ -286,12 +291,44 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/update_icon()
|
||||
..()
|
||||
icon_state = welding ? "welder1" : "welder"
|
||||
icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]"
|
||||
var/mob/M = loc
|
||||
if(istype(M))
|
||||
M.update_inv_l_hand()
|
||||
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)
|
||||
//so that the welding tool updates accordingly
|
||||
/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
|
||||
@@ -313,7 +350,8 @@
|
||||
processing_objects |= src
|
||||
else
|
||||
if(M)
|
||||
M << "<span class='notice'>You need more welding fuel to complete this task.</span>"
|
||||
var/msg = max_fuel ? "welding fuel" : "charge"
|
||||
M << "<span class='notice'>You need more [msg] to complete this task.</span>"
|
||||
return
|
||||
//Otherwise
|
||||
else if(!set_welding && welding)
|
||||
@@ -370,7 +408,6 @@
|
||||
user.disabilities &= ~NEARSIGHTED
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/largetank
|
||||
name = "industrial welding tool"
|
||||
max_fuel = 40
|
||||
@@ -405,6 +442,113 @@
|
||||
if(get_fuel() < max_fuel && nextrefueltick < world.time)
|
||||
nextrefueltick = world.time + 10
|
||||
reagents.add_reagent("fuel", 1)
|
||||
|
||||
/*
|
||||
* Electric/Arc Welder
|
||||
*/
|
||||
|
||||
/obj/item/weapon/weldingtool/electric //AND HIS WELDING WAS ELECTRIC
|
||||
name = "electric welding tool"
|
||||
icon_state = "arcwelder"
|
||||
max_fuel = 0 //We'll handle the consumption later.
|
||||
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
|
||||
var/charge_cost = 24 //The rough equivalent of 1 unit of fuel, based on us wanting 10 welds per battery
|
||||
var/cell_type = /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
|
||||
*/
|
||||
|
||||
@@ -77,11 +77,15 @@
|
||||
|
||||
//armour
|
||||
var/blocked = L.run_armor_check(target_zone, "melee")
|
||||
var/soaked = L.get_armor_soak(target_zone, "melee")
|
||||
|
||||
if(blocked >= 100)
|
||||
return
|
||||
|
||||
if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src))
|
||||
if(soaked >= 30)
|
||||
return
|
||||
|
||||
if(!L.apply_damage(30, BRUTE, target_zone, blocked, soaked, used_weapon=src))
|
||||
return 0
|
||||
|
||||
//trap the victim in place
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
return 0
|
||||
if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
|
||||
return 0
|
||||
if (issilicon(user))
|
||||
if (isAI(user))
|
||||
user << "<span class='notice'>You need hands for this.</span>"
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
/obj/structure/closet/chefcloset/New()
|
||||
..()
|
||||
new /obj/item/clothing/under/dress/sundress(src)
|
||||
new /obj/item/clothing/under/sundress(src)
|
||||
new /obj/item/clothing/under/waiter(src)
|
||||
new /obj/item/clothing/under/waiter(src)
|
||||
new /obj/item/device/radio/headset/headset_service(src)
|
||||
|
||||
@@ -150,20 +150,22 @@
|
||||
|
||||
var/def_zone = ran_zone()
|
||||
var/blocked = occupant.run_armor_check(def_zone, "melee")
|
||||
var/soaked = occupant.get_armor_soak(def_zone, "melee")
|
||||
occupant.throw_at(A, 3, propelled)
|
||||
occupant.apply_effect(6, STUN, blocked)
|
||||
occupant.apply_effect(6, WEAKEN, blocked)
|
||||
occupant.apply_effect(6, STUTTER, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/victim = A
|
||||
def_zone = ran_zone()
|
||||
blocked = victim.run_armor_check(def_zone, "melee")
|
||||
soaked = victim.get_armor_soak(def_zone, "melee")
|
||||
victim.apply_effect(6, STUN, blocked)
|
||||
victim.apply_effect(6, WEAKEN, blocked)
|
||||
victim.apply_effect(6, STUTTER, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
|
||||
|
||||
/obj/structure/bed/chair/office/light
|
||||
|
||||
@@ -149,20 +149,22 @@
|
||||
|
||||
var/def_zone = ran_zone()
|
||||
var/blocked = occupant.run_armor_check(def_zone, "melee")
|
||||
var/soaked = occupant.get_armor_soak(def_zone, "melee")
|
||||
occupant.throw_at(A, 3, propelled)
|
||||
occupant.apply_effect(6, STUN, blocked)
|
||||
occupant.apply_effect(6, WEAKEN, blocked)
|
||||
occupant.apply_effect(6, STUTTER, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, soaked)
|
||||
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/victim = A
|
||||
def_zone = ran_zone()
|
||||
blocked = victim.run_armor_check(def_zone, "melee")
|
||||
soaked = victim.get_armor_soak(def_zone, "melee")
|
||||
victim.apply_effect(6, STUN, blocked)
|
||||
victim.apply_effect(6, WEAKEN, blocked)
|
||||
victim.apply_effect(6, STUTTER, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone)
|
||||
victim.apply_damage(10, BRUTE, def_zone, soaked)
|
||||
if(pulling)
|
||||
occupant.visible_message("<span class='danger'>[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!</span>")
|
||||
|
||||
|
||||
@@ -178,3 +178,5 @@
|
||||
this.blood_DNA["UNKNOWN BLOOD"] = "X*"
|
||||
else if( istype(M, /mob/living/silicon/robot ))
|
||||
new /obj/effect/decal/cleanable/blood/oil(src)
|
||||
else if(ishuman(M))
|
||||
add_blood(M)
|
||||
@@ -26,7 +26,7 @@
|
||||
if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
|
||||
src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
|
||||
return
|
||||
suiciding = 1
|
||||
suiciding = 15
|
||||
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
|
||||
var/obj/item/held_item = get_active_hand()
|
||||
if(held_item)
|
||||
@@ -73,10 +73,16 @@
|
||||
return
|
||||
|
||||
log_and_message_admins("[key_name(src)] commited suicide")
|
||||
viewers(src) << pick("<span class='danger'>[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.</span>", \
|
||||
|
||||
var/suicidemsg
|
||||
suicidemsg = pick("<span class='danger'>[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is twisting \his own neck! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is holding \his breath! It looks like \he's trying to commit suicide.</span>")
|
||||
if(isSynthetic())
|
||||
suicidemsg = "<span class='danger'>[src] is attempting to switch \his power off! It looks like \he's trying to commit suicide.</span>"
|
||||
visible_message(suicidemsg)
|
||||
|
||||
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
|
||||
@@ -172,7 +178,7 @@
|
||||
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
|
||||
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
suiciding = 30
|
||||
setOxyLoss(100)
|
||||
adjustBruteLoss(100 - getBruteLoss())
|
||||
setToxLoss(100)
|
||||
|
||||
@@ -218,6 +218,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
switch(organ_name)
|
||||
if ("brain")
|
||||
. += "\tPositronic [organ_name]"
|
||||
else
|
||||
. += "\tSynthetic [organ_name]"
|
||||
else if(status == "digital")
|
||||
++ind
|
||||
@@ -612,15 +616,23 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
organ = O_LUNGS
|
||||
if("Brain")
|
||||
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
|
||||
organ = "brain"
|
||||
|
||||
var/list/organ_choices = list("Normal","Assisted","Mechanical")
|
||||
var/list/organ_choices = list("Normal")
|
||||
if(pref.organ_data[BP_TORSO] == "cyborg")
|
||||
organ_choices -= "Normal"
|
||||
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
|
||||
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
|
||||
if("Assisted")
|
||||
pref.organ_data[organ] = "assisted"
|
||||
if("Mechanical")
|
||||
if("Cybernetic")
|
||||
pref.organ_data[organ] = "assisted"
|
||||
if ("Mechanical")
|
||||
pref.organ_data[organ] = "mechanical"
|
||||
if("Digital")
|
||||
if("Drone")
|
||||
pref.organ_data[organ] = "digital"
|
||||
if("Positronic")
|
||||
pref.organ_data[organ] = "mechanical"
|
||||
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["disabilities"])
|
||||
|
||||
@@ -356,6 +356,22 @@
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/suit/miscellaneous/redandblackjacket
|
||||
display_name = "red and black jacket"
|
||||
path = /obj/item/clothing/suit/storage/toggle/redandblackjacket
|
||||
/datum/gear/suit/miscellaneous/sec_dep_jacket
|
||||
display_name = "department jacket, security"
|
||||
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
|
||||
@@ -273,11 +273,11 @@
|
||||
|
||||
/datum/gear/uniform/sundress
|
||||
display_name = "sundress"
|
||||
path = /obj/item/clothing/under/dress/sundress
|
||||
path = /obj/item/clothing/under/sundress
|
||||
|
||||
/datum/gear/uniform/sundress/white
|
||||
display_name = "sundress, white"
|
||||
path = /obj/item/clothing/under/dress/sundress/white
|
||||
path = /obj/item/clothing/under/sundress_white
|
||||
|
||||
/datum/gear/uniform/dress_fire
|
||||
display_name = "flame dress"
|
||||
@@ -446,10 +446,10 @@
|
||||
display_name = "jumpsuit, hephaestus"
|
||||
path = /obj/item/clothing/under/hephaestus
|
||||
|
||||
/datum/gear/uniform/yoga
|
||||
/datum/gear/uniform/yogapants
|
||||
display_name = "yoga pants"
|
||||
path = /obj/item/clothing/under/pants/yoga
|
||||
path = /obj/item/clothing/under/pants/yogapants
|
||||
|
||||
/datum/gear/uniform/yoga/New()
|
||||
/datum/gear/uniform/yogapants/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
@@ -46,6 +46,22 @@
|
||||
display_name = "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
|
||||
display_name = "flashlight, maglight"
|
||||
path = /obj/item/device/flashlight/maglight
|
||||
|
||||
@@ -39,32 +39,24 @@
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes))
|
||||
|
||||
/datum/gear/ears/skrell/cloth/male
|
||||
display_name = "male headtail cloth selection (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/cloth_male
|
||||
display_name = "male headtail cloth (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/cloth_male/black
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
|
||||
/datum/gear/ears/skrell/cloth/male/New()
|
||||
..()
|
||||
var/list/clothtypes = list()
|
||||
for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_male))
|
||||
var/obj/item/clothing/ears/skrell/cloth_male/cloth = cloth_style
|
||||
clothtypes[initial(cloth.name)] = cloth
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes))
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/ears/skrell/cloth/female
|
||||
display_name = "female headtail cloth selection (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/cloth_female
|
||||
display_name = "female headtail cloth (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/cloth_female/black
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
|
||||
/datum/gear/ears/skrell/cloth/female/New()
|
||||
..()
|
||||
var/list/clothtypes = list()
|
||||
for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_female))
|
||||
var/obj/item/clothing/ears/skrell/cloth_female/cloth = cloth_style
|
||||
clothtypes[initial(cloth.name)] = cloth
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes))
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/ears/skrell/colored/band
|
||||
display_name = "Colored bands (Skrell)"
|
||||
|
||||
@@ -525,10 +525,6 @@
|
||||
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
|
||||
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/uniform.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/uniform.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/uniforms/uniform.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/uniform.dmi',
|
||||
"Teshari" = 'icons/mob/species/seromi/uniform.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi'
|
||||
)
|
||||
@@ -539,6 +535,9 @@
|
||||
valid_accessory_slots = list("utility","armband","decor","over")
|
||||
restricted_accessory_slots = list("utility", "armband")
|
||||
|
||||
var/icon/rolled_down_icon = 'icons/mob/uniform_rolled_down.dmi'
|
||||
var/icon/rolled_down_sleeves_icon = 'icons/mob/uniform_sleeves_rolled.dmi'
|
||||
|
||||
|
||||
/obj/item/clothing/under/attack_hand(var/mob/user)
|
||||
if(accessories && accessories.len)
|
||||
@@ -558,7 +557,7 @@
|
||||
|
||||
//autodetect rollability
|
||||
if(rolled_down < 0)
|
||||
if((worn_state + "_d_s") in icon_states('icons/mob/uniform.dmi'))
|
||||
if(("[worn_state]_d_s" in icon_states(INV_W_UNIFORM_DEF_ICON)) || ("[worn_state]_s" in icon_states(rolled_down_icon)) || ("[worn_state]_d_s" in icon_states(icon_override)))
|
||||
rolled_down = 0
|
||||
|
||||
/obj/item/clothing/under/proc/update_rolldown_status()
|
||||
@@ -573,11 +572,13 @@
|
||||
under_icon = sprite_sheets[H.species.get_bodytype(H)]
|
||||
else if(item_icons && item_icons[slot_w_uniform_str])
|
||||
under_icon = item_icons[slot_w_uniform_str]
|
||||
else if ("[worn_state]_s" in icon_states(rolled_down_icon))
|
||||
under_icon = rolled_down_icon
|
||||
else
|
||||
under_icon = INV_W_UNIFORM_DEF_ICON
|
||||
|
||||
// The _s is because the icon update procs append it.
|
||||
if(("[worn_state]_d_s") in icon_states(under_icon))
|
||||
if((under_icon == rolled_down_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_d_s" in icon_states(under_icon)))
|
||||
if(rolled_down != 1)
|
||||
rolled_down = 0
|
||||
else
|
||||
@@ -596,11 +597,13 @@
|
||||
under_icon = sprite_sheets[H.species.get_bodytype(H)]
|
||||
else if(item_icons && item_icons[slot_w_uniform_str])
|
||||
under_icon = item_icons[slot_w_uniform_str]
|
||||
else if ("[worn_state]_s" in icon_states(rolled_down_sleeves_icon))
|
||||
under_icon = rolled_down_sleeves_icon
|
||||
else
|
||||
under_icon = INV_W_UNIFORM_DEF_ICON
|
||||
|
||||
// The _s is because the icon update procs append it.
|
||||
if(("[worn_state]_r_s") in icon_states(under_icon))
|
||||
if((under_icon == rolled_down_sleeves_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_r_s" in icon_states(under_icon)))
|
||||
if(rolled_sleeves != 1)
|
||||
rolled_sleeves = 0
|
||||
else
|
||||
@@ -682,10 +685,17 @@
|
||||
if(rolled_down)
|
||||
body_parts_covered = initial(body_parts_covered)
|
||||
body_parts_covered &= ~(UPPER_TORSO|ARMS)
|
||||
if("[worn_state]_s" in icon_states(rolled_down_icon))
|
||||
icon_override = rolled_down_icon
|
||||
item_state_slots[slot_w_uniform_str] = "[worn_state]"
|
||||
else
|
||||
item_state_slots[slot_w_uniform_str] = "[worn_state]_d"
|
||||
|
||||
usr << "<span class='notice'>You roll down your [src].</span>"
|
||||
else
|
||||
body_parts_covered = initial(body_parts_covered)
|
||||
if(icon_override == rolled_down_icon)
|
||||
icon_override = initial(icon_override)
|
||||
item_state_slots[slot_w_uniform_str] = "[worn_state]"
|
||||
usr << "<span class='notice'>You roll up your [src].</span>"
|
||||
update_clothing_icon()
|
||||
@@ -708,10 +718,16 @@
|
||||
rolled_sleeves = !rolled_sleeves
|
||||
if(rolled_sleeves)
|
||||
body_parts_covered &= ~(ARMS)
|
||||
if("[worn_state]_s" in icon_states(rolled_down_sleeves_icon))
|
||||
icon_override = rolled_down_sleeves_icon
|
||||
item_state_slots[slot_w_uniform_str] = "[worn_state]"
|
||||
else
|
||||
item_state_slots[slot_w_uniform_str] = "[worn_state]_r"
|
||||
usr << "<span class='notice'>You roll up your [src]'s sleeves.</span>"
|
||||
else
|
||||
body_parts_covered = initial(body_parts_covered)
|
||||
if(icon_override == rolled_down_sleeves_icon)
|
||||
icon_override = initial(icon_override)
|
||||
item_state_slots[slot_w_uniform_str] = "[worn_state]"
|
||||
usr << "<span class='notice'>You roll down your [src]'s sleeves.</span>"
|
||||
update_clothing_icon()
|
||||
|
||||
@@ -197,7 +197,7 @@ BLIND // can't see anything
|
||||
name = "welding goggles"
|
||||
desc = "Protects the eyes from welders, approved by the mad scientist association."
|
||||
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"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 1000)
|
||||
var/up = 0
|
||||
|
||||
56
code/modules/clothing/head/flowercrowns.dm
Normal file
56
code/modules/clothing/head/flowercrowns.dm
Normal 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
|
||||
@@ -347,24 +347,3 @@
|
||||
desc = "A wide-brimmed hat popularly worn in Mexico."
|
||||
icon_state = "sombrero"
|
||||
body_parts_covered = 0
|
||||
|
||||
|
||||
//Flower crowns
|
||||
|
||||
/obj/item/clothing/head/sunflower_crown
|
||||
name = "sunflower crown"
|
||||
desc = "A flower crown weaved with sunflowers."
|
||||
icon_state = "sunflower_crown"
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/lavender_crown
|
||||
name = "lavender crown"
|
||||
desc = "A flower crown weaved with lavender."
|
||||
icon_state = "lavender_crown"
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/poppy_crown
|
||||
name = "poppy crown"
|
||||
desc = "A flower crown weaved with poppies."
|
||||
icon_state = "poppy_crown"
|
||||
body_parts_covered = 0
|
||||
@@ -157,6 +157,7 @@
|
||||
list("antibiotics", "spaceacillin", 0, 20),
|
||||
list("antitoxins", "anti_toxin", 0, 20),
|
||||
list("nutrients", "glucose", 0, 80),
|
||||
list("clotting agent", "myelamine", 0, 80),
|
||||
list("hyronalin", "hyronalin", 0, 20),
|
||||
list("radium", "radium", 0, 20)
|
||||
)
|
||||
@@ -246,6 +247,7 @@
|
||||
list("hyperzine", "hyperzine", 0, 30),
|
||||
list("oxycodone", "oxycodone", 0, 30),
|
||||
list("nutrients", "glucose", 0, 80),
|
||||
list("clotting agent", "myelamine", 0, 80)
|
||||
)
|
||||
|
||||
interface_name = "combat chem dispenser"
|
||||
@@ -263,6 +265,20 @@
|
||||
interface_name = "mounted chem injector"
|
||||
interface_desc = "Dispenses loaded chemicals via an arm-mounted injector."
|
||||
|
||||
/obj/item/rig_module/chem_dispenser/injector/advanced
|
||||
|
||||
charges = list(
|
||||
list("tricordrazine", "tricordrazine", 0, 80),
|
||||
list("tramadol", "tramadol", 0, 80),
|
||||
list("dexalin plus", "dexalinp", 0, 80),
|
||||
list("antibiotics", "spaceacillin", 0, 80),
|
||||
list("antitoxins", "anti_toxin", 0, 80),
|
||||
list("nutrients", "glucose", 0, 80),
|
||||
list("hyronalin", "hyronalin", 0, 80),
|
||||
list("radium", "radium", 0, 80),
|
||||
list("clotting agent", "myelamine", 0, 80)
|
||||
)
|
||||
|
||||
/obj/item/rig_module/voice
|
||||
|
||||
name = "hardsuit voice synthesiser"
|
||||
|
||||
@@ -161,6 +161,7 @@
|
||||
piece.permeability_coefficient = permeability_coefficient
|
||||
piece.unacidable = unacidable
|
||||
if(islist(armor)) piece.armor = armor.Copy()
|
||||
if(islist(armorsoak)) piece.armorsoak = armorsoak.Copy()
|
||||
|
||||
update_icon(1)
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/device/healthscanner,
|
||||
/obj/item/rig_module/chem_dispenser/injector
|
||||
/obj/item/rig_module/chem_dispenser/injector/advanced
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/ert/security
|
||||
|
||||
@@ -574,12 +574,6 @@ obj/item/clothing/suit/kimono
|
||||
icon_state = "smw_hoodie"
|
||||
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
|
||||
name = "white dress"
|
||||
desc = "A fancy white dress."
|
||||
@@ -776,6 +770,44 @@ obj/item/clothing/suit/kimono
|
||||
name = "brown varsity jacket"
|
||||
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
|
||||
*/
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
/obj/item/clothing/under/color
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/color.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/color.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/color.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/color.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/color.dmi'
|
||||
)
|
||||
/obj/item/clothing/under/color/black
|
||||
name = "black jumpsuit"
|
||||
icon_state = "black"
|
||||
|
||||
@@ -255,13 +255,6 @@
|
||||
*/
|
||||
/obj/item/clothing/under/dress
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/dresses.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/under/dress/blacktango
|
||||
name = "black tango dress"
|
||||
@@ -353,14 +346,6 @@
|
||||
*/
|
||||
/obj/item/clothing/under/wedding
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/dresses.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/under/wedding/bride_orange
|
||||
name = "orange wedding dress"
|
||||
@@ -393,13 +378,13 @@
|
||||
flags_inv = HIDESHOES
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/under/dress/sundress
|
||||
/obj/item/clothing/under/sundress
|
||||
name = "sundress"
|
||||
desc = "Makes you want to frolic in a field of daisies."
|
||||
icon_state = "sundress"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/under/dress/sundress/white
|
||||
/obj/item/clothing/under/sundress_white
|
||||
name = "white sundress"
|
||||
desc = "A white sundress decorated with purple lilies."
|
||||
icon_state = "sundress_white"
|
||||
@@ -474,13 +459,6 @@
|
||||
/obj/item/clothing/under/cheongsam
|
||||
name = "white cheongsam"
|
||||
desc = "It is a white cheongsam dress."
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/dresses.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
|
||||
)
|
||||
icon_state = "mai_yang"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
|
||||
|
||||
@@ -508,13 +486,6 @@
|
||||
/obj/item/clothing/under/croptop
|
||||
name = "crop top"
|
||||
desc = "A shirt that has had the top cropped. This one is NT sponsored."
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/dresses.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
|
||||
)
|
||||
icon_state = "croptop"
|
||||
item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey")
|
||||
|
||||
|
||||
@@ -2,13 +2,6 @@
|
||||
/obj/item/clothing/under/pants
|
||||
name = "jeans"
|
||||
desc = "A nondescript pair of tough blue jeans."
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/pants.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/pants.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/pants.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/pants.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/pants.dmi'
|
||||
)
|
||||
icon_state = "jeans"
|
||||
gender = PLURAL
|
||||
body_parts_covered = LOWER_TORSO|LEGS
|
||||
@@ -124,10 +117,10 @@
|
||||
desc = "A pair of sexy, tight black leather chaps."
|
||||
icon_state = "chapsbl"
|
||||
|
||||
/obj/item/clothing/under/pants/yoga
|
||||
/obj/item/clothing/under/pants/yogapants
|
||||
name = "yoga pants"
|
||||
desc = "A pair of tight-fitting yoga pants for those lazy days."
|
||||
icon_state = "yoga"
|
||||
icon_state = "yogapants"
|
||||
|
||||
/*
|
||||
* Baggy Pants
|
||||
|
||||
@@ -2,13 +2,6 @@
|
||||
/obj/item/clothing/under/shorts
|
||||
name = "athletic shorts"
|
||||
desc = "95% Polyester, 5% Spandex!"
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/pants.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/pants.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/pants.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/pants.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/pants.dmi'
|
||||
)
|
||||
gender = PLURAL
|
||||
body_parts_covered = LOWER_TORSO
|
||||
|
||||
@@ -103,13 +96,6 @@
|
||||
/obj/item/clothing/under/skirt
|
||||
name = "short black skirt"
|
||||
desc = "A skirt that is a shiny black."
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/dresses.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/dresses.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/dresses.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/dresses.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/dresses.dmi'
|
||||
)
|
||||
icon_state = "skirt_short_black"
|
||||
body_parts_covered = LOWER_TORSO
|
||||
rolled_sleeves = -1
|
||||
@@ -168,8 +154,6 @@
|
||||
icon_state = "plaid_purple"
|
||||
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
|
||||
|
||||
//Job skirts
|
||||
|
||||
/obj/item/clothing/under/rank/cargo/skirt
|
||||
name = "quartermaster's jumpskirt"
|
||||
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
|
||||
|
||||
@@ -4,12 +4,6 @@
|
||||
/obj/item/clothing/under/pt
|
||||
name = "pt uniform"
|
||||
desc = "Shorts! Shirt! Miami! Sexy!"
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/military.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi'
|
||||
)
|
||||
icon_state = "miami"
|
||||
worn_state = "miami"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
@@ -40,13 +34,6 @@
|
||||
/obj/item/clothing/under/utility
|
||||
name = "utility uniform"
|
||||
desc = "A comfortable turtleneck and black utility trousers."
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/military.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/military.dmi'
|
||||
)
|
||||
icon_state = "blackutility"
|
||||
worn_state = "blackutility"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
@@ -107,6 +94,7 @@
|
||||
icon_state = "blackutility_com"
|
||||
worn_state = "blackutility_com"
|
||||
|
||||
|
||||
/obj/item/clothing/under/utility/fleet
|
||||
name = "fleet coveralls"
|
||||
desc = "The utility uniform of the SCG Fleet, made from an insulated material."
|
||||
@@ -145,6 +133,7 @@
|
||||
icon_state = "navyutility_com"
|
||||
worn_state = "navyutility_com"
|
||||
|
||||
|
||||
/obj/item/clothing/under/utility/marine
|
||||
name = "marine fatigues"
|
||||
desc = "The utility uniform of the SCG Marine Corps, made from durable material."
|
||||
@@ -199,13 +188,6 @@
|
||||
/obj/item/clothing/under/service
|
||||
name = "service uniform"
|
||||
desc = "A service uniform of some kind."
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/military.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/military.dmi'
|
||||
)
|
||||
icon_state = "whiteservice"
|
||||
worn_state = "whiteservice"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
@@ -233,13 +215,6 @@
|
||||
/obj/item/clothing/under/mildress
|
||||
name = "dress uniform"
|
||||
desc = "A dress uniform of some kind."
|
||||
sprite_sheets = list(
|
||||
"Human" = 'icons/mob/uniforms/military.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/uniforms/military.dmi',
|
||||
"Tajara" = 'icons/mob/species/tajaran/uniforms/military.dmi',
|
||||
"Unathi" = 'icons/mob/species/unathi/uniforms/military.dmi',
|
||||
"Diona" = 'icons/mob/species/diona/uniforms/military.dmi'
|
||||
)
|
||||
icon_state = "greydress"
|
||||
worn_state = "greydress"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
@@ -105,7 +105,7 @@ I said no!
|
||||
/datum/recipe/xenoburger
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
||||
/obj/item/weapon/reagent_containers/food/snacks/spidermeat // /obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/xenoburger
|
||||
|
||||
@@ -224,9 +224,9 @@ I said no!
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/spidermeat, //xenomeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
|
||||
@@ -114,8 +114,11 @@
|
||||
|
||||
if(!target_limb) target_limb = pick(BP_ALL)
|
||||
var/blocked = target.run_armor_check(target_limb, "melee")
|
||||
var/soaked = target.get_armor_soak(target_limb, "melee")
|
||||
|
||||
if(blocked >= 100)
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/affecting = target.get_organ(target_limb)
|
||||
var/damage = 0
|
||||
var/has_edge = 0
|
||||
@@ -125,7 +128,7 @@
|
||||
|
||||
if(affecting)
|
||||
to_chat(target, "<span class='danger'>\The [fruit]'s thorns pierce your [affecting.name] greedily!</span>")
|
||||
target.apply_damage(damage, BRUTE, target_limb, blocked, "Thorns", sharp=1, edge=has_edge)
|
||||
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, "Thorns", sharp=1, edge=has_edge)
|
||||
else
|
||||
to_chat(target, "<span class='danger'>\The [fruit]'s thorns pierce your flesh greedily!</span>")
|
||||
target.adjustBruteLoss(damage)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
used for power or data transmission."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon_state = "wirer-wire"
|
||||
item_state = "wirer"
|
||||
flags = CONDUCT
|
||||
w_class = 2
|
||||
var/datum/integrated_io/selected_io = null
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
/material/wood/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1)
|
||||
recipes += new/datum/stack_recipe("wood circlet", /obj/item/woodcirclet, 1)
|
||||
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1)
|
||||
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1)
|
||||
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
|
||||
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
|
||||
@@ -101,9 +101,9 @@
|
||||
/mob/living/silicon/ai/special_mentions()
|
||||
return list("AI") // AI door!
|
||||
|
||||
// Converts specific characters, like *, /, and _ to formatted output.
|
||||
// Converts specific characters, like *, |, and _ to formatted output.
|
||||
/mob/proc/say_emphasis(var/message)
|
||||
message = encode_html_emphasis(message, "/", "i")
|
||||
message = encode_html_emphasis(message, "|", "i")
|
||||
message = encode_html_emphasis(message, "+", "b")
|
||||
message = encode_html_emphasis(message, "_", "u")
|
||||
return message
|
||||
|
||||
@@ -71,15 +71,11 @@
|
||||
|
||||
/mob/living/carbon/brain/handle_chemicals_in_body()
|
||||
chem_effects.Cut()
|
||||
analgesic = 0
|
||||
|
||||
if(touching) touching.metabolize()
|
||||
if(ingested) ingested.metabolize()
|
||||
if(bloodstr) bloodstr.metabolize()
|
||||
|
||||
if(CE_PAINKILLER in chem_effects)
|
||||
analgesic = chem_effects[CE_PAINKILLER]
|
||||
|
||||
confused = max(0, confused - 1)
|
||||
// decrement dizziness counter, clamped to 0
|
||||
if(resting)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
return null
|
||||
..()
|
||||
|
||||
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
if(!effective_force || blocked >= 100)
|
||||
return 0
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
if(HULK in user.mutations)
|
||||
effective_force *= 2
|
||||
|
||||
//If the armor soaks all of the damage, it just skips the rest of the checks
|
||||
if(effective_force <= soaked)
|
||||
return 0
|
||||
|
||||
//Apply weapon damage
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
var/weapon_edge = has_edge(I)
|
||||
|
||||
@@ -7,8 +7,7 @@
|
||||
var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm
|
||||
|
||||
var/life_tick = 0 // The amount of life ticks that have processed on this mob.
|
||||
var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain
|
||||
// life should decrease this by 1 every tick
|
||||
|
||||
// total amount of wounds on mob, used to spread out healing and the like over all wounds
|
||||
var/number_wounds = 0
|
||||
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
|
||||
|
||||
@@ -282,7 +282,7 @@
|
||||
msg += "<span class='warning'>[T.He] [T.is] twitching ever so slightly.</span>\n"
|
||||
|
||||
//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)
|
||||
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"
|
||||
|
||||
@@ -1071,7 +1071,7 @@
|
||||
"<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \
|
||||
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>", \
|
||||
"<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>")
|
||||
src << msg
|
||||
custom_pain(msg, 40)
|
||||
|
||||
organ.take_damage(rand(1,3), 0, 0)
|
||||
if(!(organ.robotic >= ORGAN_ROBOT) && (should_have_organ(O_HEART))) //There is no blood in protheses.
|
||||
@@ -1473,6 +1473,7 @@
|
||||
|
||||
if(stat) return
|
||||
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]
|
||||
if(!UWI || UWI.name == "None")
|
||||
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(!istype(check_organ))
|
||||
return 0
|
||||
return check_organ.can_feel_pain()
|
||||
return check_organ.organ_can_feel_pain()
|
||||
return !(species.flags & NO_PAIN)
|
||||
|
||||
/mob/living/carbon/human/is_muzzled()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
// Should this all be in Touch()?
|
||||
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))
|
||||
if(!hit_zone)
|
||||
H.do_attack_animation(src)
|
||||
@@ -51,6 +51,7 @@
|
||||
return 0
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
var/armor_soak = get_armor_soak(affecting, "melee")
|
||||
|
||||
if(HULK in H.mutations)
|
||||
damage += 5
|
||||
@@ -59,7 +60,10 @@
|
||||
|
||||
visible_message("\red <B>[H] has punched [src]!</B>")
|
||||
|
||||
apply_damage(damage, HALLOSS, affecting, armor_block)
|
||||
if(armor_soak >= damage)
|
||||
return
|
||||
|
||||
apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak)
|
||||
if(damage >= 9)
|
||||
visible_message("\red <B>[H] has weakened [src]!</B>")
|
||||
apply_effect(4, WEAKEN, armor_block)
|
||||
@@ -258,11 +262,12 @@
|
||||
real_damage = max(1, real_damage)
|
||||
|
||||
var/armour = run_armor_check(affecting, "melee")
|
||||
var/soaked = get_armor_soak(affecting, "melee")
|
||||
// Apply additional unarmed effects.
|
||||
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
|
||||
|
||||
// Finally, apply damage to target
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, sharp=attack.sharp, edge=attack.edge)
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
|
||||
if(I_DISARM)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
@@ -338,7 +343,8 @@
|
||||
var/dam_zone = pick(organs_by_name)
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
var/armor_soak = get_armor_soak(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor_block, armor_soak)
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -376,7 +376,7 @@ This function restores all organs.
|
||||
if((damagetype != BRUTE) && (damagetype != BURN))
|
||||
if(damagetype == HALLOSS)
|
||||
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
|
||||
if(organ && organ.can_feel_pain())
|
||||
if(organ && organ.organ_can_feel_pain())
|
||||
emote("scream")
|
||||
..(damage, damagetype, def_zone, blocked)
|
||||
return 1
|
||||
|
||||
@@ -67,7 +67,7 @@ emp_act
|
||||
emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!")
|
||||
else
|
||||
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||
emote("me", 1, "[affected.can_feel_pain() ? "" : emote_scream]drops what they were holding in their [affected.name]!")
|
||||
emote("me", 1, "[affected.organ_can_feel_pain() ? "" : emote_scream] drops what they were holding in their [affected.name]!")
|
||||
|
||||
..(stun_amount, agony_amount, def_zone)
|
||||
|
||||
@@ -93,6 +93,29 @@ emp_act
|
||||
total += weight
|
||||
return (armorval/max(total, 1))
|
||||
|
||||
//Like getarmor, but the value it returns will be numerical damage reduction
|
||||
/mob/living/carbon/human/getsoak(var/def_zone, var/type)
|
||||
var/soakval = 0
|
||||
var/total = 0
|
||||
|
||||
if(def_zone)
|
||||
if(isorgan(def_zone))
|
||||
return getsoak_organ(def_zone, type)
|
||||
var/obj/item/organ/external/affecting = get_organ(def_zone)
|
||||
if(affecting)
|
||||
return getsoak_organ(affecting, type)
|
||||
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
|
||||
|
||||
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
|
||||
for(var/organ_name in organs_by_name)
|
||||
if (organ_name in organ_rel_size)
|
||||
var/obj/item/organ/external/organ = organs_by_name[organ_name]
|
||||
if(organ)
|
||||
var/weight = organ_rel_size[organ_name]
|
||||
soakval += getsoak_organ(organ, type) * weight
|
||||
total += weight
|
||||
return (soakval/max(total, 1))
|
||||
|
||||
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
|
||||
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone)
|
||||
if (!def_zone)
|
||||
@@ -119,6 +142,17 @@ emp_act
|
||||
protection += C.armor[type]
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type)
|
||||
if(!type || !def_zone) return 0
|
||||
var/soaked = 0
|
||||
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
|
||||
for(var/gear in protective_gear)
|
||||
if(gear && istype(gear ,/obj/item/clothing))
|
||||
var/obj/item/clothing/C = gear
|
||||
if(istype(C) && C.body_parts_covered & def_zone.body_part)
|
||||
soaked += C.armorsoak[type]
|
||||
return soaked
|
||||
|
||||
/mob/living/carbon/human/proc/check_head_coverage()
|
||||
|
||||
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
|
||||
@@ -195,25 +229,35 @@ emp_act
|
||||
|
||||
visible_message("<span class='danger'>[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!</span>")
|
||||
|
||||
var/soaked = get_armor_soak(hit_zone, "melee", I.armor_penetration)
|
||||
|
||||
if(soaked >= effective_force)
|
||||
src << "Your armor absorbs the force of [I.name]!"
|
||||
return
|
||||
|
||||
var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].")
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
|
||||
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
|
||||
|
||||
return blocked
|
||||
|
||||
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
var/obj/item/organ/external/affecting = get_organ(hit_zone)
|
||||
if(!affecting)
|
||||
return 0
|
||||
|
||||
if(soaked >= effective_force)
|
||||
return 0
|
||||
|
||||
// Handle striking to cripple.
|
||||
if(user.a_intent == I_DISARM)
|
||||
effective_force *= 0.5 //reduced effective force...
|
||||
if(!..(I, user, effective_force, blocked, hit_zone))
|
||||
if(!..(I, user, effective_force, blocked, soaked, hit_zone))
|
||||
return 0
|
||||
|
||||
//set the dislocate mult less than the effective force mult so that
|
||||
//dislocating limbs on disarm is a bit easier than breaking limbs on harm
|
||||
attack_joint(affecting, I, effective_force, 0.75, blocked) //...but can dislocate joints
|
||||
attack_joint(affecting, I, effective_force, 0.75, blocked, soaked) //...but can dislocate joints
|
||||
else if(!..())
|
||||
return 0
|
||||
|
||||
@@ -243,7 +287,7 @@ emp_act
|
||||
switch(hit_zone)
|
||||
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
||||
if(prob(effective_force))
|
||||
apply_effect(20, PARALYZE, blocked)
|
||||
apply_effect(20, PARALYZE, blocked, soaked)
|
||||
visible_message("<span class='danger'>\The [src] has been knocked unconscious!</span>")
|
||||
if(bloody)//Apply blood
|
||||
if(wear_mask)
|
||||
@@ -257,15 +301,15 @@ emp_act
|
||||
update_inv_glasses(0)
|
||||
if("chest")//Easier to score a stun but lasts less time
|
||||
if(prob(effective_force + 10))
|
||||
apply_effect(6, WEAKEN, blocked)
|
||||
apply_effect(6, WEAKEN, blocked, soaked)
|
||||
visible_message("<span class='danger'>\The [src] has been knocked down!</span>")
|
||||
if(bloody)
|
||||
bloody_body(src)
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked)
|
||||
if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100)
|
||||
/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked, var/soaked)
|
||||
if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100 || soaked > effective_force)
|
||||
return 0
|
||||
|
||||
if(W.damtype != BRUTE)
|
||||
@@ -338,10 +382,6 @@ emp_act
|
||||
var/hit_area = affecting.name
|
||||
|
||||
src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
|
||||
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||
|
||||
if(armor < 100)
|
||||
apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
|
||||
|
||||
if(ismob(O.thrower))
|
||||
var/mob/M = O.thrower
|
||||
@@ -352,12 +392,25 @@ emp_act
|
||||
if(!istype(src,/mob/living/simple_animal/mouse))
|
||||
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
|
||||
//If the armor absorbs all of the damage, skip the rest of the calculations
|
||||
var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration)
|
||||
if(soaked >= throw_damage)
|
||||
src << "Your armor absorbs the force of [O.name]!"
|
||||
return
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||
if(armor < 100)
|
||||
apply_damage(throw_damage, dtype, zone, armor, soaked, is_sharp(O), has_edge(O), O)
|
||||
|
||||
|
||||
//thrown weapon embedded object code.
|
||||
if(dtype == BRUTE && istype(O,/obj/item))
|
||||
var/obj/item/I = O
|
||||
if (!is_robot_module(I))
|
||||
var/sharp = is_sharp(I)
|
||||
var/damage = throw_damage
|
||||
if (soaked)
|
||||
damage -= soaked
|
||||
if (armor)
|
||||
damage /= armor+1
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
if (!lying && !buckled && world.time - l_move_time < 15)
|
||||
//Moving around with fractured ribs won't do you any good
|
||||
if (prob(10) && !stat && can_feel_pain() && analgesic < 50 && E.is_broken() && E.internal_organs.len)
|
||||
if (prob(10) && !stat && can_feel_pain() && chem_effects[CE_PAINKILLER] < 50 && E.is_broken() && E.internal_organs.len)
|
||||
custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50)
|
||||
drop_item(loc)
|
||||
Stun(2)
|
||||
@@ -100,7 +100,7 @@
|
||||
else if (E.is_dislocated())
|
||||
stance_damage += 0.5
|
||||
|
||||
if(E) limb_pain = E.can_feel_pain()
|
||||
if(E) limb_pain = E.organ_can_feel_pain()
|
||||
|
||||
// Canes and crutches help you stand (if the latter is ever added)
|
||||
// One cane mitigates a broken leg+foot, or a missing foot.
|
||||
@@ -159,7 +159,7 @@
|
||||
drop_from_inventory(r_hand)
|
||||
|
||||
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||
emote("me", 1, "[(E.can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||
emote("me", 1, "[(can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||
|
||||
else if(E.is_malfunctioning())
|
||||
switch(E.body_part)
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
var/rn = rand(0, 200)
|
||||
if(getBrainLoss() >= 5)
|
||||
if(0 <= rn && rn <= 3)
|
||||
custom_pain("Your head feels numb and painful.")
|
||||
custom_pain("Your head feels numb and painful.", 10)
|
||||
if(getBrainLoss() >= 15)
|
||||
if(4 <= rn && rn <= 6) if(eye_blurry <= 0)
|
||||
src << "<span class='warning'>It becomes hard to see for some reason.</span>"
|
||||
@@ -329,17 +329,20 @@
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
|
||||
if(suiciding)
|
||||
failed_last_breath = 1
|
||||
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
suiciding --
|
||||
return 0
|
||||
|
||||
if(does_not_breathe)
|
||||
failed_last_breath = 0
|
||||
adjustOxyLoss(-5)
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles == 0) || suiciding)
|
||||
if(!breath || (breath.total_moles == 0))
|
||||
failed_last_breath = 1
|
||||
if(suiciding)
|
||||
adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
return 0
|
||||
if(health > config.health_threshold_crit)
|
||||
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
|
||||
else
|
||||
@@ -350,10 +353,6 @@
|
||||
if(!L.is_bruised() && prob(8))
|
||||
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)
|
||||
|
||||
return 0
|
||||
@@ -372,6 +371,7 @@
|
||||
safe_pressure_min *= 1.25
|
||||
else if(breath)
|
||||
if(breath.total_moles < BREATH_MOLES / 10 || breath.total_moles > BREATH_MOLES * 5)
|
||||
if(is_below_sound_pressure(get_turf(src))) //No more popped lungs from choking/drowning
|
||||
if (prob(8))
|
||||
rupture_lung()
|
||||
|
||||
@@ -794,7 +794,6 @@
|
||||
|
||||
if(reagents)
|
||||
chem_effects.Cut()
|
||||
analgesic = 0
|
||||
|
||||
if(!isSynthetic())
|
||||
|
||||
@@ -802,9 +801,6 @@
|
||||
if(ingested) ingested.metabolize()
|
||||
if(bloodstr) bloodstr.metabolize()
|
||||
|
||||
if(CE_PAINKILLER in chem_effects)
|
||||
analgesic = chem_effects[CE_PAINKILLER]
|
||||
|
||||
var/total_phoronloss = 0
|
||||
for(var/obj/item/I in src)
|
||||
if(I.contaminated)
|
||||
@@ -923,6 +919,14 @@
|
||||
for(var/atom/a in hallucinations)
|
||||
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)
|
||||
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.")
|
||||
@@ -1155,7 +1159,7 @@
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if(healths)
|
||||
if (analgesic > 100)
|
||||
if (chem_effects[CE_PAINKILLER] > 100)
|
||||
healths.icon_state = "health_numb"
|
||||
else
|
||||
// Generate a by-limb health display.
|
||||
@@ -1443,8 +1447,11 @@
|
||||
shock_stage = max(shock_stage-1, 0)
|
||||
return
|
||||
|
||||
if(stat)
|
||||
return 0
|
||||
|
||||
if(shock_stage == 10)
|
||||
src << "<span class='danger'>[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!</span>"
|
||||
custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40)
|
||||
|
||||
if(shock_stage >= 30)
|
||||
if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.")
|
||||
|
||||
@@ -72,6 +72,7 @@
|
||||
var/toxins_mod = 1 // Toxloss modifier
|
||||
var/radiation_mod = 1 // Radiation 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.
|
||||
|
||||
// Death vars.
|
||||
|
||||
@@ -174,6 +174,7 @@
|
||||
|
||||
darksight = 4
|
||||
flash_mod = 1.2
|
||||
chemOD_mod = 0.9
|
||||
|
||||
ambiguous_genders = TRUE
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ var/global/list/sparring_attack_cache = list()
|
||||
if(eyes)
|
||||
eyes.take_damage(rand(3,4), 1)
|
||||
user.visible_message("<span class='danger'>[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!</span>")
|
||||
var/eye_pain = eyes.can_feel_pain()
|
||||
var/eye_pain = eyes.organ_can_feel_pain()
|
||||
target << "<span class='danger'>You experience[(eye_pain) ? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(eye_pain)? "." : "!"]</span>"
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] attempts to press \his [eye_attack_text] into [target]'s eyes, but they don't have any!</span>")
|
||||
|
||||
@@ -67,15 +67,11 @@
|
||||
|
||||
/mob/living/carbon/slime/handle_chemicals_in_body()
|
||||
chem_effects.Cut()
|
||||
analgesic = 0
|
||||
|
||||
if(touching) touching.metabolize()
|
||||
if(ingested) ingested.metabolize()
|
||||
if(bloodstr) bloodstr.metabolize()
|
||||
|
||||
if(CE_PAINKILLER in chem_effects)
|
||||
analgesic = chem_effects[CE_PAINKILLER]
|
||||
|
||||
src.updatehealth()
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
var/painMes = pick("You can feel your body becoming weak!", "You feel like you're about to die!", "You feel every part of your body screaming in agony!", "A low, rolling pain passes through your body!", "Your body feels as if it's falling apart!", "You feel extremely weak!", "A sharp, deep pain bathes every inch of your body!")
|
||||
if (ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.custom_pain(painMes)
|
||||
H.custom_pain(painMes, 100)
|
||||
else if (istype(M, /mob/living/carbon))
|
||||
var/mob/living/carbon/C = M
|
||||
if (C.can_feel_pain())
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
1.2 * src.getShockBruteLoss() + \
|
||||
1.7 * src.getCloneLoss() + \
|
||||
2 * src.halloss + \
|
||||
-1 * src.analgesic
|
||||
-1 * src.chem_effects[CE_PAINKILLER]
|
||||
|
||||
if(src.slurring)
|
||||
src.traumatic_shock -= 20
|
||||
|
||||
@@ -8,11 +8,13 @@
|
||||
Returns
|
||||
standard 0 if fail
|
||||
*/
|
||||
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0)
|
||||
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0)
|
||||
if(Debug2)
|
||||
world.log << "## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]."
|
||||
if(!damage || (blocked >= 100))
|
||||
if(!damage || (blocked >= 100) || soaked >= damage)
|
||||
return 0
|
||||
if(soaked)
|
||||
damage -= soaked
|
||||
blocked = (100-blocked)/100
|
||||
switch(damagetype)
|
||||
if(BRUTE)
|
||||
|
||||
@@ -733,11 +733,20 @@ default behaviour is:
|
||||
src << "<span class='warning'>You feel like you are about to throw up!</span>"
|
||||
sleep(100) //and you have 10 more for mad dash to the bucket
|
||||
|
||||
//Damaged livers cause you to vomit blood.
|
||||
if(!blood_vomit)
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(!H.isSynthetic())
|
||||
var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"]
|
||||
if(L.is_broken())
|
||||
blood_vomit = 1
|
||||
|
||||
Stun(5)
|
||||
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
var/turf/simulated/T = get_turf(src) //TODO: Make add_blood_floor remove blood from human mobs
|
||||
if(istype(T))
|
||||
if(blood_vomit)
|
||||
T.add_blood_floor(src)
|
||||
|
||||
@@ -77,10 +77,20 @@
|
||||
return 0
|
||||
*/
|
||||
|
||||
//Certain pieces of armor actually absorb flat amounts of damage from income attacks
|
||||
/mob/living/proc/get_armor_soak(var/def_zone = null, var/attack_flag = "melee", var/armour_pen = 0)
|
||||
var/soaked = getsoak(def_zone, attack_flag)
|
||||
//5 points of armor pen negate one point of soak
|
||||
if(armour_pen)
|
||||
soaked = max(soaked - (armour_pen/5), 0)
|
||||
return soaked
|
||||
|
||||
//if null is passed for def_zone, then this should return something appropriate for all zones (e.g. area effect damage)
|
||||
/mob/living/proc/getarmor(var/def_zone, var/type)
|
||||
return 0
|
||||
|
||||
/mob/living/proc/getsoak(var/def_zone, var/type)
|
||||
return 0
|
||||
|
||||
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||
|
||||
@@ -93,6 +103,7 @@
|
||||
signaler.signal()
|
||||
|
||||
//Armor
|
||||
var/soaked = get_armor_soak(def_zone, P.check_armour, P.armor_penetration)
|
||||
var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration)
|
||||
var/proj_sharp = is_sharp(P)
|
||||
var/proj_edge = has_edge(P)
|
||||
@@ -105,13 +116,13 @@
|
||||
stun_effect_act(0, P.agony, def_zone, P)
|
||||
src <<"\red You have been hit by [P]!"
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
qdel(P)
|
||||
return
|
||||
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
P.on_hit(src, absorb, def_zone)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge)
|
||||
P.on_hit(src, absorb, soaked, def_zone)
|
||||
|
||||
if(absorb == 100)
|
||||
return 2
|
||||
@@ -153,8 +164,12 @@
|
||||
/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone)
|
||||
visible_message("<span class='danger'>[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!</span>")
|
||||
|
||||
var/soaked = get_armor_soak(hit_zone, "melee")
|
||||
var/blocked = run_armor_check(hit_zone, "melee")
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone)
|
||||
|
||||
//If the armor absorbs all of the damage, skip the damage calculation and the blood
|
||||
if(!soaked > effective_force)
|
||||
standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone)
|
||||
|
||||
if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too
|
||||
var/turf/simulated/location = get_turf(src)
|
||||
@@ -163,7 +178,7 @@
|
||||
return blocked
|
||||
|
||||
//returns 0 if the effects failed to apply for some reason, 1 otherwise.
|
||||
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/soaked, var/hit_zone)
|
||||
if(!effective_force || blocked >= 100)
|
||||
return 0
|
||||
|
||||
@@ -171,6 +186,10 @@
|
||||
if(HULK in user.mutations)
|
||||
effective_force *= 2
|
||||
|
||||
//Armor soak
|
||||
if(soaked >= effective_force)
|
||||
return 0
|
||||
|
||||
//Apply weapon damage
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
var/weapon_edge = has_edge(I)
|
||||
@@ -178,7 +197,7 @@
|
||||
weapon_sharp = 0
|
||||
weapon_edge = 0
|
||||
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
||||
apply_damage(effective_force, I.damtype, hit_zone, blocked, soaked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -200,8 +219,10 @@
|
||||
|
||||
src.visible_message("\red [src] has been hit by [O].")
|
||||
var/armor = run_armor_check(null, "melee")
|
||||
var/soaked = get_armor_soak(null, "melee")
|
||||
|
||||
apply_damage(throw_damage, dtype, null, armor, is_sharp(O), has_edge(O), O)
|
||||
|
||||
apply_damage(throw_damage, dtype, null, armor, soaked, is_sharp(O), has_edge(O), O)
|
||||
|
||||
O.throwing = 0 //it hit, so stop moving
|
||||
|
||||
@@ -230,6 +251,9 @@
|
||||
if(!O || !src) return
|
||||
|
||||
if(O.sharp) //Projectile is suitable for pinning.
|
||||
if(soaked >= throw_damage) //Don't embed if it didn't actually damage
|
||||
return
|
||||
|
||||
//Handles embedding for non-humans and simple_animals.
|
||||
embed(O)
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ var/list/department_radio_keys = list(
|
||||
":s" = "Security", ".s" = "Security",
|
||||
":w" = "whisper", ".w" = "whisper",
|
||||
":t" = "Mercenary", ".t" = "Mercenary",
|
||||
":x" = "Raider", ".x" = "Raider",
|
||||
":u" = "Supply", ".u" = "Supply",
|
||||
":v" = "Service", ".v" = "Service",
|
||||
":p" = "AI Private", ".p" = "AI Private",
|
||||
@@ -26,6 +27,7 @@ var/list/department_radio_keys = list(
|
||||
":S" = "Security", ".S" = "Security",
|
||||
":W" = "whisper", ".W" = "whisper",
|
||||
":T" = "Mercenary", ".T" = "Mercenary",
|
||||
":X" = "Raider", ".X" = "Raider",
|
||||
":U" = "Supply", ".U" = "Supply",
|
||||
":V" = "Service", ".V" = "Service",
|
||||
":P" = "AI Private", ".P" = "AI Private",
|
||||
|
||||
@@ -548,7 +548,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
var/choice = alert("Would you like to select a hologram based on a (visible) crew member, switch to unique avatar, or load your character from your character slot?",,"Crew Member","Unique","My Character")
|
||||
|
||||
switch(choice)
|
||||
if("Crew Member")
|
||||
if("Crew Member") //A seeable crew member (or a dog)
|
||||
var/list/targets = trackable_mobs()
|
||||
if(targets.len)
|
||||
input = input("Select a crew member:") as null|anything in targets //The definition of "crew member" is a little loose...
|
||||
@@ -561,7 +561,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
else
|
||||
alert("No suitable records found. Aborting.")
|
||||
|
||||
if("My Character")
|
||||
if("My Character") //Loaded character slot
|
||||
if(!client || !client.prefs) return
|
||||
var/mob/living/carbon/human/dummy/dummy = new ()
|
||||
//This doesn't include custom_items because that's ... hard.
|
||||
@@ -574,11 +574,16 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
qdel(dummy)
|
||||
holo_icon = new_holo
|
||||
|
||||
else //One from the dmi.
|
||||
else //A premade from the dmi
|
||||
var/icon_list[] = list(
|
||||
"default",
|
||||
"floating face",
|
||||
"singularity",
|
||||
"drone",
|
||||
"carp",
|
||||
"spider",
|
||||
"bear",
|
||||
"slime",
|
||||
"ian",
|
||||
"runtime",
|
||||
"poly",
|
||||
@@ -602,8 +607,18 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
|
||||
if("floating face")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
|
||||
if("singularity")
|
||||
holo_icon = getHologramIcon(icon('icons/obj/singularity.dmi',"singularity_s1"))
|
||||
if("drone")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"drone0"))
|
||||
if("carp")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
|
||||
if("spider")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"nurse"))
|
||||
if("bear")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"brownbear"))
|
||||
if("slime")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/slimes.dmi',"cerulean adult slime"))
|
||||
if("ian")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi"))
|
||||
if("runtime")
|
||||
|
||||
@@ -28,11 +28,14 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Red"
|
||||
alive_icon = "ai-red"
|
||||
alive_light = "#F04848"
|
||||
dead_icon = "ai-red_dead"
|
||||
dead_light = "#F04848"
|
||||
|
||||
/datum/ai_icon/green
|
||||
name = "Green"
|
||||
alive_icon = "ai-wierd"
|
||||
alive_light = "#00FF99"
|
||||
dead_icon = "ai-weird_dead"
|
||||
|
||||
/datum/ai_icon/blue
|
||||
name = "Blue"
|
||||
@@ -44,6 +47,11 @@ var/list/datum/ai_icon/ai_icons
|
||||
alive_icon = "ai-angryface"
|
||||
alive_light = "#FFFF33"
|
||||
|
||||
/datum/ai_icon/angel
|
||||
name = "Angel"
|
||||
alive_icon = "ai-angel"
|
||||
dead_icon = "ai-angel_dead"
|
||||
|
||||
/datum/ai_icon/bliss
|
||||
name = "Bliss"
|
||||
alive_icon = "ai-bliss"
|
||||
@@ -57,6 +65,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
/datum/ai_icon/database
|
||||
name = "Database"
|
||||
alive_icon = "ai-database"
|
||||
dead_icon = "ai-database_dead"
|
||||
|
||||
/datum/ai_icon/dorf
|
||||
name = "Dorf"
|
||||
@@ -80,6 +89,8 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Goon"
|
||||
alive_icon = "ai-goon"
|
||||
alive_light = "#3E5C80"
|
||||
dead_icon = "ai-goon-crash"
|
||||
dead_light = "#3E5C80"
|
||||
|
||||
/datum/ai_icon/heartline
|
||||
name = "Heartline"
|
||||
@@ -91,6 +102,10 @@ var/list/datum/ai_icon/ai_icons
|
||||
alive_icon = "ai-helios"
|
||||
alive_light = "#F2CF73"
|
||||
|
||||
/datum/ai_icon/hourglass
|
||||
name = "Hourglass"
|
||||
alive_icon = "ai-hourglass"
|
||||
|
||||
/datum/ai_icon/inverted
|
||||
name = "Inverted"
|
||||
alive_icon = "ai-u"
|
||||
@@ -100,6 +115,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Lonestar"
|
||||
alive_icon = "ai-lonestar"
|
||||
alive_light = "#58751C"
|
||||
dead_icon = "ai-lonestar_dead"
|
||||
|
||||
/datum/ai_icon/matrix
|
||||
name = "Matrix"
|
||||
@@ -110,6 +126,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
name = "Monochrome"
|
||||
alive_icon = "ai-mono"
|
||||
alive_light = "#585858"
|
||||
dead_icon = "ai-mono_dead"
|
||||
|
||||
/datum/ai_icon/nanotrasen
|
||||
name = "NanoTrasen"
|
||||
@@ -128,13 +145,16 @@ var/list/datum/ai_icon/ai_icons
|
||||
|
||||
/datum/ai_icon/soviet
|
||||
name = "Soviet"
|
||||
alive_icon = "ai-redoctober"
|
||||
alive_icon = "ai-soviet"
|
||||
alive_light = "#FF4307"
|
||||
dead_icon = "ai-soviet_dead"
|
||||
dead_light = "#FF4307"
|
||||
|
||||
/datum/ai_icon/Static
|
||||
name = "Static"
|
||||
alive_icon = "ai-static"
|
||||
alive_light = "#4784C1"
|
||||
alive_icon = "ai-static_dead"
|
||||
|
||||
/datum/ai_icon/text
|
||||
name = "Text"
|
||||
@@ -143,6 +163,7 @@ var/list/datum/ai_icon/ai_icons
|
||||
/datum/ai_icon/trapped
|
||||
name = "Trapped"
|
||||
alive_icon = "ai-hades"
|
||||
dead_icon = "ai-hades_dead"
|
||||
|
||||
/datum/ai_icon/triumvirate_static
|
||||
name = "Triumvirate"
|
||||
|
||||
@@ -158,9 +158,19 @@ var/global/list/robot_modules = list(
|
||||
|
||||
/obj/item/weapon/robot_module/robot/standard
|
||||
name = "standard robot module"
|
||||
sprites = list( "Basic" = "robot_old",
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robot",
|
||||
"Cabeiri" = "eyebot-standard",
|
||||
"CUPCAKE" = "Noble-STD",
|
||||
"Haruka" = "marinaSD",
|
||||
"Usagi" = "tallflower",
|
||||
"Telemachus" = "toiletbot",
|
||||
"WTOperator" = "sleekstandard",
|
||||
"WTOmni" = "omoikane",
|
||||
"XI-GUS" = "spider",
|
||||
"XI-ALP" = "heavyStandard",
|
||||
"Basic" = "robot_old",
|
||||
"Android" = "droid",
|
||||
"Default" = "robot",
|
||||
"Drone" = "drone-standard"
|
||||
)
|
||||
|
||||
@@ -181,8 +191,16 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/medical/surgeon
|
||||
name = "surgeon robot module"
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotMedi",
|
||||
"Cabeiri" = "eyebot-medical",
|
||||
"CUPCAKE" = "Noble-MED",
|
||||
"Haruka" = "marinaMD",
|
||||
"Minako" = "arachne",
|
||||
"Usagi" = "tallwhite",
|
||||
"Telemachus" = "toiletbotsurgeon",
|
||||
"WTOperator" = "sleekcmo",
|
||||
"XI-ALP" = "heavyMed",
|
||||
"Basic" = "Medbot",
|
||||
"Standard" = "surgeon",
|
||||
"Advanced Droid" = "droid-medical",
|
||||
"Needles" = "medicalrobot",
|
||||
"Drone" = "drone-surgery"
|
||||
@@ -230,8 +248,16 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/medical/crisis
|
||||
name = "crisis robot module"
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotMedi",
|
||||
"Cabeiri" = "eyebot-medical",
|
||||
"CUPCAKE" = "Noble-MED",
|
||||
"Haruka" = "marinaMD",
|
||||
"Minako" = "arachne",
|
||||
"Usagi" = "tallwhite",
|
||||
"Telemachus" = "toiletbotmedical",
|
||||
"WTOperator" = "sleekmedic",
|
||||
"XI-ALP" = "heavyMed",
|
||||
"Basic" = "Medbot",
|
||||
"Standard" = "surgeon",
|
||||
"Advanced Droid" = "droid-medical",
|
||||
"Needles" = "medicalrobot",
|
||||
"Drone - Medical" = "drone-medical",
|
||||
@@ -295,6 +321,15 @@ var/global/list/robot_modules = list(
|
||||
networks = list(NETWORK_ENGINEERING)
|
||||
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotEngi",
|
||||
"Cabeiri" = "eyebot-engineering",
|
||||
"CUPCAKE" = "Noble-ENG",
|
||||
"Haruka" = "marinaENG",
|
||||
"Usagi" = "tallyellow",
|
||||
"Telemachus" = "toiletbotengineering",
|
||||
"WTOperator" = "sleekce",
|
||||
"XI-GUS" = "spidereng",
|
||||
"XI-ALP" = "heavyEng",
|
||||
"Basic" = "Engineering",
|
||||
"Antique" = "engineerrobot",
|
||||
"Landmate" = "landmate",
|
||||
@@ -312,7 +347,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/rcd/borg(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
|
||||
src.modules += new /obj/item/device/pipe_painter(src)
|
||||
src.modules += new /obj/item/device/floor_painter(src)
|
||||
@@ -348,7 +383,7 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/engineering/general/New()
|
||||
..()
|
||||
src.modules += new /obj/item/borg/sight/meson(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/wirecutters(src)
|
||||
@@ -408,11 +443,19 @@ var/global/list/robot_modules = list(
|
||||
|
||||
/obj/item/weapon/robot_module/robot/security/general
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotSecy",
|
||||
"Cabeiri" = "eyebot-security",
|
||||
"Cerberus" = "bloodhound",
|
||||
"Cerberus - Treaded" = "treadhound",
|
||||
"CUPCAKE" = "Noble-SEC",
|
||||
"Haruka" = "marinaSC",
|
||||
"Usagi" = "tallred",
|
||||
"Telemachus" = "toiletbotsecurity",
|
||||
"WTOperator" = "sleeksecurity",
|
||||
"XI-GUS" = "spidersec",
|
||||
"XI-ALP" = "heavySec",
|
||||
"Basic" = "secborg",
|
||||
"Red Knight" = "Security",
|
||||
"Black Knight" = "securityrobot",
|
||||
"Bloodhound" = "bloodhound",
|
||||
"Bloodhound - Treaded" = "secborg+tread",
|
||||
"Drone" = "drone-sec"
|
||||
)
|
||||
|
||||
@@ -448,6 +491,13 @@ var/global/list/robot_modules = list(
|
||||
name = "janitorial robot module"
|
||||
channels = list("Service" = 1)
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotJani",
|
||||
"Cabeiri" = "eyebot-janitor",
|
||||
"CUPCAKE" = "Noble-CLN",
|
||||
"Haruka" = "marinaJN",
|
||||
"Telemachus" = "toiletbotjanitor",
|
||||
"WTOperator" = "sleekjanitor",
|
||||
"XI-ALP" = "heavyRes",
|
||||
"Basic" = "JanBot2",
|
||||
"Mopbot" = "janitorrobot",
|
||||
"Mop Gear Rex" = "mopgearrex",
|
||||
@@ -488,11 +538,21 @@ var/global/list/robot_modules = list(
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/clerical/butler
|
||||
sprites = list( "Waitress" = "Service",
|
||||
"Kent" = "toiletbot",
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotServ",
|
||||
"Cabeiri" = "eyebot-standard",
|
||||
"CUPCAKE" = "Noble-SRV",
|
||||
"Haruka" = "marinaSV",
|
||||
"Usagi" = "tallgreen",
|
||||
"Telemachus" = "toiletbot",
|
||||
"WTOperator" = "sleekservice",
|
||||
"WTOmni" = "omoikane",
|
||||
"XI-GUS" = "spider",
|
||||
"XI-ALP" = "heavyServ",
|
||||
"Standard" = "Service2",
|
||||
"Waitress" = "Service",
|
||||
"Bro" = "Brobot",
|
||||
"Rich" = "maximillion",
|
||||
"Default" = "Service2",
|
||||
"Drone - Service" = "drone-service",
|
||||
"Drone - Hydro" = "drone-hydro"
|
||||
)
|
||||
@@ -532,12 +592,21 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/clerical/general
|
||||
name = "clerical robot module"
|
||||
sprites = list(
|
||||
"M-USE NanoTrasen" = "robotCler",
|
||||
"Cabeiri" = "eyebot-standard",
|
||||
"CUPCAKE" = "Noble-SRV",
|
||||
"Haruka" = "marinaSV",
|
||||
"Usagi" = "tallgreen",
|
||||
"Telemachus" = "toiletbot",
|
||||
"WTOperator" = "sleekclerical",
|
||||
"WTOmni" = "omoikane",
|
||||
"XI-GUS" = "spidercom",
|
||||
"XI-ALP" = "heavyServ",
|
||||
"Waitress" = "Service",
|
||||
"Kent" = "toiletbot",
|
||||
"Bro" = "Brobot",
|
||||
"Rich" = "maximillion",
|
||||
"Default" = "Service2",
|
||||
"Drone" = "drone-service"
|
||||
"Drone" = "drone-blu"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/clerical/general/New()
|
||||
@@ -563,6 +632,14 @@ var/global/list/robot_modules = list(
|
||||
channels = list("Supply" = 1)
|
||||
networks = list(NETWORK_MINE)
|
||||
sprites = list(
|
||||
"NM-USE NanoTrasen" = "robotMine",
|
||||
"Cabeiri" = "eyebot-miner",
|
||||
"CUPCAKE" = "Noble-DIG",
|
||||
"Haruka" = "marinaMN",
|
||||
"Telemachus" = "toiletbotminer",
|
||||
"WTOperator" = "sleekminer",
|
||||
"XI-GUS" = "spidermining",
|
||||
"XI-ALP" = "heavyMiner",
|
||||
"Basic" = "Miner_old",
|
||||
"Advanced Droid" = "droid-miner",
|
||||
"Treadhead" = "Miner",
|
||||
@@ -586,6 +663,10 @@ var/global/list/robot_modules = list(
|
||||
name = "research module"
|
||||
channels = list("Science" = 1)
|
||||
sprites = list(
|
||||
"L'Ouef" = "peaceborg",
|
||||
"Cabeiri" = "eyebot-science",
|
||||
"Haruka" = "marinaSCI",
|
||||
"WTOperator" = "sleekscience",
|
||||
"Droid" = "droid-science",
|
||||
"Drone" = "drone-science"
|
||||
)
|
||||
@@ -599,7 +680,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
|
||||
src.modules += new /obj/item/device/robotanalyzer(src)
|
||||
src.modules += new /obj/item/weapon/card/robot(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/wirecutters(src)
|
||||
@@ -641,7 +722,13 @@ var/global/list/robot_modules = list(
|
||||
LANGUAGE_SIGN = 0
|
||||
)
|
||||
sprites = list(
|
||||
"Dread" = "securityrobot",
|
||||
"Cerberus" = "syndie_bloodhound",
|
||||
"Cerberus - Treaded" = "syndie_treadhound",
|
||||
"Ares" = "squats",
|
||||
"Telemachus" = "toiletbotantag",
|
||||
"WTOperator" = "hosborg",
|
||||
"XI-GUS" = "spidersyndi",
|
||||
"XI-ALP" = "syndi-heavy"
|
||||
)
|
||||
var/id
|
||||
|
||||
@@ -666,7 +753,10 @@ var/global/list/robot_modules = list(
|
||||
/obj/item/weapon/robot_module/robot/security/combat
|
||||
name = "combat robot module"
|
||||
hide_on_manifest = 1
|
||||
sprites = list("Combat Android" = "droid-combat")
|
||||
sprites = list(
|
||||
"Haruka" = "marinaCB",
|
||||
"Combat Android" = "droid-combat"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/security/combat/New()
|
||||
..()
|
||||
@@ -686,7 +776,8 @@ var/global/list/robot_modules = list(
|
||||
|
||||
/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot)
|
||||
..()
|
||||
src.modules += new /obj/item/weapon/weldingtool(src)
|
||||
src.modules += new /obj/item/borg/sight/meson(src)
|
||||
src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
|
||||
src.modules += new /obj/item/weapon/screwdriver(src)
|
||||
src.modules += new /obj/item/weapon/wrench(src)
|
||||
src.modules += new /obj/item/weapon/crowbar(src)
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
var/mob/living/carbon/human/H = target_mob
|
||||
var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG)
|
||||
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1)
|
||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1, edge=1)
|
||||
return H
|
||||
else if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
|
||||
73
code/modules/mob/living/simple_animal/animals/fish.dm
Normal file
73
code/modules/mob/living/simple_animal/animals/fish.dm
Normal 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"
|
||||
@@ -36,7 +36,7 @@
|
||||
speak_emote = list("chitters")
|
||||
emote_hear = list("chitters")
|
||||
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidermeat
|
||||
|
||||
var/busy = 0
|
||||
var/poison_per_bite = 5
|
||||
|
||||
@@ -481,7 +481,7 @@
|
||||
var/mob/living/carbon/human/H = parrot_interest
|
||||
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."))
|
||||
|
||||
else
|
||||
|
||||
@@ -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-.
|
||||
var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15))
|
||||
affected.wounds += I
|
||||
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
|
||||
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50)
|
||||
|
||||
if (ishuman(U))
|
||||
var/mob/living/carbon/human/human_user = U
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
user << "<span class='notice'>You must stand still to feel [E] for fractures.</span>"
|
||||
else if(E.status & ORGAN_BROKEN)
|
||||
user << "<span class='warning'>The [E.encased ? E.encased : "bone in the [E.name]"] moves slightly when you poke it!</span>"
|
||||
H.custom_pain("Your [E.name] hurts where it's poked.")
|
||||
H.custom_pain("Your [E.name] hurts where it's poked.", 40)
|
||||
else
|
||||
user << "<span class='notice'>The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine.</span>"
|
||||
|
||||
@@ -56,7 +56,8 @@
|
||||
return
|
||||
|
||||
var/armor = target.run_armor_check(target, "melee")
|
||||
if(armor < 60)
|
||||
var/soaked = target.get_armor_soak(target, "melee")
|
||||
if(armor + soaked < 60)
|
||||
target << "<span class='danger'>You feel extreme pain!</span>"
|
||||
|
||||
var/max_halloss = round(target.species.total_health * 0.8) //up to 80% of passing out
|
||||
@@ -100,8 +101,9 @@
|
||||
damage += hat.force * 3
|
||||
|
||||
var/armor = target.run_armor_check(BP_HEAD, "melee")
|
||||
target.apply_damage(damage, BRUTE, BP_HEAD, armor)
|
||||
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD, "melee"))
|
||||
var/soaked = target.get_armor_soak(BP_HEAD, "melee")
|
||||
target.apply_damage(damage, BRUTE, BP_HEAD, armor, soaked)
|
||||
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD), attacker.get_armor_soak(BP_HEAD), "melee")
|
||||
|
||||
if(!armor && target.headcheck(BP_HEAD) && prob(damage))
|
||||
target.apply_effect(20, PARALYZE)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user