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:
nevimer
2026-01-12 22:09:10 -05:00
1118 changed files with 119008 additions and 36907 deletions
@@ -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
+22 -21
View File
@@ -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.
+1
View File
@@ -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
+4 -3
View File
@@ -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
+1
View File
@@ -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()
-1
View File
@@ -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
+6 -6
View File
@@ -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)
+19 -12
View File
@@ -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)
. = ..()
-1
View File
@@ -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)
. = ..()
+2 -1
View File
@@ -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
+14 -10
View File
@@ -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"
+3
View File
@@ -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
+1 -1
View File
@@ -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
+1
View File
@@ -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)
. = ..()
-1
View File
@@ -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.
+1
View File
@@ -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
+2 -3
View File
@@ -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)
+2 -4
View File
@@ -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)
+24
View File
@@ -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.
+4 -1
View File
@@ -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)
. = ..()
+1
View File
@@ -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
+2 -2
View File
@@ -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")
+5 -5
View File
@@ -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
+1
View File
@@ -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
+22 -8
View File
@@ -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"
+9
View File
@@ -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
+6 -5
View File
@@ -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 ..()
+1
View File
@@ -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)
@@ -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
+28 -11
View File
@@ -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
+1
View File
@@ -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)
+1
View File
@@ -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
+8 -9
View File
@@ -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
+7 -5
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1
View File
@@ -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
+4 -7
View File
@@ -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()
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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), \
+29 -21
View File
@@ -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
+2
View File
@@ -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()
. = ..()
+106 -17
View File
@@ -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"
+1 -1
View File
@@ -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
+5 -2
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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))
+10 -3
View File
@@ -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
+1 -1
View File
@@ -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)
+8 -2
View File
@@ -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
+2
View File
@@ -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)
+1
View File
@@ -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.
+18 -3
View File
@@ -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
+6 -9
View File
@@ -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)
+1 -1
View File
@@ -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)