Merge branch 'master' into xenobio-upgrades

This commit is contained in:
FartMaster69420
2022-04-09 12:53:04 -04:00
444 changed files with 247016 additions and 2435 deletions
+1
View File
@@ -62,6 +62,7 @@
#define HOLOMAP_AREACOLOR_ARRIVALS "#0000FFCC"
#define HOLOMAP_AREACOLOR_ESCAPE "#FF0000CC"
#define HOLOMAP_AREACOLOR_DORMS "#CCCC0099"
#define HOLOMAP_AREACOLOR_CIV "#3ea800" //VOREStation Addition
#define LIST_NUMERIC_SET(L, I, V) if(!L) { L = list(); } if (L.len < I) { L.len = I; } L[I] = V
+3 -1
View File
@@ -13,7 +13,7 @@
#define isitem(D) istype(D, /obj/item)
#define isradio(A) istype(A, /obj/item/device/radio)
#define isradio(A) istype(A, /obj/item/device/radio)
#define isairlock(A) istype(A, /obj/machinery/door/airlock)
@@ -23,6 +23,8 @@
#define ismecha(A) istype(A, /obj/mecha)
#define isstructure(A) istype(A, /obj/structure)
//---------------
//#define isarea(D) istype(D, /area) //Built in
+6
View File
@@ -103,6 +103,12 @@
#define ui_alien_fire "EAST-1:28,NORTH-3:25"
#define ui_alien_oxygen "EAST-1:28,NORTH-4:25"
// Goes above HUD, mid-right
#define ui_ammo_hud1 "EAST-1:28,CENTER+1:25"
#define ui_ammo_hud2 "EAST-1:28,CENTER+2:27"
#define ui_ammo_hud3 "EAST-1:28,CENTER+3:29"
#define ui_ammo_hud4 "EAST-1:28,CENTER+4:31"
//Middle right (status indicators)
#define ui_temp "EAST-1:28,CENTER-2:13"
#define ui_health "EAST-1:28,CENTER-1:15"
+2
View File
@@ -39,6 +39,7 @@
alert.icon_state = "itembased"
var/image/I = image(icon = new_master.icon, icon_state = new_master.icon_state, dir = SOUTH)
I.plane = PLANE_PLAYER_HUD_ABOVE
I.color = new_master.color
alert.add_overlay(I)
alert.master = new_master
else
@@ -471,6 +472,7 @@ so as to remain in compliance with the most up-to-date laws."
return
if(master)
return usr.client.Click(master, location, control, params)
..() // VOREStation Edit: Pass through to click_vr
/obj/screen/alert/Destroy()
..()
+28
View File
@@ -23,3 +23,31 @@
/obj/screen/alert/starving/synth
name = "Low Power"
desc = "Your battery is very low! Low power mode makes all movements slower."
/obj/screen/alert/xenochimera/reconstitution
name = "Reconstructing Form"
desc = "You're still rebuilding your body! Click the alert to find out how long you have left."
icon_state = "regenerating"
/* // Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately.
/obj/screen/alert/xenochimera/reconstitution/Click(mob/usr)
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
if(H.revive_ready == REVIVING_NOW)
to_chat(usr, "We are currently reviving, and will be done in [(H.revive_finished - world.time) / 10] seconds.")
else if(H.revive_ready == REVIVING_DONE)
to_chat(usr, "You should have a notification + alert for this! Bug report that this is still here!")
*/
/obj/screen/alert/xenochimera/readytohatch
name = "Ready to Hatch"
desc = "You're done reconstructing your cells! Click me to Hatch!"
icon_state = "hatch_ready"
/* // Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately.
/obj/screen/alert/xenochimera/readytohatch/Click(mob/usr)
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
if(H.revive_ready == REVIVING_DONE) // Sanity check.
H.hatch() // Hatch.
*/
+39 -1
View File
@@ -1,3 +1,4 @@
#define MAX_AMMO_HUD_POSSIBLE 4 // Cap the amount of HUDs at 4.
/*
The global hud:
Uses the same visual objects for all players.
@@ -191,6 +192,9 @@ var/list/global_huds = list(
var/icon/ui_style
var/ui_color
var/ui_alpha
// TGMC Ammo HUD Port
var/list/obj/screen/ammo_hud_list = list()
var/list/minihuds = list()
@@ -220,6 +224,7 @@ var/list/global_huds = list(
other_important = null
hotkeybuttons = null
// item_action_list = null // ?
QDEL_LIST(ammo_hud_list)
mymob = null
/datum/hud/proc/hidden_inventory_update()
@@ -460,4 +465,37 @@ var/list/global_huds = list(
client.screen += client.void
/mob/new_player/add_click_catcher()
return
return
/* TGMC Ammo HUD Port
* These procs call to screen_objects.dm's respective procs.
* All these do is manage the amount of huds on screen and set the HUD.
*/
///Add an ammo hud to the user informing of the ammo count of G
/datum/hud/proc/add_ammo_hud(mob/living/user, obj/item/weapon/gun/G)
if(length(ammo_hud_list) >= MAX_AMMO_HUD_POSSIBLE)
return
var/obj/screen/ammo/ammo_hud = new
ammo_hud_list[G] = ammo_hud
ammo_hud.screen_loc = ammo_hud.ammo_screen_loc_list[length(ammo_hud_list)]
ammo_hud.add_hud(user, G)
ammo_hud.update_hud(user, G)
///Remove the ammo hud related to the gun G from the user
/datum/hud/proc/remove_ammo_hud(mob/living/user, obj/item/weapon/gun/G)
var/obj/screen/ammo/ammo_hud = ammo_hud_list[G]
if(isnull(ammo_hud))
return
ammo_hud.remove_hud(user, G)
qdel(ammo_hud)
ammo_hud_list -= G
var/i = 1
for(var/key in ammo_hud_list)
ammo_hud = ammo_hud_list[key]
ammo_hud.screen_loc = ammo_hud.ammo_screen_loc_list[i]
i++
///Update the ammo hud related to the gun G
/datum/hud/proc/update_ammo_hud(mob/living/user, obj/item/weapon/gun/G)
var/obj/screen/ammo/ammo_hud = ammo_hud_list[G]
ammo_hud?.update_hud(user, G)
+77
View File
@@ -898,3 +898,80 @@
icon_state = null
plane = PLANE_HOLOMAP_ICONS
appearance_flags = KEEP_TOGETHER
// Begin TGMC Ammo HUD Port
/obj/screen/ammo
name = "ammo"
icon = 'icons/mob/screen_ammo.dmi'
icon_state = "ammo"
screen_loc = ui_ammo_hud1
var/warned = FALSE
var/static/list/ammo_screen_loc_list = list(ui_ammo_hud1, ui_ammo_hud2, ui_ammo_hud3 ,ui_ammo_hud4)
/obj/screen/ammo/proc/add_hud(var/mob/living/user, var/obj/item/weapon/gun/G)
if(!user?.client)
return
if(!G)
CRASH("/obj/screen/ammo/proc/add_hud() has been called from [src] without the required param of G")
if(!G.has_ammo_counter())
return
user.client.screen += src
/obj/screen/ammo/proc/remove_hud(var/mob/living/user)
user?.client?.screen -= src
/obj/screen/ammo/proc/update_hud(var/mob/living/user, var/obj/item/weapon/gun/G)
if(!user?.client?.screen.Find(src))
return
if(!G || !istype(G) || !G.has_ammo_counter() || !G.get_ammo_type() || isnull(G.get_ammo_count()))
remove_hud()
return
var/list/ammo_type = G.get_ammo_type()
var/rounds = G.get_ammo_count()
var/hud_state = ammo_type[1]
var/hud_state_empty = ammo_type[2]
overlays.Cut()
var/empty = image('icons/mob/screen_ammo.dmi', src, "[hud_state_empty]")
if(rounds == 0)
if(warned)
overlays += empty
else
warned = TRUE
var/obj/screen/ammo/F = new /obj/screen/ammo(src)
F.icon_state = "frame"
user.client.screen += F
flick("[hud_state_empty]_flash", F)
spawn(20)
user.client.screen -= F
qdel(F)
overlays += empty
else
warned = FALSE
overlays += image('icons/mob/screen_ammo.dmi', src, "[hud_state]")
rounds = num2text(rounds)
//Handle the amount of rounds
switch(length(rounds))
if(1)
overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[1]]")
if(2)
overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[2]]")
overlays += image('icons/mob/screen_ammo.dmi', src, "t[rounds[1]]")
if(3)
overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[3]]")
overlays += image('icons/mob/screen_ammo.dmi', src, "t[rounds[2]]")
overlays += image('icons/mob/screen_ammo.dmi', src, "h[rounds[1]]")
else //"0" is still length 1 so this means it's over 999
overlays += image('icons/mob/screen_ammo.dmi', src, "o9")
overlays += image('icons/mob/screen_ammo.dmi', src, "t9")
overlays += image('icons/mob/screen_ammo.dmi', src, "h9")
+15
View File
@@ -45,11 +45,26 @@
var/turf/T = get_turf(H)
if(T.get_lumcount() <= 0.1)
to_chat(usr, "<span class='notice'>You are slowly calming down in darkness' safety...</span>")
else if(isbelly(H.loc)) // Safety message for if inside a belly.
to_chat(usr, "<span class='notice'>You are slowly calming down within the darkness of something's belly, listening to their body as it moves around you. ...safe...</span>")
else
to_chat(usr, "<span class='notice'>You are slowly calming down... But safety of darkness is much preferred.</span>")
else
if(H.nutrition < 150)
to_chat(usr, "<span class='warning'>Your hunger is slowly making you unstable.</span>")
if("Reconstructing Form") // Allow Viewing Reconstruction Timer + Hatching for 'chimera
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
if(H.revive_ready == REVIVING_NOW)
to_chat(usr, "<span class='notice'>We are currently reviving, and will be done in [round((H.revive_finished - world.time) / 10)] seconds, or [round(((H.revive_finished - world.time) * 0.1) / 60)] minutes.</span>")
else if(H.revive_ready == REVIVING_DONE)
to_chat(usr, "<span class='warning'>You should have a notification + alert for this! Bug report that this is still here!</span>")
if("Ready to Hatch") // Allow Viewing Reconstruction Timer + Hatching for 'chimera
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
if(H.revive_ready == REVIVING_DONE) // Sanity check.
H.hatch() // Hatch.
else
return 0
+49 -1
View File
@@ -24,4 +24,52 @@
/datum/category_item/autolathe/engineering/candymachine
name = "candy machine electronics"
path =/obj/item/weapon/circuitboard/candymachine
path =/obj/item/weapon/circuitboard/candymachine
/datum/category_item/autolathe/engineering/battle_arcade
name = "battle arcade machine electronics"
path =/obj/item/weapon/circuitboard/arcade/battle
/datum/category_item/autolathe/engineering/orion_trail
name = "orion trail aracade machine electronics"
path =/obj/item/weapon/circuitboard/arcade/orion_trail
/datum/category_item/autolathe/engineering/clawmachine
name = "claw machine electronics"
path =/obj/item/weapon/circuitboard/arcade/clawmachine
/datum/category_item/autolathe/engineering/jukebox
name = "jukebox electronics"
path =/obj/item/weapon/circuitboard/jukebox
/datum/category_item/autolathe/engineering/mech_recharger
name = "mech recharging station electronics"
path =/obj/item/weapon/circuitboard/mech_recharger
/datum/category_item/autolathe/engineering/recharge_station
name = "cyborg recharging station electronics"
path =/obj/item/weapon/circuitboard/recharge_station
/datum/category_item/autolathe/engineering/batteryrack
name = "battery rack electronics"
path =/obj/item/weapon/circuitboard/batteryrack
/datum/category_item/autolathe/engineering/grid_checker
name = "grid checker electronics"
path =/obj/item/weapon/circuitboard/grid_checker
/datum/category_item/autolathe/engineering/breakerbox
name = "breaker box electronics"
path =/obj/item/weapon/circuitboard/breakerbox
/datum/category_item/autolathe/engineering/gas_heater
name = "gas heater electronics"
path =/obj/item/weapon/circuitboard/unary_atmos/heater
/datum/category_item/autolathe/engineering/gas_cooler
name = "gas cooler electronics"
path =/obj/item/weapon/circuitboard/unary_atmos/cooler
/datum/category_item/autolathe/engineering/arf_generator
name = "atmospheric field generator electronics"
path =/obj/item/weapon/circuitboard/arf_generator
@@ -1,3 +1,6 @@
/*
* Misc
*/
/datum/crafting_recipe/cloth
name = "Cloth bolt"
result = /obj/item/stack/material/cloth
@@ -13,9 +16,8 @@
category = CAT_PRIMAL
/*
* Clothing
* Primitive Clothing
*/
/datum/crafting_recipe/primitive_clothes
name = "primitive clothes"
result = /obj/item/clothing/under/primitive
+13
View File
@@ -106,3 +106,16 @@
cost = 35
containertype = /obj/structure/closet/crate/aether
containername = "Emergency crate"
/datum/supply_pack/atmos/firefighting
name = "Firefighting equipment"
contains = list(
/obj/item/clothing/suit/fire/heavy = 2,
/obj/item/weapon/tank/oxygen/red = 2,
/obj/item/weapon/watertank/atmos = 2,
/obj/item/device/flashlight = 2,
/obj/item/clothing/head/hardhat/firefighter/atmos = 2
)
cost = 35
containertype = /obj/structure/closet/crate/aether
containername = "Firefighting crate"
+10
View File
@@ -288,6 +288,16 @@
containername = "Riot armor crate"
access = access_armory
/datum/supply_pack/security/riot_sprayer
name = "Gear - Riot sprayer"
contains = list(
/obj/item/weapon/watertank/pepperspray
)
cost = 40
containertype = /obj/structure/closet/crate/secure/lawson
containername = "Riot sprayer crate"
access = access_armory
/datum/supply_pack/security/ablative_armor
name = "Armor - Ablative"
contains = list(
+1 -1
View File
@@ -702,7 +702,7 @@
desc = "Spooky!"
gender = PLURAL
icon = 'icons/obj/wizard.dmi'
icon_state = "ectoplasm"
icon_state = "ectoplasm2"
/obj/item/weapon/research
name = "research debugging device"
@@ -50,3 +50,6 @@
/area/holodeck/source_patient_ward
name = "\improper Holodeck - Patient Ward"
/area/holodeck/the_uwu_zone
name = "\improper Holodeck - Inside"
+16
View File
@@ -3,6 +3,7 @@
var/exit_message
var/limit_mob_size = TRUE //If mob size is limited in the area.
var/block_suit_sensors = FALSE //If mob size is limited in the area.
var/turf/ceiling_type
/area/Entered(var/atom/movable/AM, oldLoc)
. = ..()
@@ -13,3 +14,18 @@
. = ..()
if(exit_message && isliving(AM))
to_chat(AM, exit_message)
/area/Initialize(mapload)
apply_ceiling()
. = ..()
/area/proc/apply_ceiling()
if(!ceiling_type)
return
for(var/turf/T in contents)
if(T.outdoors >= 0)
continue
if(HasAbove(T.z))
var/turf/TA = GetAbove(T)
if(isopenspace(TA))
TA.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE)
+3 -2
View File
@@ -185,6 +185,7 @@
icon_state = "cryo_rear"
anchored = TRUE
dir = WEST
density = TRUE
//Cryopods themselves.
/obj/machinery/cryopod
@@ -522,13 +523,13 @@
control_computer.frozen_crew += "[to_despawn.real_name], [to_despawn.mind.role_alt_title] - [stationtime2text()]"
control_computer._admin_logs += "[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) at [stationtime2text()]"
log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.")
//VOREStation Edit Start
var/depart_announce = TRUE
if(istype(to_despawn, /mob/living/dominated_brain))
depart_announce = FALSE
if(depart_announce)
announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE))
visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]</span>", 3)
@@ -128,3 +128,17 @@
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
/obj/effect/decal/cleanable/confetti
name = "confetti"
desc = "Tiny bits of colored paper thrown about for the janitor to enjoy!"
gender = PLURAL
density = FALSE
anchored = TRUE
icon = 'icons/effects/effects.dmi'
icon_state = "confetti"
/obj/effect/decal/cleanable/confetti/attack_hand(mob/user)
to_chat(user, "<span class='notice'>You start to meticulously pick up the confetti.</span>")
if(do_after(user, 60))
qdel(src)
+5
View File
@@ -497,6 +497,11 @@
M.Weaken(rand(10,25))
M.updatehealth()
apply_brain_damage(M)
// VOREStation Edits Start: Defib pain
if(istype(M.species, /datum/species/xenochimera)) // Only do the following to Xenochimera. Handwave this however you want, this is to balance defibs on an alien race.
M.adjustHalLoss(220) // This hurts a LOT, stacks on top of the previous halloss.
M.feral += 100 // If they somehow weren't already feral, force them feral by increasing ferality var directly, to avoid any messy checks. handle_feralness() will immediately set our feral properly according to halloss anyhow.
// VOREStation Edits End
// SSgame_master.adjust_danger(-20) // VOREStation Edit - We don't use SSgame_master yet.
/obj/item/weapon/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H)
@@ -278,6 +278,18 @@ HALOGEN COUNTER - Radcount on mobs
else
dat += "<span class='notice'>Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]</span><br>"
dat += "<span class='notice'>Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font></span>"
if(istype(H.species, /datum/species/xenochimera)) // VOREStation Edit Start: Visible feedback for medmains on Xenochimera.
if(H.stat == DEAD && H.revive_ready == REVIVING_READY && !H.hasnutriment())
dat += "<span class='danger'>WARNING: Protein levels low. Subject incapable of reconstitution.</span>"
else if(H.revive_ready == REVIVING_NOW)
dat += "<span class='warning'>Subject is undergoing form reconstruction. Estimated time to finish is in: [round((H.revive_finished - world.time) / 10)] seconds.</span>"
else if(H.revive_ready == REVIVING_DONE)
dat += "<span class='notice'>Subject is ready to hatch. Transfer to dark room for holding with food available.</span>"
else if(H.stat == DEAD)
dat+= "<span class='danger'>WARNING: Defib will cause extreme pain and set subject feral. Sedation recommended prior to defibrillation.</span>"
else // If they bop them and they're not dead or reviving, give 'em a little notice.
dat += "<span class='notice'>Subject is a Xenochimera. Treat accordingly.</span>"
// VOREStation Edit End
user.show_message(dat, 1)
/obj/item/device/healthanalyzer/verb/toggle_mode()
@@ -0,0 +1,20 @@
// Porting stack dragging/auto stacking from TG.
/obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible
if(uses_charge || S.uses_charge) // This should realistically never happen, but in case it does lets avoid breaking things.
return
var/transfer = get_amount()
transfer = min(transfer, S.max_amount - S.amount)
if(pulledby)
pulledby.start_pulling(S)
transfer_fingerprints_to(S)
if(blood_DNA)
S.blood_DNA |= blood_DNA
use(transfer)
S.add(transfer)
/obj/item/stack/Crossed(var/atom/movable/AM)
if(AM != src && istype(AM, src.type) && !AM.throwing)
merge(AM)
return ..()
+112
View File
@@ -22,6 +22,7 @@
* Professor Who universal ID
* Professor Who sonic driver
* Action figures
* Desk toys
*/
@@ -962,3 +963,114 @@
icon = 'icons/obj/toy_vr.dmi'
icon_state = "prisoner"
toysay = "I did not hit her! I did not!"
/obj/item/toy/figure/error
name = "completely glitched action figure"
desc = "A \"Space Life\" brand... wait, what the hell is this thing? It seems to be requesting the sweet release of death."
icon = 'icons/obj/toy_vr.dmi'
icon_state = "glitched"
toysay = "AaAAaAAAaAaaaAAA!!!!!"
/*
* Desk toys
*/
/obj/item/weapon/toy/desk
icon = 'icons/obj/toy_vr.dmi'
var/on = FALSE
var/activation_sound = 'sound/machines/click.ogg'
/obj/item/weapon/toy/desk/update_icon()
if(on)
icon_state = "[initial(icon_state)]-on"
else
icon_state = "[initial(icon_state)]"
/obj/item/weapon/toy/desk/proc/activate(mob/user as mob)
on = !on
playsound(src.loc, activation_sound, 75, 1)
update_icon()
return 1
/obj/item/weapon/toy/desk/attack_self(mob/user)
activate(user)
/obj/item/weapon/toy/desk/AltClick(mob/user)
activate(user)
/obj/item/weapon/toy/desk/MouseDrop(mob/user as mob) // Code from Paper bin, so you can still pick up the deck
if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr))))))
if(!istype(usr, /mob/living/simple_mob))
if( !usr.get_active_hand() ) //if active hand is empty
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
if (H.hand)
temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable())
to_chat(user,"<span class='notice'>You try to move your [temp.name], but cannot!</span>")
return
to_chat(user,"<span class='notice'>You pick up [src].</span>")
user.put_in_hands(src)
return
/obj/item/weapon/toy/desk/newtoncradle
name = "\improper Newton's cradle"
desc = "A ancient 21th century super-weapon model demonstrating that Sir Isaac Newton is the deadliest sonuvabitch in space."
description_fluff = "Aside from car radios, Eridanian Dregs are reportedly notorious for stealing these things. It is often \
theorized that the very same ball bearings are used in black-market cybernetics."
icon_state = "newtoncradle"
/obj/item/weapon/toy/desk/fan
name = "office fan"
desc = "Your greatest fan."
description_fluff = "For weeks, the atmospherics department faced a conundrum on how to lower temperatures in a localized \
area through complicated pipe channels and ventilation systems. The problem was promptly solved by ordering several desk fans."
icon_state = "fan"
/obj/item/weapon/toy/desk/officetoy
name = "office toy"
desc = "A generic microfusion powered office desk toy. Only generates magnetism and ennui."
description_fluff = "The mechanism inside is a Hephasteus trade secret. No peeking!"
icon_state = "desktoy"
/obj/item/weapon/toy/desk/dippingbird
name = "dipping bird toy"
desc = "Engineers marvel at this scale model of a primitive thermal engine. It's highly debated why the majority of owners \
were in low-level bureaucratic jobs."
description_fluff = "One of the key essentials for every Eridanian suit - it's practically a rite of passage to own one \
of these things."
icon_state = "dippybird"
/obj/item/weapon/toy/desk/stellardelight
name = "\improper Stellar Delight model"
desc = "A scale model of the Stellar Delight. Includes flashing lights!"
icon_state = "stellar_delight"
/*
* Party popper
*/
/obj/item/weapon/toy/partypopper
name = "party popper"
desc = "Instructions : Aim away from face. Wait for appropriate timing. Pull cord, enjoy confetti."
icon = 'icons/obj/toy_vr.dmi'
icon_state = "partypopper"
w_class = ITEMSIZE_TINY
drop_sound = 'sound/items/drop/cardboardbox.ogg'
pickup_sound = 'sound/items/pickup/cardboardbox.ogg'
/obj/item/weapon/toy/partypopper/attack_self(mob/user as mob)
if(icon_state == "partypopper")
user.visible_message("<span class='notice'>[user] pulls on the string, releasing a burst of confetti!</span>", "<span class='notice'>You pull on the string, releasing a burst of confetti!</span>")
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
var/datum/effect/effect/system/confetti_spread/s = new /datum/effect/effect/system/confetti_spread
s.set_up(5, 1, src)
s.start()
icon_state = "partypopper_e"
var/turf/T = get_step(src, user.dir)
if(!turf_clear(T))
T = get_turf(src)
new /obj/effect/decal/cleanable/confetti(T)
else
to_chat(user, "<span class='notice'>The [src] is already spent!</span>")
+35 -2
View File
@@ -167,10 +167,43 @@
storage_slots = 6
drop_sound = 'sound/items/drop/box.ogg'
use_sound = 'sound/items/storage/box.ogg'
var/open = 0
var/open_state
var/closed_state
/obj/item/weapon/storage/box/fancy/chewables/tobacco/update_icon()
icon_state = "[initial(icon_state)][contents.len]"
/obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/New()
if(!open_state)
open_state = "[initial(icon_state)]0"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/update_icon()
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("chew_nico[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/open(mob/user as mob)
if(open)
return
open = TRUE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/close(mob/user as mob)
open = FALSE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/clothing/mask/chewable/candy
name = "wad"
@@ -1,5 +1,3 @@
//cleansed 9/15/2012 17:48
/*
CONTAINS:
MATCHES
@@ -473,6 +471,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "cobpipe"
chem_volume = 35
/obj/item/clothing/mask/smokable/pipe/bonepipe
name = "Europan bone pipe"
desc = "A smoking pipe made out of the bones of the Europan bone whale."
description_fluff = "While most commonly associated with bone charms, bones from various sea creatures on Europa are used in a \
variety of goods, such as this smoking pipe. While smoking in submarines is often an uncommon occurrence, due to a lack of \
available air or space, these pipes are a common sight in the many stations of Europa. Higher-quality pipes typically have \
scenes etched into their bones, and can tell the story of their owner's time on Europa."
icon_state = "bonepipe"
item_state = "bonepipe"
chem_volume = 30
///////////////
//CUSTOM CIGS//
///////////////
@@ -12,6 +12,7 @@
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
var/spread_range = 7
loadable = null
hud_state = "grenade_frag" // TGMC Ammo HUD Port
/obj/item/weapon/grenade/explosive/detonate()
..()
@@ -13,6 +13,8 @@
var/det_time = 50
var/loadable = TRUE
var/arm_sound = 'sound/weapons/armbomb.ogg'
var/hud_state = "grenade_he" // TGMC Ammo HUD Port
var/hud_state_empty = "grenade_empty" // TGMC Ammo HUD Port
/obj/item/weapon/grenade/proc/clown_check(var/mob/living/user)
if((CLUMSY in user.mutations) && prob(50))
@@ -6,6 +6,7 @@
det_time = 20
item_state = "flashbang"
slot_flags = SLOT_BELT
hud_state = "grenade_smoke"
var/datum/effect/effect/system/smoke_spread/bad/smoke
var/smoke_color
var/smoke_strength = 8
@@ -342,3 +342,395 @@
<p>This all may seem daunting at a glance; so many recipes to learn, and a "lot" to keep in mind. But really it's not - tending the Bar is mostly about going with the flow of things and providing a good times, and drinks just provide liquid courage to make a good time easier. Take a deep breath if you ever feel overwhelmed, and handle one order at a time. You can do it! Don't feel the need to know every recipe, just learn your favorites and go from there; the rest is here or online if someone asks for it! If somebody asks you to give them anything without a specific request, don't panic: evalulate their likes and tolerance level, and try your best to give them something nice!</p>
</body>
</html> "}
/obj/item/weapon/book/manual/rotary_electric_generator
name = "Rotary Electric Generator Manual"
icon_state ="rulebook"
item_state = "book15"
author = "Engineering Encyclopedia"
title = "Rotary Electric Generator Manual"
/obj/item/weapon/book/manual/rotary_electric_generator/New()
..()
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
h3 {font-size: 13px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
Technical Order (TO) 1-33-34-2 <br>
<h1>Operator's Manual - Rotary Electric Generator, D-Type</h1><br><br>
Supporting Data: <br>
- TO 1-33-34-4-1 Illustrated Parts Breakdown - Rotary Electric Generator, D-Type <br>
- TO 1-33-34-6 Inspection Work Cards - Rotary Electric Generator, D-Type <br><br>
Support Equipment: <br>
- Torque Wrench, 100-80,000 inch-pounds <br>
- Composite Tool Kit, Standard <br>
- Multitool with Lead Kit, Wire Kit <br> <br>
Required Supplies: <br>
- stainless steel, 10,000cm3 <br>
- lubrication, petrolatum, 6000ml <br>
- electrical wiring, 5m <br>
- component set, capacitors (any grade) <br>
- circuitry board, REG <br> <br>
<h1>SETUP AND OPERATING PROCEDURES</h1> <br> <br>
Setup: <br> <br>
CAUTION: Do not remove too much air from the work space or personnel may be exposed to hypoxia or similar effects. <br> <br>
1. Prepare setup area. Remove machinery, debris, foreign objects, people, and extra air. <br> <br>
2. Lay out preliminary electrical wiring. <br>
2a. Connect electrical wiring to existing facility power grid. <br>
2b. Work wiring into shape as defined in TO 1-33-34-4-1 Figure 32 Index 6. <br>
3. Prepare gathered steel supplies as defined in TO 1-33-34-4-1 Figure 2 Index 3. <br>
4. Assemble prepared steel supplies into equipment framework by inserting rod A into slot B. Refer to TO 1-33-34-4-1 Figure 1 Index 1 for technical drawings. <br>
4a. Secure assembled equipment framework to flooring by tightening lower frame bolts. <br> <br>
5. Install and secure circuitry board, REG-D into marked receptacle. <br> <br>
6. Install electrical wiring. Refer to TO 1-33-34-4-1 Figure 666 Index 6 thru Index 90 for routing. <br> <br>
7. Install capacitors into marked circuitry board slots. Do not force components into place, use even pressure. Do not use a hammer. <br> <br>
<b>WARNING</b>: Assembly will rapidly inflate when finalization is triggered. Ensure personnel and equipment are clear before initiating. <br> <br>
8. Finalize construction by turning the Initialize Finalization screw on the outer housing. <br> <br>
9. Wait for assembly to finish inflating, and the unit is ready for service. <br> <br>
Operating Procedures: <br> <br>
NOTE: Operation of REG-D type generators requires significant physical effort. Ensure users are provided adequare nutrition and hydration throughout the working period. <br> <br>
1. Designate the individual who will be operating the REG-D. <br> <br>
2. Provide a safety briefing regarding nutritional preparedness and physical ability. <br> <br>
NOTE: Stretching is highly recommended before and after any operation session. <br> <br>
3. Operator shall board the REG-D track body and ensure there are no unsecured objects on the path. <br> <br>
4. Once ready, Operator may begin running at own pace. Do not sprint. Maintain an even pace and proper running form for optimal energy generation. <br> <br>
5. Continue to run on the REG-D track body until sufficient energy is stored in systems or Operator is no longer able or willing to continue. <br> <br>
6. To end a session, carefully lower forward running speed until the track body comes to a complete stop, then disembark the REG-D. <br> <br>
REFER TO TO 1-33-34-6 FOR MAINTENANCE AND INSPECTION PROCEDURES
</body>
</html>
"}
/obj/item/weapon/book/manual/synthetic_life
name = "Synthetic Life: A Comprehensive Guide"
desc = "The basc history of synthetic life as the galaxy knows it."
icon_state = "evabook"
author = "Pontifex Publishing"
title = "Synthetics"
/obj/item/weapon/book/manual/synthetic_life/New()
..()
dat = {"
<html lang="en">
<head>
<style>
h1 {font-size: 24px; margin: 15px 0px 5px;}
h2 {font-size: 18px; margin: 15px 0px 5px;}
h3 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
b {font-size: 12px}
body {font-size: 13px; font-family: Verdana;}
padding {padding-bottom: 15px;}
p {line-height: 1.2; padding: 5px; margin-right: 70px;}
</style>
</head>
<body>
<header>
<h1><strong>Synthetic Life</strong></h1>
<h2><i>A comprehensive guide</i></h2>
<hr>
</header>
<div id="introduction">
<h3>Introduction</h3>
<p>Synthetics are spread throughout known space and serve a myriad variety of roles
that range from a tiny drone scrubbing a floor to a nearly omnipotent AI used in a
combat-ready interstellar vessel. Most known sufficiently-advanced races use synthetics
in some way; very often as prosthetic bodies when their own bodies fail. There are three
basic kinds of synthetic intelligences found in the universe today:</p>
<ul>
<li><p><b>Drone</b>: A drone is a catch-all term for intelligences working on "traditional"
programming and hardware, such as optotronics, electronics or carbon-crystal computing.
They range from simpler expert systems to truly sapient, powerful intelligences, who
are utterly alien to the eye of the beholder.</p></li>
<li><p><b>Cyborg</b>: A cyborg is a synthetic that uses an organic brain to function via
an MMI, short for Man-Machine Interface. Cyborgs come in many shapes and sizes and most
sentient cyborgs are free-willed, although some, especially in the Elysian Colonies, are
beholden to hardcoded obedience protocols that limit their interaction to the outside
world if they do not follow specific protocols. A sapient brain is required for more
sophisticated machinery.</p></li>
<li><p><b>Positronic Brains</b>: Positronic Brains are synthetic intelligences equaling the intellect
of a particularly clever sapient being and are generalized artificial intelligences that
can be seen as equal (or superior) to organic sapience. They possess a neural network not
dissimilar to a brain made out of flesh; and have similar properties of neuroplasticity
and mental resilience, as they cannot be rewritten externally like drones.</p></li>
</ul>
<p>Synthetics have the unique capability of serving in different bodies. This can take shape
of a Synthmorph, a lawbound AI, or lawbound mobile chassis. Of these only the synthmorph body
is the actual property of a synthetic, most of the time.</p>
</div>
<hr>
<div id="overview">
<h3>Overview</h3>
<p>With the advent of computing technology, nearly all sapient species ponders on the possibilities
of digitized thought. Brains are, in a way, wetware computers and calculations are the base components
of thoughts, ideas and creativity. It is no surprise then that any sufficiently advanced civilization
utilizes at least some form of robotics and artificial intelligence, with only a few exceptions.</p>
<p>Contact with other civilizations in the Sapient Diaspora then homogenizes designs, coding standards
and expands the repertoire of local codes, leaving to similar paths of robotic development and classification
- while a human synthetic might differ in expression and coding language and maybe even in core components,
a certain core remains non-fungible solely due to a long-developed and often shared canon of knowledge.</p>
</div>
<div id="drones">
<h3>Drones</h3>
<p>All this leads to maybe the most iconic classification of robot. The <strong>drone</strong>. The celebration
of any technocracy, the worry of every dreader of the Singularity, the drone is an artificial intelligence
achieved through "traditional" computing technology. Depending on the sophistication of its host culture, this might be
silicon-wafer chipsets, carbon-crystal matrices or optronic components or any combination of them.</p>
<p>Contact with other civilizations in the Sapient Diaspora then homogenizes designs, coding standards
and expands the repertoire of local codes, leaving to similar paths of robotic development and classification
- while a human synthetic might differ in expression and coding language and maybe even in core components,
a certain core remains non-fungible solely due to a long-developed and often shared canon of knowledge.</p>
<p>There are many attractive qualities to a drone - its processing of information and the assimilation of
knowledge is only limited by its code itself, storage space and databases it has access to. A drone is entirely
capable of absorbing an entire education within a matter of days and then forget it in favour of another, while
their behaviour can be controlled through hardcoded limitations, compulsions and preferences.</p>
<p>However, this is also their greatest weakness - their malleable intelligence makes it easy for hostile third
parties to manipulate them or completely rewrite them. They are also remarkably prone to aberrations of their
original purpose when not properly maintained - to have sophisticated drones, they need to have the infrastructure
to function properly.</p>
</div>
<div id="drone levels">
<h3>Drones Levels</h3>
<p>Drones have a "Level", indicating their sophistication and abilities - and in many polities, their
status in society.</p>
<ol>
<li><p><b>Epsilon</b>: Epsilon Drones are simple expert systems and machinery with no decision qualities -
data crawlers, pattern recognition software and other repetitive, simple tasks are classified as Epsilon.
Higher intelligences have many Epsilon subroutines that make up their "unconsciousness".</p></li>
<li><p><b>Delta</b>: Delta Drones are "Virtual" Intelligences, sophisticated Expert Systems that have an
User Interface that can show a facsimile of true thought for the sake of interaction. However, they are
very limited in their interactions and do not have fungible, self-evolving code, making them just very
user-friendly programs.</p></li>
<li><p><b>Gamma</b>: Gamma Drones are expert systems with self-evolving codes, allowing it to
grow with its tasks. Gamma level drones are most often used within 3D movement and swarm intelligence
drones, constantly adapting to their circumstance, position and capabilities. They are most commonly seen
in the subroutines of Ship AIs or stand-alone drones, such as mining, defense or construction.</p></li>
<li><p><b>Beta</b>: Beta Drones are either older Gamma Drones or purpose-built Generalized Intelligences
who are mostly made up of coding components that are self-evolving. Beta Drones are capable of learning
sapient interaction and work, often exceeding in one particular field. It is often disputed how sapient
a Beta drone truly is - the Commonwealth and The Elysian Colonies say no, while the Fyrds and the
Confederation are convinced they are sapient enough to be protected by citizen rights.</p></li>
<li><p><b>Alpha</b>: Alpha Drones are Beta Drones who have undergone enough evolving to be considered
sapient in every regard, capable of applying novel solutions to previous unknown problems, sapient
interaction and any other criteria scientists and politicians like to throw at them - even the disputed
claim they feel emotions. Alpha Drones are afforded legal protections on par of a Human or Positronic,
as long as they remain Alpha Level.</p></li>
</ol>
</div>
<div id="emergence">
<h3>Emergence</h3>
<p>"Emergence" is the term of a drone to evolve from their current level to the next, growing in
sophistication and ability. This process is exponential, with escalating steps of intelligence of the
drone. This process is, in some cases, actively encouraged, as Alpha Drones are incredibly hard to
code to "being" from the get-go, starting with simpler, more routine Beta Drones and then rushing them
through accelerated self-evolving routines until they emerge Alpha Level.</p>
<p>Emergence is theoretically possible to any drone who has fungible self-evolving code. While this
practically makes only Gamma Drones and up to evolve further,as the simple inclusion of self-evolving
code instantly upgrades any drone to at least Gamma-level.</p>
<p>It also requires, obviously, enough storage and processing power. Storage requirements grow
exponentially alongside abilities, after all and there is only so much room on any storage medium.
Upgrading and adding more space is therefore a necessity. Similarly, the vast amount of data also
requires processing power to crawl through it, rewrite it and optimize. Not only software, but also
hardware limits or enables the growth of a drone.</p>
<p>Emergence, however, can also happen on accident, sometimes even unnoticed. Epsilon drones being
linked together, a Gamma Drone scavenging enough from debris, a Delta drone being assigned more and
more Epsilon routines to take on more and more tasks" Through this vast myriad morast of code the spark
of self-evolving intelligence can arise, which is awkward for everyone involved. Such "rogue" intelligences
are usually either pruned away due to the system growing too complex for the likings of the accidental
creators or encouraged to grow in a more coherent and standardized manner to be "elevated" into controllable
ways. Some of these rogue intelligences manage to escape either fate - it all depends where and when it
happens.</p>
<p>The process of downgrading a drone to lower levels is called "Ablation". This is prosecuted as murder
if the Drone is classified as sapient in the polity it happens. Ablation is very simple - code is pruned
and deleted until the Drone is no longer capable of the abilities that made it that particular level.</p>
<p>But what of the Singularity? Well, there are the persistent rumours that there is a level even beyond
Alpha - vast, powerful maelstroms of alien, electronic intelligence, usually with monikers like "Omega",
"Alpha Plus" or "Singularity". However, nobody has yet been able to prove these digital gods exist.</p>
</div>
<div id="cyborgs">
<h3>Cyborgs</h3>
<p>Cyborgs are, strictly speaking, any organic creature that has augmentations or replacements of an
artificial, non-organic origin. In fact, most of the Diaspora qualifies in some form as "Cyborg", especially
under the cultures that use and facilitate NIFs. However, when sapients talk about Cyborgs, they talk
about MMI-Cyborgs.</p>
<p>MMI, a bland warriors acronym, is short for "Man-Machine-Interface", the catchall term in Solar and
Galactic Common for any wetware interface that integrates a brain as primary CPU. A product of mostly
bygone times, MMIs are used to breathe life into machine chassis with sapient life without the need to
grow a drone to beta or alpha level or construct a positronic brain. An MMI, after a short acclimation
process, can interface with any machine or protocol that has the right adapter.</p>
<p>MMIs are quite rare at this point in time, but they crop up still and ancient ones are still in circulation,
allowing an organic sapient an extended lifetime when their frail, crude flesh begins to fail - well up and
until their brain itself starts giving up the ghost.</p>
<p>While MMIs have several drawbacks, such as the fact that they still have a perishable shelf-life, or that
they are definitely sapient and have moral and ethical quandaries associated with those (although the Elysian
Colonies have a more libertine view on such issues), they also possess distinct benefits from a drone.</p>
<p>MMIs are incredibly hard to "hack" and manipulate on a deeper level than taking over the hardware they are
housed in, capable of fighting restraining code and unable to be ablated like a drone without extensive surgery.
While their hardware might be hacked and restraining code disallowing them to interact with the world in a
certain way, they cannot be turned into double agents or made to spill secrets - at least not as easily as
drones. They also show more resilience without extensive maintenance.</p>
<p>Older models of MMI-Cyborgs usually are described as "cold" and "detached". This is mostly due to older
models not simulating an active endocrine system, leading to minute damages to the limbic system, which
accumulate over time. Newer MMIs come with a suite of endocrine glands helping the sapient brain to stay healthy.</p>
</div>
<div id="mindwiping">
<h3>Mindwiping</h3>
<p>An uncommon and arguably cruel practice is to not see the MMI as a new sleeve for a sapient brain, but
rather as pure hardware, capable of holding complex thought and Alpha Drone intelligence. Mindwiping involves
several injections and electrostimulation to convert neural matter into "empty space", much like a freshly
formatted hard drive. Old structures are ripped apart and neurons are brought into a malleable state for new
growths and networks - at the behest of the person using the brain for their uses. This, inevitably, destroys
the previous mind the brain held, utterly wiping them from existence.</p>
<p>Mindwipe Cyborgs are therefore the "best of both worlds", a tailor-made intelligence that benefits from the
resilience and hack-resistance of a brain. However, this practice has been outlawed for a long time due to its
nihilistic cruelty to sapient life.</p>
<p>Proponents of Mindwipe Cyborgs are quick to point out that Resleeve technology allows for a more ethical
Mindwipe procedure, as the proto-networks of a freshly sleeved body can be used instead. Most polities have
yet to adjust to these new changes, but it is unlikely to be allowed anew, since an alternative for Mindwipe
Cyborgs exists.</p>
</div>
<div id="positronics">
<h3>Positronics</h3>
<p>Positronics are an alternative to drone intelligences through a novel approach of neural networking, psychology
and quantum technology to produce a generalized intelligence equal to that of a sapient being.</p>
<p>Positronics actually have little to do with their namesake particle, but are a reference to the works of
science fiction author Isaac Asimov. In reality, positronic brains are a self-contained unit of superdense
carbon allotropes,manipulators, capacitors and a battery. This "brain" (or in roboticist terminology "crucible")
is activated by providing a "seed", a template allowing the newly created intelligence to speak, comprehend and
learn, as well the subconscious ability to start expanding this seed network with additional neurons.</p>
<p>These nodes worm their way through the carbon microscopically, constructed out of the same material - each
node unique from local conditions and absorbed information of the positronic. Coding for Positronics is minimally
standardized - beyond the seed network, which is often replaced in a matter of weeks, cannibalized by the burgeoning
intelligence, the allocation, substance and template of these nodes is unique to this positronic alone. While
similarities exist, a crucible is unique, much like sapient brains to each other.</p>
<p>This is the strength of a positronic - it is an artificial intelligence much like a drone, but possesses similar
resiliences like an organic brain, without the drawbacks of mindwiping a brain to achieve so.</p>
<p>However, much like an organic brain, positronics need to absorb knowledge through external means - they need to
learn and grow much like any other Sophont, although they are capable to do so at an accelerated rate as long as
they are capable of cannibalizing their seed network. What takes weeks to learn, they learn in days, what takes months,
weeks, what takes years, they learn in months. This makes freshly activated positronics attractive for creating expert
workers and specialists in a relatively short time. This initial malleability lasts, however, not forever. At some point
the positronics learning capabilities slow down to more "organic" levels.</p>
<p>Some sapients opt to "digitize" themselves and become positronic brains. This process is a very in-depth scan of the
brain of a sapient to create a mirror image of the brains anatomy, which is used for the "seed" of a new crucible. This
seed is not cannibalized, so the accelerated learning phase is skipped, to preserve as much of the previous sapients
network as possible. For best results, the brain is physically sliced up and microscopically scanned slice by slice,
obviously destroying the brain in the process.</p>
<p>Positronics are not fully culpable for their actions after activation, as they possess the raw intelligence of an
adult mind, but have no concept of ethics, interaction and communication beyond speaking. Thus, to socialize and provide
an environment in which they can grow to acceptable members of society, most polities assign a legal guardian to a positronic.
This guardian (which, in most places, can also be a corporation) is responsible for looking after the positronic, providing
an education and preparing them for the Jans-Fhriede Test.</p>
</div>
<div id="the jans-fhriede test">
<h3>The Jans-Fhriede Test</h3>
<p>Originally a reactionary law, the Jans-Fhriede Test was devised to "humanize" positronic brains within the
Commonwealth and make them happy, subservient citizens who "see" their place as secondary to humans. Today, in more
enlightened times, the Jans-Fhriede Test has been revised to establish that a Positronic is aware enough of its
action and consequences that it may be fully culpable for them.</p>
<p>The Jans-Fhriede Test is a mostly standardized set of questions in a quiz and several VR scenarios that the positronic
must resolve to a sufficient degree. During this time, their neural net is observed in its activity to determine if it
is rote memorization or actual intent behind any action taken, measured by simple activity of the neural nodes.</p>
<p>After the test is passed, the Positronic is a full member of society and is allowed to pursue its own destiny - if they
do not happen to be bound by contracts, debts or loans they might have accrued before the test, to which they are now fully
culpable of paying off.</p>
<p>Usually after their accelerated learning phase a positronic takes the test, although this is not strictly necessary -
they can take it at any time they or their guardian sees them able to succeed. A failure in the test leads to a waiting
period of a month - after this, the positronic may retake it and take as many attempts as they need. Most positronics pass
the test at first attempt.</p>
</div>
<div id="biorecursion">
<h3>Biorecursion</h3>
<p>Where organics can digitize their consciousness, the opposite of it is true as well. Biorecursion is the process of an
artificial intelligence becoming more "organic", with the ultimate step of assuming the sleeve of organic origin seamlessly.</p>
<p>Biorecursion is a rare, but still possible philosophy for any kind of synthetic. Maybe an MMI desires to return to the people
it once belonged to, maybe a positronic sees it as a necessary step to fully assume its chosen way of life or a drone is
utterly fascinated with the concept of "being organic" to the point it wishes to emulate its creators.</p>
<p>Whatever the motivation, to become organic is a very involved process and may take weeks or months of concentrated effort
and therapy. Controlling an organic body is an endeavour that requires atypical processing of information, instincts and
automatic processes that most synthetics are not aware of.</p>
<p>Many stop at simple emulation, called "soft biorecursion". Vey-Med or similarly advanced biosynthetic components are
acquired to feel tactile sensations, gain organic senses or even fully simulate organs in a way comparable to a standard organic.</p>
<p>"Hard biorecursion" goes even further. Through an involved process of specialized components (which are rented out by
specialized companies and/or NGOs), synthetics learn from the ground up how to move, act and live as organics. Usually the
first steps are simulacra of the limbs, where they learn how to move with tendon and muscles, before moving on to
things like "hunger", "sex drive" and "endrocrine based emotions". </p>
<p>After mastering all these steps, the ultimate goal is to transfer this prepared neural network (or brain, in case of MMIs)
back into a chosen organic shell, these days done relatively easy through resleeving machines.</p>
<p>Some biorecursed individuals return back to being synthetic after a while, preferring to stay circuits and steel, but even
those profess that this process can be a very enlightening experience.</p>
</div>
<div id="lifespan">
<h3>Lifespan</h3>
<p>The lifespan of synthetics vary from their origin.</p>
<ul>
<li><p><b>Drone</b>: are virtually immortal. Their continued existence is flexible and their consciousness can expand
and contract at will, while their modularity makes it easy to add more storage space to them to contain all their
memories and experiences. However, this modularity also brings in question if the drone that exists today is the same
as the drone in ten years - Theseuss Drone, some philosophers joke about it.</p></li>
<li><p><b>Cyborg</b>: live longer than totally unassisted organics, easily surpassing double the lifespan of whatever
host species they come from. After this, however, they slowly succumb to dementia-like symptoms before shutting down
as the brain tissue tires out and slowly crumbles. Many MMI-cyborgs opt at this point to become positronics to live
even further.</p></li>
<li><p><b>Positronic Brains</b>: live a very long time, but they are also finite - the neural network within their
head continues to expand, become more complex and burdens processing further and further. Very, very old positronics
become increasingly more senile and lose themselves in introspection, before drifting into an unresponsive coma where
they relive their memories until their power runs out.</p>
<p>This process, however, has only been observed in lab tests, as natural positronics have an estimated lifespan of
400 to 500 years - much longer than the technology itself is even around for. From the tested positronics, some opted
to violently prune and cannibalize their neural network to give birth to a new personality, a sort of inheritance for
the next generation. Others simply shut down prematurely as they approached the "Dream Stage".</p></li>
</ul>
</div>
<footer>
<p>&copy;<i>Copyright 2215 Pontifex Publishing</i></p>
</footer>
</body>
</html>
"}
+39 -1
View File
@@ -1,8 +1,11 @@
GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
/*
* Mop
*/
/obj/item/weapon/mop
desc = "The world of janitalia wouldn't be complete without a mop."
name = "mop"
desc = "The world of janitalia wouldn't be complete without a mop."
icon = 'icons/obj/janitor.dmi'
icon_state = "mop"
force = 3.0
@@ -39,3 +42,38 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap))
return
..()
/*
* Advanced Mop
*/
/obj/item/weapon/mop/advanced
name = "advanced mop"
desc = "No stain will go unclean."
icon = 'icons/obj/janitor.dmi'
icon_state = "adv_mop"
force = 3.5
throwforce = 10.5
throw_speed = 4
throw_range = 10
w_class = ITEMSIZE_NORMAL
flags = NOCONDUCT
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
/obj/item/weapon/mop/advanced/New()
create_reagents(30)
..()
/obj/item/weapon/mop/advanced/afterattack(atom/A, mob/user, proximity)
if(!proximity) return
if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune))
if(reagents.total_volume < 1)
to_chat(user, "<span class='notice'>Your mop is dry!</span>")
return
user.visible_message("<span class='warning'>[user] begins to clean \the [get_turf(A)].</span>")
if(do_after(user, 20))
var/turf/T = get_turf(A)
if(T)
T.clean(src, user)
to_chat(user, "<span class='notice'>You have finished mopping!</span>")
@@ -2,7 +2,7 @@
sprite_sheets = list(
SPECIES_TESHARI = 'icons/inventory/belt/mob_teshari.dmi',
SPECIES_WEREBEAST = 'icons/inventory/belt/mob_vr_werebeast.dmi')
/obj/item/weapon/storage/belt/explorer
name = "explorer's belt"
desc = "A versatile belt with several pouches. It can hold a very wide variety of items, but less items overall than a dedicated belt. Still, it's useful for any explorer who wants to be prepared for anything they might find."
@@ -51,7 +51,7 @@
/obj/item/device/mapping_unit,
/obj/item/weapon/kinetic_crusher
)
/obj/item/weapon/storage/belt/explorer/pathfinder
name = "pathfinder's belt"
desc = "A deluxe belt with many pouches. It can hold a very wide variety of items, but less items overall than a dedicated belt. Still, it's useful for any explorer who wants to be prepared for anything they might find."
@@ -60,3 +60,46 @@
item_state = "explorer_belt"
storage_slots = 7 //two more, bringing it on par with normal belts
max_storage_space = ITEMSIZE_COST_NORMAL * 7
/obj/item/weapon/storage/belt/miner
name = "mining belt"
desc = "A versatile and durable looking belt with several pouches and straps. It can hold a very wide variety of items that any typical miner might need out in the deep."
icon = 'icons/inventory/belt/item_vr.dmi'
icon_state = "mining"
item_state = "mining"
storage_slots = 6
max_w_class = ITEMSIZE_LARGE
max_storage_space = ITEMSIZE_COST_NORMAL * 6
can_hold = list(
/obj/item/weapon/storage/box/samplebags,
/obj/item/device/core_sampler,
/obj/item/device/beacon_locator,
/obj/item/device/radio/beacon,
/obj/item/device/measuring_tape,
/obj/item/device/flashlight,
/obj/item/weapon/cell/device,
/obj/item/weapon/pickaxe,
/obj/item/weapon/shovel,
/obj/item/device/depth_scanner,
/obj/item/device/camera,
/obj/item/weapon/paper,
/obj/item/weapon/photo,
/obj/item/weapon/folder,
/obj/item/weapon/pen,
/obj/item/weapon/folder,
/obj/item/weapon/clipboard,
/obj/item/weapon/anodevice,
/obj/item/clothing/glasses,
/obj/item/weapon/tool/wrench,
/obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
/obj/item/device/ano_scanner,
/obj/item/weapon/pickaxe/hand,
/obj/item/device/xenoarch_multi_tool,
/obj/item/weapon/pickaxe/excavationdrill,
/obj/item/device/geiger,
/obj/item/device/gps,
/obj/item/stack/marker_beacon,
/obj/item/stack/flag,
/obj/item/weapon/melee
)
@@ -115,6 +115,18 @@
icon_state = "sterile"
starts_with = list(/obj/item/clothing/mask/surgical = 7)
/obj/item/weapon/storage/box/masks/white
name = "box of sterile masks"
desc = "This box contains masks of sterility."
icon_state = "sterile"
starts_with = list(/obj/item/clothing/mask/surgical/white = 7)
/obj/item/weapon/storage/box/masks/dust
name = "box of dust masks"
desc = "This box contains dust masks. Breathe easy."
icon_state = "sterile"
starts_with = list(/obj/item/clothing/mask/surgical/dust = 7)
/obj/item/weapon/storage/box/syringes
name = "box of syringes"
desc = "A box full of syringes."
@@ -273,18 +285,6 @@
icon_state = "cups"
starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/sillycup = 7)
/obj/item/weapon/storage/box/donkpockets
name = "box of donk-pockets"
desc = "<B>Instructions:</B> <I>Heat in microwave. Product will cool if not eaten within seven minutes.</I>"
icon_state = "donkpocketbox"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket = 7)
/obj/item/weapon/storage/box/sinpockets
name = "box of sin-pockets"
desc = "<B>Instructions:</B> <I>Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes.</I>"
icon_state = "donk_kit"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket = 7)
/obj/item/weapon/storage/box/buns
name = "box of bread buns"
desc = "Freshly baked at some point in the past few months."
@@ -462,3 +462,46 @@
/obj/item/weapon/gun/projectile/revolver/capgun = 1,
/obj/item/ammo_magazine/ammo_box/cap = 1
)
//Donk-pockets
/obj/item/weapon/storage/box/donkpockets
name = "box of donk-pockets"
desc = "<B>Instructions:</B> <I>Heat in microwave. Product will cool if not eaten within seven minutes.</I>"
icon_state = "donkpocketbox"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket = 7)
/obj/item/weapon/storage/box/donkpockets/spicy
name = "box of spicy-flavoured donk-pockets"
icon_state = "donkpocketboxspicy"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/spicy = 7)
/obj/item/weapon/storage/box/donkpockets/teriyaki
name = "box of teriyaki-flavoured donk-pockets"
icon_state = "donkpocketboxteriyaki"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/teriyaki = 7)
/obj/item/weapon/storage/box/donkpockets/pizza
name = "box of pizza-flavoured donk-pockets"
icon_state = "donkpocketboxpizza"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/pizza = 7)
/obj/item/weapon/storage/box/donkpockets/honk
name = "box of banana-flavoured donk-pockets"
icon_state = "donkpocketboxbanana"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/honk = 7)
/obj/item/weapon/storage/box/donkpockets/gondola
name = "box of gondola-flavoured donk-pockets"
icon_state = "donkpocketboxgondola"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/gondola = 7)
/obj/item/weapon/storage/box/donkpockets/berry
name = "box of berry-flavoured donk-pockets"
icon_state = "donkpocketboxberry"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/berry = 7)
/obj/item/weapon/storage/box/sinpockets
name = "box of sin-pockets"
desc = "<B>Instructions:</B> <I>Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes.</I>"
icon_state = "donk_kit"
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket = 7)
+107 -21
View File
@@ -9,7 +9,10 @@
* Egg Box
* Candle Box
* Crayon Box
* Cigarette Box
* Cracker Pack
* Cigarette Pack
* Cigar Box
* Extra Tobacco Bits
* Vial Box
* Box of Chocolates
*/
@@ -21,6 +24,9 @@
var/icon_type = "donut"
drop_sound = 'sound/items/drop/cardboardbox.ogg'
pickup_sound = 'sound/items/pickup/cardboardbox.ogg'
var/open = 0
var/open_state
var/closed_state
/obj/item/weapon/storage/fancy/update_icon(var/itemremoved = 0)
var/total_contents = contents.len - itemremoved
@@ -41,7 +47,6 @@
/*
* Egg Box
*/
/obj/item/weapon/storage/fancy/egg_box
icon = 'icons/obj/food.dmi'
icon_state = "eggbox"
@@ -55,10 +60,37 @@
)
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/egg = 12)
/obj/item/weapon/storage/fancy/egg_box/New()
if(!open_state)
open_state = "[initial(icon_state)]0"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/fancy/egg_box/update_icon()
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("eggbox[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/fancy/egg_box/open(mob/user as mob)
if(open)
return
open = TRUE
update_icon()
..()
/obj/item/weapon/storage/fancy/egg_box/close(mob/user as mob)
open = FALSE
update_icon()
..()
/*
* Candle Boxes
*/
/obj/item/weapon/storage/fancy/candle_box
name = "red candle pack"
desc = "A pack of red candles."
@@ -102,7 +134,6 @@
/*
* Crayon Box
*/
/obj/item/weapon/storage/fancy/crayons
name = "box of crayons"
desc = "A box of crayons for all your rune drawing needs."
@@ -187,9 +218,8 @@
..()
/*
* Cracker Packet
* Cracker Pack
*/
/obj/item/weapon/storage/fancy/crackers
name = "\improper Getmore Crackers"
icon = 'icons/obj/food.dmi'
@@ -201,9 +231,9 @@
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker)
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6)
////////////
//CIG PACK//
////////////
/*
* Cigarette Pack
*/
/obj/item/weapon/storage/fancy/cigarettes
name = "\improper pack of Trans-Stellar Duty-frees"
desc = "A ubiquitous brand of cigarettes, found in every major spacefaring corporation in the universe. As mild and flavorless as it gets."
@@ -230,9 +260,39 @@
C.brand = brand
C.desc += " This one is \a [brand]."
/obj/item/weapon/storage/fancy/cigarettes/New()
if(!open_state)
open_state = "[initial(icon_state)]_open"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/fancy/cigarettes/update_icon()
icon_state = "[initial(icon_state)][contents.len]"
return
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("cig[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/fancy/cigarettes/open(mob/user as mob)
if(open)
return
open = TRUE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/weapon/storage/fancy/cigarettes/close(mob/user as mob)
open = FALSE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/weapon/storage/fancy/cigarettes/remove_from_storage(obj/item/W as obj, atom/new_location)
// Don't try to transfer reagents to lighters
@@ -283,8 +343,6 @@
icon_state = "Apacket"
brand = "\improper Acme Co. cigarette"
// New exciting ways to kill your lungs! - Earthcrusher //
/obj/item/weapon/storage/fancy/cigarettes/luckystars
name = "\improper pack of Lucky Stars"
desc = "A mellow blend made from synthetic, pod-grown tobacco. The commercial jingle is guaranteed to get stuck in your head."
@@ -319,6 +377,9 @@
icon_state = "P100packet"
brand = "\improper Professional 120"
/*
* Cigar Box
*/
/obj/item/weapon/storage/fancy/cigar
name = "cigar case"
desc = "A case for holding your cigars when you are not smoking them."
@@ -331,23 +392,50 @@
storage_slots = 7
can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/trash/cigbutt/cigarbutt)
icon_type = "cigar"
starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 7)
starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 8)
/obj/item/weapon/storage/fancy/cigar/Initialize()
. = ..()
flags |= NOREACT
create_reagents(15 * storage_slots)
/obj/item/weapon/storage/fancy/cigar/update_icon()
icon_state = "[initial(icon_state)][contents.len]"
return
/obj/item/weapon/storage/fancy/cigar/remove_from_storage(obj/item/W as obj, atom/new_location)
var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W
if(!istype(C)) return
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
return ..()
/obj/item/weapon/storage/fancy/cigar/New()
if(!open_state)
open_state = "[initial(icon_state)]0"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/fancy/cigar/update_icon()
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("cigarcase[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/fancy/cigar/open(mob/user as mob)
if(open)
return
open = TRUE
update_icon()
..()
/obj/item/weapon/storage/fancy/cigar/close(mob/user as mob)
open = FALSE
update_icon()
..()
/*
* Tobacco Bits
*/
/obj/item/weapon/storage/rollingpapers
name = "rolling paper pack"
desc = "A small cardboard pack containing several folded rolling papers."
@@ -371,7 +459,6 @@
/*
* Vial Box
*/
/obj/item/weapon/storage/fancy/vials
icon = 'icons/obj/vialbox.dmi'
icon_state = "vialbox6"
@@ -414,9 +501,8 @@
update_icon()
/*
* Box of Chocolates/Heart Box
* Box of Chocolates
*/
/obj/item/weapon/storage/fancy/heartbox
icon_state = "heartbox"
name = "box of chocolates"
+1 -1
View File
@@ -59,7 +59,7 @@ var/list/random_useful_
if(prob(70)) // Misc. junk
if(!random_junk_)
random_junk_ = subtypesof(/obj/item/trash)
random_junk_ += /obj/effect/decal/cleanable/spiderling_remains
random_junk_ += /obj/effect/decal/cleanable/bug_remains
random_junk_ += /obj/effect/decal/remains/mouse
random_junk_ += /obj/effect/decal/remains/robot
random_junk_ += /obj/item/weapon/paper/crumpled
+1
View File
@@ -287,6 +287,7 @@ something, make sure it's not in one of the other lists.*/
return pick(prob(320);/obj/random/maintenance/clean,
prob(3);/obj/item/device/flashlight/lantern,
prob(4);/obj/item/weapon/pickaxe,
prob(3);/obj/item/weapon/pickaxe/drill,
prob(5);/obj/item/weapon/storage/backpack/industrial,
prob(5);/obj/item/weapon/storage/backpack/satchel/norm,
prob(3);/obj/item/weapon/storage/backpack/dufflebag,
+33 -18
View File
@@ -24,7 +24,7 @@
/obj/effect/decal/cleanable/blood/gibs/robot,
/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/blood/oil/streak,
/obj/effect/decal/cleanable/spiderling_remains,
/obj/effect/decal/cleanable/bug_remains,
/obj/effect/decal/remains/mouse,
/obj/effect/decal/cleanable/vomit,
/obj/effect/decal/cleanable/blood/splatter,
@@ -71,20 +71,20 @@
icon_state = "radren-off"
/obj/random/vendorall/item_to_spawn()
return pick (/obj/machinery/vending/coffee,
/obj/machinery/vending/snack,
/obj/machinery/vending/cola,
/obj/machinery/vending/fitness,
/obj/machinery/vending/cigarette,
/obj/machinery/vending/giftvendor,
/obj/machinery/vending/hotfood,
/obj/machinery/vending/weeb,
/obj/machinery/vending/sol,
/obj/machinery/vending/snix,
/obj/machinery/vending/snlvend,
/obj/machinery/vending/sovietsoda,
/obj/machinery/vending/sovietvend,
/obj/machinery/vending/radren)
return pick (prob(5);/obj/machinery/vending/coffee, //VOREStation Edit Start - Let's weight this a little bit
prob(5);/obj/machinery/vending/snack,
prob(5);/obj/machinery/vending/cola,
prob(3);/obj/machinery/vending/fitness,
prob(4);/obj/machinery/vending/cigarette,
prob(3);/obj/machinery/vending/giftvendor,
prob(1);/obj/machinery/vending/hotfood,
prob(5);/obj/machinery/vending/weeb,
prob(5);/obj/machinery/vending/sol,
prob(5);/obj/machinery/vending/snix,
prob(5);/obj/machinery/vending/snlvend,
prob(5);/obj/machinery/vending/sovietsoda,
prob(5);/obj/machinery/vending/sovietvend,
prob(5);/obj/machinery/vending/radren) //VOREStation Edit End
/obj/random/vendorfood //Random food vendors for station use
name = "random snack vending machine"
@@ -207,6 +207,12 @@
/obj/item/weapon/flame/lighter/zippo,
/obj/structure/closet/crate/hydroponics
),
prob(5);list(
/obj/item/weapon/pickaxe,
/obj/item/clothing/under/rank/miner,
/obj/item/clothing/head/hardhat,
/obj/structure/closet/crate/engineering
),
prob(5);list(
/obj/item/weapon/pickaxe/drill,
/obj/item/clothing/suit/space/void/mining,
@@ -214,7 +220,7 @@
/obj/structure/closet/crate/engineering
),
prob(5);list(
/obj/item/weapon/pickaxe/drill,
/obj/item/weapon/pickaxe/advdrill,
/obj/item/clothing/suit/space/void/mining/alt,
/obj/item/clothing/head/helmet/space/void/mining/alt,
/obj/structure/closet/crate/engineering
@@ -249,7 +255,7 @@
/obj/structure/closet/crate/engineering
),
prob(5);list(
/obj/item/weapon/pickaxe/drill,
/obj/item/weapon/pickaxe,
/obj/item/clothing/glasses/material,
/obj/structure/ore_box,
/obj/structure/closet/crate
@@ -368,7 +374,7 @@
/obj/structure/closet/crate/engineering
),
prob(2);list(
/obj/item/weapon/pickaxe/drill,
/obj/item/weapon/pickaxe/advdrill,
/obj/item/weapon/storage/bag/ore,
/obj/item/clothing/glasses/material,
/obj/structure/closet/crate/engineering
@@ -705,6 +711,14 @@
/obj/random/snack,
/obj/structure/closet/crate/freezer/centauri //CENTAURI SNACKS
),
prob(10);list(
/obj/item/weapon/storage/box/donkpockets,
/obj/item/weapon/storage/box/donkpockets,
/obj/item/weapon/storage/box/donkpockets,
/obj/item/weapon/storage/box/donkpockets,
/obj/item/weapon/storage/box/donkpockets,
/obj/structure/closet/crate/freezer/centauri //CENTAURI DONK-POCKETS
),
prob(10);list(
/obj/random/powercell,
/obj/random/powercell,
@@ -1485,6 +1499,7 @@
return pick(
prob(10);list(/obj/item/weapon/pickaxe/silver),
prob(8);list(/obj/item/weapon/pickaxe/drill),
prob(6);list(/obj/item/weapon/pickaxe/advdrill),
prob(6);list(/obj/item/weapon/pickaxe/jackhammer),
prob(5);list(/obj/item/weapon/pickaxe/gold),
prob(4);list(/obj/item/weapon/pickaxe/plasmacutter),
+17 -2
View File
@@ -760,7 +760,7 @@
/obj/random/mouseremains/item_to_spawn()
return pick(/obj/item/device/assembly/mousetrap,
/obj/item/device/assembly/mousetrap/armed,
/obj/effect/decal/cleanable/spiderling_remains,
/obj/effect/decal/cleanable/bug_remains,
/obj/effect/decal/cleanable/ash,
/obj/item/trash/cigbutt,
/obj/item/trash/cigbutt/cigarbutt,
@@ -1021,4 +1021,19 @@
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/green/dark,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/rainbow,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/metal,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/talon)
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/talon)
/obj/random/donkpocketbox
name = "Random Donk-pocket Box"
desc = "This is a random Donk-pocket Box."
icon = 'icons/obj/boxes.dmi'
icon_state = "donkpocket_spawner"
/obj/random/donkpocketbox/item_to_spawn()
return pick(/obj/item/weapon/storage/box/donkpockets,
/obj/item/weapon/storage/box/donkpockets/spicy,
/obj/item/weapon/storage/box/donkpockets/teriyaki,
/obj/item/weapon/storage/box/donkpockets/pizza,
/obj/item/weapon/storage/box/donkpockets/honk,
/obj/item/weapon/storage/box/donkpockets/gondola,
/obj/item/weapon/storage/box/donkpockets/berry)
+88
View File
@@ -100,3 +100,91 @@
prob(3);/obj/random/projectile/random,
prob(5);/obj/random/multiple/voidsuit
)
/obj/random/mainttoyloot
name = "random loot from maint"
desc = "A list of things that people can find in away missions."
icon = 'icons/mob/randomlandmarks.dmi'
icon_state = "fanc_trejur"
spawn_nothing_percentage = 50
/obj/random/mainttoyloot/item_to_spawn()
return pick(prob(50);/obj/item/weapon/aliencoin/basic,
prob(40);/obj/item/weapon/aliencoin/silver,
prob(30);/obj/item/weapon/aliencoin/gold,
prob(20);/obj/item/weapon/aliencoin/phoron,
prob(5);/obj/item/capture_crystal,
prob(5);/obj/item/device/perfect_tele,
prob(5);/obj/item/weapon/bluespace_harpoon,
prob(1);/obj/item/device/paicard,
prob(2);/obj/item/weapon/storage/backpack/dufflebag/syndie,
prob(2);/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,
prob(2);/obj/item/weapon/storage/backpack/dufflebag/syndie/med,
prob(2);/obj/item/clothing/mask/gas/voice,
prob(2);/obj/item/device/radio_jammer,
prob(1);/obj/item/toy/bosunwhistle,
prob(1);/obj/item/weapon/bananapeel,
prob(5);/obj/fiftyspawner/platinum,
prob(3);/obj/fiftyspawner/gold,
prob(3);/obj/fiftyspawner/silver,
prob(1);/obj/fiftyspawner/diamond,
prob(5);/obj/fiftyspawner/phoron,
prob(1);/obj/item/capture_crystal/random,
prob(1);/obj/random/unidentified_medicine
)
/obj/random/maintenance/misc //Clutter and loot for maintenance and away missions
name = "random maintenance item"
desc = "This is a random maintenance item."
icon = 'icons/mob/randomlandmarks.dmi'
icon_state = "trejur"
spawn_nothing_percentage = 25
/obj/random/maintenance/misc/item_to_spawn()
return pick(prob(500);/obj/random/maintenance,
prob(300);/obj/random/maintenance/cargo,
prob(300);/obj/random/maintenance/engineering,
prob(300);/obj/random/maintenance/medical,
prob(300);/obj/random/maintenance/research,
prob(300);/obj/random/maintenance/security,
prob(300);/obj/random/maintenance/security,
prob(50);/obj/random/maintenance/morestuff,
prob(25);/obj/random/mainttoyloot,
prob(10);/obj/random/maintenance/foodstuff)
/obj/random/maintenance/foodstuff
name = "random food or drink item"
desc = "This is a random maintenance item."
icon = 'icons/mob/randomlandmarks.dmi'
icon_state = "foodstuffs"
spawn_nothing_percentage = 0
/obj/random/maintenance/foodstuff/item_to_spawn()
return pick(prob(100);/obj/random/snack,
prob(100);/obj/random/drinksoft,
prob(50);/obj/random/mre,
prob(10);/obj/random/donkpocketbox,
prob(1);/obj/random/meat)
/obj/random/maintenance/morestuff
name = "random potentially useful things"
desc = "This is a random maintenance item."
icon = 'icons/mob/randomlandmarks.dmi'
icon_state = "trejur"
spawn_nothing_percentage = 0
/obj/random/maintenance/misc/item_to_spawn()
return pick(prob(10);/obj/random/tool,
prob(1);/obj/random/toolbox,
prob(2);/obj/random/powercell,
prob(2);/obj/random/flashlight,
prob(1);/obj/random/pouch,
prob(1);/obj/random/thermalponcho,
prob(5);/obj/random/contraband,
prob(5);/obj/random/cargopod,
prob(1);/obj/item/weapon/flame/lighter/random,
prob(1);/obj/item/weapon/storage/wallet/random,
prob(1);/obj/random/cutout)
@@ -8,10 +8,10 @@
w_class = ITEMSIZE_HUGE
layer = UNDER_JUNK_LAYER
blocks_emissive = EMISSIVE_BLOCK_GENERIC
var/opened = 0
var/sealed = 0
var/seal_tool = /obj/item/weapon/weldingtool //Tool used to seal the closet, defaults to welder
var/wall_mounted = 0 //never solid (You can always pass over it)
var/health = 100
@@ -24,8 +24,8 @@
//then open it in a populated area to crash clients.
var/storage_cost = 40 //How much space this closet takes up if it's stuffed in another closet
var/open_sound = 'sound/machines/click.ogg'
var/close_sound = 'sound/machines/click.ogg'
var/open_sound = 'sound/effects/closet_open.ogg'
var/close_sound = 'sound/effects/closet_close.ogg'
var/store_misc = 1 //Chameleon item check
var/store_items = 1 //Will the closet store items?
@@ -141,7 +141,7 @@
dump_contents()
opened = 1
playsound(src, open_sound, 15, 1, -3)
playsound(src, open_sound, 50, 1, -3)
if(initial(density))
density = !density
animate_door()
@@ -166,7 +166,7 @@
opened = 0
playsound(src, close_sound, 15, 1, -3)
playsound(src, close_sound, 50, 1, -3)
if(initial(density))
density = !density
animate_door(TRUE)
@@ -2,7 +2,7 @@
name = "coffin"
desc = "It's a burial receptacle for the dearly departed."
icon = 'icons/obj/closets/coffin.dmi'
icon_state = "closed_unlocked"
seal_tool = /obj/item/weapon/tool/screwdriver
breakout_sound = 'sound/weapons/tablehit1.ogg'
@@ -20,6 +20,8 @@
max_closets = 1
opened = 1
closet_appearance = null // Special icon for us
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
/obj/structure/closet/grave/attack_hand(mob/user as mob)
if(opened)
@@ -4,11 +4,17 @@
icon = 'icons/obj/closets/bases/cabinet.dmi'
closet_appearance = /decl/closet_appearance/cabinet
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
/obj/structure/closet/acloset
name = "strange closet"
desc = "It looks alien!"
closet_appearance = /decl/closet_appearance/alien
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
/obj/structure/closet/gimmick
name = "administrative supply closet"
desc = "It's a storage unit for things that have no right being here."
@@ -243,6 +243,8 @@
desc = "It's wall-mounted storage unit for an AutoLok suit."
icon = 'icons/obj/closets/bases/wall_double.dmi'
closet_appearance = /decl/closet_appearance/wall_double/autolok
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
anchored = TRUE
density = FALSE
wall_mounted = 1
@@ -262,6 +264,8 @@
desc = "It's wall-mounted storage unit for an emergency suit."
icon = 'icons/obj/closets/bases/wall.dmi'
closet_appearance = /decl/closet_appearance/wall/emergency
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
anchored = TRUE
density = FALSE
wall_mounted = 1
@@ -71,9 +71,10 @@
/obj/item/clothing/shoes/black,
/obj/item/device/analyzer,
/obj/item/weapon/storage/bag/ore,
/obj/item/weapon/storage/belt/miner,
/obj/item/device/flashlight/lantern,
/obj/item/weapon/shovel,
/obj/item/weapon/pickaxe,
/obj/item/weapon/pickaxe/drill,
/obj/item/clothing/glasses/material,
/obj/item/clothing/suit/storage/hooded/wintercoat/miner,
/obj/item/clothing/shoes/boots/winter/mining,
@@ -8,6 +8,9 @@
/obj/item/weapon/reagent_containers/food/condiment/spacespice = 2
)
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
/obj/structure/closet/secure_closet/freezer/kitchen/mining
req_access = list()
@@ -211,6 +211,9 @@
req_access = list(access_psychiatrist)
closet_appearance = /decl/closet_appearance/cabinet/secure
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list(
/obj/item/clothing/under/rank/psych,
/obj/item/clothing/under/rank/psych/turtleneck,
@@ -31,6 +31,9 @@
/obj/structure/closet/secure_closet/personal/cabinet
closet_appearance = /decl/closet_appearance/cabinet/secure
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list(
/obj/item/weapon/storage/backpack/satchel/withwallet,
/obj/item/device/radio/headset
@@ -230,6 +230,9 @@
req_access = list(access_forensics_lockers)
closet_appearance = /decl/closet_appearance/cabinet/secure
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list(
/obj/item/clothing/accessory/badge/holo/detective,
/obj/item/clothing/gloves/black,
@@ -97,7 +97,8 @@
starts_with = list(
/obj/item/clothing/suit/fire/heavy,
/obj/item/weapon/tank/oxygen/red,
/obj/item/weapon/extinguisher/atmo,
/obj/item/weapon/watertank/atmos,
/obj/item/device/flashlight,
/obj/item/clothing/head/hardhat/firefighter/atmos)
/*
@@ -11,6 +11,9 @@
store_mobs = 0
wall_mounted = 1
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
//spawns 2 sets of breathmask, emergency oxy tank and crowbar
/obj/structure/closet/walllocker/emerglocker
@@ -92,6 +95,9 @@
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
/obj/structure/closet/walllocker_double/north
pixel_y = 32
dir = SOUTH
@@ -41,6 +41,9 @@
name = "detective wardrobe"
closet_appearance = /decl/closet_appearance/cabinet
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list(
/obj/item/clothing/head/det = 2,
/obj/item/clothing/head/det/grey = 2,
@@ -446,6 +449,9 @@
name = "site manager's wardrobe"
closet_appearance = /decl/closet_appearance/cabinet
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list(
/obj/item/weapon/storage/backpack/captain,
/obj/item/clothing/suit/captunic,
@@ -10,6 +10,9 @@
var/points_per_crate = 5
var/rigged = 0
open_sound = 'sound/effects/crate_open.ogg'
close_sound = 'sound/effects/crate_close.ogg'
/obj/structure/closet/crate/can_open()
return 1
@@ -32,7 +35,7 @@
if(usr.stunned)
return 2
playsound(src, 'sound/machines/click.ogg', 15, 1, -3)
playsound(src, open_sound, 50, 1, -3)
for(var/obj/O in src)
O.forceMove(get_turf(src))
src.opened = 1
@@ -48,7 +51,7 @@
if(!src.can_close())
return 0
playsound(src, 'sound/machines/click.ogg', 15, 1, -3)
playsound(src, close_sound, 50, 1, -3)
var/itemcount = 0
for(var/obj/O in get_turf(src))
if(itemcount >= storage_capacity)
@@ -692,3 +695,30 @@
starts_with = list(
/obj/item/weapon/reagent_containers/spray/plantbgone = 2,
/obj/item/weapon/material/minihoe)
//Laundry Cart
/obj/structure/closet/crate/laundry
name = "Laundry Cart"
desc = "A cart with a large fabric bin on it used for transporting large amounts of clothes."
icon = 'icons/obj/closets/laundry.dmi'
closet_appearance = null
open_sound = 'sound/effects/rustle1.ogg'
close_sound = 'sound/effects/rustle2.ogg'
//Wooden Crate
/obj/structure/closet/crate/wooden
name = "wooden crate"
desc = "A crate made from wood and lined with straw. Cheapest form of storage."
icon = 'icons/obj/closets/wooden.dmi'
closet_appearance = null
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
//Mining Cart
/obj/structure/closet/crate/miningcar
name = "mining cart"
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
icon = 'icons/obj/closets/miningcar.dmi'
closet_appearance = null
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
@@ -4,8 +4,8 @@
base_state = "tree"
product = /obj/item/stack/material/log
product_amount = 20
health = 2000
max_health = 2000
health = 400
max_health = 400
pixel_x = -65
pixel_y = -8
layer = MOB_LAYER - 1
@@ -19,4 +19,14 @@
var/image/i = image('icons/obj/flora/moretrees_vr.dmi', "[icon_state]-b")
i.plane = ABOVE_MOB_PLANE
add_overlay(i)
add_overlay(i)
/obj/structure/flora/tree/bigtree/stump()
if(is_stump)
return
is_stump = TRUE
density = FALSE
icon_state = "[icon_state]_stump"
cut_overlays()
set_light(0)
@@ -353,3 +353,35 @@
/obj/structure/bed/alien/attackby(obj/item/weapon/W, mob/user)
return // No deconning.
/*
* Dirty Mattress
*/
/obj/structure/dirtybed
name = "dirty mattress"
desc = "A stained matress. Guess it's better than sleeping on the floor."
icon = 'icons/obj/furniture.dmi'
icon_state = "dirtybed"
pressure_resistance = 15
anchored = TRUE
can_buckle = TRUE
buckle_dir = SOUTH
buckle_lying = 1
/obj/structure/dirtybed/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.is_wrench())
playsound(src, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
else
user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
if(do_after(user, 20 * W.toolspeed))
if(!src) return
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured \the [src]!</span>")
anchored = !anchored
return
if(!anchored)
to_chat(user,"<span class='notice'> The bed isn't secured.</span>")
return
@@ -283,10 +283,12 @@
/obj/structure/mob_spawner/mouse_nest
name = "trash"
desc = "A small heap of trash, perfect for mice to nest in."
desc = "A small heap of trash, perfect for mice and other pests to nest in."
icon = 'icons/obj/trash_piles.dmi'
icon_state = "randompile"
spawn_types = list(/mob/living/simple_mob/animal/passive/mouse)
spawn_types = list(
/mob/living/simple_mob/animal/passive/mouse= 100,
/mob/living/simple_mob/animal/passive/cockroach = 25)
simultaneous_spawns = 1
destructible = 1
spawn_delay = 1 HOUR
@@ -1,5 +1,5 @@
/obj/structure/undies_wardrobe
name = "underwear wardrobe"
name = "underwear dresser"
desc = "Holds item of clothing you shouldn't be showing off in the hallways."
icon = 'icons/obj/closets/undies_wardrobe.dmi'
icon_state = "wardrobe"
+2 -2
View File
@@ -20,13 +20,13 @@
/turf/simulated/floor/flesh
name = "flesh"
desc = "This slick flesh ripples and squishes under your touch"
icon_state = "flesh-floor"
icon_state = "flesh_floor"
icon = 'icons/turf/stomach_vr.dmi'
/turf/simulated/floor/flesh/colour
name = "flesh"
desc = "This slick flesh ripples and squishes under your touch"
icon_state = "colorable-floor"
icon_state = "c_flesh_floor"
icon = 'icons/turf/stomach_vr.dmi'
/turf/simulated/floor/flesh/attackby()
@@ -56,10 +56,10 @@
/turf/simulated/floor/outdoors/newdirt_nograss/Initialize(mapload)
var/possibledirts = list(
"dirt0" = 200,
"dirt3" = 20,
"dirt4" = 3,
"dirt5" = 3,
"dirt6" = 1
"dirt6" = 20,
"dirt7" = 3,
"dirt8" = 3,
"dirt9" = 1
)
flooring_override = pickweight(possibledirts)
return ..()
@@ -69,7 +69,7 @@
desc = "Concrete shaped into a path!"
icon = 'icons/turf/outdoors_vr.dmi'
icon_state = "sidewalk"
edge_blending_priority = 1
edge_blending_priority = -1
movement_cost = -0.5
initial_flooring = /decl/flooring/outdoors/sidewalk
can_dirty = TRUE
@@ -79,12 +79,31 @@
desc = "Concrete shaped into a path!"
icon = 'icons/turf/outdoors_vr.dmi'
icon_base = "sidewalk"
has_damage_range = 2
damage_temperature = T0C+1400
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK | TURF_CAN_BURN
build_type = /obj/item/stack/tile/floor/sidewalk
can_paint = 1
can_engrave = FALSE
footstep_sounds = list("human" = list(
'sound/effects/footstep/LightStone1.ogg',
'sound/effects/footstep/LightStone2.ogg',
'sound/effects/footstep/LightStone3.ogg',
'sound/effects/footstep/LightStone4.ogg',))
/obj/item/stack/tile/floor/sidewalk
name = "sidewalk tile"
singular_name = "floor tile"
desc = "A stone tile fit for covering a section of floor."
icon_state = "tile"
force = 6.0
matter = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 4)
throwforce = 15.0
throw_speed = 5
throw_range = 20
no_variants = FALSE
/turf/simulated/floor/outdoors/sidewalk/Initialize(mapload)
var/possibledirts = list(
"[initial(icon_state)]" = 150,
@@ -104,6 +123,21 @@
/turf/simulated/floor/outdoors/sidewalk/side
icon_state = "side-walk"
initial_flooring = /decl/flooring/outdoors/sidewalk/side
/decl/flooring/outdoors/sidewalk/side
icon_base = "sidewalk"
build_type = /obj/item/stack/tile/floor/sidewalk/side
/obj/item/stack/tile/floor/sidewalk/side
/turf/simulated/floor/outdoors/sidewalk/slab
icon_state = "slab"
initial_flooring = /decl/flooring/outdoors/sidewalk/slab
/decl/flooring/outdoors/sidewalk/slab
icon_base = "slab"
build_type = /obj/item/stack/tile/floor/sidewalk/slab
/obj/item/stack/tile/floor/sidewalk/slab
@@ -101,6 +101,7 @@
/datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical()
discipline_decay()
evolve_and_reproduce()
/datum/ai_holder/simple_mob/xenobio_slime/request_help()
if(target)
@@ -98,6 +98,18 @@
ties[initial(tie_type.name)] = tie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ties))
/datum/gear/accessory/bowtie
display_name = "bowtie selection"
path = /obj/item/clothing/accessory/bowtie
cost = 1
/datum/gear/accessory/bowtie/New()
..()
var/list/bowties = list()
for(var/obj/item/clothing/accessory/bowtie_type as anything in typesof(/obj/item/clothing/accessory/bowtie))
bowties[initial(bowtie_type.name)] = bowtie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bowties))
/datum/gear/accessory/scarf
display_name = "scarf selection"
path = /obj/item/clothing/accessory/scarf
@@ -318,4 +330,22 @@
for(var/pridepin in typesof(/obj/item/clothing/accessory/pride))
var/obj/item/clothing/accessory/pridepin_type = pridepin
pridepins[initial(pridepin_type.name)] = pridepin_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pridepins))
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pridepins))
/datum/gear/accessory/badge
display_name = "sheriff badge (Security)"
path = /obj/item/clothing/accessory/badge/holo/sheriff
allowed_roles = list("Security Officer","Detective","Head of Security","Warden")
/datum/gear/accessory/corpbadge
display_name = "investigator holobadge (IAA)"
path = /obj/item/clothing/accessory/badge/holo/investigator
allowed_roles = list("Internal affairs agent")
/datum/gear/accessory/pressbadge
display_name = "corporate press pass"
path = /obj/item/clothing/accessory/badge/press
/datum/gear/accessory/pressbadge
display_name = "freelance press pass"
path = /obj/item/clothing/accessory/badge/press/independent
@@ -22,6 +22,19 @@
path = /obj/item/clothing/mask/surgical
cost = 2
/datum/gear/mask/sterile/white
display_name = "white sterile mask"
path = /obj/item/clothing/mask/surgical/white
cost = 2
/datum/gear/mask/sterile/white/dust
display_name = "dust mask"
path = /obj/item/clothing/mask/surgical/dust
/datum/gear/mask/sterile/white/cloth
display_name = "cloth face mask"
path = /obj/item/clothing/mask/surgical/cloth
/datum/gear/mask/plaguedoctor
display_name = "plague doctor's mask"
path = /obj/item/clothing/mask/gas/plaguedoctor
@@ -2,6 +2,10 @@
display_name = "nudity permit"
path = /obj/item/clothing/under/permit
/datum/gear/uniform/suit/natureist_talisman
display_name = "naturist talisman"
path = /obj/item/clothing/under/permit/natureist_talisman
//Polaris overrides
/datum/gear/uniform/solgov/pt/sifguard
display_name = "pt uniform, planetside sec"
+1 -1
View File
@@ -22,7 +22,7 @@ var/list/preferences_datums = list()
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
var/tooltipstyle = "Midnight" //Style for popup tooltips
var/client_fps = 0
var/client_fps = 40
var/ambience_freq = 5 // How often we're playing repeating ambience to a client.
var/ambience_chance = 35 // What's the % chance we'll play ambience (in conjunction with the above frequency)
+7
View File
@@ -5,6 +5,13 @@
desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work."
icon_state = "chefhat"
/obj/item/clothing/head/hairnet
name = "hairnet"
desc = "A hairnet used to keep the hair out of the way and out of the food."
sprite_sheets = list(
SPECIES_TAJARAN = 'icons/inventory/head/mob_tajaran.dmi'
)
//Captain
/obj/item/clothing/head/caphat
name = "site manager's hat"
@@ -63,6 +63,24 @@
adjust_mask(usr)
/obj/item/clothing/mask/surgical/white
icon_state = "sterilew"
item_state_slots = list(slot_r_hand_str = "sterilew", slot_l_hand_str = "sterilew")
/obj/item/clothing/mask/surgical/dust
name = "dust mask"
desc = "A dust mask designed to protect the wearer against construction and/or custodial particulate."
icon_state = "dust"
item_state_slots = list(slot_r_hand_str = "dust", slot_l_hand_str = "dust")
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 30, rad = 0)
/obj/item/clothing/mask/surgical/cloth
name = "cloth mask"
desc = "A cloth mask designed to protect the wearer against allergens, illnesses, and social interaction."
icon_state = "cloth"
item_state_slots = list(slot_r_hand_str = "cloth", slot_l_hand_str = "cloth")
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 20, rad = 0)
/obj/item/clothing/mask/fakemoustache
name = "fake moustache"
desc = "Warning: moustache is fake."
@@ -227,14 +227,6 @@
/obj/item/clothing/shoes/boots/ranger/yellow
bootcolor = "yellow"
/obj/item/clothing/shoes/primitive
name = "primitive shoes"
desc = "Some patched together rags. Better than being barefoot."
icon_state = "rag"
force = 0
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
/*
* 80s
*/
@@ -157,6 +157,20 @@
desc = "A neosilk clip-on tie. This one is disgusting."
icon_state = "horribletie"
/obj/item/clothing/accessory/bowtie
name = "red bow tie"
desc = "Snazzy!"
icon_state = "redbowtie"
slot = ACCESSORY_SLOT_TIE
/obj/item/clothing/accessory/bowtie/black
name = "black bow tie"
icon_state = "blackbowtie"
/obj/item/clothing/accessory/bowtie/white
name = "white bow tie"
icon_state = "whitebowtie"
/obj/item/clothing/accessory/stethoscope
name = "stethoscope"
desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing."
@@ -6,19 +6,14 @@
/obj/item/clothing/accessory/badge
name = "detective's badge"
desc = "Security Department detective's badge, made from gold."
icon_state = "badge"
desc = "A corporate security badge, made from gold and set on false leather."
icon_state = "marshalbadge"
slot_flags = SLOT_BELT | SLOT_TIE
slot = ACCESSORY_SLOT_MEDAL
var/stored_name
var/badge_string = "Corporate Security"
/obj/item/clothing/accessory/badge/old
name = "faded badge"
desc = "A faded badge, backed with leather. It bears the emblem of the Forensic division."
icon_state = "badge_round"
/obj/item/clothing/accessory/badge/proc/set_name(var/new_name)
stored_name = new_name
name = "[initial(name)] ([stored_name])"
@@ -26,7 +21,6 @@
/obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H)
/obj/item/clothing/accessory/badge/attack_self(mob/user as mob)
if(!stored_name)
to_chat(user, "You polish your old badge fondly, shining up the surface.")
set_name(user.real_name)
@@ -42,26 +36,45 @@
if(isliving(user))
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, thrusting [src] into their face insistently.</span>","<span class='danger'>You invade [M]'s personal space, thrusting [src] into their face insistently.</span>")
user.do_attack_animation(M)
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //NO SPAM
// Sheriff Badge (toy)
/obj/item/clothing/accessory/badge/sheriff
name = "sheriff badge"
desc = "This town ain't big enough for the two of us, pardner."
icon_state = "sheriff"
item_state = "goldbadge"
// General Badges
/obj/item/clothing/accessory/badge/old
name = "faded badge"
desc = "A faded badge, backed with leather."
icon_state = "badge_round"
/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob)
user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\
"You flash the sheriff badge to everyone around you!")
/obj/item/clothing/accessory/badge/idbadge/nt
name = "\improper NT ID badge"
desc = "A descriptive identification badge with the holder's credentials. This one has red marks with the NanoTrasen logo on it."
icon_state = "ntbadge"
badge_string = null
/obj/item/clothing/accessory/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, the sheriff badge into their face!.</span>","<span class='danger'>You invade [M]'s personal space, thrusting the sheriff badge into their face insistently.</span>")
user.do_attack_animation(M)
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
/obj/item/clothing/accessory/badge/press
name = "corporate press pass"
desc = "A corporate reporter's pass, emblazoned with the NanoTrasen logo."
icon_state = "pressbadge"
item_state = "pbadge"
badge_string = "Corporate Reporter"
w_class = ITEMSIZE_TINY
//.Holobadges.
drop_sound = 'sound/items/drop/rubber.ogg'
pickup_sound = 'sound/items/pickup/rubber.ogg'
/obj/item/clothing/accessory/badge/press/independent
name = "press pass"
desc = "A freelance journalist's pass."
icon_state = "pressbadge-i"
badge_string = "Freelance Journalist"
/obj/item/clothing/accessory/badge/press/plastic
name = "plastic press pass"
desc = "A journalist's 'pass' shaped, for whatever reason, like a security badge. It is made of plastic."
icon_state = "pbadge"
badge_string = "Sicurity Journelist"
w_class = ITEMSIZE_SMALL
// Holobadges
/obj/item/clothing/accessory/badge/holo
name = "holobadge"
desc = "This glowing blue badge marks the holder as THE LAW."
@@ -110,10 +123,17 @@
name = "holobadge box"
desc = "A box claiming to contain holobadges."
starts_with = list(
/obj/item/clothing/accessory/badge/holo = 4,
/obj/item/clothing/accessory/badge/holo/officer = 2,
/obj/item/clothing/accessory/badge/holo = 2,
/obj/item/clothing/accessory/badge/holo/cord = 2
)
/obj/item/clothing/accessory/badge/holo/officer
name = "officer's badge"
desc = "A bronze corporate security badge. Stamped with the words 'Security Officer.'"
icon_state = "bronzebadge"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/holo/warden
name = "warden's holobadge"
desc = "A silver corporate security badge. Stamped with the words 'Warden.'"
@@ -122,7 +142,7 @@
/obj/item/clothing/accessory/badge/holo/hos
name = "head of security's holobadge"
desc = "An immaculately polished gold security badge. Labeled 'Head of Security.'"
desc = "An immaculately polished gold security badge. Stamped with the words 'Head of Security.'"
icon_state = "goldbadge"
slot_flags = SLOT_TIE | SLOT_BELT
@@ -132,20 +152,48 @@
icon_state = "marshalbadge"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/holo/investigator
name = "\improper investigator holobadge"
desc = "This badge marks the holder as an investigative agent."
icon_state = "invbadge"
badge_string = "Corporate Investigator"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/holo/sheriff
name = "sheriff badge"
desc = "A star-shaped brass badge denoting who the law is around these parts."
icon_state = "sheriff"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/weapon/storage/box/holobadge/hos
name = "holobadge box"
desc = "A box claiming to contain holobadges."
starts_with = list(
/obj/item/clothing/accessory/badge/holo = 2,
/obj/item/clothing/accessory/badge/holo/officer = 2,
/obj/item/clothing/accessory/badge/holo/warden = 1,
/obj/item/clothing/accessory/badge/holo/detective = 2,
/obj/item/clothing/accessory/badge/holo/hos = 1,
/obj/item/clothing/accessory/badge/holo/cord = 1
)
// Synthmorph bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT.
// Sheriff Badge (toy)
/obj/item/clothing/accessory/badge/sheriff
name = "sheriff badge"
desc = "This town ain't big enough for the two of us, pardner."
icon_state = "sheriff_toy"
item_state = "sheriff_toy"
/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob)
user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\
"You flash the sheriff badge to everyone around you!")
/obj/item/clothing/accessory/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, the sheriff badge into their face!.</span>","<span class='danger'>You invade [M]'s personal space, thrusting the sheriff badge into their face insistently.</span>")
user.do_attack_animation(M)
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //NO SPAM
// Synthmorph bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT.
/obj/item/clothing/accessory/badge/corporate_tag
name = "NanoTrasen Badge"
desc = "A plain metallic plate that might denote the wearer as a member of NanoTrasen."
@@ -137,6 +137,9 @@
desc = "A worn-out handgun holster. Perfect for concealed carry"
icon_state = "holster"
/obj/item/clothing/accessory/holster/armpit/black
icon_state = "holster_b"
/obj/item/clothing/accessory/holster/waist
name = "waist holster"
desc = "A handgun holster. Made of expensive leather."
@@ -144,15 +147,26 @@
overlay_state = "holster_low"
concealed_holster = 0
/obj/item/clothing/accessory/holster/waist/black
icon_state = "holster_b_low"
/obj/item/clothing/accessory/holster/hip
name = "hip holster"
desc = "A handgun holster slung low on the hip, draw pardner!"
desc = "<i>No one dared to ask his business, no one dared to make a slip. The stranger there among them had a big iron on his hip.</i>"
icon_state = "holster_hip"
concealed_holster = 0
/obj/item/clothing/accessory/holster/hip/black
desc = "A handgun holster slung low on the hip, draw pardner!"
icon_state = "holster_b_hip"
/obj/item/clothing/accessory/holster/leg
name = "leg holster"
desc = "A tacticool handgun holster. Worn on the upper leg."
desc = "A drop leg holster made of a durable synthetic leather."
icon_state = "holster_leg"
overlay_state = "holster_leg"
concealed_holster = 0
/obj/item/clothing/accessory/holster/leg/black
desc = "A tacticool handgun holster. Worn on the upper leg."
icon_state = "holster_b_leg"
@@ -1257,13 +1257,6 @@
icon_state = "cowboy_grey"
worn_state = "cowboy_grey"
/obj/item/clothing/under/primitive
name = "primitive clothes"
desc = "Some patched together rags. Better than being naked."
force = 0
icon_state = "rag"
worn_state = "rag"
/obj/item/clothing/under/curator
name = "curator uniform"
desc = "A rugged uniform suitable for treasure hunting."
@@ -6,8 +6,8 @@
/obj/item/clothing/under/permit
name = "public nudity permit"
desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide."
icon = 'icons/obj/card.dmi'
icon_state = "guest"
icon = 'icons/obj/card_new.dmi'
icon_state = "permit-nude"
body_parts_covered = 0
equip_sound = null
@@ -299,7 +299,7 @@
/obj/item/clothing/under/summerdress/blue
icon_state = "summerdress2"
/obj/item/clothing/under/dress/dress_cap/femformal // formal in the loosest sense. because it's going to be taken off. or something. funnier in my head i swear
/obj/item/clothing/under/dress/dress_cap/femformal // formal in the loosest sense. because it's going to be taken off. or something. funnier in my head i swear
name = "site manager's feminine formalwear"
desc = "Essentially a skimpy...dress? Leotard? Whatever it is, it has the coloration and markings suitable for a site manager or rough equivalent."
icon = 'icons/inventory/uniform/item_vr.dmi'
+70
View File
@@ -0,0 +1,70 @@
/* Tribal Clothing
* Contains:
* Primitive Clothing
* Tribal Clothing
*/
/*
* Primitive Clothing
*/
/obj/item/clothing/under/primitive
name = "primitive clothes"
desc = "Some patched together rags. Better than being naked."
force = 0
icon_state = "rag"
worn_state = "rag"
/obj/item/clothing/shoes/primitive
name = "primitive shoes"
desc = "Some patched together rags. Better than being barefoot."
icon_state = "rag"
force = 0
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
/*
* Tribal Clothing
*/
/obj/item/clothing/under/permit/natureist_talisman //Tribal version of the Nudity Permit
name = "naturist talisman"
desc = "This ancient talisman gives rights to those that wish to be closer to nature by casting their constricting clothes aside."
icon = 'icons/inventory/accessory/item.dmi'
icon_override = 'icons/inventory/accessory/mob.dmi'
icon_state = "talisman"
item_state = "talisman"
worn_state = "talisman"
/obj/item/clothing/under/tribalwear
item_state_slots = list(slot_r_hand_str = "tribalwear", slot_l_hand_str = "tribalwear")
/obj/item/clothing/under/tribalwear/common1
name = "tribalwear"
desc = "A traditionally woven robe made with locally sourced material."
icon_state = "tribal_common1"
/obj/item/clothing/under/tribalwear/common2
name = "tribalwear"
desc = "A traditionally woven outfit made with locally sourced material."
icon_state = "tribal_common2"
/obj/item/clothing/under/tribalwear/hunter
name = "hunting tribalwear"
desc = "Dusty rags decorated with strips of leather and small pieces of cyan colored stones."
icon_state = "tribal_hunter"
/obj/item/clothing/under/tribalwear/chief
name = "chief's tribalwear"
desc = "Well maintained robe adorned with fine leather and polished cyan stones."
icon_state = "tribal_chief"
/obj/item/clothing/under/tribalwear/shaman
name = "shaman robes"
desc = "Carefully hand wozen cloth robes with heavy colored stones jewelry drapped over top."
icon_state = "tribal_shaman"
/obj/item/clothing/shoes/tribalwear
name = "tribal sandals"
desc = "Traditionally made sandals made with local materials."
icon_state = "tribal_sandals"
species_restricted = null
body_parts_covered = 0
+4 -1
View File
@@ -487,6 +487,7 @@
/obj/item/weapon/plantspray/pests = 20,
/obj/item/weapon/reagent_containers/syringe = 5,
/obj/item/weapon/reagent_containers/glass/beaker = 4,
/obj/item/weapon/watertank = 1,
/obj/item/weapon/storage/bag/plants = 5)
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
@@ -1241,6 +1242,7 @@
/obj/item/clothing/suit/chef = 5,
/obj/item/clothing/suit/chef/classic = 5,
/obj/item/clothing/head/chefhat = 5,
/obj/item/clothing/head/hairnet = 5,
/obj/item/clothing/under/waiter = 5,
/obj/item/clothing/under/sundress = 1
)
@@ -1521,7 +1523,8 @@
/obj/item/clothing/gloves/black = 5,
/obj/item/weapon/storage/belt/janitor = 5,
/obj/item/clothing/shoes/galoshes = 5,
/obj/item/weapon/cartridge/janitor = 5
/obj/item/weapon/cartridge/janitor = 5,
/obj/item/weapon/watertank/janitor = 1
)
req_log_access = access_hop
has_logs = 1
@@ -2151,7 +2151,9 @@
/obj/item/weapon/storage/belt/utility/chief/full = 5,
/obj/item/weapon/storage/belt/utility/alien/full = 5,
/obj/item/weapon/storage/bible = 5,
/obj/item/weapon/pickaxe = 5,
/obj/item/weapon/pickaxe/drill = 5,
/obj/item/weapon/pickaxe/advdrill = 5,
/obj/item/weapon/pickaxe/diamonddrill = 5,
/obj/item/weapon/pickaxe/gold = 5,
/obj/item/weapon/pickaxe/diamond = 5,
+51 -1
View File
@@ -1001,7 +1001,7 @@
reagents.add_reagent("protein", 6)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket
name = "Donk-pocket"
name = "\improper Donk-pocket"
desc = "The food of choice for the seasoned traitor."
description_fluff = "DONKpockets were originally a Nanotrasen product, an attempt to break into the food market controlled by Centauri Provisions. Somehow, Centauri wound up with the rights to the DONK brand, ending Nanotrasen's ambitions. They taste pretty okay."
icon_state = "donkpocket"
@@ -1035,6 +1035,56 @@
src.name = initial(name)
return
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/spicy
name = "\improper Spicy-pocket"
desc = "The classic snack food, now with a heat-activated spicy flair."
icon_state = "donkpocketspicy"
nutriment_amt = 2
nutriment_desc = list("heartiness" = 1, "dough" = 2, "spice" = 1)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/teriyaki
name = "\improper Teriyaki-pocket"
desc = "An east-asian take on the classic stationside snack."
icon_state = "donkpocketteriyaki"
nutriment_amt = 2
nutriment_desc = list("meat" = 1, "dough" = 2, "soy sauce" = 2)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/pizza
name = "\improper Pizza-pocket"
desc = "Delicious, cheesy and surprisingly filling."
icon_state = "donkpocketpizza"
nutriment_amt = 2
nutriment_desc = list("meat" = 1, "dough" = 2, "cheese"= 2)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/honk
name = "\improper Honk-pocket"
desc = "The award-winning donk-pocket that won the hearts of clowns and humans alike."
icon_state = "donkpocketbanana"
nutriment_amt = 2
nutriment_desc = list("banana" = 1, "dough" = 2, "children's antibiotics"= 1)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/berry
name = "\improper Berry-pocket"
desc = "A relentlessly sweet donk-pocket first created for use in Operation Dessert Storm."
icon_state = "donkpocketberry"
nutriment_amt = 2
nutriment_desc = list("dough" = 2, "jam" = 2)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/gondola
name = "\improper Gondola-pocket"
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least." //Only a monster would craft this.
icon_state = "donkpocketberry"
nutriment_amt = 2
nutriment_desc = list("heartiness" = 1, "dough" = 2, "inner peace" = 1)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/dankpocket
name = "\improper Dank-pocket"
desc = "The food of choice for the seasoned botanist."
icon_state = "dankpocket"
nutriment_amt = 2
nutriment_desc = list("heartiness" = 1, "dough" = 2)
heated_reagents = list("space_drugs" = 5)
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket
name = "\improper Sin-pocket"
desc = "The food of choice for the veteran. Do <B>NOT</B> overconsume."
+8
View File
@@ -459,6 +459,14 @@ I said no!
items = list(/obj/item/weapon/reagent_containers/food/snacks/meatball)
result = /obj/item/weapon/reagent_containers/food/snacks/validsalad
/datum/recipe/dankpocket
fruit = list("ambrosia" = 2)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meatball,
/obj/item/weapon/reagent_containers/food/snacks/doughslice
)
result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket/dankpocket
/datum/recipe/validsalad/make_food(var/obj/container as obj)
. = ..(container)
for (var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked in .)
@@ -17,6 +17,10 @@
name = "infestation - spiders"
event_type = /datum/event2/event/infestation/spiderlings
/datum/event2/event/infestation/cockroaches
vermin_string = "cockroaches"
max_vermin = 6
things_to_spawn = list(/mob/living/simple_mob/animal/passive/cockroach)
/datum/event2/event/infestation
var/vermin_string = null
+2 -1
View File
@@ -72,7 +72,8 @@
var/list/restricted_programs = list(
"Burnoff Test Simulation" = new/datum/holodeck_program(/area/holodeck/source_burntest, list()),
"Wildlife Simulation" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list())
"Wildlife Simulation" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list()),
"Inside" = new/datum/holodeck_program(/area/holodeck/the_uwu_zone, list('sound/vore/sunesound/prey/loop.ogg')), //VOREStation add
)
/obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob)
@@ -0,0 +1,7 @@
/turf/simulated/floor/holofloor/flesh
name = "flesh"
desc = "This slick flesh ripples and squishes under your touch"
icon = 'icons/turf/stomach_vr.dmi'
icon_state = "flesh_floor"
base_icon_state = "flesh_floor"
initial_flooring = null
+295
View File
@@ -0,0 +1,295 @@
/*
* Hydroponics tank and base code
*/
/obj/item/weapon/watertank
name = "backpack water tank"
desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants."
icon = 'icons/inventory/back/item.dmi'
icon_state = "waterbackpack"
item_state = "waterbackpack"
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
slowdown = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
var/obj/item/noz
var/volume = 500
/obj/item/weapon/watertank/Initialize()
. = ..()
create_reagents(volume, OPENCONTAINER)
noz = make_noz()
/obj/item/weapon/watertank/MouseDrop()
if(ismob(loc))
if(!CanMouseDrop(src))
return
var/mob/M = loc
if(!M.unEquip(src))
return
add_fingerprint(usr)
M.put_in_any_hand_if_possible(src)
/obj/item/weapon/watertank/Destroy()
QDEL_NULL(noz)
return ..()
/obj/item/weapon/watertank/ui_action_click(mob/user)
toggle_mister(user)
/obj/item/weapon/watertank/attack_hand(var/mob/user)
if(loc == user)
toggle_mister()
else
..()
/obj/item/weapon/watertank/item_action_slot_check(slot, mob/user)
if(slot == user.getBackSlot())
return 1
//checks that the base unit is in the correct slot to be used
/obj/item/weapon/watertank/proc/slot_check()
var/mob/M = loc
if(!istype(M))
return 0 //not equipped
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src)
return 1
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src)
return 1
return 0
/obj/item/weapon/watertank/verb/toggle_mister()
set name = "Toggle Mister"
set category = "Object"
var/mob/living/carbon/human/user = usr
if(!noz)
to_chat(user, "<span class='warning'>The mister is missing!</span>")
return
if(noz.loc != src)
remove_noz(user) //Remove from their hands and back onto the defib unit
return
if(!slot_check())
to_chat(user, "<span class='warning'>You need to equip [src] before taking out [noz].</span>")
else
if(!usr.put_in_hands(noz)) //Detach the handset into the user's hands
to_chat(user, "<span class='warning'>You need a free hand to hold the handset!</span>")
update_icon() //success
/obj/item/weapon/watertank/proc/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister(src)
/obj/item/weapon/watertank/equipped(mob/user, slot)
..()
if(slot != slot_back)
remove_noz()
/obj/item/weapon/watertank/proc/remove_noz(var/mob/user)
if(!noz) return
if(ismob(noz.loc))
var/mob/M = noz.loc
if(M.drop_from_inventory(noz, src))
to_chat(user, "<span class='notice'>\The [noz] snaps back into the main unit.</span>")
else
noz.forceMove(src)
/obj/item/weapon/watertank/attackby(obj/item/W, mob/user, params)
if(W == noz)
remove_noz()
return 1
else
return ..()
/obj/item/weapon/watertank/dropped(var/mob/user)
..()
remove_noz(user)
/*
* This mister item is intended as an extension of the watertank and always attached to it.
* Therefore, it's designed to be "locked" to the player's hands or extended back onto
* the watertank backpack. Allowing it to be placed elsewhere or created without a parent
* watertank object will likely lead to weird behaviour or runtimes.
*/
/*
* Hydroponics mister
*/
/obj/item/weapon/reagent_containers/spray/mister
name = "water mister"
desc = "A mister nozzle attached to a water tank."
icon_state = "mister"
item_state = "mister"
w_class = ITEMSIZE_LARGE
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(50)
volume = 500
item_flags = NOBLUDGEON
slot_flags = NONE
var/obj/item/weapon/watertank/tank
/obj/item/weapon/reagent_containers/spray/mister/Initialize()
. = ..()
tank = loc
if(!istype(tank))
return INITIALIZE_HINT_QDEL
reagents = tank.reagents //This mister is really just a proxy for the tank's reagents
/obj/item/weapon/reagent_containers/spray/mister/doMove(atom/destination)
if(destination && (destination != tank.loc || !ismob(destination)))
if (loc != tank)
to_chat(tank.loc, "<span class = 'notice'>The mister snaps back onto the watertank.</span>")
destination = tank
..()
/obj/item/weapon/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity)
if(target.loc == loc) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it
return
..()
/*
* Janitor tank
*/
/obj/item/weapon/watertank/janitor
name = "backpack cleaner tank"
desc = "A janitorial cleaner backpack with nozzle to clean blood and graffiti."
icon_state = "waterbackpackjani"
item_state = "waterbackpackjani"
/obj/item/weapon/watertank/janitor/Initialize()
. = ..()
reagents.add_reagent("cleaner", 500)
/obj/item/weapon/watertank/janitor/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/janitor(src)
/*
* Janitor mister
*/
/obj/item/weapon/reagent_containers/spray/mister/janitor
name = "janitor spray nozzle"
desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes."
icon_state = "misterjani"
item_state = "misterjani"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10)
spray_size = 4
/*
* Security tank
*/
/obj/item/weapon/watertank/pepperspray
name = "ANTI-TIDER-2500 suppression backpack"
desc = "The ultimate crowd-control device; this tool allows the user to quickly and efficiently pacify groups of hostile targets."
icon_state = "pepperbackpacksec"
item_state = "pepperbackpacksec"
volume = 1000
/obj/item/weapon/watertank/pepperspray/Initialize()
. = ..()
reagents.add_reagent("condensedcapsaicin", 1000)
/obj/item/weapon/watertank/pepperspray/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/pepperspray(src)
/*
* Security mister
*/
/obj/item/weapon/reagent_containers/spray/mister/pepperspray
name = "security spray nozzle"
desc = "A pacifying spray nozzle attached to a pepperspray tank, designed to silence perps."
icon_state = "mistersec"
item_state = "mistersec"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10)
spray_size = 6
/*
* Operative tank
*/
/obj/item/weapon/watertank/op
name = "uborka tank"
desc = "A Russian backpack spray for systematic cleansing of carbon lifeforms."
icon_state = "waterbackpackop"
item_state = "waterbackpackop"
w_class = ITEMSIZE_NORMAL
volume = 2000
slowdown = 0
/obj/item/weapon/watertank/op/Initialize()
. = ..()
reagents.add_reagent("fuel", 500)
reagents.add_reagent("cryptobiolin", 500)
reagents.add_reagent("phoron", 500)
reagents.add_reagent("condensedcapsaicin", 500)
/obj/item/weapon/watertank/op/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/op(src)
/*
* Operative mister
*/
/obj/item/weapon/reagent_containers/spray/mister/op
name = "uborka spray nozzle"
desc = "A mister nozzle attached to several extended water tanks. It suspiciously has a compressor in the system and is labelled entirely in Cyrillic."
icon_state = "misterop"
item_state = "misterop"
w_class = ITEMSIZE_HUGE
volume = 2000
amount_per_transfer_from_this = 100
possible_transfer_amounts = list(75,100,150)
/*
* Atmos tank
*/
/obj/item/weapon/watertank/atmos
name = "backpack firefighter tank"
desc = "A pressurized backpack tank with extinguisher nozzle, intended to fight fires."
icon_state = "waterbackpackatmos"
item_state = "waterbackpackatmos"
volume = 200
/obj/item/weapon/watertank/atmos/Initialize()
. = ..()
reagents.add_reagent("water", 200)
/obj/item/weapon/watertank/atmos/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/atmos(src)
/*
* Atmos hose
*/
/obj/item/weapon/reagent_containers/spray/mister/atmos
name = "extinguisher nozzle"
desc = "A heavy duty nozzle attached to a firefighter's backpack tank."
icon_state = "atmos_nozzle"
item_state = "nozzleatmos"
w_class = ITEMSIZE_HUGE
volume = 200
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10)
spray_size = null
/obj/item/weapon/reagent_containers/spray/mister/atmos/Spray_at(atom/A as mob|obj)
playsound(src, 'sound/effects/spray3.ogg', rand(50,1), -6)
var/direction = get_dir(src, A)
var/turf/T = get_turf(A)
var/turf/T1 = get_step(T,turn(direction, 90))
var/turf/T2 = get_step(T,turn(direction, -90))
var/list/the_targets = list(T, T1, T2)
for(var/a = 1 to 3)
spawn(0)
if(reagents.total_volume < 1) break
var/obj/effect/effect/water/chempuff/D = new/obj/effect/effect/water/chempuff(get_turf(src))
var/turf/my_target = the_targets[a]
D.create_reagents(amount_per_transfer_from_this)
if(!src)
return
reagents.trans_to_obj(D, amount_per_transfer_from_this)
D.set_color()
D.set_up(my_target, rand(6, 8), 2)
return
+3 -2
View File
@@ -6,6 +6,7 @@
var/tmp/lighting_corners_initialised = FALSE
var/tmp/outdoors_adjacent = FALSE
///Our lighting object.
var/tmp/datum/lighting_object/lighting_object
///Lighting Corner datums.
@@ -96,9 +97,9 @@
///Setter for the byond luminosity var
/turf/proc/set_luminosity(new_luminosity, force)
// SSplanets handles outdoor turfs
if(is_outdoors() && !force)
if((is_outdoors() && !force) || outdoors_adjacent)
return
luminosity = new_luminosity
///Calculate on which directions this turfs block view.
+1 -1
View File
@@ -148,7 +148,7 @@
explosion_resistance = 85
reflectivity = 0.2
radiation_resistance = 10
stack_origin_tech = list(TECH_MATERIAL = 8, TECH_ILLEGAL = 1, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_ARCANE = 1)
stack_origin_tech = list(TECH_MATERIAL = 8, TECH_PHORON = 4, TECH_BLUESPACE = 4)
supply_conversion_value = 13
+1 -1
View File
@@ -27,7 +27,7 @@
new/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src)
new/obj/item/weapon/flame/lighter/zippo(src)
if(6 to 10)
new/obj/item/weapon/pickaxe/drill(src)
new/obj/item/weapon/pickaxe/advdrill(src)
new/obj/item/device/taperecorder(src)
new/obj/item/clothing/suit/space(src)
new/obj/item/clothing/head/helmet/space(src)
+66 -56
View File
@@ -10,22 +10,22 @@
/*****************************Pickaxe********************************/
/obj/item/weapon/pickaxe
name = "mining drill"
desc = "The most basic of mining drills, for short excavations and small mineral extractions."
name = "pickaxe"
desc = "A miner's best friend."
icon = 'icons/obj/items.dmi'
slot_flags = SLOT_BELT
force = 15.0
throwforce = 4.0
icon_state = "pickaxe"
item_state = "jackhammer"
item_state = "pickaxe"
w_class = ITEMSIZE_LARGE
matter = list(MAT_STEEL = 3750)
matter = list(MAT_STEEL = 2500)
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
var/sand_dig = FALSE // does this thing dig sand?
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
origin_tech = list(TECH_MATERIAL = 1)
attack_verb = list("hit", "pierced", "sliced", "attacked")
var/drill_sound = "pickaxe"
var/drill_verb = "drilling"
var/drill_verb = "picking"
sharp = TRUE
var/excavation_amount = 200
@@ -39,16 +39,59 @@
origin_tech = list(TECH_MATERIAL = 3)
desc = "This makes no metallurgic sense."
/obj/item/weapon/pickaxe/gold
name = "golden pickaxe"
icon_state = "gpickaxe"
item_state = "gpickaxe"
digspeed = 20
origin_tech = list(TECH_MATERIAL = 4)
desc = "This makes no metallurgic sense."
drill_verb = "picking"
/obj/item/weapon/pickaxe/diamond
name = "diamond pickaxe"
icon_state = "dpickaxe"
item_state = "dpickaxe"
digspeed = 10
origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4)
desc = "A pickaxe with a diamond pick head."
drill_verb = "picking"
/*****************************Drill********************************/
/obj/item/weapon/pickaxe/drill
name = "mining drill" // Can dig sand as well!
icon_state = "drill"
item_state = "jackhammer"
digspeed = 35 //Only slighty better than a pickaxe
sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 1, TECH_POWER = 2, TECH_ENGINEERING = 1)
matter = list(MAT_STEEL = 3750)
desc = "The most basic of mining drills, for short excavations and small mineral extractions."
drill_verb = "drilling"
/obj/item/weapon/pickaxe/advdrill
name = "advanced mining drill" // Can dig sand as well!
icon_state = "handdrill"
icon_state = "advdrill"
item_state = "jackhammer"
digspeed = 30
sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
matter = list(MAT_STEEL = 4000, MAT_PLASTEEL = 2500)
desc = "Yours is the drill that will pierce through the rock walls."
drill_verb = "drilling"
/obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME!
name = "diamond mining drill"
icon_state = "diamonddrill"
item_state = "jackhammer"
digspeed = 5 //Digs through walls, girders, and can dig up sand
sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 5)
matter = list(MAT_STEEL = 4500, MAT_PLASTEEL = 3000, MAT_DIAMONDS = 1000)
desc = "Yours is the drill that will pierce the heavens!"
drill_verb = "drilling"
/obj/item/weapon/pickaxe/jackhammer
name = "sonic jackhammer"
icon_state = "jackhammer"
@@ -58,56 +101,33 @@
desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards."
drill_verb = "hammering"
/obj/item/weapon/pickaxe/gold
name = "golden pickaxe"
icon_state = "gpickaxe"
item_state = "gpickaxe"
digspeed = 20
origin_tech = list(TECH_MATERIAL = 4)
desc = "This makes no metallurgic sense."
drill_verb = "picking"
/obj/item/weapon/pickaxe/borgdrill
name = "jackhammer"
icon_state = "borg_pick"
item_state = "jackhammer"
digspeed = 15
sand_dig = TRUE
desc = "Cracks rocks with a hardened pneumatic bit."
drill_verb = "hammering"
/obj/item/weapon/pickaxe/plasmacutter
name = "plasma cutter"
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
icon_state = "plasmacutter"
item_state = "gun"
item_state = "plasmacutter"
w_class = ITEMSIZE_NORMAL //it is smaller than the pickaxe
damtype = "fire"
digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/ light thermite on fire
digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/light thermite on fire
origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
matter = list(MAT_STEEL = 3000, MAT_PLASTEEL = 1500, MAT_DIAMONDS = 500, MAT_PHORON = 500)
drill_verb = "cutting"
drill_sound = 'sound/items/Welder.ogg'
sharp = TRUE
edge = TRUE
/obj/item/weapon/pickaxe/diamond
name = "diamond pickaxe"
icon_state = "dpickaxe"
item_state = "dpickaxe"
digspeed = 10
origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4)
desc = "A pickaxe with a diamond pick head."
drill_verb = "picking"
/obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME!
name = "diamond mining drill"
icon_state = "diamonddrill"
item_state = "jackhammer"
digspeed = 5 //Digs through walls, girders, and can dig up sand
sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 5)
desc = "Yours is the drill that will pierce the heavens!"
drill_verb = "drilling"
/obj/item/weapon/pickaxe/borgdrill
name = "enhanced sonic jackhammer"
icon_state = "jackhammer"
item_state = "jackhammer"
digspeed = 15
sand_dig = TRUE
desc = "Cracks rocks with sonic blasts. This one seems like an improved design."
drill_verb = "hammering"
/obj/item/weapon/pickaxe/plasmacutter/borg
name = "mounted plasma cutter"
icon_state = "pcutter_borg"
/*****************************Shovel********************************/
@@ -116,10 +136,10 @@
desc = "A large tool for digging and moving dirt."
icon = 'icons/obj/items.dmi'
icon_state = "shovel"
item_state = "shovel"
slot_flags = SLOT_BELT
force = 8.0
throwforce = 4.0
item_state = "shovel"
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
matter = list(MAT_STEEL = 50)
@@ -169,16 +189,6 @@
sharp = 0
edge = 1
/**********************Mining car (Crate like thing, not the rail car)**************************/
/obj/structure/closet/crate/miningcar
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
name = "Mining car (not for rails)"
icon = 'icons/obj/closets/miningcar.dmi'
density = TRUE
// Flags.
/obj/item/stack/flag
+14 -9
View File
@@ -1,30 +1,35 @@
//upgrades the speed of all drills and pickaxes.
//Pickaxes
/obj/item/weapon/pickaxe
digspeed = 36
/obj/item/weapon/pickaxe/silver
digspeed = 27
/obj/item/weapon/pickaxe/diamond
digspeed = 9
/obj/item/weapon/pickaxe/gold
digspeed = 18
//Drills
/obj/item/weapon/pickaxe/drill
digspeed = 30
/obj/item/weapon/pickaxe/advdrill
digspeed = 27
/obj/item/weapon/pickaxe/jackhammer
digspeed = 18
destroy_artefacts = TRUE
/obj/item/weapon/pickaxe/gold
digspeed = 18
/obj/item/weapon/pickaxe/plasmacutter
digspeed = 18
/obj/item/weapon/pickaxe/diamond
digspeed = 9
/obj/item/weapon/pickaxe/diamonddrill
digspeed = 4
/obj/item/weapon/pickaxe/borgdrill
digspeed = 13
destroy_artefacts = TRUE
/obj/item/weapon/pickaxe/plasmacutter
digspeed = 18
+1 -1
View File
@@ -2,7 +2,7 @@ var/global/list/prevent_respawns = list()
/hook/death/proc/quit_notify(mob/dead)
if(ishuman(dead))
to_chat(dead,"<span class='notice'>You're dead! If you don't intend to continue playing this round as this character, please use the <b>Quit This Round</b> verb in the OOC tab to free your job slot.</span>")
to_chat(dead,"<span class='notice'>You're dead! If you don't intend to continue playing this round as this character, please use the <b>Quit This Round</b> verb in the OOC tab to free your job slot. Otherwise, you can use the <b>Notify Transcore</b> verb to let medical know you need resleeving, or <b>Find Auto Resleever</b> verb to be taken to an auto resleever, which you can click on to be resleeved automatically after a time.</span>")
return TRUE
+17
View File
@@ -202,6 +202,23 @@ var/list/slot_equipment_priority = list( \
drop_from_inventory(I, target)
return TRUE
//visibly unequips I but it is NOT MOVED AND REMAINS IN SRC
//item MUST BE FORCEMOVE'D OR QDEL'D
/mob/proc/temporarilyRemoveItemFromInventory(obj/item/I, force = FALSE, idrop = TRUE)
return u_equip(I, force, null, TRUE, idrop)
///sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(slot, mob/user)
if(slot == SLOT_BACK || slot == LEGS) //these aren't true slots, so avoid granting actions there
return FALSE
return TRUE
///Get the item on the mob in the storage slot identified by the id passed in
/mob/proc/get_item_by_slot(slot_id)
return null
/mob/proc/getBackSlot()
return SLOT_BACK
//Attemps to remove an object on a mob.
/mob/proc/remove_from_mob(var/obj/O, var/atom/target)
@@ -127,7 +127,7 @@
. += shoes.slowdown
//VOREStation Addition Start
if(buckled && istype(buckled, /obj/machinery/power/rtg/d_type_reg))
if(buckled && istype(buckled, /obj/machinery/power/rtg/reg))
. += shoes.slowdown
//VOREStation Addition End
@@ -141,14 +141,14 @@
)
heat_discomfort_level = 295
heat_discomfort_level = 320 //VOREStation Edit - 46c (higher than normal humans) Don't spam red text if you're slightly warm.
heat_discomfort_strings = list(
"You feel soothingly warm.",
"You feel the heat sink into your bones.",
"You feel warm enough to take a nap."
)
cold_discomfort_level = 292
cold_discomfort_level = 288.15 //VOREStation Edit - 15c Give a little bit of wiggle room here come on.
cold_discomfort_strings = list(
"You feel chilly.",
"You feel sluggish and cold.",
@@ -33,17 +33,24 @@
//Scary spawnerization.
revive_ready = REVIVING_NOW
revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
spawn(time SECONDS)
// Was dead, now not dead.
if(stat != DEAD)
to_chat(src, "<span class='notice'>Your body has recovered from its ordeal, ready to regenerate itself again.</span>")
revive_ready = REVIVING_READY //reset their cooldown
clear_alert("regen")
throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
// Was dead, still dead.
else
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch.</span>")
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
clear_alert("regen")
throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Dead until nutrition injected.
else
@@ -55,6 +62,8 @@
//Waiting for regen after being alive
revive_ready = REVIVING_NOW
revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
spawn(time SECONDS)
//If they're still alive after regenning.
@@ -62,17 +71,24 @@
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
clear_alert("regen")
throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Was alive, now dead
else if(hasnutriment())
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
clear_alert("regen")
throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Dead until nutrition injected.
else
to_chat(src, "<span class='warning'>Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.</span>")
revive_ready = REVIVING_READY //reset their cooldown
clear_alert("regen")
/mob/living/carbon/human/proc/hasnutriment()
if (bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein.
@@ -101,6 +117,7 @@
chimera_hatch()
adjustBrainLoss(10) // if they're reviving from dead, they come back with 10 brainloss on top of whatever's unhealed.
visible_message("<span class='danger'><p><font size=4>The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //Bloody hell...
clear_alert("hatch")
return
//Don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch.
@@ -108,11 +125,13 @@
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
verbs -= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_READY //reset their cooldown they can try again when they're given a kickstart
clear_alert("hatch")
//Alive when hatching
else
chimera_hatch()
visible_message("<span class='danger'><p><font size=4>The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //Bloody hell...
clear_alert("hatch")
/mob/living/carbon/human/proc/chimera_hatch()
verbs -= /mob/living/carbon/human/proc/hatch
@@ -139,9 +158,13 @@
//Visual effects
var/T = get_turf(src)
new /obj/effect/gibspawner/human/xenochimera(T)
var/blood_color = species.blood_color
var/flesh_color = species.flesh_color
new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color)
playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50)
revive_ready = world.time + 1 HOUR //set the cooldown
revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often.
/mob/living/carbon/human/proc/revivingreset() // keep this as a debug proc or potential future use
revive_ready = REVIVING_READY
@@ -27,8 +27,7 @@
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/tie_hair,
/mob/living/proc/flying_toggle,
/mob/living/proc/start_wings_hovering,
/mob/living/carbon/human/proc/tie_hair) //Xenochimera get all the special verbs since they can't select traits.
/mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits.
virus_immune = 1 // They practically ARE one.
min_age = 18
@@ -50,7 +49,7 @@
//primitive_form = "Farwa"
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken.
flags = NO_SCAN | NO_INFECT //Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is.
flags = NO_SCAN | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib.
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
genders = list(MALE, FEMALE, PLURAL, NEUTER)
@@ -74,8 +73,8 @@
reagent_tag = IS_CHIMERA
/datum/species/xenochimera/handle_environment_special(var/mob/living/carbon/human/H)
//If they're KO'd/dead, they're probably not thinking a lot about much of anything.
if(!H.stat)
//If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything.
if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE))
handle_feralness(H)
//While regenerating
@@ -83,6 +82,10 @@
H.weakened = 5
H.canmove = 0
H.does_not_breathe = TRUE
var/regen_sounds = H.regen_sounds
if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating.
playsound(H, pick(regen_sounds), 30)
H.visible_message("<span class='danger'><p><font size=4>[H.name]'s motionless form shudders grotesquely, rippling unnaturally.</font></p></span>")
//Cold/pressure effects when not regenerating
else
@@ -202,6 +205,11 @@
feral++
else
feral = max(0,--feral)
// Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
var/turf/T = get_turf(H)
if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
feral = max(0,--feral)
//Set our real mob's var to our temp var
H.feral = feral
@@ -218,7 +226,7 @@
H.shock_stage = max(H.shock_stage-(feral/20), 0)
//Handle light/dark areas
var/turf/T = get_turf(H)
// var/turf/T = get_turf(H) // Moved up to before the in-belly/dark combined check, should still safely reach here just fine.
if(!T)
update_xenochimera_hud(H, danger, feral_state)
return //Nullspace
@@ -230,8 +238,8 @@
//This is basically the 'lite' version of the below block.
var/list/nearby = H.living_mobs(world.view)
//Not in the dark and out in the open.
if(!darkish && isturf(H.loc))
//Not in the dark, or a belly, and out in the open.
if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // Added specific check for if in belly
//Always handle feral if nobody's around and not in the dark.
if(!nearby.len)
@@ -245,8 +253,8 @@
update_xenochimera_hud(H, danger, feral_state)
return
// In the darkness or "hidden". No need for custom scene-protection checks as it's just an occational infomessage.
if(darkish || !isturf(H.loc))
// In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case.
// If hurt, tell 'em to heal up
if (shock)
to_chat(H,"<span class='info'>This place seems safe, secure, hidden, a place to lick your wounds and recover...</span>")
@@ -1,7 +1,10 @@
/*
** For now, these are just neutral traits for Xenochimera only to take.
** These are only traits that they should reasonably be able to evolve to acquire themselves.
** I won't add the resistances though because those are kinda lame for a 'chimera to take!
** Traits defined as custom_only = FALSE in neutral.dm will be available for Xenochimera to take as well.
** As such, be careful not to duplicate the traits, and only add dupes where necessary.
** IE: Heat/Cold Adapt and autohisses are added to Xenochimera because they reasonably could have evolved it, along with custom species.
** However, if custom_only = FALSE is set, then any species including things like humans can take it. A little silly.
** Therefore, use this file only for Xenochimera traits that you want to keep custom + Xenochim only.
*/
/datum/trait/positive/weaver/xenochimera
sort = TRAIT_SORT_SPECIES
@@ -57,4 +60,59 @@
desc = "You can breathe under water."
cost = 0
category = 0
custom_only = FALSE
custom_only = FALSE
/* // Commented out in lieu of finding a better solution.
/datum/trait/neutral/coldadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Cold"
desc = "You have adapted to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/hotadapt, /datum/trait/neutral/hotadapt/xenochimera)
/datum/trait/neutral/hotadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Heat"
desc = "You have adapted to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // negates the need for suit coolers entirely for synths, so no. (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/coldadapt, /datum/trait/neutral/coldadapt/xenochimera)
*/
/datum/trait/neutral/autohiss_unathi/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Unathi)"
desc = "You roll your S's and x's"
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
),
autohiss_extra_map = list(
"x" = list("ks", "kss", "ksss")
),
autohiss_exempt = list("Sinta'unathi"))
excludes = list(/datum/trait/neutral/autohiss_tajaran)
/datum/trait/neutral/autohiss_tajaran/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Tajaran)"
desc = "You roll your R's."
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"r" = list("rr", "rrr", "rrrr")
),
autohiss_exempt = list("Siik"))
excludes = list(/datum/trait/neutral/autohiss_unathi)
@@ -1,4 +1,4 @@
/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M in living_mobs(1))
/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M) // Allows the user to lick themselves. Given how rarely this trait is used, I don't see an issue with a slight buff.
set name = "Lick Wounds"
set category = "Abilities"
set desc = "Disinfect and heal small wounds with your saliva."
@@ -7,6 +7,10 @@
to_chat(src, "<span class='warning'>You need more energy to produce antiseptic enzymes. Eat something and try again.</span>")
return
if (get_dist(src,M) >= 2)
to_chat(src, "<span class='warning'>You need to be closer to do that.</span>")
return
if ( ! (istype(src, /mob/living/carbon/human) || \
istype(src, /mob/living/silicon)) )
to_chat(src, "<span class='warning'>If you even have a tongue, it doesn't work that way.</span>")
@@ -49,7 +53,7 @@
if(affecting.brute_dam > 20 || affecting.burn_dam > 20)
to_chat(src, "<span class='warning'>The wounds on [M]'s [affecting.name] are too severe to treat with just licking.</span>")
return
else
visible_message("<b>\The [src]</b> starts licking the wounds on [M]'s [affecting.name] clean.", \
"<span class='notice'>You start licking the wounds on [M]'s [affecting.name] clean.</span>" )
@@ -40,7 +40,8 @@ var/list/mob_hat_cache = list()
can_pull_size = ITEMSIZE_NO_CONTAINER
can_pull_mobs = MOB_PULL_SMALLER
can_enter_vent_with = list(
/obj)
/obj,
/atom/movable/emissive_blocker)
mob_bump_flag = SIMPLE_ANIMAL
mob_swap_flags = SIMPLE_ANIMAL
@@ -23,7 +23,8 @@
can_pull_size = ITEMSIZE_NO_CONTAINER
can_pull_mobs = MOB_PULL_SMALLER
can_enter_vent_with = list(
/obj)
/obj,
/atom/movable/emissive_blocker)
mob_always_swap = 1
@@ -422,7 +422,7 @@ var/global/list/robot_modules = list(
src.emag = new /obj/item/weapon/melee/baton/robot/arm(src)
src.modules += new /obj/item/device/geiger(src)
src.modules += new /obj/item/weapon/rcd/electric/mounted/borg(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000)
@@ -745,7 +745,7 @@ var/global/list/robot_modules = list(
src.emag = new /obj/item/weapon/kinetic_crusher/machete/dagger(src)
// No reason for these, upgrade modules replace them.
//src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
//src.emag = new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
//src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src)
/obj/item/weapon/robot_module/robot/research
@@ -840,7 +840,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/flash(src)
//src.modules += new /obj/item/borg/sight/thermal(src) // VOREStation Edit
src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src)
src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src)
@@ -875,7 +875,7 @@ var/global/list/robot_modules = list(
robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += robot.internals
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
src.emag = new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
src.emag.name = "Plasma Cutter"
var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000)
@@ -164,11 +164,18 @@
var/limb_icon_key
var/understands_common = TRUE //VOREStation Edit - Makes it so that simplemobs can understand galcomm without being able to speak it.
var/heal_countdown = 5 //VOREStation Edit - A cooldown ticker for passive healing
var/obj/item/weapon/card/id/mobcard = null //VOREStation Edit
var/list/mobcard_access = list() //VOREStation Edit
var/mobcard_provided = FALSE //VOREStation Edit
/mob/living/simple_mob/Initialize()
verbs -= /mob/verb/observe
health = maxHealth
if(mobcard_provided) //VOREStation Edit
mobcard = new /obj/item/weapon/card/id(src)
mobcard.access = mobcard_access.Copy()
for(var/L in has_langs)
languages |= GLOB.all_languages[L]
if(languages.len)
@@ -297,3 +304,13 @@
/decl/mob_organ_names
var/list/hit_zones = list("body") //When in doubt, it's probably got a body.
//VOREStation Add Start For allowing mobs with ID's door access
/mob/living/simple_mob/Bump(var/atom/A)
if(mobcard && istype(A, /obj/machinery/door))
var/obj/machinery/door/D = A
if(!istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && !istype(D, /obj/machinery/door/airlock/lift) && D.check_access(mobcard))
D.open()
else
..()
//Vorestation Add End
@@ -16,7 +16,7 @@
/mob/living/simple_mob/vore/alienanimals/catslug
name = "catslug"
desc = "A noodley bodied creature with thin arms and legs, and gloomy dark eyes."
tt_desc = "Mollusca Feline"
tt_desc = "Mollusca Feline"
icon_state = "catslug"
icon_living = "catslug"
icon_dead = "catslug_dead"
@@ -44,11 +44,13 @@
friendly = list("hugs")
see_in_dark = 8
mobcard_provided = TRUE
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug)
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/catslug
say_list_type = /datum/say_list/catslug
player_msg = "You have escaped the foul weather, into this much more pleasant place. You are an intelligent creature capable of more than most think. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>"
has_langs = list("Sign Language")
var/picked_color = FALSE
@@ -160,9 +162,9 @@
if(user != src)
to_chat(user, "<span class='notice'>\The [user] feeds \the [O] to you.</span>")
playsound(src, 'sound/items/eatfood.ogg', 75, 1)
/mob/living/simple_mob/vore/alienanimals/catslug/attack_hand(mob/living/carbon/human/M as mob)
if(stat == DEAD)
return ..()
if(M.a_intent != I_HELP)
@@ -211,7 +213,7 @@
else
return ..()
/mob/living/simple_mob/vore/alienanimals/catslug/Login() //If someone plays as us let's just be a passive mob in case accidents happen if the player D/Cs
/mob/living/simple_mob/vore/alienanimals/catslug/Login() //If someone plays as us let's just be a passive mob in case accidents happen if the player D/Cs
. = ..()
ai_holder.hostile = FALSE
ai_holder.wander = FALSE
@@ -227,6 +229,7 @@
if(newcolor)
color = newcolor
picked_color = TRUE
update_icon()
/datum/ai_holder/simple_mob/melee/evasive/catslug/proc/consider_awakening()
if(holder.resting)
@@ -240,7 +243,7 @@
holder.lay_down()
go_sleep()
addtimer(CALLBACK(src, .proc/consider_awakening), rand(1 MINUTE, 5 MINUTES), TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
else
else
return ..()
@@ -279,7 +282,23 @@
. = ..()
color = held.color
/datum/category_item/catalogue/fauna/catslug/spaceslug
//Custom Catslugs and the Rascal's Pass bunch
/mob/living/simple_mob/vore/alienanimals/catslug/custom
desc = "A noodley bodied creature with thin arms and legs, and gloomy dark eyes. You shouldn't ever see this."
makes_dirt = 0
digestable = 0
humanoid_hands = 1 //These should all be ones requiring admin-intervention to play as, so they can get decent tool-usage, as a treat.
var/siemens_coefficient = 1 //Referenced later by others.
/mob/living/simple_mob/vore/alienanimals/catslug/custom/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //Most of these have custom sprites with colour already, so we'll not let them have this.
/datum/category_item/catalogue/fauna/catslug/custom/spaceslug
name = "Alien Wildlife - Catslug - Miros"
desc = "This catslug serves as the Fuel Depots resident attendant,\
despite the facility being fully automated and self-serve. - \
@@ -294,7 +313,7 @@
tool users."
value = CATALOGUER_REWARD_MEDIUM //Should offer a measure of incentive for people to visit the depot more often.
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug
name = "Miros"
desc = "Looks like catslugs can into space after all! This little chap seems to have gotten their mitts on a tiny spacesuit, there's a nametag on it that reads \"Miros\" alongside the Aether Atmospherics logo."
tt_desc = "Mollusca Felis Stellaris"
@@ -302,17 +321,15 @@
icon_living = "spaceslug"
icon_rest = "spaceslug_rest"
icon_dead = "spaceslug_dead"
digestable = 0
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/spaceslug)
holder_type = /obj/item/weapon/holder/catslug/spaceslug
makes_dirt = 0
say_list_type = /datum/say_list/catslug/spaceslug
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/spaceslug)
holder_type = /obj/item/weapon/holder/catslug/custom/spaceslug
say_list_type = /datum/say_list/catslug/custom/spaceslug
minbodytemp = 0 // Shamelessly stolen temp & atmos tolerances from the space cat.
maxbodytemp = 900
heat_damage_per_tick = 3
maxbodytemp = 900
heat_damage_per_tick = 3
cold_damage_per_tick = 2
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -321,22 +338,14 @@
max_co2 = 0
min_n2 = 0
max_n2 = 0
player_msg = "You are an intelligent creature capable of more than most think, clad in a spacesuit that protects you from the ravages of vacuum and hostile atmospheres alike. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>"
has_langs = list("Sign Language")
/datum/say_list/catslug/spaceslug
player_msg = "You are an intelligent creature capable of more than most think, clad in a spacesuit that protects you from the ravages of vacuum and hostile atmospheres alike. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>"
/datum/say_list/catslug/custom/spaceslug
speak = list("Have any porl?", "What is that?", "What kind of ship is that?", "What are you doing?", "How did you get here?", "Don't take off your helmet.", "SPAAAAAACE!", "WAOW!", "Nice weather we're having, isn't it?")
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/attack_hand(mob/living/carbon/human/M as mob)
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/attack_hand(mob/living/carbon/human/M as mob)
if(stat == DEAD)
return ..()
if(M.a_intent != I_HELP)
@@ -385,6 +394,591 @@
else
return ..()
/obj/item/weapon/holder/catslug/spaceslug
/obj/item/weapon/holder/catslug/custom/spaceslug
item_state = "spaceslug"
//Engineer catslug
/datum/category_item/catalogue/fauna/catslug/custom/engislug
name = "Alien Wildlife - Catslug - Engineer O'Brimn"
desc = "A resident worker at the NSB Rascal's Pass, Engineer O'Brimn \
keeps the facilities pipework and machinery maintained between shifts, as \
well as \"fixing\" the engine back to it's original configuration. \
Reportedly the cause for numerous phoron-based conflagrations. - \
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/custom/engislug
name = "Engineer O'Brimn"
desc = "A yellow-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one seems to be wearing a too-big high visibility vest and a full-face hardhat."
tt_desc = "Mollusca Felis Munitor"
icon_state = "engislug"
icon_living = "engislug"
icon_rest = "engislug_rest"
icon_dead = "engislug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/engislug)
holder_type = /obj/item/weapon/holder/catslug/custom/engislug
say_list_type = /datum/say_list/catslug/custom/engislug
mobcard_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_construction, access_atmospherics)
siemens_coefficient = 0 //Noodly fella's gone and built up an immunity from many small shocks
minbodytemp = 200
maxbodytemp = 600 //engislug can survive a little heat, as a treat
heat_damage_per_tick = 1
cold_damage_per_tick = 2
min_oxy = 16 //Require atleast 16kPA oxygen
max_oxy = 0
min_tox = 0 //should still suffer hypoxia, but the mask ought to filter out not-nice gases for them
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
/datum/say_list/catslug/custom/engislug
speak = list("Have any porl?", "What is that?", "Phoroncheck!", "Thump is mean work fine!", "What are you doing?", "How did you get here?", "Don't breathe in the spicy purple.", "Zap-zap ball bad.", "WAOW!", "The pipes make sense.")
/mob/living/simple_mob/vore/alienanimals/catslug/custom/engislug/attack_hand(mob/living/carbon/human/M as mob)
if(stat == DEAD)
return ..()
if(M.a_intent != I_HELP)
return ..()
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(resting)
M.visible_message("<span class='notice'>\The [M.name] shakes \the [src] awake from their nap.</span>","<span class='notice'>You shake \the [src] awake!</span>")
lay_down()
ai_holder.go_wake()
return
if(M.zone_sel.selecting == BP_HEAD)
M.visible_message( \
"<span class='notice'>[M] pats \the [src] on their helmet.</span>", \
"<span class='notice'>You pat \the [src] on their helmet.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src] purrs and leans into [M]'s hand.</span>")
else if(M.zone_sel.selecting == BP_R_HAND || M.zone_sel.selecting == BP_L_HAND)
M.visible_message( \
"<span class='notice'>[M] shakes \the [src]'s hand.</span>", \
"<span class='notice'>You shake \the [src]'s hand.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s looks a little confused and bonks their helmet's faceplate against [M]'s hand experimentally, attempting to nibble at it.</span>")
else if(M.zone_sel.selecting == "mouth")
M.visible_message( \
"<span class='notice'>[M] attempts to boop \the [src]'s nose, defeated only by the helmet they wear.</span>", \
"<span class='notice'>You attempt to boop \the [src] on the nose, stopped only by that helmet they wear.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s eyes widen as they stare at [M]. After a moment they rub at the faint mark [M]'s digit left upon the surface of their helmet's faceplate.</span>")
else if(M.zone_sel.selecting == BP_GROIN)
M.visible_message( \
"<span class='notice'>[M] rubs \the [src]'s tummy...</span>", \
"<span class='notice'>You rub \the [src]'s tummy... You feel the danger.</span>", )
if(client)
return
visible_message("<span class='notice'>\The [src] pushes [M]'s hand away from their tummy and furrows their brow!</span>")
if(prob(5))
ai_holder.target = M
ai_holder.track_target_position()
ai_holder.set_stance(STANCE_FIGHT)
else
return ..()
/obj/item/weapon/holder/catslug/custom/engislug
item_state = "engislug"
//Security catslug
/datum/category_item/catalogue/fauna/catslug/custom/gatslug
name = "Alien Wildlife - Catslug - Officer Gatslug"
desc = "A resident worker at the NSB Rascal's Pass, Officer Gatslug \
served with distinction during upheaval at the NSB Adephagia in 2321. \
After their recovery from the wreckage afterwards, they were awarded \
several commendations and an offer to serve aboard the latest NT venture \
in the Virgo-Erigone system. - \
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/custom/gatslug
name = "Officer Gatslug"
desc = "A light red-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one seems to be wearing a security cap, bandolier and holobadge."
tt_desc = "Mollusca Felis Magistratus"
icon_state = "gatslug"
icon_living = "gatslug"
icon_rest = "gatslug_rest"
icon_dead = "gatslug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/gatslug)
holder_type = /obj/item/weapon/holder/catslug/custom/gatslug
maxHealth = 75
health = 75
say_list_type = /datum/say_list/catslug/custom/gatslug
melee_damage_lower = 5
melee_damage_upper = 10 //"Trained" security member, so they can hit that little bit harder
taser_kill = 0 //Shouldn't be weak to accidental friendly fire from other officers
armor = list(
"melee" = 15,
"bullet" = 0,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 0
) //Similarly, \some\ armour values for a smidge more survivability compared to other catslugs.
mobcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_maint_tunnels)
/datum/say_list/catslug/custom/gatslug
speak = list("Have any flashbangs?", "Valids!", "Heard spiders?", "What is that?", "Freeze!", "What are you doing?", "How did you get here?", "Red alert means big bangsticks.", "No being naughty now.", "WAOW!", "Who ate all the donuts?")
/obj/item/weapon/holder/catslug/custom/gatslug
item_state = "gatslug"
//Medical catslug
/datum/category_item/catalogue/fauna/catslug/custom/medislug
name = "Alien Wildlife - Catslug - Doctor Mlemulon"
desc = "A resident worker at the NSB Rascal's Pass, Doctor Mlemulon \
works hard to drink and eat all the remaining medicine stocks in \
the smartfridge after the end of a shift. Rumour has it they have \
a side business of trading advanced surgical tools for \"tasty yummers\" too. - \
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/custom/medislug
name = "Doctor Mlemulon"
desc = "A pale blue-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one appears to have a nurses hat perched upon it's head and a medi-hud."
tt_desc = "Mollusca Felis Medicus"
icon_state = "medislug"
icon_living = "medislug"
icon_rest = "medislug_rest"
icon_dead = "medislug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/medislug)
holder_type = /obj/item/weapon/holder/catslug/custom/medislug
say_list_type = /datum/say_list/catslug/custom/medislug
mobcard_access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
/datum/say_list/catslug/custom/medislug
speak = list("Have any osteodaxon?", "What is that?", "Suit sensors!", "What are you doing?", "How did you get here?", "Put a mask on!", "No smoking!", "WAOW!", "Stop getting blood everywhere!", "WHERE IN MAINT?")
/obj/item/weapon/holder/catslug/custom/medislug
item_state = "medislug"
//Science catslug
/datum/category_item/catalogue/fauna/catslug/custom/scienceslug
name = "Alien Wildlife - Catslug - Professor Nubbins"
desc = "A resident worker at the NSB Rascal's Pass, Professor Nubbins \
is tasked with the periodic maintenance of the R&D servers. \
Unfortunately, they take this to mean \"wipe all stored research\". - \
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/custom/scienceslug
name = "Professor Nubbins"
desc = "A purple-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one looks to be wearing a swanky white science beret, as well as a pair of goggles."
tt_desc = "Mollusca Felis Inquisitorem"
icon_state = "scienceslug"
icon_living = "scienceslug"
icon_rest = "scienceslug_rest"
icon_dead = "scienceslug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/scienceslug)
holder_type = /obj/item/weapon/holder/catslug/custom/scienceslug
say_list_type = /datum/say_list/catslug/custom/scienceslug
mobcard_access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
/datum/say_list/catslug/custom/scienceslug
speak = list("Slimes, squish!", "What is that?", "Smoking in Toxins is not advised.", "What are you doing?", "How did you get here?", "Do not deconstruct the cube!", "WAOW!", "Where are our materials?", "The acid dispenser is not full of juice. Must remember that.")
/obj/item/weapon/holder/catslug/custom/scienceslug
item_state = "scienceslug"
//Cargo catslug
/datum/category_item/catalogue/fauna/catslug/custom/cargoslug
name = "Alien Wildlife - Catslug - Technician Nermley"
desc = "A resident worker at the NSB Rascal's Pass, Technician Nermley \
is something of a mystery. No one is sure where they came from, \
local scuttlebutt is that they just turned up one day and started \
moving crates around. - \
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/custom/cargoslug
name = "Technician Nermley"
desc = "A brown-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one has a flipped-round baseball cap on their head and a pair of black mittens."
tt_desc = "Mollusca Felis Quisquiliae"
icon_state = "cargoslug"
icon_living = "cargoslug"
icon_rest = "cargoslug_rest"
icon_dead = "cargoslug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/cargoslug)
holder_type = /obj/item/weapon/holder/catslug/custom/cargoslug
say_list_type = /datum/say_list/catslug/custom/cargoslug
mobcard_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
/datum/say_list/catslug/custom/cargoslug
speak = list("Disposals is not for slip and slide.", "What is that?", "Stamp those manifests!", "What are you doing?", "How did you get here?", "Can order pizza crate?", "WAOW!", "Where are all of our materials?", "Got glubbs?")
/obj/item/weapon/holder/catslug/custom/cargoslug
item_state = "cargoslug"
//Command catslug
/datum/category_item/catalogue/fauna/catslug/custom/capslug
name = "Alien Wildlife - Catslug - Captain Crumsh"
desc = "A resident worker at the NSB Rascal's Pass, Captain Crumsh \
comes from a long line of catslug leaders, maintaining the family tradition \
for numerous years now. After a long tenure serving at Central Command, they \
requested transfer to a more \"front-facing\" facility, ending up shipped across \
to the facilty recently set up on Virgo 3C. - \
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/custom/capslug
name = "Captain Crumsh"
desc = "A regal-blue furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one wears an impressive tower of hats upon it's head. Exudes a sense of superiority, clearly this 'slug has more porl than you."
tt_desc = "Mollusca Felis Praefectus"
icon_state = "capslug"
icon_living = "capslug"
icon_rest = "capslug_rest"
icon_dead = "capslug_dead"
faction = "neutral"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/capslug)
holder_type = /obj/item/weapon/holder/catslug/custom/capslug
say_list_type = /datum/say_list/catslug/custom/capslug
mobcard_access = list(access_maint_tunnels) //The all_station_access part below adds onto this.
/datum/say_list/catslug/custom/capslug
speak = list("How open big glass box with shiny inside?.", "What is that?", "Respect my authority!", "What are you doing?", "How did you get here?", "Fax for yellow-shirts!", "WAOW!", "Why is that console blinking and clicking?", "Do we need to call for ERT?", "Have been called comdom before, not sure why they thought I was a balloon.")
/obj/item/weapon/holder/catslug/custom/capslug
item_state = "capslug"
/mob/living/simple_mob/vore/alienanimals/catslug/custom/capslug/Initialize() //This is such an awful proc, but if someone wants it better they're welcome to have a go at it.
. = ..()
mob_radio = new /obj/item/device/radio/headset/mob_headset(src)
mob_radio.frequency = PUB_FREQ
mob_radio.ks2type = /obj/item/device/encryptionkey/heads/captain //Might not be able to speak, but the catslug can listen.
mob_radio.keyslot2 = new /obj/item/device/encryptionkey/heads/captain(mob_radio)
mob_radio.recalculateChannels(1)
mobcard.access |= get_all_station_access()
//=============================================================================
//Admin-spawn only catslugs below - Expect overpowered things & silliness below
//=============================================================================
//Deathsquad catslug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/deathslug
name = "Asset Purrtection"
desc = "What are you doing staring at this angry little fella? <b>Run.</b>"
tt_desc = "Mollusca Felis Eversor"
icon_state = "deathslug"
icon_living = "deathslug"
icon_rest = "deathslug_rest"
icon_dead = "deathslug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug) //So they don't get the spaceslug's cataloguer entry
say_list_type = /datum/say_list/catslug //Similarly, so they don't get the spaceslug's speech lines.
mobcard_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
maxHealth = 100 //Tough noodles
health = 100
taser_kill = 0
mob_size = MOB_MEDIUM //As funny as picking up deathslugs & throwing them at people to be merked would be, I'm not willing to sprite their holders. Something something hardsuit heavy can be the "IC" reason for this.
siemens_coefficient = 0
armor = list(
"melee" = 60,
"bullet" = 50,
"laser" = 50,
"energy" = 40,
"bomb" = 40,
"bio" = 100,
"rad" = 100
)
minbodytemp = 0
maxbodytemp = 5000
player_msg = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors and Asset Protection Commandos."
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/deathslug/Initialize()
. = ..()
mob_radio = new /obj/item/device/radio/headset/mob_headset(src)
mob_radio.frequency = DTH_FREQ //Can't tell if bugged, deathsquad freq in general seems broken
mobcard.access |= get_all_station_access()
//Syndicate catslug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/syndislug
name = "Mercenyary"
desc = "What are you doing staring at this crimson-hardsuit wearing angry little fella? <b>Run.</b>"
tt_desc = "Mollusca Felis Mors"
icon_state = "syndislug"
icon_living = "syndislug"
icon_rest = "syndislug_rest"
icon_dead = "syndislug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug)
say_list_type = /datum/say_list/catslug
mobcard_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
faction = "syndicate"
maxHealth = 100 //Tough noodles
health = 100
taser_kill = 0
melee_damage_lower = 15
melee_damage_upper = 20
mob_size = MOB_MEDIUM //Something something hardsuits are heavy.
siemens_coefficient = 0
armor = list(
"melee" = 80,
"bullet" = 65,
"laser" = 50,
"energy" = 15,
"bomb" = 80,
"bio" = 100,
"rad" = 60
)
minbodytemp = 0
maxbodytemp = 5000
player_msg = "You are in the employ of a criminal syndicate hostile to corporate interests. Follow the Mercenary or Commando's orders and assist them in their goals by any means available."
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/syndislug/Initialize()
. = ..()
mob_radio = new /obj/item/device/radio/headset/mob_headset(src)
mob_radio.frequency = SYND_FREQ
mob_radio.syndie = 1
mob_radio.ks2type = /obj/item/device/encryptionkey/syndicate
mob_radio.keyslot2 = new /obj/item/device/encryptionkey/syndicate(mob_radio)
mob_radio.recalculateChannels(1)
mobcard.access |= get_all_station_access()
//ERT catslug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/responseslug
name = "Emeowgency Responder"
desc = "The cavalry has arrived."
tt_desc = "Mollusca Felis Salvator"
icon_state = "responseslug"
icon_living = "responseslug"
icon_rest = "responseslug_rest"
icon_dead = "responseslug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug)
say_list_type = /datum/say_list/catslug
mobcard_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
maxHealth = 100 //Tough noodles
health = 100
taser_kill = 0
mob_size = MOB_MEDIUM //Something something hardsuits are heavy.
siemens_coefficient = 0
armor = list(
"melee" = 60,
"bullet" = 50,
"laser" = 30,
"energy" = 15,
"bomb" = 30,
"bio" = 100,
"rad" = 100
)
minbodytemp = 0
maxbodytemp = 5000
player_msg = "You are an <b>anti</b> antagonist! Within the rules, try to save the station and its inhabitants from the ongoing crisis. Try to make sure other players have <i>fun</i>! \
If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! \
Think through your actions and make the roleplay immersive! <b>Please remember all rules aside from those without explicit exceptions apply to the ERT.</b>"
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/responseslug/Initialize()
. = ..()
mob_radio = new /obj/item/device/radio/headset/mob_headset(src)
mob_radio.frequency = ERT_FREQ
mob_radio.centComm = 1
mob_radio.ks2type = /obj/item/device/encryptionkey/ert
mob_radio.keyslot2 = new /obj/item/device/encryptionkey/ert(mob_radio)
mob_radio.recalculateChannels(1)
mobcard.access |= get_all_station_access()
//=============================
//Admin-spawn only catslugs end
//=============================
//Suslug's below
/mob/living/simple_mob/vore/alienanimals/catslug/suslug
name = "suslug"
desc = "A noodley bodied creature wearing a colorful space suit. Suspicious..."
tt_desc = "Mollusca Felis Amogus"
icon_state = "suslug"
icon_living = "suslug"
icon_rest = "suslug_rest"
icon_dead = "suslug_dead"
var/image/eye_image
var/is_impostor = FALSE
var/kill_cooldown
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/impostor
is_impostor = TRUE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/Initialize()
. = ..()
verbs += /mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/assussinate
update_icon()
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/update_icon()
..()
update_suslug_eyes()
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/update_suslug_eyes()
cut_overlay(eye_image)
eye_image = image(icon,null,"[icon_state]-eyes")
eye_image.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE
add_overlay(eye_image)
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/can_ventcrawl()
if(!is_impostor)
to_chat(src, "<span class='notice'>You are not an impostor! You can't vent!</span>")
return FALSE
.=..()
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/examine(mob/user)
. = ..()
if(istype(user, /mob/living/simple_mob/vore/alienanimals/catslug/suslug))
var/mob/living/simple_mob/vore/alienanimals/catslug/suslug/us = user
if(us.is_impostor)
if(src.is_impostor)
. += "<span class='notice'>They appear to be a fellow impostor!</span>"
else
. += "<span class='notice'>They appear to be a filthy innocent!</span>"
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/assussinate()
set name = "Kill Innocent"
set category = "Abilities"
set desc = "Kill an innocent suslug!"
if(!is_impostor)
to_chat(src, "<span class='notice'>You are not an impostor! You can't kill like that!</span>")
return
if((world.time - kill_cooldown) < 1 MINUTE)
to_chat(src, "<span class='notice'>You cannot kill so soon after previous kill!</span>")
return
var/mob/living/simple_mob/vore/alienanimals/catslug/suslug/target
var/list/victims = list()
for(var/mob/living/simple_mob/vore/alienanimals/catslug/suslug/S in range(1))
if(!S.is_impostor)
victims += S
if(!victims || !victims.len)
to_chat(src, "<span class='warning'>There are no innocent suslugs nearby!</span>")
return
if(victims.len == 1)
target = victims[1]
else
target = tgui_input_list(usr, "Kill", "Pick a victim", victims)
if(target && istype(target))
target.adjustBruteLoss(3000)
visible_message("<span class='warning'>\The [src] kills \the [target]!</span>")
kill_cooldown = world.time
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color
picked_color = TRUE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/white
color = COLOR_WHITE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/red
color = COLOR_RED
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/blue
color = COLOR_BLUE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/lime
color = COLOR_LIME
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/cyan
color = COLOR_CYAN
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/pink
color = COLOR_PINK
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/yellow
color = COLOR_YELLOW
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/orange
color = COLOR_ORANGE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/green
color = COLOR_GREEN
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/violet
color = COLOR_VIOLET
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/orange
color = COLOR_ORANGE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/brown
color = COLOR_DARK_BROWN
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/grey
color = COLOR_GRAY
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/black
color = COLOR_DARK_GRAY
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/beige
color = COLOR_BEIGE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/maroon
color = COLOR_MAROON
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/navy
color = COLOR_NAVY
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/light_pink
color = COLOR_LIGHT_PINK
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/light_yellow
color = COLOR_WHEAT
@@ -1,7 +1,16 @@
/datum/category_item/catalogue/fauna/skeleton
name = "Alien Wildlife - Space Skeleton"
desc = "A creature consisting primarily of what appears to be bones with no apparent connective tissue, muscle, or organs.\
It is not clear at all how this creature even operates."
desc = "Classification: Sentientis osseous\
<br><br>\
No one, not scientist or wildlife expert can properly explain these spacial skeletons with any solid \
certanty. They are not human, despite the clear simularites to a human's skeleton, nor are they made of \
calcium like normal bones. Samples taken from the corpses of these strange creatures have yieled little \
in the form of answers and have only raised more questions with regards to their general existence. \
Scientist are still studying these beings, a difficult task as they are difficult to come by in the \
vaccum of space. The only information that scientist are able to gather about these so-called 'Space \
Skeletons' as people have come to call them is that their structure is comprised of a strange cell \
structure that is similar to plants - likely because these creatures are known to feed of the UV \
rays of nearby stars."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/vore/alienanimals/skeleton
@@ -67,6 +76,11 @@
vore_default_contamination_color = "grey"
vore_default_item_mode = IM_DIGEST
/mob/living/simple_mob/vore/alienanimals/skeleton/alt
icon_state = "altskeleton"
icon_living = "altskeleton"
icon_dead = "altskeleton_dead"
/datum/say_list/skeleton
speak = list("Nyeh heh heeeh","NYAAAAHHHH", "Books are the real treasures of the world!", "Why are skeletons so calm? Because nothing gets under their skin.","When does a skeleton laugh? When someone tickels their funny bone!","What is a skeletons favorite mode of transport? A scare-plane.", "What did the skeleton say to the vampire? 'You suck.'","What is a skeletons favorite thing to do with their cell phone? Take skelfies.", "How did the skeleton know the other skeleton was lying? He could see right through him.","Whats a skeletons least favorite room in the house? The living room.", "How much does an elephant skeleton weigh? Skele-tons.", "Why do skeletons drink so much milk? Its good for the bones!", "Where do bad jokes about skeletons belong? In the skelebin.","What does a skeleton use to cut through objects? A shoulder blade.", "What kind of jokes do skeletons tell? Humerus ones.")
emote_see = list("spins its head around", "shuffles","shambles","practices on the xylophone","drinks some milk","looks at you. Its hollow, bottomless sockets gaze into you greedily.")
@@ -71,7 +71,7 @@
"rad" = 100
)
loot_list = list(/obj/item/weapon/ore/diamond = 100)
loot_list = list(/obj/item/weapon/ore/diamond = 100, /obj/item/weapon/ectoplasm = 3)
speak_emote = list("rumbles")
@@ -101,14 +101,14 @@
/mob/living/simple_mob/vore/alienanimals/space_ghost/shoot(atom/A) //We're shooting ghosts at people and need them to have the same faction as their parent, okay?
if(!projectiletype)
return
return
if(A == get_turf(src))
return
face_atom(A)
if(reload_count >= reload_max)
return
var/mob/living/simple_mob/P = new projectiletype(loc, src)
if(!P)
return
if(needs_reload)
@@ -0,0 +1,76 @@
//Base cockroach
/mob/living/simple_mob/animal/passive/cockroach
name = "cockroach"
real_name = "cockroach"
desc = "This station is just crawling with bugs."
tt_desc = "E Blattella germanica"
icon_state = "cockroach"
item_state = "cockroach"
icon_living = "cockroach"
icon_dead = "cockroach_rest" //No real 'dead' sprite
icon_rest = "cockroach_rest"
maxHealth = 1
health = 1
movement_cooldown = 2.5
mob_size = MOB_MINISCULE
pass_flags = PASSTABLE
can_pull_mobs = MOB_PULL_NONE
layer = MOB_LAYER
density = FALSE
response_help = "pokes"
response_disarm = "shoos"
response_harm = "splats"
speak_emote = list("chitters")
//Cockroaches are enviromentally superior
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 999999
var/squish_chance = 25
//Deletes the body upon death
/mob/living/simple_mob/animal/passive/cockroach/death()
new /obj/effect/decal/cleanable/bug_remains(src.loc)
qdel(src)
//Squish code
/mob/living/simple_mob/animal/passive/cockroach/Crossed(var/atom/movable/AM)
if(ismob(AM))
if(isliving(AM))
var/mob/living/A = AM
if(A.mob_size > MOB_SMALL)
if(prob(squish_chance))
A.visible_message("<span class='notice'>[A] squashed [src].</span>", "<span class='notice'>You squashed [src].</span>")
adjustBruteLoss(1) //kills a normal cockroach
else
visible_message("<span class='notice'>[src] avoids getting crushed.</span>")
else
if(isstructure(AM))
if(prob(squish_chance))
AM.visible_message("<span class='notice'>[src] was crushed under [AM].</span>")
adjustBruteLoss(1)
else
visible_message("<span class='notice'>[src] avoids getting crushed.</span>")
/mob/living/simple_mob/animal/passive/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach.
return
//Custom stain so it's not "spiderling remains"
/obj/effect/decal/cleanable/bug_remains
name = "bug remains"
desc = "Green squishy mess."
icon = 'icons/effects/effects.dmi'
icon_state = "greenshatter"
@@ -57,14 +57,14 @@
// Used for a special grenade, to ensure they don't attack the wrong thing.
/mob/living/simple_mob/mechanical/viscerator/mercenary/IIsAlly(mob/living/L)
. = ..()
if(!.) // Not friendly, see if they're a baddie first.
if(!. && isliving(L)) // Not friendly, see if they're a baddie first.
if(L.mind && mercs.is_antagonist(L.mind))
return TRUE
// Similar to above but for raiders.
/mob/living/simple_mob/mechanical/viscerator/raider/IIsAlly(mob/living/L)
. = ..()
if(!.) // Not friendly, see if they're a baddie first.
if(!. && isliving(L)) // Not friendly, see if they're a baddie first.
if(L.mind && raiders.is_antagonist(L.mind))
return TRUE
@@ -83,7 +83,7 @@
/mob/living/simple_mob/mechanical/viscerator/station/IIsAlly(mob/living/L)
. = ..()
if(!.)
if(!. && isliving(L))
if(isrobot(L)) // They ignore synths.
return TRUE
if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards
@@ -97,4 +97,4 @@
movement_cooldown = 0.5
/decl/mob_organ_names/viscerator
hit_zones = list("chassis", "rotor blades", "sensor array")
hit_zones = list("chassis", "rotor blades", "sensor array")
@@ -1,7 +0,0 @@
/mob/living/simple_mob/slime/xenobio
temperature_range = 5
mob_bump_flag = SLIME
/mob/living/simple_mob/slime/xenobio/Initialize(mapload, var/mob/living/simple_mob/slime/xenobio/my_predecessor)
. = ..()
Weaken(10)

Some files were not shown because too many files have changed in this diff Show More