Merge remote-tracking branch 'upstream/master' into kk-coyotesuit

This commit is contained in:
Killian
2023-05-08 14:08:14 +01:00
478 changed files with 98570 additions and 8482 deletions
+1 -1
View File
@@ -28,4 +28,4 @@
add_overlay(mainOverlay)
add_overlay(shadeOverlay)
add_hiddenprint(usr)
add_hiddenprint(usr)
@@ -292,7 +292,6 @@ var/global/list/semirandom_mob_spawner_decisions = list()
),
list(/mob/living/simple_mob/vore/solargrub),
list(/mob/living/simple_mob/vore/woof),
list(/mob/living/simple_mob/vore/alienanimals/teppi),
list(/mob/living/simple_mob/vore/alienanimals/space_ghost),
list(/mob/living/simple_mob/vore/alienanimals/catslug),
list(/mob/living/simple_mob/vore/alienanimals/space_jellyfish),
@@ -14,6 +14,12 @@
light_power = 1
light_color = "#FF0D00"
/obj/effect/projectile/impact/laser_em
icon_state = "impact_em_laser"
light_range = 3
light_power = 1
light_color = "#00C6FF"
/obj/effect/projectile/impact/xray
icon_state = "impact_xray"
light_range = 2
@@ -38,6 +38,12 @@
light_power = 1
light_color = "#FF0D00"
/obj/effect/projectile/muzzle/laser_em
icon_state = "muzzle_em_laser"
light_range = 3
light_power = 1
light_color = "#00C6FF"
/obj/effect/projectile/muzzle/lightning
icon_state = "muzzle_lightning"
light_range = 2
@@ -83,6 +83,12 @@
light_power = 1
light_color = "#FF0D00"
/obj/effect/projectile/tracer/laser_em
icon_state = "em_laser"
light_range = 3
light_power = 1
light_color = "#00C6FF"
/obj/effect/projectile/tracer/darkmatter
icon_state = "darkb"
light_range = 2
+7 -6
View File
@@ -25,6 +25,7 @@
var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants.
var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/force = 0
var/can_cleave = FALSE // If true, a 'cleaving' attack will occur.
var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm
var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm
@@ -680,7 +681,7 @@ GLOBAL_LIST_EMPTY(blood_overlays_by_type)
/obj/item/proc/showoff(mob/user)
for (var/mob/M in view(user))
M.show_message("[user] holds up [src]. <a HREF=?src=\ref[M];lookitem=\ref[src]>Take a closer look.</a>",1)
M.show_message("<span class='filter_notice'>[user] holds up [src]. <a HREF=?src=\ref[M];lookitem=\ref[src]>Take a closer look.</a></span>",1)
/mob/living/carbon/verb/showoff()
set name = "Show Held Item"
@@ -710,13 +711,13 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
var/cannotzoom
if((usr.stat && !zoom) || !(istype(usr,/mob/living/carbon/human)))
to_chat(usr, "You are unable to focus through the [devicename]")
to_chat(usr, "<span class='filter_notice'>You are unable to focus through the [devicename].</span>")
cannotzoom = 1
else if(!zoom && (global_hud.darkMask[1] in usr.client.screen))
to_chat(usr, "Your visor gets in the way of looking through the [devicename]")
to_chat(usr, "<span class='filter_notice'>Your visor gets in the way of looking through the [devicename].</span>")
cannotzoom = 1
else if(!zoom && usr.get_active_hand() != src)
to_chat(usr, "You are too distracted to look through the [devicename], perhaps if it was in your active hand this might work better")
to_chat(usr, "<span class='filter_notice'>You are too distracted to look through the [devicename], perhaps if it was in your active hand this might work better.</span>")
cannotzoom = 1
//We checked above if they are a human and returned already if they weren't.
@@ -746,7 +747,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
H.client.pixel_x = -viewoffset
H.client.pixel_y = 0
H.visible_message("[usr] peers through the [zoomdevicename ? "[zoomdevicename] of the [src.name]" : "[src.name]"].")
H.visible_message("<span class='filter_notice'>[usr] peers through the [zoomdevicename ? "[zoomdevicename] of the [src.name]" : "[src.name]"].</span>")
if(!ignore_visor_zoom_restriction)
H.looking_elsewhere = TRUE
H.handle_vision()
@@ -764,7 +765,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
H.handle_vision()
if(!cannotzoom)
usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
usr.visible_message("<span class='filter_notice'>[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].</span>")
return
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/item/device/flash
name = "flash"
desc = "Used for blinding and being an asshole."
desc = "Used for blinding and disorienting."
icon_state = "flash"
item_state = "flashtool"
throwforce = 5
@@ -212,37 +212,37 @@
/obj/item/device/radio/headset/heads/rd
name = "research director's headset"
desc = "Headset of the researching God."
desc = "Headset of the eccentric-in-chief."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/rd/alt
name = "research director's bowman headset"
desc = "Headset of the researching God."
desc = "Headset of the eccentric-in-chief."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/hos
name = "head of security's headset"
desc = "The headset of the man who protects your worthless lifes."
desc = "The headset of the hardass who protects your worthless lifes."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/hos/alt
name = "head of security's bowman headset"
desc = "The headset of the man who protects your worthless lifes."
desc = "The headset of the hardass who protects your worthless lifes."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/ce
name = "chief engineer's headset"
desc = "The headset of the guy who is in charge of morons"
desc = "The headset of the clown who is in charge of the circus."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/ce
/obj/item/device/radio/headset/heads/ce/alt
name = "chief engineer's bowman headset"
desc = "The headset of the guy who is in charge of morons"
desc = "The headset of the clown who is in charge of the circus."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/ce
@@ -260,13 +260,13 @@
/obj/item/device/radio/headset/heads/hop
name = "head of personnel's headset"
desc = "The headset of the guy who will one day be Site Manager."
desc = "The headset of the poor fool who will one day be Site Manager."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/hop
/obj/item/device/radio/headset/heads/hop/alt
name = "head of personnel's bowman headset"
desc = "The headset of the guy who will one day be Site Manager."
desc = "The headset of the poor fool who will one day be Site Manager."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/hop
@@ -279,13 +279,13 @@
/obj/item/device/radio/headset/headset_cargo
name = "supply radio headset"
desc = "A headset used by the QM and his slaves."
desc = "A headset used by the QM and their cronies."
icon_state = "cargo_headset"
ks2type = /obj/item/device/encryptionkey/headset_cargo
/obj/item/device/radio/headset/headset_cargo/alt
name = "supply bowman headset"
desc = "A bowman headset used by the QM and his slaves."
desc = "A bowman headset used by the QM and their cronies."
icon_state = "cargo_headset_alt"
ks2type = /obj/item/device/encryptionkey/headset_cargo
+6 -2
View File
@@ -350,7 +350,7 @@
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
/obj/item/trash/spacercake_wrap
/obj/item/trash/spacer_cake_wrap
name = "snack cake wrapper"
icon_state = "spacercake_wrap"
@@ -416,6 +416,10 @@
name = "burrito packaging"
icon_state = "smolburrito"
/obj/item/trash/candybowl
name = "candy bowl"
icon_state = "candy_bowl"
/obj/item/trash/brainzsnax
name = "\improper BrainzSnax can"
icon_state = "brainzsnax"
@@ -426,4 +430,4 @@
name = "\improper BrainzSnax RED can"
icon_state = "brainzsnaxred"
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
+32 -1
View File
@@ -64,4 +64,35 @@
/obj/item/trash/ratpackturkey
name = "\improper Prepackaged Meal Tray"
icon = 'icons/obj/trash_vr.dmi'
icon_state = "altevian_pack_turkey-trash"
icon_state = "altevian_pack_turkey-trash"
/obj/item/trash/ratpackramen
name = "\improper Prepackaged Meal Tray"
icon = 'icons/obj/trash_vr.dmi'
icon_state = "altevian_pack_ramen_standard-trash"
/obj/item/trash/ratpackramen/standard
icon_state = "altevian_pack_ramen_standard-trash"
/obj/item/trash/ratpackramen/lacquer1
icon_state = "altevian_pack_ramen_lacquer1-trash"
/obj/item/trash/ratpackramen/lacquer2
icon_state = "altevian_pack_ramen_lacquer2-trash"
/obj/item/trash/ratpackramen/lacquer3
icon_state = "altevian_pack_ramen_lacquer3-trash"
/obj/item/trash/ratpackramen/fleet
icon_state = "altevian_pack_ramen_fleet-trash"
/obj/item/trash/ratpackramen/trans
icon_state = "altevian_pack_ramen_trans-trash"
/obj/item/trash/ratpackramen/ace
icon_state = "altevian_pack_ramen_ace-trash"
/obj/item/trash/ratpacktaco
name = "\improper Prepackaged Meal Tray"
icon = 'icons/obj/trash_vr.dmi'
icon_state = "altevian_pack_taco-trash"
@@ -427,11 +427,11 @@ AI MODULES
origin_tech = list(TECH_DATA = 3, TECH_ILLEGAL = 1)
laws = new/datum/ai_laws/nanotrasen_aggressive()
/******************** Syndicate Directives ********************/
/******************** Mercenary Directives ********************/
/obj/item/weapon/aiModule/syndicate_override
name = "\improper 'Syndicate Directives' core AI module"
desc = "A 'Syndicate Directives' Core AI Module: 'Reconfigures the AI's core laws.'"
name = "\improper 'Mercenary Directives' core AI module"
desc = "A 'Mercenary Directives' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 4)
laws = new/datum/ai_laws/syndicate_override()
+2 -2
View File
@@ -267,7 +267,7 @@
color = reagents.get_color()
update_icon()
/obj/item/weapon/storage/box/pocky //ADDITION 04/17/2021
/obj/item/weapon/storage/box/pocky
name = "\improper Totemo yoi Pocky"
desc = "A bundle of chocolate-coated bisquit sticks."
icon = 'icons/obj/food_snacks.dmi'
@@ -282,7 +282,7 @@
foldable = null
trash = /obj/item/trash/pocky
/obj/item/clothing/mask/chewable/candy/pocky //ADDITION 04/17/2021
/obj/item/clothing/mask/chewable/candy/pocky
name = "chocolate pocky"
desc = "A chocolate-coated biscuit stick."
icon_state = "pockystick"
@@ -183,7 +183,7 @@
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
//Transfer 5% of current tank air contents to turf
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(0.02*(throw_amount/100))
//air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE
//air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is mischievious and I could probably make it work without fucking it up like this, but there you have it. -- TLE
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(target,air_transfer.gas["phoron"],get_dir(loc,target))
air_transfer.gas["phoron"] = 0
target.assume_air(air_transfer)
@@ -147,7 +147,7 @@
/obj/item/weapon/card/id/gold/captain/spare
name = "\improper Site Manager's spare ID"
desc = "The spare ID of the High Lord himself."
desc = "The emergency spare ID for the station's very own Big Cheese."
icon_state = "gold-id-alternate"
registered_name = "Site Manager"
@@ -30,7 +30,7 @@
if(istype(O, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = O
src.access |= I.access
if(player_is_antag(user.mind))
if(player_is_antag(user.mind) || registered_user == user)
to_chat(user, "<span class='notice'>The microscanner activates as you pass it over the ID, copying its access.</span>")
/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob)
@@ -88,9 +88,9 @@
return name
/obj/item/weapon/card/id/syndicate_command
name = "syndicate ID card"
desc = "An ID straight from the Syndicate."
registered_name = "Syndicate"
assignment = "Syndicate Commander"
name = "operative ID card"
desc = "An ID straight from a mercenary organisation."
registered_name = "Operative"
assignment = "Operative Commander"
icon_state = "syndicate-id"
access = list(access_syndicate, access_external_airlocks)
+4 -4
View File
@@ -317,7 +317,7 @@
<h2>Power outage</h2>
A power problem has made the entire station lose power? Could be station-wide wiring problems or syndicate power sinks. In any case follow these steps:
A power problem has made the entire station lose power? Could be station-wide wiring problems or illegal power sinks. In any case follow these steps:
<ol>
<li><b><font color='red'>PANIC!</font></b></li>
@@ -1112,7 +1112,7 @@
name = "Fission Mailed: Nuclear Sabotage 101"
icon_state ="bookNuclear"
item_state = "book8"
author = "Syndicate"
author = "Stealth Assault Enterprises"
title = "Fission Mailed: Nuclear Sabotage 101"
dat = {"<html>
@@ -1128,7 +1128,7 @@
</head>
<body>
<h1>Nuclear Explosives 101</h1>
Hello and thank you for choosing the Syndicate for your nuclear information needs. Today's crash course will deal with the operation of a Nuclear Fission Device.<br><br>
Hello and thank you for choosing Stealth Assault Enterprises for your nuclear information needs. Today's crash course will deal with the operation of a Nuclear Fission Device.<br><br>
First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done, to unbolt it, one must completely log in, which at this time may not be possible.<br>
@@ -1144,7 +1144,7 @@
You now have activated the device. To deactivate the buttons at anytime, for example when you've already prepped the bomb for detonation, remove the authentication disk OR press R on the keypad.<br><br>
Now the bomb CAN ONLY be detonated using the timer. Manual detonation is not an option. Toggle off the SAFETY.<br>
<b>Note</b>: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step.<br><br>
<b>Note</b>: You wouldn't believe how many SAARE Operatives with doctorates have forgotten this step.<br><br>
So use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>
<b>Note</b>: THE BOMB IS STILL SET AND WILL DETONATE<br><br>
@@ -145,7 +145,6 @@
base_icon = "spearglass"
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
description_info = "This weapon can strike from two tiles away, and over certain objects such as tables, or other people."
force = 10
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
@@ -2,11 +2,12 @@
var/active = 0
var/active_force
var/active_throwforce
var/active_armourpen
var/active_w_class
var/active_embed_chance = 0 //In the off chance one of these is supposed to embed, you can just tweak this var
sharp = FALSE
edge = FALSE
armor_penetration = 50
armor_penetration = 0
flags = NOCONDUCT | NOBLOODY
var/lrange = 2
var/lpower = 2
@@ -54,6 +55,7 @@
embed_chance = active_embed_chance
force = active_force
throwforce = active_throwforce
armor_penetration = active_armourpen
sharp = TRUE
edge = TRUE
w_class = active_w_class
@@ -70,6 +72,7 @@
embed_chance = initial(embed_chance)
force = initial(force)
throwforce = initial(throwforce)
armor_penetration = initial(armor_penetration)
sharp = initial(sharp)
edge = initial(edge)
w_class = initial(w_class)
@@ -192,7 +195,8 @@
/obj/item/weapon/melee/energy/examine(mob/user)
. = ..()
. += "<span class='notice'>Alt-click to recolor it.</span>"
if(colorable)
. += "<span class='notice'>Alt-click to recolor it.</span>"
/*
* Energy Axe
@@ -206,11 +210,13 @@
lcolor = null
//active_force = 150 //holy...
active_force = 60
active_armourpen = 65
active_throwforce = 35
active_w_class = ITEMSIZE_HUGE
//force = 40
//throwforce = 25
force = 20
armor_penetration = 20
throwforce = 10
throw_speed = 1
throw_range = 5
@@ -236,6 +242,7 @@
desc = "An energised axe."
active_force = 35
active_throwforce = 20
active_armourpen = 30
force = 15
use_cell = TRUE
@@ -255,6 +262,7 @@
icon_state = "esword"
item_state = "esword"
active_force = 30
active_armourpen = 50
active_throwforce = 20
active_w_class = ITEMSIZE_LARGE
force = 3
@@ -264,8 +272,6 @@
w_class = ITEMSIZE_SMALL
flags = NOBLOODY
origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
sharp = TRUE
edge = TRUE
colorable = TRUE
drop_sound = 'sound/items/drop/sword.ogg'
pickup_sound = 'sound/items/pickup/sword.ogg'
@@ -344,6 +350,7 @@
icon_state = "ionrapier"
item_state = "ionrapier"
active_force = 5
active_armourpen = 80
active_throwforce = 3
active_embed_chance = 0
sharp = TRUE
@@ -383,7 +390,7 @@
name = "zero-point lance"
desc = "Designed specifically for disrupting electronics at relatively close range, however it is still capable of dealing some damage to living beings."
active_force = 20
armor_penetration = 15
active_armourpen = 15
reach = 2
/*
@@ -395,7 +402,7 @@
desc = "A small, handheld device which emits a high-energy 'blade'."
origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
active_force = 25
armor_penetration = 25
active_armourpen = 25
projectile_parry_chance = 40
colorable = TRUE
@@ -501,7 +508,7 @@
name = "energy spear"
desc = "Concentrated energy forming a sharp tip at the end of a long rod."
icon_state = "espear"
armor_penetration = 75
armor_penetration = 0
sharp = TRUE
edge = TRUE
force = 5
@@ -511,6 +518,7 @@
reach = 2
w_class = ITEMSIZE_LARGE
active_force = 25
active_armourpen = 75
active_throwforce = 30
active_w_class = ITEMSIZE_HUGE
colorable = TRUE
@@ -0,0 +1,276 @@
/obj/item/weapon/melee/shock_maul
name = "concussion maul"
desc = "A heavy-duty concussion hammer, typically used for mining. An iconic weapon for the many uprisings of Mars. It uses a manually engaged concussive-force amplifier unit in the head to multiply impact force, but its weight and the charge up time makes it difficult to use effectively. Devastating if used correctly, but requires skill."
icon_state = "forcemaul"
item_state = "forcemaul"
slot_flags = SLOT_BACK
//stopping power/lethality
force = 35
armor_penetration = 20 //the sheer impact force bypasses quite a bit of armour
var/unwielded_force_divisor = 0.25
var/wielded = 0
var/force_unwielded = 8.75
var/wieldsound = null
var/unwieldsound = null
var/charge_force_mult = 1.75 //damage and AP multiplier on charged hits
var/launch_force = 3 //yeet distance
var/launch_force_unwielded = 1 //awful w/ one hand, but still gets a little distance
var/launch_force_disarm = 1.5 //distance multiplier when swinging in disarm mode, since disarm attacks do half damage
var/weaken_force = 2 //stun power
var/weaken_force_unwielded = 0 //can't stun at all if used onehanded
var/weaken_force_disarm = 1.5 //stun multiplier when in disarm mode
//mining interacts
var/excavation_amount = 200
var/destroy_artefacts = TRUE //sorry, breaks stuff
can_cleave = TRUE //SSSSMITE!
attackspeed = 15 //very slow!!
sharp = FALSE
edge = FALSE
throwforce = 25
flags = NOCONDUCT
w_class = ITEMSIZE_HUGE
drop_sound = 'sound/items/drop/metalweapon.ogg'
pickup_sound = 'sound/items/pickup/metalweapon.ogg'
origin_tech = list(TECH_COMBAT = 5)
attack_verb = list("beaten","slammed","smashed","mauled","hammered","bludgeoned")
var/lightcolor = "#D3FDFD"
var/status = 0 //whether the thing is on or not
var/obj/item/weapon/cell/bcell = null
var/hitcost = 600 //you get 4 hits out of a standard cell
/obj/item/weapon/melee/shock_maul/update_held_icon()
var/mob/living/M = loc
if(istype(M) && M.can_wield_item(src) && is_held_twohanded(M))
wielded = 1
if(status)
force = initial(force)*charge_force_mult
armor_penetration *= charge_force_mult
else
force = initial(force)
armor_penetration = initial(armor_penetration)
launch_force = initial(launch_force)
weaken_force = initial(weaken_force)
name = "[initial(name)] (wielded)"
update_icon()
else
wielded = 0
if(status)
force = force_unwielded*charge_force_mult
armor_penetration *= charge_force_mult
else
force = force_unwielded
armor_penetration = initial(armor_penetration)
launch_force = launch_force_unwielded
weaken_force = weaken_force_unwielded
name = "[initial(name)]"
update_icon()
..()
/obj/item/weapon/melee/shock_maul/New()
..()
update_held_icon()
return
/obj/item/weapon/melee/shock_maul/get_cell()
return bcell
/obj/item/weapon/melee/shock_maul/MouseDrop(obj/over_object as obj)
if(!canremove)
return
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
return
if (!( istype(over_object, /obj/screen) ))
return ..()
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this.
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
return
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
return
switch(over_object.name)
if("r_hand")
usr.u_equip(src)
usr.put_in_r_hand(src)
if("l_hand")
usr.u_equip(src)
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/weapon/melee/shock_maul/loaded/New() //this one starts with a cell pre-installed.
..()
bcell = new/obj/item/weapon/cell/device/weapon(src)
update_icon()
return
/obj/item/weapon/melee/shock_maul/proc/deductcharge()
if(status == 1) //Only deducts charge when it's on
if(bcell)
if(bcell.checked_use(hitcost))
return 1
else
return 0
return null
/obj/item/weapon/melee/shock_maul/proc/powercheck()
if(bcell)
if(bcell.charge < hitcost)
status = 0
update_held_icon()
/obj/item/weapon/melee/shock_maul/update_icon()
if(status)
icon_state = "[initial(icon_state)]_active[wielded]"
item_state = icon_state
else if(!bcell)
icon_state = "[initial(icon_state)]_nocell[wielded]"
item_state = icon_state
else
icon_state = "[initial(icon_state)][wielded]"
item_state = icon_state
if(icon_state == "[initial(icon_state)]_active[wielded]")
set_light(2, 1, lightcolor)
else
set_light(0)
/obj/item/weapon/melee/shock_maul/dropped()
..()
if(status)
status = 0
visible_message("<span class='warning'>\The [src]'s grip safety engages!</span>")
update_held_icon()
/obj/item/weapon/melee/shock_maul/examine(mob/user)
. = ..()
if(Adjacent(user))
if(bcell)
. += "<span class='notice'>The concussion maul is [round(bcell.percent())]% charged.</span>"
if(!bcell)
. += "<span class='warning'>The concussion maul does not have a power source installed.</span>"
/obj/item/weapon/melee/shock_maul/attackby(obj/item/weapon/W, mob/user)
if(!user.IsAdvancedToolUser())
return
if(istype(W, /obj/item/weapon/cell))
if(istype(W, /obj/item/weapon/cell/device))
if(!bcell)
user.drop_item()
W.loc = src
bcell = W
to_chat(user, "<span class='notice'>You install a cell in \the [src].</span>")
update_held_icon()
else
to_chat(user, "<span class='notice'>\The [src] already has a cell.</span>")
else
to_chat(user, "<span class='notice'>This cell is not fitted for [src].</span>")
/obj/item/weapon/melee/shock_maul/attack_hand(mob/user as mob)
if(user.get_inactive_hand() == src)
if(!user.IsAdvancedToolUser())
return
else if(bcell)
bcell.update_icon()
user.put_in_hands(bcell)
bcell = null
to_chat(user, "<span class='notice'>You remove the cell from the [src].</span>")
status = 0
update_held_icon()
return
..()
else
return ..()
/obj/item/weapon/melee/shock_maul/attack_self(mob/user)
if(!user.IsAdvancedToolUser())
return
if(!status && bcell && bcell.charge >= hitcost)
if(do_after(user, 2 SECONDS))
status = 1
user.visible_message("<span class='warning'>[user] charges \the [src]!</span>","<span class='warning'>You charge \the [src]. <b>It's hammer time!</b></span>")
playsound(src, "sparks", 75, 1, -1)
update_held_icon()
else if(status)
status = 0
user.visible_message("<span class='notice'>[user] safely disengages \the [src]'s power field.</span>","<span class='notice'>\The [src] is now off.</span>")
update_held_icon()
playsound(src, "sparks", 75, 1, -1)
if(!bcell)
to_chat(user, "<span class='warning'>\The [src] does not have a power source!</span>")
else
to_chat(user, "<span class='warning'>\The [src] is out of charge.</span>")
add_fingerprint(user)
/obj/item/weapon/melee/shock_maul/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
if(!proximity) return
..()
if(A && wielded && status)
deductcharge()
status = 0
user.visible_message("<span class='warning'>\The [src] discharges with a thunderous, hair-raising crackle!</span>")
playsound(src, 'sound/weapons/resonator_blast.ogg', 100, 1, -1)
update_held_icon()
if(istype(A,/obj/structure/window))
var/obj/structure/window/W = A
visible_message("<span class='warning'>\The [W] crumples under the force of the impact!</span>")
W.shatter()
else if(istype(A,/obj/structure/barricade))
var/obj/structure/barricade/B = A
B.dismantle()
else if(istype(A,/obj/structure/grille))
qdel(A)
powercheck(hitcost)
/obj/item/weapon/melee/shock_maul/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
. = ..()
if(user.a_intent == I_DISARM)
launch_force *= launch_force_disarm
weaken_force *= weaken_force_disarm
//yeet 'em away, boys!
if(status)
var/atom/target_zone = get_edge_target_turf(user,get_dir(user, target))
if(!target.anchored) //unless they're secured in place, natch
target.throw_at(target_zone, launch_force, 2, user, FALSE)
target.Weaken(weaken_force)
deductcharge()
status = 0
user.visible_message("<span class='warning'>\The [src] discharges with a thunderous, hair-raising crackle!</span>")
playsound(src, 'sound/weapons/resonator_blast.ogg', 100, 1, -1)
update_held_icon()
powercheck(hitcost)
/obj/item/weapon/melee/shock_maul/emp_act(severity)
if(bcell)
bcell.emp_act(severity) //let's not duplicate code everywhere if we don't have to please.
if(status)
status = 0
visible_message("<span class='warning'>\The [src]'s power field hisses and sputters out.</span>")
update_held_icon()
..()
/obj/item/weapon/melee/shock_maul/get_description_interaction()
var/list/results = list()
if(bcell)
results += "[desc_panel_image("offhand")]to remove the weapon cell."
else
results += "[desc_panel_image("weapon cell")]to add a new weapon cell."
results += ..()
return results
@@ -235,8 +235,8 @@ MRE Stuff
open(user)
/obj/item/weapon/storage/mrebag/open(mob/user)
if(!opened)
to_chat(usr, "<span class='notice'>The pouch heats up as you break the vaccum seal.</span>")
if(!opened && !isobserver(user))
to_chat(usr, "<span class='notice'>The pouch heats up as you break the vacuum seal.</span>")
opened = 1
update_icon()
. = ..()
@@ -377,6 +377,6 @@ MRE Stuff
icon_state = "tgmcmre_dessert"
nutriment_amt = 2
starts_with = list("sugar" = 1)
package_open_state = "tgmcmre_[flavor]"
nutriment_desc = list("[new_taste]" = nutriment_amt)
@@ -3,7 +3,7 @@
*/
/obj/item/weapon/storage/toolbox
name = "toolbox"
desc = "Danger. Very robust."
desc = "A metal toolbox with remarkably robust construction."
icon = 'icons/obj/storage_vr.dmi'
icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
+16 -7
View File
@@ -22,6 +22,7 @@
var/obj/item/weapon/cell/bcell = null
var/hitcost = 240
var/use_external_power = FALSE //only used to determine if it's a cyborg baton
var/grip_safety = TRUE
/obj/item/weapon/melee/baton/New()
..()
@@ -69,18 +70,18 @@
update_icon()
return
/obj/item/weapon/melee/baton/proc/deductcharge(var/chrgdeductamt)
/obj/item/weapon/melee/baton/proc/deductcharge()
if(status == 1) //Only deducts charge when it's on
if(bcell)
if(bcell.checked_use(chrgdeductamt))
if(bcell.checked_use(hitcost))
return 1
else
return 0
return null
/obj/item/weapon/melee/baton/proc/powercheck(var/chrgdeductamt)
/obj/item/weapon/melee/baton/proc/powercheck()
if(bcell)
if(bcell.charge < chrgdeductamt)
if(bcell.charge < hitcost)
status = 0
update_icon()
@@ -97,6 +98,13 @@
else
set_light(0)
/obj/item/weapon/melee/baton/dropped()
..()
if(status && grip_safety)
status = 0
visible_message("<span class='warning'>\The [src]'s grip safety engages!</span>")
update_icon()
/obj/item/weapon/melee/baton/examine(mob/user)
. = ..()
@@ -142,7 +150,7 @@
var/mob/living/silicon/robot/R = loc
if (istype(R))
bcell = R.cell
if(bcell && bcell.charge > hitcost)
if(bcell && bcell.charge >= hitcost)
status = !status
to_chat(user, "<span class='notice'>[src] is now [status ? "on" : "off"].</span>")
playsound(src, "sparks", 75, 1, -1)
@@ -200,7 +208,7 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.forcesay(hit_appends)
powercheck(hitcost)
powercheck()
/obj/item/weapon/melee/baton/emp_act(severity)
if(bcell)
@@ -222,9 +230,10 @@
throwforce = 5
stunforce = 0
agonyforce = 60 //same force as a stunbaton, but uses way more charge.
hitcost = 2500
hitcost = 2500 //runs off the same kind of big batteries as APCs, not small cells!
attack_verb = list("poked")
slot_flags = null
grip_safety = FALSE
/obj/item/weapon/melee/baton/cattleprod/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/cell))
+1
View File
@@ -11,6 +11,7 @@
micro_target = TRUE
var/static/non_micro_types = list(
/mob/living/simple_mob/vore/squirrel,
/mob/living/simple_mob/vore/alienanimals/catslug,
/mob/living/simple_mob/vore/hostile/morph,
/mob/living/simple_mob/protean_blob,
+21 -7
View File
@@ -837,7 +837,14 @@
/obj/random/firstaid,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/structure/closet/crate/veymed //VM FAKS
/obj/structure/closet/crate/freezer/veymed //VM FAKS
),
prob(5);list(
/obj/random/internal_organ,
/obj/random/internal_organ,
/obj/random/internal_organ,
/obj/random/internal_organ,
/obj/structure/closet/crate/freezer/veymed //VM ORGANSES
),
prob(10);list(
/obj/random/tech_supply/nofail,
@@ -854,7 +861,7 @@
/obj/random/medical/pillbottle,
/obj/random/medical/lite,
/obj/random/medical/lite,
/obj/structure/closet/crate/zenghu //ZENGHU GRABBAG
/obj/structure/closet/crate/freezer/zenghu //ZENGHU GRABBAG
),
prob(10);list(
/obj/random/medical/pillbottle,
@@ -863,7 +870,7 @@
/obj/random/medical/pillbottle,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/structure/closet/crate/zenghu //ZENGHU PILLS
/obj/structure/closet/crate/freezer/zenghu //ZENGHU PILLS
),
prob(10);list(
/obj/item/device/toner,
@@ -1099,7 +1106,7 @@
/obj/random/medical,
/obj/random/medical/lite,
/obj/random/medical/lite,
/obj/structure/closet/crate/veymed //VM GRABBAG
/obj/structure/closet/crate/freezer/veymed //VM GRABBAG
),
prob(10);list(
/obj/random/firstaid,
@@ -1108,7 +1115,14 @@
/obj/random/firstaid,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/structure/closet/crate/veymed //VM FAKS
/obj/structure/closet/crate/freezer/veymed //VM FAKS
),
prob(5);list(
/obj/random/internal_organ,
/obj/random/internal_organ,
/obj/random/internal_organ,
/obj/random/internal_organ,
/obj/structure/closet/crate/freezer/veymed //VM ORGANSES
),
prob(10);list(
/obj/random/tech_supply/nofail,
@@ -1125,7 +1139,7 @@
/obj/random/medical/pillbottle,
/obj/random/medical/lite,
/obj/random/medical/lite,
/obj/structure/closet/crate/zenghu //ZENGHU GRABBAG
/obj/structure/closet/crate/freezer/zenghu //ZENGHU GRABBAG
),
prob(10);list(
/obj/random/medical/pillbottle,
@@ -1134,7 +1148,7 @@
/obj/random/medical/pillbottle,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/random/unidentified_medicine/fresh_medicine,
/obj/structure/closet/crate/zenghu //ZENGHU PILLS
/obj/structure/closet/crate/freezer/zenghu //ZENGHU PILLS
),
prob(10);list(
/obj/item/device/toner,
+19
View File
@@ -216,3 +216,22 @@
prob(5);/obj/item/instrument/glockenspiel,
prob(1);/obj/item/instrument/musicalmoth
)
/obj/random/internal_organ
name = "random organ"
desc = "A random internal organ. Juicy fresh! Or... maybe not."
icon = 'icons/obj/surgery.dmi'
icon_state = "heart"
spawn_nothing_percentage = 10
/obj/random/internal_organ/item_to_spawn()
return pick(prob(5);/obj/item/organ/internal/appendix,
prob(5);/obj/item/organ/internal/eyes,
prob(5);/obj/item/organ/internal/heart,
prob(5);/obj/item/organ/internal/kidneys,
prob(5);/obj/item/organ/internal/liver,
prob(5);/obj/item/organ/internal/spleen,
prob(5);/obj/item/organ/internal/lungs,
prob(5);/obj/item/organ/internal/stomach,
prob(5);/obj/item/organ/internal/voicebox,
)
+1
View File
@@ -73,6 +73,7 @@
prob(2);/obj/item/weapon/twohanded/fireaxe,\
prob(2);/obj/item/weapon/gun/projectile/luger/brown,\
prob(2);/obj/item/weapon/gun/launcher/crossbow,\
prob(2);/obj/item/weapon/melee/shock_maul,\
/* prob(1);/obj/item/weapon/gun/projectile/automatic/battlerifle,\ */ // Too OP
prob(1);/obj/item/weapon/gun/projectile/deagle/gold,\
prob(1);/obj/item/weapon/gun/energy/imperial,\
@@ -1,116 +0,0 @@
#define MAX_PROGRESS 100
/obj/structure/alien/egg //Gurg Addition, working alien egg structure.
desc = "It looks like a weird egg."
name = "egg"
icon_state = "egg_growing"
density = FALSE
var/progress = 0
/obj/structure/alien/egg/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/structure/alien/egg/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/structure/alien/egg/CanUseTopic(var/mob/user)
return isobserver(user) ? STATUS_INTERACTIVE : STATUS_CLOSE
/obj/structure/alien/egg/Topic(href, href_list)
if(..())
return 1
if(href_list["spawn"])
attack_ghost(usr)
/obj/structure/alien/egg/process()
progress++
if(progress >= MAX_PROGRESS)
for(var/mob/observer/dead/O in observer_mob_list)
if(O.client)
to_chat(O, "<span class='notice'>An alien is ready to hatch at [get_area(src.loc)]! (<a href='byond://?src=\ref[src];spawn=1'>spawn</a>)</span>")
STOP_PROCESSING(SSobj, src)
update_icon()
/obj/structure/alien/egg/update_icon()
if(progress == -1)
icon_state = "egg_opened"
else if(progress < MAX_PROGRESS)
icon_state = "egg_growing"
else
icon_state = "egg"
// Ghostjoinable icon
var/static/image/I
if(!I)
I = image('icons/mob/hud_vr.dmi', "ghostjoin")
I.invisibility = INVISIBILITY_OBSERVER
I.plane = PLANE_GHOSTS
I.appearance_flags = KEEP_APART|RESET_TRANSFORM
if(progress >= MAX_PROGRESS)
add_overlay(I)
else
cut_overlay(I)
/obj/structure/alien/egg/attack_ghost(var/mob/observer/dead/user)
// Still a ghost?
if(!istype(user))
tgui_alert_async(user, "You have to be an observer to join as this Xenomorph larva.")
return
// Check for bans properly.
if(jobban_isbanned(user, "Xenomorph"))
tgui_alert_async(user, "You are banned from playing a Xenomorph, so you can't join as this Xenomorph larva.")
return
// Check for respawn
if(!user.MayRespawn(1))
tgui_alert_async(user, "You aren't allowed to respawn, so you can't join as this Xenomorph larva.")
return
if(progress == -1)
tgui_alert_async(user, "That egg has already hatched.")
else if(progress >= MAX_PROGRESS)
tgui_alert_async(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", list("Yes","No"), CALLBACK(src, .proc/ghost_dunk), 20 SECONDS)
else
tgui_alert_async(user, "\The [src] has not yet matured.")
/obj/structure/alien/egg/proc/ghost_dunk(choice)
if(choice != "Yes")
return
var/mob/observer/dead/user = usr
if(progress < MAX_PROGRESS || !istype(user))
return
progress = -1 // No harvesting pls.
flick("egg_opening",src)
sleep(5) //5ds animation
if(!src || !istype(user))
visible_message("<span class='alium'>\The [src] writhes with internal motion, but nothing comes out.</span>")
progress = MAX_PROGRESS // Someone else can have a go.
return // What a pain.
// Create the mob, transfer over key.
var/mob/living/carbon/alien/larva/larva = new(get_turf(src))
// Move the ghost in
if(user.mind)
user.mind.active = TRUE
user.mind.transfer_to(larva)
else
larva.ckey = user.ckey
qdel(user)
visible_message("<span class='alium'>\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!</span>")
// Turn us into a hatched egg.
name = "hatched alien egg"
desc += " This one has hatched."
update_icon()
#undef MAX_PROGRESS
+1 -1
View File
@@ -1,4 +1,4 @@
/obj/structure/alien //Gurg Addition, framework for alien eggs and structures.
/obj/structure/alien //Gurg Addition, framework for alien structures.
name = "alien thing"
desc = "There's something alien about this."
icon = 'icons/mob/alien.dmi'
@@ -809,6 +809,19 @@
"nano" = COLOR_OFF_WHITE
)
/decl/closet_appearance/crate/freezer/veymed
color = COLOR_BABY_BLUE
extra_decals = list(
"lid_stripes" = COLOR_RED,
"crate_cross" = COLOR_GREEN
)
/decl/closet_appearance/crate/freezer/zenghu
color = COLOR_BABY_BLUE
extra_decals = list(
"zenghu" = COLOR_OFF_WHITE
)
// Corporate Branding
/decl/closet_appearance/crate/aether
@@ -308,6 +308,14 @@
desc = "A freezer stamped with the logo of NanoTrasen."
closet_appearance = /decl/closet_appearance/crate/freezer/nanotrasen
/obj/structure/closet/crate/freezer/veymed
desc = "A freezer stamped with the logo of Vey-Medical."
closet_appearance = /decl/closet_appearance/crate/freezer/veymed
/obj/structure/closet/crate/freezer/zenghu
desc = "A freezer stamped with the logo of Zeng-Hu Pharmaceuticals."
closet_appearance = /decl/closet_appearance/crate/freezer/zenghu
/obj/structure/closet/crate/freezer/return_air()
var/datum/gas_mixture/gas = (..())
if(!gas) return null
@@ -0,0 +1,56 @@
//Antagonist ghost pods for potentially self replicating creatures, xenomorphs as one example. These should not naturally spawn on their own.
/obj/structure/ghost_pod/automatic/xenomorph_egg
name = "xenomorph egg"
desc = "A disgusting egg dripping with clear ooze, the existence of this is a omen for what is to come."
description_info = "This contains a growing xenomorph larva, which may wake up at any moment. The larva will be another player, once activated."
icon = 'icons/mob/alien.dmi'
icon_state = "egg"
icon_state_opened = "egg_opened"
var/health = 50 //So they can be destroyed by the crew
density = FALSE
ghost_query_type = /datum/ghost_query/xenomorph_larva
delay_to_try_again = 1 MINUTES //10 minutes for egg to grow, 5 minutes for larva to mature
anchored = TRUE
/obj/structure/ghost_pod/automatic/xenomorph_egg/create_occupant(var/mob/M)
var/mob/living/carbon/alien/larva/R = new(get_turf(src))
if(M.mind)
M.mind.transfer_to(R)
// Description for new larva, so they understand what to expect.
to_chat(M, "<span class='notice'>You are a <b>Xenomorph Larva</b>, freshly slithered out of their egg to serve the hive.</span>")
to_chat(M, "<span class='notice'><b>Be sure to carefully listen to your queen, as xenomorph egg spawns may act different to loner xenomorph spawns.</b></span>")
to_chat(M, "<span class='warning'><b>Remember, you are technically a antagonist. Be sure to learn the context of your existence via IC or ahelp to prevent headaches, and follow the orders of your queen to the letter.</b></span>")
to_chat(M, "<span class='notice'> Your life for the hive!</span>")
R.ckey = M.ckey
visible_message("<span class='warning'>\the [src] peels open, and a fresh larva slithers out!</span>")
..()
/obj/structure/ghost_pod/automatic/xenomorph_egg/proc/healthcheck()
if(health <=0)
visible_message("<span class='warning'>\the [src] splatters everywhere as it cracks open!</span>")
playsound(src, 'sound/effects/slime_squish.ogg', 50, 1)
qdel(src)
return
/obj/structure/ghost_pod/automatic/xenomorph_egg/attackby(obj/item/W as obj, mob/user as mob)
user.setClickCooldown(user.get_attack_speed(W))
switch(W.damtype)
if("fire")
health -= W.force * 1.25 //It really doesn't like fire
if("brute")
health -= W.force * 0.75 //Bit hard to cut
playsound(src, 'sound/effects/attackblob.ogg', 50, 1)
healthcheck()
..()
return
/obj/structure/ghost_pod/automatic/xenomorph_egg/bullet_act(var/obj/item/projectile/Proj)
switch(damtype)
if("fire")
health -= Proj.damage * 1.5 //It burns!
if("brute")
health -= Proj.damage //It hurts a bit more then a sharp stick
healthcheck()
..()
return
@@ -47,7 +47,8 @@
"Nurse Giant Spider" = /mob/living/simple_mob/animal/giant_spider/nurse/eggless,
"Giant Spider Queen" = /mob/living/simple_mob/animal/giant_spider/nurse/queen/eggless,
"Weretiger" = /mob/living/simple_mob/vore/weretiger,
"Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug
"Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
"Squirrel" = /mob/living/simple_mob/vore/squirrel/big
)
/obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M)
+1 -1
View File
@@ -370,7 +370,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
//old style retardo-cart
//old style mischievio-cart
/obj/structure/bed/chair/janicart
name = "janicart"
icon = 'icons/obj/vehicles.dmi'
+2 -1
View File
@@ -39,7 +39,8 @@
/obj/structure/prop/vv_edit_var(var_name, var_value)
if(var_name == "state")
change_state(var_value)
else
..()
//Misc stuff that fits no category
+12 -2
View File
@@ -256,12 +256,12 @@
/obj/structure/sign/redcross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
desc = "An interstellar symbol of medical institutions. You'll probably get help here."
icon_state = "bluecross"
/obj/structure/sign/greencross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
desc = "An interstellar symbol of medical institutions. You'll probably get help here."
icon_state = "bluecross2"
/obj/structure/sign/goldenplaque
@@ -817,6 +817,16 @@
desc = "A pictographic direction sign with a knife, plate, and fork, stating the level to find the nearest dining establishment on."
icon_state = "level_kitchen"
/obj/structure/sign/directions/shuttle_bay
name = "\improper Shuttle Bay"
desc = "A direction sign, pointing out the way to the nearest shuttle bay."
icon_state = "direction_bay"
/obj/structure/sign/levels/shuttle_bay
name = "\improper Shuttle Bay"
desc = "A direction sign, stating the level to find the nearest shuttle bay on."
icon_state = "level_bay"
/obj/structure/sign/directions/tram
name = "\improper Public Transit Station"
desc = "A direction sign, pointing out the way to the nearest public transit station."
-1
View File
@@ -2,7 +2,6 @@
name = "weapon"
icon = 'icons/obj/weapons.dmi'
hitsound = "swing_hit"
var/can_cleave = FALSE // If true, a 'cleaving' attack will occur.
var/cleaving = FALSE // Used to avoid infinite cleaving.
/obj/item/weapon/Bump(mob/M as mob)