mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-21 04:57:57 +01:00
Merge branch 'master' into master
This commit is contained in:
@@ -50,6 +50,7 @@
|
||||
var/used = FALSE
|
||||
var/painting_name //Painting name, this is set after framing.
|
||||
var/finalized = FALSE //Blocks edits
|
||||
var/author_ckey
|
||||
var/icon_generated = FALSE
|
||||
var/icon/generated_icon
|
||||
|
||||
@@ -123,6 +124,7 @@
|
||||
|
||||
/obj/item/canvas/proc/finalize(mob/user)
|
||||
finalized = TRUE
|
||||
author_ckey = user.ckey
|
||||
generate_proper_overlay()
|
||||
try_rename(user)
|
||||
|
||||
@@ -237,6 +239,7 @@
|
||||
|
||||
/obj/structure/sign/painting/Initialize(mapload, dir, building)
|
||||
. = ..()
|
||||
SSpersistence.painting_frames += src
|
||||
AddComponent(/datum/component/art, 20)
|
||||
if(dir)
|
||||
setDir(dir)
|
||||
@@ -244,6 +247,10 @@
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
|
||||
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
|
||||
|
||||
/obj/structure/sign/painting/Destroy()
|
||||
. = ..()
|
||||
SSpersistence.painting_frames -= src
|
||||
|
||||
/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params)
|
||||
if(!C && istype(I, /obj/item/canvas))
|
||||
frame_canvas(user,I)
|
||||
@@ -305,6 +312,7 @@
|
||||
return
|
||||
var/list/chosen = pick(SSpersistence.paintings[persistence_id])
|
||||
var/title = chosen["title"]
|
||||
var/author = chosen["ckey"]
|
||||
var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png"
|
||||
if(!fexists(png))
|
||||
stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.")
|
||||
@@ -323,6 +331,7 @@
|
||||
new_canvas.icon_generated = TRUE
|
||||
new_canvas.finalized = TRUE
|
||||
new_canvas.painting_name = title
|
||||
new_canvas.author_ckey = author
|
||||
C = new_canvas
|
||||
update_icon()
|
||||
|
||||
@@ -345,15 +354,14 @@
|
||||
var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data)
|
||||
if(result)
|
||||
CRASH("Error saving persistent painting: [result]")
|
||||
current += list(list("title" = C.painting_name , "md5" = md5))
|
||||
current += list(list("title" = C.painting_name , "md5" = md5, "ckey" = C.author_ckey))
|
||||
SSpersistence.paintings[persistence_id] = current
|
||||
|
||||
/obj/item/canvas/proc/fill_grid_from_icon(icon/I)
|
||||
var/w = I.Width() + 1
|
||||
var/h = I.Height() + 1
|
||||
for(var/x in 1 to width)
|
||||
for(var/y in 1 to height)
|
||||
grid[x][y] = I.GetPixel(w-x,h-y)
|
||||
grid[x][y] = I.GetPixel(x,h-y)
|
||||
|
||||
//Presets for art gallery mapping, for paintings to be shared across stations
|
||||
/obj/structure/sign/painting/library
|
||||
@@ -364,3 +372,31 @@
|
||||
|
||||
/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least
|
||||
persistence_id = "library_private"
|
||||
|
||||
/obj/structure/sign/painting/vv_get_dropdown()
|
||||
. = ..()
|
||||
VV_DROPDOWN_OPTION(VV_HK_REMOVE_PAINTING, "Remove Persistent Painting")
|
||||
|
||||
/obj/structure/sign/painting/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
if(href_list[VV_HK_REMOVE_PAINTING])
|
||||
if(!check_rights(NONE))
|
||||
return
|
||||
var/mob/user = usr
|
||||
if(!persistence_id || !C)
|
||||
to_chat(user,"<span class='warning'>This is not a persistent painting.</span>")
|
||||
return
|
||||
var/md5 = md5(C.get_data_string())
|
||||
var/author = C.author_ckey
|
||||
var/list/current = SSpersistence.paintings[persistence_id]
|
||||
if(current)
|
||||
for(var/list/entry in current)
|
||||
if(entry["md5"] == md5)
|
||||
current -= entry
|
||||
var/png = "data/paintings/[persistence_id]/[md5].png"
|
||||
fdel(png)
|
||||
for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames)
|
||||
if(P.C && md5(P.C.get_data_string()) == md5)
|
||||
QDEL_NULL(P.C)
|
||||
log_admin("[key_name(user)] has deleted a persistent painting made by [author].")
|
||||
message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
..()
|
||||
new /obj/item/clothing/glasses/eyepatch(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/gloves/combat(src)
|
||||
new /obj/item/clothing/gloves/combat(src)
|
||||
new /obj/item/clothing/gloves/tackler/combat(src)
|
||||
new /obj/item/clothing/gloves/tackler/combat(src)
|
||||
new /obj/item/clothing/head/helmet/swat(src)
|
||||
new /obj/item/clothing/head/helmet/swat(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/swat(src)
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
new /obj/item/clothing/shoes/sneakers/black(src)
|
||||
new /obj/item/clothing/suit/chaplainsuit/nun(src)
|
||||
new /obj/item/clothing/head/nun_hood(src)
|
||||
new /obj/item/clothing/suit/hooded/chaplainsuit/monkfrock(src)
|
||||
new /obj/item/clothing/suit/hooded/chaplainsuit/monkhabit(src)
|
||||
new /obj/item/clothing/suit/chaplainsuit/holidaypriest(src)
|
||||
new /obj/item/storage/backpack/cultpack(src)
|
||||
new /obj/item/storage/fancy/candle_box(src)
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
new /obj/item/clothing/suit/armor/vest/det_suit(src)
|
||||
new /obj/item/storage/belt/holster/detective/full(src)
|
||||
new /obj/item/pinpointer/crew(src)
|
||||
new /obj/item/twohanded/binoculars(src)
|
||||
new /obj/item/binoculars(src)
|
||||
new /obj/item/storage/box/rxglasses/spyglasskit(src)
|
||||
/obj/structure/closet/secure_closet/injection
|
||||
name = "lethal injections"
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
max_integrity = 200
|
||||
integrity_failure = 0.25
|
||||
var/obj/item/showpiece = null
|
||||
var/obj/item/showpiece_type = null //This allows for showpieces that can only hold items if they're the same istype as this.
|
||||
var/alert = TRUE
|
||||
var/open = FALSE
|
||||
var/openable = TRUE
|
||||
@@ -17,6 +18,7 @@
|
||||
var/start_showpiece_type = null //add type for items on display
|
||||
var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk")
|
||||
var/trophy_message = ""
|
||||
var/glass_fix = TRUE
|
||||
|
||||
/obj/structure/displaycase/Initialize()
|
||||
. = ..()
|
||||
@@ -131,11 +133,14 @@
|
||||
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
|
||||
toggle_lock(user)
|
||||
else if(open && !showpiece)
|
||||
if(showpiece_type && !istype(W, showpiece_type))
|
||||
to_chat(user, "<span class='notice'>This doesn't belong in this kind of display.</span>")
|
||||
return TRUE
|
||||
if(user.transferItemToLoc(W, src))
|
||||
showpiece = W
|
||||
to_chat(user, "<span class='notice'>You put [W] on display.</span>")
|
||||
update_icon()
|
||||
else if(istype(W, /obj/item/stack/sheet/glass) && broken)
|
||||
else if(glass_fix && broken && istype(W, /obj/item/stack/sheet/glass))
|
||||
var/obj/item/stack/sheet/glass/G = W
|
||||
if(G.get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need two glass sheets to fix the case!</span>")
|
||||
@@ -206,6 +211,21 @@
|
||||
electronics = I
|
||||
to_chat(user, "<span class='notice'>You install the airlock electronics.</span>")
|
||||
|
||||
else if(istype(I, /obj/item/stock_parts/card_reader))
|
||||
var/obj/item/stock_parts/card_reader/C = I
|
||||
to_chat(user, "<span class='notice'>You start adding [C] to [src]...</span>")
|
||||
if(do_after(user, 20, target = src))
|
||||
var/obj/structure/displaycase/forsale/sale = new(src.loc)
|
||||
if(electronics)
|
||||
electronics.forceMove(sale)
|
||||
sale.electronics = electronics
|
||||
if(electronics.one_access)
|
||||
sale.req_one_access = electronics.accesses
|
||||
else
|
||||
sale.req_access = electronics.accesses
|
||||
qdel(src)
|
||||
qdel(C)
|
||||
|
||||
else if(istype(I, /obj/item/stack/sheet/glass))
|
||||
var/obj/item/stack/sheet/glass/G = I
|
||||
if(G.get_amount() < 10)
|
||||
@@ -342,3 +362,140 @@
|
||||
name = initial(I.name)
|
||||
icon = initial(I.icon)
|
||||
icon_state = initial(I.icon_state)
|
||||
|
||||
/obj/structure/displaycase/forsale
|
||||
name = "vend-a-tray"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "laserbox0"
|
||||
desc = "A display case with an ID-card swiper. Use your ID to purchase the contents."
|
||||
density = FALSE
|
||||
max_integrity = 100
|
||||
req_access = list(ACCESS_KITCHEN)
|
||||
showpiece_type = /obj/item/reagent_containers/food
|
||||
alert = FALSE //No, we're not calling the fire department because someone stole your cookie.
|
||||
glass_fix = FALSE //Fixable with tools instead.
|
||||
///The price of the item being sold. Altered by grab intent ID use.
|
||||
var/sale_price = 20
|
||||
///The Account which will recieve payment for purchases. Set by the first ID to swipe the tray.
|
||||
var/datum/bank_account/payments_acc = null
|
||||
|
||||
/obj/structure/displaycase/forsale/update_icon() //remind me to fix my shitcode later
|
||||
var/icon/I
|
||||
if(open)
|
||||
I = icon('icons/obj/stationobjs.dmi',"laserboxb0")
|
||||
else
|
||||
I = icon('icons/obj/stationobjs.dmi',"laserbox0")
|
||||
if(!showpiece && !open)
|
||||
I = icon('icons/obj/stationobjs.dmi',"laserbox_open")
|
||||
if(broken)
|
||||
I = icon('icons/obj/stationobjs.dmi',"laserbox_broken")
|
||||
if(showpiece)
|
||||
var/icon/S = getFlatIcon(showpiece)
|
||||
S.Scale(17,17)
|
||||
I.Blend(S,ICON_UNDERLAY,8,12)
|
||||
src.icon = I
|
||||
return
|
||||
|
||||
/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params)
|
||||
if(isidcard(I))
|
||||
//Card Registration
|
||||
var/obj/item/card/id/potential_acc = I
|
||||
if(!potential_acc.registered_account)
|
||||
to_chat(user, "<span class='warning'>This ID card has no account registered!</span>")
|
||||
return
|
||||
if(!payments_acc && potential_acc.registered_account)
|
||||
payments_acc = potential_acc.registered_account
|
||||
playsound(src, 'sound/machines/click.ogg', 20, TRUE)
|
||||
to_chat(user, "<span class='notice'>Vend-a-tray registered. Use your ID on grab intent to change the sale price, or disarm intent to open the tray.</span>")
|
||||
return
|
||||
//Buying the contained item with the ID.
|
||||
switch(user.a_intent)
|
||||
if(INTENT_HELP)
|
||||
if(!showpiece)
|
||||
to_chat(user, "<span class='notice'>There's nothing for sale.</span>")
|
||||
return TRUE
|
||||
if(broken)
|
||||
to_chat(user, "<span class='notice'>[src] appears to be broken.</span>")
|
||||
return TRUE
|
||||
var/confirm = alert(user, "Purchase [showpiece] for [sale_price]?", "Purchase?", "Confirm", "Cancel")
|
||||
if(confirm == "Cancel" || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return TRUE
|
||||
var/datum/bank_account/account = potential_acc.registered_account
|
||||
if(!account.has_money(sale_price))
|
||||
to_chat(user, "<span class='notice'>You do not possess the funds to purchase this.</span>")
|
||||
return TRUE
|
||||
else
|
||||
account.adjust_money(-sale_price)
|
||||
if(payments_acc)
|
||||
payments_acc.adjust_money(sale_price)
|
||||
user.put_in_hands(showpiece)
|
||||
to_chat(user, "<span class='notice'>You purchase [showpiece] for [sale_price] credits.</span>")
|
||||
playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE)
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
flick("laserbox_vend", src)
|
||||
showpiece = null
|
||||
update_icon()
|
||||
return TRUE
|
||||
//Setting the object's price.
|
||||
if(INTENT_GRAB)
|
||||
var/new_price_input = input(user,"Set the sale price for this vend-a-tray.","new price",0) as num|null
|
||||
if(isnull(new_price_input) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) || (payments_acc != potential_acc.registered_account))
|
||||
return
|
||||
new_price_input = clamp(round(new_price_input, 1), 10, 1000)
|
||||
sale_price = new_price_input
|
||||
to_chat(user, "<span class='notice'>The cost is now set to [sale_price].</span>")
|
||||
return TRUE
|
||||
if(INTENT_DISARM || INTENT_HARM)
|
||||
if(payments_acc && payments_acc != potential_acc.registered_account)
|
||||
to_chat(user, "<span class='warning'>This Vend-a-tray is already registered!</span>")
|
||||
return
|
||||
if(I.tool_behaviour == TOOL_WRENCH && open && user.a_intent == INTENT_HELP )
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='notice'>You start unsecuring [src]...</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You start securing [src]...</span>")
|
||||
if(I.use_tool(src, user, 16, volume=50))
|
||||
if(QDELETED(I))
|
||||
return
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='notice'>You unsecure [src].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You secure [src].</span>")
|
||||
anchored = !anchored
|
||||
return
|
||||
else if(I.tool_behaviour == TOOL_WRENCH && !open && user.a_intent == INTENT_HELP)
|
||||
to_chat(user, "<span class='notice'>[src] must be open to move it.</span>")
|
||||
return
|
||||
if(istype(I, /obj/item/pda))
|
||||
return TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/structure/displaycase/forsale/multitool_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(obj_integrity <= (integrity_failure * max_integrity))
|
||||
to_chat(user, "<span class='notice'>You start recalibrating [src]'s hover field...</span>")
|
||||
if(do_after(user, 20, target = src))
|
||||
broken = 0
|
||||
obj_integrity = max_integrity
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/displaycase/forsale/emag_act(mob/user)
|
||||
. = ..()
|
||||
payments_acc = null
|
||||
req_access = list()
|
||||
to_chat(user, "<span class='warning'>[src]'s card reader fizzles and smokes, and the account owner is reset.</span>")
|
||||
|
||||
/obj/structure/displaycase/forsale/examine(mob/user)
|
||||
. = ..()
|
||||
if(showpiece && !open)
|
||||
. += "<span class='notice'>[showpiece] is for sale for [sale_price] credits.</span>"
|
||||
if(broken)
|
||||
. += "<span class='notice'>[src] is sparking and the hover field generator seems to be overloaded. Use a multitool to fix it.</span>"
|
||||
|
||||
/obj/structure/displaycase/forsale/obj_break(damage_flag)
|
||||
if(!broken && !(flags_1 & NODECONSTRUCT_1))
|
||||
broken = TRUE
|
||||
playsound(src, "shatter", 70, TRUE)
|
||||
update_icon()
|
||||
trigger_alarm() //In case it's given an alarm anyway.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
integrity_failure = 0.33
|
||||
var/locked = TRUE
|
||||
var/open = FALSE
|
||||
var/obj/item/twohanded/fireaxe/fireaxe
|
||||
var/obj/item/fireaxe/fireaxe
|
||||
|
||||
/obj/structure/fireaxecabinet/Initialize()
|
||||
. = ..()
|
||||
@@ -49,9 +49,9 @@
|
||||
obj_integrity = max_integrity
|
||||
update_icon()
|
||||
else if(open || broken)
|
||||
if(istype(I, /obj/item/twohanded/fireaxe) && !fireaxe)
|
||||
var/obj/item/twohanded/fireaxe/F = I
|
||||
if(F.wielded)
|
||||
if(istype(I, /obj/item/fireaxe) && !fireaxe)
|
||||
var/obj/item/fireaxe/F = I
|
||||
if(F && F.wielded)
|
||||
to_chat(user, "<span class='warning'>Unwield the [F.name] first.</span>")
|
||||
return
|
||||
if(!user.transferItemToLoc(F, src))
|
||||
|
||||
@@ -300,7 +300,7 @@
|
||||
icon_state = "fullgrass_[rand(1, 3)]"
|
||||
. = ..()
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants
|
||||
/obj/item/kirbyplants
|
||||
name = "potted plant"
|
||||
icon = 'icons/obj/flora/plants.dmi'
|
||||
icon_state = "plant-01"
|
||||
@@ -308,29 +308,29 @@
|
||||
layer = ABOVE_MOB_LAYER
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 10
|
||||
force_wielded = 10
|
||||
throwforce = 13
|
||||
throw_speed = 2
|
||||
throw_range = 4
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/Initialize()
|
||||
/obj/item/kirbyplants/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/tactical)
|
||||
addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 500)), 0)
|
||||
AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=10, force_wielded=10)
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/random
|
||||
/obj/item/kirbyplants/random
|
||||
icon = 'icons/obj/flora/_flora.dmi'
|
||||
icon_state = "random_plant"
|
||||
var/list/static/states
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/random/Initialize()
|
||||
/obj/item/kirbyplants/random/Initialize()
|
||||
. = ..()
|
||||
icon = 'icons/obj/flora/plants.dmi'
|
||||
if(!states)
|
||||
generate_states()
|
||||
icon_state = pick(states)
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/random/proc/generate_states()
|
||||
/obj/item/kirbyplants/random/proc/generate_states()
|
||||
states = list()
|
||||
for(var/i in 1 to 25)
|
||||
var/number
|
||||
@@ -342,25 +342,25 @@
|
||||
states += "applebush"
|
||||
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/dead
|
||||
/obj/item/kirbyplants/dead
|
||||
name = "RD's potted plant"
|
||||
desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..."
|
||||
icon_state = "plant-25"
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/photosynthetic
|
||||
/obj/item/kirbyplants/photosynthetic
|
||||
name = "photosynthetic potted plant"
|
||||
desc = "A bioluminescent plant."
|
||||
icon_state = "plant-09"
|
||||
light_color = "#2cb2e8"
|
||||
light_range = 3
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/fullysynthetic
|
||||
/obj/item/kirbyplants/fullysynthetic
|
||||
name = "plastic potted plant"
|
||||
desc = "A fake, cheap looking, plastic tree. Perfect for people who kill every plant they touch."
|
||||
icon_state = "plant-26"
|
||||
custom_materials = (list(/datum/material/plastic = 8000))
|
||||
|
||||
/obj/item/twohanded/required/kirbyplants/fullysynthetic/Initialize()
|
||||
/obj/item/kirbyplants/fullysynthetic/Initialize()
|
||||
. = ..()
|
||||
icon_state = "plant-[rand(26, 29)]"
|
||||
|
||||
|
||||
@@ -33,6 +33,45 @@
|
||||
|
||||
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.
|
||||
|
||||
/obj/structure/ash_walker_eggshell
|
||||
name = "ash walker egg"
|
||||
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within. The egg shell looks resistant to temperature but otherwise rather brittle."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "large_egg"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF
|
||||
max_integrity = 80
|
||||
var/obj/effect/mob_spawn/human/ash_walker/egg
|
||||
|
||||
/obj/structure/ash_walker_eggshell/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) //lifted from xeno eggs
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE)
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
|
||||
if(BURN)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/items/welder.ogg', 100, TRUE)
|
||||
|
||||
/obj/structure/ash_walker_eggshell/attack_ghost(mob/user) //Pass on ghost clicks to the mob spawner
|
||||
if(egg)
|
||||
egg.attack_ghost(user)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/ash_walker_eggshell/Destroy()
|
||||
if(!egg)
|
||||
return ..()
|
||||
var/mob/living/carbon/human/yolk = new /mob/living/carbon/human/(get_turf(src))
|
||||
yolk.fully_replace_character_name(null,random_unique_lizard_name(gender))
|
||||
yolk.set_species(/datum/species/lizard/ashwalker)
|
||||
yolk.underwear = "Nude"
|
||||
yolk.equipOutfit(/datum/outfit/ashwalker)//this is an authentic mess we're making
|
||||
yolk.update_body()
|
||||
yolk.gib()
|
||||
qdel(egg)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker
|
||||
name = "ash walker egg"
|
||||
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
|
||||
@@ -43,7 +82,6 @@
|
||||
outfit = /datum/outfit/ashwalker
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
short_desc = "You are an ash walker. Your tribe worships the Necropolis."
|
||||
@@ -52,10 +90,17 @@
|
||||
Fresh sacrifices for your nest."
|
||||
assignedrole = "Ash Walker"
|
||||
var/datum/team/ashwalkers/team
|
||||
var/obj/structure/ash_walker_eggshell/eggshell
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker/allow_spawn(mob/user)
|
||||
if(!(user.key in team.players_spawned))//one per person unless you get a bonus spawn
|
||||
return TRUE
|
||||
to_chat(user, "<span class='warning'><b>You have exhausted your usefulness to the Necropolis</b>.</span>")
|
||||
return FALSE
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn)
|
||||
new_spawn.fully_replace_character_name(null,random_unique_lizard_name(gender))
|
||||
to_chat(new_spawn, "<b>Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Don't leave your nest undefended, protect it with your life. Glory to the Necropolis!</b>")
|
||||
to_chat(new_spawn, "<b>Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Invade the strange structure of the outsiders if you must. Do not cause unnecessary destruction, as littering the wastes with ugly wreckage is certain to not gain you favor. Glory to the Necropolis!</b>")
|
||||
|
||||
new_spawn.mind.add_antag_datum(/datum/antagonist/ashwalker, team)
|
||||
|
||||
@@ -63,11 +108,18 @@
|
||||
var/mob/living/carbon/human/H = new_spawn
|
||||
H.underwear = "Nude"
|
||||
H.update_body()
|
||||
ADD_TRAIT(H, TRAIT_PRIMITIVE, ROUNDSTART_TRAIT)
|
||||
team.players_spawned += (new_spawn.key)
|
||||
eggshell.egg = null
|
||||
qdel(eggshell)
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
team = ashteam
|
||||
eggshell = new /obj/structure/ash_walker_eggshell(get_turf(loc))
|
||||
eggshell.egg = src
|
||||
src.forceMove(eggshell)
|
||||
if(A)
|
||||
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER)
|
||||
|
||||
@@ -413,7 +465,7 @@
|
||||
name = "Syndicate Operative Empty"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
ears = /obj/item/radio/headset/syndicate/alt
|
||||
back = /obj/item/storage/backpack
|
||||
implants = list(/obj/item/implant/weapons_auth)
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(S.sheettype && S.sheettype != "runed")
|
||||
if(S.sheettype != "runed")
|
||||
var/M = S.sheettype
|
||||
if(state == GIRDER_DISPLACED)
|
||||
if(S.get_amount() < 2)
|
||||
@@ -189,7 +189,16 @@
|
||||
S.use(2)
|
||||
to_chat(user, "<span class='notice'>You add the plating.</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
T.PlaceOnTop(text2path("/turf/closed/wall/mineral/[M]"))
|
||||
if(S.walltype)
|
||||
T.PlaceOnTop(S.walltype)
|
||||
else
|
||||
var/turf/newturf = T.PlaceOnTop(/turf/closed/wall/material)
|
||||
var/list/material_list = list()
|
||||
if(S.material_type)
|
||||
material_list[SSmaterials.GetMaterialRef(S.material_type)] = MINERAL_MATERIAL_AMOUNT * 2
|
||||
if(material_list)
|
||||
newturf.set_custom_materials(material_list)
|
||||
|
||||
transfer_fingerprints_to(T)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
var/bonespear = FALSE
|
||||
var/obj/item/twohanded/spear/spear
|
||||
var/obj/item/spear/spear
|
||||
var/obj/item/bodypart/head/victim
|
||||
|
||||
/obj/structure/headpike/bone //for bone spears
|
||||
@@ -19,9 +19,9 @@
|
||||
name = "[victim.name] on a spear"
|
||||
update_icon()
|
||||
if(bonespear)
|
||||
spear = locate(/obj/item/twohanded/spear/bonespear) in parts_list
|
||||
spear = locate(/obj/item/spear/bonespear) in parts_list
|
||||
else
|
||||
spear = locate(/obj/item/twohanded/spear) in parts_list
|
||||
spear = locate(/obj/item/spear) in parts_list
|
||||
|
||||
/obj/structure/headpike/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
|
||||
var/obj/item/storage/bag/trash/mybag
|
||||
var/obj/item/mop/mymop
|
||||
var/obj/item/twohanded/broom/mybroom
|
||||
var/obj/item/pushbroom/mybroom
|
||||
var/obj/item/reagent_containers/spray/cleaner/myspray
|
||||
var/obj/item/lightreplacer/myreplacer
|
||||
var/signs = 0
|
||||
@@ -51,9 +51,9 @@
|
||||
m.janicart_insert(user, src)
|
||||
else
|
||||
to_chat(user, fail_msg)
|
||||
else if(istype(I, /obj/item/twohanded/broom))
|
||||
else if(istype(I, /obj/item/pushbroom))
|
||||
if(!mybroom)
|
||||
var/obj/item/twohanded/broom/b=I
|
||||
var/obj/item/pushbroom/b=I
|
||||
b.janicart_insert(user,src)
|
||||
else
|
||||
to_chat(user, fail_msg)
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
max_integrity = 50
|
||||
layer = LATTICE_LAYER //under pipes
|
||||
plane = FLOOR_PLANE
|
||||
var/number_of_rods = 1
|
||||
var/number_of_mats = 1
|
||||
var/build_material = /obj/item/stack/rods
|
||||
canSmoothWith = list(/obj/structure/lattice,
|
||||
/turf/open/floor,
|
||||
/turf/closed/wall,
|
||||
@@ -45,7 +46,7 @@
|
||||
|
||||
/obj/structure/lattice/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
new /obj/item/stack/rods(get_turf(src), number_of_rods)
|
||||
new build_material(get_turf(src), number_of_mats)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
@@ -71,7 +72,7 @@
|
||||
desc = "A catwalk for easier EVA maneuvering and cable placement."
|
||||
icon = 'icons/obj/smooth_structures/catwalk.dmi'
|
||||
icon_state = "catwalk"
|
||||
number_of_rods = 2
|
||||
number_of_mats = 2
|
||||
smooth = SMOOTH_TRUE
|
||||
canSmoothWith = null
|
||||
obj_flags = CAN_BE_HIT | BLOCK_Z_FALL
|
||||
@@ -96,7 +97,7 @@
|
||||
desc = "A specialized support beam for building across lava. Watch your step."
|
||||
icon = 'icons/obj/smooth_structures/catwalk.dmi'
|
||||
icon_state = "catwalk"
|
||||
number_of_rods = 1
|
||||
number_of_mats = 1
|
||||
color = "#5286b9ff"
|
||||
smooth = SMOOTH_TRUE
|
||||
canSmoothWith = null
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
climbable = FALSE
|
||||
|
||||
/obj/structure/railing/attackby(obj/item/I, mob/living/user, params)
|
||||
..()
|
||||
add_fingerprint(user)
|
||||
|
||||
if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP)
|
||||
@@ -53,8 +54,8 @@
|
||||
/obj/structure/railing/CheckExit(atom/movable/O, turf/target)
|
||||
..()
|
||||
if(get_dir(loc, target) & dir)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/railing/corner/CheckExit()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
@@ -45,3 +45,14 @@
|
||||
name = "command department"
|
||||
desc = "A direction sign, pointing out which way the Command department is."
|
||||
icon_state = "direction_bridge"
|
||||
|
||||
/obj/structure/sign/directions/vault
|
||||
name = "vault directions"
|
||||
desc = "A direction sign, pointing out which way the station's Vault is."
|
||||
icon_state = "direction_vault"
|
||||
|
||||
/obj/structure/sign/directions/upload
|
||||
name = "upload directions"
|
||||
desc = "A direction sign, pointing out which way the station's AI Upload is."
|
||||
icon_state = "direction_upload"
|
||||
|
||||
|
||||
@@ -237,13 +237,13 @@
|
||||
UnregisterSignal(source, COMSIG_MOVABLE_MOVED)
|
||||
|
||||
/obj/structure/table/rolling/Moved(atom/OldLoc, Dir)
|
||||
. = ..()
|
||||
for(var/mob/M in OldLoc.contents)//Kidnap everyone on top
|
||||
M.forceMove(loc)
|
||||
for(var/x in attached_items)
|
||||
var/atom/movable/AM = x
|
||||
if(!AM.Move(loc))
|
||||
RemoveItemFromTable(AM, AM.loc)
|
||||
return TRUE
|
||||
|
||||
/*
|
||||
* Glass tables
|
||||
|
||||
@@ -151,7 +151,14 @@
|
||||
outside_tube()
|
||||
|
||||
/obj/structure/transit_tube_pod/proc/outside_tube()
|
||||
var/list/savedcontents = contents.Copy()
|
||||
var/saveddir = dir
|
||||
var/turf/destination = get_edge_target_turf(src,saveddir)
|
||||
visible_message("<span class='warning'>[src] ejects its insides out!</span>")
|
||||
deconstruct(FALSE)//we automatically deconstruct the pod
|
||||
for(var/i in savedcontents)
|
||||
var/atom/movable/AM = i
|
||||
AM.throw_at(destination,rand(1,3),5)
|
||||
|
||||
/obj/structure/transit_tube_pod/return_air()
|
||||
return air_contents
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
animate(src, alpha = initial(alpha), time = time_between_triggers)
|
||||
|
||||
/obj/structure/trap/Crossed(atom/movable/AM)
|
||||
. = ..()
|
||||
if(last_trigger + time_between_triggers > world.time)
|
||||
return
|
||||
// Don't want the traps triggered by sparks, ghosts or projectiles.
|
||||
|
||||
Reference in New Issue
Block a user