mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-31 09:09:49 +01:00
Merge branch 'master' into Precursorpewpew
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
/obj/effect/bspawner
|
||||
name = "bluespace tear"
|
||||
desc = "An erratic portal of bluespace energies, its tear seems quite unstable but seems to endlessly create crystals. . ."
|
||||
anchored = 1
|
||||
icon = 'icons/obj/stationobjs_vr.dmi'
|
||||
icon_state = "portalgateway"
|
||||
var/obj/item_to_spawn = /obj/item/stack/telecrystal
|
||||
var/item_arg = 8
|
||||
var/time_between_spawn = 1 MINUTE
|
||||
var/time_to_end = 45 MINUTES
|
||||
var/spawned_num = 0
|
||||
var/init_time
|
||||
|
||||
/obj/effect/bspawner/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj,src)
|
||||
init_time = world.time
|
||||
|
||||
/obj/effect/bspawner/proc/spawn_item()
|
||||
if(!isnull(item_arg))
|
||||
new item_to_spawn(loc,item_arg)
|
||||
else
|
||||
new item_to_spawn(loc)
|
||||
|
||||
/obj/effect/bspawner/process()
|
||||
if(world.time > init_time + time_between_spawn * (spawned_num + 1))
|
||||
spawn_item()
|
||||
spawned_num++
|
||||
if(world.time > init_time + time_to_end)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/bspawner/Destroy()
|
||||
STOP_PROCESSING(SSobj,src)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/bspawner/min30
|
||||
time_to_end = 30 MINUTES
|
||||
@@ -7,16 +7,32 @@
|
||||
icon_state = "uglymine"
|
||||
var/triggered = 0
|
||||
var/smoke_strength = 3
|
||||
var/mineitemtype = /obj/item/weapon/mine
|
||||
var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine
|
||||
var/panel_open = 0
|
||||
var/datum/wires/mines/wires = null
|
||||
register_as_dangerous_object = TRUE
|
||||
|
||||
var/camo_net = FALSE // Will the mine 'cloak' on deployment?
|
||||
|
||||
// The trap item will be triggered in some manner when detonating. Default only checks for grenades.
|
||||
var/obj/item/trap = null
|
||||
|
||||
/obj/effect/mine/New()
|
||||
icon_state = "uglyminearmed"
|
||||
wires = new(src)
|
||||
|
||||
if(ispath(trap))
|
||||
trap = new trap(src)
|
||||
|
||||
/obj/effect/mine/Initialize()
|
||||
..()
|
||||
|
||||
if(camo_net)
|
||||
alpha = 50
|
||||
|
||||
/obj/effect/mine/Destroy()
|
||||
if(trap)
|
||||
QDEL_NULL(trap)
|
||||
qdel_null(wires)
|
||||
return ..()
|
||||
|
||||
@@ -25,11 +41,33 @@
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/trigger_trap(var/mob/living/victim)
|
||||
if(istype(trap, /obj/item/weapon/grenade))
|
||||
var/obj/item/weapon/grenade/G = trap
|
||||
trap = null
|
||||
G.forceMove(get_turf(src))
|
||||
if(victim.ckey)
|
||||
msg_admin_attack("[key_name_admin(victim)] stepped on \a [src.name], triggering [trap]")
|
||||
G.activate()
|
||||
|
||||
if(istype(trap, /obj/item/device/transfer_valve))
|
||||
var/obj/item/device/transfer_valve/TV = trap
|
||||
trap = null
|
||||
TV.forceMove(get_turf(src))
|
||||
TV.toggle_valve()
|
||||
|
||||
/obj/effect/mine/bullet_act()
|
||||
if(prob(50))
|
||||
explode()
|
||||
@@ -63,6 +101,9 @@
|
||||
"<span class='notice'>You very carefully screw the mine's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
|
||||
// Panel open, stay uncloaked, or uncloak if already cloaked. If you don't cloak on place, ignore it and just be normal alpha.
|
||||
alpha = camo_net ? (panel_open ? 255 : 50) : 255
|
||||
|
||||
else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open)
|
||||
interact(user)
|
||||
else
|
||||
@@ -74,6 +115,9 @@
|
||||
user.set_machine(src)
|
||||
wires.Interact(user)
|
||||
|
||||
/obj/effect/mine/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
mineitemtype = /obj/item/weapon/mine/dnascramble
|
||||
|
||||
@@ -193,6 +237,9 @@
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/emp/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/incendiary
|
||||
mineitemtype = /obj/item/weapon/mine/incendiary
|
||||
|
||||
@@ -208,6 +255,26 @@
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/gadget
|
||||
mineitemtype = /obj/item/weapon/mine/gadget
|
||||
|
||||
/obj/effect/mine/gadget/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 0, 2, 2)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// The held item version of the above mines
|
||||
/////////////////////////////////////////////
|
||||
@@ -219,6 +286,10 @@
|
||||
var/countdown = 10
|
||||
var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime.
|
||||
|
||||
var/obj/item/trap = null
|
||||
|
||||
var/list/allowed_gadgets = null
|
||||
|
||||
/obj/item/weapon/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
|
||||
add_fingerprint(user)
|
||||
msg_admin_attack("[key_name_admin(user)] primed \a [src]")
|
||||
@@ -231,11 +302,39 @@
|
||||
prime(user, TRUE)
|
||||
return
|
||||
|
||||
/obj/item/weapon/mine/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(W.is_screwdriver() && trap)
|
||||
to_chat(user, "<span class='notice'>You begin removing \the [trap].</span>")
|
||||
if(do_after(user, 10 SECONDS))
|
||||
to_chat(user, "<span class='notice'>You finish disconnecting the mine's trigger.</span>")
|
||||
trap.forceMove(get_turf(src))
|
||||
trap = null
|
||||
return
|
||||
|
||||
if(LAZYLEN(allowed_gadgets) && !trap)
|
||||
var/allowed = FALSE
|
||||
|
||||
for(var/path in allowed_gadgets)
|
||||
if(istype(W, path))
|
||||
allowed = TRUE
|
||||
break
|
||||
|
||||
if(allowed)
|
||||
user.drop_from_inventory(W)
|
||||
W.forceMove(src)
|
||||
trap = W
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/mine/proc/prime(mob/user as mob, var/explode_now = FALSE)
|
||||
visible_message("\The [src.name] beeps as the priming sequence completes.")
|
||||
var/obj/effect/mine/R = new minetype(get_turf(src))
|
||||
src.transfer_fingerprints_to(R)
|
||||
R.add_fingerprint(user)
|
||||
if(trap)
|
||||
R.trap = trap
|
||||
trap = null
|
||||
R.trap.forceMove(R)
|
||||
if(explode_now)
|
||||
R.explode(user)
|
||||
spawn(0)
|
||||
@@ -286,8 +385,14 @@
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/incendiary
|
||||
|
||||
/obj/item/weapon/mine/gadget
|
||||
name = "gadget mine"
|
||||
desc = "A small pressure-triggered device. If no component is added, the internal release bolts will detonate in unison when triggered."
|
||||
|
||||
allowed_gadgets = list(/obj/item/weapon/grenade, /obj/item/device/transfer_valve)
|
||||
|
||||
// This tells AI mobs to not be dumb and step on mines willingly.
|
||||
/obj/item/weapon/mine/is_safe_to_step(mob/living/L)
|
||||
if(!L.hovering)
|
||||
return FALSE
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -104,8 +104,10 @@
|
||||
|
||||
var/tip_timer // reference to timer id for a tooltip we might open soon
|
||||
|
||||
/obj/item/New()
|
||||
..()
|
||||
/obj/item/Initialize(mapload)
|
||||
. = ..()
|
||||
if(islist(origin_tech))
|
||||
origin_tech = typelist(NAMEOF(src, origin_tech), origin_tech)
|
||||
if(embed_chance < 0)
|
||||
if(sharp)
|
||||
embed_chance = max(5, round(force/w_class))
|
||||
|
||||
@@ -88,6 +88,14 @@
|
||||
if(get_dist(user, src) == 0)
|
||||
. += "It has a tiny camera inside. Needs to be both configured and brought in contact with monitor device to be fully functional."
|
||||
|
||||
/obj/item/device/camerabug/update_icon()
|
||||
..()
|
||||
|
||||
if(anchored) // Standard versions are relatively obvious if not hidden in a container. Anchoring them is advised, to disguise them.
|
||||
alpha = 50
|
||||
else
|
||||
alpha = 255
|
||||
|
||||
/obj/item/device/camerabug/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(istype(W, /obj/item/device/bug_monitor))
|
||||
var/obj/item/device/bug_monitor/SM = W
|
||||
@@ -101,6 +109,15 @@
|
||||
linkedmonitor = null
|
||||
else
|
||||
to_chat(user, "Error: The device is linked to another monitor.")
|
||||
|
||||
else if(W.is_wrench() && user.a_intent != I_HURT)
|
||||
if(isturf(loc))
|
||||
anchored = !anchored
|
||||
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "" : "un"]secure \the [src].</span>")
|
||||
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
if(W.force >= 5)
|
||||
visible_message("\The [src] lens shatters!")
|
||||
|
||||
@@ -241,7 +241,7 @@
|
||||
M.initial_icon = new_icon
|
||||
if(new_icon_file)
|
||||
M.icon = new_icon_file
|
||||
M.reset_icon()
|
||||
M.update_icon()
|
||||
use(1, user)
|
||||
|
||||
/obj/mecha/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
return 1
|
||||
|
||||
/obj/item/borg/upgrade/bellysizeupgrade
|
||||
name = "robotic Hound process capacity upgrade Module"
|
||||
desc = "Used to upgrade a hound belly capacity. This only affects total volume and such, you won't be able to support more than one patient. Usable once."
|
||||
name = "robohound capacity expansion module"
|
||||
desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once."
|
||||
icon_state = "cyborg_upgrade2"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
/obj/item/device/buttonofnormal
|
||||
name = "Chaos button"
|
||||
desc = "It radiates an aura of chaotic size energy."
|
||||
icon = 'icons/obj/mobcap.dmi'
|
||||
icon_state = "mobcap0"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1000)
|
||||
throwforce = 00
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
force = 0
|
||||
var/colorindex = 0
|
||||
var/mob/living/capsuleowner = null //taken from Capsule Code
|
||||
var/sizetouse = 0.25
|
||||
|
||||
pickup(mob/user)
|
||||
if(!capsuleowner)
|
||||
capsuleowner = user
|
||||
|
||||
attack_self(mob/user)
|
||||
if(colorindex)
|
||||
nonrandom()
|
||||
sleep(10)
|
||||
capsuleowner.resize(sizetouse)
|
||||
sizetouse = rand(25,200)/100 //randmization occurs after press
|
||||
|
||||
throw_impact(atom/A, speed, mob/user)
|
||||
..()
|
||||
if(isliving(A))
|
||||
if(colorindex)
|
||||
nonrandom()
|
||||
sleep(5)
|
||||
var/mob/living/capsulehit = A
|
||||
capsulehit.resize(sizetouse)
|
||||
sizetouse = rand(25,200)/100 //randmization occurs after press
|
||||
|
||||
attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/pen))
|
||||
colorindex = (colorindex + 1) % 6
|
||||
icon_state = "mobcap[colorindex]"
|
||||
update_icon()
|
||||
if(istype(W, /obj/item/weapon/card/id))
|
||||
capsuleowner = null
|
||||
..()
|
||||
|
||||
/obj/item/device/buttonofnormal/proc/nonrandom() //Secret ball randmoizer rig code
|
||||
switch(colorindex)
|
||||
if(1) sizetouse = RESIZE_HUGE
|
||||
if(2) sizetouse = RESIZE_BIG
|
||||
if(3) sizetouse = RESIZE_NORMAL
|
||||
if(4) sizetouse = RESIZE_SMALL
|
||||
if(5) sizetouse = RESIZE_TINY
|
||||
|
||||
/obj/item/device/daredevice
|
||||
name = "Dare button"
|
||||
desc = "A strange button, the only distinguishing feature being an engraved text reading 'Suffer to Gain.'."
|
||||
icon = 'icons/obj/mobcap.dmi'
|
||||
icon_state = "mobcap1"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 5000)
|
||||
throwforce = 00
|
||||
throw_speed = 2
|
||||
throw_range = 20
|
||||
force = 0
|
||||
var/luckynumber7 = 0
|
||||
var/colorindex = 1
|
||||
|
||||
var/list/winitems = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cookie,
|
||||
/obj/item/weapon/spacecasinocash,
|
||||
/obj/item/weapon/reagent_containers/syringe/drugs,
|
||||
)
|
||||
|
||||
attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/pen))
|
||||
colorindex += 1
|
||||
if(colorindex >= 6)
|
||||
colorindex = 0
|
||||
icon_state = "mobcap[colorindex]"
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
attack_self(mob/user)
|
||||
var/mob/living/capsuleowner = user
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
var/item = pick(winitems)
|
||||
sleep(100)
|
||||
switch(luckynumber7)
|
||||
if(1) capsuleowner.resize(RESIZE_TINY) //Loss Shrinking!
|
||||
if(2) capsuleowner.apply_damage(5, BRUTE) //Loss Damaging!
|
||||
if(3) capsuleowner.Weaken(5) //Loss Knee spaghetti!
|
||||
if(4) capsuleowner.hallucination += 66 //loss woah, dude.
|
||||
if(5) new item(capsuleowner.loc) //Win!
|
||||
if(7)
|
||||
new /obj/item/weapon/material/butterfly/switchblade(capsuleowner.loc)
|
||||
capsuleowner.apply_damage(10, BRUTE) //Loss Damaging! WIN KNIVE!
|
||||
if(9)
|
||||
new /obj/item/weapon/gun/energy/sizegun/not_advanced(capsuleowner.loc)
|
||||
qdel(src)
|
||||
if(777) new /obj/item/weapon/spacecash/c1000(capsuleowner.loc) //for rigging
|
||||
else luckynumber7 = (rand(0,10))
|
||||
luckynumber7 = rand(0,10)
|
||||
sleep(100)
|
||||
playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
|
||||
|
||||
//items literally just made for the above item spawner
|
||||
|
||||
//
|
||||
//BADvanced size gun
|
||||
//
|
||||
/obj/item/weapon/gun/energy/sizegun/not_advanced
|
||||
name = "Corrupted size gun"
|
||||
desc = "A highly advanced ray gun with a knob on the side to adjust the size you desire. Or at least that's what it used to be."
|
||||
projectile_type = /obj/item/projectile/beam/sizelaser/chaos
|
||||
charge_cost = 60 //1/3 of the base price for a normal one.
|
||||
//
|
||||
//CHAOS laser
|
||||
//
|
||||
/obj/item/projectile/beam/sizelaser/chaos //The Defintiely not advanced sizeguns laser.
|
||||
name = "chaos size beam"
|
||||
light_color = "#FF0000"
|
||||
light_range = 3
|
||||
light_power = 9 //should be plenty visible.
|
||||
var/list/chaos_colors = list(
|
||||
"#FF0000",
|
||||
"#00FF00",
|
||||
"#0000FF",
|
||||
"#FFFF00",
|
||||
"#00FFFF",
|
||||
"#FF00FF",
|
||||
"#000000",
|
||||
"#FFFFFF",
|
||||
"#F0F0F0",
|
||||
"#0F0F0F",
|
||||
)
|
||||
|
||||
on_hit(var/atom/target)
|
||||
light_color = pick(chaos_colors)
|
||||
var/chaos = rand(25,200)
|
||||
var/mob/living/M = target
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.resize(chaos/100)
|
||||
H.show_message("<font color='#6F6FE2'> The beam fires into your body, changing your size!</font>")
|
||||
H.updateicon()
|
||||
else if (istype(target, /mob/living/))
|
||||
var/mob/living/H = M
|
||||
H.resize(chaos/100)
|
||||
H.updateicon()
|
||||
else
|
||||
return 1
|
||||
@@ -56,3 +56,6 @@
|
||||
name = "Bandage Synthesizer"
|
||||
max_energy = 10
|
||||
recharge_rate = 1
|
||||
|
||||
/datum/matter_synth/cloth
|
||||
name = "Cloth Synthesizer"
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
/obj/item/stack/sandbags
|
||||
name = "sandbag"
|
||||
desc = "Filled sandbags. Fortunately pre-filled."
|
||||
singular_name = "sandbag"
|
||||
icon = 'icons/obj/sandbags.dmi'
|
||||
icon_state = "sandbag"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 10.0
|
||||
throwforce = 20.0
|
||||
throw_speed = 5
|
||||
throw_range = 3
|
||||
drop_sound = 'sound/items/drop/clothing.ogg'
|
||||
pickup_sound = 'sound/items/pickup/clothing.ogg'
|
||||
matter = list(MAT_CLOTH = SHEET_MATERIAL_AMOUNT * 2)
|
||||
max_amount = 30
|
||||
attack_verb = list("hit", "bludgeoned", "pillowed")
|
||||
no_variants = TRUE
|
||||
stacktype = /obj/item/stack/sandbags
|
||||
|
||||
pass_color = TRUE
|
||||
|
||||
var/bag_material = "cloth"
|
||||
|
||||
/obj/item/stack/sandbags/cyborg
|
||||
name = "sandbag synthesizer"
|
||||
desc = "A device that makes filled sandbags. Don't ask how."
|
||||
gender = NEUTER
|
||||
matter = null
|
||||
uses_charge = 1
|
||||
charge_costs = list(500)
|
||||
stacktype = /obj/item/stack/sandbags
|
||||
|
||||
bag_material = MAT_SYNCLOTH
|
||||
|
||||
/obj/item/stack/sandbags/New(var/newloc, var/amt, var/bag_mat)
|
||||
..()
|
||||
recipes = sandbag_recipes
|
||||
update_icon()
|
||||
|
||||
if(bag_mat)
|
||||
bag_material = bag_mat
|
||||
|
||||
var/datum/material/M = get_material_by_name("[bag_material]")
|
||||
if(!M)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
color = M.icon_colour
|
||||
|
||||
/obj/item/stack/sandbags/update_icon()
|
||||
var/amount = get_amount()
|
||||
|
||||
slowdown = round(amount / 10, 0.1)
|
||||
|
||||
var/global/list/datum/stack_recipe/sandbag_recipes = list( \
|
||||
new/datum/stack_recipe("barricade", /obj/structure/barricade/sandbag, 3, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE))
|
||||
|
||||
/obj/item/stack/sandbags/produce_recipe(datum/stack_recipe/recipe, var/quantity, mob/user)
|
||||
var/required = quantity*recipe.req_amount
|
||||
var/produced = min(quantity*recipe.res_amount, recipe.max_res_amount)
|
||||
|
||||
if (!can_use(required))
|
||||
if (produced>1)
|
||||
to_chat(user, "<span class='warning'>You haven't got enough [src] to build \the [produced] [recipe.title]\s!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You haven't got enough [src] to build \the [recipe.title]!</span>")
|
||||
return
|
||||
|
||||
if (recipe.one_per_turf && (locate(recipe.result_type) in user.loc))
|
||||
to_chat(user, "<span class='warning'>There is another [recipe.title] here!</span>")
|
||||
return
|
||||
|
||||
if (recipe.on_floor && !isfloor(user.loc))
|
||||
to_chat(user, "<span class='warning'>\The [recipe.title] must be constructed on the floor!</span>")
|
||||
return
|
||||
|
||||
if (recipe.time)
|
||||
to_chat(user, "<span class='notice'>Building [recipe.title] ...</span>")
|
||||
if (!do_after(user, recipe.time))
|
||||
return
|
||||
|
||||
if (use(required))
|
||||
var/atom/O = new recipe.result_type(user.loc, bag_material)
|
||||
|
||||
if(istype(O, /obj))
|
||||
var/obj/Ob = O
|
||||
|
||||
if(LAZYLEN(Ob.matter)) // Law of equivalent exchange.
|
||||
Ob.matter.Cut()
|
||||
|
||||
else
|
||||
Ob.matter = list()
|
||||
|
||||
var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000
|
||||
|
||||
Ob.matter[recipe.use_material] = mattermult / produced * required
|
||||
|
||||
O.set_dir(user.dir)
|
||||
O.add_fingerprint(user)
|
||||
|
||||
if (istype(O, /obj/item/stack))
|
||||
var/obj/item/stack/S = O
|
||||
S.amount = produced
|
||||
S.add_to_stacks(user)
|
||||
|
||||
if (istype(O, /obj/item/weapon/storage)) //BubbleWrap - so newly formed boxes are empty
|
||||
for (var/obj/item/I in O)
|
||||
qdel(I)
|
||||
|
||||
if ((pass_color || recipe.pass_color))
|
||||
if(!color)
|
||||
if(recipe.use_material)
|
||||
var/datum/material/MAT = get_material_by_name(recipe.use_material)
|
||||
if(MAT.icon_colour)
|
||||
O.color = MAT.icon_colour
|
||||
else
|
||||
return
|
||||
else
|
||||
O.color = color
|
||||
|
||||
// Empty bags. Yes, you need to fill them.
|
||||
|
||||
/obj/item/stack/emptysandbag
|
||||
name = "sandbag"
|
||||
desc = "Empty sandbags. You know what must be done."
|
||||
singular_name = "sandbag"
|
||||
icon = 'icons/obj/sandbags.dmi'
|
||||
icon_state = "sandbag_e"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
|
||||
strict_color_stacking = TRUE
|
||||
max_amount = 30
|
||||
stacktype = /obj/item/stack/emptysandbag
|
||||
|
||||
pass_color = TRUE
|
||||
|
||||
var/bag_material = "cloth"
|
||||
|
||||
/obj/item/stack/emptysandbag/New(var/newloc, var/amt, var/bag_mat)
|
||||
..(newloc, amt)
|
||||
|
||||
if(bag_mat)
|
||||
bag_material = bag_mat
|
||||
|
||||
var/datum/material/M = get_material_by_name("[bag_material]")
|
||||
if(!M)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
color = M.icon_colour
|
||||
|
||||
/obj/item/stack/emptysandbag/attack_self(var/mob/user)
|
||||
while(do_after(user, 1 SECOND) && can_use(1) && istype(get_turf(src), /turf/simulated/floor/outdoors))
|
||||
use(1)
|
||||
var/obj/item/stack/sandbags/SB = new (get_turf(src), 1, bag_material)
|
||||
SB.color = color
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You fill a sandbag.</span>")
|
||||
@@ -163,7 +163,7 @@
|
||||
|
||||
if (recipe.time)
|
||||
to_chat(user, "<span class='notice'>Building [recipe.title] ...</span>")
|
||||
if (!do_after(user, recipe.time, exclusive = TRUE))
|
||||
if (!do_after(user, recipe.time))
|
||||
return
|
||||
|
||||
if (use(required))
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
name = "stack of sifgrass"
|
||||
type_to_spawn = /obj/item/stack/tile/grass/sif
|
||||
|
||||
/obj/fiftyspawner/grass/sif/forest
|
||||
name = "stack of sifgrass"
|
||||
type_to_spawn = /obj/item/stack/tile/grass/sif/forest
|
||||
|
||||
/obj/fiftyspawner/wood
|
||||
name = "stack of wood"
|
||||
type_to_spawn = /obj/item/stack/tile/wood
|
||||
@@ -62,4 +66,4 @@
|
||||
|
||||
/obj/fiftyspawner/bmarble
|
||||
name = "stack of dark marble tiles"
|
||||
type_to_spawn = /obj/item/stack/tile/bmarble
|
||||
type_to_spawn = /obj/item/stack/tile/bmarble
|
||||
|
||||
@@ -52,6 +52,16 @@
|
||||
singular_name = "sivian grass floor tile"
|
||||
desc = "A patch of grass like those that decorate the plains of Sif."
|
||||
|
||||
/obj/item/stack/tile/grass/sif/forest
|
||||
name = "sivian overgrowth tile"
|
||||
singular_name = "sivian overgrowth floor tile"
|
||||
desc = "A patch of dark overgrowth like those that decorate the plains of Sif."
|
||||
|
||||
/obj/item/stack/tile/grass/sif/forest
|
||||
name = "sivian overgrowth tile"
|
||||
singular_name = "sivian overgrowth floor tile"
|
||||
desc = "A patch of dark overgrowth like those that decorate the plains of Sif."
|
||||
|
||||
/*
|
||||
* Wood
|
||||
*/
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
/obj/item/toy/mistletoe
|
||||
name = "mistletoe"
|
||||
desc = "You are supposed to kiss someone under these"
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "mistletoe"
|
||||
|
||||
/obj/item/toy/plushie/lizardplushie
|
||||
name = "lizard plushie"
|
||||
desc = "An adorable stuffed toy that resembles a lizardperson."
|
||||
@@ -50,6 +56,14 @@
|
||||
/obj/item/toy/plushie/borgplushie/scrubpuppy
|
||||
icon_state = "scrubpuppy"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drakiesec
|
||||
icon = 'icons/obj/drakietoy_vr.dmi'
|
||||
icon_state = "secdrake"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drakiemed
|
||||
icon = 'icons/obj/drakietoy_vr.dmi'
|
||||
icon_state = "meddrake"
|
||||
|
||||
/obj/item/toy/plushie/foxbear
|
||||
name = "toy fox"
|
||||
desc = "Issa fox!"
|
||||
@@ -68,3 +82,22 @@
|
||||
desc = "A perfectly sized snuggable river weasel! Keep away from Clams."
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "plushie_otter"
|
||||
|
||||
/obj/item/toy/plushie/vox
|
||||
name = "vox plushie"
|
||||
desc = "A stitched-together vox, fresh from the skipjack. Press its belly to hear it skree!"
|
||||
icon = 'icons/obj/toy_vr.dmi'
|
||||
icon_state = "plushie_vox"
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/toy/plushie/vox/attack_self(mob/user as mob)
|
||||
if(!cooldown)
|
||||
playsound(user, 'sound/voice/shriek1.ogg', 10, 0)
|
||||
src.visible_message("<span class='danger'>Skreee!</span>")
|
||||
cooldown = 1
|
||||
addtimer(CALLBACK(src, .proc/cooldownreset), 50)
|
||||
return ..()
|
||||
|
||||
/obj/item/toy/plushie/vox/proc/cooldownreset()
|
||||
cooldown = 0
|
||||
|
||||
|
||||
@@ -174,10 +174,14 @@
|
||||
build_path = /obj/machinery/teleport/hub
|
||||
board_type = new /datum/frame/frame_types/machine //YWEdit makes buildable
|
||||
// origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 4)
|
||||
//CHOMPedit Balance
|
||||
req_components = list(
|
||||
/obj/item/weapon/stock_parts/scanning_module = 4,
|
||||
/obj/item/weapon/stock_parts/micro_laser = 4,
|
||||
/obj/item/stack/cable_coil = 10)
|
||||
/obj/item/weapon/ore/bluespace_crystal = 2,
|
||||
/obj/item/weapon/stock_parts/capacitor = 2,
|
||||
/obj/item/weapon/stock_parts/scanning_module = 2,
|
||||
/obj/item/weapon/stock_parts/micro_laser =2,
|
||||
/obj/item/stack/cable_coil = 5)
|
||||
//End CHOMPedit
|
||||
|
||||
/obj/item/weapon/circuitboard/teleporter_station
|
||||
name = T_BOARD("teleporter station")
|
||||
|
||||
@@ -152,3 +152,13 @@
|
||||
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/clustaur
|
||||
desc = "It is set to detonate in 5 seconds. It will release a cluster of hydration."
|
||||
name = "clustaur grenade"
|
||||
icon = 'icons/obj/grenade_ch.dmi'
|
||||
icon_state = "clustaur"
|
||||
item_state = "clustaur"
|
||||
banglet = 1
|
||||
deliveryamt = 10
|
||||
spawner_type = /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle/wataur
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/mob/living/carbon/human/proc/use_reagent_implant_egg()
|
||||
set name = "Force Someone Adjacent To Lay An Egg, If Applicable!"
|
||||
set desc = "Force someone adjacent to lay an egg by squeezing into their lower body! Whilst their reaction may vary, this is certainly going to overwhelm them for a moment!"
|
||||
set category = "Local"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
//do_reagent_implant(usr)
|
||||
if(!isliving(usr) || !usr.checkClickCooldown())
|
||||
@@ -93,7 +93,7 @@
|
||||
|
||||
set name = "Toggle cascading"
|
||||
set desc = "Toggle whether or not being forced to lay an egg will cause you to lay all others as well, in rapid succession"
|
||||
set category = "Local"
|
||||
set category = "Object"
|
||||
|
||||
var/obj/item/weapon/implant/reagent_generator/egg/rimplant
|
||||
for(var/obj/item/organ/external/E in organs)
|
||||
@@ -138,4 +138,4 @@
|
||||
/obj/item/weapon/implant/reagent_generator/egg/veryslowlowcap
|
||||
name = "very slow, low capacity egg laying implant"
|
||||
usable_volume = 6000
|
||||
transfer_amount = 6000
|
||||
transfer_amount = 6000
|
||||
|
||||
@@ -99,6 +99,8 @@
|
||||
|
||||
/obj/item/weapon/material/proc/check_health(var/consumed)
|
||||
if(health<=0)
|
||||
health = 0
|
||||
|
||||
if(fragile)
|
||||
shatter(consumed)
|
||||
else if(!dulled && can_dull)
|
||||
|
||||
@@ -93,3 +93,118 @@
|
||||
//icon_state = "reinf-snowball"
|
||||
force_divisor = 0.20
|
||||
thrown_force_divisor = 0.25
|
||||
|
||||
/obj/item/weapon/material/whip
|
||||
name = "whip"
|
||||
desc = "A tool used to discipline animals, or look cool. Mostly the latter."
|
||||
description_info = "Help - Standard attack, no modifiers.<br>\
|
||||
Disarm - Disarming strike. Attempts to disarm the target at range, similar to an unarmed disarm. Additionally, will force the target (if possible) to move away from you.<br>\
|
||||
Grab - Grappling strike. Attempts to pull the target toward you. This can also move objects.<br>\
|
||||
Harm - A standard strike with a small chance to disarm."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "whip"
|
||||
item_state = "chain"
|
||||
default_material = MAT_LEATHER
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
origin_tech = list(TECH_COMBAT = 2)
|
||||
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
|
||||
force_divisor = 0.15
|
||||
thrown_force_divisor = 0.25
|
||||
reach = 2
|
||||
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
|
||||
)
|
||||
|
||||
/obj/item/weapon/material/whip/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||
..()
|
||||
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
if(istype(A, /atom/movable))
|
||||
var/atom/movable/AM = A
|
||||
if(AM.anchored)
|
||||
to_chat(user, "<span class='notice'>\The [AM] won't budge.</span>")
|
||||
return
|
||||
|
||||
else
|
||||
if(!istype(AM, /obj/item))
|
||||
user.visible_message("<span class='warning'>\The [AM] is pulled along by \the [src]!</span>")
|
||||
AM.Move(get_step(AM, get_dir(AM, src)))
|
||||
return
|
||||
|
||||
else
|
||||
user.visible_message("<span class='warning'>\The [AM] is snatched by \the [src]!</span>")
|
||||
AM.throw_at(user, reach, 0.1, user)
|
||||
|
||||
/obj/item/weapon/material/whip/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
||||
if(user.a_intent)
|
||||
switch(user.a_intent)
|
||||
if(I_HURT)
|
||||
if(prob(10) && istype(target, /mob/living/carbon/human) && user.zone_sel in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND))
|
||||
to_chat(target, "<span class='warning'>\The [src] rips at your hands!</span>")
|
||||
ranged_disarm(target)
|
||||
if(I_DISARM)
|
||||
if(prob(min(90, force * 3)) && istype(target, /mob/living/carbon/human) && user.zone_sel in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND))
|
||||
ranged_disarm(target)
|
||||
else
|
||||
target.visible_message("<span class='danger'>\The [src] sends \the [target] stumbling away.</span>")
|
||||
target.Move(get_step(target,get_dir(user,target)))
|
||||
if(I_GRAB)
|
||||
var/turf/STurf = get_turf(target)
|
||||
spawn(2)
|
||||
playsound(STurf, 'sound/effects/snap.ogg', 60, 1)
|
||||
target.visible_message("<span class='critical'>\The [src] yanks \the [target] towards \the [user]!</span>")
|
||||
target.throw_at(get_turf(get_step(user,get_dir(user,target))), 2, 1, src)
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/whip/proc/ranged_disarm(var/mob/living/carbon/human/H, var/mob/living/user)
|
||||
if(istype(H))
|
||||
var/list/holding = list(H.get_active_hand() = 40, H.get_inactive_hand() = 20)
|
||||
|
||||
if(user.zone_sel in list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND))
|
||||
for(var/obj/item/weapon/gun/W in holding)
|
||||
if(W && prob(holding[W]))
|
||||
var/list/turfs = list()
|
||||
for(var/turf/T in view())
|
||||
turfs += T
|
||||
if(turfs.len)
|
||||
var/turf/target = pick(turfs)
|
||||
visible_message("<span class='danger'>[H]'s [W] goes off due to \the [src]!</span>")
|
||||
return W.afterattack(target,H)
|
||||
|
||||
if(!(H.species.flags & NO_SLIP) && prob(10) && user.zone_sel in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
|
||||
var/armor_check = H.run_armor_check(user.zone_sel, "melee")
|
||||
H.apply_effect(3, WEAKEN, armor_check)
|
||||
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
if(armor_check < 60)
|
||||
visible_message("<span class='danger'>\The [src] has tripped [H]!</span>")
|
||||
else
|
||||
visible_message("<span class='warning'>\The [src] attempted to trip [H]!</span>")
|
||||
return
|
||||
|
||||
else
|
||||
if(H.break_all_grabs(user))
|
||||
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
return
|
||||
|
||||
if(user.zone_sel in list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND))
|
||||
for(var/obj/item/I in holding)
|
||||
if(I && prob(holding[I]))
|
||||
H.drop_from_inventory(I)
|
||||
visible_message("<span class='danger'>\The [src] has disarmed [H]!</span>")
|
||||
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
return
|
||||
|
||||
/obj/item/weapon/material/whip/suicide_act(mob/user)
|
||||
var/datum/gender/T = gender_datums[user.get_visible_gender()]
|
||||
user.visible_message(span("danger", "\The [user] [T.is] strangling [T.himself] with \the [src]! It looks like [T.he] [T.is] trying to commit suicide."), span("danger", "You start to strangle yourself with \the [src]!"), span("danger", "You hear the sound of someone choking!"))
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/weapon/material/whip/attack_self(mob/user)
|
||||
user.visible_message("<span class='warning'>\The [user] cracks \the [src]!</span>")
|
||||
playsound(src, 'sound/effects/snap.ogg', 50, 1)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
//CHOMP Specific overrides
|
||||
/obj/item/weapon/material/whip
|
||||
icon = 'icons/obj/weapons_ch.dmi'
|
||||
@@ -9,10 +9,12 @@
|
||||
origin_tech = list(TECH_COMBAT = 4)
|
||||
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
|
||||
|
||||
suicide_act(mob/user)
|
||||
var/datum/gender/T = gender_datums[user.get_visible_gender()]
|
||||
user.visible_message(span("danger", "\The [user] [T.is] strangling [T.himself] with \the [src]! It looks like [T.he] [T.is] trying to commit suicide."), span("danger", "You start to strangle yourself with \the [src]!"), span("danger", "You hear the sound of someone choking!"))
|
||||
return (OXYLOSS)
|
||||
reach = 2
|
||||
|
||||
/obj/item/weapon/melee/chainofcommand/suicide_act(mob/user)
|
||||
var/datum/gender/T = gender_datums[user.get_visible_gender()]
|
||||
user.visible_message(span("danger", "\The [user] [T.is] strangling [T.himself] with \the [src]! It looks like [T.he] [T.is] trying to commit suicide."), span("danger", "You start to strangle yourself with \the [src]!"), span("danger", "You hear the sound of someone choking!"))
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/weapon/melee/umbrella
|
||||
name = "umbrella"
|
||||
|
||||
@@ -0,0 +1,182 @@
|
||||
//Item type vorepanel egg release containers.
|
||||
|
||||
/obj/item/weapon/storage/vore_egg
|
||||
name = "egg"
|
||||
desc = "It's an egg; it's smooth to the touch." //This is the default egg.
|
||||
icon = 'icons/obj/egg_new_vr.dmi'
|
||||
icon_state = "egg"
|
||||
var/open_egg_icon = 'icons/obj/egg_open_vr.dmi'
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
|
||||
)
|
||||
w_class = 2
|
||||
max_w_class = 0
|
||||
show_messages = 0
|
||||
allow_quick_empty = TRUE
|
||||
use_sound = 'sound/items/drop/flesh.ogg'
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/open(mob/user as mob)
|
||||
icon = open_egg_icon
|
||||
..()
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/proc/hatch(mob/living/user as mob)
|
||||
visible_message("<span class='danger'>\The [src] begins to shake as something pushes out from within!</span>")
|
||||
animate_shake()
|
||||
if(do_after(user, 50))
|
||||
if(use_sound)
|
||||
playsound(src, src.use_sound, 50, 0, -5)
|
||||
animate_shake()
|
||||
drop_contents()
|
||||
icon = open_egg_icon
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/proc/animate_shake()
|
||||
var/init_px = pixel_x
|
||||
var/shake_dir = pick(-1, 1)
|
||||
animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
|
||||
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/unathi
|
||||
name = "unathi egg"
|
||||
desc = "Some species of Unathi apparently lay soft-shelled eggs!"
|
||||
icon_state = "egg_unathi"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/nevrean
|
||||
name = "nevrean egg"
|
||||
desc = "Most Nevreans lay hard-shelled eggs!"
|
||||
icon_state = "egg_nevrean"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/human
|
||||
name = "human egg"
|
||||
desc = "Some humans lay eggs that are--wait, what?"
|
||||
icon_state = "egg_human"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/tajaran
|
||||
name = "tajaran egg"
|
||||
desc = "Apparently that's what a Tajaran egg looks like. Weird."
|
||||
icon_state = "egg_tajaran"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/skrell
|
||||
name = "skrell egg"
|
||||
desc = "Its soft and squishy"
|
||||
icon_state = "egg_skrell"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/shark
|
||||
name = "akula egg"
|
||||
desc = "Its soft and slimy to the touch"
|
||||
icon_state = "egg_akula"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/sergal
|
||||
name = "sergal egg"
|
||||
desc = "An egg with a slightly fuzzy exterior, and a hard layer beneath."
|
||||
icon_state = "egg_sergal"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/slime
|
||||
name = "slime egg"
|
||||
desc = "An egg with a soft and squishy interior, coated with slime."
|
||||
icon_state = "egg_slime"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/special //Not actually used, but the sprites are in, and it's there in case any admins need to spawn in the egg for any specific reasons.
|
||||
name = "special egg"
|
||||
desc = "This egg has a very unique look to it."
|
||||
icon_state = "egg_unique"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/scree
|
||||
name = "Chimera egg"
|
||||
desc = "...You don't know what type of creature laid this egg."
|
||||
icon_state = "egg_scree"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/xenomorph
|
||||
name = "Xenomorph egg"
|
||||
desc = "Some type of pitch black egg. It has a slimy exterior coating."
|
||||
icon_state = "egg_xenomorph"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/chocolate
|
||||
name = "chocolate egg"
|
||||
desc = "Delicious. May contain a choking hazard."
|
||||
icon_state = "egg_chocolate"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/owlpellet
|
||||
name = "boney egg"
|
||||
desc = "Can an egg shell be made of bones and hair?"
|
||||
icon_state = "egg_pellet"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/slimeglob
|
||||
name = "glob of slime"
|
||||
desc = "Very squishy."
|
||||
icon_state = "egg_slimeglob"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/chicken
|
||||
name = "chicken egg"
|
||||
desc = "Looks like chickens come in all sizes and shapes."
|
||||
icon_state = "egg_chicken"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/synthetic
|
||||
name = "synthetic egg"
|
||||
desc = "Can robots lay eggs?"
|
||||
icon_state = "egg_synthetic"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/badrecipe
|
||||
name = "Burned mess"
|
||||
desc = "Someone didn't cook this egg quite right..."
|
||||
icon_state = "egg_badrecipe"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/escapepod
|
||||
name = "small escape pod"
|
||||
desc = "Someone left in a hurry."
|
||||
icon_state = "egg_escapepod"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/cocoon
|
||||
name = "web cocoon"
|
||||
desc = "It straight up smells like spiders in here."
|
||||
icon_state = "egg_cocoon"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/bugcocoon
|
||||
name = "bug cocoon"
|
||||
desc = "Metamorphosis!"
|
||||
icon_state = "egg_bugcocoon"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/rock
|
||||
name = "rock egg"
|
||||
desc = "It looks like a small boulder."
|
||||
icon_state = "egg_rock"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/yellow
|
||||
name = "yellow egg"
|
||||
desc = "It is a nice yellow egg."
|
||||
icon_state = "egg_yellow"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/blue
|
||||
name = "blue egg"
|
||||
desc = "It is a nice blue egg."
|
||||
icon_state = "egg_blue"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/green
|
||||
name = "green egg"
|
||||
desc = "It is a nice green egg."
|
||||
icon_state = "egg_green"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/orange
|
||||
name = "orange egg"
|
||||
desc = "It is a nice orange egg."
|
||||
icon_state = "egg_orange"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/purple
|
||||
name = "purple egg"
|
||||
desc = "It is a nice purple egg."
|
||||
icon_state = "egg_purple"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/red
|
||||
name = "red egg"
|
||||
desc = "It is a nice red egg."
|
||||
icon_state = "egg_red"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/rainbow
|
||||
name = "rainbow egg"
|
||||
desc = "It looks so colorful."
|
||||
icon_state = "egg_rainbow"
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/pinkspots
|
||||
name = "spotted pink egg"
|
||||
desc = "It is a cute pink egg with white spots."
|
||||
icon_state = "egg_pinkspots"
|
||||
@@ -1,3 +1,9 @@
|
||||
|
||||
/*
|
||||
* Beartraps.
|
||||
* Buckles crossing individuals, doing moderate brute damage.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/beartrap
|
||||
name = "mechanical trap"
|
||||
throw_speed = 2
|
||||
@@ -158,3 +164,238 @@
|
||||
color = "#C9DCE1"
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 1)
|
||||
|
||||
/*
|
||||
* Barbed-Wire.
|
||||
* Slows individuals crossing it. Barefoot individuals will be cut. Can be electrified by placing over a cable node.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/material/barbedwire
|
||||
name = "barbed wire"
|
||||
desc = "A coil of wire."
|
||||
icon = 'icons/obj/trap.dmi'
|
||||
icon_state = "barbedwire"
|
||||
anchored = FALSE
|
||||
layer = TABLE_LAYER
|
||||
w_class = ITEMSIZE_LARGE
|
||||
explosion_resistance = 1
|
||||
can_dull = TRUE
|
||||
fragile = TRUE
|
||||
force_divisor = 0.20
|
||||
thrown_force_divisor = 0.25
|
||||
|
||||
sharp = TRUE
|
||||
|
||||
/obj/item/weapon/material/barbedwire/set_material(var/new_material)
|
||||
..()
|
||||
|
||||
if(!QDELETED(src))
|
||||
health = round(material.integrity / 3)
|
||||
name = (material.get_edge_damage() * force_divisor > 15) ? "[material.display_name] razor wire" : "[material.display_name] [initial(name)]"
|
||||
|
||||
/obj/item/weapon/material/barbedwire/proc/can_use(mob/user)
|
||||
return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained())
|
||||
|
||||
/obj/item/weapon/material/barbedwire/attack_hand(mob/user as mob)
|
||||
if(anchored && can_use(user))
|
||||
user.visible_message(
|
||||
"<span class='danger'>[user] starts to collect \the [src].</span>",
|
||||
"<span class='notice'>You begin collecting \the [src]!</span>",
|
||||
"You hear the sound of rustling [material.name]."
|
||||
)
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
|
||||
if(do_after(user, health))
|
||||
user.visible_message(
|
||||
"<span class='danger'>[user] has collected \the [src].</span>",
|
||||
"<span class='notice'>You have collected \the [src]!</span>"
|
||||
)
|
||||
anchored = 0
|
||||
update_icon()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/barbedwire/attack_self(mob/user as mob)
|
||||
..()
|
||||
if(!anchored && can_use(user))
|
||||
user.visible_message(
|
||||
"<span class='danger'>[user] starts to deploy \the [src].</span>",
|
||||
"<span class='danger'>You begin deploying \the [src]!</span>",
|
||||
"You hear the rustling of [material.name]."
|
||||
)
|
||||
|
||||
if (do_after(user, 60))
|
||||
user.visible_message(
|
||||
"<span class='danger'>[user] has deployed \the [src].</span>",
|
||||
"<span class='danger'>You have deployed \the [src]!</span>",
|
||||
"You hear the rustling of [material.name]."
|
||||
)
|
||||
playsound(src, 'sound/items/Wirecutter.ogg',70, 1)
|
||||
spawn(2)
|
||||
playsound(src, 'sound/items/Wirecutter.ogg',40, 1)
|
||||
user.drop_from_inventory(src)
|
||||
forceMove(get_turf(src))
|
||||
anchored = 1
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/material/barbedwire/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!istype(W))
|
||||
return
|
||||
|
||||
if((W.flags & NOCONDUCT) || !shock(user, 70, pick(BP_L_HAND, BP_R_HAND)))
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
user.do_attack_animation(src)
|
||||
playsound(src, 'sound/effects/grillehit.ogg', 40, 1)
|
||||
|
||||
var/inc_damage = W.force
|
||||
|
||||
if(W.is_wirecutter())
|
||||
if(!shock(user, 100, pick(BP_L_HAND, BP_R_HAND)))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
inc_damage *= 3
|
||||
|
||||
if(W.damtype != BRUTE)
|
||||
inc_damage *= 0.3
|
||||
|
||||
health -= inc_damage
|
||||
|
||||
check_health()
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/barbedwire/update_icon()
|
||||
..()
|
||||
|
||||
if(anchored)
|
||||
icon_state = "[initial(icon_state)]-out"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]"
|
||||
|
||||
/obj/item/weapon/material/barbedwire/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(anchored && isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(L.m_intent == "run")
|
||||
L.visible_message(
|
||||
"<span class='danger'>[L] steps in \the [src].</span>",
|
||||
"<span class='danger'>You step in \the [src]!</span>",
|
||||
"<b>You hear a sharp rustling!</b>"
|
||||
)
|
||||
attack_mob(L)
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/barbedwire/proc/shock(mob/user as mob, prb, var/target_zone = BP_TORSO)
|
||||
if(!anchored || health == 0) // anchored/destroyed grilles are never connected
|
||||
return 0
|
||||
if(material.conductivity <= 0)
|
||||
return 0
|
||||
if(!prob(prb))
|
||||
return 0
|
||||
if(!in_range(src, user))//To prevent TK and mech users from getting shocked
|
||||
return 0
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(C)
|
||||
if(C.powernet)
|
||||
var/datum/powernet/PN = C.powernet
|
||||
|
||||
if(PN)
|
||||
PN.trigger_warning()
|
||||
|
||||
var/PN_damage = PN.get_electrocute_damage() * (material.conductivity / 50)
|
||||
|
||||
var/drained_energy = PN_damage * 10 / CELLRATE
|
||||
|
||||
PN.draw_power(drained_energy)
|
||||
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
var/obj/item/organ/external/affected = H.get_organ(check_zone(target_zone))
|
||||
|
||||
H.electrocute_act(PN_damage, src, H.get_siemens_coefficient_organ(affected))
|
||||
|
||||
else
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
L.electrocute_act(PN_damage, src, 0.8)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(user.stunned)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/material/barbedwire/proc/attack_mob(mob/living/L)
|
||||
var/target_zone
|
||||
if(L.lying)
|
||||
target_zone = ran_zone()
|
||||
else
|
||||
target_zone = pick("l_foot", "r_foot", "l_leg", "r_leg")
|
||||
|
||||
//armour
|
||||
var/blocked = L.run_armor_check(target_zone, "melee")
|
||||
var/soaked = L.get_armor_soak(target_zone, "melee")
|
||||
|
||||
if(blocked >= 100)
|
||||
return
|
||||
|
||||
if(soaked >= 30)
|
||||
return
|
||||
|
||||
if(L.buckled) //wheelchairs, office chairs, rollerbeds
|
||||
return
|
||||
|
||||
shock(L, 100, target_zone)
|
||||
|
||||
L.add_modifier(/datum/modifier/entangled, 3 SECONDS)
|
||||
|
||||
if(!L.apply_damage(force * (issilicon(L) ? 0.25 : 1), BRUTE, target_zone, blocked, soaked, src, sharp, edge))
|
||||
return
|
||||
|
||||
playsound(src, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
|
||||
if(H.species.siemens_coefficient<0.5) //Thick skin.
|
||||
return
|
||||
|
||||
if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) )
|
||||
return
|
||||
|
||||
if(H.species.flags & NO_MINOR_CUT)
|
||||
return
|
||||
|
||||
to_chat(H, "<span class='danger'>You step directly on \the [src]!</span>")
|
||||
|
||||
var/list/check = list("l_foot", "r_foot")
|
||||
while(check.len)
|
||||
var/picked = pick(check)
|
||||
var/obj/item/organ/external/affecting = H.get_organ(picked)
|
||||
if(affecting)
|
||||
if(affecting.robotic >= ORGAN_ROBOT)
|
||||
return
|
||||
if(affecting.take_damage(force, 0))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
if(affecting.organ_can_feel_pain())
|
||||
H.Weaken(3)
|
||||
return
|
||||
check -= picked
|
||||
|
||||
if(material.is_brittle() && prob(material.hardness))
|
||||
health = 0
|
||||
else if(!prob(material.hardness))
|
||||
health--
|
||||
check_health()
|
||||
|
||||
return
|
||||
|
||||
/obj/item/weapon/material/barbedwire/plastic
|
||||
name = "snare wire"
|
||||
default_material = MAT_PLASTIC
|
||||
|
||||
@@ -92,6 +92,8 @@
|
||||
return pick(prob(30);/obj/effect/mine,
|
||||
prob(25);/obj/effect/mine/frag,
|
||||
prob(25);/obj/effect/mine/emp,
|
||||
prob(15);/obj/effect/mine/camo,
|
||||
prob(15);/obj/effect/mine/emp/camo,
|
||||
prob(10);/obj/effect/mine/stun,
|
||||
prob(10);/obj/effect/mine/incendiary,)
|
||||
|
||||
|
||||
@@ -674,6 +674,9 @@
|
||||
/obj/item/toy/plushie/foxbear,
|
||||
/obj/item/toy/plushie/nukeplushie,
|
||||
/obj/item/toy/plushie/otter,
|
||||
/obj/item/toy/plushie/vox,
|
||||
/obj/item/toy/plushie/borgplushie/drakiesec,
|
||||
/obj/item/toy/plushie/borgplushie/drakiemed,
|
||||
//VOREStation Add End
|
||||
//YawnWider Add Start
|
||||
/obj/item/toy/plushie/teshari/_yw,
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
//Barricades!
|
||||
/obj/structure/barricade
|
||||
name = "barricade"
|
||||
desc = "This space is blocked off by a barricade."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "barricade"
|
||||
anchored = 1.0
|
||||
density = 1.0
|
||||
var/health = 100
|
||||
var/maxhealth = 100
|
||||
var/datum/material/material
|
||||
|
||||
/obj/structure/barricade/New(var/newloc, var/material_name)
|
||||
..(newloc)
|
||||
if(!material_name)
|
||||
material_name = "wood"
|
||||
material = get_material_by_name("[material_name]")
|
||||
if(!material)
|
||||
qdel(src)
|
||||
return
|
||||
name = "[material.display_name] barricade"
|
||||
desc = "This space is blocked off by a barricade made of [material.display_name]."
|
||||
color = material.icon_colour
|
||||
maxhealth = material.integrity
|
||||
health = maxhealth
|
||||
|
||||
/obj/structure/barricade/get_material()
|
||||
return material
|
||||
|
||||
/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
if(istype(W, /obj/item/stack))
|
||||
var/obj/item/stack/D = W
|
||||
if(D.get_material_name() != material.name)
|
||||
return //hitting things with the wrong type of stack usually doesn't produce messages, and probably doesn't need to.
|
||||
if(health < maxhealth)
|
||||
if(D.get_amount() < 1)
|
||||
to_chat(user, "<span class='warning'>You need one sheet of [material.display_name] to repair \the [src].</span>")
|
||||
return
|
||||
visible_message("<span class='notice'>[user] begins to repair \the [src].</span>")
|
||||
if(do_after(user,20) && health < maxhealth)
|
||||
if(D.use(1))
|
||||
health = maxhealth
|
||||
visible_message("<span class='notice'>[user] repairs \the [src].</span>")
|
||||
return
|
||||
return
|
||||
else
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
health -= W.force * 1
|
||||
if("brute")
|
||||
health -= W.force * 0.75
|
||||
if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
CheckHealth()
|
||||
..()
|
||||
|
||||
/obj/structure/barricade/proc/CheckHealth()
|
||||
if(health <= 0)
|
||||
dismantle()
|
||||
|
||||
health = min(health, maxhealth)
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/barricade/take_damage(var/damage)
|
||||
health -= damage
|
||||
CheckHealth()
|
||||
return
|
||||
|
||||
/obj/structure/barricade/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_CLOTH) || get_material_by_name(MAT_SYNCLOTH)))
|
||||
playsound(src, 'sound/items/drop/clothing.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
CheckHealth()
|
||||
return
|
||||
|
||||
/obj/structure/barricade/proc/dismantle()
|
||||
material.place_dismantled_product(get_turf(src))
|
||||
visible_message("<span class='danger'>\The [src] falls apart!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/structure/barricade/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
dismantle()
|
||||
if(2.0)
|
||||
health -= 25
|
||||
CheckHealth()
|
||||
|
||||
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/barricade/sandbag
|
||||
name = "sandbags"
|
||||
desc = "Bags. Bags of sand. It's rough and coarse and somehow stays in the bag."
|
||||
icon = 'icons/obj/sandbags.dmi'
|
||||
icon_state = "blank"
|
||||
|
||||
/obj/structure/barricade/sandbag/New(var/newloc, var/material_name)
|
||||
if(!material_name)
|
||||
material_name = "cloth"
|
||||
..(newloc, material_name)
|
||||
material = get_material_by_name("[material_name]")
|
||||
if(!material)
|
||||
qdel(src)
|
||||
return
|
||||
name = "[material.display_name] [initial(name)]"
|
||||
desc = "This space is blocked off by a barricade made of [material.display_name]."
|
||||
color = null
|
||||
maxhealth = material.integrity * 2 // These things are, commonly, used to stop bullets where possible.
|
||||
health = maxhealth
|
||||
update_connections(1)
|
||||
|
||||
/obj/structure/barricade/sandbag/Destroy()
|
||||
update_connections(1, src)
|
||||
..()
|
||||
|
||||
/obj/structure/barricade/sandbag/dismantle()
|
||||
update_connections(1, src)
|
||||
material.place_dismantled_product(get_turf(src))
|
||||
visible_message("<span class='danger'>\The [src] falls apart!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/structure/barricade/sandbag/update_icon()
|
||||
if(!material)
|
||||
return
|
||||
|
||||
cut_overlays()
|
||||
var/image/I
|
||||
|
||||
for(var/i = 1 to 4)
|
||||
I = image('icons/obj/sandbags.dmi', "sandbags[connections[i]]", dir = 1<<(i-1))
|
||||
I.color = material.icon_colour
|
||||
add_overlay(I)
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/barricade/sandbag/update_connections(propagate = 0, var/obj/structure/barricade/sandbag/ignore = null)
|
||||
if(!material)
|
||||
return
|
||||
var/list/dirs = list()
|
||||
for(var/obj/structure/barricade/sandbag/S in orange(src, 1))
|
||||
if(!S.material)
|
||||
continue
|
||||
if(S == ignore)
|
||||
continue
|
||||
if(propagate >= 1)
|
||||
S.update_connections(propagate - 1, ignore)
|
||||
if(can_join_with(S))
|
||||
dirs += get_dir(src, S)
|
||||
|
||||
connections = dirs_to_corner_states(dirs)
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/barricade/sandbag/proc/can_join_with(var/obj/structure/barricade/sandbag/S)
|
||||
if(material == S.material)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/structure/barricade/sandbag/CanPass(atom/movable/mover, turf/target)
|
||||
. = ..()
|
||||
|
||||
if(.)
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
|
||||
if(P.firer && get_dist(P.firer, src) > 1) // If you're firing from adjacent turfs, you are unobstructed.
|
||||
if(P.armor_penetration < (material.protectiveness + material.hardness) || prob(33))
|
||||
return FALSE
|
||||
@@ -36,11 +36,11 @@
|
||||
icon_opened = "egg_unathi_open"
|
||||
|
||||
/obj/structure/closet/secure_closet/egg/nevrean
|
||||
name = "nevarean egg"
|
||||
desc = "Most Nevareans lay hard-shelled eggs!"
|
||||
icon_state = "egg_nevarean"
|
||||
icon_closed = "egg_nevarean"
|
||||
icon_opened = "egg_nevarean_open"
|
||||
name = "nevrean egg"
|
||||
desc = "Most Nevreans lay hard-shelled eggs!"
|
||||
icon_state = "egg_nevrean"
|
||||
icon_closed = "egg_nevrean"
|
||||
icon_opened = "egg_nevrean_open"
|
||||
|
||||
/obj/structure/closet/secure_closet/egg/human
|
||||
name = "human egg"
|
||||
|
||||
@@ -152,7 +152,9 @@
|
||||
/obj/item/clothing/mask/gas/half,
|
||||
/obj/item/weapon/gun/projectile/revolvershotgun,
|
||||
/obj/item/ammo_magazine/m12gdrumjack/beanbag,
|
||||
/obj/item/ammo_magazine/m12gdrumjack/beanbag)
|
||||
/obj/item/ammo_magazine/m12gdrumjack/beanbag,
|
||||
/obj/item/device/retail_scanner/security //CHOMPStation addition
|
||||
)
|
||||
|
||||
/obj/structure/closet/secure_closet/warden/Initialize()
|
||||
if(prob(50))
|
||||
@@ -191,7 +193,11 @@
|
||||
/obj/item/weapon/cell/device/weapon,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/security,
|
||||
/obj/item/clothing/shoes/boots/winter/security,
|
||||
/obj/item/device/flashlight/maglight)
|
||||
/obj/item/device/flashlight/maglight,
|
||||
/obj/item/device/holowarrant, //CHOMPStation addition
|
||||
/obj/item/device/retail_scanner/security, //CHOMPStation addition
|
||||
/obj/item/clothing/glasses/hud/security //CHOMPStation addition
|
||||
)
|
||||
|
||||
/obj/structure/closet/secure_closet/security/Initialize()
|
||||
if(prob(50))
|
||||
@@ -232,8 +238,8 @@
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/accessory/badge/holo/detective,
|
||||
/obj/item/clothing/gloves/black,
|
||||
///obj/item/gunbox, //VOREStation Removal,
|
||||
/obj/item/clothing/gloves/forensic, //CHOMP Edit replaces black gloves
|
||||
/obj/item/gunbox, //CHOMP Edit undoes vorestation removal and adds back gunbox
|
||||
/obj/item/weapon/storage/belt/detective,
|
||||
/obj/item/weapon/storage/box/evidence,
|
||||
/obj/item/device/radio/headset/headset_sec,
|
||||
@@ -246,7 +252,10 @@
|
||||
/obj/item/weapon/storage/briefcase/crimekit,
|
||||
/obj/item/device/taperecorder,
|
||||
/obj/item/weapon/storage/bag/detective,
|
||||
/obj/item/device/tape/random = 3)
|
||||
/obj/item/device/tape/random = 3,
|
||||
/obj/item/device/retail_scanner/security, //CHOMPStation addition
|
||||
/obj/item/clothing/glasses/hud/security //CHOMPStation addition
|
||||
)
|
||||
|
||||
/obj/structure/closet/secure_closet/injection
|
||||
name = "lethal injections locker"
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
/obj/structure/ghost_pod/ghost_activated/maintpred
|
||||
name = "maintenance hole"
|
||||
desc = "Looks like some creature dug its way into station's maintenance..."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "tunnel_hole"
|
||||
icon_state_opened = "tunnel_hole"
|
||||
density = FALSE
|
||||
ghost_query_type = /datum/ghost_query/maints_pred
|
||||
anchored = TRUE
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
spawn_active = TRUE
|
||||
var/announce_prob = 35
|
||||
var/list/possible_mobs = list("Space Bumblebee" = /mob/living/simple_mob/vore/bee,
|
||||
"Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino,
|
||||
"Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog,
|
||||
"Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat,
|
||||
"Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub,
|
||||
"Red Panda" = /mob/living/simple_mob/vore/redpanda,
|
||||
"Fennec" = /mob/living/simple_mob/vore/fennec,
|
||||
"Fennix" = /mob/living/simple_mob/vore/fennix,
|
||||
"Jelly Blob" = /mob/living/simple_mob/animal/space/jelly,
|
||||
"Wolf" = /mob/living/simple_mob/animal/wolf,
|
||||
"Sect Queen" = /mob/living/simple_mob/vore/sect_queen,
|
||||
"Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged,
|
||||
)
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M)
|
||||
..()
|
||||
var/choice
|
||||
var/randomize
|
||||
var/finalized = "No"
|
||||
|
||||
while(finalized == "No" && M.client)
|
||||
choice = input(M,"What type of predator do you want to play as?") as null|anything in possible_mobs
|
||||
if(!choice)
|
||||
randomize = TRUE
|
||||
break
|
||||
|
||||
if(choice)
|
||||
finalized = alert(M, "Are you sure you want to play as [choice]?","Confirmation","No","Yes")
|
||||
|
||||
if(randomize)
|
||||
choice = pick(possible_mobs)
|
||||
|
||||
var/mobtype = possible_mobs[choice]
|
||||
var/mob/living/simple_mob/newPred = new mobtype(get_turf(src))
|
||||
qdel(newPred.ai_holder)
|
||||
newPred.ai_holder = null
|
||||
//newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(newPred)
|
||||
to_chat(M, "<span class='notice'>You are <b>[newPred]</b>, somehow having gotten aboard the station in search of food. \
|
||||
You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \
|
||||
if you are cute enough, try to make friends with this place's inhabitants.</span>")
|
||||
newPred.ckey = M.ckey
|
||||
newPred.visible_message("<span class='warning'>[newPred] emerges from somewhere!</span>")
|
||||
|
||||
if(prob(announce_prob))
|
||||
spawn(2 MINUTES)
|
||||
command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert")
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/maintpred/no_announce
|
||||
announce_prob = 0
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/morphspawn
|
||||
name = "weird goo"
|
||||
desc = "A pile of weird gunk... Wait, is it actually moving?"
|
||||
icon = 'icons/mob/animal_vr.dmi'
|
||||
icon_state = "morph"
|
||||
icon_state_opened = "morph_dead"
|
||||
density = FALSE
|
||||
ghost_query_type = /datum/ghost_query/morph
|
||||
anchored = TRUE
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
spawn_active = TRUE
|
||||
var/announce_prob = 50
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/morphspawn/create_occupant(var/mob/M)
|
||||
..()
|
||||
var/mob/living/simple_mob/vore/hostile/morph/newMorph = new /mob/living/simple_mob/vore/hostile/morph(get_turf(src))
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(newMorph)
|
||||
to_chat(M, "<span class='notice'>You are a <b>Morph</b>, somehow having gotten aboard the station in your wandering. \
|
||||
You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \
|
||||
using your amorphous form to traverse vents to find and consume weak prey.</span>")
|
||||
to_chat(M, "<span class='notice'>You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \
|
||||
You can undisguise yourself by shift + clicking yourself, but disguise being switched, or turned on and off has a short cooldown. You can also ventcrawl, \
|
||||
by using alt + click on the vent or scrubber.</span>")
|
||||
newMorph.ckey = M.ckey
|
||||
newMorph.visible_message("<span class='warning'>A morph appears to crawl out of somewhere.</span>")
|
||||
|
||||
if(prob(announce_prob))
|
||||
spawn(2 MINUTES)
|
||||
command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert")
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/morphspawn/no_announce
|
||||
announce_prob = 0
|
||||
@@ -36,6 +36,10 @@
|
||||
// Override this to create whatever mob you need. Be sure to call ..() if you don't want it to make infinite mobs.
|
||||
/obj/structure/ghost_pod/proc/create_occupant(var/mob/M)
|
||||
used = TRUE
|
||||
//VOREStation Addition Start
|
||||
if(src in active_ghost_pods)
|
||||
active_ghost_pods -= src
|
||||
//VOREStation Addition End
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -52,6 +56,7 @@
|
||||
// VOREStation Addition Start
|
||||
if(!used)
|
||||
activated = TRUE
|
||||
ghostpod_startup(FALSE)
|
||||
// VOREStation Addition End
|
||||
|
||||
/obj/structure/ghost_pod/manual/attack_ai(var/mob/living/silicon/user)
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
/obj/structure/ghost_pod/Destroy()
|
||||
if(src in active_ghost_pods)
|
||||
active_ghost_pods -= src
|
||||
..()
|
||||
|
||||
/obj/structure/ghost_pod
|
||||
var/spawn_active = FALSE
|
||||
|
||||
/obj/structure/ghost_pod/manual
|
||||
var/remains_active = FALSE
|
||||
var/activated = FALSE
|
||||
@@ -28,4 +36,14 @@
|
||||
|
||||
busy = FALSE
|
||||
|
||||
create_occupant(user)
|
||||
create_occupant(user)
|
||||
|
||||
/obj/structure/ghost_pod/proc/ghostpod_startup(var/notify = FALSE)
|
||||
if(!(src in active_ghost_pods))
|
||||
active_ghost_pods += src
|
||||
if(notify)
|
||||
trigger()
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/Initialize()
|
||||
..()
|
||||
ghostpod_startup(spawn_active)
|
||||
@@ -221,7 +221,8 @@
|
||||
prob(1);/obj/item/weapon/spacecash/c50,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie,
|
||||
prob(1);/obj/item/weapon/storage/box/cups,
|
||||
prob(1);/obj/item/pizzavoucher)
|
||||
prob(1);/obj/item/pizzavoucher,
|
||||
prob(1);/obj/item/weapon/grenade/spawnergrenade/clustaur)// CHOMPStation edit
|
||||
|
||||
var/obj/item/I = new path()
|
||||
return I
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
//Snowflake customizable trashpules, these can be map eddited to be unique TM or you can just make new sub objects that change the vars -shark
|
||||
//They are called sharkpiles because i cant think of another name, but do feel free to make them actually spawn sharks.
|
||||
/obj/structure/trash_pile/sharkpile
|
||||
var/destroychance = 0 //People too used to static pilespawns? Add randomness to it.
|
||||
|
||||
//Lists use better weights that add together so in the below example the sum of weight sis 6 so a 3 is 50% and a 1 is 16%
|
||||
var/overridechancealpha = 90 //how likely the piles is to give its unique objects for alpha spawns
|
||||
var/list/alphapicks = list(
|
||||
/obj/item/weapon/storage/pill_bottle/happy = 1,
|
||||
/obj/item/weapon/storage/pill_bottle/zoom = 2,
|
||||
/obj/item/weapon/storage/pill_bottle/paracetamol = 3,
|
||||
) //override pick list alpha
|
||||
|
||||
var/overridechancebeta = 90 //how likely the piles is to give its unique objects for beta spawns
|
||||
var/list/betapicks = list(
|
||||
/obj/item/weapon/storage/pill_bottle/happy = 3,
|
||||
/obj/item/weapon/storage/pill_bottle/zoom = 2,
|
||||
/obj/item/weapon/storage/pill_bottle/paracetamol = 1,
|
||||
) //override pick list beta
|
||||
|
||||
var/overridechancegamma = 90 //how likely the piles is to give its unique objects for gamma spawns
|
||||
var/list/gammapicks = list(
|
||||
/obj/item/weapon/storage/pill_bottle/happy = 3,
|
||||
/obj/item/weapon/storage/pill_bottle/zoom = 2,
|
||||
/obj/item/weapon/storage/pill_bottle/paracetamol = 1,
|
||||
) //override pick list gamma
|
||||
|
||||
var/gammaunique = 1
|
||||
|
||||
|
||||
Initialize()
|
||||
..()
|
||||
if(prob(destroychance))
|
||||
qdel(src)
|
||||
|
||||
//^X% chance to use our own list, otherwise default pool.
|
||||
//Here we could also add a % chance to spawn a mob for trash pandas or such,
|
||||
produce_alpha_item()
|
||||
if(prob(overridechancealpha))
|
||||
var/path = pick(alphapicks)
|
||||
var/obj/item/I = new path()
|
||||
return I
|
||||
return ..()
|
||||
|
||||
produce_beta_item()
|
||||
if(prob(overridechancebeta))
|
||||
var/path = pick(betapicks)
|
||||
var/obj/item/I = new path()
|
||||
return I
|
||||
return ..()
|
||||
|
||||
produce_gamma_item()
|
||||
if(prob(overridechancegamma)&& gammaunique!=2)
|
||||
var/path = pick(gammapicks)
|
||||
var/obj/item/I = new path()
|
||||
if(gammaunique!=0)
|
||||
gammaunique++
|
||||
return I
|
||||
return ..()
|
||||
Reference in New Issue
Block a user