mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-31 00:58:26 +01:00
Merge remote-tracking branch 'origin/upsteam-12-15-25-revert-unique-reskins'
# Conflicts: # _maps/bubber/automapper/templates/centcom/interlink_adminoffice.dmm # _maps/map_files/BoxStation/BoxStation.dmm # _maps/map_files/generic/CentCom_skyrat_z2.dmm # _maps/map_files/moonstation/moonstation.dmm # code/modules/holiday/holidays.dm
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
obj_flags = CAN_BE_HIT
|
||||
item_flags = NO_PIXEL_RANDOM_DROP
|
||||
custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 5)
|
||||
/// If the cutout is pushed over and has to be righted
|
||||
var/pushed_over = FALSE
|
||||
/// If the cutout actually appears as what it portray and not a discolored version
|
||||
|
||||
@@ -550,7 +550,7 @@
|
||||
if(isnull(registered_account) || registered_account.replaceable) //Same check we use when we check if we can assign an account
|
||||
context[SCREENTIP_CONTEXT_ALT_RMB] = "Assign account"
|
||||
else if(registered_account.account_balance > 0)
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw credits"
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = "Withdraw [MONEY_NAME]"
|
||||
if(trim && length(trim.honorifics))
|
||||
context[SCREENTIP_CONTEXT_CTRL_LMB] = "Toggle honorific"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
@@ -676,7 +676,7 @@
|
||||
var/money_added = mass_insert_money(money_contained, user)
|
||||
if(!money_added)
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
to_chat(user, span_notice("You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account."))
|
||||
to_chat(user, span_notice("You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of [MONEY_NAME] to the linked account."))
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
/// SKYRAT EDIT BEGINS - Trim Tokens - Proc defined in modular_skyrat/modules/trim_tokens/code/cards_id.dm
|
||||
else if(istype(tool, /obj/item/trim_token))
|
||||
@@ -708,13 +708,13 @@
|
||||
return FALSE
|
||||
registered_account.adjust_money(cash_money, "System: Deposit")
|
||||
SSblackbox.record_feedback("amount", "credits_inserted", cash_money)
|
||||
log_econ("[cash_money] credits were inserted into [src] owned by [src.registered_name]")
|
||||
log_econ("[cash_money] [MONEY_NAME] were inserted into [src] owned by [src.registered_name]")
|
||||
if(physical_currency)
|
||||
to_chat(user, span_notice("You stuff [money] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account."))
|
||||
to_chat(user, span_notice("You stuff [money] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] [MONEY_NAME] to the linked account."))
|
||||
else
|
||||
to_chat(user, span_notice("You insert [money] into [src], adding [cash_money] credits to the linked account."))
|
||||
to_chat(user, span_notice("You insert [money] into [src], adding [cash_money] [MONEY_NAME] to the linked account."))
|
||||
|
||||
to_chat(user, span_notice("The linked account now reports a balance of [registered_account.account_balance] cr."))
|
||||
to_chat(user, span_notice("The linked account now reports a balance of [registered_account.account_balance] [MONEY_SYMBOL]."))
|
||||
qdel(money)
|
||||
return TRUE
|
||||
|
||||
@@ -741,7 +741,7 @@
|
||||
|
||||
registered_account.adjust_money(total, "System: Deposit")
|
||||
SSblackbox.record_feedback("amount", "credits_inserted", total)
|
||||
log_econ("[total] credits were inserted into [src] owned by [src.registered_name]")
|
||||
log_econ("[total] [MONEY_NAME] were inserted into [src] owned by [src.registered_name]")
|
||||
QDEL_LIST(money)
|
||||
|
||||
return total
|
||||
@@ -777,7 +777,7 @@
|
||||
account.account_balance += old_account.account_balance
|
||||
account.bank_cards += src
|
||||
registered_account = account
|
||||
to_chat(user, span_notice("The provided account has been linked to this ID card. It contains [account.account_balance] credits."))
|
||||
to_chat(user, span_notice("The provided account has been linked to this ID card. It contains [account.account_balance] [MONEY_NAME]."))
|
||||
return TRUE
|
||||
|
||||
/obj/item/card/id/click_alt(mob/living/user)
|
||||
@@ -803,20 +803,20 @@
|
||||
if(choice == "Link Account")
|
||||
set_new_account(user)
|
||||
return CLICK_ACTION_SUCCESS
|
||||
var/amount_to_remove = tgui_input_number(user, "How much do you want to withdraw? (Max: [registered_account.account_balance] cr)", "Withdraw Funds", max_value = registered_account.account_balance)
|
||||
var/amount_to_remove = tgui_input_number(user, "How much do you want to withdraw? (Max: [registered_account.account_balance] [MONEY_SYMBOL])", "Withdraw Funds", max_value = registered_account.account_balance)
|
||||
if(!amount_to_remove || QDELETED(user) || QDELETED(src) || issilicon(user) || loc != user)
|
||||
return CLICK_ACTION_BLOCKING
|
||||
if(!alt_click_can_use_id(user))
|
||||
return CLICK_ACTION_BLOCKING
|
||||
if(!registered_account.adjust_money(-amount_to_remove, "System: Withdrawal"))
|
||||
var/difference = amount_to_remove - registered_account.account_balance
|
||||
registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal."), TRUE)
|
||||
registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more [MONEY_NAME_AUTOPURAL(difference)] to perform that withdrawal."), TRUE)
|
||||
return CLICK_ACTION_BLOCKING
|
||||
var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove)
|
||||
user.put_in_hands(holochip)
|
||||
to_chat(user, span_notice("You withdraw [amount_to_remove] credits into a holochip."))
|
||||
to_chat(user, span_notice("You withdraw [amount_to_remove] [MONEY_NAME] into a holochip."))
|
||||
SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove)
|
||||
log_econ("[amount_to_remove] credits were removed from [src] owned by [registered_name]")
|
||||
log_econ("[amount_to_remove] [MONEY_NAME] were removed from [src] owned by [registered_name]")
|
||||
return CLICK_ACTION_SUCCESS
|
||||
|
||||
|
||||
@@ -827,15 +827,15 @@
|
||||
set_new_account(user)
|
||||
|
||||
/obj/item/card/id/proc/pay_debt(user)
|
||||
var/amount_to_pay = tgui_input_number(user, "How much do you want to pay? (Max: [registered_account.account_balance] cr)", "Debt Payment", max_value = min(registered_account.account_balance, registered_account.account_debt))
|
||||
var/amount_to_pay = tgui_input_number(user, "How much do you want to pay? (Max: [registered_account.account_balance] [MONEY_SYMBOL])", "Debt Payment", max_value = min(registered_account.account_balance, registered_account.account_debt))
|
||||
if(!amount_to_pay || QDELETED(src) || loc != user || !alt_click_can_use_id(user))
|
||||
return
|
||||
var/prev_debt = registered_account.account_debt
|
||||
var/amount_paid = registered_account.pay_debt(amount_to_pay)
|
||||
if(amount_paid)
|
||||
var/message = span_notice("You pay [amount_to_pay] credits of a [prev_debt] cr debt. [registered_account.account_debt] cr to go.")
|
||||
var/message = span_notice("You pay [amount_to_pay] [MONEY_NAME] of a [prev_debt] [MONEY_SYMBOL] debt. [registered_account.account_debt] [MONEY_SYMBOL] to go.")
|
||||
if(!registered_account.account_debt)
|
||||
message = span_nicegreen("You pay the last [amount_to_pay] credits of your debt, extinguishing it. Congratulations!")
|
||||
message = span_nicegreen("You pay the last [amount_to_pay] [MONEY_NAME] of your debt, extinguishing it. Congratulations!")
|
||||
to_chat(user, message)
|
||||
|
||||
/obj/item/card/id/examine(mob/user)
|
||||
@@ -844,10 +844,10 @@
|
||||
return
|
||||
|
||||
if(registered_account && !isnull(registered_account.account_id))
|
||||
. += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
|
||||
. += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] [MONEY_SYMBOL]."
|
||||
if(ACCESS_COMMAND in access)
|
||||
var/datum/bank_account/linked_dept = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department)
|
||||
. += "The [linked_dept.account_holder] linked to the ID reports a balance of [linked_dept.account_balance] cr."
|
||||
. += "The [linked_dept.account_holder] linked to the ID reports a balance of [linked_dept.account_balance] [MONEY_SYMBOL]."
|
||||
else
|
||||
. += span_notice("Alt-Right-Click the ID to set the linked bank account.")
|
||||
|
||||
@@ -887,15 +887,15 @@
|
||||
if(registered_account)
|
||||
if(registered_account.mining_points)
|
||||
. += "There's [registered_account.mining_points] mining point\s loaded onto the card's bank account."
|
||||
. += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
|
||||
. += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] [MONEY_SYMBOL]."
|
||||
if(registered_account.account_debt)
|
||||
. += span_warning("The account is currently indebted for [registered_account.account_debt] cr. [100*DEBT_COLLECTION_COEFF]% of all earnings will go towards extinguishing it.")
|
||||
. += span_warning("The account is currently indebted for [registered_account.account_debt] [MONEY_SYMBOL]. [100*DEBT_COLLECTION_COEFF]% of all earnings will go towards extinguishing it.")
|
||||
if(registered_account.account_job)
|
||||
var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department)
|
||||
if(D)
|
||||
. += "The [D.account_holder] reports a balance of [D.account_balance] cr."
|
||||
. += "The [D.account_holder] reports a balance of [D.account_balance] [MONEY_SYMBOL]."
|
||||
. += span_info("Alt-Click the ID to pull money from the linked account in the form of holochips.")
|
||||
. += span_info("You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.")
|
||||
. += span_info("You can insert [MONEY_NAME] into the linked account by pressing holochips, cash, or coins against the ID.")
|
||||
if(registered_account.replaceable)
|
||||
. += span_info("Alt-Right-Click the ID to change the linked bank account.")
|
||||
if(registered_account.civilian_bounty)
|
||||
@@ -2065,6 +2065,7 @@
|
||||
worn_icon_state = "nothing"
|
||||
resistance_flags = FLAMMABLE
|
||||
slot_flags = ITEM_SLOT_ID
|
||||
custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT)
|
||||
///The "name" of the "owner" of this "ID"
|
||||
var/scribbled_name
|
||||
///The assignment written on this card.
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
actions_types = list(/datum/action/item_action/startchainsaw)
|
||||
tool_behaviour = TOOL_SAW
|
||||
toolspeed = 1.5 //Turn it on first you dork
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 3)
|
||||
var/force_on = 24
|
||||
/// The looping sound for our chainsaw when running
|
||||
var/datum/looping_sound/chainsaw/chainsaw_loop
|
||||
|
||||
@@ -162,7 +162,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
name = "firebrand"
|
||||
desc = "An unlit firebrand. It makes you wonder why it's not just called a stick."
|
||||
smoketime = 40 SECONDS
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT)
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2)
|
||||
grind_results = list(/datum/reagent/carbon = 2)
|
||||
|
||||
/obj/item/match/firebrand/Initialize(mapload)
|
||||
@@ -174,6 +174,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
desc = "A budget lighter done by using a battery and some aluminium. Hold tightly to ignite."
|
||||
icon_state = "battery_unlit"
|
||||
base_icon_state = "battery"
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 7, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5)
|
||||
|
||||
/obj/item/match/battery/attack_self(mob/living/user, modifiers)
|
||||
. = ..()
|
||||
@@ -196,7 +197,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
throw_speed = 0.5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
slot_flags = ITEM_SLOT_MASK
|
||||
grind_results = list()
|
||||
heat = 1000
|
||||
light_range = 1
|
||||
light_color = LIGHT_COLOR_FIRE
|
||||
@@ -931,6 +931,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
list_reagents = null
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
choke_forever = TRUE
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2)
|
||||
///name of the stuff packed inside this pipe
|
||||
var/packeditem
|
||||
|
||||
@@ -1008,7 +1009,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
inhand_icon_on = null
|
||||
inhand_icon_off = null
|
||||
lung_harm = 2
|
||||
custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT)
|
||||
custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 3)
|
||||
|
||||
///////////
|
||||
//ROLLING//
|
||||
|
||||
@@ -429,12 +429,20 @@
|
||||
name = "R&D Console"
|
||||
greyscale_colors = CIRCUIT_COLOR_SCIENCE
|
||||
build_path = /obj/machinery/computer/rdconsole
|
||||
req_access = list(ACCESS_RESEARCH) // Research access is required to toggle the lock.
|
||||
|
||||
var/silence_announcements = FALSE
|
||||
var/locked = TRUE
|
||||
|
||||
// An unlocked subtype of the board for mapping.
|
||||
/obj/item/circuitboard/computer/rdconsole/unlocked
|
||||
locked = FALSE
|
||||
|
||||
/obj/item/circuitboard/computer/rdconsole/examine(mob/user)
|
||||
. = ..()
|
||||
. += span_info("The board is configured to [silence_announcements ? "silence" : "announce"] researched nodes on radio.")
|
||||
. += span_notice("The board mode can be changed with a [EXAMINE_HINT("multitool")].")
|
||||
. += span_notice("The board is [locked ? "locked" : "unlocked"], and can be [locked ? "unlocked" : "locked"] with an ID that has research access.")
|
||||
|
||||
/obj/item/circuitboard/computer/rdconsole/multitool_act(mob/living/user)
|
||||
. = ..()
|
||||
@@ -445,6 +453,10 @@
|
||||
balloon_alert(user, "announcements [silence_announcements ? "enabled" : "disabled"]")
|
||||
|
||||
/obj/item/circuitboard/computer/rdconsole/emag_act(mob/user, obj/item/card/emag/emag_card)
|
||||
if (locked)
|
||||
locked = FALSE
|
||||
to_chat(user, span_notice("You magnetically trigger the locking mechanism, causing it to unlock."))
|
||||
|
||||
if (obj_flags & EMAGGED)
|
||||
return FALSE
|
||||
|
||||
@@ -453,6 +465,20 @@
|
||||
to_chat(user, span_notice("You overload the node announcement chip, forcing every node to be announced on the common channel."))
|
||||
return TRUE
|
||||
|
||||
/obj/item/circuitboard/computer/rdconsole/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
|
||||
if (user.combat_mode || !isidcard(attacking_item))
|
||||
return ..()
|
||||
if (check_access(attacking_item))
|
||||
locked = !locked
|
||||
balloon_alert(user, locked ? "locked" : "unlocked")
|
||||
user.visible_message(
|
||||
message = span_notice("\The [user] unlock[user.p_s()] \the [src] with \the [attacking_item]."),
|
||||
self_message = span_notice("You unlock \the [src] with \the [attacking_item]."),
|
||||
blind_message = span_hear("You hear a soft beep."),
|
||||
)
|
||||
else
|
||||
balloon_alert(user, "no access!")
|
||||
|
||||
/obj/item/circuitboard/computer/rdservercontrol
|
||||
name = "R&D Server Control"
|
||||
greyscale_colors = CIRCUIT_COLOR_SCIENCE
|
||||
|
||||
@@ -229,6 +229,7 @@
|
||||
inhand_icon_state = "gold_horn"
|
||||
worn_icon_state = "horn_gold"
|
||||
COOLDOWN_DECLARE(golden_horn_cooldown)
|
||||
custom_materials = list(/datum/material/bananium = SHEET_MATERIAL_AMOUNT * 5)
|
||||
|
||||
/obj/item/bikehorn/golden/attack()
|
||||
flip_mobs()
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
attack_verb_continuous = list("attacks", "colours")
|
||||
attack_verb_simple = list("attack", "colour")
|
||||
grind_results = list()
|
||||
interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY
|
||||
|
||||
/// Icon state to use when capped
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
if(!credits && amount)
|
||||
credits = amount
|
||||
if(credits <= 0 && !mapload)
|
||||
stack_trace("Holochip created with 0 or less credits in [get_area_name(src)]!")
|
||||
stack_trace("Holochip created with 0 or less [MONEY_NAME] in [get_area_name(src)]!")
|
||||
return INITIALIZE_HINT_QDEL
|
||||
add_traits(list(TRAIT_FISHING_BAIT, TRAIT_BAIT_ALLOW_FISHING_DUD), INNATE_TRAIT)
|
||||
update_appearance()
|
||||
@@ -24,20 +24,20 @@
|
||||
|
||||
/obj/item/holochip/examine(mob/user)
|
||||
. = ..()
|
||||
. += "[span_notice("It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]")]\n"+\
|
||||
. += "[span_notice("It's loaded with [credits] [MONEY_NAME_AUTOPURAL(credits)]")]\n"+\
|
||||
span_notice("Alt-Click to split.")
|
||||
|
||||
/obj/item/holochip/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
|
||||
if(istype(held_item, /obj/item/holochip))
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Merge Into"
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = "Extract Credits"
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = "Extract [MONEY_NAME_CAPITALIZED]"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
/obj/item/holochip/get_item_credit_value()
|
||||
return credits
|
||||
|
||||
/obj/item/holochip/update_name()
|
||||
name = "\improper [credits] credit holochip"
|
||||
name = "\improper [credits] [MONEY_NAME_SINGULAR] holochip"
|
||||
return ..()
|
||||
|
||||
/obj/item/holochip/update_icon_state()
|
||||
@@ -117,7 +117,7 @@
|
||||
if(loc != user)
|
||||
to_chat(user, span_warning("You must be holding the holochip to continue!"))
|
||||
return CLICK_ACTION_BLOCKING
|
||||
var/split_amount = tgui_input_number(user, "How many credits do you want to extract from the holochip? (Max: [credits] cr)", "Holochip", max_value = credits)
|
||||
var/split_amount = tgui_input_number(user, "How many [MONEY_NAME] do you want to extract from the holochip? (Max: [credits] [MONEY_SYMBOL])", "Holochip", max_value = credits)
|
||||
if(!split_amount || QDELETED(user) || QDELETED(src) || issilicon(user) || !usr.can_perform_action(src, NEED_DEXTERITY|FORBID_TELEKINESIS_REACH) || loc != user)
|
||||
return CLICK_ACTION_BLOCKING
|
||||
var/new_credits = spend(split_amount, TRUE)
|
||||
@@ -126,7 +126,7 @@
|
||||
if(!user.put_in_hands(chip))
|
||||
chip.forceMove(user.drop_location())
|
||||
add_fingerprint(user)
|
||||
to_chat(user, span_notice("You extract [split_amount] credits into a new holochip."))
|
||||
to_chat(user, span_notice("You extract [split_amount] [MONEY_NAME] into a new holochip."))
|
||||
return CLICK_ACTION_SUCCESS
|
||||
|
||||
/obj/item/holochip/emp_act(severity)
|
||||
|
||||
@@ -121,17 +121,10 @@
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/defibrillator/attack_hand(mob/user, list/modifiers)
|
||||
if(loc == user)
|
||||
if(slot_flags & ITEM_SLOT_BACK)
|
||||
if(user.get_item_by_slot(ITEM_SLOT_BACK) == src)
|
||||
ui_action_click()
|
||||
else
|
||||
to_chat(user, span_warning("Put the defibrillator on your back first!"))
|
||||
|
||||
else if(slot_flags & ITEM_SLOT_BELT)
|
||||
if(user.get_item_by_slot(ITEM_SLOT_BELT) == src)
|
||||
ui_action_click()
|
||||
else
|
||||
to_chat(user, span_warning("Strap the defibrillator's belt on first!"))
|
||||
if(user.get_slot_by_item(src) & slot_flags)
|
||||
ui_action_click()
|
||||
else
|
||||
balloon_alert(user, "equip the unit first!")
|
||||
return
|
||||
else if(istype(loc, /obj/machinery/defibrillator_mount))
|
||||
ui_action_click() //checks for this are handled in defibrillator.mount.dm
|
||||
@@ -266,9 +259,10 @@
|
||||
desc = "A belt-equipped defibrillator that can be rapidly deployed."
|
||||
icon_state = "defibcompact"
|
||||
inhand_icon_state = null
|
||||
slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_SUITSTORE|ITEM_SLOT_DEX_STORAGE
|
||||
worn_icon = 'icons/mob/clothing/belt.dmi'
|
||||
worn_icon_state = "defibcompact"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
paddle_state = "defibcompact-paddles"
|
||||
powered_state = "defibcompact-powered"
|
||||
charge_state = "defibcompact-charge"
|
||||
@@ -280,6 +274,11 @@
|
||||
cell = new(src)
|
||||
update_power()
|
||||
|
||||
/obj/item/defibrillator/compact/loaded/cmo // subtype for the spy steal objective
|
||||
name = "chief medical officer's compact defibrillator"
|
||||
icon_state = "defibcmo"
|
||||
resistance_flags = INDESTRUCTIBLE // So no cheesy getting rid of like other steal/head items
|
||||
|
||||
/obj/item/defibrillator/compact/combat
|
||||
name = "combat defibrillator"
|
||||
desc = "A belt-equipped blood-red defibrillator. Can revive through thick clothing, has an experimental self-recharging battery, and can be utilized as a weapon via applying the paddles while in a combat stance."
|
||||
@@ -341,6 +340,7 @@
|
||||
. = ..()
|
||||
AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_BACK)
|
||||
AddComponent(/datum/component/two_handed, force_unwielded=8, force_wielded=12)
|
||||
RegisterSignal(src, COMSIG_HUMAN_NON_STORAGE_HOTKEY, PROC_REF(on_non_storage_hotkey))
|
||||
|
||||
/obj/item/shockpaddles/Destroy()
|
||||
defib = null
|
||||
@@ -703,6 +703,13 @@
|
||||
/obj/item/shockpaddles/proc/is_wielded()
|
||||
return HAS_TRAIT(src, TRAIT_WIELDED)
|
||||
|
||||
/obj/item/shockpaddles/proc/on_non_storage_hotkey(datum/source, mob/living/carbon/human/user, obj/item/possible_storage)
|
||||
SIGNAL_HANDLER
|
||||
if(possible_storage == defib)
|
||||
user.dropItemToGround(src)
|
||||
return COMPONENT_STORAGE_HOTKEY_HANDLED
|
||||
return NONE
|
||||
|
||||
/obj/item/shockpaddles/cyborg
|
||||
name = "cyborg defibrillator paddles"
|
||||
icon = 'icons/obj/medical/defib.dmi'
|
||||
|
||||
@@ -35,12 +35,14 @@
|
||||
desc = "A stylish upgrade (?) to the intelliCard."
|
||||
icon_state = "aitater"
|
||||
base_icon_state = "aitater"
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5)
|
||||
|
||||
/obj/item/aicard/aispook
|
||||
name = "intelliLantern"
|
||||
desc = "A spoOoOoky upgrade to the intelliCard."
|
||||
icon_state = "aispook"
|
||||
base_icon_state = "aispook"
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5)
|
||||
|
||||
/obj/item/aicard/suicide_act(mob/living/user)
|
||||
user.visible_message(span_suicide("[user] is trying to upload [user.p_them()]self into [src]! That's not going to work out well!"))
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
// Transfer the AI from the core we created into the card, then delete the core
|
||||
capture_ai(new_ai, user)
|
||||
var/obj/structure/ai_core/deactivated/detritus = locate() in get_turf(src)
|
||||
var/obj/structure/ai_core/detritus = locate() in get_turf(src)
|
||||
qdel(detritus)
|
||||
AI.set_control_disabled(FALSE)
|
||||
AI.radio_enabled = TRUE
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
icon_state = "pressureplate"
|
||||
layer = ABOVE_OPEN_TURF_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.75, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7)
|
||||
var/trigger_mob = TRUE
|
||||
var/trigger_item = FALSE
|
||||
var/specific_item = null
|
||||
|
||||
@@ -274,12 +274,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
|
||||
/obj/item/radio/headset/heads
|
||||
command = TRUE
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
|
||||
/obj/item/radio/headset/heads/captain
|
||||
name = "\proper the captain's headset"
|
||||
desc = "The headset of the king."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/captain
|
||||
|
||||
/obj/item/radio/headset/heads/captain/alt
|
||||
@@ -295,22 +295,16 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
/obj/item/radio/headset/heads/rd
|
||||
name = "\proper the research director's headset"
|
||||
desc = "Headset of the fellow who keeps society marching towards technological singularity."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/rd
|
||||
|
||||
/obj/item/radio/headset/heads/hos
|
||||
name = "\proper the head of security's headset"
|
||||
desc = "The headset of the man in charge of keeping order and protecting the station."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/hos
|
||||
|
||||
/obj/item/radio/headset/heads/hos/advisor
|
||||
name = "\proper the veteran security advisor headset"
|
||||
desc = "The headset of the man who was in charge of keeping order and protecting the station..."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/hos
|
||||
command = FALSE
|
||||
|
||||
@@ -327,29 +321,21 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
/obj/item/radio/headset/heads/ce
|
||||
name = "\proper the chief engineer's headset"
|
||||
desc = "The headset of the guy in charge of keeping the station powered and undamaged."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/ce
|
||||
|
||||
/obj/item/radio/headset/heads/cmo
|
||||
name = "\proper the chief medical officer's headset"
|
||||
desc = "The headset of the highly trained medical chief."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/cmo
|
||||
|
||||
/obj/item/radio/headset/heads/hop
|
||||
name = "\proper the head of personnel's headset"
|
||||
desc = "The headset of the guy who will one day be captain."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/hop
|
||||
|
||||
/obj/item/radio/headset/heads/qm
|
||||
name = "\proper the quartermaster's headset"
|
||||
desc = "The headset of the guy who runs the cargo department."
|
||||
icon_state = "com_headset"
|
||||
worn_icon_state = "com_headset"
|
||||
keyslot = /obj/item/encryptionkey/heads/qm
|
||||
|
||||
/obj/item/radio/headset/headset_cargo
|
||||
@@ -475,26 +461,24 @@ GLOBAL_LIST_INIT(channel_tokens, list(
|
||||
return TRUE
|
||||
|
||||
/obj/item/radio/headset/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
|
||||
if(istype(W, /obj/item/encryptionkey))
|
||||
if(keyslot && keyslot2)
|
||||
to_chat(user, span_warning("The headset can't hold another key!"))
|
||||
return
|
||||
|
||||
if(!keyslot)
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
keyslot = W
|
||||
|
||||
else
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
keyslot2 = W
|
||||
|
||||
|
||||
recalculateChannels()
|
||||
else
|
||||
if(!istype(W, /obj/item/encryptionkey))
|
||||
return ..()
|
||||
|
||||
if(keyslot && keyslot2)
|
||||
to_chat(user, span_warning("The headset can't hold another key!"))
|
||||
return
|
||||
|
||||
if(!keyslot)
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
keyslot = W
|
||||
else
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
keyslot2 = W
|
||||
|
||||
recalculateChannels()
|
||||
|
||||
/obj/item/radio/headset/recalculateChannels()
|
||||
. = ..()
|
||||
if(keyslot2)
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
icon_state = "intercom"
|
||||
result_path = /obj/item/radio/intercom/unscrewed
|
||||
pixel_shift = 26
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.75, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.25)
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2)
|
||||
|
||||
MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 27)
|
||||
|
||||
@@ -231,8 +231,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 27)
|
||||
desc = "A custom-made Syndicate-issue intercom used to transmit on all Nanotrasen frequencies. Particularly expensive."
|
||||
freerange = TRUE
|
||||
|
||||
/obj/item/radio/intercom/mi13
|
||||
name = "intercom"
|
||||
desc = "Talk through this to talk to whoever is in this facility with you."
|
||||
freerange = TRUE
|
||||
|
||||
MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/prison, 27)
|
||||
MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/chapel, 27)
|
||||
MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/command, 27)
|
||||
MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/syndicate, 27)
|
||||
MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/syndicate/freerange, 27)
|
||||
MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom/mi13, 27)
|
||||
|
||||
@@ -17,3 +17,7 @@
|
||||
|
||||
/obj/item/sensor_device/attack_self(mob/user)
|
||||
GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it
|
||||
|
||||
/obj/item/sensor_device/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/drag_to_activate)
|
||||
|
||||
@@ -404,6 +404,7 @@ effective or pretty fucking useless.
|
||||
desc = "A jury-rigged device that disrupts nearby radio communication. Its crude construction provides a significantly smaller area of effect compared to its Syndicate counterpart."
|
||||
range = 5
|
||||
disruptor_range = 3
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5)
|
||||
|
||||
/obj/item/jammer/makeshift/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -74,7 +74,6 @@
|
||||
transfer_fingerprints_to(ampoule_shard)
|
||||
splash_reagents(hit_atom, throwingdatum?.get_thrower(), was_thrown = TRUE, allow_closed_splash = FALSE)
|
||||
qdel(src)
|
||||
hit_atom.Bumped(ampoule_shard)
|
||||
|
||||
/obj/item/reagent_containers/cup/blastoff_ampoule/Initialize(mapload, vol)
|
||||
. = ..()
|
||||
|
||||
@@ -63,7 +63,8 @@
|
||||
if(!user.can_perform_action(src, NEED_DEXTERITY))
|
||||
return
|
||||
|
||||
var/new_grad_color = input(user, "Choose a secondary hair color:", "Character Preference",human_target.grad_color) as color|null
|
||||
var/new_grad_color = input(user, "Choose a secondary hair color:", "Character Preference", human_target.get_hair_gradient_color()) as color|null
|
||||
|
||||
if(!new_grad_color || !user.can_perform_action(src, NEED_DEXTERITY) || !target.IsReachableBy(user))
|
||||
return
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
throwforce = 1
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 3
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.4)
|
||||
custom_materials = null
|
||||
max_water = 30
|
||||
sprite_name = "coolant"
|
||||
dog_fashion = null
|
||||
@@ -369,15 +369,19 @@
|
||||
reagents.clear_reagents()
|
||||
user.visible_message(span_notice("[user] empties out [src] onto the floor using the release valve."), span_info("You quietly empty out [src] using its release valve."))
|
||||
|
||||
//firebot assembly
|
||||
/obj/item/extinguisher/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers)
|
||||
if(istype(O, /obj/item/bodypart/arm/left/robot) || istype(O, /obj/item/bodypart/arm/right/robot))
|
||||
to_chat(user, span_notice("You add [O] to [src]."))
|
||||
qdel(O)
|
||||
qdel(src)
|
||||
user.put_in_hands(new /obj/item/bot_assembly/firebot)
|
||||
else
|
||||
..()
|
||||
// Firebot assembly
|
||||
/obj/item/extinguisher/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
|
||||
if (!istype(tool, /obj/item/bodypart/arm/left/robot) && !istype(tool, /obj/item/bodypart/arm/right/robot))
|
||||
return NONE
|
||||
|
||||
to_chat(user, span_notice("You add [tool] to [src]."))
|
||||
qdel(tool)
|
||||
var/obj/item/bot_assembly/firebot/assembly = new(drop_location())
|
||||
var/held_index = user.is_holding(src)
|
||||
qdel(src)
|
||||
if (held_index)
|
||||
user.put_in_hand(assembly, held_index)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
/obj/item/extinguisher/anti
|
||||
name = "fire extender"
|
||||
|
||||
@@ -69,6 +69,8 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
|
||||
return
|
||||
if(target.resistance_flags & INDESTRUCTIBLE)
|
||||
return
|
||||
if(QDELETED(target))
|
||||
return
|
||||
if(istype(target, /obj/structure/window) || istype(target, /obj/structure/grille))
|
||||
target.atom_destruction("fireaxe")
|
||||
|
||||
@@ -83,6 +85,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
|
||||
icon_angle = 180
|
||||
force_unwielded = 5
|
||||
force_wielded = 23
|
||||
custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 6)
|
||||
|
||||
/*
|
||||
* Metal Hydrogen Axe
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT * 0.5)
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.8)
|
||||
resistance_flags = FIRE_PROOF
|
||||
trigger_guard = TRIGGER_GUARD_NORMAL
|
||||
light_system = OVERLAY_LIGHT
|
||||
|
||||
@@ -103,6 +103,7 @@
|
||||
icon_state = "flatcart"
|
||||
density = TRUE
|
||||
opacity = FALSE
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 8, /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/structure/flatpack_cart/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
righthand_file = 'icons/mob/inhands/items/food_righthand.dmi'
|
||||
abstract_type = /obj/item/food
|
||||
obj_flags = UNIQUE_RENAME
|
||||
grind_results = list()
|
||||
material_flags = MATERIAL_NO_EDIBILITY
|
||||
/**
|
||||
* A list of material paths. the main material in the custom_materials list is also added on init.
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
tastes = list("cheese" = 4, "royalty" = 1)
|
||||
rat_heal = 70
|
||||
crafting_complexity = FOOD_COMPLEXITY_3
|
||||
custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 5)
|
||||
|
||||
//Curd cheese, a general term which I will now proceed to stretch as thin as the toppings on a supermarket sandwich:
|
||||
//I'll use it as a substitute for ricotta, cottage cheese and quark, as well as any other non-aged, soft grainy cheese
|
||||
|
||||
@@ -849,8 +849,7 @@
|
||||
|
||||
/obj/item/food/ink_sac/proc/blind_em(mob/living/victim, can_splat_on)
|
||||
if(can_splat_on)
|
||||
victim.adjust_temp_blindness_up_to(7 SECONDS, 10 SECONDS)
|
||||
victim.adjust_confusion_up_to(3.5 SECONDS, 6 SECONDS)
|
||||
victim.Paralyze(2 SECONDS) //splat!
|
||||
victim.adjust_temp_blindness_up_to(2.5 SECONDS, 3 SECONDS)
|
||||
victim.adjust_confusion_up_to(2.5 SECONDS, 3 SECONDS)
|
||||
victim.visible_message(span_warning("[victim] is inked by [src]!"), span_userdanger("You've been inked by [src]!"))
|
||||
playsound(victim, SFX_DESECRATION, 50, TRUE)
|
||||
|
||||
@@ -166,13 +166,11 @@
|
||||
splat_color = COLOR_NEARLY_ALL_BLACK, \
|
||||
hit_callback = CALLBACK(src, PROC_REF(blind_em)), \
|
||||
)
|
||||
ADD_TRAIT(src, TRAIT_UNCATCHABLE, INNATE_TRAIT) //good luck catching the liquid
|
||||
|
||||
/obj/item/food/canned/squid_ink/proc/blind_em(mob/living/victim, can_splat_on)
|
||||
if(can_splat_on)
|
||||
victim.adjust_temp_blindness_up_to(7 SECONDS, 10 SECONDS)
|
||||
victim.adjust_confusion_up_to(3.5 SECONDS, 6 SECONDS)
|
||||
victim.Paralyze(2 SECONDS) //splat!
|
||||
victim.adjust_temp_blindness_up_to(2.5 SECONDS, 3 SECONDS)
|
||||
victim.adjust_confusion_up_to(2.5 SECONDS, 3 SECONDS)
|
||||
victim.visible_message(span_warning("[victim] is inked by [src]!"), span_userdanger("You've been inked by [src]!"))
|
||||
playsound(victim, SFX_DESECRATION, 50, TRUE)
|
||||
|
||||
|
||||
@@ -270,6 +270,7 @@
|
||||
tastes = list("bread" = 1, "meat" = 1, "tomato sauce" = 1, "death" = 1)
|
||||
foodtypes = MEAT|VEGETABLES|GRAIN
|
||||
eat_time = 4 SECONDS // Makes it harder to force-feed this to people as a weapon, as funny as that is.
|
||||
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT * 2)
|
||||
var/static/list/correct_clothing = list(/obj/item/clothing/under/rank/civilian/cookjorts, /obj/item/clothing/under/shorts/jeanshorts)
|
||||
|
||||
/obj/item/food/sandwich/death/Initialize(mapload)
|
||||
|
||||
@@ -106,6 +106,8 @@
|
||||
/obj/item/gift/anything
|
||||
name = "christmas gift"
|
||||
desc = "It could be anything!"
|
||||
/// Weak reference to who this gift is for and who can open it, if that's nobody then anyone can
|
||||
var/datum/weakref/recipient_ref = null
|
||||
|
||||
/obj/item/gift/anything/get_gift_type()
|
||||
var/static/list/obj/item/possible_gifts = null
|
||||
@@ -115,3 +117,25 @@
|
||||
|
||||
var/gift_type = pick(possible_gifts)
|
||||
return gift_type
|
||||
|
||||
/obj/item/gift/anything/attack_self(mob/user)
|
||||
if (isnull(recipient_ref))
|
||||
return ..()
|
||||
|
||||
var/datum/mind/recipient = recipient_ref.resolve()
|
||||
if(recipient && recipient != user?.mind)
|
||||
to_chat(user, span_notice("This gift isn't for you, and you don't want to get on Santa's bad side!"))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/// Assign the mind of someone as the person this gift is for
|
||||
/obj/item/gift/anything/proc/assign_recipient(datum/mind/recipient)
|
||||
if (ismob(recipient)) // You're presumably at this point because you are an admin who fucked up but I will save you
|
||||
var/mob/recipient_mob = recipient
|
||||
recipient = recipient_mob.mind
|
||||
|
||||
if (isnull(recipient))
|
||||
return
|
||||
|
||||
name = "[initial(name)] for [recipient.name] ([recipient.assigned_role.title])"
|
||||
recipient_ref = WEAKREF(recipient)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
inhand_icon_state = "flashbang"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 2
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT)
|
||||
/// Which stage of construction this grenade is currently at.
|
||||
var/stage = GRENADE_EMPTY
|
||||
/// The set of reagent containers that have been added to this grenade casing.
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
shrapnel_type = /obj/projectile/bullet/shrapnel/ied
|
||||
det_time = 225 SECONDS //this is handled by assemblies now
|
||||
display_timer = FALSE
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.65, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2)
|
||||
/// Explosive power
|
||||
var/power = 5
|
||||
/// Our assembly that when activated causes us to explode
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
drop_sound = 'sound/items/handling/ammobox_drop.ogg'
|
||||
pickup_sound = 'sound/items/handling/ammobox_pickup.ogg'
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6)
|
||||
/// How many times we can use this maintenance kit to maintain a gun
|
||||
var/uses = 3
|
||||
/// THe maximum uses, used for our examine text.
|
||||
|
||||
@@ -209,7 +209,7 @@
|
||||
var/cable_color = CABLE_COLOR_RED
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.75)
|
||||
custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5)
|
||||
breakouttime = 30 SECONDS
|
||||
cuffsound = 'sound/items/weapons/cablecuff.ogg'
|
||||
pickup_sound = null
|
||||
@@ -573,6 +573,7 @@
|
||||
righthand_file = 'icons/mob/inhands/weapons/thrown_righthand.dmi'
|
||||
breakouttime = 3.5 SECONDS//easy to apply, easy to break out of
|
||||
gender = NEUTER
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5)
|
||||
///Amount of time to knock the target down for once it's hit in deciseconds.
|
||||
var/knockdown = 0
|
||||
///Reference of the mob we will attempt to snare
|
||||
@@ -625,6 +626,7 @@
|
||||
inhand_icon_state = "bola_r"
|
||||
breakouttime = 7 SECONDS
|
||||
knockdown = 3.5 SECONDS
|
||||
custom_materials = list(/datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 6.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7)
|
||||
|
||||
/**
|
||||
* A security variant of the bola.
|
||||
@@ -640,6 +642,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
breakouttime = 6 SECONDS
|
||||
custom_price = PAYCHECK_COMMAND * 0.35
|
||||
custom_materials = null
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -336,6 +336,7 @@
|
||||
icon_state = "bananium_inspector"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
max_mode = BANANIUM_CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST
|
||||
custom_materials = list(/datum/material/bananium = SHEET_MATERIAL_AMOUNT * 5)
|
||||
///How many more times can we print?
|
||||
var/paper_charges = 32
|
||||
///Max value of paper_charges
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
/obj/item/knife/kitchen/silicon/examine()
|
||||
. = ..()
|
||||
. += " It's fitted with a [tool_behaviour] head."
|
||||
. += "It's fitted with a [tool_behaviour] head."
|
||||
|
||||
/obj/item/knife/kitchen/silicon/attack_self(mob/user)
|
||||
playsound(get_turf(user), 'sound/items/tools/change_drill.ogg', 50, TRUE)
|
||||
@@ -167,7 +167,7 @@
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.5)
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 2)
|
||||
resistance_flags = FLAMMABLE
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb_continuous = list("bashes", "batters", "bludgeons", "thrashes", "whacks")
|
||||
|
||||
@@ -217,7 +217,7 @@
|
||||
obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY
|
||||
force = 15
|
||||
throwforce = 15
|
||||
custom_materials = null
|
||||
custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2)
|
||||
|
||||
/datum/embedding/combat_knife/weak
|
||||
embed_chance = 35
|
||||
@@ -245,7 +245,7 @@
|
||||
attack_verb_continuous = list("shanks", "shivs")
|
||||
attack_verb_simple = list("shank", "shiv")
|
||||
armor_type = /datum/armor/none
|
||||
custom_materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT * 4)
|
||||
custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/knife/shiv/make_stabby()
|
||||
AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -3)
|
||||
@@ -258,7 +258,7 @@
|
||||
force = 9
|
||||
throwforce = 13
|
||||
armor_type = /datum/armor/shiv_plasma
|
||||
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT *4, /datum/material/plasma=SMALL_MATERIAL_AMOUNT * 2)
|
||||
custom_materials = list(/datum/material/alloy/plasmaglass = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/datum/armor/shiv_plasma
|
||||
melee = 25
|
||||
@@ -278,7 +278,7 @@
|
||||
throw_range = 7
|
||||
wound_bonus = 10
|
||||
armor_type = /datum/armor/shiv_titanium
|
||||
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT * 4, /datum/material/titanium=SMALL_MATERIAL_AMOUNT * 2)
|
||||
custom_materials = list(/datum/material/alloy/titaniumglass = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/datum/armor/shiv_titanium
|
||||
melee = 25
|
||||
@@ -301,7 +301,7 @@
|
||||
wound_bonus = 10
|
||||
exposed_wound_bonus = 20
|
||||
armor_type = /datum/armor/shiv_plastitanium
|
||||
custom_materials = list(/datum/material/glass= SMALL_MATERIAL_AMOUNT * 4, /datum/material/alloy/plastitanium= SMALL_MATERIAL_AMOUNT * 2)
|
||||
custom_materials = list(/datum/material/alloy/plastitaniumglass = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/datum/armor/shiv_plastitanium
|
||||
melee = 50
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 1
|
||||
throw_range = 7
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.2, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.2)
|
||||
var/state = DEFLATED
|
||||
var/datum/gas_mixture/air_contents = null
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
|
||||
// This is where stun gets applied
|
||||
/obj/item/melee/baton/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
|
||||
if(!isliving(target) || !active || !COOLDOWN_FINISHED(src, cooldown_check) || HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user)))
|
||||
if(!isliving(target) || !active || !COOLDOWN_FINISHED(src, cooldown_check) || HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user)) || QDELETED(target))
|
||||
return
|
||||
// worst check in the chain but - right click = harmbaton
|
||||
if(LAZYACCESS(modifiers, RIGHT_CLICK) && !stun_on_harmbaton)
|
||||
@@ -764,6 +764,20 @@
|
||||
/obj/item/melee/baton/security/loaded/hos
|
||||
preload_cell_type = /obj/item/stock_parts/power_store/cell/super
|
||||
|
||||
// Stunsword Skins
|
||||
/datum/atom_skin/stunsword
|
||||
abstract_type = /datum/atom_skin/stunsword
|
||||
change_inhand_icon_state = TRUE
|
||||
change_base_icon_state = TRUE
|
||||
|
||||
/datum/atom_skin/stunsword/default
|
||||
preview_name = "Default"
|
||||
new_icon_state = "stunsword"
|
||||
|
||||
/datum/atom_skin/stunsword/energy
|
||||
preview_name = "Energy"
|
||||
new_icon_state = "stunsword_energy"
|
||||
|
||||
///Stun Sword
|
||||
/obj/item/melee/baton/security/stunsword
|
||||
name = "\improper NT-20 'Excalibur' Stunsword"
|
||||
@@ -789,14 +803,12 @@
|
||||
convertible = FALSE
|
||||
|
||||
obj_flags = UNIQUE_RENAME
|
||||
unique_reskin = list(
|
||||
"Default" = "stunsword",
|
||||
"Energy Stunsword" = "stunsword_energy",
|
||||
)
|
||||
unique_reskin_changes_inhand = TRUE
|
||||
unique_reskin_changes_base_icon_state = TRUE
|
||||
|
||||
/obj/item/melee/baton/security/stunsword/loaded/add_deep_lore()
|
||||
/obj/item/melee/baton/security/stunsword/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/reskinable_item, /datum/atom_skin/stunsword)
|
||||
|
||||
/obj/item/melee/baton/security/stunsword/add_deep_lore()
|
||||
return
|
||||
|
||||
/obj/item/melee/baton/security/stunsword/loaded
|
||||
@@ -824,6 +836,7 @@
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
convertible = FALSE
|
||||
active_changes_inhand = FALSE
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.15, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2)
|
||||
var/obj/item/assembly/igniter/sparkler
|
||||
///Determines whether or not we can improve the cattleprod into a new type. Prevents turning the cattleprod subtypes into different subtypes, or wasting materials on making it....another version of itself.
|
||||
var/can_upgrade = TRUE
|
||||
@@ -913,6 +926,7 @@
|
||||
inhand_icon_state = "teleprod"
|
||||
slot_flags = null
|
||||
can_upgrade = FALSE
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.15, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2)
|
||||
|
||||
/obj/item/melee/baton/security/cattleprod/teleprod/clumsy_check(mob/living/carbon/human/user)
|
||||
. = ..()
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
icon_state = "tailwhip"
|
||||
inhand_icon_state = "tailwhip"
|
||||
item_flags = NONE
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.1, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.1)
|
||||
|
||||
/obj/item/melee/chainofcommand/tailwhip/kitty
|
||||
name = "cat o' nine tails"
|
||||
|
||||
@@ -224,6 +224,9 @@
|
||||
if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
|
||||
return FALSE
|
||||
|
||||
if(attack_type == OVERWHELMING_ATTACK)
|
||||
return FALSE
|
||||
|
||||
if(attack_type == LEAP_ATTACK)
|
||||
final_block_chance -= 25 //OH GOD GET IT OFF ME
|
||||
|
||||
@@ -519,6 +522,12 @@
|
||||
if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
|
||||
return FALSE
|
||||
|
||||
if(attack_type == OVERWHELMING_ATTACK)
|
||||
return FALSE
|
||||
|
||||
if(attack_type == LEAP_ATTACK)
|
||||
final_block_chance -= 25
|
||||
|
||||
if(prob(final_block_chance) && charge)
|
||||
expend_charge(owner)
|
||||
return TRUE
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
INVOKE_ASYNC(baned_target, TYPE_PROC_REF(/mob/living/carbon/human, emote), "scream")
|
||||
|
||||
/obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK))
|
||||
if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK)
|
||||
final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you.
|
||||
return ..()
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
AddComponent(/datum/component/jousting)
|
||||
|
||||
/obj/item/melee/parsnip_sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK))
|
||||
if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK)
|
||||
final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you.
|
||||
return ..()
|
||||
|
||||
@@ -213,12 +213,12 @@
|
||||
block_sound = 'sound/items/weapons/parry.ogg'
|
||||
|
||||
/obj/item/melee/beesword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK))
|
||||
if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK)
|
||||
final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you.
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/beesword/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
|
||||
if(iscarbon(target))
|
||||
if(iscarbon(target) && !QDELETED(target))
|
||||
var/mob/living/carbon/carbon_target = target
|
||||
carbon_target.reagents.add_reagent(/datum/reagent/toxin, 4)
|
||||
|
||||
@@ -242,6 +242,7 @@
|
||||
armour_penetration = 1000
|
||||
force_string = "INFINITE"
|
||||
item_flags = NEEDS_PERMIT|NO_BLOOD_ON_ITEM
|
||||
custom_materials = list(/datum/material/adamantine = SHEET_MATERIAL_AMOUNT * 20, /datum/material/iron = SHEET_MATERIAL_AMOUNT)
|
||||
var/obj/machinery/power/supermatter_crystal/shard
|
||||
var/balanced = 1
|
||||
|
||||
@@ -542,7 +543,7 @@
|
||||
desc = "[initial(desc)] Its handle is made of [material.name]."
|
||||
|
||||
/obj/item/melee/cleric_mace/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK))
|
||||
if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK)
|
||||
final_block_chance = 0 //Don't bring a...mace to a gunfight, and also you aren't going to really block someone full body tackling you with a mace. Or a road roller, if one happened to hit you.
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -222,6 +222,7 @@ GLOBAL_LIST_EMPTY(sniffable_sheets)
|
||||
desc = "A handheld tracking device that locates sheets of glass and iron."
|
||||
icon_state = "pinpointer_sniffer"
|
||||
worn_icon_state = "pinpointer_black"
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.8, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.7)
|
||||
|
||||
/obj/item/pinpointer/material_sniffer/scan_for_target()
|
||||
if(target || !GLOB.sniffable_sheets.len)
|
||||
|
||||
+1
@@ -20,6 +20,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
|
||||
armor_type = /datum/armor/item_pneumatic_cannon
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 6)
|
||||
var/maxWeightClass = 20 //The max weight of items that can fit into the cannon
|
||||
var/loadedWeightClass = 0 //The weight of items currently in the cannon
|
||||
var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things
|
||||
@@ -68,9 +68,9 @@
|
||||
design_category = GLOB.rcd_designs[root_category][1]
|
||||
var/list/design = GLOB.rcd_designs[root_category][design_category][1]
|
||||
|
||||
rcd_design_path = design["[RCD_DESIGN_PATH]"]
|
||||
rcd_design_path = design[RCD_DESIGN_PATH]
|
||||
design_title = initial(rcd_design_path.name)
|
||||
mode = design["[RCD_DESIGN_MODE]"]
|
||||
mode = design[RCD_DESIGN_MODE]
|
||||
construction_mode = mode
|
||||
|
||||
GLOB.rcd_list += src
|
||||
@@ -138,8 +138,8 @@
|
||||
* * [mob][user]- the user
|
||||
*/
|
||||
/obj/item/construction/rcd/proc/can_place(atom/target, list/rcd_results, mob/user)
|
||||
var/rcd_mode = rcd_results["[RCD_DESIGN_MODE]"]
|
||||
var/atom/movable/rcd_structure = rcd_results["[RCD_DESIGN_PATH]"]
|
||||
var/rcd_mode = rcd_results[RCD_DESIGN_MODE]
|
||||
var/atom/movable/rcd_structure = rcd_results[RCD_DESIGN_PATH]
|
||||
/**
|
||||
*For anything that does not go an a wall we have to make sure that turf is clear for us to put the structure on it
|
||||
*If we are just trying to destroy something then this check is not necessary
|
||||
@@ -257,8 +257,8 @@
|
||||
balloon_alert(user, "too durable!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
|
||||
rcd_results["[RCD_DESIGN_MODE]"] = mode
|
||||
rcd_results["[RCD_DESIGN_PATH]"] = rcd_design_path
|
||||
rcd_results[RCD_DESIGN_MODE] = mode
|
||||
rcd_results[RCD_DESIGN_PATH] = rcd_design_path
|
||||
|
||||
var/delay = rcd_results["delay"] * delay_mod
|
||||
if (
|
||||
@@ -272,10 +272,10 @@
|
||||
|
||||
var/target_name = target.name //Store this information before it gets mutated by the rcd.
|
||||
var/target_path = target.type
|
||||
var/atom/design_path = rcd_results["[RCD_DESIGN_PATH]"]
|
||||
var/atom/design_path = rcd_results[RCD_DESIGN_PATH]
|
||||
var/location = AREACOORD(target)
|
||||
if(_rcd_create_effect(target, user, delay, rcd_results))
|
||||
log_tool("[key_name(user)] used [src] to [rcd_results["[RCD_DESIGN_MODE]"] != RCD_DECONSTRUCT ? "construct [initial(design_path.name)]([design_path])" : "deconstruct [target_name]([target_path])"] at [location]")
|
||||
log_tool("[key_name(user)] used [src] to [rcd_results[RCD_DESIGN_MODE] != RCD_DECONSTRUCT ? "construct [initial(design_path.name)]([design_path])" : "deconstruct [target_name]([target_path])"] at [location]")
|
||||
|
||||
current_active_effects -= 1
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
@@ -292,7 +292,7 @@
|
||||
/obj/item/construction/rcd/proc/_rcd_create_effect(atom/target, mob/user, delay, list/rcd_results)
|
||||
PRIVATE_PROC(TRUE)
|
||||
|
||||
var/obj/effect/constructing_effect/rcd_effect = new(get_turf(target), delay, rcd_results["[RCD_DESIGN_MODE]"], construction_upgrades)
|
||||
var/obj/effect/constructing_effect/rcd_effect = new(get_turf(target), delay, rcd_results[RCD_DESIGN_MODE], construction_upgrades)
|
||||
|
||||
//resource & structure placement sanity checks before & after delay along with beam effects
|
||||
if(!useResource(rcd_results["cost"], user, TRUE) || !can_place(target, rcd_results, user))
|
||||
@@ -421,9 +421,9 @@
|
||||
if(design == null) //not a valid design
|
||||
return TRUE
|
||||
design_category = category_name
|
||||
mode = design["[RCD_DESIGN_MODE]"]
|
||||
mode = design[RCD_DESIGN_MODE]
|
||||
construction_mode = mode
|
||||
rcd_design_path = design["[RCD_DESIGN_PATH]"]
|
||||
rcd_design_path = design[RCD_DESIGN_PATH]
|
||||
design_title = initial(rcd_design_path.name)
|
||||
blueprint_changed = TRUE
|
||||
|
||||
@@ -610,6 +610,23 @@
|
||||
return gundam.use_energy(amount * MASS_TO_ENERGY)
|
||||
return TRUE
|
||||
|
||||
/obj/item/construction/rcd/exosuit/detonate_pulse()
|
||||
var/obj/item/mecha_parts/mecha_equipment/rcd/ourshell = loc
|
||||
if(!istype(ourshell))
|
||||
return
|
||||
ourshell.audible_message(span_danger("<b>[ourshell] begins to vibrate and buzz loudly!</b>"), \
|
||||
span_danger("<b>[ourshell] begins vibrating violently!</b>"))
|
||||
// 5 seconds to get rid of it
|
||||
addtimer(CALLBACK(src, PROC_REF(detonate_pulse_explode)), 5 SECONDS)
|
||||
|
||||
/obj/item/construction/rcd/exosuit/detonate_pulse_explode()
|
||||
var/obj/item/mecha_parts/mecha_equipment/rcd/ourshell = loc
|
||||
explosion(ourshell, light_impact_range = 3, flame_range = 1, flash_range = 1)
|
||||
if(owner)
|
||||
ourshell.detach()
|
||||
qdel(ourshell)
|
||||
|
||||
|
||||
#undef MASS_TO_ENERGY
|
||||
|
||||
#undef FREQUENT_USE_DEBUFF_MULTIPLIER
|
||||
|
||||
@@ -324,6 +324,7 @@
|
||||
max_amount = 30
|
||||
name = "makeshift rapid pipe cleaner layer"
|
||||
ghetto = TRUE
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 15)
|
||||
|
||||
/obj/item/rcl/ghetto/update_icon_state()
|
||||
if(!loaded)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
attack_verb_simple = list("forcefully inspire", "violently encourage", "relentlessly galvanize")
|
||||
lefthand_file = 'icons/mob/inhands/equipment/banners_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi'
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT)
|
||||
var/inspiration_available = TRUE //If this banner can be used to inspire crew
|
||||
var/morale_time = 0
|
||||
var/morale_cooldown = 600 //How many deciseconds between uses
|
||||
|
||||
@@ -170,17 +170,16 @@
|
||||
if(istype(W, /obj/item/stack/sheet/iron))
|
||||
var/obj/item/stack/sheet/iron/M = W
|
||||
if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
|
||||
if (M.use(1))
|
||||
var/obj/item/bot_assembly/ed209/B = new
|
||||
B.forceMove(drop_location())
|
||||
to_chat(user, span_notice("You arm the robot frame."))
|
||||
var/holding_this = user.get_inactive_held_item() == src
|
||||
qdel(src)
|
||||
if (holding_this)
|
||||
user.put_in_inactive_hand(B)
|
||||
else
|
||||
if (!M.use(1))
|
||||
to_chat(user, span_warning("You need one sheet of iron to start building ED-209!"))
|
||||
return
|
||||
var/obj/item/bot_assembly/ed209/assembly = new(drop_location())
|
||||
to_chat(user, span_notice("You arm the robot frame."))
|
||||
var/held_index = user.is_holding(src)
|
||||
qdel(src)
|
||||
if (held_index)
|
||||
user.put_in_hand(assembly, held_index)
|
||||
|
||||
else if(istype(W, /obj/item/bodypart/leg/left/robot))
|
||||
if(l_leg)
|
||||
return
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
if(attack_type == LEAP_ATTACK)
|
||||
effective_block_chance = 100
|
||||
if(attack_type == OVERWHELMING_ATTACK)
|
||||
effective_block_chance -= 25
|
||||
effective_block_chance = 0
|
||||
final_block_chance = clamp(effective_block_chance, 0, 100)
|
||||
. = ..()
|
||||
if(.)
|
||||
@@ -117,7 +117,7 @@
|
||||
desc = "A medieval wooden buckler."
|
||||
icon_state = "buckler"
|
||||
inhand_icon_state = "buckler"
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 10)
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 20)
|
||||
resistance_flags = FLAMMABLE
|
||||
block_chance = 30
|
||||
max_integrity = 55
|
||||
@@ -131,6 +131,7 @@
|
||||
block_chance = 40
|
||||
max_integrity = 40
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
custom_materials = null
|
||||
|
||||
/obj/item/shield/kite
|
||||
name = "kite shield"
|
||||
@@ -167,7 +168,7 @@
|
||||
desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder, less so bullets and laser beams."
|
||||
icon_state = "riot"
|
||||
inhand_icon_state = "riot"
|
||||
custom_materials = list(/datum/material/glass= SHEET_MATERIAL_AMOUNT * 3.75, /datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT)
|
||||
custom_materials = list(/datum/material/glass= SHEET_MATERIAL_AMOUNT * 4.05, /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.8)
|
||||
transparent = TRUE
|
||||
max_integrity = 75
|
||||
shield_break_sound = 'sound/effects/glass/glassbr3.ogg'
|
||||
@@ -203,6 +204,7 @@
|
||||
icon_state = "flashshield"
|
||||
inhand_icon_state = "flashshield"
|
||||
var/obj/item/assembly/flash/handheld/embedded_flash = /obj/item/assembly/flash/handheld
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.1, /datum/material/glass= SHEET_MATERIAL_AMOUNT * 4.35)
|
||||
|
||||
/obj/item/shield/riot/flash/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -345,7 +347,7 @@
|
||||
|
||||
var/effective_block_chance = final_block_chance
|
||||
if(attack_type == OVERWHELMING_ATTACK)
|
||||
effective_block_chance -= 25
|
||||
effective_block_chance = 0
|
||||
|
||||
if(attack_type == PROJECTILE_ATTACK)
|
||||
var/obj/projectile/our_projectile = hitby
|
||||
@@ -479,7 +481,7 @@
|
||||
desc = "A crude shield made out of several sheets of iron taped together, not very durable."
|
||||
icon_state = "improvised"
|
||||
inhand_icon_state = "improvised"
|
||||
custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 2)
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10)
|
||||
max_integrity = 35
|
||||
shield_break_leftover = /obj/item/stack/rods/two
|
||||
armor_type = /datum/armor/item_shield/improvised
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "target_h"
|
||||
density = FALSE
|
||||
max_integrity = 1800
|
||||
item_flags = CAN_BE_HIT
|
||||
obj_flags = CAN_BE_HIT
|
||||
/// Lazylist to keep track of bullet-hole overlays.
|
||||
var/list/bullethole_overlays
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
attack_verb_continuous = list("bashes", "smacks")
|
||||
attack_verb_simple = list("bash", "smack")
|
||||
resistance_flags = FLAMMABLE
|
||||
|
||||
custom_materials = list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT * 2, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT)
|
||||
var/label = ""
|
||||
COOLDOWN_DECLARE(picket_sign_cooldown)
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb_continuous = list("smacks", "whacks", "slams", "smashes")
|
||||
attack_verb_simple = list("smack", "whack", "slam", "smash")
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10)
|
||||
///The vehicle counterpart for the board
|
||||
var/board_item_type = /obj/vehicle/ridden/scooter/skateboard
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
demolition_mod = 0.75 // Note: This is significant, as this needs to be low enough that any possible force adjustments from better spears does not go over airlock deflection. See AIRLOCK_DAMAGE_DEFLECTION_N.
|
||||
embed_type = /datum/embedding/spear
|
||||
armour_penetration = 5
|
||||
custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass= HALF_SHEET_MATERIAL_AMOUNT * 2)
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.65, /datum/material/glass= SHEET_MATERIAL_AMOUNT * 1.15)
|
||||
hitsound = 'sound/items/weapons/bladeslice.ogg'
|
||||
attack_verb_continuous = list("attacks", "pokes", "jabs", "tears", "lacerates", "gores")
|
||||
attack_verb_simple = list("attack", "poke", "jab", "tear", "lacerate", "gore")
|
||||
@@ -93,7 +93,6 @@
|
||||
if(/obj/item/shard/plasma)
|
||||
force = 11
|
||||
throwforce = 21
|
||||
custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT, /datum/material/alloy/plasmaglass= HALF_SHEET_MATERIAL_AMOUNT * 2)
|
||||
icon_prefix = "spearplasma"
|
||||
modify_max_integrity(220)
|
||||
wound_bonus = -10
|
||||
@@ -112,7 +111,6 @@
|
||||
throwforce = 22
|
||||
throw_range = 8
|
||||
throw_speed = 5
|
||||
custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT, /datum/material/alloy/titaniumglass= HALF_SHEET_MATERIAL_AMOUNT * 2)
|
||||
modify_max_integrity(230)
|
||||
wound_bonus = -5
|
||||
force_unwielded = 12
|
||||
@@ -132,7 +130,6 @@
|
||||
throwforce = 23
|
||||
throw_range = 9
|
||||
throw_speed = 5
|
||||
custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT, /datum/material/alloy/plastitaniumglass= HALF_SHEET_MATERIAL_AMOUNT * 2)
|
||||
modify_max_integrity(240)
|
||||
wound_bonus = 0
|
||||
exposed_wound_bonus = 20
|
||||
@@ -304,7 +301,7 @@
|
||||
icon_prefix = "bone_spear"
|
||||
throwforce = 22
|
||||
armour_penetration = 20 //Enhanced armor piercing
|
||||
custom_materials = list(/datum/material/bone = HALF_SHEET_MATERIAL_AMOUNT * 7)
|
||||
custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 4)
|
||||
force_unwielded = 12
|
||||
force_wielded = 20
|
||||
spear_leftovers = /obj/item/stack/sheet/bone
|
||||
@@ -320,7 +317,7 @@
|
||||
/*
|
||||
* Bamboo Spear
|
||||
*/
|
||||
/obj/item/spear/bamboospear //Blatant imitation of spear, but all natural. Also not valid for explosive modification.
|
||||
/obj/item/spear/bamboospear //Blatant imitation of spear, but all natural.
|
||||
icon_state = "bamboo_spear0"
|
||||
base_icon_state = "bamboo_spear0"
|
||||
icon_prefix = "bamboo_spear"
|
||||
@@ -328,7 +325,7 @@
|
||||
desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people."
|
||||
|
||||
throwforce = 23 //Better to throw
|
||||
custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 20)
|
||||
custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 25)
|
||||
spear_leftovers = /obj/item/stack/sheet/mineral/bamboo
|
||||
|
||||
/obj/item/spear/bamboospear/add_headpike_component()
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/stack/spacecash/update_desc()
|
||||
. = ..()
|
||||
var/total_worth = get_item_credit_value()
|
||||
desc = "It's worth [total_worth] credit[(total_worth > 1) ? "s" : null] in total."
|
||||
desc = "It's worth [total_worth] [MONEY_NAME_AUTOPURAL(total_worth)] in total."
|
||||
|
||||
/obj/item/stack/spacecash/get_item_credit_value()
|
||||
return (amount*value)
|
||||
|
||||
@@ -549,7 +549,7 @@
|
||||
max_amount = 10
|
||||
repeating = TRUE
|
||||
heal_brute = 10
|
||||
stop_bleeding = 0.6
|
||||
stop_bleeding = 0.5
|
||||
grind_results = list(/datum/reagent/medicine/spaceacillin = 2)
|
||||
merge_type = /obj/item/stack/medical/suture
|
||||
apply_verb = "suturing"
|
||||
|
||||
@@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
|
||||
new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 15 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \
|
||||
new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20, category = CAT_TILES), \
|
||||
new/datum/stack_recipe("stairs frame", /obj/structure/stairs_frame, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \
|
||||
new/datum/stack_recipe("probing cane", /obj/item/cane/white, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_TOOLS), \
|
||||
new/datum/stack_recipe("probing cane", /obj/item/cane/white, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_TOOLS), \
|
||||
new/datum/stack_recipe("sharpened iron rod", /obj/item/ammo_casing/rebar, 1, time = 0.2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_WEAPON_AMMO), \
|
||||
))
|
||||
|
||||
@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
demolition_mod = 1.25
|
||||
mats_per_unit = list(/datum/material/iron=HALF_SHEET_MATERIAL_AMOUNT)
|
||||
mats_per_unit = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT)
|
||||
max_amount = 50
|
||||
attack_verb_continuous = list("hits", "bludgeons", "whacks")
|
||||
attack_verb_simple = list("hit", "bludgeon", "whack")
|
||||
|
||||
@@ -146,7 +146,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
null, \
|
||||
new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \
|
||||
new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \
|
||||
new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \
|
||||
new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_MISC), \
|
||||
new/datum/stack_recipe("reinforced glass tile", /obj/item/stack/tile/rglass, 1, 4, 20, category = CAT_TILES) \
|
||||
))
|
||||
|
||||
@@ -185,7 +185,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
GLOBAL_LIST_INIT(prglass_recipes, list ( \
|
||||
new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \
|
||||
new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/plasma/fulltile/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \
|
||||
new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \
|
||||
new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_SKIP_MATERIALS_PARITY, category = CAT_MISC), \
|
||||
new/datum/stack_recipe("reinforced plasma glass tile", /obj/item/stack/tile/rglass/plasma, 1, 4, 20, category = CAT_TILES) \
|
||||
))
|
||||
|
||||
@@ -377,6 +377,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
to_chat(user, span_notice("You begin to wrap the [cloth] around the [src]..."))
|
||||
if(do_after(user, craft_time, target = src))
|
||||
var/obj/item/knife/shiv/shiv = new shiv_type
|
||||
shiv.set_custom_materials(custom_materials)
|
||||
cloth.use(1)
|
||||
to_chat(user, span_notice("You wrap the [cloth] around the [src], forming a makeshift weapon."))
|
||||
remove_item_from_storage(src, user)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
obj_flags = CONDUCTS_ELECTRICITY
|
||||
max_amount = 60
|
||||
grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/copper = 5)
|
||||
mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05)
|
||||
merge_type = /obj/item/stack/light_w
|
||||
|
||||
/obj/item/stack/light_w/examine(mob/user)
|
||||
|
||||
@@ -24,9 +24,9 @@ Mineral Sheets
|
||||
*/
|
||||
|
||||
GLOBAL_LIST_INIT(sandstone_recipes, list ( \
|
||||
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("sandstone platform", /obj/structure/platform/sandstone, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \
|
||||
new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \
|
||||
new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_NO_MATERIALS, category = CAT_MISC), \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/mineral/sandstone
|
||||
@@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
|
||||
walltype = /turf/closed/wall/mineral/diamond
|
||||
|
||||
GLOBAL_LIST_INIT(diamond_recipes, list ( \
|
||||
new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
|
||||
))
|
||||
|
||||
@@ -139,7 +139,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \
|
||||
walltype = /turf/closed/wall/mineral/uranium
|
||||
|
||||
GLOBAL_LIST_INIT(uranium_recipes, list ( \
|
||||
new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("depleted uranium platform", /obj/structure/platform/uranium, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \
|
||||
new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
|
||||
))
|
||||
@@ -180,7 +180,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \
|
||||
return TOXLOSS//dont you kids know that stuff is toxic?
|
||||
|
||||
GLOBAL_LIST_INIT(plasma_recipes, list ( \
|
||||
new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
|
||||
))
|
||||
|
||||
@@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \
|
||||
walltype = /turf/closed/wall/mineral/gold
|
||||
|
||||
GLOBAL_LIST_INIT(gold_recipes, list ( \
|
||||
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("golden platform", /obj/structure/platform/gold, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \
|
||||
new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
|
||||
new/datum/stack_recipe("blank plaque", /obj/item/plaque, 1, crafting_flags = NONE, category = CAT_FURNITURE), \
|
||||
@@ -246,7 +246,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \
|
||||
walltype = /turf/closed/wall/mineral/silver
|
||||
|
||||
GLOBAL_LIST_INIT(silver_recipes, list ( \
|
||||
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("silver platform", /obj/structure/platform/silver, 2, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \
|
||||
new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
|
||||
))
|
||||
|
||||
@@ -154,7 +154,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
new/datum/stack_recipe("tram controller frame", /obj/item/wallframe/tram, 20, crafting_flags = NONE, category = CAT_STRUCTURE), \
|
||||
new/datum/stack_recipe("tram display frame", /obj/item/wallframe/indicator_display, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \
|
||||
null, \
|
||||
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \
|
||||
new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \
|
||||
new/datum/stack_recipe("desk bell", /obj/structure/desk_bell, 2, time = 3 SECONDS, crafting_flags = NONE, category = CAT_FURNITURE), \
|
||||
new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \
|
||||
@@ -384,7 +384,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
|
||||
new/datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 1 SECONDS, crafting_flags = NONE, category = CAT_TOOLS),\
|
||||
new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS),\
|
||||
new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE),\
|
||||
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 1.5 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE),\
|
||||
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 1.5 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE, removed_mats = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.5)),\
|
||||
new/datum/stack_recipe("wooden crutch", /obj/item/cane/crutch/wood, 5, time = 1.5 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE),\
|
||||
new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), \
|
||||
new/datum/stack_recipe("mortar", /obj/item/reagent_containers/cup/mortar, 3, crafting_flags = NONE, category = CAT_CHEMISTRY), \
|
||||
@@ -461,7 +461,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
|
||||
new/datum/stack_recipe("bamboo spear", /obj/item/spear/bamboospear, 25, time = 9 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE), \
|
||||
new/datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, 10, time = 7 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_RANGED), \
|
||||
new/datum/stack_recipe("crude syringe", /obj/item/reagent_containers/syringe/crude, 5, time = 1 SECONDS, crafting_flags = NONE, category = CAT_CHEMISTRY), \
|
||||
new/datum/stack_recipe("rice hat", /obj/item/clothing/head/costume/rice_hat, 10, time = 7 SECONDS, crafting_flags = NONE, category = CAT_CLOTHING), \
|
||||
new/datum/stack_recipe("rice hat", /obj/item/clothing/head/costume/rice_hat, 10, time = 7 SECONDS, crafting_flags = CRAFT_SKIP_MATERIALS_PARITY, category = CAT_CLOTHING), \
|
||||
null, \
|
||||
new/datum/stack_recipe("bamboo stool", /obj/structure/chair/stool/bamboo, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \
|
||||
new/datum/stack_recipe("bamboo mat piece", /obj/item/stack/tile/bamboo, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \
|
||||
@@ -634,7 +634,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
|
||||
singular_name = "raw durathread ball"
|
||||
icon_state = "sheet-durathreadraw"
|
||||
merge_type = /obj/item/stack/sheet/cotton/durathread
|
||||
grind_results = list()
|
||||
loom_result = /obj/item/stack/sheet/durathread
|
||||
|
||||
/obj/item/stack/sheet/cotton/wool
|
||||
@@ -643,7 +642,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
|
||||
singular_name = "raw wool ball"
|
||||
icon_state = "sheet-wool"
|
||||
merge_type = /obj/item/stack/sheet/cotton/wool
|
||||
grind_results = list()
|
||||
loom_result = /obj/item/stack/sheet/cloth
|
||||
|
||||
/*
|
||||
@@ -654,6 +652,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
|
||||
new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/costume/cardborg, 3, crafting_flags = NONE, category = CAT_CLOTHING), \
|
||||
new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/costume/cardborg, crafting_flags = NONE, category = CAT_CLOTHING), \
|
||||
new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \
|
||||
new/datum/stack_recipe("medium box", /obj/structure/closet/crate/cardboard, 4, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \
|
||||
new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \
|
||||
null, \
|
||||
|
||||
@@ -813,11 +812,6 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \
|
||||
. = ..()
|
||||
. += GLOB.bronze_recipes
|
||||
|
||||
/obj/item/stack/sheet/paperframes/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1)
|
||||
. = ..()
|
||||
pixel_x = 0
|
||||
pixel_y = 0
|
||||
|
||||
/obj/item/stack/sheet/bronze/thirty
|
||||
amount = 30
|
||||
|
||||
@@ -893,7 +887,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
|
||||
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, time = 4 SECONDS, category = CAT_FURNITURE), \
|
||||
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/empty, crafting_flags = NONE, category = CAT_CONTAINERS), \
|
||||
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/large/empty, 3, crafting_flags = NONE, category = CAT_CONTAINERS), \
|
||||
new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/cup/glass/colocup, 1, crafting_flags = NONE, category = CAT_CONTAINERS), \
|
||||
new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/cup/glass/colocup, 1, crafting_flags = NONE, category = CAT_CONTAINERS, removed_mats = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT)), \
|
||||
new /datum/stack_recipe("mannequin", /obj/structure/mannequin/plastic, 25, time = 5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF, category = CAT_ENTERTAINMENT), \
|
||||
new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \
|
||||
new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \
|
||||
|
||||
@@ -94,12 +94,11 @@
|
||||
if(merge)
|
||||
. = INITIALIZE_HINT_LATELOAD
|
||||
|
||||
var/materials_mult = amount
|
||||
if(LAZYLEN(mat_override))
|
||||
materials_mult *= mat_amt
|
||||
mats_per_unit = mat_override
|
||||
if(LAZYLEN(mats_per_unit))
|
||||
initialize_materials(mats_per_unit, materials_mult)
|
||||
mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(mats_per_unit, mat_amt)
|
||||
initialize_materials(mats_per_unit, amount)
|
||||
|
||||
recipes = get_main_recipes().Copy()
|
||||
if(material_type)
|
||||
@@ -120,6 +119,10 @@
|
||||
/obj/item/stack/LateInitialize()
|
||||
merge_with_loc()
|
||||
|
||||
/obj/item/stack/Destroy()
|
||||
mats_per_unit = null
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
|
||||
. = ..()
|
||||
if((!throwing || throwing.target_turf == loc) && old_loc != loc && (flags_1 & INITIALIZED_1))
|
||||
@@ -160,11 +163,6 @@
|
||||
other_stack = find_other_stack(already_found, TRUE)
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/apply_material_effects(list/materials)
|
||||
. = ..()
|
||||
if(amount)
|
||||
mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(materials, 1/amount)
|
||||
|
||||
/obj/item/stack/blend_requirements()
|
||||
if(is_cyborg)
|
||||
to_chat(usr, span_warning("[src] is too integrated into your chassis and can't be ground up!"))
|
||||
@@ -191,7 +189,7 @@
|
||||
return FALSE
|
||||
|
||||
//Now transfer the grind results scaled by available_amount
|
||||
var/list/grind_reagents = grind_results.Copy()
|
||||
var/list/grind_reagents = LAZYCOPY(grind_results)
|
||||
for(var/reagent in grind_reagents)
|
||||
grind_reagents[reagent] *= available_amount
|
||||
target_holder.add_reagent_list(grind_reagents)
|
||||
@@ -417,7 +415,7 @@
|
||||
#undef FULL_LIST
|
||||
|
||||
/// Makes the item with the given recipe.
|
||||
/obj/item/stack/proc/make_item(mob/builder, datum/stack_recipe/recipe, multiplier)
|
||||
/obj/item/stack/proc/make_item(mob/builder, datum/stack_recipe/recipe, multiplier = 1)
|
||||
if(get_amount() < 1 && !is_cyborg) //sanity check as this shouldn't happen
|
||||
qdel(src)
|
||||
return
|
||||
@@ -457,8 +455,6 @@
|
||||
return
|
||||
created = covered_turf.place_on_top(recipe.result_type, flags = CHANGETURF_INHERIT_AIR)
|
||||
builder.balloon_alert(builder, "placed [ispath(recipe.result_type, /turf/open) ? "floor" : "wall"]")
|
||||
if((recipe.crafting_flags & CRAFT_APPLIES_MATS) && LAZYLEN(mats_per_unit))
|
||||
created.set_custom_materials(mats_per_unit, recipe.req_amount / recipe.res_amount)
|
||||
|
||||
else
|
||||
created = new recipe.result_type(builder.drop_location())
|
||||
@@ -469,19 +465,32 @@
|
||||
if(ismovable(created))
|
||||
created.setDir(builder.dir)
|
||||
created.on_craft_completion(list(used_stack), null, builder)
|
||||
qdel(used_stack) //you've outlived your purpose
|
||||
|
||||
builder.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT: Construction Skill
|
||||
|
||||
builder.investigate_log("crafted [recipe.title]", INVESTIGATE_CRAFTING)
|
||||
|
||||
// Apply mat datums
|
||||
if((recipe.crafting_flags & CRAFT_APPLIES_MATS) && LAZYLEN(mats_per_unit))
|
||||
if(LAZYLEN(mats_per_unit) && !(recipe.crafting_flags & CRAFT_NO_MATERIALS))
|
||||
var/list/result_mats = mats_per_unit.Copy()
|
||||
for(var/mat in recipe.removed_mats)
|
||||
var/to_remove = recipe.removed_mats[mat]
|
||||
var/datum/material/ref_mat = locate(mat) in result_mats
|
||||
if(!ref_mat)
|
||||
continue
|
||||
if(result_mats[ref_mat] < to_remove)
|
||||
result_mats -= ref_mat
|
||||
else
|
||||
result_mats[ref_mat] -= to_remove
|
||||
|
||||
if(isstack(created))
|
||||
var/obj/item/stack/crafted_stack = created
|
||||
crafted_stack.set_custom_materials(mats_per_unit, (recipe.req_amount / recipe.res_amount) * crafted_stack.amount)
|
||||
crafted_stack.mats_per_unit = SSmaterials.FindOrCreateMaterialCombo(result_mats)
|
||||
update_custom_materials()
|
||||
else
|
||||
created.set_custom_materials(mats_per_unit, recipe.req_amount / recipe.res_amount)
|
||||
created.set_custom_materials(result_mats, recipe.req_amount * multiplier)
|
||||
|
||||
qdel(used_stack) //you've outlived your purpose
|
||||
|
||||
// We could be qdeleted - like if it's a stack and has already been merged
|
||||
if(QDELETED(created))
|
||||
@@ -576,11 +585,10 @@
|
||||
if (amount < used)
|
||||
return FALSE
|
||||
amount -= used
|
||||
if(check && is_zero_amount(delete_if_zero = TRUE))
|
||||
return TRUE
|
||||
update_custom_materials()
|
||||
update_appearance()
|
||||
update_weight()
|
||||
if(!is_zero_amount(delete_if_zero = check))
|
||||
update_custom_materials()
|
||||
update_appearance()
|
||||
update_weight()
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/tool_use_check(mob/living/user, amount, heat_required)
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
var/trait_modifier = 1
|
||||
/// Category for general crafting menu
|
||||
var/category
|
||||
/// The amount of material to remove from the recipe's result
|
||||
var/list/removed_mats
|
||||
|
||||
///crafting_flags var to hold bool values
|
||||
var/crafting_flags = CRAFT_CHECK_DENSITY
|
||||
@@ -41,6 +43,7 @@
|
||||
trait_booster,
|
||||
trait_modifier = 1,
|
||||
category,
|
||||
list/removed_mats,
|
||||
)
|
||||
|
||||
src.title = title
|
||||
@@ -55,6 +58,8 @@
|
||||
src.trait_modifier = trait_modifier
|
||||
src.category = src.category || category || CAT_MISC
|
||||
|
||||
src.removed_mats = removed_mats
|
||||
|
||||
// We create base64 image only if item have color. Otherwise use icon_ref for TGUI
|
||||
var/obj/item/result = result_type
|
||||
var/paint = result::color
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "smash")
|
||||
turf_type = /turf/open/floor/light
|
||||
merge_type = /obj/item/stack/tile/light
|
||||
mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05)
|
||||
var/state = 0
|
||||
|
||||
/obj/item/stack/tile/light/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
|
||||
|
||||
@@ -230,3 +230,4 @@
|
||||
turf_type = /turf/open/floor/fake_snow
|
||||
mineralType = "snow"
|
||||
merge_type = /obj/item/stack/tile/mineral/snow
|
||||
mats_per_unit = list(/datum/material/snow = HALF_SHEET_MATERIAL_AMOUNT / 2)
|
||||
|
||||
@@ -137,6 +137,7 @@
|
||||
/obj/item/stack/tile/wood/tile,
|
||||
/obj/item/stack/tile/wood/parquet,
|
||||
)
|
||||
mats_per_unit = list(/datum/material/wood = HALF_SHEET_MATERIAL_AMOUNT / 2)
|
||||
|
||||
/obj/item/stack/tile/wood/parquet
|
||||
name = "parquet wood floor tile"
|
||||
@@ -175,6 +176,7 @@
|
||||
/obj/item/stack/tile/bamboo/tatami/purple,
|
||||
/obj/item/stack/tile/bamboo/tatami/black,
|
||||
)
|
||||
mats_per_unit = list(/datum/material/bamboo = HALF_SHEET_MATERIAL_AMOUNT / 2)
|
||||
|
||||
/obj/item/stack/tile/bamboo/tatami
|
||||
name = "Tatami with green rim"
|
||||
@@ -207,6 +209,7 @@
|
||||
inhand_icon_state = "tile-basalt"
|
||||
turf_type = /turf/open/floor/fakebasalt
|
||||
merge_type = /obj/item/stack/tile/basalt
|
||||
mats_per_unit = list(/datum/material/sand = SHEET_MATERIAL_AMOUNT * 2)
|
||||
|
||||
//Carpets
|
||||
/obj/item/stack/tile/carpet
|
||||
@@ -1079,6 +1082,7 @@
|
||||
/obj/item/stack/tile/circuit/green,
|
||||
/obj/item/stack/tile/circuit/red,
|
||||
)
|
||||
mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05)
|
||||
|
||||
/obj/item/stack/tile/circuit/green
|
||||
name = "green circuit tile"
|
||||
@@ -1142,7 +1146,7 @@
|
||||
singular_name = "plastic floor tile"
|
||||
desc = "A tile of cheap, flimsy plastic flooring."
|
||||
icon_state = "tile_plastic"
|
||||
mats_per_unit = list(/datum/material/plastic=SMALL_MATERIAL_AMOUNT*5)
|
||||
mats_per_unit = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT / 2)
|
||||
turf_type = /turf/open/floor/plastic
|
||||
merge_type = /obj/item/stack/tile/plastic
|
||||
|
||||
@@ -1192,13 +1196,13 @@
|
||||
desc = "A clangy tile made of high-quality bronze. Clockwork construction techniques allow the clanging to be minimized."
|
||||
icon_state = "tile_brass"
|
||||
turf_type = /turf/open/floor/bronze
|
||||
mats_per_unit = list(/datum/material/bronze=SMALL_MATERIAL_AMOUNT*5)
|
||||
mats_per_unit = list(/datum/material/bronze = HALF_SHEET_MATERIAL_AMOUNT / 2)
|
||||
merge_type = /obj/item/stack/tile/bronze
|
||||
tile_reskin_types = list(
|
||||
/obj/item/stack/tile/bronze,
|
||||
/obj/item/stack/tile/bronze/flat,
|
||||
/obj/item/stack/tile/bronze/filled,
|
||||
)
|
||||
)
|
||||
|
||||
/obj/item/stack/tile/bronze/flat
|
||||
name = "flat bronze tile"
|
||||
@@ -1258,7 +1262,7 @@
|
||||
desc = "Flooring that shows its contents underneath. Engineers love it!"
|
||||
icon_state = "maint_catwalk"
|
||||
inhand_icon_state = "tile-catwalk"
|
||||
mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT)
|
||||
mats_per_unit = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.2)
|
||||
turf_type = /turf/open/floor/catwalk_floor
|
||||
merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with each other
|
||||
tile_reskin_types = list(
|
||||
@@ -1328,7 +1332,7 @@
|
||||
inhand_icon_state = "tile-rglass"
|
||||
turf_type = /turf/open/floor/glass/reinforced
|
||||
merge_type = /obj/item/stack/tile/rglass
|
||||
mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 0.125, /datum/material/glass=SHEET_MATERIAL_AMOUNT * 0.25) // 4 tiles per sheet
|
||||
mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 0.125, /datum/material/glass=SHEET_MATERIAL_AMOUNT * 0.25) // 4 tiles per sheet
|
||||
|
||||
/obj/item/stack/tile/rglass/sixty
|
||||
amount = 60
|
||||
|
||||
@@ -513,6 +513,7 @@
|
||||
slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_SUITSTORE|ITEM_SLOT_NECK
|
||||
resistance_flags = FLAMMABLE
|
||||
storage_type = /datum/storage/bag/rebar_quiver
|
||||
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 6.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5)
|
||||
|
||||
/obj/item/storage/bag/rebar_quiver/syndicate
|
||||
icon_state = "syndie_quiver_0"
|
||||
@@ -582,6 +583,7 @@
|
||||
|
||||
/obj/item/storage/bag/quiver/lesser
|
||||
storage_type = /datum/storage/bag/quiver/less
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/storage/bag/quiver/full/PopulateContents()
|
||||
. = ..()
|
||||
|
||||
@@ -264,23 +264,6 @@
|
||||
inhand_icon_state = "security"//Could likely use a better one.
|
||||
worn_icon_state = "security"
|
||||
content_overlays = TRUE
|
||||
// SKYRAT EDIT ADDITION START
|
||||
uses_advanced_reskins = TRUE
|
||||
unique_reskin = list(
|
||||
"Basic Security" = list(
|
||||
RESKIN_ICON = 'icons/obj/clothing/belts.dmi',
|
||||
RESKIN_ICON_STATE = "security",
|
||||
RESKIN_WORN_ICON = 'icons/mob/clothing/belt.dmi',
|
||||
RESKIN_WORN_ICON_STATE = "security"
|
||||
),
|
||||
"Peacekeeper" = list(
|
||||
RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/belts.dmi',
|
||||
RESKIN_ICON_STATE = "peacekeeperbelt",
|
||||
RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi',
|
||||
RESKIN_WORN_ICON_STATE = "peacekeeperbelt"
|
||||
)
|
||||
)
|
||||
// SKYRAT EDIT ADDITION END
|
||||
storage_type = /datum/storage/security_belt
|
||||
|
||||
/obj/item/storage/belt/security/full/PopulateContents()
|
||||
@@ -610,10 +593,19 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
interaction_flags_click = parent_type::interaction_flags_click | NEED_DEXTERITY | NEED_HANDS
|
||||
var/stored_blade
|
||||
actions_types = list(/datum/action/innate/blade_counter)
|
||||
action_slots = ITEM_SLOT_BELT
|
||||
COOLDOWN_DECLARE(resheath_cooldown)
|
||||
COOLDOWN_DECLARE(full_ability_cooldown)
|
||||
|
||||
/obj/item/storage/belt/sheath/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/update_icon_updates_onmob)
|
||||
RegisterSignal(src, COMSIG_ATOM_STORED_ITEM, PROC_REF(post_resheath))
|
||||
|
||||
/obj/item/storage/belt/sheath/Destroy(force)
|
||||
. = ..()
|
||||
UnregisterSignal(src, COMSIG_ATOM_STORED_ITEM)
|
||||
|
||||
/obj/item/storage/belt/sheath/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -645,6 +637,103 @@
|
||||
new stored_blade(src)
|
||||
update_appearance()
|
||||
|
||||
/obj/item/storage/belt/sheath/proc/post_resheath()
|
||||
SIGNAL_HANDLER
|
||||
COOLDOWN_START(src, resheath_cooldown, 10 SECONDS)
|
||||
|
||||
/datum/action/innate/blade_counter
|
||||
name = "Counterattack"
|
||||
desc = "Anticipate an enemy's attack and strike back with your sheathed blade."
|
||||
button_icon = 'icons/mob/actions/actions_spells.dmi'
|
||||
button_icon_state = "declaration"
|
||||
ranged_mousepointer = 'icons/effects/mouse_pointers/honorbound.dmi'
|
||||
|
||||
enable_text = "You prepare to counterattack a target..."
|
||||
disable_text = "You relax your stance."
|
||||
|
||||
click_action = TRUE
|
||||
|
||||
var/datum/weakref/eyed_fool
|
||||
|
||||
/datum/action/innate/blade_counter/IsAvailable(feedback = TRUE)
|
||||
if(!isliving(owner))
|
||||
return FALSE
|
||||
var/obj/item/storage/belt/sheath/owners_sheath = target
|
||||
if(!COOLDOWN_FINISHED(owners_sheath, full_ability_cooldown))
|
||||
if(feedback)
|
||||
to_chat(owner, span_warning("You failed a counterattack too recently!"))
|
||||
return FALSE
|
||||
if(!length(owners_sheath.contents))
|
||||
if(feedback)
|
||||
to_chat(owner, span_warning("Your sheath is empty!"))
|
||||
return FALSE
|
||||
if(!COOLDOWN_FINISHED(owners_sheath, resheath_cooldown))
|
||||
if(feedback)
|
||||
to_chat(owner, span_warning("You only just resheathed your blade!"))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/action/innate/blade_counter/proc/final_checks(atom/cast_on)
|
||||
if(!isliving(cast_on))
|
||||
return FALSE
|
||||
if(owner == cast_on)
|
||||
to_chat(owner, span_warning("You can't counterattack yourself!"))
|
||||
return FALSE
|
||||
var/mob/living/target = cast_on
|
||||
if(!target.mind)
|
||||
to_chat(owner, span_warning("They are too unpredictable to counterattack!"))
|
||||
return FALSE
|
||||
var/obj/item/storage/belt/sheath/oursheath = target
|
||||
if(!length(oursheath.contents))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/action/innate/blade_counter/do_ability(mob/living/swordsman, mob/living/cast_on)
|
||||
if(!final_checks(cast_on))
|
||||
return FALSE
|
||||
var/obj/item/storage/belt/sheath/used_sheath = target
|
||||
RegisterSignal(swordsman, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(counter_attack))
|
||||
swordsman.Immobilize(1 SECONDS)
|
||||
eyed_fool = WEAKREF(cast_on)
|
||||
swordsman.visible_message(span_danger("[swordsman] widens [p_their(swordsman)] stance, [p_their(swordsman)] hand hovering over \the [used_sheath]!"), span_notice("You prepare to counterattack [cast_on]!"))
|
||||
addtimer(CALLBACK(src, PROC_REF(relax), swordsman), 1 SECONDS)
|
||||
COOLDOWN_START(used_sheath, full_ability_cooldown, 60 SECONDS)
|
||||
unset_ranged_ability(swordsman)
|
||||
|
||||
#define COUNTERMULTIPLIER 3
|
||||
|
||||
/datum/action/innate/blade_counter/proc/counter_attack(mob/living/forward_thinker, atom/attackingthing, damage, attack_text, attack_type)
|
||||
SIGNAL_HANDLER
|
||||
var/obj/item/storage/belt/sheath/used_sheath = target
|
||||
if(!used_sheath || !length(used_sheath.contents) || (attack_type != MELEE_ATTACK && attack_type != UNARMED_ATTACK))
|
||||
return FAILED_BLOCK
|
||||
|
||||
var/obj/item/justicetool = used_sheath.contents[1]
|
||||
var/mob/living/fool = isliving(attackingthing) ? attackingthing : attackingthing.loc
|
||||
if(used_sheath.loc != forward_thinker || fool != eyed_fool.resolve() || !forward_thinker.put_in_active_hand(justicetool))
|
||||
return FAILED_BLOCK
|
||||
var/obj/item/bodypart/offending_hand = fool.get_active_hand()
|
||||
fool.apply_damage(
|
||||
damage = justicetool.force * COUNTERMULTIPLIER,
|
||||
damagetype = justicetool.damtype,
|
||||
def_zone = offending_hand,
|
||||
blocked = fool.run_armor_check(offending_hand, MELEE, armour_penetration = justicetool.armour_penetration, silent = TRUE),
|
||||
wound_bonus = justicetool.wound_bonus * COUNTERMULTIPLIER,
|
||||
exposed_wound_bonus = justicetool.exposed_wound_bonus * COUNTERMULTIPLIER,
|
||||
sharpness = justicetool.sharpness,
|
||||
attack_direction = get_dir(forward_thinker, fool),
|
||||
attacking_item = justicetool,
|
||||
)
|
||||
playsound(forward_thinker, 'sound/items/unsheath.ogg', 50, TRUE)
|
||||
forward_thinker.visible_message(span_danger("[forward_thinker] swiftly draws \the [justicetool] and strikes [fool] during [p_their(fool)] attack!"), span_notice("You swiftly draw \the [justicetool] and counter-attack [fool]!"))
|
||||
COOLDOWN_RESET(used_sheath, full_ability_cooldown)
|
||||
return SUCCESSFUL_BLOCK
|
||||
|
||||
#undef COUNTERMULTIPLIER
|
||||
|
||||
/datum/action/innate/blade_counter/proc/relax(mob/living/holder)
|
||||
UnregisterSignal(holder, COMSIG_LIVING_CHECK_BLOCK)
|
||||
|
||||
/obj/item/storage/belt/sheath/sabre
|
||||
name = "sabre sheath"
|
||||
desc = "An ornate sheath designed to hold an officer's blade."
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
|
||||
/obj/item/storage/box/Initialize(mapload)
|
||||
. = ..()
|
||||
if(foldable_result == /obj/item/stack/sheet/cardboard)
|
||||
set_custom_materials(list(/datum/material/cardboard = SHEET_MATERIAL_AMOUNT))
|
||||
update_appearance()
|
||||
|
||||
/obj/item/storage/box/suicide_act(mob/living/carbon/user)
|
||||
|
||||
@@ -232,6 +232,14 @@
|
||||
new /obj/item/clothing/gloves/divine_archer(src)
|
||||
new /obj/item/clothing/shoes/divine_archer(src)
|
||||
|
||||
/obj/item/storage/box/holy/heretic
|
||||
name = "Occult Practitioner Kit"
|
||||
typepath_for_preview = /obj/item/clothing/suit/chaplainsuit/armor/heretic
|
||||
|
||||
/obj/item/storage/box/holy/heretic/PopulateContents()
|
||||
new /obj/item/clothing/suit/chaplainsuit/armor/heretic(src)
|
||||
new /obj/item/clothing/head/helmet/chaplain/heretic(src)
|
||||
|
||||
/obj/item/storage/box/floor_camo
|
||||
name = "floor tile camo box"
|
||||
desc = "Thank you for shopping from Camo-J's, our uniquely designed \
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
illustration = null
|
||||
resistance_flags = FLAMMABLE
|
||||
foldable_result = null
|
||||
custom_materials = list(/datum/material/paper = SHEET_MATERIAL_AMOUNT * 1.25)
|
||||
/// A list of all available papersack reskins
|
||||
var/list/papersack_designs = list()
|
||||
///What design from papersack_designs we are currently using.
|
||||
|
||||
@@ -198,9 +198,11 @@
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
qdel(tool)
|
||||
loc.balloon_alert(user, "wheels added, honk!")
|
||||
var/obj/item/bot_assembly/honkbot/A = new
|
||||
var/obj/item/bot_assembly/honkbot/assembly = new(drop_location())
|
||||
var/held_index = user.is_holding(src)
|
||||
qdel(src)
|
||||
user.put_in_hands(A)
|
||||
if (held_index)
|
||||
user.put_in_hand(assembly, held_index)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
/obj/item/storage/box/clown/suicide_act(mob/living/user)
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
new /obj/item/circuitboard/machine/protolathe/offstation(src)
|
||||
new /obj/item/circuitboard/machine/destructive_analyzer(src)
|
||||
new /obj/item/circuitboard/machine/circuit_imprinter/offstation(src)
|
||||
new /obj/item/circuitboard/computer/rdconsole(src)
|
||||
new /obj/item/circuitboard/computer/rdconsole/unlocked(src)
|
||||
|
||||
/obj/item/storage/box/stabilized //every single stabilized extract from xenobiology
|
||||
name = "box of stabilized extracts"
|
||||
|
||||
@@ -609,7 +609,7 @@
|
||||
spawn_count = 10
|
||||
contents_tag = "pickle"
|
||||
foldable_result = /obj/item/reagent_containers/cup/beaker/large
|
||||
custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT)
|
||||
custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.25)
|
||||
open_status = FANCY_CONTAINER_ALWAYS_OPEN
|
||||
has_open_closed_states = FALSE
|
||||
storage_type = /datum/storage/pickles_jar
|
||||
|
||||
@@ -375,14 +375,16 @@
|
||||
balloon_alert(user, "items inside!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
|
||||
var/obj/item/bot_assembly/medbot/medbot_assembly = new()
|
||||
var/obj/item/bot_assembly/medbot/medbot_assembly = new(drop_location())
|
||||
medbot_assembly.set_skin(get_medbot_skin())
|
||||
user.put_in_hands(medbot_assembly)
|
||||
medbot_assembly.balloon_alert(user, "arm added")
|
||||
medbot_assembly.robot_arm = tool.type
|
||||
medbot_assembly.medkit_type = type
|
||||
qdel(tool)
|
||||
var/held_index = user.is_holding(src)
|
||||
qdel(src)
|
||||
if (held_index)
|
||||
user.put_in_hand(medbot_assembly, held_index)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
/// Gets what skin (icon_state) this medkit uses for a medbot
|
||||
@@ -497,6 +499,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
storage_type = /datum/storage/test_tube_rack
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/storage/test_tube_rack/update_icon_state()
|
||||
icon_state = "[base_icon_state][contents.len > 0 ? contents.len : null]"
|
||||
|
||||
@@ -149,13 +149,15 @@
|
||||
/obj/item/storage/toolbox/crafter = "#9D3282",
|
||||
/obj/item/storage/toolbox/syndicate = "#3d3d3d",
|
||||
)
|
||||
var/obj/item/bot_assembly/repairbot/repair = new
|
||||
var/obj/item/bot_assembly/repairbot/repair = new(drop_location())
|
||||
repair.toolbox = type
|
||||
var/new_color = toolbox_colors[type] || "#445eb3"
|
||||
repair.set_color(new_color)
|
||||
user.put_in_hands(repair)
|
||||
repair.update_appearance()
|
||||
repair.balloon_alert(user, "sensor added!")
|
||||
qdel(tool)
|
||||
var/held_index = user.is_holding(src)
|
||||
qdel(src)
|
||||
if (held_index)
|
||||
user.put_in_hand(repair, held_index)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
slowdown = 1
|
||||
item_flags = SLOWS_WHILE_IN_HAND
|
||||
pass_flags = NONE
|
||||
custom_materials = list(/datum/material/silver = SHEET_MATERIAL_AMOUNT, /datum/material/iron = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/// If true we're currently portable
|
||||
var/is_portable = TRUE
|
||||
|
||||
@@ -189,6 +189,7 @@
|
||||
full_speed = FALSE
|
||||
drift_force = 1 NEWTONS
|
||||
stabilizer_force = 0.5 NEWTONS
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4.4, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3)
|
||||
|
||||
/obj/item/tank/jetpack/improvised/allow_thrust(num)
|
||||
if(!ismob(loc))
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
|
||||
/obj/item/crowbar/power/examine()
|
||||
. = ..()
|
||||
. += " It's fitted with a [tool_behaviour == first_tool_behavior ? inactive_text : active_text] head."
|
||||
. += "It's fitted with a [tool_behaviour == first_tool_behavior ? inactive_text : active_text] head."
|
||||
|
||||
/*
|
||||
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
|
||||
@@ -300,6 +300,12 @@
|
||||
ACCESS_RD,
|
||||
ACCESS_SYNDICATE,
|
||||
)
|
||||
custom_materials = list(
|
||||
/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4.75,
|
||||
/datum/material/silver = SHEET_MATERIAL_AMOUNT * 2.50,
|
||||
/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 1.75,
|
||||
/datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.25,
|
||||
)
|
||||
radio_alert = TRUE
|
||||
|
||||
/obj/item/crowbar/power/paramedic/sound_the_alarms(mob/user, obj/machinery/door/airlock/target)
|
||||
@@ -327,8 +333,9 @@
|
||||
)
|
||||
|
||||
/obj/item/crowbar/power/paramedic/silent
|
||||
name = "modified jaws of recovery"
|
||||
desc = "Modified version for jaws of life, made to act like jaws of recovery. This one doesn't announce doors you're prying open and lets you pry any door, acting like regular jaws of life"
|
||||
desc = "A specialized version of the jaws of life, primarily to be used by paramedics to recover the injured and the recently deceased. Rather than a cutting arm, this tool has a bonesetting apparatus. \
|
||||
This one looks upgraded."
|
||||
w_class = WEIGHT_CLASS_NORMAL // it's a modified, normal jaws
|
||||
limit_jaws_access = FALSE
|
||||
radio_alert = FALSE
|
||||
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
|
||||
/obj/item/screwdriver/power/examine()
|
||||
. = ..()
|
||||
. += " It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] bit."
|
||||
. += "It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] bit."
|
||||
|
||||
/obj/item/screwdriver/power/suicide_act(mob/living/user)
|
||||
if(tool_behaviour == TOOL_SCREWDRIVER)
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
inhand_icon_state = "cutters"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
|
||||
flags_1 = IS_PLAYER_COLORABLE_1|NO_NEW_GAGS_PREVIEW_1
|
||||
greyscale_config = /datum/greyscale_config/wirecutters
|
||||
greyscale_config_belt = /datum/greyscale_config/wirecutters_belt_overlay
|
||||
greyscale_config_inhand_left = /datum/greyscale_config/wirecutter_inhand_left
|
||||
greyscale_config_inhand_right = /datum/greyscale_config/wirecutter_inhand_right
|
||||
|
||||
greyscale_colors = COLOR_RED
|
||||
obj_flags = CONDUCTS_ELECTRICITY
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 6
|
||||
@@ -72,6 +72,10 @@
|
||||
icon_state = "cutters"
|
||||
toolspeed = 0.1
|
||||
random_color = FALSE
|
||||
greyscale_config = null
|
||||
greyscale_config_inhand_left = null
|
||||
greyscale_config_inhand_right = null
|
||||
greyscale_colors = null
|
||||
snap_time_strong_handcuffs = 1 SECONDS
|
||||
|
||||
/obj/item/wirecutters/cyborg
|
||||
@@ -82,3 +86,5 @@
|
||||
worn_icon_state = "cutters"
|
||||
toolspeed = 0.5
|
||||
random_color = FALSE
|
||||
greyscale_config = null
|
||||
greyscale_colors = null
|
||||
|
||||
@@ -586,6 +586,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb_continuous = list("attacks", "strikes", "hits")
|
||||
attack_verb_simple = list("attack", "strike", "hit")
|
||||
custom_materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 4, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.1, /datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.1)
|
||||
/// Whether our sword has been multitooled to rainbow
|
||||
var/hacked = FALSE
|
||||
/// The color of our fake energy sword
|
||||
@@ -1081,6 +1082,7 @@
|
||||
icon_state = "snowball"
|
||||
throwforce = 20 //the same damage as a disabler shot
|
||||
damtype = STAMINA //maybe someday we can add stuffing rocks (or perhaps ore?) into snowballs to make them deal brute damage
|
||||
custom_materials = list(/datum/material/snow = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/toy/snowball/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
||||
user.throw_item(interacting_with)
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
throw_speed = 1
|
||||
armour_penetration = 15
|
||||
hitsound = 'sound/items/car_engine_start.ogg'
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 14, /datum/material/cardboard = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.8)
|
||||
/// The number of charges the house edge has accrued through 2-handed hits, to charge a more powerful charge attack.
|
||||
var/fire_charges = 0
|
||||
///Sound played when wielded.
|
||||
|
||||
@@ -155,7 +155,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
if(attack_type == (PROJECTILE_ATTACK || LEAP_ATTACK || OVERWHELMING_ATTACK))
|
||||
if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK)
|
||||
final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you.
|
||||
return ..()
|
||||
|
||||
@@ -415,6 +415,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
alt_simple = string_list(alt_simple)
|
||||
AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -15)
|
||||
|
||||
/obj/item/katana/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
if(attack_type == OVERWHELMING_ATTACK)
|
||||
final_block_chance = 0 //Not a high freuqnecy blade, sorry pal
|
||||
return ..()
|
||||
|
||||
/datum/armor/item_katana
|
||||
fire = 100
|
||||
acid = 50
|
||||
@@ -623,6 +628,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
icon_angle = -135
|
||||
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 4)
|
||||
|
||||
/obj/item/bambostaff/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -637,6 +643,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
icon_state = inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]"
|
||||
return ..()
|
||||
|
||||
/obj/item/bambostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
|
||||
if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK)
|
||||
final_block_chance = 0 //Don't bring a staff to a gunfight, and also you aren't going to really block someone full body tackling you with a staff. Or a road roller, if one happened to hit you.
|
||||
return ..()
|
||||
|
||||
/obj/item/cane
|
||||
name = "cane"
|
||||
desc = "A cane used by a true gentleman. Or a clown."
|
||||
@@ -735,7 +746,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
desc = "A handmade crutch. Also makes a decent bludgeon if you need it."
|
||||
icon_state = "crutch_wood"
|
||||
inhand_icon_state = "crutch_wood"
|
||||
custom_materials = list(/datum/material/wood = SMALL_MATERIAL_AMOUNT * 0.5)
|
||||
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT * 5)
|
||||
|
||||
/obj/item/cane/white
|
||||
name = "white cane"
|
||||
@@ -863,6 +874,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
throw_range = 1
|
||||
attack_verb_continuous = list("clubs", "bludgeons")
|
||||
attack_verb_simple = list("club", "bludgeon")
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/melee/baseball_bat
|
||||
name = "baseball bat"
|
||||
@@ -1061,6 +1073,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
|
||||
if(is_type_in_typecache(target, splattable))
|
||||
to_chat(user, span_warning("You easily splat [target]."))
|
||||
if(QDELETED(target))
|
||||
return
|
||||
if(isliving(target))
|
||||
new /obj/effect/decal/cleanable/insectguts(target.drop_location())
|
||||
var/mob/living/bug = target
|
||||
@@ -1198,7 +1212,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
playsound(src, SFX_BULLET_MISS, 75, TRUE)
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(prob(final_block_chance * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1)))
|
||||
var/stop_that_blade = (final_block_chance + (attack_type == OVERWHELMING_ATTACK ? 25 : 0)) * (HAS_TRAIT(src, TRAIT_WIELDED) ? 2 : 1)
|
||||
if(prob(stop_that_blade))
|
||||
owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!"))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -22,12 +22,11 @@
|
||||
force = 10
|
||||
throwforce = 6
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 22, /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.5)
|
||||
///What item is being charged currently?
|
||||
var/obj/item/charging = null
|
||||
///Did we put power into "charging" last process()?
|
||||
var/using_power = FALSE
|
||||
///Did we finish recharging the currently inserted item?
|
||||
var/finished_recharging = FALSE
|
||||
|
||||
///Current rotor animation frame. (floating point value).
|
||||
var/rotor_tick = 0
|
||||
@@ -231,7 +230,6 @@
|
||||
if(is_type_in_typecache(arrived, allowed_devices))
|
||||
charging = arrived
|
||||
START_PROCESSING(SSmachines, src)
|
||||
finished_recharging = FALSE
|
||||
using_power = TRUE
|
||||
update_appearance()
|
||||
return ..()
|
||||
@@ -313,18 +311,17 @@
|
||||
if(charging_cell)
|
||||
var/wanted_power = min(charging_cell.maxcharge - charging_cell.charge, charging_cell.chargerate)
|
||||
if(wanted_power > 0)
|
||||
using_power = TRUE
|
||||
var/power_to_give = min(available_power, wanted_power) * seconds_per_tick / 2
|
||||
if (power_to_give > 0)
|
||||
charging_cell.give(power_to_give)
|
||||
available_power -= power_to_give
|
||||
if(charging_cell.charge == charging_cell.maxcharge)
|
||||
playsound(src, 'sound/machines/ping.ogg', 30, TRUE)
|
||||
say("[charging] has finished recharging!")
|
||||
else
|
||||
using_power = TRUE
|
||||
update_appearance()
|
||||
|
||||
if(!using_power && !finished_recharging) //Inserted thing is at max charge/ammo, notify those around us
|
||||
finished_recharging = TRUE
|
||||
playsound(src, 'sound/machines/ping.ogg', 30, TRUE)
|
||||
say("[charging] has finished recharging!")
|
||||
|
||||
/obj/item/portable_wind_turbine/emp_act(severity)
|
||||
. = ..()
|
||||
if (. & EMP_PROTECT_CONTENTS)
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
return
|
||||
|
||||
charged = FALSE
|
||||
if(isliving(target))
|
||||
if(isliving(target) && !QDELETED(target))
|
||||
var/mob/living/smacked = target
|
||||
smacked.take_bodypart_damage(20, 0)
|
||||
playsound(user, 'sound/items/weapons/marauder.ogg', 50, TRUE)
|
||||
|
||||
Reference in New Issue
Block a user