mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-31 01:00:59 +01:00
Merge branch 'master' into upstream-merge-10704
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
/obj/effect/graffitispawner
|
||||
name = "old scrawling"
|
||||
icon = 'icons/effects/map_effects.dmi'
|
||||
icon_state = "graffiti"
|
||||
|
||||
var/graffiti_type // The text string for the desired icon state of your graffiti.
|
||||
|
||||
// If the effect's color is not set, it will be chosen at random.
|
||||
var/color_secondary // The hexcode for the desired secondary color of your graffiti. If blank, it will inherit this effect's color.
|
||||
|
||||
/obj/effect/graffitispawner/Initialize()
|
||||
..()
|
||||
|
||||
if(!color)
|
||||
color = rgb(rand(1,255),rand(1,255),rand(1,255))
|
||||
|
||||
if(!color_secondary)
|
||||
color_secondary = color
|
||||
|
||||
if(!graffiti_type)
|
||||
graffiti_type = pick("rune", "graffiti", "left", "right", "up", "down")
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/effect/decal/cleanable/crayon/C = new(T, color, color_secondary, graffiti_type)
|
||||
|
||||
C.name = name
|
||||
|
||||
qdel(src)
|
||||
@@ -0,0 +1,187 @@
|
||||
/mob/living/simple_mob //makes it so that any simplemob can potentially be revived by players and joined by ghosts
|
||||
var/ghostjoin = 0
|
||||
var/ic_revivable = 0
|
||||
var/revivedby = "no one"
|
||||
|
||||
//The stuff we want to be revivable normally
|
||||
/mob/living/simple_mob/animal
|
||||
ic_revivable = 1
|
||||
/mob/living/simple_mob/otie
|
||||
ic_revivable = 1
|
||||
/mob/living/simple_mob/vore
|
||||
ic_revivable = 1
|
||||
//The stuff that would be revivable but that we don't want to be revivable
|
||||
/mob/living/simple_mob/animal/giant_spider/nurse //no you can't revive the ones who can lay eggs and get webs everywhere
|
||||
ic_revivable = 0
|
||||
/mob/living/simple_mob/animal/giant_spider/carrier //or the ones who fart babies when they die
|
||||
ic_revivable = 0
|
||||
|
||||
//WHEN GHOSTS ATTACK!!!!!
|
||||
/mob/living/simple_mob/attack_ghost(mob/observer/dead/user as mob)
|
||||
if(!ghostjoin)
|
||||
return ..()
|
||||
|
||||
var/reply = alert("Would you like to become [src]? It is bound to [revivedby].",,"Yes","No")
|
||||
if(reply == "No")
|
||||
return
|
||||
|
||||
if(ckey) //FIRST ONE TO CLICK YES GETS IT!!!!!! Channel your inner youtube commenter.
|
||||
to_chat(src, "<span class='notice'>Sorry, someone else has already inhabited [src].</span>")
|
||||
return
|
||||
|
||||
log_and_message_admins("[key_name_admin(user)] joined [src] as a ghost [ADMIN_FLW(src)]")
|
||||
active_ghost_pods -= src
|
||||
if(user.mind)
|
||||
user.mind.active = TRUE
|
||||
user.mind.transfer_to(src)
|
||||
else
|
||||
src.ckey = user.ckey
|
||||
qdel(user)
|
||||
ghostjoin = 0
|
||||
ghostjoin_icon()
|
||||
if(revivedby != "no one")
|
||||
to_chat(src, "<span class='notice'>Where once your life had been rough and scary, you have been assisted by [revivedby]. They seem to be the reason you are on your feet again... so perhaps you should help them out.</span> <span class= warning> Being as you were revived, you are allied with the station. Do not attack anyone unless they are threatening the one who revived you. And try to listen to the one who revived you within reason. Of course, you may do scenes as you like, but you must still respect preferences.</span>")
|
||||
visible_message("[src]'s eyes flicker with a curious intelligence.")
|
||||
|
||||
|
||||
/obj/item/device/denecrotizer //Away map reward. FOR TRAINED NECROMANCERS ONLY. >:C
|
||||
name = "experimental denecrotizer"
|
||||
desc = "It looks simple on the outside but this device radiates some unknown dread. It does not appear to be of any ordinary make, and just how it works is unclear, but this device seems to interact with dead flesh."
|
||||
icon = 'icons/obj/device_vr.dmi'
|
||||
icon_state = "denecrotizer"
|
||||
w_class = ITEMSIZE_COST_NORMAL
|
||||
var/charges = 5 //your army of minions can only be this big
|
||||
var/last_used
|
||||
var/cooldown = 10 MINUTES //LONG
|
||||
var/revive_time = 30 SECONDS //Don't do this in combat
|
||||
var/advanced = 1 //allows for ghosts to join mobs who get revived by this, and updates their faction to yours
|
||||
|
||||
/obj/item/device/denecrotizer/examine(var/mob/user)
|
||||
. = ..()
|
||||
var/cooldowntime = round((cooldown - (world.time - last_used)) * 0.1)
|
||||
if(Adjacent(user))
|
||||
if(cooldowntime <= 0)
|
||||
. += "<span class='notice'>The screen indicates that this device is ready to be used, and that it has enough energy for [charges] uses.</span>"
|
||||
else
|
||||
. += "<span class='notice'>The screen indicates that this device can be used again in [cooldowntime] seconds, and that it has enough energy for [charges] uses.</span>"
|
||||
|
||||
/obj/item/device/denecrotizer/proc/check_target(mob/living/simple_mob/target, mob/living/user)
|
||||
if(!target.Adjacent(user))
|
||||
return FALSE
|
||||
if(user.a_intent != I_HELP) //be gentle
|
||||
user.visible_message("[user] bonks [target] with [src].", runemessage = "bonks [target]")
|
||||
return FALSE
|
||||
if(!istype(target))
|
||||
to_chat(user, "<span class='notice'>[target] seems to be too complicated for [src] to interface with.</span>")
|
||||
return FALSE
|
||||
if(!(world.time - last_used > cooldown))
|
||||
to_chat(user, "<span class='notice'>[src] doesn't seem to be ready yet.</span>")
|
||||
return FALSE
|
||||
if(!charges)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't seem to be active anymore.</span>")
|
||||
return FALSE
|
||||
if(!target.ic_revivable)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't seem to interface with [target].</span>")
|
||||
return FALSE
|
||||
if(target.stat != DEAD)
|
||||
if(!advanced)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't seem to work on that.</span>")
|
||||
return FALSE
|
||||
if(target.ai_holder.retaliate || target.ai_holder.hostile) // You can be friends with still living mobs if they are passive I GUESS
|
||||
to_chat(user, "<span class='notice'>[src] doesn't seem to work on that.</span>")
|
||||
return FALSE
|
||||
if(!target.mind)
|
||||
user.visible_message("[user] gently presses [src] to [target]...", runemessage = "presses [src] to [target]")
|
||||
if(do_after(user, revive_time, exclusive = 1, target = target))
|
||||
target.faction = user.faction
|
||||
target.revivedby = user.name
|
||||
target.ghostjoin = 1
|
||||
active_ghost_pods += target
|
||||
target.ghostjoin_icon()
|
||||
last_used = world.time
|
||||
charges--
|
||||
log_and_message_admins("[key_name_admin(user)] used a denecrotizer to tame/offer a simplemob to ghosts: [target]. [ADMIN_FLW(src)]")
|
||||
target.visible_message("[target]'s eyes widen, as though in revelation as it looks at [user].", runemessage = "eyes widen")
|
||||
if(charges == 0)
|
||||
icon_state = "[initial(icon_state)]-o"
|
||||
update_icon()
|
||||
return FALSE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] doesn't seem to work on that.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/denecrotizer/proc/ghostjoin_rez(mob/living/simple_mob/target, mob/living/user)
|
||||
user.visible_message("[user] gently presses [src] to [target]...", runemessage = "presses [src] to [target]")
|
||||
if(do_after(user, revive_time, exclusive = 1, target = target))
|
||||
target.faction = user.faction
|
||||
target.revivedby = user.name
|
||||
target.ai_holder.returns_home = FALSE
|
||||
target.revive()
|
||||
target.sight = initial(target.sight)
|
||||
target.see_in_dark = initial(target.see_in_dark)
|
||||
target.see_invisible = initial(target.see_invisible)
|
||||
target.update_icon()
|
||||
visible_message("[target] lifts its head and looks at [user].", runemessage = "lifts its head and looks at [user]")
|
||||
log_and_message_admins("[key_name_admin(user)] used a denecrotizer to revive a simple mob: [target]. [ADMIN_FLW(src)]")
|
||||
if(!target.mind) //if it doesn't have a mind then no one has been playing as it, and it is safe to offer to ghosts.
|
||||
target.ghostjoin = 1
|
||||
active_ghost_pods += target
|
||||
target.ghostjoin_icon()
|
||||
last_used = world.time
|
||||
charges--
|
||||
if(charges == 0)
|
||||
icon_state = "[initial(icon_state)]-o"
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/device/denecrotizer/proc/basic_rez(mob/living/simple_mob/target, mob/living/user) //so medical can have a way to bring back people's pets or whatever, does not change any settings about the mob or offer it to ghosts.
|
||||
user.visible_message("[user] presses [src] to [target]...", runemessage = "presses [src] to [target]")
|
||||
if(do_after(user, revive_time, exclusive = 1, target = target))
|
||||
target.revive()
|
||||
target.sight = initial(target.sight)
|
||||
target.see_in_dark = initial(target.see_in_dark)
|
||||
target.see_invisible = initial(target.see_invisible)
|
||||
target.update_icon()
|
||||
visible_message("[target] lifts its head and looks at [user].", runemessage = "lifts its head and looks at [user]")
|
||||
last_used = world.time
|
||||
charges--
|
||||
if(charges == 0)
|
||||
icon_state = "[initial(icon_state)]-o"
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
user.visible_message("[user] bonks [target] with [src]. Nothing happened.")
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/device/denecrotizer/attack(mob/living/simple_mob/target, mob/living/user)
|
||||
if(check_target(target, user))
|
||||
if(advanced)
|
||||
ghostjoin_rez(target, user)
|
||||
else
|
||||
basic_rez(target, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/proc/ghostjoin_icon() //puts an icon on mobs for ghosts, so they can see if a mob has been revived and is joinable
|
||||
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(ghostjoin)
|
||||
add_overlay(I)
|
||||
else
|
||||
cut_overlay(I)
|
||||
|
||||
/obj/item/device/denecrotizer/medical //Can revive more things, but without the special ghost and faction stuff. For medical use.
|
||||
name = "commercial denecrotizer"
|
||||
desc = "A curious device who's purpose is reviving simpler life forms. It seems to radiate menace."
|
||||
icon_state = "m-denecrotizer"
|
||||
advanced = 0 //This one isn't as fancy
|
||||
cooldown = 5 MINUTES //not as long
|
||||
charges = 20 //in case spiders merc Ian
|
||||
@@ -11,12 +11,11 @@
|
||||
thrown_force_divisor = 1
|
||||
origin_tech = list(TECH_MATERIAL = 1)
|
||||
attack_verb = list("attacked", "stabbed", "poked")
|
||||
sharp = 1
|
||||
edge = 1
|
||||
sharp = TRUE
|
||||
edge = TRUE
|
||||
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
|
||||
thrown_force_divisor = 0.25 // 5 when thrown with weight 20 (steel)
|
||||
var/loaded //Descriptive string for currently loaded food object.
|
||||
var/scoop_food = 1
|
||||
var/weakref/loaded //Weakref for currently loaded food object.
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/New()
|
||||
..()
|
||||
@@ -25,6 +24,15 @@
|
||||
create_reagents(5)
|
||||
return
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/update_icon()
|
||||
. = ..()
|
||||
cut_overlays()
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/eaten = loaded?.resolve()
|
||||
if(eaten)
|
||||
var/image/I = new(icon, "loadedfood")
|
||||
I.color = eaten.filling_color
|
||||
add_overlay(I)
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
@@ -37,30 +45,32 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
if (reagents.total_volume > 0)
|
||||
if (loaded && reagents.total_volume > 0)
|
||||
var/atom/movable/eaten = loaded?.resolve()
|
||||
reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
|
||||
if(M == user)
|
||||
if(!M.can_eat(loaded))
|
||||
return
|
||||
M.visible_message("<span class='notice'>\The [user] eats some [loaded] from \the [src].</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>\The [user] begins to feed \the [M]!</span>")
|
||||
if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS)))
|
||||
return
|
||||
M.visible_message("<span class='notice'>\The [user] feeds some [loaded] to \the [M] with \the [src].</span>")
|
||||
playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1)
|
||||
cut_overlays()
|
||||
if(eaten)
|
||||
if(M == user)
|
||||
if(!M.can_eat(eaten))
|
||||
return
|
||||
M.visible_message(SPAN_NOTICE("\The [user] eats some of \the [eaten] with \the [src]."))
|
||||
else
|
||||
user.visible_message(SPAN_WARNING("\The [user] begins to feed \the [M]!"))
|
||||
if(!(M.can_force_feed(user, eaten) && do_mob(user, M, 5 SECONDS)))
|
||||
return
|
||||
M.visible_message(SPAN_NOTICE("\The [user] feeds some of \the [eaten] to \the [M] with \the [src]."))
|
||||
playsound(src,'sound/items/eatfood.ogg', rand(10,40), 1)
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You don't have anything on \the [src].</span>") //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK
|
||||
to_chat(user, SPAN_WARNING("You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK
|
||||
return
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/fork
|
||||
name = "fork"
|
||||
desc = "It's a fork. Sure is pointy."
|
||||
icon_state = "fork"
|
||||
sharp = 1
|
||||
edge = 0
|
||||
sharp = TRUE
|
||||
edge = FALSE
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/fork/plastic
|
||||
default_material = "plastic"
|
||||
@@ -70,8 +80,8 @@
|
||||
desc = "It's a spoon. You can see your own upside-down face in it."
|
||||
icon_state = "spoon"
|
||||
attack_verb = list("attacked", "poked")
|
||||
edge = 0
|
||||
sharp = 0
|
||||
edge = FALSE
|
||||
sharp = FALSE
|
||||
force_divisor = 0.1 //2 when wielded with weight 20 (steel)
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
|
||||
@@ -115,6 +115,38 @@
|
||||
icon_override = 'icons/mob/back_vr.dmi'
|
||||
icon_state = "explorer_duffle"
|
||||
|
||||
///Talon Bags///
|
||||
|
||||
/obj/item/weapon/storage/backpack/talon
|
||||
name = "ITV backpack"
|
||||
desc = "A backpack for carrying a large number of supplies easily."
|
||||
icon = 'icons/obj/clothing/backpack_vr.dmi'
|
||||
icon_override = 'icons/mob/back_vr.dmi'
|
||||
icon_state = "talon"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/talon
|
||||
name = "ITV satchel"
|
||||
desc = "A satchel for carrying a large number of supplies easily."
|
||||
icon = 'icons/obj/clothing/backpack_vr.dmi'
|
||||
icon_override = 'icons/mob/back_vr.dmi'
|
||||
icon_state = "talon_satchel"
|
||||
item_state_slots = null
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/talon
|
||||
name = "ITV messenger bag"
|
||||
desc = "A sturdy backpack worn over one shoulder."
|
||||
icon = 'icons/obj/clothing/backpack_vr.dmi'
|
||||
icon_override = 'icons/mob/back_vr.dmi'
|
||||
icon_state = "talon_courier"
|
||||
item_state_slots = null
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/talon
|
||||
name = "ITV dufflebag"
|
||||
desc = "A large dufflebag for holding extra supplies."
|
||||
icon = 'icons/obj/clothing/backpack_vr.dmi'
|
||||
icon_override = 'icons/mob/back_vr.dmi'
|
||||
icon_state = "talon_duffle"
|
||||
|
||||
///Roboticist Bags///
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/roboticist
|
||||
|
||||
@@ -17,14 +17,8 @@
|
||||
use_sound = 'sound/items/drop/flesh.ogg'
|
||||
|
||||
/obj/item/weapon/storage/vore_egg/open(mob/user as mob)
|
||||
<<<<<<< HEAD
|
||||
||||||| parent of 7f8d5449b9... Merge pull request #10704 from Novacat/nova-basicfixes
|
||||
if(isobserver(usr))
|
||||
return
|
||||
=======
|
||||
if(isobserver(user))
|
||||
return
|
||||
>>>>>>> 7f8d5449b9... Merge pull request #10704 from Novacat/nova-basicfixes
|
||||
icon = open_egg_icon
|
||||
..()
|
||||
|
||||
|
||||
@@ -137,7 +137,8 @@
|
||||
/obj/item/stack/medical/advanced/bruise_pack,
|
||||
/obj/item/stack/nanopaste,
|
||||
/obj/item/device/healthanalyzer/advanced,
|
||||
/obj/item/weapon/autopsy_scanner
|
||||
/obj/item/weapon/autopsy_scanner,
|
||||
/obj/item/weapon/surgical/bioregen
|
||||
)
|
||||
|
||||
starts_with = list(
|
||||
@@ -152,7 +153,8 @@
|
||||
/obj/item/weapon/surgical/FixOVein,
|
||||
/obj/item/stack/medical/advanced/bruise_pack,
|
||||
/obj/item/device/healthanalyzer/advanced,
|
||||
/obj/item/weapon/autopsy_scanner
|
||||
/obj/item/weapon/autopsy_scanner,
|
||||
/obj/item/weapon/surgical/bioregen
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* Surgical Drill
|
||||
* Scalpel
|
||||
* Circular Saw
|
||||
* Bio-Regenerator
|
||||
*/
|
||||
|
||||
/obj/item/weapon/surgical
|
||||
@@ -22,6 +23,16 @@
|
||||
return 0
|
||||
..()
|
||||
|
||||
/*
|
||||
* Bio-Regenerator
|
||||
*/
|
||||
/obj/item/weapon/surgical/bioregen
|
||||
name="bioregenerator"
|
||||
desc="A special tool used in surgeries which can pull toxins from and restore oxygen to organic tissue as well as recreate missing biological structures to allow otherwise irreperable flesh to be mended."
|
||||
icon='icons/obj/surgery_vr.dmi'
|
||||
icon_state="bioregen"
|
||||
drop_sound = 'sound/items/drop/scrap.ogg'
|
||||
|
||||
/*
|
||||
* Retractor
|
||||
*/
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
/obj/item/weapon/surgical/bioregen
|
||||
name="bioregenerator"
|
||||
desc="A special tool used in surgeries which can pull toxins from and restore oxygen to organic tissue as well as recreate missing biological structures to allow otherwise irreperable flesh to be mended."
|
||||
icon='icons/obj/surgery_ch.dmi'
|
||||
icon_state="bioregen"
|
||||
drop_sound = 'sound/items/drop/scrap.ogg'
|
||||
Reference in New Issue
Block a user