Merge remote-tracking branch 'citadel/master' into unarmed_parry
This commit is contained in:
@@ -108,8 +108,7 @@
|
||||
|
||||
//Life, Stat, Hud Updates, and Say
|
||||
/mob/living/simple_animal/revenant/BiologicalLife(seconds, times_fired)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
. = ..()
|
||||
if(stasis)
|
||||
return
|
||||
if(revealed && essence <= 0)
|
||||
|
||||
@@ -189,6 +189,8 @@
|
||||
if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
|
||||
to_chat(user, "<span class='warning'>You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.</span>")
|
||||
user.dropItemToGround(src)
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll)
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
///Next tick to reset the total message counter
|
||||
var/total_count_reset = 0
|
||||
var/ircreplyamount = 0
|
||||
/// last time they tried to do an autobunker auth
|
||||
var/autobunker_last_try = 0
|
||||
|
||||
/////////
|
||||
//OTHER//
|
||||
|
||||
@@ -2322,14 +2322,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/min = CONFIG_GET(number/body_size_min)
|
||||
var/max = CONFIG_GET(number/body_size_max)
|
||||
var/danger = CONFIG_GET(number/threshold_body_size_slowdown)
|
||||
var/new_body_size = input(user, "Choose your desired sprite size:\n([min*100]%-[max*100]%), Warning: May make your character look distorted[danger > min ? ", and an exponential slowdown will occur for those smaller than [danger*100]%!" : "!"]", "Character Preference", features["body_size"]*100) as num|null
|
||||
var/new_body_size = input(user, "Choose your desired sprite size: ([min*100]%-[max*100]%)\nWarning: This may make your character look distorted[danger > min ? "! Additionally, a proportional movement speed penalty will be applied to characters smaller than [danger*100]%." : "!"]", "Character Preference", features["body_size"]*100) as num|null
|
||||
if (new_body_size)
|
||||
new_body_size = clamp(new_body_size * 0.01, min, max)
|
||||
var/dorfy
|
||||
if(danger > new_body_size)
|
||||
dorfy = alert(user, "The chosen size appears to be smaller than the threshold of [danger*100]%, which will lead to an added exponential slowdown. Are you sure about that?", "Dwarfism Alert", "Yes", "Move it to the threshold", "No")
|
||||
if(!dorfy || dorfy == "Move it above the threshold")
|
||||
if((new_body_size + 0.01) < danger) // Adding 0.01 as a dumb fix to prevent the warning message from appearing when exactly at threshold... Not sure why that happens in the first place.
|
||||
dorfy = alert(user, "You have chosen a size below the slowdown threshold of [danger*100]%. For balancing purposes, the further you go below this percentage, the slower your character will be. Do you wish to keep this size?", "Speed Penalty Alert", "Yes", "Move it to the threshold", "No")
|
||||
if(dorfy == "Move it to the threshold")
|
||||
new_body_size = danger
|
||||
if(!dorfy) //Aborts if this var is somehow empty
|
||||
return
|
||||
if(dorfy != "No")
|
||||
features["body_size"] = new_body_size
|
||||
if("tongue")
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/client/verb/bunker_auto_authorize()
|
||||
set name = "Auto Authorize Panic Bunker"
|
||||
set desc = "Authorizes your account in the panic bunker of any servers connected to this function."
|
||||
set category = "OOC"
|
||||
|
||||
if(autobunker_last_try + 5 SECONDS > world.time)
|
||||
to_chat(src, "<span class='danger'>Function on cooldown, try again in 5 seconds.</span>")
|
||||
return
|
||||
autobunker_last_try = world.time
|
||||
|
||||
world.send_cross_server_bunker_overrides(key, src)
|
||||
|
||||
/world/proc/send_cross_server_bunker_overrides(key, client/C)
|
||||
var/comms_key = CONFIG_GET(string/comms_key)
|
||||
if(!comms_key)
|
||||
return
|
||||
var/list/message = list()
|
||||
message["ckey"] = key
|
||||
message["source"] = "[CONFIG_GET(string/cross_comms_name)]"
|
||||
message["key"] = comms_key
|
||||
message["auto_bunker_override"] = TRUE
|
||||
var/list/servers = CONFIG_GET(keyed_list/cross_server_bunker_override)
|
||||
if(!length(servers))
|
||||
to_chat(C, "<span class='boldwarning'>AUTOBUNKER: No servers are configured to receive from this one.</span>")
|
||||
return
|
||||
log_admin("[key] ([key_name(C)]) has initiated an autobunker authentication with linked servers.")
|
||||
for(var/name in servers)
|
||||
var/returned = world.Export("[servers[name]]?[list2params(message)]")
|
||||
switch(returned)
|
||||
if("Bad Key")
|
||||
to_chat(C, "<span class='boldwarning'>AUTOBuNKER: [name] failed to authenticate with this server.</span>")
|
||||
if("Function Disabled")
|
||||
to_chat(C, "<span class='boldwarning'>AUTOBUNKER: [name] has autobunker receive disabled.</span>")
|
||||
if("Success")
|
||||
to_chat(C, "<span class='boldwarning'>AUTOBUNKER: Successfully authenticated with [name]. Panic bunker bypass granted to [key].</span>.")
|
||||
else
|
||||
to_chat(C, "<span class='boldwarning'>AUTOBUNKER: Unknown error ([name]).</span>")
|
||||
@@ -23,14 +23,15 @@
|
||||
if(iscarbon(target) && proximity)
|
||||
var/mob/living/carbon/C = target
|
||||
var/mob/living/carbon/U = user
|
||||
var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE)
|
||||
var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE, clothing_check = TRUE)
|
||||
if(success)
|
||||
if(C == user)
|
||||
C.visible_message("<span class='notice'>[U] sprays their hands with glittery rubber!</span>")
|
||||
else
|
||||
C.visible_message("<span class='warning'>[U] sprays glittery rubber on the hands of [C]!</span>")
|
||||
else
|
||||
C.visible_message("<span class='warning'>The rubber fails to stick to [C]'s hands!</span>")
|
||||
user.visible_message("<span class='warning'>The rubber fails to stick to [C]'s hands!</span>",
|
||||
"<span class='warning'>The rubber fails to stick to [C]'s [(SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!</span>")
|
||||
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
RemoveHelmet()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet(message = TRUE)
|
||||
if(!helmet)
|
||||
return
|
||||
suittoggled = FALSE
|
||||
@@ -174,16 +174,18 @@
|
||||
helmet.attack_self(H)
|
||||
H.transferItemToLoc(helmet, src, TRUE)
|
||||
H.update_inv_wear_suit()
|
||||
to_chat(H, "<span class='notice'>The helmet on the hardsuit disengages.</span>")
|
||||
if(message)
|
||||
to_chat(H, "<span class='notice'>The helmet on the hardsuit disengages.</span>")
|
||||
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
else
|
||||
helmet.forceMove(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/dropped(mob/user)
|
||||
..()
|
||||
RemoveHelmet()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet(message = TRUE)
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(!helmettype)
|
||||
return
|
||||
@@ -192,15 +194,19 @@
|
||||
if(!suittoggled)
|
||||
if(ishuman(src.loc))
|
||||
if(H.wear_suit != src)
|
||||
to_chat(H, "<span class='warning'>You must be wearing [src] to engage the helmet!</span>")
|
||||
if(message)
|
||||
to_chat(H, "<span class='warning'>You must be wearing [src] to engage the helmet!</span>")
|
||||
return
|
||||
if(H.head)
|
||||
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
|
||||
if(message)
|
||||
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
|
||||
return
|
||||
else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
|
||||
to_chat(H, "<span class='notice'>You engage the helmet on the hardsuit.</span>")
|
||||
if(message)
|
||||
to_chat(H, "<span class='notice'>You engage the helmet on the hardsuit.</span>")
|
||||
suittoggled = TRUE
|
||||
H.update_inv_wear_suit()
|
||||
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
return TRUE
|
||||
else
|
||||
RemoveHelmet()
|
||||
return RemoveHelmet(message)
|
||||
|
||||
@@ -46,4 +46,4 @@
|
||||
icon_state = "lewdcap"
|
||||
item_state = "lewdcap"
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = USE_TAUR_CLIP_MASK
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
icon_state = "cmoturtle"
|
||||
item_state = "w_suit"
|
||||
alt_covers_chest = TRUE
|
||||
mutantrace_variation = USE_TAUR_CLIP_MASK
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK
|
||||
|
||||
/obj/item/clothing/under/rank/medical/geneticist
|
||||
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
|
||||
|
||||
@@ -83,6 +83,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/chicken
|
||||
name = "chicken meat"
|
||||
desc = "A slab of raw chicken. Remember to wash your hands!"
|
||||
icon_state = "chickenbreast"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/chicken
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
|
||||
tastes = list("chicken" = 1)
|
||||
@@ -341,8 +342,14 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/chicken
|
||||
name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites.
|
||||
icon_state = "chickenbreast_cooked"
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/fish
|
||||
name = "fish fillet"
|
||||
icon_state = "grilled_carp_slice"
|
||||
tastes = list("charred sushi" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain
|
||||
foodtype = MEAT
|
||||
|
||||
@@ -361,6 +368,7 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/bear
|
||||
name = "bear steak"
|
||||
icon_state = "bearcook"
|
||||
tastes = list("meat" = 1, "salmon" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/xeno
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
|
||||
bitesize = 6
|
||||
filling_color = "#FA8072"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/fish
|
||||
tastes = list("fish" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
|
||||
@@ -136,6 +136,17 @@
|
||||
tastes = list("fries" = 3, "cheese" = 1)
|
||||
foodtype = VEGETABLES | GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chilicheesefries
|
||||
name = "chili cheese fries"
|
||||
desc = "Fries smothered in cheese -and- chilli."
|
||||
icon_state = "chilicheesefries"
|
||||
trash = /obj/item/trash/plate
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 1)
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("fries" = 3, "cheese" = 1)
|
||||
foodtype = VEGETABLES | GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/badrecipe
|
||||
name = "burned mess"
|
||||
desc = "Someone should be demoted from cook for this."
|
||||
@@ -537,6 +548,15 @@
|
||||
tastes = list("butter" = 1)
|
||||
foodtype = DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/butter/margarine
|
||||
name = "stick of margarine"
|
||||
desc = "A stick of lightly salted vegetable oil."
|
||||
icon_state = "marge"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/cornoil = 2, /datum/reagent/consumable/sodiumchloride = 1)
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("butter" = 1)
|
||||
foodtype = JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/onionrings
|
||||
name = "onion rings"
|
||||
desc = "Onion slices coated in batter."
|
||||
|
||||
@@ -21,6 +21,17 @@
|
||||
tastes = list("toast" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/baconlettucetomato
|
||||
name = "blt sandwich"
|
||||
desc = "The classic bacon, lettuce tomato sandwich."
|
||||
icon = 'icons/obj/food/burgerbread.dmi'
|
||||
icon_state = "blt"
|
||||
trash = /obj/item/trash/plate
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2)
|
||||
tastes = list("bacon" = 1, "lettuce" = 1, "tomato" = 1, "mayo" = 1)
|
||||
foodtype = GRAIN | MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grilledcheese
|
||||
name = "grilled cheese sandwich"
|
||||
desc = "Goes great with Tomato soup!"
|
||||
@@ -136,8 +147,9 @@
|
||||
/obj/item/reagent_containers/food/snacks/tuna_sandwich
|
||||
name = "tuna sandwich"
|
||||
desc = "Both a salad and a sandwich in one."
|
||||
icon = 'icons/obj/food/burgerbread.dmi'
|
||||
icon_state = "tunasandwich"
|
||||
trash = /obj/item/trash/plate
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 4)
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
|
||||
tastes = list("tuna" = 4, "mayonnaise" = 2, "bread" = 2)
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
@@ -179,3 +179,14 @@
|
||||
id = /datum/reagent/consumable/bbqsauce
|
||||
results = list(/datum/reagent/consumable/bbqsauce = 5)
|
||||
required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/salglu_solution = 3, /datum/reagent/consumable/blackpepper = 1)
|
||||
|
||||
/datum/chemical_reaction/margarine
|
||||
name = "Margarine"
|
||||
id = "margarine"
|
||||
required_reagents = list(/datum/reagent/consumable/cornoil = 5, /datum/reagent/consumable/soymilk = 5, /datum/reagent/consumable/sodiumchloride = 1)
|
||||
mix_message = "The ingredients solidify into a stick of margarine."
|
||||
|
||||
/datum/chemical_reaction/margarine/on_reaction(datum/reagents/holder, multiplier)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i = 1, i <= multiplier, i++)
|
||||
new /obj/item/reagent_containers/food/snacks/butter/margarine(location)
|
||||
@@ -22,6 +22,15 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/baconegg
|
||||
subcategory = CAT_EGG
|
||||
|
||||
/datum/crafting_recipe/food/wrap
|
||||
name = "Egg Wrap"
|
||||
reqs = list(/datum/reagent/consumable/soysauce = 10,
|
||||
/obj/item/reagent_containers/food/snacks/friedegg = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/eggwrap
|
||||
subcategory = CAT_EGG
|
||||
|
||||
/datum/crafting_recipe/food/omelette
|
||||
name = "Omelette"
|
||||
reqs = list(
|
||||
|
||||
@@ -14,15 +14,6 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/chawanmushi
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/wrap
|
||||
name = "Egg Wrap"
|
||||
reqs = list(/datum/reagent/consumable/soysauce = 10,
|
||||
/obj/item/reagent_containers/food/snacks/friedegg = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/eggwrap
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/khachapuri
|
||||
name = "Khachapuri"
|
||||
reqs = list(
|
||||
@@ -93,6 +84,16 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/cheesyfries
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/chilicheesefries
|
||||
name = "Chilli cheese fries"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/fries = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/chili = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/chilicheesefries
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/eggplantparm
|
||||
name ="Eggplant parmigiana"
|
||||
reqs = list(
|
||||
|
||||
@@ -25,6 +25,17 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/grilledcheese
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/baconlettucetomato
|
||||
name = "BLT sandwich"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/meat/bacon = 2,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato = 1,
|
||||
/datum/reagent/consumable/mayonnaise = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/baconlettucetomato
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/slimesandwich
|
||||
name = "Jelly sandwich"
|
||||
reqs = list(
|
||||
@@ -99,7 +110,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
/obj/item/reagent_containers/food/snacks/tuna = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/onion = 1,
|
||||
/obj/item/reagent_containers/food/condiment/mayonnaise = 5
|
||||
/datum/reagent/consumable/mayonnaise = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/tuna_sandwich
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
@@ -277,7 +277,7 @@
|
||||
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
|
||||
icon_grow = "bee_balm-grow"
|
||||
icon_dead = "bee_balm-dead"
|
||||
mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey) //Lower odds of becoming honey
|
||||
mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey_balm) //Lower odds of becoming honey
|
||||
reagents_add = list(/datum/reagent/medicine/spaceacillin = 0.1, /datum/reagent/space_cleaner/sterilizine = 0.05)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/bee_balm
|
||||
@@ -291,11 +291,11 @@
|
||||
foodtype = GROSS
|
||||
|
||||
// Beebalm
|
||||
/obj/item/seeds/bee_balm/honey
|
||||
/obj/item/seeds/bee_balm/honey_balm
|
||||
name = "pack of Honey Balm seeds"
|
||||
desc = "These seeds grow into Honey Balms."
|
||||
icon_state = "seed-bee_balmalt"
|
||||
species = "seed-bee_balm_alt"
|
||||
icon_state = "seed-honey_balm"
|
||||
species = "honey_balm"
|
||||
plantname = "Honey Balm Pods"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
|
||||
endurance = 1
|
||||
@@ -304,16 +304,16 @@
|
||||
potency = 1
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
|
||||
icon_grow = "bee_balmalt-grow"
|
||||
icon_dead = "bee_balmalt-dead"
|
||||
icon_grow = "honey_balm-grow"
|
||||
icon_dead = "honey_balm-dead"
|
||||
reagents_add = list(/datum/reagent/consumable/honey = 0.1, /datum/reagent/lye = 0.3) //To make wax
|
||||
rarity = 30
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
|
||||
seed = /obj/item/seeds/bee_balm/honey
|
||||
seed = /obj/item/seeds/bee_balm/honey_balm
|
||||
name = "honey balm"
|
||||
desc = "A large honey filled pod of a flower."
|
||||
icon_state = "bee_balmalt"
|
||||
icon_state = "honey_balm"
|
||||
filling_color = "#FF6347"
|
||||
bitesize_mod = 8
|
||||
tastes = list("wax" = 1)
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
|
||||
/datum/plant_gene/trait/battery/on_attackby(obj/item/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/cable_coil))
|
||||
if(I.use_tool(src, user, 0, 5, max_level = JOB_SKILL_EXPERT))
|
||||
if(I.use_tool(src, user, 0, 5, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
|
||||
to_chat(user, "<span class='notice'>You add some cable to [G] and slide it inside the battery encasing.</span>")
|
||||
var/obj/item/stock_parts/cell/potato/pocell = new /obj/item/stock_parts/cell/potato(user.loc)
|
||||
pocell.icon_state = G.icon_state
|
||||
|
||||
@@ -25,6 +25,17 @@
|
||||
var/mob/living/L = user.mob
|
||||
L.keybind_stop_active_blocking()
|
||||
|
||||
/datum/keybinding/living/active_block_toggle
|
||||
name = "active_block_toggle"
|
||||
full_name = "Block (Toggle)"
|
||||
category = CATEGORY_COMBAT
|
||||
description = "Toggles active blocking system using currenet in hand object, or any found object if applicable."
|
||||
|
||||
/datum/keybinding/living/active_block_toggle/down(client/user)
|
||||
var/mob/living/L = user.mob
|
||||
L.keybind_toggle_active_blocking()
|
||||
return TRUE
|
||||
|
||||
/datum/keybinding/living/active_parry
|
||||
hotkey_keys = list("Insert", "G")
|
||||
name = "active_parry"
|
||||
|
||||
@@ -390,7 +390,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
to_chat(user, "<span class='warning'>There already is a string attached to this coin!</span>")
|
||||
return
|
||||
|
||||
if (W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
|
||||
if (W.use_tool(src, user, 0, 1, skill_gain_mult = BARE_USE_TOOL_MULT))
|
||||
add_overlay("coin_string_overlay")
|
||||
string_attached = 1
|
||||
to_chat(user, "<span class='notice'>You attach a string to the coin.</span>")
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I)
|
||||
. = ..()
|
||||
if(!. || !I)
|
||||
return
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
Die()
|
||||
|
||||
/obj/item/clothing/mask/facehugger/equipped(mob/M)
|
||||
. = ..()
|
||||
Attach(M)
|
||||
|
||||
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
|
||||
@@ -254,7 +255,7 @@
|
||||
return FALSE
|
||||
if(AmBloodsucker(M))
|
||||
return FALSE
|
||||
|
||||
|
||||
if(ismonkey(M))
|
||||
return 1
|
||||
|
||||
|
||||
@@ -227,19 +227,21 @@
|
||||
SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L)
|
||||
return
|
||||
if(href_list["toggle_helmet"])
|
||||
var/hardsuit_head = head && istype(head, /obj/item/clothing/head/helmet/space/hardsuit)
|
||||
if(!istype(head, /obj/item/clothing/head/helmet/space/hardsuit))
|
||||
return
|
||||
var/obj/item/clothing/head/helmet/space/hardsuit/hardsuit_head = head
|
||||
visible_message("<span class='danger'>[usr] tries to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.</span>", \
|
||||
"<span class='userdanger'>[usr] tries to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.</span>", \
|
||||
target = usr, target_message = "<span class='danger'>You try to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.</span>")
|
||||
if(!do_mob(usr, src, POCKET_STRIP_DELAY))
|
||||
if(!do_mob(usr, src, hardsuit_head ? head.strip_delay : POCKET_STRIP_DELAY))
|
||||
return
|
||||
visible_message("<span class='danger'>[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet</span>", \
|
||||
"<span class='userdanger'>[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet</span>", \
|
||||
target = usr, target_message = "<span class='danger'>You [hardsuit_head ? "retract" : "extend"] [src]'s helmet.</span>")
|
||||
if(!istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
if(!istype(wear_suit, /obj/item/clothing/suit/space/hardsuit) || (hardsuit_head ? (!head || head != hardsuit_head) : head))
|
||||
return
|
||||
var/obj/item/clothing/suit/space/hardsuit/hardsuit = wear_suit //This should be an hardsuit given all our checks
|
||||
hardsuit.ToggleHelmet()
|
||||
if(hardsuit.ToggleHelmet(FALSE))
|
||||
visible_message("<span class='danger'>[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet</span>", \
|
||||
"<span class='userdanger'>[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet</span>", \
|
||||
target = usr, target_message = "<span class='danger'>You [hardsuit_head ? "retract" : "extend"] [src]'s helmet.</span>")
|
||||
return
|
||||
if(href_list["item"])
|
||||
var/slot = text2num(href_list["item"])
|
||||
|
||||
@@ -85,8 +85,11 @@
|
||||
FP.entered_dirs |= dir
|
||||
FP.bloodiness = S.bloody_shoes[S.blood_state]
|
||||
if(S.last_bloodtype)
|
||||
FP.blood_DNA += list(S.last_blood_DNA = S.last_bloodtype)
|
||||
FP.blood_DNA["color"] += S.last_blood_color
|
||||
FP.blood_DNA[S.last_blood_DNA] = S.last_bloodtype
|
||||
if(!FP.blood_DNA["color"])
|
||||
FP.blood_DNA["color"] = S.last_blood_color
|
||||
else
|
||||
FP.blood_DNA["color"] = BlendRGB(FP.blood_DNA["color"], S.last_blood_color)
|
||||
FP.update_icon()
|
||||
update_inv_shoes()
|
||||
//End bloody footprints
|
||||
|
||||
@@ -14,14 +14,14 @@
|
||||
changeNext_move(data.block_end_click_cd_add)
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/start_active_blocking(obj/item/I)
|
||||
/mob/living/proc/ACTIVE_BLOCK_START(obj/item/I)
|
||||
if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING))
|
||||
return FALSE
|
||||
if(!(I in held_items))
|
||||
return FALSE
|
||||
var/datum/block_parry_data/data = I.get_block_parry_data()
|
||||
if(!istype(data)) //Typecheck because if an admin/coder screws up varediting or something we do not want someone being broken forever, the CRASH logs feedback so we know what happened.
|
||||
CRASH("start_active_blocking called with an item with no valid data: [I] --> [I.block_parry_data]!")
|
||||
CRASH("ACTIVE_BLOCK_START called with an item with no valid data: [I] --> [I.block_parry_data]!")
|
||||
combat_flags |= COMBAT_FLAG_ACTIVE_BLOCKING
|
||||
active_block_item = I
|
||||
if(data.block_lock_attacking)
|
||||
@@ -83,9 +83,15 @@
|
||||
return FALSE
|
||||
// QOL: Instead of trying to just block with held item, grab first available item.
|
||||
var/obj/item/I = find_active_block_item()
|
||||
if(!I)
|
||||
to_chat(src, "<span class='warning'>You can't block with your bare hands!</span>")
|
||||
var/list/other_items = list()
|
||||
if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_BLOCK_START, I, other_items) & COMPONENT_PREVENT_BLOCK_START)
|
||||
to_chat(src, "<span class='warning'>Something is preventing you from blocking!</span>")
|
||||
return
|
||||
if(!I)
|
||||
if(!length(other_items))
|
||||
to_chat(src, "<span class='warning'>You can't block with your bare hands!</span>")
|
||||
return
|
||||
I = other_items[1]
|
||||
if(!I.can_active_block())
|
||||
to_chat(src, "<span class='warning'>[I] is either not capable of being used to actively block, or is not currently in a state that can! (Try wielding it if it's twohanded, for example.)</span>")
|
||||
return
|
||||
@@ -104,7 +110,7 @@
|
||||
animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW)
|
||||
return
|
||||
combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING)
|
||||
start_active_blocking(I)
|
||||
ACTIVE_BLOCK_START(I)
|
||||
|
||||
/**
|
||||
* Gets the first item we can that can block, but if that fails, default to active held item.COMSIG_ENABLE_COMBAT_MODE
|
||||
@@ -115,7 +121,8 @@
|
||||
for(var/obj/item/I in held_items - held)
|
||||
if(I.can_active_block())
|
||||
return I
|
||||
return held
|
||||
else
|
||||
return held
|
||||
|
||||
/**
|
||||
* Proc called by keybindings to stop active blocking.
|
||||
|
||||
@@ -24,25 +24,39 @@
|
||||
// yanderedev else if time
|
||||
var/obj/item/using_item = get_active_held_item()
|
||||
var/datum/block_parry_data/data
|
||||
var/datum/tool
|
||||
var/method
|
||||
if(using_item?.can_active_parry())
|
||||
data = using_item.block_parry_data
|
||||
method = ITEM_PARRY
|
||||
tool = using_item
|
||||
else if(mind?.martial_art?.can_martial_parry)
|
||||
data = mind.martial_art.block_parry_data
|
||||
method = MARTIAL_PARRY
|
||||
tool = mind.martial_art
|
||||
else if(combat_flags & COMBAT_FLAG_UNARMED_PARRY)
|
||||
data = block_parry_data
|
||||
method = UNARMED_PARRY
|
||||
tool = src
|
||||
else
|
||||
// QOL: If none of the above work, try to find another item.
|
||||
var/obj/item/backup = find_backup_parry_item()
|
||||
if(!backup)
|
||||
to_chat(src, "<span class='warning'>You have nothing to parry with!</span>")
|
||||
return FALSE
|
||||
data = backup.block_parry_data
|
||||
using_item = backup
|
||||
if(backup)
|
||||
tool = backup
|
||||
data = backup.block_parry_data
|
||||
using_item = backup
|
||||
method = ITEM_PARRY
|
||||
var/list/other_items = list()
|
||||
if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items) & COMPONENT_PREVENT_PARRY_START)
|
||||
to_chat(src, "<span class='warning'>Something is preventing you from parrying!</span>")
|
||||
return
|
||||
if(!using_item && !method && length(other_items))
|
||||
using_item = other_items[1]
|
||||
method = ITEM_PARRY
|
||||
data = using_item.block_parry_data
|
||||
if(!method)
|
||||
to_chat(src, "<span class='warning'>You have nothing to parry with!</span>")
|
||||
return FALSE
|
||||
//QOL: Try to enable combat mode if it isn't already
|
||||
SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE)
|
||||
if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE))
|
||||
|
||||
@@ -315,7 +315,7 @@
|
||||
if (getFireLoss() > 0 || getToxLoss() > 0)
|
||||
if(src == user)
|
||||
to_chat(user, "<span class='notice'>You start fixing yourself...</span>")
|
||||
if(!W.use_tool(src, user, 50, 1, max_level = JOB_SKILL_TRAINED))
|
||||
if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
|
||||
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
|
||||
return
|
||||
adjustFireLoss(-10)
|
||||
|
||||
@@ -227,7 +227,7 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
|
||||
var/obj/item/W = get_active_held_item()
|
||||
|
||||
if(istype(W))
|
||||
if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, TRUE))
|
||||
if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, FALSE, TRUE))
|
||||
return TRUE
|
||||
|
||||
if(!W)
|
||||
|
||||
@@ -186,9 +186,8 @@
|
||||
GLOBAL_LIST_EMPTY(employmentCabinets)
|
||||
|
||||
/obj/structure/filingcabinet/employment
|
||||
var/cooldown = 0
|
||||
icon_state = "employmentcabinet"
|
||||
var/virgin = 1
|
||||
var/virgin = TRUE
|
||||
|
||||
/obj/structure/filingcabinet/employment/Initialize()
|
||||
. = ..()
|
||||
@@ -213,13 +212,12 @@ GLOBAL_LIST_EMPTY(employmentCabinets)
|
||||
new /obj/item/paper/contract/employment(src, employee)
|
||||
|
||||
/obj/structure/filingcabinet/employment/interact(mob/user)
|
||||
if(!cooldown)
|
||||
if(virgin)
|
||||
fillCurrent()
|
||||
virgin = 0
|
||||
cooldown = 1
|
||||
sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
|
||||
cooldown = 0
|
||||
else
|
||||
if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_EMPLOYMENT_CABINET))
|
||||
to_chat(user, "<span class='warning'>[src] is jammed, give it a few seconds.</span>")
|
||||
..()
|
||||
return ..()
|
||||
|
||||
TIMER_COOLDOWN_START(src, COOLDOWN_EMPLOYMENT_CABINET, 10 SECONDS) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win.
|
||||
if(virgin)
|
||||
fillCurrent()
|
||||
virgin = FALSE
|
||||
return ..()
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
if(W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_TRAINED))
|
||||
if(W.use_tool(src, user, 0, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
|
||||
icon_state = "[fixture_type]-construct-stage2"
|
||||
stage = 2
|
||||
user.visible_message("[user.name] adds wires to [src].", \
|
||||
|
||||
@@ -51,17 +51,3 @@
|
||||
desc = "A .50AE bullet casing."
|
||||
caliber = ".50"
|
||||
projectile_type = /obj/item/projectile/bullet/a50AE
|
||||
|
||||
// .32 ACP (Improvised Pistol)
|
||||
|
||||
/obj/item/ammo_casing/c32acp
|
||||
name = ".32 bullet casing"
|
||||
desc = "A .32 bullet casing."
|
||||
caliber = "c32acp"
|
||||
projectile_type = /obj/item/projectile/bullet/c32acp
|
||||
|
||||
/obj/item/ammo_casing/r32acp
|
||||
name = ".32 rubber bullet casing"
|
||||
desc = "A .32 rubber bullet casing."
|
||||
caliber = "c32acp"
|
||||
projectile_type = /obj/item/projectile/bullet/r32acp
|
||||
|
||||
@@ -12,15 +12,6 @@
|
||||
e_cost = 200
|
||||
select_name = "kill"
|
||||
|
||||
/obj/item/ammo_casing/energy/lasergun/improvised
|
||||
projectile_type = /obj/item/projectile/beam/weak/improvised
|
||||
e_cost = 200
|
||||
select_name = "kill"
|
||||
|
||||
/obj/item/ammo_casing/energy/lasergun/improvised/upgraded
|
||||
projectile_type = /obj/item/projectile/beam/weak
|
||||
e_cost = 100
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/hos
|
||||
e_cost = 100
|
||||
|
||||
|
||||
@@ -55,18 +55,6 @@
|
||||
desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with."
|
||||
ammo_type = /obj/item/ammo_casing/c38/match
|
||||
|
||||
/obj/item/ammo_box/c32mm
|
||||
name = "ammo box (.32 acp)"
|
||||
desc = "Lethal .32 acp bullets, there's forty in the box."
|
||||
ammo_type = /obj/item/ammo_casing/c32acp
|
||||
max_ammo = 40
|
||||
|
||||
/obj/item/ammo_box/r32mm
|
||||
name = "ammo box (rubber .32 acp)"
|
||||
desc = "Non-lethal .32 acp bullets, there's forty in the box."
|
||||
ammo_type = /obj/item/ammo_casing/r32acp
|
||||
max_ammo = 40
|
||||
|
||||
/obj/item/ammo_box/c9mm
|
||||
name = "ammo box (9mm)"
|
||||
icon_state = "9mmbox"
|
||||
|
||||
@@ -66,15 +66,3 @@
|
||||
caliber = ".50"
|
||||
max_ammo = 7
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_box/magazine/m32acp
|
||||
name = "pistol magazine (.32)"
|
||||
desc = "A crudely construction pistol magazine that holds .32 ACP rounds. It looks like it can only fit eight bullets."
|
||||
icon_state = "32acp"
|
||||
ammo_type = /obj/item/ammo_casing/c32acp
|
||||
caliber = "c32acp"
|
||||
max_ammo = 8
|
||||
multiple_sprites = 2
|
||||
|
||||
/obj/item/ammo_box/magazine/m32acp/empty
|
||||
start_empty = 1
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
|
||||
/obj/item/gun/ballistic/bow/pipe
|
||||
name = "pipe bow"
|
||||
desc = "Some sort of pipe made projectile weapon made of a durathread string and lots of bending. Used to fire arrows."
|
||||
desc = "Some sort of pipe-based projectile weapon made of string and lots of bending. Used to fire arrows."
|
||||
icon_state = "pipebow"
|
||||
item_state = "pipebow"
|
||||
force = 0
|
||||
force = 2
|
||||
|
||||
@@ -156,19 +156,3 @@
|
||||
name = "Syndicate Anti Tank Pistol"
|
||||
desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing."
|
||||
pin = /obj/item/firing_pin/implant/pindicate
|
||||
|
||||
////////////Improvised Pistol////////////
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/improvised
|
||||
name = "Improvised Pistol"
|
||||
desc = "An improvised pocket-sized pistol that fires .32 calibre rounds. It looks incredibly flimsy."
|
||||
icon_state = "ipistol"
|
||||
item_state = "pistol"
|
||||
mag_type = /obj/item/ammo_box/magazine/m32acp
|
||||
fire_delay = 7.5
|
||||
can_suppress = FALSE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
spread = 15 // Keep the spread between 15 and 20. This hardlocks it into being a mid-range pistol, the magazine size means you're allowed to miss. Fills the mid-range niche that slugs/rifle and buckshot doesn't fill.
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/improvised/nomag
|
||||
spawnwithmagazine = FALSE // For crafting as you shouldn't get eight bullets for free otherwise people will reaper reload.
|
||||
|
||||
@@ -319,11 +319,11 @@
|
||||
|
||||
/obj/item/gun/ballistic/revolver/doublebarrel/improvised
|
||||
name = "improvised shotgun"
|
||||
desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction will probably result in it hurting people less than a normal shotgun."
|
||||
desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction shows in its lesser effectiveness."
|
||||
icon_state = "ishotgun"
|
||||
item_state = "shotgun"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
weapon_weight = WEAPON_MEDIUM
|
||||
weapon_weight = WEAPON_MEDIUM // prevents shooting 2 at once, but doesn't require 2 hands
|
||||
force = 10
|
||||
slot_flags = null
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised
|
||||
@@ -331,12 +331,11 @@
|
||||
unique_reskin = null
|
||||
projectile_damage_multiplier = 0.9
|
||||
var/slung = FALSE
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
|
||||
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
|
||||
if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC))
|
||||
if(A.use_tool(src, user, 0, 10, skill_gain_mult = EASY_USE_TOOL_MULT))
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
to_chat(user, "<span class='notice'>You tie the lengths of cable to the shotgun, making a sling.</span>")
|
||||
slung = TRUE
|
||||
@@ -358,7 +357,7 @@
|
||||
|
||||
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawn
|
||||
name = "sawn-off improvised shotgun"
|
||||
desc = "The barrel and stock have been sawn and filed down; it can fit in backpacks. You still need two hands to fire this, if you value unbroken wrists."
|
||||
desc = "The barrel and stock have been sawn and filed down; it can fit in backpacks. You wont want to shoot two of these at once if you value your wrists."
|
||||
icon_state = "ishotgun"
|
||||
item_state = "gun"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
/obj/item/gun/ballistic/shotgun/boltaction/improvised/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
|
||||
if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC))
|
||||
if(A.use_tool(src, user, 0, 10, skill_gain_mult = EASY_USE_TOOL_MULT))
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
to_chat(user, "<span class='notice'>You tie the lengths of cable to the rifle, making a sling.</span>")
|
||||
slung = TRUE
|
||||
|
||||
@@ -240,20 +240,3 @@
|
||||
chambered.BB.damage *= 5
|
||||
|
||||
process_fire(target, user, TRUE, params)
|
||||
|
||||
////////////////
|
||||
// IMPROVISED //
|
||||
////////////////
|
||||
|
||||
/obj/item/gun/energy/e_gun/old/improvised
|
||||
name = "improvised energy rifle"
|
||||
desc = "A crude imitation of an energy gun. It works, however the beams are poorly focused and most of the energy is wasted before it reaches the target. Welp, it still burns things."
|
||||
icon_state = "improvised"
|
||||
ammo_x_offset = 1
|
||||
shaded_charge = 1
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised)
|
||||
|
||||
/obj/item/gun/energy/e_gun/old/improvised/upgraded
|
||||
name = "makeshift energy rifle"
|
||||
desc = "The new lens and upgraded parts gives this a higher capacity and more energy output, however, the shoddy construction still leaves it inferior to Nanotrasen's own energy weapons."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised/upgraded)
|
||||
|
||||
@@ -39,9 +39,6 @@
|
||||
/obj/item/projectile/beam/weak
|
||||
damage = 15
|
||||
|
||||
/obj/item/projectile/beam/weak/improvised
|
||||
damage = 10
|
||||
|
||||
/obj/item/projectile/beam/weak/penetrator
|
||||
armour_penetration = 50
|
||||
|
||||
|
||||
@@ -48,15 +48,3 @@
|
||||
L.Sleeping(300)
|
||||
else
|
||||
L.adjustStaminaLoss(25)
|
||||
|
||||
// .32 ACP (Improvised Pistol)
|
||||
|
||||
/obj/item/projectile/bullet/c32acp
|
||||
name = ".32 bullet"
|
||||
damage = 13
|
||||
|
||||
/obj/item/projectile/bullet/r32acp
|
||||
name = ".32 rubber bullet"
|
||||
damage = 3
|
||||
eyeblur = 1
|
||||
stamina = 20
|
||||
|
||||
@@ -258,9 +258,9 @@
|
||||
var/amount = text2num(params["amount"])
|
||||
if(amount == null)
|
||||
amount = text2num(input(usr,
|
||||
"Max 10. Buffer content will be split evenly.",
|
||||
"Max 20. Buffer content will be split evenly.",
|
||||
"How many to make?", 1))
|
||||
amount = clamp(round(amount), 0, 10)
|
||||
amount = clamp(round(amount), 0, 20)
|
||||
if (amount <= 0)
|
||||
return FALSE
|
||||
// Get units per item
|
||||
|
||||
@@ -132,8 +132,8 @@
|
||||
"<span class='userdanger'>You're covered in boiling oil!</span>")
|
||||
M.emote("scream")
|
||||
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
|
||||
var/oil_damage = (holder.chem_temp / fry_temperature) * 0.33 //Damage taken per unit
|
||||
M.adjustFireLoss(min(35, oil_damage * reac_volume)) //Damage caps at 35
|
||||
var/oil_damage = max((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit
|
||||
M.adjustFireLoss(oil_damage * max(reac_volume,20)) //Damage caps at 20
|
||||
else
|
||||
..()
|
||||
return TRUE
|
||||
@@ -866,4 +866,4 @@
|
||||
taste_mult = 2
|
||||
taste_description = "fizzy sweetness"
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
|
||||
|
||||
@@ -71,7 +71,9 @@
|
||||
if(data["blood_DNA"])
|
||||
B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
|
||||
if(!B.blood_DNA["color"])
|
||||
B.blood_DNA["color"] = list(data["bloodcolor"])
|
||||
B.blood_DNA["color"] = data["bloodcolor"]
|
||||
else
|
||||
B.blood_DNA["color"] = BlendRGB(B.blood_DNA["color"], data["bloodcolor"])
|
||||
if(B.reagents)
|
||||
B.reagents.add_reagent(type, reac_volume)
|
||||
B.update_icon()
|
||||
|
||||
@@ -30,14 +30,6 @@
|
||||
build_path = /obj/item/ammo_box/c38
|
||||
category = list("initial", "Security")
|
||||
|
||||
/datum/design/r32acp
|
||||
name = "Rubber Pistol Bullet (.32)"
|
||||
id = "r32acp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/iron = 250)
|
||||
build_path = /obj/item/ammo_casing/r32acp
|
||||
category = list("initial", "Security")
|
||||
|
||||
/////////////////
|
||||
///Hacked Gear //
|
||||
/////////////////
|
||||
@@ -206,22 +198,3 @@
|
||||
build_path = /obj/item/clothing/head/foilhat
|
||||
category = list("hacked", "Misc")
|
||||
|
||||
/datum/design/c32acp
|
||||
name = "Pistol Bullet (.32)"
|
||||
id = "c32acp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/iron = 500)
|
||||
build_path = /obj/item/ammo_casing/c32acp
|
||||
category = list("hacked", "Security")
|
||||
|
||||
/////////////////
|
||||
// Magazines //
|
||||
/////////////////
|
||||
|
||||
/datum/design/m32acp
|
||||
name = "Empty .32 Magazine"
|
||||
id = "m32acp"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/iron = 10000)
|
||||
build_path = /obj/item/ammo_box/magazine/m32acp/empty
|
||||
category = list("hacked", "Security")
|
||||
|
||||
@@ -289,11 +289,3 @@
|
||||
materials = list(/datum/material/iron = 6500, /datum/material/glass = 50)
|
||||
build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly
|
||||
category = list("initial", "Misc")
|
||||
|
||||
/datum/design/focusing_lens
|
||||
name = "Makeshift Lens"
|
||||
id = "makeshift_lens"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/iron = 2000, /datum/material/glass = 4000)
|
||||
build_path = /obj/item/weaponcrafting/improvised_parts/makeshift_lens
|
||||
category = list("initial", "Misc")
|
||||
|
||||
@@ -158,11 +158,3 @@
|
||||
materials = list(/datum/material/iron = 150, /datum/material/glass = 150)
|
||||
build_path = /obj/item/geiger_counter
|
||||
category = list("initial", "Tools")
|
||||
|
||||
/datum/design/saw
|
||||
name = "Hand Saw"
|
||||
id = "handsaw"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(/datum/material/iron = 500)
|
||||
build_path = /obj/item/hatchet/saw
|
||||
category = list("initial", "Tools")
|
||||
|
||||
@@ -132,6 +132,7 @@
|
||||
"<span class='notice'>You extend [holder] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.</span>",
|
||||
"<span class='italics'>You hear a short mechanical noise.</span>")
|
||||
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/cyberimp/arm/ui_action_click()
|
||||
if(crit_fail || (organ_flags & ORGAN_FAILING) || (!holder && !contents.len))
|
||||
@@ -273,12 +274,29 @@
|
||||
desc = "A deployable riot shield to help deal with civil unrest."
|
||||
contents = newlist(/obj/item/shield/riot/implant)
|
||||
|
||||
/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I)
|
||||
/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I, silent = FALSE)
|
||||
if(I.obj_integrity == 0) //that's how the shield recharge works
|
||||
to_chat(owner, "<span class='warning'>[I] is still too unstable to extend. Give it some time!</span>")
|
||||
if(!silent)
|
||||
to_chat(owner, "<span class='warning'>[I] is still too unstable to extend. Give it some time!</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/cyberimp/arm/shield/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
|
||||
. = ..()
|
||||
if(.)
|
||||
RegisterSignal(M, COMSIG_LIVING_ACTIVE_BLOCK_START, .proc/on_signal)
|
||||
|
||||
/obj/item/organ/cyberimp/arm/shield/Remove(special = FALSE)
|
||||
UnregisterSignal(owner, COMSIG_LIVING_ACTIVE_BLOCK_START)
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/cyberimp/arm/shield/proc/on_signal(datum/source, obj/item/blocking_item, list/other_items)
|
||||
if(!blocking_item) //if they don't have something
|
||||
var/obj/item/shield/S = locate() in contents
|
||||
if(!Extend(S, TRUE))
|
||||
return
|
||||
other_items += S
|
||||
|
||||
/obj/item/organ/cyberimp/arm/shield/emag_act()
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
|
||||
Reference in New Issue
Block a user