Merge branch 'master' into upstream-merge-8298

This commit is contained in:
Novacat
2022-03-22 08:53:45 -04:00
committed by GitHub
218 changed files with 4106 additions and 853 deletions
+1
View File
@@ -18,6 +18,7 @@
#define DM_FLAG_THICKBELLY 0x8
#define DM_FLAG_AFFECTWORN 0x10
#define DM_FLAG_JAMSENSORS 0x20
#define DM_FLAG_FORCEPSAY 0x40
//Item related modes
#define IM_HOLD "Hold"
+2 -1
View File
@@ -8,7 +8,8 @@
#define BORG_MODULE_MEDICAL (1<<3)
/// Module is compatible with Engineering Cyborg models
#define BORG_MODULE_ENGINEERING (1<<4)
/// Module is compatible with Science Cyborg models
#define BORG_MODULE_SCIENCE (1<<5)
/// Module is compatible with Ripley Exosuit models
#define EXOSUIT_MODULE_RIPLEY (1<<0)
/// Module is compatible with Odyseeus Exosuit models
+1 -1
View File
@@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Cu
var/datum/category_collection/underwear/global_underwear = new()
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag", "Sports Bag")
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag", "Sports Bag", "Strapless Satchel") //VOREStation edit
var/global/list/pdachoicelist = list("Default", "Slim", "Old", "Rugged", "Holographic", "Wrist-Bound", "Slider")
var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg)
+5
View File
@@ -453,6 +453,11 @@ Turf and target are seperate in case you want to teleport some distance from a t
moblist.Add(M)
for(var/mob/living/simple_mob/M in sortmob)
moblist.Add(M)
//VOREStation Addition Start
for(var/mob/living/dominated_brain/M in sortmob)
moblist.Add(M)
//VOREStation Addition End
// for(var/mob/living/silicon/hivebot/M in sortmob)
// mob_list.Add(M)
// for(var/mob/living/silicon/hive_mainframe/M in sortmob)
@@ -56,3 +56,14 @@
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/scopedrifle
name = "Bolt scope to bolt-action (cannot be removed)"
result = /obj/item/weapon/gun/projectile/shotgun/pump/rifle/scoped
reqs = list(
/obj/item/device/binoculars/scope = 1,
/obj/item/weapon/gun/projectile/shotgun/pump/rifle = 1
)
time = 180
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
+3 -1
View File
@@ -57,6 +57,7 @@ var/list/outfits_decls_by_type_
var/satchel_two = /obj/item/weapon/storage/backpack/satchel
var/messenger_bag = /obj/item/weapon/storage/backpack/messenger
var/sports_bag = /obj/item/weapon/storage/backpack/sport
var/satchel_three = /obj/item/weapon/storage/backpack/satchel/strapless
var/flags // Specific flags
@@ -78,6 +79,7 @@ var/list/outfits_decls_by_type_
if(4) back = satchel_two
if(5) back = messenger_bag
if(6) back = sports_bag
if(7) back = satchel_three
else back = null
/decl/hierarchy/outfit/proc/post_equip(mob/living/carbon/human/H)
@@ -183,4 +185,4 @@ var/list/outfits_decls_by_type_
return pda
/decl/hierarchy/outfit/dd_SortValue()
return name
return name
+1 -1
View File
@@ -134,7 +134,7 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go
uniform_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot1 = 1)
id_slot = slot_wear_id
pda_slot = slot_belt
pda_type = /obj/item/device/pda
pda_type = /obj/item/device/pda/pilot
id_type = /obj/item/weapon/card/id/civilian/pilot
id_pda_assignment = "Pilot"
flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL
+15
View File
@@ -21,6 +21,10 @@ GLOBAL_VAR_INIT(items_sold_shift_roundstat, 0)
GLOBAL_VAR_INIT(disposals_flush_shift_roundstat, 0)
GLOBAL_VAR_INIT(rocks_drilled_roundstat, 0)
GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
GLOBAL_VAR_INIT(prey_eaten_roundstat, 0) //VOREStation Edit - Obviously
GLOBAL_VAR_INIT(prey_absorbed_roundstat, 0) //VOREStation Edit - Obviously
GLOBAL_VAR_INIT(prey_digested_roundstat, 0) //VOREStation Edit - Obviously
GLOBAL_VAR_INIT(items_digested_roundstat, 0) //VOREStation Edit - Obviously
/hook/roundend/proc/RoundTrivia()//bazinga
var/list/valid_stats_list = list() //This is to be populated with the good shit
@@ -50,6 +54,17 @@ GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
else if(GLOB.disposals_flush_shift_roundstat > 40)
valid_stats_list.Add("The disposal system flushed a whole [GLOB.disposals_flush_shift_roundstat] times for this shift. We should really invest in waste treatement.")
//VOREStation Add Start - Vore stats lets gooooo
if(GLOB.prey_eaten_roundstat > 0)
valid_stats_list.Add("A total of [GLOB.prey_eaten_roundstat] individuals were eaten today!")
if(GLOB.prey_digested_roundstat > 0)
valid_stats_list.Add("A total of [GLOB.prey_digested_roundstat] individuals were digested today!")
if(GLOB.prey_absorbed_roundstat > 0)
valid_stats_list.Add("A total of [GLOB.prey_absorbed_roundstat] individuals were absorbed today!")
if(GLOB.items_digested_roundstat > 0)
valid_stats_list.Add("A total of [GLOB.items_digested_roundstat] items were digested today!")
//VOREStation Add End
if(LAZYLEN(valid_stats_list))
to_world("<B>Shift trivia!</B>")
+1 -1
View File
@@ -29,7 +29,7 @@
/obj/item/weapon/reagent_containers/food/snacks/berrymuffin,
/obj/item/weapon/reagent_containers/food/snacks/bunbun,
/obj/item/weapon/reagent_containers/food/snacks/cherrypie,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack,
/obj/item/weapon/reagent_containers/food/snacks/cookie,
/obj/item/weapon/reagent_containers/food/snacks/croissant,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
+11
View File
@@ -129,6 +129,17 @@
containername = "Ballistic weapon crate"
access = access_armory
/datum/supply_pack/munitions/bolt_rifles_lethal
name = "Weapons - Bolt-Action Rifles"
contains = list(
/obj/item/weapon/gun/projectile/shotgun/pump/rifle = 2,
/obj/item/ammo_magazine/ammo_box/b762 = 4,
)
cost = 60
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Ballistic Weapons crate"
access = access_armory
/datum/supply_pack/munitions/bolt_rifles_competitive
name = "Weapons - Competitive shooting rifles"
contains = list(
+7 -1
View File
@@ -22,7 +22,8 @@
"Security Cadet" = /datum/alt_title/intern_sec,
"Jr. Cargo Tech" = /datum/alt_title/intern_crg,
"Jr. Explorer" = /datum/alt_title/intern_exp,
"Server" = /datum/alt_title/server)
"Server" = /datum/alt_title/server,
"Assistant" = /datum/alt_title/assistant)
job_description = "An Intern does whatever is requested of them, often doing so in process of learning \
another job. Though they are part of the crew, they have no real authority."
timeoff_factor = 0 // Interns, noh
@@ -68,6 +69,11 @@
title_blurb = "A Server helps out kitchen and diner staff with various tasks, primarily food delivery. A Server has no real authority."
title_outfit = /decl/hierarchy/outfit/job/service/server
/datum/alt_title/assistant
title = "Assistant"
title_blurb = "An assistant helps out wherever they might be needed. They have no authority, but can volunteer to help if help is needed."
title_outfit = /decl/hierarchy/outfit/job/service/server
/datum/job/intern/New()
..()
if(config)
+3 -3
View File
@@ -213,8 +213,8 @@
economic_modifier = 5
minimal_player_age = 3
pto_type = PTO_CIVILIAN
access = list(access_pilot)
minimal_access = list(access_pilot)
access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot)
minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot)
outfit_type = /decl/hierarchy/outfit/job/pilot
job_description = "A Pilot flies the various shuttles in the Virgo-Erigone System."
alt_titles = list("Co-Pilot" = /datum/alt_title/co_pilot, "Navigator" = /datum/alt_title/navigator, "Helmsman" = /datum/alt_title/helmsman)
@@ -293,4 +293,4 @@
/datum/alt_title/artist
title = "Artist"
title_blurb = "An Artist's calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity."
title_blurb = "An Artist's calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity."
+11 -2
View File
@@ -528,9 +528,18 @@
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
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)
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)
//VOREStation Edit End
//VOREStation Edit begin: Dont delete mobs-in-mobs
if(to_despawn.client && to_despawn.stat<2)
+6 -3
View File
@@ -31,7 +31,7 @@
var/time_coeff = 1
/// Coefficient for the efficiency of material usage in item building. Based on the installed parts.
var/component_coeff = 1
var/loading_icon_state = "mechfab-idle"
var/list/materials = list(
@@ -148,6 +148,9 @@
sub_category += "Medical"
if(module_types & BORG_MODULE_ENGINEERING)
sub_category += "Engineering"
if(module_types & BORG_MODULE_SCIENCE)
sub_category += "Science"
else
sub_category += "All Cyborgs"
// Else check if this design builds a piece of exosuit equipment.
@@ -309,7 +312,7 @@
atom_say("Obstruction cleared. \The [stored_part] is complete.")
stored_part.forceMove(exit)
stored_part = null
// If there's nothing being built, try to build something
if(!being_built)
// If we're not processing the queue anymore or there's nothing to build, end processing.
@@ -703,7 +706,7 @@
// Reduce our amount stored
materials[matstring] -= ejected * S.perunit
// Recurse if we have enough left for more sheets
if(recursive && materials[matstring] >= S.perunit)
eject_materials(matstring, -1)
@@ -18,4 +18,9 @@
name = "spyglass"
desc = "It's a hand-held telescope, useful for star-gazing, peeping, and recon."
icon_state = "spyglass"
slot_flags = SLOT_BELT
slot_flags = SLOT_BELT
/obj/item/device/binoculars/scope
name = "rifle scope"
desc = "It's a rifle scope. Would be better if it were actually attached to a rifle."
icon_state = "rifle_scope"
+28 -5
View File
@@ -1,15 +1,38 @@
/*
* Sidearm Lethal
*/
/obj/item/gunbox
name = "detective's gun box"
desc = "A secure box containing a Detective's sidearm."
name = "sidearm box"
desc = "A secure box containing a lethal sidearm."
icon = 'icons/obj/storage.dmi'
icon_state = "gunbox"
w_class = ITEMSIZE_HUGE
/obj/item/gunbox/attack_self(mob/living/user)
var/list/options = list()
options[".45 Pistol"] = list(/obj/item/weapon/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber)
options[".45 Revolver"] = list(/obj/item/weapon/gun/projectile/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber)
options["M1911 (.45)"] = list(/obj/item/weapon/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber)
options["MT Mk58 (.45)"] = list(/obj/item/weapon/gun/projectile/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber)
options["MarsTech R1 (.45)"] = list(/obj/item/weapon/gun/projectile/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber)
options["MarsTech P92X (9mm)"] = list(/obj/item/weapon/gun/projectile/p92x/rubber, /obj/item/ammo_magazine/m9mm/rubber, /obj/item/ammo_magazine/m9mm/rubber)
var/choice = tgui_input_list(user,"Would you prefer a pistol or a revolver?", "Gun!", options)
if(src && choice)
var/list/things_to_spawn = options[choice]
for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
var/atom/movable/AM = new new_type(get_turf(src))
if(istype(AM, /obj/item/weapon/gun))
to_chat(user, "You have chosen \the [AM]. Say hello to your new friend.")
qdel(src)
/*
* Sidearm Stun
*/
/obj/item/gunbox/stun
name = "non-lethal sidearm box"
desc = "A secure box containing a non-lethal sidearm."
/obj/item/gunbox/stun/attack_self(mob/living/user)
var/list/options = list()
options["Stun Revolver"] = list(/obj/item/weapon/gun/energy/stunrevolver/detective, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
options["Taser"] = list(/obj/item/weapon/gun/energy/taser, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
var/choice = tgui_input_list(user,"Please, select an option.", "Stun Gun!", options)
if(src && choice)
var/list/things_to_spawn = options[choice]
for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
+14 -11
View File
@@ -1,18 +1,21 @@
/obj/item/gunbox
name = "security sidearm box"
desc = "A secure box containing a security sidearm."
/*
* Shotgun Box
*/
/obj/item/gunbox/warden
name = "warden's shotgun case"
desc = "A secure guncase containing the warden's beloved shotgun."
icon = 'icons/obj/storage_vr.dmi'
icon_state = "gunboxw"
/obj/item/gunbox/attack_self(mob/living/user)
/obj/item/gunbox/warden/attack_self(mob/living/user)
var/list/options = list()
options["M1911 (.45)"] = list(/obj/item/weapon/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber)
options["NT Mk58 (.45)"] = list(/obj/item/weapon/gun/projectile/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber)
options["SW 625 Revolver (.45)"] = list(/obj/item/weapon/gun/projectile/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber)
options["P92X (9mm)"] = list(/obj/item/weapon/gun/projectile/p92x/sec, /obj/item/ammo_magazine/m9mm/rubber, /obj/item/ammo_magazine/m9mm/rubber)
var/choice = tgui_input_list(user,"Would you prefer a pistol or a revolver?", "Gun!", options)
options["Warden's combat shotgun"] = list(/obj/item/weapon/gun/projectile/shotgun/pump/combat/warden, /obj/item/ammo_magazine/ammo_box/b12g/beanbag)
options["Warden's compact shotgun"] = list(/obj/item/weapon/gun/projectile/shotgun/compact/warden, /obj/item/ammo_magazine/ammo_box/b12g/beanbag)
var/choice = tgui_input_list(user,"Choose your boomstick!", "Shotgun!", options)
if(src && choice)
var/list/things_to_spawn = options[choice]
for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
var/atom/movable/AM = new new_type(get_turf(src))
if(istype(AM, /obj/item/weapon/gun))
to_chat(user, "You have chosen \the [AM]. Say hello to your new friend.")
qdel(src)
to_chat(user, "You have chosen \the [AM]. Say hello to your new best friend.")
qdel(src)
@@ -155,7 +155,7 @@
/obj/item/borg/upgrade/advhealth
name = "advanced health analyzer module"
desc = "A carbon dioxide jetpack suitable for low-gravity operations."
desc = "An Advanced Health Analyzer, optimized for borg mounting."
icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
require_module = 1
@@ -214,4 +214,4 @@
R.add_language(LANGUAGE_TERMINUS, 1)
R.add_language(LANGUAGE_ZADDAT, 1)
return 1
return 1
@@ -66,3 +66,93 @@
to_chat(usr, "Internal capacity doubled.")
T.upgraded_capacity = TRUE
return 1
//Advanced RPED
/obj/item/borg/upgrade/advrped
name = "Advanced Rapid Part Exchange Device"
desc = "An ARPED, now in borg size!"
icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
module_flags = BORG_MODULE_SCIENCE
require_module = 1
/obj/item/borg/upgrade/advrped/action(var/mob/living/silicon/robot/R)
if(..()) return 0
var/obj/item/weapon/storage/part_replacer/adv/T = locate() in R.module
if(!R.module || !(type in R.module.supported_upgrades))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
if(!T)
T = locate() in R.module.contents
if(!T)
T = locate() in R.module.modules
if(!T)
R.module.modules += new/obj/item/weapon/storage/part_replacer/adv(R.module)
return 1
if(T)
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
//Diamond Drill
/obj/item/borg/upgrade/diamonddrill
name = "Mounted Diamond Drill"
desc = "An advanced drill, optimized for borg use."
icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
module_flags = BORG_MODULE_MINER
require_module = 1
/obj/item/borg/upgrade/diamonddrill/action(var/mob/living/silicon/robot/R)
if(..()) return 0
var/obj/item/weapon/pickaxe/diamonddrill/T = locate() in R.module
if(!R.module || !(type in R.module.supported_upgrades))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
if(!T)
T = locate() in R.module.contents
if(!T)
T = locate() in R.module.modules
if(!T)
R.module.modules += new/obj/item/weapon/pickaxe/diamonddrill(R.module)
return 1
if(T)
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
//PKA
/obj/item/borg/upgrade/pka
name = "Protokenetic Accelerator Upgrade"
desc = "A borg mounted PKA Rifle for use in mining and wildlife defense."
icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
module_flags = BORG_MODULE_MINER
require_module = 1
/obj/item/borg/upgrade/pka/action(var/mob/living/silicon/robot/R)
if(..()) return 0
var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/T = locate() in R.module
if(!R.module || !(type in R.module.supported_upgrades))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
if(!T)
T = locate() in R.module.contents
if(!T)
T = locate() in R.module.modules
if(!T)
R.module.modules += new/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(R.module)
return 1
if(T)
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return 0
@@ -47,7 +47,7 @@
force = 3.0
max_water = 600
spray_particles = 3
sprite_name = "atmo_extinguisher"
sprite_name = "atmos_extinguisher"
rand_overlays = 0
/obj/item/weapon/extinguisher/Initialize()
@@ -72,7 +72,8 @@
/obj/item/device/integrated_electronics/wirer,
/obj/item/device/integrated_electronics/debugger, //Vorestation edit adding debugger to toolbelt can hold list
/obj/item/weapon/shovel/spade, //VOREStation edit. If it can hold minihoes and hatchers, why not the gardening spade?
/obj/item/stack/nanopaste //VOREStation edit. Think of it as a tube of superglue. Belts hold that all the time.
/obj/item/stack/nanopaste, //VOREStation edit. Think of it as a tube of superglue. Belts hold that all the time.
/obj/item/device/geiger //VOREStation edit. Engineers work with rad-slinging stuff sometimes too
)
/obj/item/weapon/storage/belt/utility/full
@@ -102,7 +103,9 @@
/obj/item/weapon/tool/wrench,
/obj/item/weapon/weldingtool,
/obj/item/weapon/tool/crowbar,
/obj/item/weapon/tool/wirecutters
/obj/item/weapon/tool/wirecutters,
/obj/item/device/analyzer, //Vorestation edit. Gives atmos techs a few extra tools fitting their job from the start
/obj/item/weapon/extinguisher/mini //Vorestation edit. As above, the mini's much more handy to have rather than lugging a big one around
)
/obj/item/weapon/storage/belt/utility/chief
@@ -538,4 +541,4 @@
storage_slots = 8
can_hold = list(
/obj/item/ammo_casing/afoam_dart
)
)
@@ -7,4 +7,5 @@
max_storage_space = ITEMSIZE_COST_SMALL * 6
/obj/item/weapon/storage/toolbox/lunchbox/survival/zaddat
starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 6)
name = "zaddat survival lunchbox"
starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 6)
+2 -2
View File
@@ -12,7 +12,7 @@
/obj/item/weapon/tape_roll/proc/can_place(var/mob/living/carbon/human/H, var/mob/user)
if(istype(user, /mob/living/silicon/robot) || user == H)
return TRUE
for (var/obj/item/weapon/grab/G in H.grabbed_by)
if (G.loc == user && G.state >= GRAB_AGGRESSIVE)
return TRUE
@@ -36,7 +36,7 @@
to_chat(user, "<span class='warning'>\The [H] doesn't have any eyes.</span>")
return
if(H.glasses)
to_chat(user, "<span class='warning'>\The [H] is already wearing somethign on their eyes.</span>")
to_chat(user, "<span class='warning'>\The [H] is already wearing something on their eyes.</span>")
return
if(H.head && (H.head.body_parts_covered & FACE))
to_chat(user, "<span class='warning'>Remove their [H.head] first.</span>")
+3 -3
View File
@@ -460,9 +460,9 @@
/obj/item/ammo_magazine/s44
),
prob(1);list(
/obj/item/weapon/gun/projectile/revolver/webley/auto,
/obj/item/ammo_magazine/s44,
/obj/item/ammo_magazine/s44
/obj/item/weapon/gun/projectile/revolver/consul,
/obj/item/ammo_magazine/s44/rubber,
/obj/item/ammo_magazine/s44/rubber
)
)
+39 -2
View File
@@ -848,7 +848,7 @@
/obj/item/weapon/reagent_containers/food/snacks/donut/plain,
/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack)
/obj/item/weapon/reagent_containers/food/snacks/cookie)
/obj/random/mre/dessert/vegan
name = "random vegan MRE dessert"
@@ -984,4 +984,41 @@
prob(6);/obj/item/device/flashlight/color/orange,
prob(6);/obj/item/device/flashlight/color/yellow,
prob(2);/obj/item/device/flashlight/maglight
)
)
/obj/random/mug
name = "Random Mug"
desc = "This is a random coffee mug."
icon = 'icons/obj/drinks_mugs.dmi'
icon_state = "coffeecup_spawner"
/obj/random/mug/item_to_spawn()
return pick(/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/sol,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/fleet,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/fivearrows,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/psc,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/alma,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/almp,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/nt,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/metal/wulf,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/gilthari,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/zeng,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/wt,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/aether,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/bishop,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/oculum,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/one,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/puni,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/heart,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/pawn,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/diona,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/britcup,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/flame,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/blue,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/black,
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/green,
/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)
@@ -111,14 +111,14 @@
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
/obj/item/device/radio/headset/headset_eng,
/obj/item/device/radio/headset/headset_eng/alt,
/obj/item/clothing/suit/storage/hazardvest,
/obj/item/clothing/suit/storage/hazardvest/atmos, //VOREStation edit. Eng locker gets regular haz-vest, atmos gets the themed one of their own
/obj/item/clothing/mask/gas,
/obj/item/weapon/cartridge/atmos,
/obj/item/taperoll/atmos,
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos,
/obj/item/clothing/shoes/boots/winter/atmos,
/obj/item/weapon/tank/emergency/oxygen/engi,
/obj/item/weapon/storage/belt/utility) //VOREStation Add
/obj/item/weapon/storage/belt/utility/atmostech) //VOREStation edit. They don't get a toolbox to fill it from, so why not give a spare one that's full already?
/obj/structure/closet/secure_closet/atmos_personal/Initialize()
if(prob(50))
@@ -236,7 +236,7 @@
/obj/item/clothing/accessory/badge/holo/detective,
/obj/item/clothing/gloves/black,
///obj/item/gunbox, // VOREStation Removal
/obj/item/weapon/gun/energy/stunrevolver/vintage,
/obj/item/gunbox/stun,
/obj/item/weapon/storage/belt/detective,
/obj/item/weapon/storage/box/evidence,
/obj/item/device/radio/headset/headset_sec,
+10 -10
View File
@@ -554,7 +554,7 @@
jobs += "</tr><tr align='center'>"
counter = 0
jobs += "</tr></table>"
jobs += "</tr></table>"
//VOREstation Edit End
//Civilian (Grey)
@@ -635,7 +635,7 @@
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=[entry];jobban4=\ref[M]'><font color=red>[entry]</font></a></td>"
else
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=[entry];jobban4=\ref[M]'>[entry]</a></td>"
if(++counter >= 5) //So things dont get squiiiiished!
jobs += "</tr><tr align='center'>"
counter = 0
@@ -1417,10 +1417,10 @@
to_chat(usr, "<span class='filter_adminlog'>This can only be used on instances of type /mob/living/carbon/human</span>")
return
H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookiesnack(H), slot_l_hand )
if(!(istype(H.l_hand,/obj/item/weapon/reagent_containers/food/snacks/cookiesnack)))
H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookiesnack(H), slot_r_hand )
if(!(istype(H.r_hand,/obj/item/weapon/reagent_containers/food/snacks/cookiesnack)))
H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_l_hand )
if(!(istype(H.l_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie)))
H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_r_hand )
if(!(istype(H.r_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie)))
log_admin("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].")
message_admins("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].")
return
@@ -1558,7 +1558,7 @@
var/mob/M = locate(href_list["jumpto"])
if(!M)
return
var/turf/T = get_turf(M)
if(isturf(T))
usr.on_mob_jump()
@@ -1597,16 +1597,16 @@
var/mob/M = locate(href_list["sendmob"])
if(!M)
return
var/list/areachoices = return_sorted_areas()
var/choice = tgui_input_list(usr, "Pick an area:", "Send Mob", areachoices)
if(!choice)
return
var/area/A = areachoices[choice]
if(!A)
return
M.on_mob_jump()
M.forceMove(pick(get_area_turfs(A)))
var/msg = "[key_name_admin(usr)] teleported [ADMIN_LOOKUPFLW(M)]"
+1 -1
View File
@@ -267,7 +267,7 @@
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen, \
/obj/item/weapon/reagent_containers/food/snacks/candiedapple, \
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, \
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack, \
/obj/item/weapon/reagent_containers/food/snacks/cookie, \
/obj/item/weapon/reagent_containers/food/snacks/meatball, \
/obj/item/weapon/reagent_containers/food/snacks/plump_pie, \
/obj/item/weapon/reagent_containers/food/snacks/liquidfood)
@@ -306,4 +306,16 @@
"Brown Vest" = /obj/item/clothing/accessory/cowboy_vest/brown,
"Grey Vest" = /obj/item/clothing/accessory/cowboy_vest/grey
)
gear_tweaks += new/datum/gear_tweak/path(cowboy_vests)
gear_tweaks += new/datum/gear_tweak/path(cowboy_vests)
/datum/gear/accessory/pride
display_name = "pride pin selection"
path = /obj/item/clothing/accessory/pride
/datum/gear/accessory/pride/New()
..()
var/list/pridepins = list()
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))
@@ -81,9 +81,9 @@
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Talon Doctor")
/datum/gear/accessory/bluespace
display_name = "bluespace badge (Eng, Sec, Med, Exploration, Miner)"
display_name = "bluespace badge (Eng, Sec, Med, Exploration, Miner, Pilot)"
path = /obj/item/clothing/accessory/storage/bluespace
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner")
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard","Talon Miner","Pilot")
cost = 2
/datum/gear/accessory/webbing
@@ -123,4 +123,4 @@ Talon pin
/datum/gear/accessory/talonpin
display_name = "Talon pin"
description = "A small enamel pin of the Talon logo."
path = /obj/item/clothing/accessory/talon
path = /obj/item/clothing/accessory/talon
@@ -380,6 +380,12 @@
ckeywhitelist = list("erikthedog")
character_name = list("Erik Ramadwood")
/datum/gear/fluff/salvage_id
path = /obj/item/weapon/card/id/event/polymorphic/itg
display_name = "Salvage's ITG-ID card"
ckeywhitelist = list("essbie")
character_name = list("Savage")
// F CKEYS
/datum/gear/fluff/yikatihaki_armor
path = /obj/item/clothing/suit/armor/vox_scrap
@@ -1344,6 +1350,12 @@
// Y CKEYS
/datum/gear/fluff/lemon_plush
path = /obj/item/toy/plushie/fluff/lemonplush
display_name = "yellow slime plushie"
ckeywhitelist = list("yecrowbarman")
character_name = list("Lemon Yellow", "Lemon Gettler Yellow", "Lemon Lee Yellow", "Lemon Jade Yellow") //different sleeves, same char
// Z CKEYS
/datum/gear/fluff/tachika_medal
path = /obj/item/clothing/accessory/medal/conduct
@@ -140,3 +140,58 @@
display_name = "Cards Against The Galaxy (black deck)"
path = /obj/item/weapon/deck/cah/black
description = "The ever-popular Cards Against The Galaxy word game. Warning: may include traces of broken fourth wall. This is the black deck."
/datum/gear/wizoff
display_name = "WizOff"
path = /obj/item/weapon/deck/wizoff
/datum/gear/wizoffguide
display_name = "WizOff Guide"
path = /obj/item/weapon/book/manual/wizzoffguide
description = "The guide to playing the ever popular card game: Wiz-Off!"
/datum/gear/coffeemug
display_name = "coffee mugs"
description = "A coffee mug in various designs."
cost = 1
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug
/datum/gear/coffeemug/New()
..()
var/list/coffeemugs = list()
coffeemugs["plain coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug
coffeemugs["SCG coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/sol
coffeemugs["Fleet coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/fleet
coffeemugs["Five Arrows coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/fivearrows
coffeemugs["Pearlshield coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/psc
coffeemugs["Almach Association coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/alma
coffeemugs["Almach Protectorate coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/almp
coffeemugs["NT coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/nt
coffeemugs["Wulf Aeronautics mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/metal/wulf
coffeemugs["Gilthari Exports coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/gilthari
coffeemugs["Zeng-Hu coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/zeng
coffeemugs["Ward-Takahashi coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/wt
coffeemugs["Aether Atmospherics coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/aether
coffeemugs["Bishop Cybernetics coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/bishop
coffeemugs["Oculum Broadcast coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/oculum
coffeemugs["#1 coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/one
coffeemugs["#1 monkey coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/puni
coffeemugs["heart coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/heart
coffeemugs["pawn coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/pawn
coffeemugs["diona coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/diona
coffeemugs["british coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/britcup
coffeemugs["flame coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/flame
coffeemugs["blue coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/blue
coffeemugs["black coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/black
coffeemugs["green coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/green
coffeemugs["dark green coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/green/dark
coffeemugs["rainbow coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/rainbow
coffeemugs["metal coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/metal
coffeemugs["glass coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/glass
coffeemugs["tall coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall
coffeemugs["tall black coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall/black
coffeemugs["tall metal coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall/metal
coffeemugs["tall rainbow coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall/rainbow
coffeemugs["Talon coffee mug"] = /obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/talon
gear_tweaks += new /datum/gear_tweak/path(coffeemugs)
gear_tweaks += new /datum/gear_tweak/reagents(lunchables_drink_reagents())
@@ -13,6 +13,18 @@
display_name = "tourist, green"
path = /obj/item/clothing/shoes/tourist_2
/datum/gear/shoes/sneakerspurple
display_name = "sneakers, purple"
path = /obj/item/clothing/shoes/sneakerspurple
/datum/gear/shoes/sneakersblue
display_name = "sneakers, blue"
path = /obj/item/clothing/shoes/sneakersblue
/datum/gear/shoes/sneakersred
display_name = "sneakers, red"
path = /obj/item/clothing/shoes/sneakersred
/datum/gear/shoes/jackboots
display_name = "jackboots"
path = /obj/item/clothing/shoes/boots/jackboots
@@ -197,6 +197,18 @@
path = /obj/item/clothing/suit/cyberpunk
cost = 2
/datum/gear/suit/puffycoat/blue
display_name = "puffy coat, blue"
path = /obj/item/clothing/suit/storage/puffyblue
/datum/gear/suit/puffycoat/red
display_name = "puffy coat, red"
path = /obj/item/clothing/suit/storage/puffyred
/datum/gear/suit/puffycoat/purple
display_name = "puffy coat, purple"
path = /obj/item/clothing/suit/storage/puffypurple
/datum/gear/suit/poncho
display_name = "poncho selection"
path = /obj/item/clothing/accessory/poncho
@@ -226,7 +238,6 @@
)
gear_tweaks += new/datum/gear_tweak/path(ponchos)
/datum/gear/suit/roles/cloak
display_name = "cloak selection, departments"
path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo
@@ -119,3 +119,8 @@ Talon winter coat
display_name = "knight, Field Medic"
path = /obj/item/clothing/suit/armor/combat/crusader_explo/FM
allowed_roles = list ("Field Medic")
//Atmos-coloured hazard vest
display_name = "hazard vest, atmospherics"
path = /obj/item/clothing/suit/storage/hazardvest/atmos
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Engineer")
@@ -699,6 +699,26 @@
display_name = "heavy utility, galactic survey"
path = /obj/item/clothing/under/gsa_work
/*
* 80s
*/
/datum/gear/uniform/tropical_outfit/black
display_name = "tropical outfit, animal style"
path = /obj/item/clothing/under/tropical
/datum/gear/uniform/tropical_outfit/green
display_name = "tropical outfit, tropico-puke"
path = /obj/item/clothing/under/tropical/green
/datum/gear/uniform/tropical_outfit/pink
display_name = "tropical outfit, 3005 vintage"
path = /obj/item/clothing/under/tropical/pink
/datum/gear/uniform/tropical_outfit/blue
display_name = "tropical outfit, miami vice"
path = /obj/item/clothing/under/tropical/blue
/*
* Branded Uniforms
*/
@@ -237,3 +237,42 @@ Talon jumpsuit
"red and white" = /obj/item/clothing/under/summerdress/red
)
gear_tweaks += new/datum/gear_tweak/path(dresses)
// undersuits
/datum/gear/uniform/undersuit
display_name = "undersuit selection"
path = /obj/item/clothing/under/undersuit/
/datum/gear/uniform/undersuit/New()
..()
var/list/suits = list()
var/list/blacklisted_types = list(/obj/item/clothing/under/undersuit/sec,
/obj/item/clothing/under/undersuit/sec/hos,
/obj/item/clothing/under/undersuit/hazard,
/obj/item/clothing/under/undersuit/command,
/obj/item/clothing/under/undersuit/centcom)
for(var/obj/item/clothing/under/undersuit/undersuit_type as anything in typesof(/obj/item/clothing/under/undersuit))
if(undersuit_type in blacklisted_types)
continue
suits[initial(undersuit_type.name)] = undersuit_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(suits))
/datum/gear/uniform/undersuit_haz
display_name = "undersuit, hazard (Engineering)"
allowed_roles = list("Chief Engineer", "Atmospheric Technician", "Engineer")
path = /obj/item/clothing/under/undersuit/hazard
/datum/gear/uniform/undersuit_sec
display_name = "undersuit, security (Security)"
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
path = /obj/item/clothing/under/undersuit/sec
/datum/gear/uniform/undersuit_hos
display_name = "undersuit, security command (HoS)"
allowed_roles = list("Head of Security")
path = /obj/item/clothing/under/undersuit/sec/hos
/datum/gear/uniform/undersuit_com
display_name = "undersuit, command (SM/HoP)"
allowed_roles = list("Site Manager", "Head of Personnel")
path = /obj/item/clothing/under/undersuit/command
@@ -74,10 +74,3 @@
display_name = "bluespace bracelet"
path = /obj/item/clothing/gloves/bluespace
cost = 5
/datum/gear/utility/satchel_strapless
display_name = "satchel strapless"
path = /obj/item/weapon/storage/backpack/satchel/strapless
slot = slot_back
cost = 1
@@ -48,6 +48,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
// These are the three vars we're trying to find
// The approach differs based on the mob the client is controlling
var/name = null
var/species = null
var/ooc_notes = null
var/flavor_text = null
var/tag = C.prefs.directory_tag || "Unset"
@@ -61,12 +62,14 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
if(!find_record("name", H.real_name, data_core.hidden_general))
continue
name = H.real_name
species = "[H.custom_species ? H.custom_species : H.species.name]"
ooc_notes = H.ooc_notes
flavor_text = H.flavor_texts["general"]
if(isAI(C.mob))
var/mob/living/silicon/ai/A = C.mob
name = "[A.name] (Artificial Intelligence)"
name = A.name
species = "Artificial Intelligence"
ooc_notes = A.ooc_notes
flavor_text = null // No flavor text for AIs :c
@@ -74,7 +77,8 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
var/mob/living/silicon/robot/R = C.mob
if(R.scrambledcodes || (R.module && R.module.hide_on_manifest))
continue
name = "[R.name] ([R.modtype] [R.braintype])"
name = R.name
species = "[R.modtype] [R.braintype]"
ooc_notes = R.ooc_notes
flavor_text = R.flavor_text
@@ -85,6 +89,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
directory_mobs.Add(list(list(
"name" = name,
"species" = species,
"ooc_notes" = ooc_notes,
"tag" = tag,
"erptag" = erptag,
-5
View File
@@ -86,11 +86,6 @@
icon_state = "evening_gloves"
addblends = "evening_gloves_a"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/gloves/fingerless
desc = "A pair of gloves that don't actually cover the fingers."
name = "fingerless gloves"
+36 -2
View File
@@ -47,11 +47,38 @@
"worry about me",
"gossip about me",
"defame me",
"disbelieve my existence",
"conspire against me",
"draw me as the soyjack",
"put me in their tummies",
"crunchatize me",
"crunchatize me, cap'n!",
"wreck me",
"feed me",
"beg to get in my stomach",
"walk all over me",
"drink me like a milkshake",
"beg me to step on them",
"call me Mommy",
"call me Daddy",
"step on me",
"lay eggs down my throat",
"dream about me",
"choke me with their thighs",
"steal my lunch money",
"contact me about my spaceship's extended warranty",
"envy me",
"combo me",
"want to kidnap me",
"fold me in half",
"think my spacetruck is hot",
"hate my spacetruck",
"are more into my spacetruck than me",
"ask me for docking codes",
"think of me while kneading dough",
"gun me down in the streets of miami",
"drop me off of inconveniently high places",
"drop me into inconveniently tight places",
"leave threatening messages on my voicemail",
"write fanfiction about me",
"attempt to approach me"
@@ -71,6 +98,10 @@
"pursue me to the ends of the earth, constantly thwarted by inconsequential setbacks, and when they catch up and I ask in an exasperated voice why they respond 'you owe me a dollar'",
"call me just to 'chat' but actually mention they are moving and, obviously, since I'm the ONLY guy they know with a truck it would be great if I could help out, they said they'd buy me pizza but that doesn't really cover it",
"shuffle uncomfortably as we continue to sit in near-total silence having exhausted all topics of conversation hours ago but neither of us having worked up the spirit to suggest that we part ways and go home",
"shove me into their large gaping maw, covering me in drool as I descend into their warm depths, becoming covered by hot bubbling acids that dissolve my body while I play Animal Crossing New Leaf on my Nintendo 3DS",
"promise me McDonalds but conveniently forget to pull into the drivethrough on the way home, leaving me burgerless",
"leave me in the car all alone with my favorite music and a bottle of water in the summer",
"create designs of particularly verbose hats describing extreme complexities and deep philosophical implications of their unusually specific feelings and often not particularly kind thoughts about me",
"methodically place brick after agonising brick in the wall they are constructing to forever entomb me in the basement which they claimed contained a case of Amontillado wine"
)
@@ -113,6 +144,9 @@
desc = "A peaked cap with text reading '[slogan]'."
name = "\improper '[slogan]' hat"
//pick a hue
var/colourtype = pick("green", "red", "blue", "yellow", "purple", "orange", "grey")
//finally, take our hat size and pick the icon accordingly
icon_state = "greensoft[hatsize]"
item_state_slots = list(slot_r_hand_str = "greensoft", slot_l_hand_str = "greensoft", slot_head_str = "greensoft[hatsize]")
icon_state = "[colourtype]soft[hatsize]"
item_state_slots = list(slot_r_hand_str = "[colourtype]soft", slot_l_hand_str = "[colourtype]soft", slot_head_str = "[colourtype]soft[hatsize]")
+23 -1
View File
@@ -233,4 +233,26 @@
icon_state = "rag"
force = 0
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
/*
* 80s
*/
/obj/item/clothing/shoes/sneakerspurple
name = "purple sneakers"
desc = "A stylish, expensive pair of purple sneakers."
icon_state = "sneakerspurple"
item_state = "sneakerspurple"
/obj/item/clothing/shoes/sneakersblue
name = "blue sneakers"
desc = "A stylish, expensive pair of blue sneakers."
icon_state = "sneakersblue"
item_state = "sneakersblue"
/obj/item/clothing/shoes/sneakersred
name = "red sneakers"
desc = "A stylish, expensive pair of red sneakers."
icon_state = "sneakersred"
item_state = "sneakersred"
+2 -2
View File
@@ -173,7 +173,7 @@
blood_overlay_type = "armor"
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner,
/obj/item/weapon/tool/crowbar, /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/weapon/tank/emergency/oxygen,
/obj/item/clothing/mask/gas, /obj/item/taperoll/engineering)
/obj/item/clothing/mask/gas, /obj/item/taperoll/engineering, /obj/item/taperoll/atmos, /obj/item/device/analyzer, /obj/item/weapon/extinguisher/mini) //VOREStation edit. Few more tools that can be put on vests
body_parts_covered = UPPER_TORSO
/obj/item/clothing/suit/storage/hazardvest/blue
@@ -259,4 +259,4 @@
/obj/item/clothing/suit/suspenders/grey
name = "grey suspenders"
icon_state = "suspenders_grey"
icon_state = "suspenders_grey"
+14 -1
View File
@@ -15,4 +15,17 @@
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "qm_coat"
//Atmos-coloured hazard vest
/obj/item/clothing/suit/storage/hazardvest/atmos
name = "light blue hazard vest"
desc = "A high-visibility vest used in work zones. This one is in the colors of atmospherics!"
icon = 'icons/inventory/suit/item_vr.dmi'
default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "hazard_a"
item_state = "hazard_a"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi',
)
@@ -42,6 +42,46 @@
desc = "Repilca rmor commonly worn by Dominion Of Mu'tu'bi soldiers from the hit series Spacer Trail. Modified for Laser Tag (Red Team)."
icon_state = "redtag2"
/*
* 80s
*/
/obj/item/clothing/suit/storage/puffyblue
name = "blue puffy coat"
desc = "A stylish, shiny, very blue puffer coat."
icon_state = "puffycoatblue"
item_state = "puffycoatblue"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
flags_inv = HIDEHOLSTER
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.7
item_state_slots = list(slot_r_hand_str = "blue_labcoat", slot_l_hand_str = "blue_labcoat")
/obj/item/clothing/suit/storage/puffypurple
name = "purple puffy coat"
desc = "A stylish, shiny, very purple puffer coat."
icon_state = "puffycoatpurple"
item_state = "puffycoatpurple"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
flags_inv = HIDEHOLSTER
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.7
item_state_slots = list(slot_r_hand_str = "purple_labcoat", slot_l_hand_str = "purple_labcoat")
/obj/item/clothing/suit/storage/puffyred
name = "crimson puffy coat"
desc = "A stylish, shiny, very crimson puffer coat."
icon_state = "puffycoatred"
item_state = "puffycoatred"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
flags_inv = HIDEHOLSTER
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.7
item_state_slots = list(slot_r_hand_str = "red_labcoat", slot_l_hand_str = "red_labcoat")
/*
* Costume
*/
@@ -503,3 +503,44 @@
/obj/item/clothing/accessory/gaiter/green
name = "green neck gaiter"
icon_state = "gaiter_green"
/*
* Pride Pins
*/
/obj/item/clothing/accessory/pride
name = "pride pin"
desc = "A pin displaying pride in one's identity."
icon_state = "pride"
slot = ACCESSORY_SLOT_MEDAL
/obj/item/clothing/accessory/pride/bi
name = "bisexual pride pin"
icon_state = "pride_bi"
/obj/item/clothing/accessory/pride/trans
name = "transgender pride pin"
icon_state = "pride_trans"
/obj/item/clothing/accessory/pride/ace
name = "asexual pride pin"
icon_state = "pride_ace"
/obj/item/clothing/accessory/pride/enby
name = "nonbinary pride pin"
icon_state = "pride_enby"
/obj/item/clothing/accessory/pride/pan
name = "pansexual pride pin"
icon_state = "pride_pan"
/obj/item/clothing/accessory/pride/lesbian
name = "lesbian pride pin"
icon_state = "pride_lesbian"
/obj/item/clothing/accessory/pride/intersex
name = "intersex pride pin"
icon_state = "pride_intersex"
/obj/item/clothing/accessory/pride/vore
name = "vore pride pin"
icon_state = "pride_vore"
@@ -103,6 +103,44 @@
prob(2);/obj/item/clothing/accessory/hawaiian/yellow
)
/*
* 80s
*/
/obj/item/clothing/accessory/tropical
name = "black tropical shirt"
desc = "A classic themed neosilk tropical shirt. This one makes you feel like an animal."
icon_state = "animalstyle"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING | SLOT_TIE
body_parts_covered = UPPER_TORSO|LOWER_TORSO
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
slot = ACCESSORY_SLOT_OVER
/obj/item/clothing/accessory/tropical/green
name = "puke-green tropical shirt"
desc = "A classic themed neosilk tropical shirt. This one makes you look like puke."
icon_state = "tropicopuke"
/obj/item/clothing/accessory/tropical/pink
name = "pink tropical shirt"
desc = "A classic themed neosilk tropical shirt. This one makes you feel nostalgic."
icon_state = "3005vintage"
/obj/item/clothing/accessory/tropical/blue
name = "blue tropical shirt"
desc = "A classic themed neosilk tropical shirt. This one makes you feel out of touch."
icon_state = "miamivice"
/obj/item/clothing/accessory/tropical_random/New()
return pick(
prob(2);/obj/item/clothing/accessory/tropical,
prob(2);/obj/item/clothing/accessory/tropical/green,
prob(2);/obj/item/clothing/accessory/tropical/pink,
prob(2);/obj/item/clothing/accessory/tropical/blue
)
/*
* Chaps
*/
@@ -1270,6 +1270,38 @@
icon_state = "curator"
worn_state = "curator"
/*
* 80s
*/
/obj/item/clothing/under/tropical
name = "black tropical oufit"
desc = "A classic themed outfit. This one makes you feel like an animal."
icon_state = "animalstyle"
worn_state = "animalstyle"
starting_accessories = list(/obj/item/clothing/accessory/tropical)
/obj/item/clothing/under/tropical/green
name = "puke-green tropical oufit"
desc = "A classic themed outfit. This one makes you look like puke."
icon_state = "tropicopuke"
worn_state = "tropicopuke"
starting_accessories = list(/obj/item/clothing/accessory/tropical/green)
/obj/item/clothing/under/tropical/pink
name = "pink tropical oufit"
desc = "A classic themed outfit. This one makes you feel nostalgic."
icon_state = "3005vintage"
worn_state = "3005vintage"
starting_accessories = list(/obj/item/clothing/accessory/tropical/pink)
/obj/item/clothing/under/tropical/blue
name = "pink tropical oufit"
desc = "A classic themed outfit. This one makes you feel out of touch."
icon_state = "miamivice"
worn_state = "miamivice"
starting_accessories = list(/obj/item/clothing/accessory/tropical/blue)
/*
* Modern
*/
@@ -308,4 +308,72 @@
item_state = "lewdcap"
rolled_sleeves = -1
rolled_down = -1
body_parts_covered = UPPER_TORSO // frankly this thing's a fucking embarassment
body_parts_covered = UPPER_TORSO // frankly this thing's a fucking embarassment
/obj/item/clothing/under/undersuit // undersuits! intended for wearing under hardsuits or for being too lazy to not wear anything other than it
name = "undersuit"
desc = "A nondescript undersuit, intended for wearing under a voidsuit or other EVA equipment. Breathable, yet sleek."
icon = 'icons/inventory/uniform/item_vr.dmi'
default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi'
rolled_down_icon = 'icons/inventory/uniform/mob_vr_rolled_down.dmi'
icon_state = "bodysuit"
item_state = "bodysuit"
rolled_sleeves = -1
rolled_down_icon_override = FALSE
/obj/item/clothing/under/undersuit/eva
name = "EVA undersuit"
desc = "A nondescript undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for EVA usage, but differs little from the standard."
icon_state = "bodysuit_eva"
item_state = "bodysuit_eva"
/obj/item/clothing/under/undersuit/command
name = "command undersuit"
desc = "A fancy undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for those in Command, and comes with a swanky gold trim and navy blue inlay."
icon_state = "bodysuit_com"
item_state = "bodysuit_com"
/obj/item/clothing/under/undersuit/sec
name = "security undersuit"
desc = "A reinforced undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for those in Security, and has slight protective capabilities against simple melee attacks."
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
icon_state = "bodysuit_sec"
item_state = "bodysuit_sec"
/obj/item/clothing/under/undersuit/sec/hos
name = "security command undersuit"
desc = "A reinforced undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for the Head of Security or equivalent, and has slight protective capabilities against simple melee attacks."
icon_state = "bodysuit_seccom"
item_state = "bodysuit_seccom"
/obj/item/clothing/under/undersuit/hazard
name = "hazard undersuit"
desc = "An undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for Engineering crew, and comes with slight radiation absorption capabilities. Not a lot, but it's there."
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
icon_state = "bodysuit_haz"
item_state = "bodysuit_haz"
/obj/item/clothing/under/undersuit/mining
name = "mining undersuit"
desc = "An undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for Mining crew, and comes with an interestingly colored trim."
icon_state = "bodysuit_min"
item_state = "bodysuit_min"
/obj/item/clothing/under/undersuit/emt
name = "medical technician undersuit"
desc = "An undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for Medical response crew, and comes with a distinctive coloring scheme."
icon_state = "bodysuit_emt"
item_state = "bodysuit_emt"
/obj/item/clothing/under/undersuit/explo
name = "exploration undersuit"
desc = "An undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for Exploration crew, for hazardous environments."
icon_state = "bodysuit_exp"
item_state = "bodysuit_exp"
/obj/item/clothing/under/undersuit/centcom
name = "Central Command undersuit"
desc = "A very descript undersuit, intended for wearing under a voidsuit or other EVA equipment. This one is specifically made for NanoTrasen Central Command officers, and comes with a swanky gold trim and other fancy markings."
icon_state = "bodysuit_cent"
item_state = "bodysuit_cent"
+1 -1
View File
@@ -615,7 +615,7 @@
// Cookies and Candies //
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack
/obj/item/weapon/reagent_containers/food/snacks/cookie
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
+5 -2
View File
@@ -1219,7 +1219,10 @@
/obj/item/clothing/mask/bandana/red = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/security = 5,
/obj/item/clothing/accessory/armband = 5,
/obj/item/clothing/accessory/holster/waist = 5
/obj/item/clothing/accessory/holster/armpit = 2, //VOREStation edit - gives some variety of available holsters for those who forgot to bring their own
/obj/item/clothing/accessory/holster/waist = 2, //VOREStation edit - But also reduces the number per type, so there's 8 overall rather than like, 20
/obj/item/clothing/accessory/holster/hip = 2, //VOREStation edit
/obj/item/clothing/accessory/holster/leg = 2 //VOREStation edit
)
req_log_access = access_hop
has_logs = 1
@@ -1624,4 +1627,4 @@
/obj/item/clothing/under/clown/rainbow = 1
)
req_log_access = access_hop
has_logs = 1
has_logs = 1
+37 -7
View File
@@ -218,7 +218,7 @@
/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake = 10,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake = 10,
/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich = 15,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack = 15,
/obj/item/weapon/reagent_containers/food/snacks/cookie = 15,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/brownies = 10,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 10,
/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece = 20
@@ -415,7 +415,10 @@
/obj/item/clothing/shoes/boots/workboots/toeless = 5,
/obj/item/clothing/shoes/boots/winter = 5,
/obj/item/clothing/shoes/boots/workboots = 5,
/obj/item/clothing/shoes/footwraps = 5)
/obj/item/clothing/shoes/footwraps = 5,
/obj/item/clothing/shoes/sneakerspurple = 5,
/obj/item/clothing/shoes/sneakersblue = 5,
/obj/item/clothing/shoes/sneakersred = 5)
prices = list(/obj/item/clothing/gloves/evening = 50,
/obj/item/clothing/gloves/fingerless = 50,
/obj/item/clothing/gloves/black = 50,
@@ -473,7 +476,10 @@
/obj/item/clothing/shoes/boots/workboots/toeless = 50,
/obj/item/clothing/shoes/boots/winter = 50,
/obj/item/clothing/shoes/boots/workboots = 50,
/obj/item/clothing/shoes/footwraps = 50)
/obj/item/clothing/shoes/footwraps = 50,
/obj/item/clothing/shoes/sneakerspurple = 50,
/obj/item/clothing/shoes/sneakersblue = 50,
/obj/item/clothing/shoes/sneakersred = 50)
premium = list(/obj/item/clothing/gloves/rainbow = 1,
/obj/item/clothing/shoes/rainbow = 1,)
contraband = list(/obj/item/clothing/shoes/syndigaloshes = 1,
@@ -539,6 +545,10 @@
/obj/item/clothing/accessory/hawaiian/pink = 5,
/obj/item/clothing/accessory/hawaiian/red = 5,
/obj/item/clothing/accessory/hawaiian/yellow = 5,
/obj/item/clothing/accessory/tropical = 5,
/obj/item/clothing/accessory/tropical/green = 5,
/obj/item/clothing/accessory/tropical/pink = 5,
/obj/item/clothing/accessory/tropical/blue = 5,
/obj/item/clothing/accessory/locket = 5,
/obj/item/weapon/storage/backpack/purse = 1,
/obj/item/clothing/accessory/sash = 5,
@@ -652,6 +662,10 @@
/obj/item/clothing/accessory/hawaiian/pink = 50,
/obj/item/clothing/accessory/hawaiian/red = 50,
/obj/item/clothing/accessory/hawaiian/yellow = 50,
/obj/item/clothing/accessory/tropical = 50,
/obj/item/clothing/accessory/tropical/green = 50,
/obj/item/clothing/accessory/tropical/pink = 50,
/obj/item/clothing/accessory/tropical/blue = 50,
/obj/item/clothing/accessory/locket = 50,
/obj/item/weapon/storage/backpack/purse = 50,
/obj/item/clothing/accessory/sash = 50,
@@ -918,7 +932,11 @@
/obj/item/clothing/under/wedding/bride_white = 5,
/obj/item/weapon/storage/backpack/ = 5,
/obj/item/weapon/storage/backpack/messenger = 5,
/obj/item/weapon/storage/backpack/satchel = 5)
/obj/item/weapon/storage/backpack/satchel = 5,
/obj/item/clothing/under/tropical = 5,
/obj/item/clothing/under/tropical/green = 5,
/obj/item/clothing/under/tropical/pink = 5,
/obj/item/clothing/under/tropical/blue = 5)
prices = list(/obj/item/clothing/under/bathrobe = 50,
/obj/item/clothing/under/dress/black_corset = 50,
/obj/item/clothing/under/blazer = 50,
@@ -1089,7 +1107,11 @@
/obj/item/clothing/under/wedding/bride_white = 50,
/obj/item/weapon/storage/backpack/ = 50,
/obj/item/weapon/storage/backpack/messenger = 50,
/obj/item/weapon/storage/backpack/satchel = 50)
/obj/item/weapon/storage/backpack/satchel = 50,
/obj/item/clothing/under/tropical = 50,
/obj/item/clothing/under/tropical/green = 50,
/obj/item/clothing/under/tropical/pink = 50,
/obj/item/clothing/under/tropical/blue = 50)
premium = list(/obj/item/clothing/under/color/rainbow = 1)
contraband = list(/obj/item/clothing/under/rank/clown = 1)
@@ -1217,7 +1239,10 @@
/obj/item/clothing/suit/varsity/brown = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/aformal = 5,
/obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 5)
/obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 5,
/obj/item/clothing/suit/storage/puffyred = 5,
/obj/item/clothing/suit/storage/puffypurple = 5,
/obj/item/clothing/suit/storage/puffyblue = 5)
prices = list(/obj/item/clothing/suit/storage/apron = 100,
/obj/item/clothing/suit/storage/flannel/aqua = 100,
/obj/item/clothing/suit/storage/toggle/bomber = 100,
@@ -1306,7 +1331,10 @@
/obj/item/clothing/suit/varsity/brown = 100,
/obj/item/clothing/suit/storage/hooded/wintercoat = 100,
/obj/item/clothing/suit/storage/hooded/wintercoat/aformal = 100,
/obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 100)
/obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 100,
/obj/item/clothing/suit/storage/puffyred = 100,
/obj/item/clothing/suit/storage/puffypurple = 100,
/obj/item/clothing/suit/storage/puffyblue = 100)
premium = list(/obj/item/clothing/suit/imperium_monk = 3,
/obj/item/clothing/suit/storage/hooded/wintercoat/cosmic = 1)
contraband = list(/obj/item/toy/katana = 1)
@@ -2516,6 +2544,7 @@
/obj/item/weapon/reagent_containers/food/snacks/clownstears = 10,
/obj/item/weapon/reagent_containers/food/snacks/coldchili = 10,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack = 10,
/obj/item/weapon/reagent_containers/food/snacks/cookie = 10,
/obj/item/weapon/reagent_containers/food/snacks/corn_dog = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice/filled = 10,
@@ -3000,6 +3029,7 @@
/obj/item/weapon/reagent_containers/food/snacks/clownstears = 10,
/obj/item/weapon/reagent_containers/food/snacks/coldchili = 10,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack = 10,
/obj/item/weapon/reagent_containers/food/snacks/cookie = 10,
/obj/item/weapon/reagent_containers/food/snacks/corn_dog = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice/filled = 10,
+5
View File
@@ -27,6 +27,11 @@
if(world.time < next_emote)
to_chat(src, SPAN_WARNING("You cannot use another emote yet."))
return
//VOREStation Addition Start
if(forced_psay)
pme(message)
return
//VOREStation Addition End
if(act == "help")
if(world.time >= next_emote_refresh)
+15 -1
View File
@@ -9,9 +9,10 @@
var/one_shot = 0 // If true, then the event will not be re-added to the list of available events
var/add_to_queue= 1 // If true, add back to the queue of events upon finishing.
var/list/role_weights = list()
var/list/min_job_count = list()
var/datum/event/event_type
/datum/event_meta/New(var/event_severity, var/event_name, var/datum/event/type, var/event_weight, var/list/job_weights, var/is_one_shot = 0, var/min_event_weight = 0, var/max_event_weight = 0, var/add_to_queue = 1)
/datum/event_meta/New(var/event_severity, var/event_name, var/datum/event/type, var/event_weight, var/list/job_weights, var/is_one_shot = 0, var/min_event_weight = 0, var/max_event_weight = 0, var/add_to_queue = 1, var/list/min_jobs)
name = event_name
severity = event_severity
event_type = type
@@ -22,6 +23,9 @@
src.add_to_queue = add_to_queue
if(job_weights)
role_weights = job_weights
if(min_jobs)
min_job_count = min_jobs
/datum/event_meta/proc/get_weight(var/list/active_with_role)
if(!enabled)
@@ -40,6 +44,16 @@
return total_weight
/datum/event_meta/proc/minimum_active(var/list/active_with_role)
var/can_fire = TRUE
for(var/role in min_job_count)
if(role in active_with_role)
if(active_with_role[role] < min_job_count[role])
can_fire = FALSE
break
return can_fire
/datum/event_meta/no_overmap/get_weight() //these events have overmap equivalents, and shouldn't fire randomly if overmap is used
return global.using_map.use_overmap ? 0 : ..()
+3
View File
@@ -78,6 +78,9 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
if(!EM.enabled)
return 0
if(!(EM.minimum_active(active_with_role)))
return 0
var/weight = EM.get_weight(active_with_role)
var/last_time = last_event_time[EM]
if(last_time)
+22 -22
View File
@@ -2,7 +2,7 @@
#define ASSIGNMENT_AI "AI"
#define ASSIGNMENT_CYBORG "Cyborg"
#define ASSIGNMENT_ENGINEER "Engineer"
#define ASSIGNMENT_GARDENER "Gardener"
#define ASSIGNMENT_GARDENER "Botanist"
#define ASSIGNMENT_JANITOR "Janitor"
#define ASSIGNMENT_MEDICAL "Medical"
#define ASSIGNMENT_SCIENTIST "Scientist"
@@ -30,13 +30,13 @@
// Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 400),
// Bluescreens APCs, but they still work
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence, 0, list(ASSIGNMENT_ENGINEER = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20), min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence, 0, list(ASSIGNMENT_ENGINEER = 10), 1, min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20), min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20), min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50, min_jobs = list(ASSIGNMENT_ENGINEER = 2)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10), 1, min_jobs = list(ASSIGNMENT_SECURITY = 3)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
@@ -47,7 +47,7 @@
// Spawns mice, lizards, or dud spiderlings
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 50, list(ASSIGNMENT_JANITOR = 25), 1),
// Rot only weakens walls, not destroy them
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30), 1, min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 2, list(), 1),
)
add_disabled_events(list(
@@ -59,33 +59,33 @@
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1600),
// Leaks gas into an unoccupied room.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1, min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 30), 1, min_jobs = list(ASSIGNMENT_SECURITY = 3)),
// Just disables comms for a short while.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 100, ASSIGNMENT_SECURITY = 50), 1),
// Just blows out a few lights
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 70, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150), 1),
// This one is just too fun.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 75, list(ASSIGNMENT_ENGINEER = 60), 1),
// Temporary power failure, but mitigatead by subgrids
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 0, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 0, list(ASSIGNMENT_ENGINEER = 25), 1, min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
// Pure RP fun, no mechanical effects.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 80, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 80, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5), min_jobs = list(ASSIGNMENT_AI = 1)),
// Opens doors in brig. So just RP fun
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 10, list(ASSIGNMENT_SECURITY = 100), 1),
// Radiation, but only in space.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 0, list(ASSIGNMENT_SECURITY = 20), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 0, list(ASSIGNMENT_SECURITY = 20), 1, min_jobs = list(ASSIGNMENT_SECURITY = 3)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 30, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50, min_jobs = list(ASSIGNMENT_ENGINEER = 3)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1, min_jobs = list(ASSIGNMENT_SECURITY = 2)),
//Evil grubs that drain station power slightly
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 10, list(ASSIGNMENT_SCIENTIST = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1, min_jobs = list(ASSIGNMENT_SECURITY = 1, ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 25, list(ASSIGNMENT_SCIENTIST = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_ANY = 5), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 100, list(ASSIGNMENT_ANY = 5), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Jellyfish School", /datum/event/jellyfish_migration, 0, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_SECURITY = 15, ASSIGNMENT_MEDICAL = 3), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Jellyfish School", /datum/event/jellyfish_migration, 0, list(ASSIGNMENT_SECURITY = 15, ASSIGNMENT_MEDICAL = 3), 1, min_jobs = list(ASSIGNMENT_SECURITY = 2)),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1),
@@ -99,11 +99,11 @@
/datum/event_container/major/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 3600),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 20, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 20, list(ASSIGNMENT_ENGINEER = 25), 1, min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 10, list(ASSIGNMENT_ENGINEER = 7, ASSIGNMENT_GARDENER = 2), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 5), 1, min_jobs = list(ASSIGNMENT_SECURITY = 3)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Jellyfish Migration", /datum/event/jellyfish_migration, 5, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_SECURITY = 5, ASSIGNMENT_MEDICAL = 3), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Jellyfish Migration", /datum/event/jellyfish_migration, 5, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_SECURITY = 5, ASSIGNMENT_MEDICAL = 3), 1, min_jobs = list(ASSIGNMENT_SECURITY = 2)),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1),
+3 -3
View File
@@ -186,7 +186,7 @@ var/list/event_last_fired = list()
active_with_role["AI"] = 0
active_with_role["Cyborg"] = 0
active_with_role["Janitor"] = 0
active_with_role["Gardener"] = 0
active_with_role["Botanist"] = 0
for(var/mob/M in player_list)
if(!M.mind || !M.client || M.client.is_afk(10 MINUTES)) // longer than 10 minutes AFK counts them as inactive
@@ -227,7 +227,7 @@ var/list/event_last_fired = list()
if(M.mind.assigned_role == "Janitor")
active_with_role["Janitor"]++
if(M.mind.assigned_role == "Gardener")
active_with_role["Gardener"]++
if(M.mind.assigned_role == "Botanist")
active_with_role["Botanist"]++
return active_with_role
+1 -1
View File
@@ -41,4 +41,4 @@
area_names |= grub_area.name
if(area_names.len)
var/english_list = english_list(area_names)
command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the followng areas: [english_list]", "Lifesign Alert")
command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the following areas: [english_list]", "Lifesign Alert")
@@ -81,4 +81,4 @@
/obj/item/weapon/storage/box/glasses/coffeemug
name = "box of coffee mugs"
starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/britcup = 7)
starts_with = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug = 7)
+251
View File
@@ -0,0 +1,251 @@
/* Warm Mugs!
*
* Contains:
* Britcup
* Text Mug
* Coffee Mugs
* Tall Mugs
*/
/*
* Britcup
*/
/obj/item/weapon/reagent_containers/food/drinks/britcup
name = "cup"
desc = "A cup with the British flag emblazoned on it."
icon_state = "britcup"
volume = 30
center_of_mass = list("x"=15, "y"=13)
/obj/item/weapon/reagent_containers/food/drinks/britcup/on_reagent_change()
..()
/*
* Text Mug
*/
/obj/item/weapon/reagent_containers/food/drinks/textmug
name = "mug with text"
desc = "A mug with something written on it."
icon = 'icons/obj/drinks_vr.dmi'
icon_state = "textmug"
volume = 30
center_of_mass = list("x"=15, "y"=13)
/*
* Coffee Mugs
*/
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug
name = "coffee mug"
base_name = "mug"
desc = "A plain white coffee mug."
icon = 'icons/obj/drinks_mugs.dmi'
base_icon = "coffeecup"
volume = 30
var/fillsource = "coffeecup"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/update_icon()
cut_overlays()
if(reagents.total_volume)
var/image/filling = image('icons/obj/drinks_mugs.dmi', src, null)
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0 to 39)
filling.icon_state = null
return
if(40 to 79) filling.icon_state = "[fillsource]40"
if(80 to 99) filling.icon_state = "[fillsource]80"
if(100 to INFINITY) filling.icon_state = "[fillsource]100"
filling.color = reagents.get_color()
add_overlay(filling)
// Government
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/sol
name = "\improper SCG coffee mug"
desc = "A blue coffee mug emblazoned with the crest of the Solar Confederate Government."
base_icon = "coffeecup_sol"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/fleet
name = "\improper SCG Fleet coffee cup"
desc = "A coffee mug imprinted with the emblem of the Solar Confederate Fleet."
base_icon = "coffeecup_fleet"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/fivearrows
name = "\improper Five Arrows coffee mug"
desc = "A coffee mug with the flag of the Five Arrows proudly displayed on it."
base_icon = "coffeecup_fivearrows"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/alma
name = "\improper Almach Association coffee cup"
desc = "A grey coffee cup emblazoned with the star of the Almach Association."
icon_state = "coffeecup_alma"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/almp
name = "\improper Almach Protectorate coffee cup"
desc = "A purple coffee cup emblazoned with the star of the Almach Protectorate."
icon_state = "coffeecup_almp"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/psc
name = "\improper Pearlshield coffee mug"
desc = "A coffee mug bearing the symbol of the Pearlshield Coalition."
base_icon = "coffeecup_psc"
// Corporations
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/nt
name = "\improper NT coffee mug"
desc = "A blue NanoTrasen coffee mug."
base_icon = "coffeecup_NT"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/metal/wulf
name = "\improper Wulf Aeronautics coffee mug"
desc = "A metal coffee mug bearing the livery of Wulf Aeronautics."
base_icon = "coffeecup_wulf"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/gilthari
name = "\improper Gilthari Exports coffee mug"
desc = "A coffee mug bearing golden G of Gilthari Exports."
base_icon = "coffeecup_gilth"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/wt
name = "\improper Ward-Takahashi coffee mug"
desc = "A coffee mug in a geometric Ward-Takahashi design."
base_icon = "coffeecup_wt"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/aether
name = "\improper Aether Atmospherics coffee mug"
desc = "A coffee mug in Aether Atmospherics colours."
base_icon = "coffeecup_aether"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/zeng
name = "\improper Zeng-Hu coffee cup"
desc = "A coffee cup bearing the Zeng-Hu logo."
icon_state = "coffeecup_zeng"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/bishop
name = "\improper Bishop coffee mug"
desc = "A black coffee mug adorned with Bishop's logo."
base_icon = "coffeecup_bishop"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/oculum
name = "pawn coffee mug"
desc = "A black and blue coffee mug decorated with the logo of Oculum Broadcast."
base_icon = "coffeecup_oculum"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/talon
name = "\improper Talon coffee mug"
desc = "A teal colored coffee mug with the Talon star logo on its face."
base_icon = "coffeecup_talon"
// Symbols, markings
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/one
name = "#1 coffee mug"
desc = "A white coffee mug, prominently featuring a #1."
base_icon = "coffeecup_one"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/puni
name = "#1 monkey coffee mug"
desc = "A white coffee mug, prominently featuring a \"#1 monkey\" decal."
base_icon = "coffeecup_puni"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/heart
name = "heart coffee mug"
desc = "A white coffee mug, it prominently features a red heart."
base_icon = "coffeecup_heart"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/pawn
name = "pawn coffee mug"
desc = "A black coffee mug adorned with the image of a red chess pawn."
base_icon = "coffeecup_pawn"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/diona
name = "diona nymph coffee mug"
desc = "A green coffee mug featuring the image of a diona nymph."
base_icon = "coffeecup_diona"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/britcup
name = "british coffee mug"
desc = "A coffee mug with the British flag emblazoned on it."
base_icon = "coffeecup_brit"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/flame
name = "flame coffee cup"
desc = "A coffee cup with the a flame emblazoned on it."
icon_state = "coffeecup_flame"
// Pure colors & other
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/black
name = "black coffee mug"
desc = "A sleek black coffee mug."
base_icon = "coffeecup_black"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/green
name = "green coffee mug"
desc = "A pale green and pink coffee mug."
base_icon = "coffeecup_green"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/green/dark
desc = "A dark green coffee mug."
base_icon = "coffeecup_corp"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/blue
name = "blue coffee mug"
desc = "A blue coffee mug."
base_icon = "coffeecup_blue"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/rainbow
name = "rainbow coffee mug"
desc = "A rainbow coffee mug. The colors are almost as blinding as a welder."
base_icon = "coffeecup_rainbow"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/metal
name = "metal coffee mug"
desc = "A metal coffee mug. You're not sure which metal."
base_icon = "coffeecup_metal"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/glass
name = "glass coffee mug"
desc = "A glass coffee mug, using space age technology to keep it cool for use."
base_icon = "glasscoffeecup"
fillsource = "glasscoffeecup"
/*
* Tall Mugs
*/
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall
name = "tall coffee mug"
desc = "An unreasonably tall coffee mug, for when you really need to wake up in the morning."
icon = 'icons/obj/drinks_mugs_tall.dmi'
base_icon = "coffeecup_tall"
fillsource = "coffeecup_tall"
volume = 60
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall/update_icon()
cut_overlays()
if(reagents.total_volume)
var/image/filling = image('icons/obj/drinks_mugs_tall.dmi', src, null)
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0 to 69)
filling.icon_state = null
return
if(70 to 89) filling.icon_state = "[fillsource]70"
if(90 to 99) filling.icon_state = "[fillsource]90"
if(100 to INFINITY) filling.icon_state = "[fillsource]100"
filling.color = reagents.get_color()
add_overlay(filling)
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall/black
name = "tall black coffee mug"
desc = "An unreasonably tall coffee mug, for when you really need to wake up in the morning. This one is black."
base_icon = "coffeecup_tall_black"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall/metal
name = "tall metal coffee mug"
desc = "An unreasonably tall coffee mug, for when you really need to wake up in the morning. This one is made of metal."
base_icon = "coffeecup_tall_metal"
/obj/item/weapon/reagent_containers/food/drinks/glass2/coffeemug/tall/rainbow
name = "tall rainbow coffee mug"
desc = "An unreasonably tall coffee mug, for when you really need to wake up in the morning. This one is rainbow colored."
base_icon = "coffeecup_tall_rainbow"
-7
View File
@@ -420,10 +420,3 @@
volume = 60
center_of_mass = list("x"=15, "y"=4)
/obj/item/weapon/reagent_containers/food/drinks/britcup
name = "cup"
desc = "A cup with the British flag emblazoned on it."
icon_state = "britcup"
volume = 30
center_of_mass = list("x"=15, "y"=13)
-7
View File
@@ -1,7 +0,0 @@
/obj/item/weapon/reagent_containers/food/drinks/textmug
name = "mug with text"
desc = "A mug with something written on it."
icon = 'icons/obj/drinks_vr.dmi'
icon_state = "textmug"
volume = 30
center_of_mass = list("x"=15, "y"=13)
+1 -1
View File
@@ -65,7 +65,7 @@ var/list/lunchables_snacks_ = list(/obj/item/weapon/reagent_containers/food/snac
/obj/item/weapon/reagent_containers/food/snacks/honeybun,
/obj/item/weapon/reagent_containers/food/snacks/custardbun,
/obj/item/weapon/reagent_containers/food/snacks/honeytoast,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack,
/obj/item/weapon/reagent_containers/food/snacks/cookie,
/obj/item/weapon/reagent_containers/food/snacks/fruitbar,
/obj/item/weapon/reagent_containers/food/snacks/semki,
/obj/item/weapon/reagent_containers/food/snacks/salo,
+19 -10
View File
@@ -1594,16 +1594,6 @@
nutriment_desc = list("noodles" = 2)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/fortunecookie
name = "Fortune cookie"
desc = "A true prophecy in each cookie!"
icon_state = "fortune_cookie"
filling_color = "#E8E79E"
center_of_mass = list("x"=15, "y"=14)
nutriment_amt = 3
nutriment_desc = list("fortune cookie" = 2)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/badrecipe
name = "Burned mess"
desc = "Someone should be demoted from chef for this."
@@ -4224,6 +4214,15 @@
. = ..()
reagents.add_reagent("bean_protein", 6)
/obj/item/weapon/reagent_containers/food/snacks/cookie
name = "chocolate chip cookie"
desc = "Just like your mother used to make."
filling_color = "#DBC94F"
icon_state = "cookie"
nutriment_amt = 5
nutriment_desc = list("sweetness" = 2, "cookie" = 1, "chocolate" = 2)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie
name = "sugar cookie"
desc = "Just like your little sister used to make."
@@ -4233,6 +4232,16 @@
nutriment_desc = list("sweetness" = 4, "cookie" = 1)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/fortunecookie
name = "Fortune cookie"
desc = "A true prophecy in each cookie!"
icon_state = "fortune_cookie"
filling_color = "#E8E79E"
center_of_mass = list("x"=15, "y"=14)
nutriment_amt = 3
nutriment_desc = list("fortune cookie" = 2)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/berrymuffin
name = "berry muffin"
desc = "A delicious and spongy little cake, with berries."
+2 -2
View File
@@ -631,11 +631,11 @@
/obj/item/weapon/reagent_containers/food/snacks/grub_pink
name = "pink candy grub"
desc = "A thoroughly candied grub, it smells of raspberry."
desc = "A thoroughly candied grub, it smells of cherry."
icon = 'icons/obj/food_vr.dmi'
icon_state = "grub_pink"
nutriment_amt = 5
nutriment_desc = list("raspberry" = 4, "goo" = 1)
nutriment_desc = list("cherry" = 4, "goo" = 1)
/obj/item/weapon/reagent_containers/food/snacks/grub_pink/Initialize()
. = ..()
+1 -1
View File
@@ -160,7 +160,7 @@
result = /obj/item/weapon/storage/box/wings/bucket
/datum/recipe/grub_pink
fruit = list("cherry" = 1)
fruit = list("cherries" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/grub
)
+1 -2
View File
@@ -299,7 +299,7 @@
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
)
result = /obj/item/weapon/reagent_containers/food/snacks/cookiesnack
result = /obj/item/weapon/reagent_containers/food/snacks/cookie
result_quantity = 4
reagent_mix = RECIPE_REAGENT_REPLACE
@@ -319,7 +319,6 @@
result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel
result_quantity = 2
/datum/recipe/cracker
appliance = OVEN
reagents = list("sodiumchloride" = 1)
+46
View File
@@ -55,3 +55,49 @@
"U9: Jaunt"
)
/obj/item/weapon/book/manual/wizzoffguide
name = "WizOff Guide"
icon = 'icons/obj/playing_cards.dmi'
icon_state ="wizoff_guide"
item_state = "book16"
author = "Donk Co."
title = "WizOff Guide"
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
/obj/item/weapon/book/manual/wizzoffguide/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: 5px 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>
<h1><u>Wiz-Off Player Guide</u></h1>
<h2>How to play Wiz-Off!</h2>
<h3>The wizard themed card game</h3>
<p>Each player draws 5 cards. There are five rounds. Each round,<br>
a player selects a card to play, and the winner is selected<br>
based on the following rules:</p>
<ol>
<li>Offensive (O) beats Utility (U)!</li>
<li>Defensive (D) beats Offensive (O)!</li>
<li>Utility (U) beats Defensive (D)!</li>
<li>If both players play the same type of spell, <br>
the higher number wins!</li>
</ol>
<p>The player who wins the most of the 5 rounds wins the game!<br>
Now get ready to battle for the fate of the universe: Wiz-Off!</p>
</body>
</html>
"}
+3
View File
@@ -317,6 +317,9 @@
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
qdel(B)
for(var/obj/effect/landmark/L in linkedholodeck)
qdel(L)
holographic_objs = A.copy_contents_to(linkedholodeck , 1)
for(var/obj/holo_obj in holographic_objs)
holo_obj.alpha *= 0.8 //give holodeck objs a slight transparency
+1 -1
View File
@@ -111,7 +111,7 @@
return
directional_opacity = NONE
for(var/atom/movable/opacity_source as anything in opacity_sources)
if(opacity_source.flags & ON_BORDER)
if(opacity_source && opacity_source.flags & ON_BORDER)
directional_opacity |= opacity_source.dir
else //If fulltile and opaque, then the whole tile blocks view, no need to continue checking.
directional_opacity = ALL_CARDINALS
@@ -335,11 +335,6 @@
log_runtime(EXCEPTION("Warning: human/Topic was called with item [href_list["item"]], but the item Topic is deprecated!"))
// handle_strip(href_list["item"],usr)
// VOREStation Start
if(href_list["ooc_notes"])
src.Examine_OOC()
// VOREStation End
if (href_list["criminal"])
if(hasHUD(usr,"security"))
@@ -126,6 +126,11 @@
if(!buckled && shoes) // Shoes can make you go faster.
. += shoes.slowdown
//VOREStation Addition Start
if(buckled && istype(buckled, /obj/machinery/power/rtg/d_type_reg))
. += shoes.slowdown
//VOREStation Addition End
// Loop through some slots, and add up their slowdowns.
// Includes slots which can provide armor, the back slot, and suit storage.
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store))
@@ -210,12 +210,13 @@ var/datum/species/shapeshifter/promethean/prometheans
H.adjust_nutrition(rand(10, 20))
if(H.clean_blood(1))
H.adjust_nutrition(rand(5, 15))
if(H.r_hand)
if(H.r_hand.clean_blood())
H.adjust_nutrition(rand(5, 15))
if(H.l_hand)
if(H.l_hand.clean_blood())
H.adjust_nutrition(rand(5, 15))
if(!(H.gloves || (H.wear_suit && (H.wear_suit.body_parts_covered & HANDS))))
if(H.r_hand)
if(H.r_hand.clean_blood())
H.adjust_nutrition(rand(5, 15))
if(H.l_hand)
if(H.l_hand.clean_blood())
H.adjust_nutrition(rand(5, 15))
if(H.head)
if(H.head.clean_blood())
H.update_inv_head(0)
@@ -16,10 +16,9 @@
spawn_flags = SPECIES_CAN_JOIN
wikilink="https://wiki.vore-station.net/Promethean"
genders = list(MALE, FEMALE, PLURAL, NEUTER)
color_mult = 1
mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping
//var/mob/living/simple_mob/slime/promethean/stored_blob = null
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
inherent_verbs = list(
@@ -32,6 +31,48 @@
/mob/living/carbon/human/proc/shapeshifter_select_wings,
/mob/living/carbon/human/proc/shapeshifter_select_tail,
/mob/living/carbon/human/proc/shapeshifter_select_ears,
/mob/living/carbon/human/proc/prommie_blobform,
/mob/living/proc/set_size,
/mob/living/carbon/human/proc/promethean_select_opaqueness,
)
/mob/living/carbon/human/proc/prommie_blobform()
set name = "Toggle Blobform"
set desc = "Switch between amorphous and humanoid forms."
set category = "Abilities"
set hidden = FALSE
var/atom/movable/to_locate = temporary_form || src
if(!isturf(to_locate.loc))
to_chat(to_locate,"<span class='warning'>You need more space to perform this action!</span>")
return
/*
//Blob form
if(temporary_form)
if(temporary_form.stat)
to_chat(temporary_form,"<span class='warning'>You can only do this while not stunned.</span>")
else
prommie_outofblob(temporary_form)
*/
//Human form
else if(stat || paralysis || stunned || weakened || restrained())
to_chat(src,"<span class='warning'>You can only do this while not stunned.</span>")
return
else
prommie_intoblob()
/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H)
if(!H)
return // Iono!
if(H.temporary_form)
H.forceMove(H.temporary_form.drop_location())
H.ckey = H.temporary_form.ckey
QDEL_NULL(H.temporary_form)
//else if(H.stored_blob) // Should prevent phantom blobs in the aether. I don't anticipate this being an issue, but if it is just uncomment.
// qdel(stored_blob)
// stored_blob = null
spawn(1)
if(H)
H.gib()
@@ -0,0 +1,511 @@
// Prommies are slimes, lets make them a subtype of slimes.
/mob/living/simple_mob/slime/promethean
name = "Promethean Blob"
desc = "A promethean expressing their true form."
//ai_holder_type = null
color = null // Uses a special icon_state.
slime_color = "rainbow"
unity = TRUE
water_resist = 100 // Lets not kill the prommies
cores = 0
movement_cooldown = 3
//appearance_flags = RADIATION_GLOWS
shock_resist = 0 // Lets not be immune to zaps.
friendly = list("nuzzles", "glomps", "snuggles", "cuddles", "squishes") // lets be cute :3
melee_damage_upper = 0
melee_damage_lower = 0
player_msg = "You're a little squisher! Your cuteness level has increased tenfold."
heat_damage_per_tick = 20 // Hot and cold are bad, but cold is AS bad for prommies as it is for slimes.
cold_damage_per_tick = 20
//glow_range = 0
//glow_intensity = 0
var/mob/living/carbon/human/humanform
var/datum/modifier/healing
var/obj/prev_left_hand
var/obj/prev_right_hand
var/human_brute = 0
var/human_burn = 0
var/is_wide = FALSE
var/rad_glow = 0
var/list/default_emotes = list(
/decl/emote/audible/squish,
/decl/emote/audible/chirp,
/decl/emote/visible/bounce,
/decl/emote/visible/jiggle,
/decl/emote/visible/lightup,
/decl/emote/visible/vibrate,
/decl/emote/visible/flip,
/decl/emote/visible/spin,
/decl/emote/visible/floorspin
)
/mob/living/simple_mob/slime/promethean/Initialize(mapload, null)
//verbs -= /mob/living/proc/ventcrawl
verbs += /mob/living/simple_mob/slime/promethean/proc/prommie_blobform
verbs += /mob/living/proc/set_size
verbs += /mob/living/proc/hide
verbs += /mob/living/simple_mob/proc/animal_nom
verbs += /mob/living/proc/shred_limb
verbs += /mob/living/simple_mob/slime/promethean/proc/toggle_expand
verbs += /mob/living/simple_mob/slime/promethean/proc/prommie_select_colour
verbs += /mob/living/simple_mob/slime/promethean/proc/toggle_shine
update_mood()
if(rad_glow)
rad_glow = CLAMP(rad_glow,0,250)
set_light(max(1,min(5,rad_glow/15)), max(1,min(10,rad_glow/25)), color)
return ..()
/mob/living/simple_mob/slime/promethean/update_icon()
icon_living = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_wide ? "adult" : "baby"][""]"
..()
/mob/living/simple_mob/slime/promethean/Destroy()
humanform = null
vore_organs = null
vore_selected = null
set_light(0)
return ..()
/mob/living/carbon/human/Destroy()
if(stored_blob)
stored_blob = null
qdel(stored_blob)
return ..()
/mob/living/simple_mob/slime/promethean/Stat()
..()
if(humanform)
humanform.species.Stat(humanform)
/mob/living/simple_mob/slime/promethean/handle_special() // Should disable default slime healing, we'll use nutrition based heals instead.
if(rad_glow)
rad_glow = CLAMP(rad_glow,0,250)
set_light(max(1,min(5,rad_glow/15)), max(1,min(10,rad_glow/25)), color)
else
set_light(0)
update_icon()
if(!humanform) // If we somehow have a blob with no human, lets just clean up.
log_debug("Cleaning up blob with no prommie!")
qdel(src)
return
//Constructor allows passing the human to sync damages
/mob/living/simple_mob/slime/promethean/New(var/newloc, var/mob/living/carbon/human/H)
..()
if(H)
humanform = H
updatehealth()
else
qdel(src)
/mob/living/simple_mob/slime/promethean/updatehealth()
if(!humanform)
return ..()
//Set the max
maxHealth = humanform.getMaxHealth()*2 //HUMANS, and their 'double health', bleh.
//Set us to their health, but, human health ignores robolimbs so we do it 'the hard way'
human_brute = humanform.getActualBruteLoss()
human_burn = humanform.getActualFireLoss()
health = maxHealth - humanform.getOxyLoss() - humanform.getToxLoss() - humanform.getCloneLoss() - human_brute - human_burn
//Alive, becoming dead
if((stat < DEAD) && (health <= 0))
death()
//Overhealth
if(health > getMaxHealth())
health = getMaxHealth()
//Grab any other interesting values
confused = humanform.confused
radiation = humanform.radiation
paralysis = humanform.paralysis
//Update our hud if we have one
if(healths)
if(stat != DEAD)
var/heal_per = (health / getMaxHealth()) * 100
switch(heal_per)
if(100 to INFINITY)
healths.icon_state = "health0"
if(80 to 100)
healths.icon_state = "health1"
if(60 to 80)
healths.icon_state = "health2"
if(40 to 60)
healths.icon_state = "health3"
if(20 to 40)
healths.icon_state = "health4"
if(0 to 20)
healths.icon_state = "health5"
else
healths.icon_state = "health6"
else
healths.icon_state = "health7"
// All the damage and such to the blob translates to the human
/mob/living/simple_mob/slime/promethean/apply_effect(var/effect = 0, var/effecttype = STUN, var/blocked = 0, var/check_protection = 1)
if(humanform)
return humanform.apply_effect(effect, effecttype, blocked, check_protection)
else
return ..()
/mob/living/simple_mob/slime/promethean/adjustBruteLoss(var/amount,var/include_robo)
amount *= 0.75
if(humanform)
return humanform.adjustBruteLoss(amount)
else
return ..()
/mob/living/simple_mob/slime/promethean/adjustFireLoss(var/amount,var/include_robo)
amount *= 2
if(humanform)
return humanform.adjustFireLoss(amount)
else
return ..()
/mob/living/simple_mob/slime/promethean/adjustToxLoss(amount)
if(humanform)
return humanform.adjustToxLoss(amount)
else
return ..()
/mob/living/simple_mob/slime/promethean/adjustOxyLoss(amount)
if(humanform)
return humanform.adjustOxyLoss(amount)
else
return ..()
/mob/living/simple_mob/slime/promethean/adjustHalLoss(amount)
if(humanform)
return humanform.adjustHalLoss(amount)
else
return ..()
/mob/living/simple_mob/slime/promethean/adjustCloneLoss(amount)
if(humanform)
return humanform.adjustCloneLoss(amount)
else
return ..()
/mob/living/simple_mob/slime/promethean/ex_act(severity)
if(humanform)
return humanform.ex_act(severity)
else
return ..()
/mob/living/simple_mob/slime/promethean/rad_act(severity)
rad_glow += severity
rad_glow = CLAMP(rad_glow,0,250)
if(rad_glow > 1)
set_light(max(1,min(5,rad_glow/15)), max(1,min(10,rad_glow/25)), color)
update_icon()
/mob/living/simple_mob/slime/promethean/bullet_act(obj/item/projectile/P)
if(humanform)
return humanform.bullet_act(P)
else
return ..()
/mob/living/simple_mob/slime/promethean/death(gibbed, deathmessage = "rapidly loses cohesion, splattering across the ground...")
if(humanform)
humanform.death(gibbed, deathmessage)
else
animate(src, alpha = 0, time = 2 SECONDS)
sleep(2 SECONDS)
if(!QDELETED(src)) // Human's handle death should have taken us, but maybe we were adminspawned or something without a human counterpart
qdel(src)
/mob/living/simple_mob/slime/promethean/Login()
. = ..()
copy_from_prefs_vr(bellies = FALSE)
/mob/living/simple_mob/slime/promethean/proc/prommie_blobform()
set name = "Toggle Blobform"
set desc = "Switch between amorphous and humanoid forms."
set category = "Abilities"
set hidden = FALSE
var/atom/movable/to_locate = src
if(!isturf(to_locate.loc))
to_chat(src,"<span class='warning'>You need more space to perform this action!</span>")
return
//Blob form
if(!ishuman(src))
if(humanform.temporary_form.stat || paralysis || stunned || weakened || restrained())
to_chat(src,"<span class='warning'>You can only do this while not stunned.</span>")
else
humanform.prommie_outofblob(src)
/mob/living/simple_mob/slime/promethean/proc/toggle_expand()
set name = "Toggle Width"
set desc = "Switch between smole and lorge."
set category = "Abilities"
set hidden = FALSE
if(stat || world.time < last_special)
return
last_special = world.time + 25
if(is_wide)
is_wide = FALSE
src.visible_message("<b>[src.name]</b> pulls together, compacting themselves into a small ball!")
update_icon()
else
is_wide = TRUE
src.visible_message("<b>[src.name]</b> flows outwards, their goop expanding!")
update_icon()
/mob/living/simple_mob/slime/promethean/proc/toggle_shine()
set name = "Toggle Shine"
set desc = "Shine on you crazy diamond."
set category = "Abilities"
set hidden = FALSE
if(stat || world.time < last_special)
return
last_special = world.time + 25
if(shiny)
shiny = FALSE
src.visible_message("<b>[src.name]</b> dulls their shine, becoming more translucent.")
update_icon()
else
shiny = TRUE
src.visible_message("<b>[src.name]</b> glistens and sparkles, shining brilliantly.")
update_icon()
/mob/living/simple_mob/slime/promethean/proc/prommie_select_colour()
set name = "Select Body Colour"
set category = "Abilities"
if(stat || world.time < last_special)
return
last_special = world.time + 25
var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", color) as null|color
if(!new_skin)
return
color = new_skin
update_icon()
/mob/living/simple_mob/slime/promethean/get_description_interaction()
return
/mob/living/simple_mob/slime/promethean/get_description_info()
return
/mob/living/simple_mob/slime/promethean/init_vore()
return
/mob/living/simple_mob/slime/promethean/get_available_emotes()
var/list/fulllist = _slime_default_emotes
fulllist += default_emotes
return fulllist
/mob/living/carbon/human
var/mob/living/simple_mob/slime/promethean/stored_blob = null
// Helpers - Unsafe, WILL perform change.
/mob/living/carbon/human/proc/prommie_intoblob(force)
if(!force && !isturf(loc))
to_chat(src,"<span class='warning'>You can't change forms while inside something.</span>")
return
handle_grasp() //It's possible to blob out before some key parts of the life loop. This results in things getting dropped at null. TODO: Fix the code so this can be done better.
remove_micros(src, src) //Living things don't fare well in roblobs.
if(buckled)
buckled.unbuckle_mob()
if(LAZYLEN(buckled_mobs))
for(var/buckledmob in buckled_mobs)
riding_datum.force_dismount(buckledmob)
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
//Record where they should go
var/atom/creation_spot = drop_location()
var/mob/living/simple_mob/slime/promethean/blob = null
//Create our new blob
if(!stored_blob)
blob = new(creation_spot,src)
blob.mood = ":3"
qdel(blob.ai_holder)
blob.ai_holder = null
else
blob = stored_blob
blob.forceMove(creation_spot)
//Drop all our things
var/list/things_to_drop = contents.Copy()
var/list/things_to_not_drop = list(w_uniform,nif,l_store,r_store,wear_id,l_ear,r_ear) //And whatever else we decide for balancing.
var/obj/item/clothing/head/new_hat
var/has_hat = FALSE
things_to_drop -= things_to_not_drop //Crunch the lists
things_to_drop -= organs //Mah armbs
things_to_drop -= internal_organs //Mah sqeedily spooch
for(var/obj/item/clothing/head/H in things_to_drop)
if(H)
new_hat = H
has_hat = TRUE
drop_from_inventory(H)
things_to_drop -= H
for(var/obj/item/I in things_to_drop) //rip hoarders
drop_from_inventory(I)
if(w_uniform && istype(w_uniform,/obj/item/clothing)) //No webbings tho. We do this after in case a suit was in the way
var/obj/item/clothing/uniform = w_uniform
if(LAZYLEN(uniform.accessories))
for(var/obj/item/clothing/accessory/A in uniform.accessories)
if(is_type_in_list(A, disallowed_protean_accessories))
uniform.remove_accessory(null,A) //First param is user, but adds fingerprints and messages
//Size update
blob.transform = matrix()*size_multiplier
blob.size_multiplier = size_multiplier
if(l_hand) blob.prev_left_hand = l_hand //Won't save them if dropped above, but necessary if handdrop is disabled.
if(r_hand) blob.prev_right_hand = r_hand
//Put our owner in it (don't transfer var/mind)
blob.Weaken(2)
blob.transforming = TRUE
blob.ckey = ckey
blob.transforming = FALSE
blob.name = name
blob.nutrition = nutrition
blob.color = rgb(r_skin, g_skin, b_skin)
playsound(src.loc, "sound/effects/slime_squish.ogg", 15)
if(radiation > 0)
blob.rad_glow = CLAMP(radiation,0,250)
set_light(0)
blob.set_light(max(1,min(5,radiation/15)), max(1,min(10,radiation/25)), blob.color)
blob.handle_light()
if(has_hat)
blob.hat = new_hat
new_hat.forceMove(src)
blob.update_icon()
blob.verbs -= /mob/living/proc/ventcrawl // Absolutely not.
blob.verbs -= /mob/living/simple_mob/proc/set_name // We already have a name.
temporary_form = blob
//Mail them to nullspace
moveToNullspace()
//Message
blob.visible_message("<b>[src.name]</b> squishes into their true form!")
//Transfer vore organs
blob.vore_organs = vore_organs
blob.vore_selected = vore_selected
for(var/obj/belly/B as anything in vore_organs)
B.forceMove(blob)
B.owner = blob
//We can still speak our languages!
blob.languages = languages.Copy()
//Return our blob in case someone wants it
return blob
/mob/living/carbon/human/proc/prommie_outofblob(var/mob/living/simple_mob/slime/promethean/blob, force)
if(!istype(blob))
return
if(!force && !isturf(blob.loc))
to_chat(blob,"<span class='warning'>You can't change forms while inside something.</span>")
return
if(buckled)
buckled.unbuckle_mob()
if(LAZYLEN(buckled_mobs))
for(var/buckledmob in buckled_mobs)
riding_datum.force_dismount(buckledmob)
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
//Message
blob.visible_message("<b>[src.name]</b> pulls together, forming a humanoid shape!")
//Record where they should go
var/atom/reform_spot = blob.drop_location()
//Size update
resize(blob.size_multiplier, FALSE, ignore_prefs = TRUE)
//Move them back where the blob was
forceMove(reform_spot)
//Put our owner in it (don't transfer var/mind)
Weaken(2)
playsound(src.loc, "sound/effects/slime_squish.ogg", 15)
transforming = TRUE
ckey = blob.ckey
transforming = FALSE
blob.name = "Promethean Blob"
var/obj/item/hat = blob.hat
blob.drop_hat()
drop_from_inventory(hat) // Hat me baby
equip_to_slot_if_possible(hat, slot_head)
nutrition = blob.nutrition // food good
temporary_form = null
var/blob_color = blob.color
if(!blob_color)
blob_color = rgb(255, 255, 255)
shapeshifter_set_colour(blob_color)
if(blob.rad_glow > 0)
radiation = CLAMP(blob.rad_glow,0,250)
set_light(max(1,min(5,radiation/15)), max(1,min(10,radiation/25)), species.get_flesh_colour(src))
update_icon()
//Transfer vore organs
vore_selected = blob.vore_selected
for(var/obj/belly/B as anything in blob.vore_organs)
B.forceMove(src)
B.owner = src
//vore_organs.Cut()
if(blob.prev_left_hand) put_in_l_hand(blob.prev_left_hand) //The restore for when reforming.
if(blob.prev_right_hand) put_in_r_hand(blob.prev_right_hand)
Life(1) //Fix my blindness right meow //Has to be moved up here, there exists a circumstance where blob could be deleted without vore organs moving right.
//Get rid of friend blob
stored_blob = blob
blob.set_light(0)
blob.moveToNullspace()
//qdel(blob)
//Return ourselves in case someone wants it
return src
/mob/living/simple_mob/slime/promethean/examine(mob/user)
. = ..()
if(hat)
. += "They are wearing \a [hat]."
/mob/living/simple_mob/slime/promethean/say_understands(var/mob/other, var/datum/language/speaking = null)
if(speaking?.name == LANGUAGE_PROMETHEAN) //Promethean and sign are both nonverbal, so won't work with the same trick as below, so let's check for them
return TRUE
else if(speaking?.name == LANGUAGE_SIGN)
for(var/datum/language/L in humanform.languages)
if(L.name == LANGUAGE_SIGN)
return TRUE
else if(humanform.say_understands(other, speaking)) //So they're speaking something other than promethean or sign, let's just ask our original mob if it understands
return TRUE
else return FALSE
@@ -135,7 +135,7 @@
O_LUNGS = /obj/item/organ/internal/lungs/unathi,
O_LIVER = /obj/item/organ/internal/liver/unathi,
O_BRAIN = /obj/item/organ/internal/brain/unathi,
O_EYES = /obj/item/organ/internal/eyes,
O_EYES = /obj/item/organ/internal/eyes/unathi,
O_STOMACH = /obj/item/organ/internal/stomach/unathi,
O_INTESTINE = /obj/item/organ/internal/intestine/unathi
)
@@ -250,13 +250,13 @@
has_organ = list( //No appendix.
O_HEART = /obj/item/organ/internal/heart/tajaran,
O_LUNGS = /obj/item/organ/internal/lungs,
O_LUNGS = /obj/item/organ/internal/lungs/tajaran,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_LIVER = /obj/item/organ/internal/liver/tajaran,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes/tajaran,
O_STOMACH = /obj/item/organ/internal/stomach,
O_STOMACH = /obj/item/organ/internal/stomach/tajaran,
O_INTESTINE = /obj/item/organ/internal/intestine
)
@@ -356,6 +356,23 @@
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/skrell,
O_LUNGS = /obj/item/organ/internal/lungs/skrell,
O_VOICE = /obj/item/organ/internal/voicebox/skrell,
O_LIVER = /obj/item/organ/internal/liver/skrell,
O_KIDNEYS = /obj/item/organ/internal/kidneys/skrell,
O_BRAIN = /obj/item/organ/internal/brain/skrell,
O_APPENDIX = /obj/item/organ/internal/appendix/skrell,
O_SPLEEN = /obj/item/organ/internal/spleen/skrell,
O_EYES = /obj/item/organ/internal/eyes/skrell,
O_STOMACH = /obj/item/organ/internal/stomach/skrell,
O_INTESTINE = /obj/item/organ/internal/intestine/skrell
)
/datum/species/skrell/can_breathe_water()
return TRUE
/datum/species/zaddat
name = SPECIES_ZADDAT
name_plural = "Zaddat"
@@ -437,6 +454,11 @@
/datum/mob_descriptor/height = 0,
/datum/mob_descriptor/build = -1
)
default_emotes = list(
/decl/emote/audible/chirp
)
/datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H)
..()
if(H.wear_suit) //get rid of job labcoats so they don't stop us from equipping the Shroud
@@ -480,3 +480,33 @@
/datum/trait/neutral/thinner/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.update_transform()
/datum/trait/neutral/dominate_predator
name = "Dominate Predator"
desc = "Allows you to attempt to take control of a predator while inside of their belly."
cost = 0
custom_only = FALSE
/datum/trait/neutral/dominate_predator/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/proc/dominate_predator
/datum/trait/neutral/dominate_prey
name = "Dominate Prey"
desc = "Connect to and dominate the brain of your prey."
cost = 0
custom_only = FALSE
/datum/trait/neutral/dominate_prey/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/dominate_prey
/datum/trait/neutral/submit_to_prey
name = "Submit To Prey"
desc = "Allow prey's mind to control your own body."
cost = 0
custom_only = FALSE
/datum/trait/neutral/submit_to_prey/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/lend_prey_control
+2 -1
View File
@@ -1,5 +1,6 @@
/mob
var/muffled = 0 // Used by muffling belly
var/muffled = FALSE // Used by muffling belly
var/forced_psay = FALSE // If true will prevent the user from speaking with normal say/emotes, and instead redirect these to a private speech mode with their predator.
/mob/living
var/ooc_notes = null
+5 -1
View File
@@ -155,7 +155,11 @@ var/list/channel_to_radio_key = new
if(stat == DEAD && !forbid_seeing_deadchat)
return say_dead(message)
return
//VOREStation Addition Start
if(forced_psay)
psay(message)
return
//VOREStation Addition End
//Parse the mode
var/message_mode = parse_message_mode(message, "headset")
@@ -32,8 +32,6 @@
// VOREStation Edit: Start
. += attempt_vr(src,"examine_bellies_borg",args) //VOREStation Edit
if(ooc_notes)
. += "<span class = 'deptradio'>OOC Notes:</span> <a href='?src=\ref[src];ooc_notes=1'>\[View\]</a>"
// VOREStation Edit: End
. += "*---------*"
@@ -783,6 +783,26 @@
playsound(src.loc, 'sound/effects/clang2.ogg', 10, 1)
visible_message("<span class='warning'>[H] taps [src].</span>")
return
if(I_GRAB)
if(is_vore_predator(H) && H.devourable && src.feeding && src.devourable)
var/switchy = tgui_alert(H, "Do you wish to eat [src] or feed yourself to them?", "Feed or Eat",list("Nevermind!", "Eat","Feed"))
switch(switchy)
if("Nevermind!")
return
if("Eat")
feed_grabbed_to_self(H, src)
return
if("Feed")
H.feed_self_to_grabbed(H, src)
return
if(is_vore_predator(H) && src.devourable)
if(tgui_alert(H, "Do you wish to eat [src]?", "Eat?",list("Nevermind!", "Yes!")) == "Yes!")
feed_grabbed_to_self(H, src)
return
if(H.devourable && src.feeding)
if(tgui_alert(H, "Do you wish to feed yourself to [src]?", "Feed?",list("Nevermind!", "Yes!")) == "Yes!")
H.feed_self_to_grabbed(H, src)
return
//Robots take half damage from basic attacks.
/mob/living/silicon/robot/attack_generic(var/mob/user, var/damage, var/attack_message)
@@ -768,6 +768,7 @@ var/global/list/robot_modules = list(
"Pneuma" = "pneuma-Miner",
"Tower" = "drider-Miner"
)
supported_upgrades = list(/obj/item/borg/upgrade/pka, /obj/item/borg/upgrade/diamonddrill)
/obj/item/weapon/robot_module/robot/miner/Initialize()
@@ -783,8 +784,12 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
src.modules += new /obj/item/weapon/gripper/miner(src)
src.modules += new /obj/item/weapon/mining_scanner(src)
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src)
// New Emag gear for the minebots!
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/diamonddrill(src)
/obj/item/weapon/robot_module/robot/research
name = "research module"
@@ -805,6 +810,7 @@ var/global/list/robot_modules = list(
"Pneuma" = "pneuma-Research",
"Tower" = "drider-Research"
)
supported_upgrades = list(/obj/item/borg/upgrade/advrped)
/obj/item/weapon/robot_module/robot/research/Initialize()
@@ -189,6 +189,7 @@
networks = list(NETWORK_SECURITY)
pto_type = PTO_SECURITY
can_be_pushed = 0
supported_upgrades = list(/obj/item/borg/upgrade/tasercooler)
/obj/item/weapon/robot_module/robot/knine/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src) //You need cuffs to be a proper sec borg!
@@ -466,6 +467,7 @@
channels = list("Science" = 1)
pto_type = PTO_SCIENCE
can_be_pushed = 0
supported_upgrades = list(/obj/item/borg/upgrade/advrped)
/obj/item/weapon/robot_module/robot/science/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
@@ -774,6 +776,7 @@
channels = list("Supply" = 1)
pto_type = PTO_CARGO
can_be_pushed = 0
supported_upgrades = list(/obj/item/borg/upgrade/pka, /obj/item/borg/upgrade/diamonddrill)
/obj/item/weapon/robot_module/robot/kmine/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/borg/sight/material(src)
@@ -785,8 +788,12 @@
src.modules += new /obj/item/weapon/gripper/miner(src)
src.modules += new /obj/item/weapon/mining_scanner(src)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src)
// New Emag gear for the minebots!
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/diamonddrill(src)
var/datum/matter_synth/water = new /datum/matter_synth(500)
water.name = "Water reserves"
@@ -30,3 +30,12 @@
. = ..()
if(. == INITIALIZE_HINT_NORMAL)
modules += new /obj/item/weapon/melee/energy/sword/ionic_rapier/lance(src)
//Swarm Disabler Module
/obj/item/weapon/gun/energy/taser/mounted/cyborg/swarm
name = "disabler"
desc = "An archaic device which attacks the target's nervous-system or control circuits."
icon_state = "disabler"
projectile_type = /obj/item/projectile/beam/stun/disabler
charge_cost = 800
recharge_time = 0.5 SECONDS
@@ -137,7 +137,7 @@
if(post_restless_tired)
post_restless_tired--
return
if(!restless && prob(0.5))
if(prob(0.5))
handle_restless()
/mob/living/simple_mob/vore/overmap/spacewhale/proc/handle_restless()
@@ -149,9 +149,7 @@
ai_holder.base_wander_delay = initial(ai_holder.base_wander_delay)
ai_holder.wander = FALSE
post_restless_tired = 250
if(child_om_marker.known == TRUE)
child_om_marker.icon_state = "space_whale"
visible_message("<span class='notice'>\The [child_om_marker.name] settles down.</span>")
update_icon()
else
restless = TRUE
hazard_pickup_chance *= 1.5
@@ -159,9 +157,18 @@
movement_cooldown = 1
ai_holder.base_wander_delay = 2
ai_holder.wander_delay = 2
if(child_om_marker.known == TRUE)
ai_holder.wander = TRUE
update_icon()
/mob/living/simple_mob/vore/overmap/spacewhale/update_icon()
. = ..()
if(child_om_marker.known == TRUE)
if(restless)
child_om_marker.icon_state = "space_whale_restless"
visible_message("<span class='notice'>\The [child_om_marker.name] ripples excitedly.</span>")
else
child_om_marker.icon_state = "space_whale"
visible_message("<span class='notice'>\The [child_om_marker.name] settles down.</span>")
/datum/ai_holder/simple_mob/melee/spacewhale
hostile = TRUE
@@ -182,8 +189,6 @@
if(stance == STANCE_IDLE)
W.hazard_pickup_chance = initial(W.hazard_pickup_chance)
W.hazard_drop_chance = initial(W.hazard_drop_chance)
W.movement_cooldown = 50
base_wander_delay = 50
W.restless = FALSE
W.handle_restless()
W.movement_cooldown = initial(W.movement_cooldown)
@@ -140,7 +140,8 @@ var/list/_slime_default_emotes = list(
var/hat_state = hat.item_state ? hat.item_state : hat.icon_state
var/image/I = image('icons/inventory/head/mob.dmi', src, hat_state)
I.pixel_y = -7 // Slimes are small.
I.appearance_flags = RESET_COLOR
I.appearance_flags = RESET_COLOR | KEEP_APART
I.blend_mode = BLEND_OVERLAY
add_overlay(I)
// Controls the 'mood' overlay. Overrided in subtypes for specific behaviour.
@@ -16,7 +16,7 @@
melee_damage_upper = 5
meat_amount = 10
meat_type = /obj/item/weapon/reagent_containers/food/snacks/cookiesnack
meat_type = /obj/item/weapon/reagent_containers/food/snacks/cookie
say_list_type = /datum/say_list/cookiegirl
ai_holder_type = /datum/ai_holder/simple_mob/passive/cookiegirl
@@ -0,0 +1,459 @@
///// A mob that gets used when prey dominate predators. Will automatically delete itself if it's not inside a mob.
/mob/living/dominated_brain
name = "dominated brain"
desc = "Someone who has taken a back seat within their own body."
icon = 'icons/obj/surgery.dmi'
icon_state = "brain1"
forced_psay = TRUE
var/mob/living/prey_body //The body of the person who dominated the brain
var/prey_ckey //The ckey of the person who dominated the brain
var/prey_name //In case the body is missing. ;3c
var/list/prey_langs = list()
var/mob/living/pred_body //The body of the person who was dominated
var/pred_ckey //The ckey of the person who was dominated
var/pred_ooc_notes
var/prey_ooc_notes
/mob/living/dominated_brain/New(loc, var/mob/living/pred, preyname, var/mob/living/prey)
. = ..()
prey_name = preyname
if(prey)
prey_body = prey
pred_body = pred
/mob/living/dominated_brain/Initialize()
if(!isliving(loc))
qdel(src)
return
. = ..()
lets_register_our_signals()
verbs |= /mob/living/dominated_brain/proc/resist_control
/mob/living/dominated_brain/Life()
. = ..()
if(!isliving(loc))
qdel(src)
if(!ckey)
qdel(src)
/mob/living/dominated_brain/say_understands(var/mob/other, var/datum/language/speaking = null)
if(pred_body.say_understands(other, speaking))
return TRUE
else return FALSE
/mob/living/dominated_brain/proc/lets_register_our_signals()
if(prey_body)
RegisterSignal(prey_body, COMSIG_PARENT_QDELETING, .proc/prey_was_deleted, TRUE)
RegisterSignal(pred_body, COMSIG_PARENT_QDELETING, .proc/pred_was_deleted, TRUE)
/mob/living/dominated_brain/proc/lets_unregister_our_signals()
prey_was_deleted()
pred_was_deleted()
/mob/living/dominated_brain/proc/prey_was_deleted()
if(prey_body)
UnregisterSignal(prey_body, COMSIG_PARENT_QDELETING)
prey_body = null
/mob/living/dominated_brain/proc/pred_was_deleted()
if(pred_body)
UnregisterSignal(pred_body, COMSIG_PARENT_QDELETING)
pred_body = null
/mob/living/dominated_brain/Destroy()
lets_unregister_our_signals()
. = ..()
/mob/living/dominated_brain/process_resist()
//Resisting control by an alien mind.
if(pred_body.ckey == pred_ckey)
dominate_predator()
return
if(pred_ckey == ckey && pred_body.prey_controlled)
if(tgui_alert(src, "Do you want to wrest control over your body back from \the [prey_name]?", "Regain Control",list("No","Yes")) != "Yes")
return
to_chat(src, "<span class='danger'>You begin to resist \the [prey_name]'s control!!!</span>")
to_chat(pred_body, "<span class='danger'>You feel the captive mind of [src] begin to resist your control.</span>")
if(do_after(src, 10 SECONDS, exclusive = TRUE))
restore_control()
else
to_chat(src, "<span class='notice'>Your attempt to regain control has been interrupted...</span>")
to_chat(pred_body, "<span class='notice'>The dominant sensation fades away...</span>")
else
to_chat(src, "<span class='warning'>\The [pred_body] is already dominated, and cannot be controlled at this time.</span>")
..()
/mob/living/dominated_brain/proc/restore_control(ask = TRUE)
if(ask && disconnect_time || client && ((client.inactivity / 10) / 60 > 10))
if(tgui_alert(src, "Your predator's mind does not seem to be active presently. Releasing control in this state may leave you stuck in whatever state you find yourself in. Are you sure?", "Release Control",list("No","Yes")) != "Yes")
return
var/mob/living/prey_goes_here
if(prey_body && prey_body.loc.loc == pred_body) //The prey body exists and is here, let's handle the prey!
prey_goes_here = prey_body
else if(prey_body) //It exists, but it's not here, let's spawn them a temporary home.
var/mob/living/dominated_brain/ndb = new /mob/living/dominated_brain(pred_body, pred_body, prey_name, prey_body)
ndb.name = prey_name
ndb.prey_ckey = src.prey_ckey
ndb.pred_ckey = src.pred_ckey
prey_goes_here = ndb
prey_goes_here.real_name = src.prey_name
src.languages -= src.temp_languages
prey_goes_here.languages |= src.prey_langs
prey_goes_here.ooc_notes = prey_ooc_notes
prey_goes_here.verbs |= /mob/living/dominated_brain/proc/cease_this_foolishness
else //The prey body does not exist, let's put them in the back seat instead!
var/mob/living/dominated_brain/ndb = new /mob/living/dominated_brain(pred_body, pred_body, prey_name)
ndb.name = prey_name
ndb.prey_ckey = src.prey_ckey
ndb.pred_ckey = src.pred_ckey
prey_goes_here = ndb
src.languages -= src.temp_languages
prey_goes_here.languages |= src.prey_langs
prey_goes_here.real_name = src.prey_name
prey_goes_here.ooc_notes = prey_ooc_notes
///////////////////
// Handle Pred
pred_body.verbs -= /mob/proc/release_predator
//Now actually put the people in the mobs
prey_goes_here.ckey = src.prey_ckey
pred_body.ckey = src.pred_ckey
pred_body.ooc_notes = pred_ooc_notes
log_and_message_admins("[pred_body] is now controlled by [pred_body.ckey]. They were restored to control through prey domination, and had been controlled by [prey_ckey].")
pred_body.absorb_langs()
pred_body.prey_controlled = FALSE
qdel(src)
/mob/living/proc/absorb_langs() //This should be called on the predator in the exchange
var/list/langlist = list()
languages -= temp_languages
LAZYCLEARLIST(src.temp_languages)
src.temp_languages = list()
for(var/mob/living/L in contents)
if(istype(L,/mob/living/dominated_brain))
if(L.ckey)
langlist |= L.languages
for(var/b in vore_organs)
for(var/mob/living/L in b)
if(isliving(L))
if(L.ckey)
langlist |= L.languages
if(langlist.len)
langlist -= languages
temp_languages |= langlist
languages |= langlist
//Welcome to the adapted borer code.
/mob/proc/dominate_predator()
set category = "Abilities"
set name = "Dominate Predator"
set desc = "Connect to and dominate the brain of your predator."
var/mob/living/pred
var/mob/living/prey = src
if(isbelly(prey.loc))
pred = loc.loc
else if(isliving(prey.loc))
pred = loc
else
to_chat(prey, "<span class='notice'>You are not inside anyone.</span>")
return
if(prey.stat == DEAD)
to_chat(prey, "<span class='warning'>You cannot do that in your current state.</span>")
return
if(!pred.ckey)
to_chat(prey, "<span class='notice'>\The [pred] isn't able to be dominated.</span>")
return
if(prey.prey_controlled)
to_chat(prey, "<span class='warning'>You are already controlling someone, you can't control anyone else at this time.</span>")
return
if(pred.prey_controlled)
to_chat(prey, "<span class='warning'>\The [pred] is already dominated, and cannot be controlled at this time.</span>")
return
if(ishuman(pred))
var/mob/living/carbon/human/h = pred
if(h.resleeve_lock && ckey != h.resleeve_lock)
to_chat(src, "<span class='warning'>\The [h] cannot be impersonated!</span>")
return
if(tgui_alert(prey, "You are attempting to take over [pred], are you sure? Ensure that their preferences align with this kind of play.", "Take Over Predator",list("No","Yes")) != "Yes")
return
to_chat(prey, "<span class='notice'>You attempt to exert your control over \the [pred]...</span>")
log_admin("[key_name_admin(prey)] attempted to take over [pred].")
if(tgui_alert(pred, "\The [prey] has elected to attempt to take control of you. Is this something you will allow to happen?", "Allow Prey Domination",list("No","Yes")) != "Yes")
to_chat(prey, "<span class='warning'>\The [pred] declined your request for control.</span>")
return
if(tgui_alert(pred, "Are you sure? If you should decide to revoke this, you will have the ability to do so in your 'Abilities' tab.", "Allow Prey Domination",list("No","Yes")) != "Yes")
return
to_chat(pred, "<span class='warning'>You can feel the will of another overwriting your own, control of your body being sapped away from you...</span>")
to_chat(prey, "<span class='warning'>You can feel the will of your host diminishing as you exert your will over them!</span>")
if(!do_after(prey, 10 SECONDS, exclusive = TRUE))
to_chat(prey, "<span class='notice'>Your attempt to regain control has been interrupted...</span>")
to_chat(pred, "<span class='notice'>The dominant sensation fades away...</span>")
return
to_chat(prey, "<span class='danger'>You plunge your conciousness into \the [pred], assuming control over their very body, leaving your own behind within \the [pred]'s [loc].</span>")
to_chat(pred, "<span class='danger'>You feel your body move on its own, as you are pushed to the background, and an alien consciousness displaces yours.</span>")
var/mob/living/dominated_brain/pred_brain
var/delete_source = FALSE
if(istype(prey, /mob/living/dominated_brain))
var/mob/living/dominated_brain/punished_prey = prey
if(punished_prey.prey_body)
pred_brain = new /mob/living/dominated_brain(pred, pred, name, punished_prey.prey_body)
else
pred_brain = new /mob/living/dominated_brain(pred, pred, name) //We have to play musical chairs with 3 bodies, or everyone gets d/ced
delete_source = TRUE
else
pred_brain = new /mob/living/dominated_brain(pred, pred, name, prey)
pred_brain.prey_ooc_notes = prey.ooc_notes
pred_brain.pred_ooc_notes = pred.ooc_notes
pred_brain.name = pred.name
var/list/preylangs = list()
preylangs |= prey.languages
preylangs -= prey.temp_languages
pred_brain.prey_langs |= preylangs
pred_brain.prey_ckey = prey.ckey
pred_brain.pred_ckey = pred.ckey
pred_brain.pred_body.absorb_langs()
pred.ooc_notes = pred_brain.prey_ooc_notes
pred.verbs |= /mob/proc/release_predator
//Now actually put the people in the mobs
pred_brain.ckey = pred_brain.pred_ckey
pred_brain.real_name = pred.real_name
pred.ckey = pred_brain.prey_ckey
pred.prey_controlled = TRUE
log_and_message_admins("[pred] is now controlled by [pred.ckey], they were taken over via prey domination, and were originally controlled by [pred_brain.pred_ckey].")
if(delete_source)
qdel(prey)
/mob/proc/release_predator()
set category = "Abilities"
set name = "Restore Control"
set desc = "Release control of your predator's body."
for(var/I in contents)
if(istype(I, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = I
if(db.ckey == db.pred_ckey)
to_chat(src, "<span class='notice'>You ease off of your control, releasing \the [db].</span>")
to_chat(db, "<span class='notice'>You feel the alien presence fade, and restore control of your body to you of their own will...</span>")
db.restore_control()
return
else
continue
to_chat(src, "<span class='danger'>You haven't been taken over, and shouldn't have this verb. I'll clean that up for you. Report this on the github, it is a bug.</span>")
verbs -= /mob/proc/release_predator
/mob/living/dominated_brain/proc/resist_control()
set category = "Abilities"
set name = "Resist Control"
set desc = "Attempt to resist control."
if(pred_body.ckey == pred_ckey)
dominate_predator()
return
if(pred_ckey == ckey && pred_body.prey_controlled)
to_chat(src, "<span class='danger'>You begin to resist \the [prey_name]'s control!!!</span>")
to_chat(pred_body, "<span class='danger'>You feel the captive mind of [src] begin to resist your control.</span>")
if(do_after(src, 10 SECONDS, exclusive = TRUE))
restore_control()
else
to_chat(src, "<span class='notice'>Your attempt to regain control has been interrupted...</span>")
to_chat(pred_body, "<span class='notice'>The dominant sensation fades away...</span>")
else
to_chat(src, "<span class='warning'>\The [pred_body] is already dominated, and cannot be controlled at this time.</span>")
/mob/living/proc/dominate_prey()
set category = "Abilities"
set name = "Dominate Prey"
set desc = "Connect to and dominate the brain of your prey."
var/list/possible_mobs = list()
for(var/obj/belly/B in src.vore_organs)
for(var/mob/living/L in B)
if(isliving(L) && L.ckey)
possible_mobs |= L
else
continue
if(!possible_mobs)
to_chat(src, "<span class='warning'>There are no valid targets inside of you.</span>")
return
var/input = tgui_input_list(src, "Select a mob to dominate:", "Dominate Prey", possible_mobs)
if(!input)
return
var/mob/living/M = input
if(tgui_alert(src, "You selected [M] to attempt to dominate. Are you sure?", "Dominate Prey",list("No","Yes")) != "Yes")
return
log_admin("[key_name_admin(src)] offered to use dominate prey on [M] ([M.ckey]).")
to_chat(src, "<span class='warning'>Attempting to dominate and gather \the [M]'s mind...</span>")
if(tgui_alert(M, "\The [src] has elected collect your mind into their own. Is this something you will allow to happen?", "Allow Dominate Prey",list("No","Yes")) != "Yes")
to_chat(src, "<span class='warning'>\The [M] has declined your Dominate Prey attempt.</span>")
return
if(tgui_alert(M, "Are you sure? You can only undo this while your body is inside of [src]. (You can resist, or use the resist verb in the abilities tab)", "Allow Dominate Prey",list("No","Yes")) != "Yes")
to_chat(src, "<span class='warning'>\The [M] has declined your Dominate Prey attempt.</span>")
return
to_chat(M, "<span class='warning'>You can feel the will of another pulling you away from your body...</span>")
to_chat(src, "<span class='warning'>You can feel the will of your prey diminishing as you gather them!</span>")
if(!do_after(src, 10 SECONDS, exclusive = TRUE))
to_chat(M, "<span class='notice'>The alien presence fades, and you are left along in your body...</span>")
to_chat(src, "<span class='notice'>Your attempt to gather [M]'s mind has been interrupted.</span>")
return
if(!isbelly(M.loc))
to_chat(M, "<span class='notice'>The alien presence fades, and you are left along in your body...</span>")
to_chat(src, "<span class='notice'>Your attempt to gather [M]'s mind has been interrupted.</span>")
return
var/mob/living/dominated_brain/db = new /mob/living/dominated_brain(src, src, M.name, M)
db.name = M.name
db.prey_ckey = M.ckey
db.pred_ckey = src.ckey
db.real_name = M.real_name
M.languages -= M.temp_languages
db.languages |= M.languages
db.ooc_notes = M.ooc_notes
db.verbs |= /mob/living/dominated_brain/proc/cease_this_foolishness
absorb_langs()
db.ckey = db.prey_ckey
log_admin("[db] ([db.ckey]) has agreed to [src]'s dominate prey attempt, and so no longer occupies their original body.")
to_chat(src, "<span class='notice'>You feel your mind expanded as [M] is incorporated into you.</span>")
to_chat(M, "<span class='warning'>Your mind is gathered into \the [src], becoming part of them...</span>")
/mob/living/dominated_brain/proc/cease_this_foolishness()
set category = "Abilities"
set name = "Return to Body"
set desc = "If your body is inside of your predator still, attempts to re-insert yourself into it."
if(prey_body && prey_body.loc.loc == pred_body)
to_chat(src, "<span class='notice'>You exert your will and attempt to return to yout body!!!</span>")
to_chat(pred_body, "<span class='warning'>\The [src] resists your hold and attempts to return to their body!</span>")
if(do_after(src, 10 SECONDS, exclusive = TRUE))
if(prey_body && prey_body.loc.loc == pred_body)
prey_body.ckey = prey_ckey
pred_body.absorb_langs()
to_chat(src, "<span class='warning'>Your connection to [pred_body] fades, and you awaken back in your own body!</span>")
to_chat(pred_body, "<span class='warning'>You feel as though a piece of yourself is missing, as \the [src] returns to their body.</span>")
log_admin("[src] ([src.ckey]) has returned to their body, [prey_body].")
qdel(src)
else
to_chat(src, "<span class='warning'>Your attempt to regain your body has been interrupted...</span>")
else
to_chat(src, "<span class='warning'>Your attempt to regain your body has been interrupted...</span>")
else if(prey_body)
to_chat(src, "<span class='warning'>You can sense your body... but it is not contained within [pred_body]... You cannot return to it at this time.</span>")
else
to_chat(src, "<span class='warning'>Your body seems to no longer exist, so, you cannot return to it.</span>")
verbs -= /mob/living/dominated_brain/proc/cease_this_foolishness
/mob/living/proc/lend_prey_control()
set category = "Abilities"
set name = "Give Prey Control"
set desc = "Allow prey control of your body."
var/list/possible_mobs = list()
for(var/obj/belly/B in src.vore_organs)
for(var/mob/living/L in B)
if(isliving(L) && L.ckey)
possible_mobs |= L
else
continue
if(!possible_mobs)
to_chat(src, "<span class='warning'>There are no valid targets inside of you.</span>")
return
var/input = tgui_input_list(src, "Select a mob to give control:", "Give Prey Control", possible_mobs)
if(!input)
return
var/mob/living/prey = input
var/mob/living/pred = src
if(prey.stat == DEAD)
to_chat(prey, "<span class='warning'>You cannot do that to this prey.</span>")
return
if(!prey.ckey)
to_chat(prey, "<span class='notice'>\The [prey] cannot take control.</span>")
return
if(prey.prey_controlled)
to_chat(prey, "<span class='warning'>\The [prey] is already under someone's control and cannot be given control of your body.</span>")
return
if(pred.prey_controlled)
to_chat(prey, "<span class='warning'>You are already controlling someone's body.</span>")
return
if(tgui_alert(pred, "You are attempting to give [prey] control over you, are you sure? Ensure that their preferences align with this kind of play.", "Give Prey Control",list("No","Yes")) != "Yes")
return
to_chat(pred, "<span class='notice'>You attempt to give your control over to \the [prey]...</span>")
log_admin("[key_name_admin(pred)] attempted to give control to [prey].")
if(tgui_alert(prey, "\The [pred] has elected to attempt to give you control of them. Is this something you will allow to happen?", "Allow Prey Domination",list("No","Yes")) != "Yes")
to_chat(pred, "<span class='warning'>\The [prey] declined your request for control.</span>")
return
if(tgui_alert(prey, "Are you sure? If you should decide to revoke this, you will have the ability to do so in your 'Abilities' tab.", "Allow Prey Domination",list("No","Yes")) != "Yes")
return
to_chat(pred, "<span class='warning'>You diminish your will, reducing it and allowing will of your prey to take over...</span>")
to_chat(prey, "<span class='warning'>You can feel the will of your host diminishing as you are given control over them!</span>")
if(!do_after(pred, 10 SECONDS, exclusive = TRUE))
to_chat(pred, "<span class='notice'>Your attempt to share control has been interrupted...</span>")
to_chat(prey, "<span class='notice'>The dominant sensation fades away...</span>")
return
to_chat(prey, "<span class='danger'>You plunge your conciousness into \the [pred], assuming control over their very body, leaving your own behind within \the [pred]'s [loc].</span>")
to_chat(pred, "<span class='danger'>You feel your body move on its own, as you move to the background, and an alien consciousness displaces yours.</span>")
var/mob/living/dominated_brain/pred_brain
var/delete_source = FALSE
if(istype(prey, /mob/living/dominated_brain))
var/mob/living/dominated_brain/punished_prey = prey
if(punished_prey.prey_body)
pred_brain = new /mob/living/dominated_brain(pred, pred, name, punished_prey.prey_body)
else
pred_brain = new /mob/living/dominated_brain(pred, pred, name) //We have to play musical chairs with 3 bodies, or everyone gets d/ced
delete_source = TRUE
else
pred_brain = new /mob/living/dominated_brain(pred, pred, name, prey)
pred_brain.prey_ooc_notes = prey.ooc_notes
pred_brain.pred_ooc_notes = pred.ooc_notes
pred_brain.name = pred.name
var/list/preylangs = list()
preylangs |= prey.languages
preylangs -= prey.temp_languages
pred_brain.prey_langs |= preylangs
pred_brain.prey_ckey = prey.ckey
pred_brain.pred_ckey = pred.ckey
pred_brain.pred_body.absorb_langs()
pred.ooc_notes = pred_brain.prey_ooc_notes
pred.verbs |= /mob/proc/release_predator
//Now actually put the people in the mobs
pred_brain.ckey = pred_brain.pred_ckey
pred_brain.real_name = pred.real_name
pred.ckey = pred_brain.prey_ckey
pred.prey_controlled = TRUE
log_and_message_admins("[pred] is now controlled by [pred.ckey], they were taken over via pred submission, and were originally controlled by [pred_brain.pred_ckey].")
if(delete_source)
qdel(prey)
@@ -264,8 +264,8 @@
return
var/list/possible_mobs = list()
for(var/obj/belly/B in src.vore_organs)
for(var/mob/living/carbon/human/H in B)
if(ishuman(H) && H.ckey)
for(var/mob/living/H in B)
if( (ishuman(H) || isrobot(H)) && H.ckey )
possible_mobs += H
else
continue
@@ -276,9 +276,11 @@
M = input
if(!M)
return
if(M.resleeve_lock && ckey != M.resleeve_lock)
to_chat(src, "<span class='warning'>\The [M] cannot be impersonated!</span>")
return
// Adding a ishuman check here, since silicon mobs don't have a resleeve_lock from what I can tell.
if(ishuman(M))
if(M.resleeve_lock && ckey != M.resleeve_lock)
to_chat(src, "<span class='warning'>\The [M] cannot be impersonated!</span>")
return
if(tgui_alert(src, "You selected [M] to attempt to take over. Are you sure?", "Take Over Prey",list("No","Yes")) == "Yes")
log_admin("[key_name_admin(src)] offered [M] to swap bodies as a morph.")
if(tgui_alert(M, "\The [src] has elected to attempt to take over your body and control you. Is this something you will allow to happen?", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
@@ -2605,6 +2605,18 @@ shaved
species_allowed = list(SPECIES_DIONA)
do_colouration = 0
//Skrell stuff.
/datum/sprite_accessory/marking/skrell
name = "Countershading (Skrell)"
icon_state = "skr_shade"
body_parts = list(BP_TORSO, BP_GROIN, BP_HEAD)
species_allowed = list(SPECIES_SKRELL)
/datum/sprite_accessory/marking/skrell/stripes
name = "Poison Dart Stripes (Skrell)"
icon_state = "skr_stripes"
body_parts = list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM, BP_TORSO)
//Cybernetic Augments, some species-limited due to sprite misalignment. /aug/ types are excluded from dna.
@@ -191,6 +191,11 @@
suit_sprites = 'icons/mob/taursuits_horse.dmi'
icon_sprite_tag = "horse"
/datum/sprite_accessory/tail/taur/horse/horse_2c
name = "Horse & colorable tail (Taur)"
extra_overlay = "horse_markings"
//icon_sprite_tag = "wolf2c"
/datum/sprite_accessory/tail/taur/horse/synthhorse
name = "SynthHorse dual-color (Taur)"
icon_state = "synthhorse_s"
+24
View File
@@ -4,12 +4,22 @@
/mob/verb/whisper(message as text)
set name = "Whisper"
set category = "IC"
//VOREStation Addition Start
if(forced_psay)
psay(message)
return
//VOREStation Addition End
usr.say(message,whispering=1)
/mob/verb/say_verb(message as text)
set name = "Say"
set category = "IC"
//VOREStation Addition Start
if(forced_psay)
psay(message)
return
//VOREStation Addition End
set_typing_indicator(FALSE)
usr.say(message)
@@ -21,6 +31,11 @@
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "<font color='red'>Speech is currently admin-disabled.</font>")
return
//VOREStation Addition Start
if(forced_psay)
pme(message)
return
//VOREStation Addition End
//VOREStation Edit Start
if(muffled)
@@ -63,6 +78,15 @@
else if(universal_speak || universal_understand)
return TRUE
//VOREStation Addition Start
if(isliving(src))
var/mob/living/L = src
if(isbelly(L.loc) && L.absorbed)
var/mob/living/P = L.loc.loc
if(P.say_understands(other, speaking))
return TRUE
//VOREStation Addition End
//Languages are handled after.
if(!speaking)
if(!other)
+173
View File
@@ -10,6 +10,11 @@
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "Speech is currently admin-disabled.")
return
//VOREStation Addition Start
if(forced_psay)
pme(message)
return
//VOREStation Addition End
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason)
if(!message)
@@ -26,6 +31,12 @@
to_chat(src, "You are unable to emote.")
return
//VOREStation Addition Start
if(forced_psay)
pme(message)
return
//VOREStation Addition End
var/muzzled = is_muzzled()
if(m_type == 2 && muzzled) return
@@ -99,3 +110,165 @@
to_chat(user,message)
to_chat(user, "<span class='danger'>^ This message was NOT SENT ^ -- It was [length] characters, and the limit is [MAX_MESSAGE_LEN]. It would fit in [posts] separate messages.</span>")
#undef MAX_HUGE_MESSAGE_LEN
///// PSAY /////
/mob/verb/psay(message as text|null)
set category = "IC"
set name = "Psay"
set desc = "Talk to people affected by complete absorbed or dominate predator/prey."
if (src.client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "<span class='warning'>You cannot speak in IC (muted).</span>")
return
if (!message)
message = input(usr, "Type a message to say.","Psay") as text|null
message = sanitize_or_reflect(message,src)
if (!message)
return
message = capitalize(message)
if (stat == DEAD)
return say_dead(message)
if(!isliving(src))
forced_psay = FALSE
say(message)
var/f = FALSE //did we find someone to send the message to other than ourself?
var/mob/living/pb //predator body
var/mob/living/M = src
if(istype(M, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = M
if(db.loc != db.pred_body)
to_chat(db, "<span class='danger'>You aren't inside of a brain anymore!!!</span>")
qdel(db) //Oh no, dominated brains shouldn't exist outside of the body, so if we got here something went very wrong.
return
else
pb = db.pred_body
to_chat(pb, "<span class='changeling'>The captive mind of \the [M] thinks, \"[message]\"</span>") //To our pred if dominated brain
f = TRUE
else if(M.absorbed && isbelly(M.loc))
pb = M.loc.loc
to_chat(pb, "<span class='changeling'>\The [M] thinks, \"[message]\"</span>") //To our pred if absorbed
f = TRUE
if(pb) //We are prey, let's do the prey thing.
for(var/I in pb.contents)
if(istype(I, /mob/living/dominated_brain) && I != M)
var/mob/living/dominated_brain/db = I
to_chat(db, "<span class='changeling'>The captive mind of \the [M] thinks, \"[message]\"</span>") //To any dominated brains in the pred
f = TRUE
for(var/B in pb.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed && L != M && L.ckey)
to_chat(L, "<span class='changeling'>\The [M] thinks, \"[message]\"</span>") //To any absorbed people in the pred
f = TRUE
//Let's also check and see if there's anyone inside of us to send the message to.
for(var/I in M.contents)
if(istype(I, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = I
to_chat(db, "<span class='changeling'><b>\The [M] thinks, \"[message]\"</b></span>") //To any dominated brains inside us
f = TRUE
for(var/B in M.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed)
to_chat(L, "<span class='changeling'><b>\The [M] thinks, \"[message]\"</b></span>") //To any absorbed people inside us
f = TRUE
if(f) //We found someone to send the message to
if(pb)
to_chat(M, "<span class='changeling'>You think \"[message]\"</span>") //To us if we are the prey
else
to_chat(M, "<span class='changeling'><b>You think \"[message]\"</b></span>") //To us if we are the pred
for (var/mob/G in player_list)
if (istype(G, /mob/new_player))
continue
else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears))
if(is_preference_enabled(/datum/client_preference/whisubtle_vis) || G.client.holder)
to_chat(G, "<span class='changeling'>\The [M] thinks, \"[message]\"</span>")
log_say(message,M)
else //There wasn't anyone to send the message to, pred or prey, so let's just say it instead and correct our psay just in case.
M.forced_psay = FALSE
M.say(message)
///// PME /////
/mob/verb/pme(message as text|null)
set category = "IC"
set name = "Pme"
set desc = "Emote to people affected by complete absorbed or dominate predator/prey."
if (src.client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "<span class='warning'>You cannot speak in IC (muted).</span>")
return
if (!message)
message = input(usr, "Type a message to emote.","Pme") as text|null
message = sanitize_or_reflect(message,src)
if (!message)
return
if (stat == DEAD)
return say_dead(message)
if(!isliving(src))
forced_psay = FALSE
me_verb(message)
var/f = FALSE //did we find someone to send the message to other than ourself?
var/mob/living/pb //predator body
var/mob/living/M = src
if(istype(M, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = M
if(db.loc != db.pred_body)
to_chat(db, "<span class='danger'>You aren't inside of a brain anymore!!!</span>")
qdel(db) //Oh no, dominated brains shouldn't exist outside of the body, so if we got here something went very wrong.
return
else
pb = db.pred_body
to_chat(pb, "<span class='changeling'>\The [M] [message]</span>") //To our pred if dominated brain
f = TRUE
else if(M.absorbed && isbelly(M.loc))
pb = M.loc.loc
to_chat(pb, "<span class='changeling'>\The [M] [message]</span>") //To our pred if absorbed
f = TRUE
if(pb) //We are prey, let's do the prey thing.
for(var/I in pb.contents)
if(istype(I, /mob/living/dominated_brain) && I != M)
var/mob/living/dominated_brain/db = I
to_chat(db, "<span class='changeling'>\The [M] [message]</span>") //To any dominated brains in the pred
f = TRUE
for(var/B in pb.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed && L != M && L.ckey)
to_chat(L, "<span class='changeling'>\The [M] [message]</span>") //To any absorbed people in the pred
f = TRUE
//Let's also check and see if there's anyone inside of us to send the message to.
for(var/I in M.contents)
if(istype(I, /mob/living/dominated_brain))
var/mob/living/dominated_brain/db = I
to_chat(db, "<span class='changeling'><b>\The [M] [message]</b></span>") //To any dominated brains inside us
f = TRUE
for(var/B in M.vore_organs)
for(var/mob/living/L in B)
if(L.absorbed)
to_chat(L, "<span class='changeling'><b>\The [M] [message]</b></span>") //To any absorbed people inside us
f = TRUE
if(f) //We found someone to send the message to
if(pb)
to_chat(M, "<span class='changeling'>\The [M] [message]</span>") //To us if we are the prey
else
to_chat(M, "<span class='changeling'><b>\The [M] [message]</b></span>") //To us if we are the pred
for (var/mob/G in player_list)
if (istype(G, /mob/new_player))
continue
else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears))
if(is_preference_enabled(/datum/client_preference/whisubtle_vis) || G.client.holder)
to_chat(G, "<span class='changeling'>\The [M] [message]</span>")
log_say(message,M)
else //There wasn't anyone to send the message to, pred or prey, so let's just emote it instead and correct our psay just in case.
M.forced_psay = FALSE
M.me_verb(message)
+1 -1
View File
@@ -50,6 +50,6 @@
/obj/item/organ/internal/appendix/removed()
if(inflamed)
icon_state = "appendixinflamed"
icon_state = "[initial(icon_state)]inflamed"
name = "inflamed appendix"
..()
-10
View File
@@ -66,16 +66,6 @@
owner.adjustToxLoss(15 * spleen_efficiency)
Target.wounds += W
/obj/item/organ/internal/spleen/skrell
name = "lymphatic hub"
icon_state = "spleen"
parent_organ = BP_HEAD
spleen_efficiency = 0.5
/obj/item/organ/internal/spleen/skrell/Initialize()
. = ..()
adjust_scale(0.8,0.7)
/obj/item/organ/internal/spleen/minor
name = "vestigial spleen"
parent_organ = BP_GROIN
+2 -1
View File
@@ -65,10 +65,11 @@
if(owner && owner.stat != DEAD)
owner.bodytemperature += round(owner.robobody_count * 0.25, 0.1)
/* //VOREStation Removal - normal chem processing
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.ingested?.total_volume && H.bloodstr)
H.ingested.trans_to_holder(H.bloodstr, rand(2,5))
*/
return
+4 -2
View File
@@ -90,8 +90,7 @@
parent_organ = BP_TORSO
vital = TRUE
organ_verbs = list(
/mob/living/carbon/human/proc/self_diagnostics,
/mob/living/carbon/human/proc/reagent_purge
/mob/living/carbon/human/proc/self_diagnostics
)
/obj/item/organ/internal/nano/refactory
@@ -104,6 +103,9 @@
var/list/materials = list(MAT_STEEL = 0)
var/max_storage = 10000
organ_verbs = list(
/mob/living/carbon/human/proc/reagent_purge
)
/obj/item/organ/internal/nano/refactory/proc/get_stored_material(var/material)
if(status & ORGAN_DEAD)
+41
View File
@@ -0,0 +1,41 @@
/obj/item/organ/internal/eyes/skrell
icon_state = "skrell_eyes"
/obj/item/organ/internal/heart/skrell
icon_state = "skrell_heart-on"
dead_icon = "skrell_heart-off"
/obj/item/organ/internal/lungs/skrell
icon_state = "skrell_lungs"
/obj/item/organ/internal/liver/skrell
icon_state = "skrell_liver"
/obj/item/organ/internal/brain/skrell
icon_state = "brain_skrell"
/obj/item/organ/internal/stomach/skrell
icon_state = "skrell_stomach"
/obj/item/organ/internal/kidneys/skrell
icon_state = "skrell_kidney"
/obj/item/organ/internal/intestine/skrell
icon_state = "skrell_intestine"
/obj/item/organ/internal/voicebox/skrell
icon_state = "skrell_larynx"
will_assist_languages = list(LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR)
/obj/item/organ/internal/appendix/skrell
icon_state = "skrell_appendix"
/obj/item/organ/internal/spleen/skrell
name = "lymphatic hub"
icon_state = "skrell_spleen"
parent_organ = BP_HEAD
spleen_efficiency = 0.5
/obj/item/organ/internal/spleen/skrell/Initialize()
. = ..()
adjust_scale(0.8,0.7)
+8
View File
@@ -5,3 +5,11 @@
icon_state = "tajaran_heart-on"
dead_icon = "tajaran_heart-off"
/obj/item/organ/internal/lungs/tajaran
icon_state = "tajaran_lungs"
/obj/item/organ/internal/liver/tajaran
icon_state = "tajaran_liver"
/obj/item/organ/internal/stomach/tajaran
icon_state = "tajaran_stomach"

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