Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit54
This commit is contained in:
@@ -219,7 +219,7 @@
|
||||
name = "stabilized plasma"
|
||||
desc = "A puddle of stabilized plasma."
|
||||
icon_state = "flour"
|
||||
color = "#C8A5DC"
|
||||
color = "#9e0089"
|
||||
|
||||
/obj/effect/decal/cleanable/insectguts
|
||||
name = "insect guts"
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
|
||||
victim.log_message("entered a blood frenzy", LOG_ATTACK)
|
||||
|
||||
chainsaw.item_flags |= NODROP
|
||||
ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT)
|
||||
victim.drop_all_held_items()
|
||||
victim.put_in_hands(chainsaw, forced = TRUE)
|
||||
chainsaw.attack_self(victim)
|
||||
|
||||
@@ -120,6 +120,33 @@
|
||||
loot = GLOB.maintenance_loot
|
||||
. = ..()
|
||||
|
||||
/obj/effect/spawner/lootdrop/glowstick
|
||||
name = "random colored glowstick"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "random_glowstick"
|
||||
|
||||
/obj/effect/spawner/lootdrop/glowstick/Initialize()
|
||||
loot = typesof(/obj/item/flashlight/glowstick)
|
||||
. = ..()
|
||||
|
||||
|
||||
/obj/effect/spawner/lootdrop/gloves
|
||||
name = "random gloves"
|
||||
desc = "These gloves are supposed to be a random color..."
|
||||
icon = 'icons/obj/clothing/gloves.dmi'
|
||||
icon_state = "random_gloves"
|
||||
loot = list(
|
||||
/obj/item/clothing/gloves/color/orange = 1,
|
||||
/obj/item/clothing/gloves/color/red = 1,
|
||||
/obj/item/clothing/gloves/color/blue = 1,
|
||||
/obj/item/clothing/gloves/color/purple = 1,
|
||||
/obj/item/clothing/gloves/color/green = 1,
|
||||
/obj/item/clothing/gloves/color/grey = 1,
|
||||
/obj/item/clothing/gloves/color/light_brown = 1,
|
||||
/obj/item/clothing/gloves/color/brown = 1,
|
||||
/obj/item/clothing/gloves/color/white = 1,
|
||||
/obj/item/clothing/gloves/color/rainbow = 1)
|
||||
|
||||
/obj/effect/spawner/lootdrop/crate_spawner
|
||||
name = "lootcrate spawner" //USE PROMO CODE "SELLOUT" FOR 20% OFF!
|
||||
lootdoubles = FALSE
|
||||
|
||||
@@ -230,9 +230,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
research_msg += "."
|
||||
to_chat(user, research_msg.Join())
|
||||
|
||||
/obj/item/proc/speechModification(message) //for message modding by mask slot.
|
||||
return message
|
||||
|
||||
/obj/item/interact(mob/user)
|
||||
add_fingerprint(user)
|
||||
ui_interact(user)
|
||||
@@ -647,11 +644,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
else
|
||||
. = ""
|
||||
|
||||
|
||||
//when an item modify our speech spans when in our active hand. Override this to modify speech spans.
|
||||
/obj/item/proc/get_held_item_speechspans(mob/living/carbon/user)
|
||||
return
|
||||
|
||||
/obj/item/hitby(atom/movable/AM)
|
||||
return
|
||||
|
||||
@@ -825,6 +817,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback)
|
||||
if (item_flags & NODROP)
|
||||
if (HAS_TRAIT(src, TRAIT_NODROP))
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -233,6 +233,10 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
playsound(get_turf(user), 'sound/items/deconstruct.ogg', 50, 1)
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/pipe_dispenser/ui_base_html(html)
|
||||
var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/pipes)
|
||||
. = replacetext(html, "<!--customheadhtml-->", assets.css_tag())
|
||||
|
||||
/obj/item/pipe_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
icon_state = "chronogun"
|
||||
item_state = "chronogun"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
|
||||
can_charge = 0
|
||||
fire_delay = 50
|
||||
@@ -58,6 +58,7 @@
|
||||
|
||||
/obj/item/gun/energy/chrono_gun/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CHRONO_GUN_TRAIT)
|
||||
if(istype(loc, /obj/item/chrono_eraser))
|
||||
TED = loc
|
||||
else //admin must have spawned it
|
||||
@@ -150,8 +151,8 @@
|
||||
gun = loc
|
||||
. = ..()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/effect/chrono_field
|
||||
|
||||
@@ -512,17 +512,6 @@
|
||||
name = "pink glowstick"
|
||||
color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/item/flashlight/glowstick/random
|
||||
name = "random colored glowstick"
|
||||
icon_state = "random_glowstick"
|
||||
color = null
|
||||
|
||||
/obj/item/flashlight/glowstick/random/Initialize()
|
||||
..()
|
||||
var/T = pick(typesof(/obj/item/flashlight/glowstick) - /obj/item/flashlight/glowstick/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/flashlight/spotlight //invisible lighting source
|
||||
name = "disco light"
|
||||
desc = "Groovy..."
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
return
|
||||
if(istype(target, /obj/item))
|
||||
var/obj/item/I = target
|
||||
if(I.item_flags & NODROP)
|
||||
if(HAS_TRAIT_FROM(I, TRAIT_NODROP, GLUED_ITEM_TRAIT))
|
||||
to_chat(user, "<span class='warning'>[I] is already sticky!</span>")
|
||||
return
|
||||
uses -= 1
|
||||
I.item_flags |= NODROP
|
||||
ADD_TRAIT(I, TRAIT_NODROP, GLUED_ITEM_TRAIT)
|
||||
I.desc += " It looks sticky."
|
||||
to_chat(user, "<span class='notice'>You smear the [I] with glue, making it incredibly sticky!</span>")
|
||||
if(uses == 0)
|
||||
|
||||
@@ -156,7 +156,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
icon_state = "gps-b"
|
||||
gpstag = "BORG0"
|
||||
desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/gps/cyborg/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CYBORG_ITEM_TRAIT)
|
||||
|
||||
/obj/item/gps/internal
|
||||
icon_state = null
|
||||
|
||||
@@ -234,11 +234,18 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
actions_types = list(/datum/action/item_action/instrument)
|
||||
|
||||
/obj/item/instrument/harmonica/speechModification(message)
|
||||
/obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args)
|
||||
if(song.playing && ismob(loc))
|
||||
to_chat(loc, "<span class='warning'>You stop playing the harmonica to talk...</span>")
|
||||
song.playing = FALSE
|
||||
return message
|
||||
|
||||
/obj/item/instrument/harmonica/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
|
||||
/obj/item/instrument/harmonica/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/instrument/bikehorn
|
||||
name = "gilded bike horn"
|
||||
|
||||
@@ -17,13 +17,25 @@
|
||||
user.say("AAAAAAAAAAAARGHHHHH", forced="megaphone suicide")//he must have died while coding this
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user)
|
||||
if(spamcheck > world.time)
|
||||
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
|
||||
/obj/item/megaphone/equipped(mob/M, slot)
|
||||
. = ..()
|
||||
if (slot == SLOT_HANDS)
|
||||
RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
|
||||
else
|
||||
playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1)
|
||||
spamcheck = world.time + 50
|
||||
return voicespan
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/megaphone/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
|
||||
/obj/item/megaphone/proc/handle_speech(mob/living/carbon/user, list/speech_args)
|
||||
if (user.get_active_held_item() == src)
|
||||
if(spamcheck > world.time)
|
||||
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1)
|
||||
spamcheck = world.time + 50
|
||||
speech_args[SPEECH_SPANS] |= voicespan
|
||||
|
||||
/obj/item/megaphone/emag_act(mob/user)
|
||||
if(obj_flags & EMAGGED)
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/obj/item/electropack/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/clothing/head/helmet))
|
||||
var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user )
|
||||
var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit(user)
|
||||
A.icon = 'icons/obj/assemblies.dmi'
|
||||
|
||||
if(!user.transferItemToLoc(W, A))
|
||||
@@ -53,8 +53,6 @@
|
||||
|
||||
user.put_in_hands(A)
|
||||
A.add_fingerprint(user)
|
||||
if(item_flags & NODROP)
|
||||
A.item_flags |= NODROP
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -106,8 +104,7 @@
|
||||
if(shock_cooldown != 0)
|
||||
return
|
||||
shock_cooldown = 1
|
||||
spawn(100)
|
||||
shock_cooldown = 0
|
||||
addtimer(VARSET_CALLBACK(src, shock_cooldown, 0), 100)
|
||||
var/mob/living/L = loc
|
||||
step(L, pick(GLOB.cardinals))
|
||||
|
||||
|
||||
@@ -189,7 +189,7 @@
|
||||
|
||||
/obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language)
|
||||
if(!spans)
|
||||
spans = M.get_spans()
|
||||
spans = list(M.speech_span)
|
||||
if(!language)
|
||||
language = M.get_default_language()
|
||||
INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.get_item_by_slot(SLOT_HEAD) == src)
|
||||
if((item_flags & NODROP) && !struggling)
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) && !struggling)
|
||||
struggling = TRUE
|
||||
var/fear_string
|
||||
switch(time_left)
|
||||
@@ -74,7 +74,7 @@
|
||||
else
|
||||
user.visible_message("<span class='warning'>The lock on [user]'s [name] pops open!</span>", \
|
||||
"<span class='userdanger'>You force open the padlock!</span>", "<i>You hear a single, pronounced click!</i>")
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
struggling = FALSE
|
||||
else
|
||||
..()
|
||||
@@ -116,7 +116,7 @@
|
||||
|
||||
/obj/item/reverse_bear_trap/proc/reset()
|
||||
ticking = FALSE
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
soundloop.stop()
|
||||
soundloop2.stop()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
@@ -125,7 +125,7 @@
|
||||
ticking = TRUE
|
||||
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
|
||||
time_left = initial(time_left)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
soundloop.start()
|
||||
soundloop2.mid_length = initial(soundloop2.mid_length)
|
||||
soundloop2.start()
|
||||
|
||||
@@ -279,12 +279,8 @@
|
||||
/obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user)
|
||||
if(ishuman(user))
|
||||
to_chat(user,"<font size='15' color='red'><b>HORSIE HAS RISEN</b></font>")
|
||||
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
|
||||
magichead.item_flags |= NODROP //curses!
|
||||
magichead.flags_inv &= ~HIDEFACE //so you can still see their face
|
||||
magichead.voicechange = TRUE //NEEEEIIGHH
|
||||
if(!user.dropItemToGround(user.wear_mask))
|
||||
qdel(user.wear_mask)
|
||||
var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location())
|
||||
user.dropItemToGround(user.wear_mask, TRUE)
|
||||
user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
name = "artistic toolbox"
|
||||
desc = "A toolbox painted bright green. Looking at it makes you feel uneasy."
|
||||
icon_state = "his_grace"
|
||||
item_state = "artistic_toolbox"
|
||||
item_state = "toolbox_green"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
@@ -90,7 +90,7 @@
|
||||
do_attack_animation(master, null, src)
|
||||
master.emote("scream")
|
||||
master.remove_status_effect(STATUS_EFFECT_HISGRACE)
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
master.Knockdown(60)
|
||||
master.adjustBruteLoss(master.maxHealth)
|
||||
playsound(master, 'sound/effects/splat.ogg', 100, 0)
|
||||
@@ -198,20 +198,20 @@
|
||||
update_stats()
|
||||
|
||||
/obj/item/his_grace/proc/update_stats()
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
var/mob/living/master = get_atom_on_turf(src, /mob/living)
|
||||
switch(bloodthirst)
|
||||
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
||||
if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst)
|
||||
master.visible_message("<span class='userdanger'>[src] enters a frenzy!</span>")
|
||||
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
if(HIS_GRACE_STARVING > prev_bloodthirst)
|
||||
master.visible_message("<span class='boldwarning'>[src] is starving!</span>", "<span class='his_grace big'>[src]'s bloodlust overcomes you. [src] must be fed, or you will become His meal.\
|
||||
[force_bonus < 15 ? " And still, His power grows.":""]</span>")
|
||||
force_bonus = max(force_bonus, 15)
|
||||
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
||||
if(HIS_GRACE_FAMISHED > prev_bloodthirst)
|
||||
master.visible_message("<span class='warning'>[src] is very hungry!</span>", "<span class='his_grace big'>Spines sink into your hand. [src] must feed immediately.\
|
||||
[force_bonus < 10 ? " His power grows.":""]</span>")
|
||||
|
||||
@@ -280,12 +280,19 @@
|
||||
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
name = "god hand"
|
||||
desc = "This hand of yours glows with an awesome power!"
|
||||
item_flags = ABSTRACT | NODROP | DROPDEL
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
hitsound = 'sound/weapons/sear.ogg'
|
||||
damtype = BURN
|
||||
attack_verb = list("punched", "cross countered", "pummeled")
|
||||
|
||||
|
||||
/obj/item/nullrod/godhand/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
|
||||
|
||||
|
||||
/obj/item/nullrod/staff
|
||||
icon_state = "godstaff-red"
|
||||
item_state = "godstaff-red"
|
||||
@@ -525,13 +532,14 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = NODROP | ABSTRACT
|
||||
item_flags = ABSTRACT
|
||||
sharpness = IS_SHARP
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsawhit.ogg'
|
||||
|
||||
/obj/item/nullrod/chainsaw/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
AddComponent(/datum/component/butchering, 30, 100, 0, hitsound)
|
||||
|
||||
/obj/item/nullrod/clown
|
||||
@@ -601,12 +609,13 @@
|
||||
item_state = "arm_blade"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
item_flags = ABSTRACT | NODROP
|
||||
item_flags = ABSTRACT
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/nullrod/armblade/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
AddComponent(/datum/component/butchering, 80, 70)
|
||||
|
||||
/obj/item/nullrod/armblade/tentacle
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
return
|
||||
update_icon()
|
||||
if(sticky)
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
|
||||
name = "primed [name]"
|
||||
activation_time = timer + world.time
|
||||
detonation_timerid = addtimer(CALLBACK(src, .proc/detonate), delay, TIMER_STOPPABLE)
|
||||
@@ -147,7 +147,7 @@
|
||||
/obj/item/hot_potato/proc/deactivate()
|
||||
update_icon()
|
||||
name = initial(name)
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
|
||||
deltimer(detonation_timerid)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
detonation_timerid = null
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
force = 20
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/melee/synthetic_arm_blade/Initialize()
|
||||
@@ -92,8 +92,7 @@
|
||||
/obj/item/melee/sabre/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
var/i = 0
|
||||
var/originally_nodropped = item_flags & NODROP
|
||||
item_flags |= NODROP
|
||||
ADD_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/Cuser = user
|
||||
var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src)
|
||||
@@ -118,7 +117,7 @@
|
||||
for(bodypart in limbs_to_dismember)
|
||||
i++
|
||||
addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i)
|
||||
addtimer(CALLBACK(src, .proc/manual_suicide, user, originally_nodropped), (5 SECONDS) * i)
|
||||
addtimer(CALLBACK(src, .proc/manual_suicide, user), (5 SECONDS) * i)
|
||||
return MANUAL_SUICIDE
|
||||
|
||||
/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting)
|
||||
@@ -131,8 +130,29 @@
|
||||
if(!QDELETED(user))
|
||||
user.adjustBruteLoss(200)
|
||||
user.death(FALSE)
|
||||
if(!originally_nodropped)
|
||||
item_flags &= ~NODROP
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
||||
|
||||
/obj/item/melee/rapier
|
||||
name = "plastitanium rapier"
|
||||
desc = "A impossibly thin blade made of plastitanium with a tip made of diamond. It looks to be able to cut through any armor."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "rapier"
|
||||
item_state = "rapier"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
force = 25
|
||||
throwforce = 35
|
||||
block_chance = 0
|
||||
armour_penetration = 100
|
||||
flags_1 = CONDUCT_1
|
||||
obj_flags = UNIQUE_RENAME
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
|
||||
attack_verb = list("slashed", "cut", "pierces", "pokes")
|
||||
|
||||
/obj/item/melee/rapier/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 20, 65, 0)
|
||||
|
||||
/obj/item/melee/classic_baton
|
||||
name = "police baton"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/mopping = 0
|
||||
var/mopcount = 0
|
||||
var/mopcap = 5
|
||||
var/stamusage = 5
|
||||
var/stamusage = 2
|
||||
force_string = "robust... against germs"
|
||||
var/insertable = TRUE
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
force = 6
|
||||
throwforce = 8
|
||||
throw_range = 4
|
||||
stamusage = 2
|
||||
stamusage = 1
|
||||
var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water.
|
||||
var/refill_rate = 1 //Rate per process() tick mop refills itself
|
||||
var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING
|
||||
|
||||
@@ -578,10 +578,6 @@
|
||||
icon_state = "vulken"
|
||||
item_state = "vulken"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie/jecca
|
||||
icon_state = "jecca"
|
||||
item_state = "jecca"
|
||||
|
||||
/obj/item/toy/plush/nukeplushie
|
||||
name = "operative plushie"
|
||||
desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
|
||||
@@ -634,13 +630,9 @@
|
||||
/obj/item/toy/plush/mothplushie
|
||||
name = "insect plushie"
|
||||
desc = "An adorable stuffed toy that resembles some kind of insect"
|
||||
icon_state = "cydia"
|
||||
item_state = "cydia"
|
||||
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mothplushie/bumble
|
||||
icon_state = "bumble"
|
||||
item_state = "bumble"
|
||||
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mothplushie/nameko
|
||||
icon_state = "nameko"
|
||||
|
||||
@@ -424,6 +424,8 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \
|
||||
new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
|
||||
new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
|
||||
null,
|
||||
new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/holyoil/null), \
|
||||
|
||||
))
|
||||
|
||||
@@ -441,7 +443,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
throw_range = 3
|
||||
turf_type = /turf/open/floor/clockwork
|
||||
novariants = FALSE
|
||||
grind_results = list("iron" = 5, "teslium" = 15)
|
||||
grind_results = list("iron" = 5, "teslium" = 15, "holyoil" = 1)
|
||||
merge_type = /obj/item/stack/tile/brass
|
||||
|
||||
/obj/item/stack/tile/brass/narsie_act()
|
||||
|
||||
@@ -664,6 +664,32 @@
|
||||
/obj/item/melee/sabre
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier
|
||||
name = "rapier sheath"
|
||||
desc = "A black, thin sheath that looks to house only a long thin blade. Feels like its made of metal."
|
||||
icon_state = "rsheath"
|
||||
item_state = "rsheath"
|
||||
force = 5
|
||||
throwforce = 15
|
||||
block_chance = 30
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
attack_verb = list("bashed", "slashes", "prods", "pokes")
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_items = 1
|
||||
STR.rustle_sound = FALSE
|
||||
STR.max_w_class = WEIGHT_CLASS_BULKY
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/melee/rapier
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(attack_type == PROJECTILE_ATTACK)
|
||||
final_block_chance = 0 //To thin to block bullets
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/belt/sabre/examine(mob/user)
|
||||
..()
|
||||
if(length(contents))
|
||||
@@ -681,8 +707,8 @@
|
||||
to_chat(user, "[src] is empty.")
|
||||
|
||||
/obj/item/storage/belt/sabre/update_icon()
|
||||
icon_state = "sheath"
|
||||
item_state = "sheath"
|
||||
icon_state = initial(icon_state)
|
||||
item_state = initial(item_state)
|
||||
if(contents.len)
|
||||
icon_state += "-sabre"
|
||||
item_state += "-sabre"
|
||||
@@ -694,3 +720,7 @@
|
||||
/obj/item/storage/belt/sabre/PopulateContents()
|
||||
new /obj/item/melee/sabre(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/belt/sabre/rapier/PopulateContents()
|
||||
new /obj/item/melee/rapier(src)
|
||||
update_icon()
|
||||
|
||||
@@ -74,6 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
||||
if(B.icon_state == "honk1" || B.icon_state == "honk2")
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.dna.add_mutation(CLOWNMUT)
|
||||
H.dna.add_mutation(SMILE)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK)
|
||||
|
||||
GLOB.bible_icon_state = B.icon_state
|
||||
@@ -138,7 +139,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
||||
smack = 0
|
||||
else if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!istype(C.head, /obj/item/clothing/head))
|
||||
if(!istype(C.head, /obj/item/clothing/head))
|
||||
C.adjustBrainLoss(10, 80)
|
||||
to_chat(C, "<span class='danger'>You feel dumber.</span>")
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
|
||||
|
||||
/obj/item/storage/toolbox
|
||||
name = "toolbox"
|
||||
desc = "Danger. Very robust."
|
||||
@@ -16,21 +18,25 @@
|
||||
hitsound = 'sound/weapons/smash.ogg'
|
||||
var/latches = "single_latch"
|
||||
var/has_latches = TRUE
|
||||
var/can_rubberify = TRUE
|
||||
|
||||
/obj/item/storage/toolbox/Initialize()
|
||||
/obj/item/storage/toolbox/Initialize(mapload)
|
||||
. = ..()
|
||||
if(has_latches)
|
||||
if(prob(10))
|
||||
latches = "double_latch"
|
||||
if(prob(1))
|
||||
latches = "triple_latch"
|
||||
if(mapload && can_rubberify && prob(5))
|
||||
rubberify()
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/toolbox/update_icon()
|
||||
..()
|
||||
cut_overlays()
|
||||
if(has_latches)
|
||||
add_overlay(latches)
|
||||
var/icon/I = icon('icons/obj/storage.dmi', latches)
|
||||
add_overlay(I)
|
||||
|
||||
|
||||
/obj/item/storage/toolbox/suicide_act(mob/user)
|
||||
@@ -39,8 +45,6 @@
|
||||
|
||||
/obj/item/storage/toolbox/emergency
|
||||
name = "emergency toolbox"
|
||||
icon_state = "red"
|
||||
item_state = "toolbox_red"
|
||||
|
||||
/obj/item/storage/toolbox/emergency/PopulateContents()
|
||||
new /obj/item/crowbar/red(src)
|
||||
@@ -59,6 +63,7 @@
|
||||
name = "rusty red toolbox"
|
||||
icon_state = "toolbox_red_old"
|
||||
has_latches = FALSE
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/mechanical
|
||||
name = "mechanical toolbox"
|
||||
@@ -77,6 +82,7 @@
|
||||
name = "rusty blue toolbox"
|
||||
icon_state = "toolbox_blue_old"
|
||||
has_latches = FALSE
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old/heirloom
|
||||
name = "old, robust toolbox" //this will be named "X family toolbox"
|
||||
@@ -151,6 +157,7 @@
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
attack_verb = list("robusted", "crushed", "smashed")
|
||||
can_rubberify = FALSE
|
||||
var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab
|
||||
|
||||
/obj/item/storage/toolbox/brass/ComponentInitialize()
|
||||
@@ -191,6 +198,7 @@
|
||||
item_state = "toolbox_blue"
|
||||
w_class = WEIGHT_CLASS_HUGE //heyo no bohing this!
|
||||
force = 18 //spear damage
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/plastitanium/afterattack(atom/A, mob/user, proximity)
|
||||
. = ..()
|
||||
@@ -204,7 +212,7 @@
|
||||
name = "artistic toolbox"
|
||||
desc = "A toolbox painted bright green. Why anyone would store art supplies in a toolbox is beyond you, but it has plenty of extra space."
|
||||
icon_state = "green"
|
||||
item_state = "artistic_toolbox"
|
||||
item_state = "toolbox_green"
|
||||
w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox!
|
||||
|
||||
/obj/item/storage/toolbox/artistic/ComponentInitialize()
|
||||
@@ -253,9 +261,55 @@
|
||||
|
||||
/obj/item/storage/toolbox/gold_fake // used in crafting
|
||||
name = "golden toolbox"
|
||||
desc = "A gold plated toolbox, fancy and harmless do to the gold plating being on cardboard!"
|
||||
desc = "A gold plated toolbox, fancy and harmless due to the gold plating being on cardboard!"
|
||||
icon_state = "gold"
|
||||
item_state = "gold"
|
||||
has_latches = FALSE
|
||||
force = 0
|
||||
throwforce = 0
|
||||
can_rubberify = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/proc/rubberify()
|
||||
name = "rubber [name]"
|
||||
desc = replacetext(desc, "Danger", "Bouncy")
|
||||
desc = replacetext(desc, "robust", "safe")
|
||||
desc = replacetext(desc, "heavier", "bouncier")
|
||||
DISABLE_BITFIELD(flags_1, CONDUCT_1)
|
||||
materials = null
|
||||
damtype = STAMINA
|
||||
force += 3 //to compensate the higher stamina K.O. threshold compared to actual health.
|
||||
throwforce += 3
|
||||
attack_verb += "bounced"
|
||||
hitsound = 'sound/effects/clownstep1.ogg'
|
||||
if(!GLOB.rubber_toolbox_icons[icon_state])
|
||||
generate_rubber_toolbox_icon()
|
||||
icon = GLOB.rubber_toolbox_icons[icon_state]
|
||||
AddComponent(/datum/component/bouncy)
|
||||
. = ..()
|
||||
|
||||
/obj/item/storage/toolbox/proc/generate_rubber_toolbox_icon()
|
||||
var/icon/new_icon = icon(icon, icon_state)
|
||||
var/icon/smooth = icon('icons/obj/storage.dmi', "rubber_toolbox_blend")
|
||||
new_icon.Blend(smooth, ICON_MULTIPLY)
|
||||
new_icon = fcopy_rsc(new_icon)
|
||||
GLOB.rubber_toolbox_icons[icon_state] = new_icon
|
||||
|
||||
/obj/item/storage/toolbox/rubber
|
||||
name = "rubber toolbox"
|
||||
desc = "Bouncy. Very safe."
|
||||
flags_1 = null
|
||||
materials = null
|
||||
damtype = STAMINA
|
||||
force = 17
|
||||
throwforce = 17
|
||||
attack_verb = list("robusted", "bounced")
|
||||
can_rubberify = FALSE //we are already the future.
|
||||
|
||||
/obj/item/storage/toolbox/rubber/Initialize()
|
||||
icon_state = pick("blue", "red", "yellow", "green")
|
||||
item_state = "toolbox_[icon_state]"
|
||||
if(!GLOB.rubber_toolbox_icons[icon_state])
|
||||
generate_rubber_toolbox_icon()
|
||||
icon = GLOB.rubber_toolbox_icons[icon_state]
|
||||
. = ..()
|
||||
AddComponent(/datum/component/bouncy)
|
||||
@@ -6,10 +6,9 @@
|
||||
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
var/taste_sensitivity = 15
|
||||
speech_span = null
|
||||
|
||||
/obj/item/taster/get_spans()
|
||||
return list()
|
||||
var/taste_sensitivity = 15
|
||||
|
||||
/obj/item/taster/afterattack(atom/O, mob/user, proximity)
|
||||
. = ..()
|
||||
|
||||
@@ -34,6 +34,12 @@
|
||||
icon_state = "crowbar_brass"
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/crowbar/bronze
|
||||
name = "bronze plated crowbar"
|
||||
desc = "A bronze plated crowbar."
|
||||
icon_state = "crowbar_brass"
|
||||
toolspeed = 0.95
|
||||
|
||||
/obj/item/crowbar/abductor
|
||||
name = "alien crowbar"
|
||||
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
|
||||
@@ -42,7 +48,6 @@
|
||||
icon_state = "crowbar"
|
||||
toolspeed = 0.1
|
||||
|
||||
|
||||
/obj/item/crowbar/large
|
||||
name = "crowbar"
|
||||
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
|
||||
|
||||
@@ -86,6 +86,14 @@
|
||||
toolspeed = 0.5
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/screwdriver/bronze
|
||||
name = "bronze screwdriver"
|
||||
desc = "A screwdriver plated with bronze."
|
||||
icon_state = "screwdriver_brass"
|
||||
item_state = "screwdriver_brass"
|
||||
toolspeed = 0.95
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/screwdriver/abductor
|
||||
name = "alien screwdriver"
|
||||
desc = "An ultrasonic screwdriver."
|
||||
|
||||
@@ -363,6 +363,13 @@
|
||||
icon_state = "brasswelder"
|
||||
item_state = "brasswelder"
|
||||
|
||||
/obj/item/weldingtool/bronze
|
||||
name = "bronze plated welding tool"
|
||||
desc = "A bronze plated welder."
|
||||
max_fuel = 21
|
||||
toolspeed = 0.95
|
||||
icon_state = "brasswelder"
|
||||
item_state = "brasswelder"
|
||||
|
||||
/obj/item/weldingtool/experimental/process()
|
||||
..()
|
||||
|
||||
@@ -69,6 +69,13 @@
|
||||
random_color = FALSE
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/wirecutters/bronze
|
||||
name = "bronze plated wirecutters"
|
||||
desc = "A pair of wirecutters plated with bronze."
|
||||
icon_state = "cutters_brass"
|
||||
random_color = FALSE
|
||||
toolspeed = 0.95 //Wire cutters have 0 time bars though
|
||||
|
||||
/obj/item/wirecutters/abductor
|
||||
name = "alien wirecutters"
|
||||
desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
|
||||
|
||||
@@ -35,6 +35,12 @@
|
||||
icon_state = "wrench_brass"
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/wrench/bronze
|
||||
name = "bronze plated wrench"
|
||||
desc = "A bronze plated wrench."
|
||||
icon_state = "wrench_brass"
|
||||
toolspeed = 0.95
|
||||
|
||||
/obj/item/wrench/abductor
|
||||
name = "alien wrench"
|
||||
desc = "A polarized wrench. It causes anything placed between the jaws to turn."
|
||||
@@ -43,7 +49,6 @@
|
||||
usesound = 'sound/effects/empulse.ogg'
|
||||
toolspeed = 0.1
|
||||
|
||||
|
||||
/obj/item/wrench/power
|
||||
name = "hand drill"
|
||||
desc = "A simple powered hand drill. It's fitted with a bolt bit."
|
||||
|
||||
@@ -249,8 +249,8 @@
|
||||
// Copied from /obj/item/melee/transforming/energy/sword/attackby
|
||||
/obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params)
|
||||
if(istype(W, /obj/item/toy/sword))
|
||||
if((W.item_flags & NODROP) || (item_flags & NODROP))
|
||||
to_chat(user, "<span class='warning'>\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!</span>")
|
||||
if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP))
|
||||
to_chat(user, "<span class='warning'>\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.</span>")
|
||||
@@ -294,7 +294,7 @@
|
||||
name = "windup toolbox"
|
||||
desc = "A replica toolbox that rumbles when you turn the key."
|
||||
icon_state = "his_grace"
|
||||
item_state = "artistic_toolbox"
|
||||
item_state = "toolbox_green"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
|
||||
var/active = FALSE
|
||||
|
||||
@@ -81,7 +81,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
/obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS
|
||||
desc = "<b><i>THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!</i></b>\nActivate it in your hand to point to the nearest victim."
|
||||
flags_1 = CONDUCT_1
|
||||
item_flags = NODROP | DROPDEL
|
||||
item_flags = DROPDEL
|
||||
slot_flags = null
|
||||
block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY
|
||||
light_range = 3
|
||||
@@ -91,6 +91,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
|
||||
/obj/item/claymore/highlander/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HIGHLANDER)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/claymore/highlander/Destroy()
|
||||
@@ -225,7 +226,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
|
||||
/obj/item/katana/cursed
|
||||
slot_flags = null
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/katana/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
|
||||
|
||||
/obj/item/katana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!</span>")
|
||||
@@ -255,7 +259,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
user.put_in_hands(S)
|
||||
to_chat(user, "<span class='notice'>You fasten the glass shard to the top of the rod with the cable.</span>")
|
||||
|
||||
else if(istype(I, /obj/item/assembly/igniter) && !(I.item_flags & NODROP))
|
||||
else if(istype(I, /obj/item/assembly/igniter) && !HAS_TRAIT(I, TRAIT_NODROP))
|
||||
var/obj/item/melee/baton/cattleprod/P = new /obj/item/melee/baton/cattleprod
|
||||
|
||||
remove_item_from_storage(user)
|
||||
@@ -418,7 +422,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
item_state = "mounted_chainsaw"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
|
||||
item_flags = NODROP | ABSTRACT | DROPDEL
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 24
|
||||
throwforce = 0
|
||||
@@ -428,6 +432,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsawhit.ogg'
|
||||
|
||||
/obj/item/mounted_chainsaw/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
|
||||
/obj/item/mounted_chainsaw/Destroy()
|
||||
var/obj/item/bodypart/part
|
||||
new /obj/item/twohanded/required/chainsaw(get_turf(src))
|
||||
|
||||
@@ -48,7 +48,12 @@
|
||||
|
||||
/obj/hitby(atom/movable/AM)
|
||||
..()
|
||||
take_damage(AM.throwforce, BRUTE, "melee", 1, get_dir(src, AM))
|
||||
var/throwdamage = AM.throwforce
|
||||
if(isobj(AM))
|
||||
var/obj/O = AM
|
||||
if(O.damtype == STAMINA)
|
||||
throwdamage = 0
|
||||
take_damage(throwdamage, BRUTE, "melee", 1, get_dir(src, AM))
|
||||
|
||||
/obj/ex_act(severity, target)
|
||||
if(resistance_flags & INDESTRUCTIBLE)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/obj
|
||||
var/crit_fail = FALSE
|
||||
animate_movement = 2
|
||||
speech_span = SPAN_ROBOT
|
||||
var/obj_flags = CAN_BE_HIT
|
||||
var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT.
|
||||
|
||||
@@ -204,9 +205,6 @@
|
||||
if(!anchored || current_size >= STAGE_FIVE)
|
||||
step_towards(src,S)
|
||||
|
||||
/obj/get_spans()
|
||||
return ..() | SPAN_ROBOT
|
||||
|
||||
/obj/get_dumping_location(datum/component/storage/source,mob/user)
|
||||
return get_turf(src)
|
||||
|
||||
|
||||
@@ -294,6 +294,16 @@
|
||||
icon = "the_lightbulb"
|
||||
desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms."
|
||||
|
||||
/datum/barsign/cybersylph
|
||||
name = "Cyber Sylph's"
|
||||
icon = "cybersylph"
|
||||
desc = "A cafe renowed for its out-of-boundaries futuristic insignia."
|
||||
|
||||
/datum/barsign/meow_mix
|
||||
name = "Meow Mix"
|
||||
icon = "meow_mix"
|
||||
desc = "No, we don't serve catnip, officer!"
|
||||
|
||||
/datum/barsign/hiddensigns
|
||||
hidden = TRUE
|
||||
|
||||
|
||||
@@ -147,47 +147,48 @@
|
||||
/obj/structure/closet/proc/insert(atom/movable/AM)
|
||||
if(contents.len >= storage_capacity)
|
||||
return -1
|
||||
if(insertion_allowed(AM))
|
||||
AM.forceMove(src)
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/structure/closet/proc/insertion_allowed(atom/movable/AM)
|
||||
if(ismob(AM))
|
||||
if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets...
|
||||
return
|
||||
return FALSE
|
||||
var/mob/living/L = AM
|
||||
if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs())
|
||||
return
|
||||
return FALSE
|
||||
if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items.
|
||||
if(horizontal && L.density)
|
||||
return
|
||||
return FALSE
|
||||
if(L.mob_size > max_mob_size)
|
||||
return
|
||||
return FALSE
|
||||
var/mobs_stored = 0
|
||||
for(var/mob/living/M in contents)
|
||||
if(++mobs_stored >= mob_storage_capacity)
|
||||
return
|
||||
return FALSE
|
||||
L.stop_pulling()
|
||||
|
||||
else if(istype(AM, /obj/structure/closet))
|
||||
return
|
||||
return FALSE
|
||||
|
||||
else if(istype(AM, /obj/effect))
|
||||
return
|
||||
return FALSE
|
||||
|
||||
else if(isobj(AM))
|
||||
if (istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
if (I.item_flags & NODROP)
|
||||
return
|
||||
if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs())
|
||||
return FALSE
|
||||
if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP))
|
||||
return TRUE
|
||||
else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon))
|
||||
return
|
||||
if(!allow_dense && AM.density)
|
||||
return
|
||||
if(AM.anchored || AM.has_buckled_mobs())
|
||||
return
|
||||
return FALSE
|
||||
else
|
||||
return
|
||||
return FALSE
|
||||
|
||||
AM.forceMove(src)
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/structure/closet/proc/close(mob/living/user)
|
||||
if(!opened || !can_close(user))
|
||||
|
||||
@@ -21,35 +21,62 @@
|
||||
|
||||
/obj/structure/dresser/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(. || !ishuman(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
if(!Adjacent(user))//no tele-grooming
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(H.dna && H.dna.species && (NO_UNDERWEAR in H.dna.species.species_traits))
|
||||
to_chat(H, "<span class='warning'>You are not capable of wearing underwear.</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(H.dna && H.dna.species && (NO_UNDERWEAR in H.dna.species.species_traits))
|
||||
to_chat(user, "<span class='warning'>You are not capable of wearing underwear.</span>")
|
||||
return
|
||||
var/list/undergarment_choices = list("Underwear", "Underwear Color", "Undershirt", "Undershirt Color", "Socks", "Socks Color")
|
||||
if(!UNDIE_COLORABLE(GLOB.underwear_list[H.underwear]))
|
||||
undergarment_choices -= "Underwear Color"
|
||||
if(!UNDIE_COLORABLE(GLOB.undershirt_list[H.undershirt]))
|
||||
undergarment_choices -= "Undershirt Color"
|
||||
if(!UNDIE_COLORABLE(GLOB.socks_list[H.socks]))
|
||||
undergarment_choices -= "Socks Color"
|
||||
|
||||
var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks")
|
||||
var/choice = input(H, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in undergarment_choices
|
||||
if(!H.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
var/dye_undie = FALSE
|
||||
var/dye_shirt = FALSE
|
||||
var/dye_socks = FALSE
|
||||
switch(choice)
|
||||
if("Underwear")
|
||||
var/new_undies = input(H, "Select your underwear", "Changing") as null|anything in GLOB.underwear_list
|
||||
if(H.underwear)
|
||||
H.underwear = new_undies
|
||||
H.saved_underwear = new_undies
|
||||
var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[new_undies]
|
||||
dye_undie = B?.has_color
|
||||
if("Undershirt")
|
||||
var/new_undershirt = input(H, "Select your undershirt", "Changing") as null|anything in GLOB.undershirt_list
|
||||
if(new_undershirt)
|
||||
H.undershirt = new_undershirt
|
||||
H.saved_undershirt = new_undershirt
|
||||
var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[new_undershirt]
|
||||
dye_shirt = T?.has_color
|
||||
if("Socks")
|
||||
var/new_socks = input(H, "Select your socks", "Changing") as null|anything in GLOB.socks_list
|
||||
if(new_socks)
|
||||
H.socks = new_socks
|
||||
H.saved_socks = new_socks
|
||||
var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[new_socks]
|
||||
dye_socks = S?.has_color
|
||||
if(dye_undie || choice == "Underwear Color")
|
||||
H.undie_color = recolor_undergarment(H, "underwear", H.undie_color)
|
||||
if(dye_shirt || choice == "Undershirt Color")
|
||||
H.shirt_color = recolor_undergarment(H, "undershirt", H.shirt_color)
|
||||
if(dye_socks || choice == "Socks Color")
|
||||
H.socks_color = recolor_undergarment(H, "socks", H.socks_color)
|
||||
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
switch(choice)
|
||||
if("Underwear")
|
||||
var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in GLOB.underwear_list
|
||||
if(new_undies)
|
||||
H.underwear = new_undies
|
||||
add_fingerprint(H)
|
||||
H.update_body()
|
||||
|
||||
if("Undershirt")
|
||||
var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in GLOB.undershirt_list
|
||||
if(new_undershirt)
|
||||
H.undershirt = new_undershirt
|
||||
if("Socks")
|
||||
var/new_socks = input(user, "Select your socks", "Changing") as null|anything in GLOB.socks_list
|
||||
if(new_socks)
|
||||
H.socks= new_socks
|
||||
|
||||
add_fingerprint(H)
|
||||
H.update_body()
|
||||
/obj/structure/dresser/proc/recolor_undergarment(mob/living/carbon/human/H, garment_type = "underwear", default_color)
|
||||
var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null
|
||||
if(!n_color || !H.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return default_color
|
||||
return n_color
|
||||
|
||||
@@ -262,7 +262,7 @@
|
||||
if(isobj(AM))
|
||||
if(prob(50) && anchored && !broken)
|
||||
var/obj/O = AM
|
||||
if(O.throwforce != 0)//don't want to let people spam tesla bolts, this way it will break after time
|
||||
if(O.throwforce != 0 && O.damtype != STAMINA)//don't want to let people spam tesla bolts, this way it will break after time
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(C)
|
||||
|
||||
@@ -180,12 +180,13 @@
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "offhand"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = ABSTRACT | NODROP | NOBLUDGEON | DROPDEL
|
||||
item_flags = ABSTRACT | NOBLUDGEON | DROPDEL
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/obj/machinery/manned_turret/turret
|
||||
|
||||
/obj/item/gun_control/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
|
||||
turret = loc
|
||||
if(!istype(turret))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
Reference in New Issue
Block a user