mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 08:34:16 +01:00
Merge remote-tracking branch 'upstream/master' into crusher-trophies
This commit is contained in:
@@ -161,7 +161,9 @@
|
||||
var/emoji_msg = "<span class='emoji_enabled'>[msg]</span>"
|
||||
recieve_message = "<span class='[recieve_span]'>[type] from-<b>[recieve_pm_type][C.holder ? key_name(src, TRUE, type) : key_name_hidden(src, TRUE, type)]</b>: [emoji_msg]</span>"
|
||||
to_chat(C, recieve_message)
|
||||
to_chat(src, "<span class='pmsend'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]</b>: [emoji_msg]</span>")
|
||||
var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(<a href='?src=[pm_tracker.UID()];ping=[C.key]'>PING</a>)" : ""
|
||||
var/window_link = "(<a href='?src=[pm_tracker.UID()];newtitle=[C.key]'>WINDOW</a>)"
|
||||
to_chat(src, "<span class='pmsend'>[send_pm_type][type] to-<b>[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]</b>: [emoji_msg]</span> [ping_link] [window_link]")
|
||||
|
||||
/*if(holder && !C.holder)
|
||||
C.last_pm_recieved = world.time
|
||||
@@ -380,7 +382,6 @@
|
||||
window_flash(C)
|
||||
C.pm_tracker.show_ui(C.mob)
|
||||
to_chat(usr, "<span class='notice'>Forced open [C]'s messages window.</span>")
|
||||
show_ui(usr)
|
||||
return
|
||||
|
||||
if(href_list["reply"])
|
||||
|
||||
@@ -433,6 +433,9 @@
|
||||
GLOB.admins -= src
|
||||
GLOB.directory -= ckey
|
||||
GLOB.clients -= src
|
||||
if(movingmob)
|
||||
movingmob.client_mobs_in_contents -= mob
|
||||
UNSETEMPTY(movingmob.client_mobs_in_contents)
|
||||
Master.UpdateTickRate()
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -201,6 +201,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
//Gear stuff
|
||||
var/list/gear = list()
|
||||
var/gear_tab = "General"
|
||||
// Parallax
|
||||
var/parallax = PARALLAX_HIGH
|
||||
|
||||
/datum/preferences/New(client/C)
|
||||
parent = C
|
||||
@@ -462,6 +464,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<b>OOC Color:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'> </span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
|
||||
if(config.allow_Metadata)
|
||||
dat += "<b>OOC Notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
|
||||
dat += "<b>Parallax (Fancy Space):</b> <a href='?_src_=prefs;preference=parallax'>"
|
||||
switch (parallax)
|
||||
if(PARALLAX_LOW)
|
||||
dat += "Low"
|
||||
if(PARALLAX_MED)
|
||||
dat += "Medium"
|
||||
if(PARALLAX_INSANE)
|
||||
dat += "Insane"
|
||||
if(PARALLAX_DISABLE)
|
||||
dat += "Disabled"
|
||||
else
|
||||
dat += "High"
|
||||
dat += "</a><br>"
|
||||
dat += "<b>Play Admin MIDIs:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Play Lobby Music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Randomized Character Slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
|
||||
@@ -2072,6 +2087,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(href_list["tab"])
|
||||
current_tab = text2num(href_list["tab"])
|
||||
|
||||
|
||||
if("ambientocclusion")
|
||||
toggles ^= AMBIENT_OCCLUSION
|
||||
if(parent && parent.screen && parent.screen.len)
|
||||
@@ -2080,6 +2096,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(toggles & AMBIENT_OCCLUSION)
|
||||
PM.filters += FILTER_AMBIENT_OCCLUSION
|
||||
|
||||
if("parallax")
|
||||
var/parallax_styles = list(
|
||||
"Off" = PARALLAX_DISABLE,
|
||||
"Low" = PARALLAX_LOW,
|
||||
"Medium" = PARALLAX_MED,
|
||||
"High" = PARALLAX_HIGH,
|
||||
"Insane" = PARALLAX_INSANE
|
||||
)
|
||||
parallax = parallax_styles[input(user, "Pick a parallax style", "Parallax Style") as null|anything in parallax_styles]
|
||||
if(parent && parent.mob && parent.mob.hud_used)
|
||||
parent.mob.hud_used.update_parallax_pref()
|
||||
|
||||
|
||||
ShowChoices(user)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
clientfps,
|
||||
atklog,
|
||||
fuid,
|
||||
afk_watch
|
||||
afk_watch,
|
||||
parallax
|
||||
FROM [format_table_name("player")]
|
||||
WHERE ckey='[C.ckey]'"}
|
||||
)
|
||||
@@ -54,6 +55,7 @@
|
||||
atklog = text2num(query.item[18])
|
||||
fuid = text2num(query.item[19])
|
||||
afk_watch = text2num(query.item[20])
|
||||
parallax = text2num(query.item[21])
|
||||
|
||||
//Sanitize
|
||||
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
|
||||
@@ -75,6 +77,7 @@
|
||||
atklog = sanitize_integer(atklog, 0, 100, initial(atklog))
|
||||
fuid = sanitize_integer(fuid, 0, 10000000, initial(fuid))
|
||||
afk_watch = sanitize_integer(afk_watch, 0, 1, initial(afk_watch))
|
||||
parallax = sanitize_integer(parallax, 0, 16, initial(parallax))
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/save_preferences(client/C)
|
||||
@@ -105,7 +108,8 @@
|
||||
ghost_anonsay='[ghost_anonsay]',
|
||||
clientfps='[clientfps]',
|
||||
atklog='[atklog]',
|
||||
afk_watch='[afk_watch]'
|
||||
afk_watch='[afk_watch]',
|
||||
parallax='[parallax]'
|
||||
WHERE ckey='[C.ckey]'"}
|
||||
)
|
||||
|
||||
|
||||
@@ -38,6 +38,21 @@
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
burn_state = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/gloves/bracer
|
||||
name = "bone bracers"
|
||||
desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
|
||||
icon_state = "bracers"
|
||||
item_state = "bracers"
|
||||
item_color = null //So they don't wash.
|
||||
transfer_prints = TRUE
|
||||
strip_delay = 40
|
||||
body_parts_covered = ARMS
|
||||
cold_protection = ARMS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
|
||||
resistance_flags = NONE
|
||||
armor = list(melee = 15, bullet = 25, laser = 15, energy = 15, bomb = 20, bio = 10, rad = 0)
|
||||
|
||||
/obj/item/clothing/gloves/botanic_leather
|
||||
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
|
||||
name = "botanist's leather gloves"
|
||||
|
||||
@@ -527,14 +527,15 @@
|
||||
icon_state = "bonearmor"
|
||||
item_state = "bonearmor"
|
||||
blood_overlay_type = "armor"
|
||||
armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
armor = list(melee = 35, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
|
||||
|
||||
/obj/item/clothing/head/skullhelmet
|
||||
/obj/item/clothing/head/helmet/skull
|
||||
name = "skull helmet"
|
||||
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES
|
||||
armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 40, "acid" = 20)
|
||||
armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20)
|
||||
icon_state = "skull"
|
||||
item_state = "skull"
|
||||
item_state = "skull"
|
||||
strip_delay = 100
|
||||
@@ -385,42 +385,11 @@
|
||||
)
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/bonfire
|
||||
name = "Bonfire"
|
||||
time = 60
|
||||
reqs = list(/obj/item/grown/log = 5)
|
||||
result = /obj/structure/bonfire
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/boneaxe
|
||||
name = "Bone Axe"
|
||||
result = /obj/item/twohanded/fireaxe/boneaxe
|
||||
time = 50
|
||||
reqs = list(/obj/item/stack/sheet/bone = 6,
|
||||
/obj/item/stack/sheet/sinew = 3)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonespear
|
||||
name = "Bone Spear"
|
||||
result = /obj/item/twohanded/spear/bonespear
|
||||
/datum/crafting_recipe/bonearmor
|
||||
name = "Bone Armor"
|
||||
result = /obj/item/clothing/suit/armor/bone
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/bone = 4,
|
||||
/obj/item/stack/sheet/sinew = 1)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonedagger
|
||||
name = "Bone Dagger"
|
||||
result = /obj/item/kitchen/knife/combat/survival/bone
|
||||
time = 20
|
||||
reqs = list(/obj/item/stack/sheet/bone = 2)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonecodpiece
|
||||
name = "Skull Codpiece"
|
||||
result = /obj/item/clothing/accessory/necklace/skullcodpiece
|
||||
time = 20
|
||||
reqs = list(/obj/item/stack/sheet/bone = 2,
|
||||
/obj/item/stack/sheet/animalhide/goliath_hide = 1)
|
||||
reqs = list(/obj/item/stack/sheet/bone = 6)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonetalisman
|
||||
@@ -431,16 +400,25 @@
|
||||
/obj/item/stack/sheet/sinew = 1)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonearmor
|
||||
name = "Bone Armor"
|
||||
result = /obj/item/clothing/suit/armor/bone
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/bone = 6)
|
||||
/datum/crafting_recipe/bonecodpiece
|
||||
name = "Skull Codpiece"
|
||||
result = /obj/item/clothing/accessory/necklace/skullcodpiece
|
||||
time = 20
|
||||
reqs = list(/obj/item/stack/sheet/bone = 2,
|
||||
/obj/item/stack/sheet/animalhide/goliath_hide = 1)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bracers
|
||||
name = "Bone Bracers"
|
||||
result = /obj/item/clothing/gloves/bracer
|
||||
time = 20
|
||||
reqs = list(/obj/item/stack/sheet/bone = 2,
|
||||
/obj/item/stack/sheet/sinew = 1)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/skullhelm
|
||||
name = "Skull Helmet"
|
||||
result = /obj/item/clothing/head/skullhelmet
|
||||
result = /obj/item/clothing/head/helmet/skull
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/bone = 4)
|
||||
category = CAT_PRIMAL
|
||||
@@ -463,6 +441,13 @@
|
||||
/obj/item/stack/sheet/animalhide/ashdrake = 5)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/firebrand
|
||||
name = "Firebrand"
|
||||
result = /obj/item/match/firebrand
|
||||
time = 100 //Long construction time. Making fire is hard work.
|
||||
reqs = list(/obj/item/stack/sheet/wood = 2)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/tribal_splint
|
||||
name = "Tribal Splint"
|
||||
time = 20
|
||||
@@ -471,6 +456,50 @@
|
||||
result = /obj/item/stack/medical/splint/tribal
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonedagger
|
||||
name = "Bone Dagger"
|
||||
result = /obj/item/kitchen/knife/combat/survival/bone
|
||||
time = 20
|
||||
reqs = list(/obj/item/stack/sheet/bone = 2)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonespear
|
||||
name = "Bone Spear"
|
||||
result = /obj/item/twohanded/spear/bonespear
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/bone = 4,
|
||||
/obj/item/stack/sheet/sinew = 1)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/boneaxe
|
||||
name = "Bone Axe"
|
||||
result = /obj/item/twohanded/fireaxe/boneaxe
|
||||
time = 50
|
||||
reqs = list(/obj/item/stack/sheet/bone = 6,
|
||||
/obj/item/stack/sheet/sinew = 3)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/bonfire
|
||||
name = "Bonfire"
|
||||
time = 60
|
||||
reqs = list(/obj/item/grown/log = 5)
|
||||
result = /obj/structure/bonfire
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/rake //Category resorting incoming
|
||||
name = "Rake"
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/wood = 5)
|
||||
result = /obj/item/cultivator/rake
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/woodbucket
|
||||
name = "Wooden Bucket"
|
||||
time = 30
|
||||
reqs = list(/obj/item/stack/sheet/wood = 3)
|
||||
result = /obj/item/reagent_containers/glass/bucket/wooden
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/guillotine
|
||||
name = "Guillotine"
|
||||
result = /obj/structure/guillotine
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
if(C)
|
||||
GLOB.respawnable_list -= C.client
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
|
||||
new_xeno.amount_grown += (0.75 * new_xeno.max_grown) //event spawned larva start off almost ready to evolve.
|
||||
new_xeno.key = C.key
|
||||
if(SSticker && SSticker.mode)
|
||||
SSticker.mode.xenos += new_xeno.mind
|
||||
|
||||
@@ -72,6 +72,16 @@
|
||||
attack_verb = list("slashed", "sliced", "cut", "clawed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/cultivator/rake
|
||||
name = "rake"
|
||||
icon_state = "rake"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("slashed", "sliced", "bashed", "clawed")
|
||||
hitsound = null
|
||||
materials = null
|
||||
flags = NONE
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/hatchet
|
||||
name = "hatchet"
|
||||
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
|
||||
|
||||
@@ -236,6 +236,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return 1
|
||||
|
||||
/mob/dead/observer/Move(NewLoc, direct)
|
||||
update_parallax_contents()
|
||||
following = null
|
||||
setDir(direct)
|
||||
ghostimage.setDir(dir)
|
||||
@@ -417,6 +418,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return
|
||||
|
||||
forceMove(pick(L))
|
||||
update_parallax_contents()
|
||||
following = null
|
||||
|
||||
/mob/dead/observer/verb/follow()
|
||||
@@ -511,6 +513,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
|
||||
A.forceMove(T)
|
||||
M.update_parallax_contents()
|
||||
following = null
|
||||
return
|
||||
to_chat(A, "This mob is not located in the game world.")
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
ai.camera_visibility(src)
|
||||
if(ai.client && !ai.multicam_on)
|
||||
ai.client.eye = src
|
||||
update_parallax_contents()
|
||||
//Holopad
|
||||
if(ai.master_multicam)
|
||||
ai.master_multicam.refresh_view()
|
||||
|
||||
@@ -407,7 +407,7 @@
|
||||
if(prob(95))
|
||||
head = /obj/item/clothing/head/helmet/gladiator
|
||||
else
|
||||
head = /obj/item/clothing/head/skullhelmet
|
||||
head = /obj/item/clothing/head/helmet/skull
|
||||
suit = /obj/item/clothing/suit/armor/bone
|
||||
if(prob(5))
|
||||
back = pickweight(list(/obj/item/twohanded/spear/bonespear = 3, /obj/item/twohanded/fireaxe/boneaxe = 2))
|
||||
|
||||
@@ -50,6 +50,12 @@
|
||||
var/obj/item/flashlight/gun_light = null
|
||||
var/can_flashlight = 0
|
||||
|
||||
var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one.
|
||||
var/obj/item/kitchen/knife/bayonet
|
||||
var/mutable_appearance/knife_overlay
|
||||
var/knife_x_offset = 0
|
||||
var/knife_y_offset = 0
|
||||
|
||||
var/list/upgrades = list()
|
||||
|
||||
var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite
|
||||
@@ -69,12 +75,27 @@
|
||||
verbs += /obj/item/gun/proc/toggle_gunlight
|
||||
build_zooming()
|
||||
|
||||
/obj/item/gun/Destroy()
|
||||
QDEL_NULL(bayonet)
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/handle_atom_del(atom/A)
|
||||
if(A == bayonet)
|
||||
clear_bayonet()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/examine(mob/user)
|
||||
..()
|
||||
if(unique_reskin && !current_skin)
|
||||
to_chat(user, "<span class='notice'>Alt-click it to reskin it.</span>")
|
||||
if(unique_rename)
|
||||
to_chat(user, "<span class='notice'>Use a pen on it to rename it.</span>")
|
||||
if(bayonet)
|
||||
to_chat(user, "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it.")
|
||||
if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent.
|
||||
to_chat(user, "<span class='info'>[bayonet] looks like it can be <b>unscrewed</b> from [src].</span>")
|
||||
else if(can_bayonet)
|
||||
to_chat(user, "It has a <b>bayonet</b> lug on it.")
|
||||
|
||||
/obj/item/gun/proc/process_chamber()
|
||||
return 0
|
||||
@@ -233,11 +254,19 @@ obj/item/gun/proc/newshot()
|
||||
user.update_inv_r_hand()
|
||||
feedback_add_details("gun_fired","[type]")
|
||||
|
||||
/obj/item/gun/attack(mob/M as mob, mob/user)
|
||||
/obj/item/gun/attack(mob/M, mob/user)
|
||||
if(user.a_intent == INTENT_HARM) //Flogging
|
||||
..()
|
||||
else
|
||||
return
|
||||
if(bayonet)
|
||||
M.attackby(bayonet, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/attack_obj(obj/O, mob/user)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(bayonet)
|
||||
O.attackby(bayonet, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/flashlight/seclite))
|
||||
@@ -257,7 +286,7 @@ obj/item/gun/proc/newshot()
|
||||
if(loc == user)
|
||||
A.Grant(user)
|
||||
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(isscrewdriver(I))
|
||||
if(gun_light && can_flashlight)
|
||||
for(var/obj/item/flashlight/seclite/S in src)
|
||||
to_chat(user, "<span class='notice'>You unscrew the seclite from [src].</span>")
|
||||
@@ -268,11 +297,32 @@ obj/item/gun/proc/newshot()
|
||||
update_icon()
|
||||
for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
|
||||
qdel(TGL)
|
||||
else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed
|
||||
bayonet.forceMove(get_turf(user))
|
||||
clear_bayonet()
|
||||
|
||||
if(unique_rename)
|
||||
if(istype(I, /obj/item/pen))
|
||||
rename_gun(user)
|
||||
..()
|
||||
if(istype(I, /obj/item/kitchen/knife))
|
||||
var/obj/item/kitchen/knife/K = I
|
||||
if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
|
||||
return ..()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
K.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You attach [K] to [src]'s bayonet lug.</span>")
|
||||
bayonet = K
|
||||
var/state = "bayonet" //Generic state.
|
||||
if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
|
||||
state = bayonet.icon_state
|
||||
var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
|
||||
knife_overlay = mutable_appearance(bayonet_icons, state)
|
||||
knife_overlay.pixel_x = knife_x_offset
|
||||
knife_overlay.pixel_y = knife_y_offset
|
||||
overlays += knife_overlay
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/proc/toggle_gunlight()
|
||||
set name = "Toggle Gun Light"
|
||||
@@ -305,6 +355,15 @@ obj/item/gun/proc/newshot()
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/gun/proc/clear_bayonet()
|
||||
if(!bayonet)
|
||||
return
|
||||
bayonet = null
|
||||
if(knife_overlay)
|
||||
overlays -= knife_overlay
|
||||
knife_overlay = null
|
||||
return TRUE
|
||||
|
||||
/obj/item/gun/extinguish_light()
|
||||
if(gun_light.on)
|
||||
toggle_gunlight()
|
||||
|
||||
@@ -101,6 +101,8 @@
|
||||
beakers += B
|
||||
to_chat(user, "<span class='notice'>You slot [B] into [src].</span>")
|
||||
src.updateUsrDialog()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/dartgun/can_shoot()
|
||||
if(!cartridge)
|
||||
|
||||
@@ -140,6 +140,8 @@
|
||||
if(gun_light.on)
|
||||
iconF = "flight_on"
|
||||
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
if(itemState)
|
||||
itemState += "[ratio]"
|
||||
item_state = itemState
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
var/holds_charge = FALSE
|
||||
var/unique_frequency = FALSE // modified by KA modkits
|
||||
var/overheat = FALSE
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 20
|
||||
knife_y_offset = 12
|
||||
|
||||
var/max_mod_capacity = 100
|
||||
var/list/modkits = list()
|
||||
@@ -148,6 +151,8 @@
|
||||
if(gun_light.on)
|
||||
iconF = "flight_on"
|
||||
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
|
||||
|
||||
/obj/item/gun/energy/kinetic_accelerator/experimental
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
power_supply.give(500)
|
||||
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/energy/plasmacutter/update_icon()
|
||||
return
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
to_chat(user, "<span class='notice'>[grenades.len] / [max_grenades] grenades.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The grenade launcher cannot hold more grenades.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
|
||||
if(target == user)
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
icon_state = "[current_skin][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
|
||||
else
|
||||
icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
|
||||
/obj/item/gun/projectile/process_chamber(eject_casing = 1, empty_chamber = 1)
|
||||
var/obj/item/ammo_casing/AC = chambered //Find chambered round
|
||||
@@ -66,7 +68,6 @@
|
||||
return
|
||||
|
||||
/obj/item/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/ammo_box/magazine))
|
||||
var/obj/item/ammo_box/magazine/AM = A
|
||||
if(istype(AM, mag_type))
|
||||
@@ -108,7 +109,8 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't seem to figure out how to fit [S] on [src].</span>")
|
||||
return
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/attack_hand(mob/user)
|
||||
if(loc == user)
|
||||
@@ -178,6 +180,9 @@
|
||||
if(sawn_state == SAWN_OFF)
|
||||
to_chat(user, "<span class='warning'>\The [src] is already shortened!</span>")
|
||||
return
|
||||
if(bayonet)
|
||||
to_chat(user, "<span class='warning'>You cannot saw-off [src] with [bayonet] attached!</span>")
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.visible_message("[user] begins to shorten \the [src].", "<span class='notice'>You begin to shorten \the [src]...</span>")
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
if(select == 1)
|
||||
overlays += "[initial(icon_state)]burst"
|
||||
icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
|
||||
if(bayonet && can_bayonet)
|
||||
overlays += knife_overlay
|
||||
|
||||
/obj/item/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob, params)
|
||||
. = ..()
|
||||
@@ -96,6 +98,9 @@
|
||||
fire_sound = 'sound/weapons/gunshots/gunshot_smg.ogg'
|
||||
fire_delay = 2
|
||||
burst_size = 2
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 26
|
||||
knife_y_offset = 12
|
||||
|
||||
/obj/item/gun/projectile/automatic/c20r/New()
|
||||
..()
|
||||
@@ -123,6 +128,9 @@
|
||||
can_suppress = 0
|
||||
burst_size = 1
|
||||
actions_types = list()
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 25
|
||||
knife_y_offset = 12
|
||||
|
||||
/obj/item/gun/projectile/automatic/wt550/update_icon()
|
||||
..()
|
||||
@@ -172,7 +180,7 @@
|
||||
underbarrel.attack_self()
|
||||
underbarrel.attackby(A, user, params)
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/automatic/m90/update_icon()
|
||||
..()
|
||||
|
||||
@@ -115,7 +115,6 @@
|
||||
..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/detective/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/screwdriver))
|
||||
if(magazine.caliber == "38")
|
||||
to_chat(user, "<span class='notice'>You begin to reinforce the barrel of [src]...</span>")
|
||||
@@ -143,6 +142,8 @@
|
||||
magazine.caliber = "38"
|
||||
desc = initial(desc)
|
||||
to_chat(user, "<span class='notice'>You remove the modifications on [src]. Now it will fire .38 rounds.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/fingergun //Summoned by the Finger Gun spell, from advanced mimery traitor item
|
||||
name = "\improper finger gun"
|
||||
@@ -347,7 +348,6 @@
|
||||
options["Cancel"] = null
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing))
|
||||
chamber_round()
|
||||
if(istype(A, /obj/item/melee/energy))
|
||||
@@ -356,6 +356,8 @@
|
||||
sawoff(user)
|
||||
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
|
||||
sawoff(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user)
|
||||
var/num_unloaded = 0
|
||||
@@ -394,7 +396,6 @@
|
||||
var/slung = 0
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/stack/cable_coil) && !sawn_state)
|
||||
var/obj/item/stack/cable_coil/C = A
|
||||
if(C.use(10))
|
||||
@@ -406,6 +407,8 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need at least ten lengths of cable if you want to make a sling.</span>")
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/update_icon()
|
||||
..()
|
||||
@@ -450,9 +453,10 @@
|
||||
return
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/stack/cable_coil))
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/examine(mob/user) // HAD TO REPEAT EXAMINE CODE BECAUSE GUN CODE DOESNT STEALTH
|
||||
var/f_name = "\a [src]."
|
||||
|
||||
@@ -50,14 +50,15 @@
|
||||
to_chat(user, "<span class='notice'>You remove the magazine from [src].</span>")
|
||||
|
||||
|
||||
/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
|
||||
/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
|
||||
if(istype(A, /obj/item/ammo_box/magazine))
|
||||
var/obj/item/ammo_box/magazine/AM = A
|
||||
if(istype(AM, mag_type))
|
||||
if(!cover_open)
|
||||
to_chat(user, "<span class='warning'>[src]'s cover is closed! You can't insert a new mag.</span>")
|
||||
return
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
//ammo//
|
||||
|
||||
|
||||
@@ -86,7 +86,6 @@
|
||||
sawn_state = SAWN_INTACT
|
||||
|
||||
/obj/item/gun/projectile/shotgun/riot/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
|
||||
sawoff(user)
|
||||
if(istype(A, /obj/item/melee/energy))
|
||||
@@ -95,6 +94,8 @@
|
||||
sawoff(user)
|
||||
if(istype(A, /obj/item/pipe))
|
||||
unsaw(A, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/projectile/shotgun/riot/sawoff(mob/user)
|
||||
if(sawn_state == SAWN_OFF)
|
||||
@@ -210,6 +211,9 @@
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/boltaction
|
||||
fire_sound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
|
||||
var/bolt_open = 0
|
||||
can_bayonet = TRUE
|
||||
knife_x_offset = 27
|
||||
knife_y_offset = 13
|
||||
|
||||
/obj/item/gun/projectile/shotgun/boltaction/pump(mob/M)
|
||||
playsound(M, 'sound/weapons/gun_interactions/rifle_load.ogg', 60, 1)
|
||||
@@ -242,6 +246,7 @@
|
||||
desc = "Careful not to lose your head."
|
||||
var/guns_left = 30
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted
|
||||
can_bayonet = FALSE
|
||||
|
||||
/obj/item/gun/projectile/shotgun/boltaction/enchanted/New()
|
||||
..()
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
to_chat(user, "<span class='notice'>[rockets.len] / [max_rockets] rockets.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>[src] cannot hold more rockets.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/rocketlauncher/can_shoot()
|
||||
return rockets.len
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
return 1
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] cannot hold more syringes.</span>")
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/syringe/rapidsyringe
|
||||
name = "rapid syringe gun"
|
||||
|
||||
@@ -1149,24 +1149,19 @@
|
||||
id = "lavaland_extract"
|
||||
description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise."
|
||||
color = "#C8A5DC" // rgb: 200, 165, 220
|
||||
metabolization_rate = 0.7 //VERY strong chemical
|
||||
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
update_flags |= M.adjustToxLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustOxyLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustBruteLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustFireLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustFireLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M) // This WILL be brutal
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
M.AdjustConfused(5)
|
||||
update_flags |= M.adjustBruteLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustFireLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustToxLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.Stun(7, FALSE)
|
||||
update_flags |= M.Weaken(7, FALSE)
|
||||
update_flags |= M.adjustBruteLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustFireLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
update_flags |= M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
reagents.reaction(M, TOUCH)
|
||||
reagents.clear_reagents()
|
||||
else
|
||||
else
|
||||
if(M != user)
|
||||
M.visible_message("<span class='danger'>[user] attempts to feed something to [M].</span>", \
|
||||
"<span class='userdanger'>[user] attempts to feed something to you.</span>")
|
||||
@@ -348,6 +348,13 @@
|
||||
slot_flags = SLOT_HEAD
|
||||
container_type = OPENCONTAINER
|
||||
|
||||
/obj/item/reagent_containers/glass/bucket/wooden
|
||||
name = "wooden bucket"
|
||||
icon_state = "woodbucket"
|
||||
item_state = "woodbucket"
|
||||
materials = null
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot)
|
||||
..()
|
||||
if(slot == slot_head && reagents.total_volume)
|
||||
|
||||
@@ -155,9 +155,9 @@
|
||||
name = "survival medipen"
|
||||
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. <br><span class='boldwarning'>WARNING: Do not inject more than one pen in quick succession.</span>"
|
||||
icon_state = "stimpen"
|
||||
volume = 22
|
||||
amount_per_transfer_from_this = 22
|
||||
list_reagents = list("salbutamol" = 10, "epinephrine" = 5, "lavaland_extract" = 2, "salglu_solution" = 5) //Short burst of healing, followed by minor healing from the saline
|
||||
volume = 42
|
||||
amount_per_transfer_from_this = 42
|
||||
list_reagents = list("salbutamol" = 10, "teporone" = 15, "epinephrine" = 10, "lavaland_extract" = 2, "weak_omnizine" = 5) //Short burst of healing, followed by minor healing from the saline
|
||||
|
||||
/obj/item/reagent_containers/hypospray/autoinjector/nanocalcium
|
||||
name = "nanocalcium autoinjector"
|
||||
|
||||
@@ -30,17 +30,21 @@
|
||||
if(id_tag == "s_docking_airlock")
|
||||
INVOKE_ASYNC(src, .proc/lock)
|
||||
|
||||
/mob/onShuttleMove()
|
||||
/mob/onShuttleMove(turf/oldT, turf/T1, rotation)
|
||||
if(!move_on_shuttle)
|
||||
return 0
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(client)
|
||||
if(buckled)
|
||||
shake_camera(src, 2, 1) // turn it down a bit come on
|
||||
else
|
||||
shake_camera(src, 7, 1)
|
||||
if(!client)
|
||||
return
|
||||
|
||||
if(buckled)
|
||||
shake_camera(src, 2, 1) // turn it down a bit come on
|
||||
else
|
||||
shake_camera(src, 7, 1)
|
||||
|
||||
update_parallax_contents()
|
||||
|
||||
/mob/living/carbon/onShuttleMove()
|
||||
. = ..()
|
||||
@@ -54,8 +58,10 @@
|
||||
if(smooth)
|
||||
queue_smooth(src)
|
||||
|
||||
/mob/postDock()
|
||||
update_parallax_contents()
|
||||
|
||||
/obj/machinery/door/airlock/postDock(obj/docking_port/stationary/S1)
|
||||
. = ..()
|
||||
if(!S1.lock_shuttle_doors && id_tag == "s_docking_airlock")
|
||||
INVOKE_ASYNC(src, .proc/unlock)
|
||||
|
||||
|
||||
@@ -189,7 +189,7 @@
|
||||
/obj/docking_port/stationary/transit
|
||||
name = "In transit"
|
||||
turf_type = /turf/space/transit
|
||||
|
||||
var/area/shuttle/transit/assigned_area
|
||||
lock_shuttle_doors = 1
|
||||
|
||||
/obj/docking_port/stationary/transit/register()
|
||||
@@ -358,7 +358,7 @@
|
||||
var/obj/docking_port/stationary/S0 = get_docked()
|
||||
var/obj/docking_port/stationary/S1 = findTransitDock()
|
||||
if(S1)
|
||||
if(dock(S1))
|
||||
if(dock(S1, , TRUE))
|
||||
WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
|
||||
else
|
||||
previous = S0
|
||||
@@ -429,7 +429,7 @@
|
||||
|
||||
//this is the main proc. It instantly moves our mobile port to stationary port S1
|
||||
//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
|
||||
/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE)
|
||||
/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE, transit=FALSE)
|
||||
// Crashing this ship with NO SURVIVORS
|
||||
if(S1.get_docked() == src)
|
||||
remove_ripples()
|
||||
@@ -492,6 +492,7 @@
|
||||
var/turf/simulated/Ts1 = T1
|
||||
Ts1.copy_air_with_tile(T0)
|
||||
|
||||
areaInstance.moving = TRUE
|
||||
//move mobile to new location
|
||||
for(var/atom/movable/AM in T0)
|
||||
AM.onShuttleMove(T0, T1, rotation)
|
||||
@@ -512,6 +513,7 @@
|
||||
T0.CalculateAdjacentTurfs()
|
||||
SSair.add_to_active(T0,1)
|
||||
|
||||
areaInstance.moving = transit
|
||||
for(var/A1 in L1)
|
||||
var/turf/T1 = A1
|
||||
T1.postDock(S1)
|
||||
|
||||
@@ -226,6 +226,8 @@
|
||||
health = 3
|
||||
var/organhonked = 0
|
||||
var/suffering_delay = 900
|
||||
var/datum/component/waddle
|
||||
var/datum/component/squeak
|
||||
|
||||
/obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
@@ -236,6 +238,8 @@
|
||||
genemutcheck(M,CLUMSYBLOCK,null,MUTCHK_FORCED)
|
||||
genemutcheck(M,COMICBLOCK,null,MUTCHK_FORCED)
|
||||
organhonked = world.time
|
||||
waddle = M.AddComponent(/datum/component/waddling)
|
||||
squeak = M.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50)
|
||||
|
||||
/obj/item/organ/internal/honktumor/remove(mob/living/carbon/M, special = 0)
|
||||
. = ..()
|
||||
@@ -246,6 +250,8 @@
|
||||
M.dna.SetSEState(COMICBLOCK,0)
|
||||
genemutcheck(M,CLUMSYBLOCK,null,MUTCHK_FORCED)
|
||||
genemutcheck(M,COMICBLOCK,null,MUTCHK_FORCED)
|
||||
QDEL_NULL(waddle)
|
||||
QDEL_NULL(squeak)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/organ/internal/honktumor/on_life()
|
||||
@@ -282,6 +288,28 @@
|
||||
owner.nutrition = 9000
|
||||
owner.overeatduration = 9000
|
||||
|
||||
|
||||
/obj/item/organ/internal/honkbladder
|
||||
name = "honk bladder"
|
||||
desc = "a air filled sac that produces honking noises."
|
||||
icon_state = "honktumor"//Not making a new icon
|
||||
origin_tech = "biotech=1"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
parent_organ = "groin"
|
||||
slot = "honk_bladder"
|
||||
health = 3
|
||||
var/datum/component/squeak
|
||||
|
||||
/obj/item/organ/internal/honkbladder/insert(mob/living/carbon/M, special = 0)
|
||||
|
||||
squeak = M.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50)
|
||||
|
||||
/obj/item/organ/internal/honkbladder/remove(mob/living/carbon/M, special = 0)
|
||||
. = ..()
|
||||
|
||||
QDEL_NULL(squeak)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/organ/internal/beard
|
||||
name = "beard organ"
|
||||
desc = "Let they who is worthy wear the beard of Thorbjorndottir."
|
||||
|
||||
@@ -125,6 +125,9 @@ var/static/regex/multispin_words = regex("like a record baby")
|
||||
return
|
||||
owner.say(".x[command]")
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/colossus/prepare_eat()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/colossus/can_speak_with()
|
||||
if(world.time < next_command)
|
||||
to_chat(owner, "<span class='notice'>You must wait [(next_command - world.time)/10] seconds before Speaking again.</span>")
|
||||
|
||||
Reference in New Issue
Block a user