mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-23 12:08:28 +01:00
Merge remote-tracking branch 'upstream/master' into kk-coyotesuit
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,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
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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,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)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user