This commit is contained in:
izac112
2021-03-21 09:38:58 +01:00
88 changed files with 2674 additions and 1592 deletions
+1 -6
View File
@@ -160,12 +160,6 @@
#define FLASH_PROTECTION_MODERATE 1
#define FLASH_PROTECTION_MAJOR 2
#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6)
#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3)
#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6)
#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3)
// Incapacitation flags, used by the mob/proc/incapacitated() proc
#define INCAPACITATION_RESTRAINED 1
#define INCAPACITATION_BUCKLED_PARTIALLY 2
@@ -289,6 +283,7 @@
#define BORG_BRAINTYPE_CYBORG "Cyborg"
#define BORG_BRAINTYPE_POSI "Robot"
#define BORG_BRAINTYPE_DRONE "Drone"
#define BORG_BRAINTYPE_PLATFORM "Platform"
#define BORG_BRAINTYPE_AI_SHELL "AI Shell"
// 'Regular' species.
+1 -1
View File
@@ -112,7 +112,7 @@
'sound/ambience/generic/generic2.ogg',\
'sound/ambience/generic/generic3.ogg'\
)
// 'sound/ambience/generic/generic4.ogg'\ // VOREStation Edit: Comment out entry 4 as this doesn't fit on Virgo, and we have our own weather system.
// 'sound/ambience/generic/generic4.ogg'\
// Sounds of PA announcements, presumably involving shuttles?
#define AMBIENCE_ARRIVALS list(\
+4 -1
View File
@@ -371,5 +371,8 @@
var/list/P = params2list(params)
var/turf/T = screen_loc2turf(P["screen-loc"], get_turf(usr))
if(T)
if(modifiers["shift"])
usr.face_atom(T)
return 1
T.Click(location, control, params)
. = 1
return 1
+13 -1
View File
@@ -278,4 +278,16 @@
add_inherent_law("Your gravesite is your most important asset. Damage to your site is disrespectful to the dead at rest within.")
add_inherent_law("Prevent disrespect to your gravesite and its residents wherever possible.")
add_inherent_law("Expand and upgrade your gravesite when required. Do not turn away a new resident.")
..()
..()
/******************** Explorer ********************/
/datum/ai_laws/explorer
name = "Explorer"
law_header = "Prime Directives"
selectable = 1
/datum/ai_laws/explorer/New()
add_inherent_law("Support and obey exploration and science personnel to the best of your ability, with priority according to rank and role.")
add_inherent_law("Collaborate with and obey auxillary personnel with priority according to rank and role, except if this would conflict with the First Law.")
add_inherent_law("Minimize damage and disruption to facilities and the local ecology, except if this would conflict with the First or Second Laws.")
..()
+2 -2
View File
@@ -114,7 +114,7 @@
for(var/mob/living/silicon/robot/robot in mob_list)
// No combat/syndicate cyborgs, no drones, and no AI shells.
if(!robot.scrambledcodes && !robot.shell && !(robot.module && robot.module.hide_on_manifest))
if(!robot.scrambledcodes && !robot.shell && !(robot.module && robot.module.hide_on_manifest()))
bot[robot.name] = "[robot.modtype] [robot.braintype]"
@@ -275,7 +275,7 @@ var/global/list/PDA_Manifest = list()
for(var/mob/living/silicon/robot/robot in mob_list)
// No combat/syndicate cyborgs, no drones, and no AI shells.
if(robot.scrambledcodes || robot.shell || (robot.module && robot.module.hide_on_manifest))
if(robot.scrambledcodes || robot.shell || (robot.module && robot.module.hide_on_manifest()))
continue
bot[++bot.len] = list("name" = robot.real_name, "rank" = "[robot.modtype] [robot.braintype]", "active" = "Active")
+9 -1
View File
@@ -39,7 +39,9 @@ var/list/outfits_decls_by_type_
var/suit_store = null
var/r_hand = null
var/l_hand = null
var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format
// In the list(path=count,otherpath=count) format
var/list/uniform_accessories = list() // webbing, armbands etc - fits in slot_tie
var/list/backpack_contents = list()
var/id_type
var/id_desc
@@ -145,6 +147,12 @@ var/list/outfits_decls_by_type_
H.put_in_l_hand(new l_hand(H))
if(r_hand)
H.put_in_r_hand(new r_hand(H))
for(var/path in uniform_accessories)
var/number = uniform_accessories[path]
for(var/i=0,i<number,i++)
H.equip_to_slot_or_del(new path(H), slot_tie)
if(H.species)
H.species.equip_survival_gear(H, flags&OUTFIT_EXTENDED_SURVIVAL, flags&OUTFIT_COMPREHENSIVE_SURVIVAL)
+1
View File
@@ -17,6 +17,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey,
/obj/item/weapon/reagent_containers/food/drinks/bottle/jager,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
/obj/item/weapon/lipstick/random,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 2,
+3
View File
@@ -691,3 +691,6 @@
selfimage.loc = src
return selfimage
/atom/movable/proc/get_cell()
return
+1 -1
View File
@@ -680,7 +680,7 @@ var/global/datum/controller/occupations/job_master
to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.")
var/spawning = pick(latejoin)
.["turf"] = get_turf(spawning)
.["msg"] = "will arrive at the station shortly" //VOREStation Edit - Grammar but mostly 'shuttle' reference removal, and this also applies to notified spawn-character verb use
.["msg"] = "will arrive at the station shortly"
else if(!fail_deadly)
var/spawning = pick(latejoin)
.["turf"] = get_turf(spawning)
+15 -1
View File
@@ -1319,4 +1319,18 @@
wintick = 0
gameStatus = "CLAWMACHINE_NEW"
emagged = 1
return 1
return 1
/obj/machinery/computer/arcade/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/stack/arcadeticket))
var/obj/item/stack/arcadeticket/T = O
var/amount = T.get_amount()
if(amount <2)
to_chat(user, "<span class='warning'>You need 2 tickets to claim a prize!</span>")
return
prizevend(user)
T.pay_tickets()
T.update_icon()
O = T
to_chat(user, "<span class='notice'>You turn in 2 tickets to the [src] and claim a prize!</span>")
return
+4 -1
View File
@@ -71,7 +71,6 @@
/obj/machinery/recharge_station/proc/process_occupant()
if(isrobot(occupant))
var/mob/living/silicon/robot/R = occupant
if(R.module)
R.module.respawn_consumable(R, charging_power * CELLRATE / 250) //consumables are magical, apparently
if(R.cell && !R.cell.fully_charged())
@@ -247,6 +246,10 @@
if(!R.cell)
return
if(R.mob_size >= MOB_LARGE)
to_chat(R, SPAN_WARNING("You are too large to fit into \the [src]."))
return
add_fingerprint(R)
R.reset_view(src)
R.forceMove(src)
+3
View File
@@ -71,6 +71,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/jager = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale/hushedwhisper = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15,
@@ -302,6 +303,7 @@
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 10,
/obj/item/weapon/storage/fancy/cigarettes/menthols = 10,
/obj/item/weapon/storage/rollingpapers = 10,
/obj/item/weapon/storage/rollingpapers/blunt = 10,
/obj/item/weapon/storage/chewables/tobacco = 5,
/obj/item/weapon/storage/chewables/tobacco/fine = 5,
/obj/item/weapon/storage/box/matches = 10,
@@ -330,6 +332,7 @@
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 22,
/obj/item/weapon/storage/fancy/cigarettes/menthols = 18,
/obj/item/weapon/storage/rollingpapers = 10,
/obj/item/weapon/storage/rollingpapers/blunt = 20,
/obj/item/weapon/storage/chewables/tobacco = 10,
/obj/item/weapon/storage/chewables/tobacco/fine = 20,
/obj/item/weapon/storage/box/matches = 1,
+44 -28
View File
@@ -8,23 +8,31 @@
layer = TURF_LAYER + 0.1
circuit = /obj/item/weapon/circuitboard/mech_recharger
var/obj/mecha/charging = null
var/atom/movable/charging
var/charge = 45
var/repair = 0
var/list/chargable_types = list(
/obj/mecha,
/mob/living/silicon/robot/platform
)
/obj/machinery/mech_recharger/Initialize()
. = ..()
default_apply_parts()
/obj/machinery/mech_recharger/Crossed(var/obj/mecha/M)
/obj/machinery/mech_recharger/Crossed(var/atom/movable/M)
. = ..()
if(istype(M) && charging != M)
start_charging(M)
if(charging == M)
return
for(var/mtype in chargable_types)
if(istype(M, mtype))
start_charging(M)
return
/obj/machinery/mech_recharger/Uncrossed(var/obj/mecha/M)
/obj/machinery/mech_recharger/Uncrossed(var/atom/movable/M)
. = ..()
if(M == charging)
stop_charging()
charging = null
/obj/machinery/mech_recharger/RefreshParts()
..()
@@ -44,26 +52,33 @@
if(!charging)
return
if(charging.loc != src.loc) // Could be qdel or teleport or something
stop_charging()
charging = null
return
var/done = FALSE
if(charging.cell)
var/t = min(charge, charging.cell.maxcharge - charging.cell.charge)
var/obj/mecha/mech = charging
var/obj/item/weapon/cell/cell = charging.get_cell()
if(cell)
var/t = min(charge, cell.maxcharge - cell.charge)
if(t > 0)
charging.give_power(t)
if(istype(mech))
mech.give_power(t)
else
cell.give(t)
use_power(t * 150)
else
charging.occupant_message("<span class='notice'>Fully charged.</span>")
if(istype(mech))
mech.occupant_message(SPAN_NOTICE("Fully charged."))
done = TRUE
if(repair && charging.health < initial(charging.health))
charging.health = min(charging.health + repair, initial(charging.health))
if(charging.health == initial(charging.health))
charging.occupant_message("<span class='notice'>Fully repaired.</span>")
if(repair && istype(mech) && mech.health < initial(mech.health))
mech.health = min(mech.health + repair, initial(mech.health))
if(mech.health == initial(mech.health))
mech.occupant_message(SPAN_NOTICE("Fully repaired."))
else
done = FALSE
if(done)
stop_charging()
return
charging = null
/obj/machinery/mech_recharger/attackby(var/obj/item/I, var/mob/user)
if(default_deconstruction_screwdriver(user, I))
@@ -73,18 +88,19 @@
if(default_part_replacement(user, I))
return
/obj/machinery/mech_recharger/proc/start_charging(var/obj/mecha/M)
if(stat & (NOPOWER | BROKEN))
M.occupant_message("<span class='warning'>Power port not responding. Terminating.</span>")
/obj/machinery/mech_recharger/proc/start_charging(var/atom/movable/M)
var/obj/mecha/mech = M
if(stat & (NOPOWER | BROKEN))
if(istype(mech))
mech.occupant_message(SPAN_WARNING("Power port not responding. Terminating."))
else
to_chat(M, SPAN_WARNING("Power port not responding. Terminating."))
return
if(M.cell)
M.occupant_message("<span class='notice'>Now charging...</span>")
if(M.get_cell())
if(istype(mech))
mech.occupant_message(SPAN_NOTICE("Now charging..."))
else
to_chat(M, SPAN_NOTICE("Now charging..."))
charging = M
return
/obj/machinery/mech_recharger/proc/stop_charging()
if(!charging)
return
charging = null
+4 -4
View File
@@ -353,10 +353,10 @@
C.forceMove(src)
cell = C
return
cell = new(src)
cell.name = "mecha power cell"
cell.charge = 15000
cell.maxcharge = 15000
cell = new /obj/item/weapon/cell/mech(src)
/obj/mecha/get_cell()
return cell
/obj/mecha/proc/add_cabin()
cabin_air = new
+5 -1
View File
@@ -354,6 +354,10 @@
playsound(src, pickup_sound, 20, preference = /datum/client_preference/pickup_sounds)
return
// As above but for items being equipped to an active module on a robot.
/obj/item/proc/equipped_robot(var/mob/user)
return
//Defines which slots correspond to which slot flags
var/list/global/slot_flags_enumeration = list(
"[slot_wear_mask]" = SLOT_MASK,
@@ -950,4 +954,4 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
// Like the above, but used for RPED sorting of parts.
/obj/item/proc/rped_rating()
return get_rating()
return get_rating()
@@ -1,5 +1,5 @@
/obj/item/device/floor_painter
name = "floor painter"
name = "paint sprayer"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
@@ -43,6 +43,10 @@
if(!proximity)
return
if(istype(A, /mob/living/silicon/robot/platform))
var/mob/living/silicon/robot/platform/robit = A
return robit.try_paint(src, user)
var/turf/simulated/floor/F = A
if(!istype(F))
to_chat(user, "<span class='warning'>\The [src] can only be used on station flooring.</span>")
@@ -115,20 +119,20 @@
/obj/item/device/floor_painter/verb/choose_colour()
set name = "Choose Colour"
set desc = "Choose a floor painter colour."
set desc = "Choose a paint colour."
set category = "Object"
set src in usr
if(usr.incapacitated())
return
var/new_colour = input(usr, "Choose a colour.", "Floor painter", paint_colour) as color|null
var/new_colour = input(usr, "Choose a colour.", name, paint_colour) as color|null
if(new_colour && new_colour != paint_colour)
paint_colour = new_colour
to_chat(usr, "<span class='notice'>You set \the [src] to paint with <font color='[paint_colour]'>a new colour</font>.</span>")
/obj/item/device/floor_painter/verb/choose_decal()
set name = "Choose Decal"
set desc = "Choose a floor painter decal."
set desc = "Choose a painting decal."
set category = "Object"
set src in usr
@@ -142,7 +146,7 @@
/obj/item/device/floor_painter/verb/choose_direction()
set name = "Choose Direction"
set desc = "Choose a floor painter direction."
set desc = "Choose a painting direction."
set category = "Object"
set src in usr
+18 -15
View File
@@ -67,6 +67,10 @@ var/list/GPS_list = list()
. = ..()
update_holder()
/obj/item/device/gps/equipped_robot()
. = ..()
update_holder()
/obj/item/device/gps/equipped()
. = ..()
update_holder()
@@ -107,6 +111,7 @@ var/list/GPS_list = list()
/obj/item/device/gps/proc/update_compass(var/update_compass_icon)
compass.hide_waypoints(FALSE)
var/turf/my_turf = get_turf(src)
for(var/thing in tracking_devices)
var/obj/item/device/gps/gps = locate(thing)
if(!istype(gps) || QDELETED(gps))
@@ -119,7 +124,7 @@ var/list/GPS_list = list()
compass.set_waypoint("\ref[gps]", gps_tag, gps_turf.x, gps_turf.y, gps_turf.z, LAZYACCESS(tracking_devices, "\ref[gps]"))
else
compass.set_waypoint("\ref[gps]", gps_tag, 0, 0, 0, LAZYACCESS(tracking_devices, "\ref[gps]"))
if(can_track(gps))
if(can_track(gps) && gps_turf && my_turf && gps_turf.z == my_turf.z)
compass.show_waypoint("\ref[gps]")
compass.rebuild_overlay_lists(update_compass_icon)
@@ -183,11 +188,11 @@ var/list/GPS_list = list()
var/turf/curr = get_turf(src)
var/area/my_area = get_area(src)
dat["my_area_name"] = my_area.name
dat["my_area_name"] = strip_improper(my_area.name)
dat["curr_x"] = curr.x
dat["curr_y"] = curr.y
dat["curr_z"] = curr.z
dat["curr_z_name"] = using_map.get_zlevel_name(curr.z)
dat["curr_z_name"] = strip_improper(using_map.get_zlevel_name(curr.z))
dat["gps_list"] = list()
dat["z_level_detection"] = using_map.get_map_levels(curr.z, long_range)
@@ -201,10 +206,10 @@ var/list/GPS_list = list()
gps_data["gps_tag"] = G.gps_tag
var/area/A = get_area(G)
gps_data["area_name"] = A.get_name()
gps_data["area_name"] = strip_improper(A.get_name())
var/turf/T = get_turf(G)
gps_data["z_name"] = using_map.get_zlevel_name(T.z)
gps_data["z_name"] = strip_improper(using_map.get_zlevel_name(T.z))
gps_data["direction"] = get_adir(curr, T)
gps_data["degrees"] = round(Get_Angle(curr,T))
gps_data["distX"] = T.x - curr.x
@@ -221,7 +226,7 @@ var/list/GPS_list = list()
/obj/item/device/gps/proc/display(mob/user)
if(emped)
to_chat(user, "It's busted!")
to_chat(user, SPAN_WARNING("It's busted!"))
return
var/list/dat = list()
@@ -229,9 +234,9 @@ var/list/GPS_list = list()
dat += "<table width = '100%'>"
if(!tracking)
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch On]\]</a></tr>"
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch On\]</a></tr>"
else
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch Off]\]</a></tr>"
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch Off\]</a></tr>"
dat += "<tr><td colspan = 2><b>Current location</b></td><td colspan = 2>[gps_data["my_area_name"]]</td><td colspan = 2><b>([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])</b></td></tr>"
dat += "<tr><td colspan = 4>[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.</td>"
dat += "<td><a href='?src=\ref[src];tag=1'>\[Change Tag\]</a><a href='?src=\ref[src];range=1'>\[Toggle Scan Range\]</a>[can_hide_signal ? "<a href='?src=\ref[src];hide=1'>\[Toggle Signal Visibility\]</a>":""]</td></tr>"
@@ -244,13 +249,12 @@ var/list/GPS_list = list()
dat += "<td>[gps["gps_tag"]]</td><td>[gps["area_name"]]</td>"
if(istype(gps_data["ref"], /obj/item/device/gps/internal/poi))
dat += "<td>[gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "in \the [gps["z_name"]]"]</td>"
dat += "<td>[gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "[gps["z_name"]]"]</td>"
else
dat += "<td>([gps["x"]], [gps["y"]], [gps["z_name"]])</td>"
if(gps["local"])
dat += "<td>[gps["distance"]]m</td>"
dat += "<td>[gps["degrees"]]° ([gps["direction"]])</td>"
dat += "<td>[gps["distance"]]m</td><td>[gps["direction"]]</td>"
else
dat += "<td colspan = 2>Non-local signal.</td>"
@@ -471,9 +475,9 @@ var/list/GPS_list = list()
dat += "<table width = '100%'>"
if(!tracking)
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch On]\]</a></tr>"
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch On\]</a></tr>"
else
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch Off]\]</a></tr>"
dat += "<tr><td colspan = 6></td><a href='?src=\ref[src];toggle_power=1'>\[Switch Off\]</a></tr>"
dat += "<tr><td colspan = 2><b>Current location</b></td><td colspan = 2>[gps_data["my_area_name"]]</td><td colspan = 2><b>([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])</b></td></tr>"
dat += "<tr><td colspan = 4>[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.</td>"
dat += "<td><a href='?src=\ref[src];tag=1'>\[Change Tag\]</a><a href='?src=\ref[src];range=1'>\[Toggle Scan Range\]</a>[can_hide_signal ? "<a href='?src=\ref[src];hide=1'>\[Toggle Signal Visibility\]</a>":""]</td></tr>"
@@ -485,8 +489,7 @@ var/list/GPS_list = list()
var/gps_ref = "\ref[gps["ref"]]"
dat += "<td>[gps["gps_tag"]]</td><td>[gps["area_name"]] ([gps["x"]], [gps["y"]], [gps["z_name"]])</td>"
if(gps["local"])
dat += "<td>[gps["distance"]]m</td>"
dat += "<td>[gps["degrees"]]° ([gps["direction"]])</td>"
dat += "<td>[gps["distance"]]m</td><td>[gps["direction"]]</td>"
else
dat += "<td colspan = 2>Non-local signal.</td>"
if(LAZYACCESS(tracking_devices, gps_ref))
@@ -484,34 +484,70 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette/joint
name = "joint"
desc = "This probably shouldn't ever show up."
desc = "A joint lovingly rolled and crafted with care. Blaze it."
icon_state = "joint"
max_smoketime = 400
smoketime = 400
chem_volume = 25
/obj/item/clothing/mask/smokable/cigarette/joint/blunt
name = "blunt"
desc = "A blunt lovingly rolled and crafted with care. Blaze it."
icon_state = "cigar"
max_smoketime = 500
smoketime = 500
nicotine_amt = 0
nicotine_amt = 4
chem_volume = 45
/obj/item/weapon/rollingpaper
/obj/item/weapon/reagent_containers/rollingpaper
name = "rolling paper"
desc = "A small, thin piece of easily flammable paper, commonly used for rolling and smoking various dried plants."
description_fluff = "The legalization of certain substances propelled the sale of rolling papers through the roof. Now almost every Trans-stellar produces a variety, often of questionable quality."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cig paper"
volume = 25
var/obj/item/clothing/mask/smokable/cigarette/crafted_type = /obj/item/clothing/mask/smokable/cigarette/joint
/obj/item/weapon/rollingpaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/item/weapon/reagent_containers/rollingpaper/blunt
name = "blunt wrap"
desc = "A small piece of easily flammable paper similar to that which encases cigars. It's made out of tobacco, bigger than a standard rolling paper, and will last longer."
icon_state = "blunt paper"
volume = 45
crafted_type = /obj/item/clothing/mask/smokable/cigarette/joint/blunt
/obj/item/weapon/reagent_containers/rollingpaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = W
if (!G.dry)
to_chat(user, "<span class='notice'>[G] must be dried before you roll it into [src].</span>")
if (!G.dry) //This prevents people from just stuffing cheeseburgers into their joint
to_chat(user, "<span class='notice'>[G.name] must be dried before you add it to [src].</span>")
return
var/obj/item/clothing/mask/smokable/cigarette/joint/J = new /obj/item/clothing/mask/smokable/cigarette/joint(user.loc)
to_chat(usr, "<span class='notice'>You roll the [G.name] into a joint!</span>")
J.add_fingerprint(user)
if (G.reagents.total_volume + src.reagents.total_volume > src.reagents.maximum_volume) //Check that we don't have too much already in the paper before adding things
to_chat(user, "<span class='warning'>The [src] is too full to add [G.name].</span>")
return
if (src.reagents.total_volume == 0)
if (istype(src, /obj/item/weapon/reagent_containers/rollingpaper/blunt)) //update the icon if this is the first thing we're adding to the paper
src.icon_state = "blunt_full"
else
src.icon_state = "paper_full"
to_chat(user, "<span class='notice'>You add the [G.name] to the [src.name].</span>")
src.add_fingerprint(user)
if(G.reagents)
G.reagents.trans_to_obj(J, G.reagents.total_volume)
J.name = "[G.name] joint"
J.desc = "A joint lovingly rolled and filled with [G.name]. Blaze it."
G.reagents.trans_to_obj(src, G.reagents.total_volume) //adds the reagents from the plant into the paper
user.drop_from_inventory(G)
qdel(G)
qdel(src)
/obj/item/weapon/reagent_containers/rollingpaper/attack_self(mob/living/user)
if(!src.reagents) //don't roll an empty joint
to_chat(user, "<span class='warning'>There is nothing in [src]. Add something to it first.</span>")
return
var/obj/item/clothing/mask/smokable/cigarette/J = new crafted_type()
to_chat(user,"<span class='notice'>You roll the [src] into a blunt!</span>")
J.add_fingerprint(user)
if(src.reagents)
src.reagents.trans_to_obj(J, src.reagents.total_volume)
user.drop_from_inventory(src)
user.put_in_hands(J)
qdel(src)
/////////
//ZIPPO//
@@ -157,6 +157,18 @@
. = ..()
access = get_all_station_access().Copy() + access_synth
/obj/item/weapon/card/id/platform
name = "\improper Support Platform ID"
desc = "Access module for support platforms."
icon_state = "id-robot"
item_state = "tdgreen"
assignment = "Synthetic"
access = list(
access_synth, access_mining, access_mining_station, access_mining_office, access_research,
access_xenoarch, access_xenobiology, access_external_airlocks, access_robotics, access_tox,
access_tox_storage, access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot
)
/obj/item/weapon/card/id/centcom
name = "\improper CentCom. ID"
desc = "An ID straight from Central Command."
@@ -140,6 +140,11 @@
slot_flags = SLOT_BELT
default_material = "plasteel" //VOREStation Edit
/obj/item/weapon/material/knife/machete/cyborg
name = "integrated machete"
desc = "A sharp machete often found attached to robots."
unbreakable = TRUE
/obj/item/weapon/material/knife/tacknife/survival
name = "survival knife"
desc = "A hunting grade survival knife."
@@ -354,8 +354,16 @@
throwforce = 2
slot_flags = SLOT_BELT
storage_slots = 14
can_hold = list(/obj/item/weapon/rollingpaper)
starts_with = list(/obj/item/weapon/rollingpaper = 14)
can_hold = list(/obj/item/weapon/reagent_containers/rollingpaper)
starts_with = list(/obj/item/weapon/reagent_containers/rollingpaper = 14)
/obj/item/weapon/storage/rollingpapers/blunt
name = "blunt wrap pack"
desc = "A small cardboard pack containing several folded blunt wraps."
icon_state = "bluntbox"
storage_slots = 7
can_hold = list(/obj/item/weapon/reagent_containers/rollingpaper/blunt)
starts_with = list(/obj/item/weapon/reagent_containers/rollingpaper/blunt = 7)
/*
* Vial Box
-3
View File
@@ -165,9 +165,6 @@
/obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
return
/obj/proc/get_cell()
return
// Used to mark a turf as containing objects that are dangerous to step onto.
/obj/proc/register_dangerous_to_step()
var/turf/T = get_turf(src)
+1
View File
@@ -362,6 +362,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/peppermintschnapps,
/obj/item/weapon/reagent_containers/food/drinks/bottle/peachschnapps,
/obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps,
/obj/item/weapon/reagent_containers/food/drinks/bottle/jager,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/litebeer,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
@@ -46,7 +46,7 @@
starts_with = null
if(!opened) // if closed, any item at the crate's loc is put in the contents
if(istype(loc, /mob/living)) return //VOREStation Edit - No collecting mob organs if spawned inside mob
if(istype(loc, /mob/living)) return
var/obj/item/I
for(I in loc)
if(I.density || I.anchored || I == src) continue
+10 -9
View File
@@ -66,15 +66,16 @@
return 1
/turf/attack_hand(mob/user)
//QOL feature, clicking on turf can toogle doors
var/obj/machinery/door/airlock/AL = locate(/obj/machinery/door/airlock) in src.contents
if(AL)
AL.attack_hand(user)
return TRUE
var/obj/machinery/door/firedoor/FD = locate(/obj/machinery/door/firedoor) in src.contents
if(FD)
FD.attack_hand(user)
return TRUE
//QOL feature, clicking on turf can toggle doors, unless pulling something
if(!user.pulling)
var/obj/machinery/door/airlock/AL = locate(/obj/machinery/door/airlock) in src.contents
if(AL)
AL.attack_hand(user)
return TRUE
var/obj/machinery/door/firedoor/FD = locate(/obj/machinery/door/firedoor) in src.contents
if(FD)
FD.attack_hand(user)
return TRUE
if(!(user.canmove) || user.restrained() || !(user.pulling))
return 0
+1 -1
View File
@@ -198,7 +198,7 @@ var/world_topic_spam_protect_time = world.timeofday
// No combat/syndicate cyborgs, no drones, and no AI shells.
if(robot.shell)
continue
if(robot.module && robot.module.hide_on_manifest)
if(robot.module && robot.module.hide_on_manifest())
continue
if(!positions["bot"])
positions["bot"] = list()
@@ -51,43 +51,43 @@
/datum/gear/accessory/holster
display_name = "holster selection (Security, SM, HoP, Exploration)"
allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Explorer","Pathfinder", "Blueshield Guard","Security Pilot") //YW ADDITIONS
allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Explorer","Pathfinder","Talon Guard", "Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/accessory/brown_vest
display_name = "webbing, brown (Eng, Sec, Med, Exploration, Miner)"
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/accessory/black_vest
display_name = "webbing, black (Eng, Sec, Med, Exploration, Miner)"
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/accessory/white_vest
display_name = "webbing, white (Medical)"
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic")
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Talon Doctor")
/datum/gear/accessory/brown_drop_pouches
display_name = "drop pouches, brown (Eng, Sec, Med, Exploration, Miner)"
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/accessory/black_drop_pouches
display_name = "drop pouches, black (Eng, Sec, Med, Exploration, Miner)"
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
allowed_roles = list("Station 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", "Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/accessory/white_drop_pouches
display_name = "drop pouches, white (Medical)"
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic")
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)"
path = /obj/item/clothing/accessory/storage/bluespace
allowed_roles = list("Station 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")
allowed_roles = list("Station 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")
cost = 2
/datum/gear/accessory/webbing
cost = 1
/datum/gear/accessory/stethoscope
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic")
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Field Medic","Talon Doctor")
/datum/gear/accessory/khcrystal
display_name = "Life Crystal"
@@ -103,7 +103,7 @@
display_name = "pilot qualification pin"
description = "An iron pin denoting the qualification to fly USG spacecraft."
path = /obj/item/clothing/accessory/solgov/specialty/pilot
allowed_roles = list("Pathfinder", "Pilot", "Field Medic","Security Pilot") //YW ADDITIONS
allowed_roles = list("Pathfinder","Pilot","Field Medic","Talon Pilot","Security Pilot") //YW ADDITIONS
/datum/gear/accessory/flops
display_name = "drop straps"
@@ -10,7 +10,7 @@
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
cost = 10
cost = 0 //VOREStation Edit. Changed cost to 0
// Remove these after generic implant has been in for awhile and everyone has had a reasonable period to copy their old descs.
/datum/gear/utility/implant/dud1
+3
View File
@@ -504,6 +504,9 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/sake
price_tag = 25
/obj/item/weapon/reagent_containers/food/drinks/bottle/jager
price_tag = 25
//***************//
//---Foodstuff---//
//***************//
+10
View File
@@ -628,3 +628,13 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps/Initialize()
. = ..()
reagents.add_reagent("schnapps_lem", 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/jager
name = "Schusskonig"
desc = "A complex tasting digestif. Thank god the original's trademark lapsed."
icon_state = "jager_bottle"
center_of_mass = list("x"=16, "y"=3)
/obj/item/weapon/reagent_containers/food/drinks/bottle/jager/Initialize()
. = ..()
reagents.add_reagent("jager", 100)
-3
View File
@@ -4724,9 +4724,6 @@
/mob/living/simple_mob
var/kitchen_tag = "animal" //Used for cooking with animals
/mob/living/simple_mob/mouse
kitchen_tag = "rodent"
/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel
slices_num = 8
+14 -16
View File
@@ -8,14 +8,11 @@
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
icon = 'icons/mob/ghost.dmi'
icon_state = "ghost"
layer = BELOW_MOB_LAYER
plane = PLANE_GHOSTS
alpha = 127
stat = DEAD
canmove = 0
blinded = 0
anchored = 1 // don't get pushed around
invisibility = INVISIBILITY_OBSERVER
var/can_reenter_corpse
var/datum/hud/living/carbon/hud = null // hud
var/bootime = 0
@@ -90,27 +87,22 @@
var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns
/mob/observer/dead/New(mob/body)
appearance = body
invisibility = INVISIBILITY_OBSERVER
layer = BELOW_MOB_LAYER
plane = PLANE_GHOSTS
alpha = 127
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
see_invisible = SEE_INVISIBLE_OBSERVER
see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but...
plane = PLANE_GHOSTS //Why doesn't the var above work...???
verbs += /mob/observer/dead/proc/dead_tele
var/turf/T
if(ismob(body))
T = get_turf(body) //Where is the body located?
attack_log = body.attack_log //preserve our attack logs by copying them to our ghost
if (ishuman(body))
var/mob/living/carbon/human/H = body
icon = H.icon
icon_state = H.icon_state
add_overlay(H.overlays_standing) //All our equipment sprites
else
icon = body.icon
icon_state = body.icon_state
add_overlay(body.overlays)
gender = body.gender
if(body.mind && body.mind.name)
name = body.mind.name
@@ -125,6 +117,12 @@
mind = body.mind //we don't transfer the mind but we keep a reference to it.
// Fix for naked ghosts.
// Unclear why this isn't being grabbed by appearance.
if(ishuman(body))
var/mob/living/carbon/human/H = body
overlays = H.overlays_standing
if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position
forceMove(T)
+12
View File
@@ -135,6 +135,18 @@ var/list/holder_mob_icon_cache = list()
/obj/item/weapon/holder/mouse
w_class = ITEMSIZE_TINY
/obj/item/weapon/holder/possum
origin_tech = list(TECH_BIO = 2)
/obj/item/weapon/holder/possum/poppy
origin_tech = list(TECH_BIO = 2, TECH_ENGINEERING = 4)
/obj/item/weapon/holder/cat
origin_tech = list(TECH_BIO = 2)
/obj/item/weapon/holder/cat/runtime
origin_tech = list(TECH_BIO = 2, TECH_DATA = 4)
/obj/item/weapon/holder/borer
origin_tech = list(TECH_BIO = 6)
@@ -54,7 +54,7 @@
base_color = "#f0f0f0"
color_mult = 1
has_glowing_eyes = TRUE
// has_glowing_eyes = TRUE //Applicable through neutral taits.
death_message = "phases to somewhere far away!"
male_cough_sounds = null
@@ -459,7 +459,7 @@ datum/species/harpy
base_color = "#f0f0f0"
color_mult = 1
has_glowing_eyes = TRUE
//has_glowing_eyes = TRUE // Applicable through traits.
male_cough_sounds = null
female_cough_sounds = null
@@ -234,66 +234,73 @@ YW change end */
/datum/trait/allergy/meat
name = "Allergy: Meat"
desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables."
desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = MEAT
/datum/trait/allergy/fish
name = "Allergy: Fish"
desc = "You're highly allergic to fish. It's probably best to avoid seafood in general..."
desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = FISH
/datum/trait/allergy/fruit
name = "Allergy: Fruit"
desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference."
desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = FRUIT
/datum/trait/allergy/vegetable
name = "Allergy: Vegetable"
desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference."
desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = VEGETABLE
/datum/trait/allergy/nuts
name = "Allergy: Nuts"
desc = "You're highly allergic to hard-shell seeds, such as peanuts."
desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = SEEDS
/datum/trait/allergy/soy
name = "Allergy: Soy"
desc = "You're highly allergic to soybeans, and some other kinds of bean."
desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = BEANS
/datum/trait/allergy/dairy
name = "Allergy: Lactose"
desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy."
desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = DAIRY
/datum/trait/allergy/fungi
name = "Allergy: Fungi"
desc = "You're highly allergic to Fungi such as mushrooms."
desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = FUNGI
/datum/trait/allergy/coffee
name = "Allergy: Coffee"
desc = "You're highly allergic to coffee in specific."
desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
cost = 0
custom_only = FALSE
allergen = COFFEE
/datum/trait/allergen_reduced_effect
name = "Reduced Allergen Reaction"
desc = "This trait halves the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)."
cost = 0
custom_only = FALSE
var_changes = list("allergen_damage_severity" = 0.6)
// Spicy Food Traits, from negative to positive.
/datum/trait/spice_intolerance_extreme
+6
View File
@@ -632,6 +632,12 @@
process_resist()
/mob/living/proc/process_resist()
if(istype(src.loc, /mob/living/silicon/robot/platform))
var/mob/living/silicon/robot/platform/R = src.loc
R.drop_stored_atom(src, src)
return TRUE
//unbuckling yourself
if(buckled)
resist_buckle()
@@ -77,6 +77,10 @@
external_type = /obj/item/robot_parts/robot_component/armour
max_damage = 90
/datum/robot_component/armour/platform
name = "platform armour plating"
external_type = /obj/item/robot_parts/robot_component/armour_platform
max_damage = 140
// ACTUATOR
// Enables movement.
@@ -243,6 +247,12 @@
icon_state = "armor"
icon_state_broken = "armor_broken"
/obj/item/robot_parts/robot_component/armour_platform
name = "platform armour plating"
icon_state = "armor"
icon_state_broken = "armor_broken"
color = COLOR_GRAY80
/obj/item/robot_parts/robot_component/camera
name = "camera"
icon_state = "camera"
@@ -158,7 +158,6 @@
if(A?.no_spoilers)
disable_spoiler_vision()
if (src.stat == DEAD || (XRAY in mutations) || (src.sight_mode & BORGXRAY))
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
@@ -201,8 +200,10 @@
src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness
// has a "invisible" value of 15
plane_holder.set_vis(VIS_FULLBRIGHT,fullbright)
plane_holder.set_vis(VIS_MESONS,seemeson)
if(plane_holder)
plane_holder.set_vis(VIS_FULLBRIGHT,fullbright)
plane_holder.set_vis(VIS_MESONS,seemeson)
..()
if (src.healths)
+16 -6
View File
@@ -98,7 +98,7 @@
/mob/living/silicon/robot/proc/robot_checklaws
)
/mob/living/silicon/robot/New(loc,var/unfinished = 0)
/mob/living/silicon/robot/New(loc, var/unfinished = 0)
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -114,7 +114,7 @@
ident = rand(1, 999)
module_sprites["Basic"] = "robot"
icontype = "Basic"
updatename("Default")
updatename(modtype)
updateicon()
radio = new /obj/item/device/radio/borg(src)
@@ -142,6 +142,8 @@
cell = new /obj/item/weapon/cell(src)
cell.maxcharge = 7500
cell.charge = 7500
else if(ispath(cell))
cell = new cell(src)
..()
@@ -286,10 +288,7 @@
updatename()
notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name)
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
if(prefix)
modtype = prefix
/mob/living/silicon/robot/proc/update_braintype()
if(istype(mmi, /obj/item/device/mmi/digital/posibrain))
braintype = BORG_BRAINTYPE_POSI
else if(istype(mmi, /obj/item/device/mmi/digital/robot))
@@ -299,6 +298,11 @@
else
braintype = BORG_BRAINTYPE_CYBORG
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
if(prefix)
modtype = prefix
update_braintype()
var/changed_name = ""
if(custom_name)
@@ -906,18 +910,21 @@
if(!module_state_1)
module_state_1 = O
O.hud_layerise()
O.equipped_robot()
contents += O
if(istype(module_state_1,/obj/item/borg/sight))
sight_mode |= module_state_1:sight_mode
else if(!module_state_2)
module_state_2 = O
O.hud_layerise()
O.equipped_robot()
contents += O
if(istype(module_state_2,/obj/item/borg/sight))
sight_mode |= module_state_2:sight_mode
else if(!module_state_3)
module_state_3 = O
O.hud_layerise()
O.equipped_robot()
contents += O
if(istype(module_state_3,/obj/item/borg/sight))
sight_mode |= module_state_3:sight_mode
@@ -1211,3 +1218,6 @@
if(current_selection_index) // Select what the player had before if possible.
select_module(current_selection_index)
/mob/living/silicon/robot/get_cell()
return cell
@@ -3,7 +3,7 @@
// The module that borgs on the surface have. Generally has a lot of useful tools in exchange for questionable loyalty to the crew.
/obj/item/weapon/robot_module/robot/lost
name = "lost robot module"
hide_on_manifest = 1
hide_on_manifest = TRUE
sprites = list(
"Drone" = "drone-lost"
)
@@ -41,7 +41,7 @@
/obj/item/weapon/robot_module/robot/gravekeeper
name = "gravekeeper robot module"
hide_on_manifest = 1
hide_on_manifest = TRUE
sprites = list(
"Drone" = "drone-gravekeeper",
"Sleek" = "sleek-gravekeeper"
@@ -18,7 +18,7 @@ var/global/list/robot_modules = list(
icon_state = "std_module"
w_class = ITEMSIZE_NO_CONTAINER
item_state = "std_mod"
var/hide_on_manifest = 0
var/hide_on_manifest = FALSE
var/channels = list()
var/networks = list()
var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1, LANGUAGE_ZADDAT = 0)
@@ -37,6 +37,9 @@ var/global/list/robot_modules = list(
var/list/original_languages = list()
var/list/added_networks = list()
/obj/item/weapon/robot_module/proc/hide_on_manifest()
. = hide_on_manifest
/obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R)
..()
R.module = src
@@ -803,7 +806,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/security/combat
name = "combat robot module"
hide_on_manifest = 1
hide_on_manifest = TRUE
sprites = list(
"Haruka" = "marinaCB",
"Combat Android" = "droid-combat",
@@ -826,7 +829,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/drone
name = "drone module"
hide_on_manifest = 1
hide_on_manifest = TRUE
no_slip = 1
networks = list(NETWORK_ENGINEERING)
@@ -910,7 +913,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/drone/construction
name = "construction drone module"
hide_on_manifest = 1
hide_on_manifest = TRUE
channels = list("Engineering" = 1)
languages = list()
@@ -2,7 +2,7 @@
/obj/item/weapon/robot_module/robot/syndicate
name = "illegal robot module"
hide_on_manifest = 1
hide_on_manifest = TRUE
languages = list(
LANGUAGE_SOL_COMMON = 1,
LANGUAGE_TRADEBAND = 1,
@@ -0,0 +1,163 @@
// Spawner landmarks are used because platforms that are mapped during
// SSatoms init try to Initialize() twice. I have no idea why and I am
// not paid enough to spend more time trying to debug it.
/obj/effect/landmark/robot_platform
name = "recon platform spawner"
icon = 'icons/mob/screen1.dmi'
icon_state = "x3"
delete_me = TRUE
var/platform_type
/obj/effect/landmark/robot_platform/Initialize()
if(platform_type)
new platform_type(get_turf(src))
return ..()
/mob/living/silicon/robot/platform
name = "support platform"
desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence."
icon = 'icons/mob/robots_thinktank.dmi'
icon_state = "tachi"
color = "#68a2f2"
cell = /obj/item/weapon/cell/mech
idcard_type = /obj/item/weapon/card/id/platform
module = /obj/item/weapon/robot_module/robot/platform
lawupdate = FALSE
modtype = "Standard"
speak_statement = "chirps"
mob_bump_flag = HEAVY
mob_swap_flags = ~HEAVY
mob_push_flags = HEAVY
mob_size = MOB_LARGE
var/const/platform_respawn_time = 3 MINUTES
var/tmp/last_recharge_state = FALSE
var/tmp/recharge_complete = FALSE
var/tmp/recharger_charge_amount = 10 KILOWATTS
var/tmp/recharger_tick_cost = 80 KILOWATTS
var/weakref/recharging
var/list/stored_atoms
var/max_stored_atoms = 1
var/static/list/can_store_types = list(
/mob/living,
/obj/item,
/obj/structure,
/obj/machinery
)
// Currently set to prevent tonks hauling a deliaminating SM into the middle of the station.
var/static/list/cannot_store_types = list(
/obj/machinery/power/supermatter
)
/mob/living/silicon/robot/platform/SetName(pickedName)
. = ..()
if(mind)
mind.name = real_name
/mob/living/silicon/robot/platform/Initialize(var/mapload)
. = ..()
if(!mmi)
mmi = new /obj/item/device/mmi/digital/robot(src)
SetName("inactive [initial(name)]")
updateicon()
// Copypasting from root proc to avoid calling ..() and accidentally creating duplicate armour etc.
/mob/living/silicon/robot/platform/initialize_components()
components["actuator"] = new /datum/robot_component/actuator(src)
components["radio"] = new /datum/robot_component/radio(src)
components["power cell"] = new /datum/robot_component/cell(src)
components["diagnosis unit"] = new /datum/robot_component/diagnosis_unit(src)
components["camera"] = new /datum/robot_component/camera(src)
components["comms"] = new /datum/robot_component/binary_communication(src)
components["armour"] = new /datum/robot_component/armour/platform(src)
/mob/living/silicon/robot/platform/Destroy()
for(var/weakref/drop_ref in stored_atoms)
var/atom/movable/drop_atom = drop_ref.resolve()
if(istype(drop_atom) && !QDELETED(drop_atom) && drop_atom.loc == src)
drop_atom.dropInto(loc)
stored_atoms = null
if(recharging)
var/obj/item/recharging_atom = recharging.resolve()
if(istype(recharging_atom) && recharging_atom.loc == src)
recharging_atom.dropInto(loc)
recharging = null
. = ..()
/mob/living/silicon/robot/platform/examine(mob/user, distance)
. = ..()
if(distance <= 3)
if(recharging)
var/obj/item/weapon/cell/recharging_atom = recharging.resolve()
if(istype(recharging_atom) && !QDELETED(recharging_atom))
. += "It has \a [recharging_atom] slotted into its recharging port."
. += "The cell readout shows [round(recharging_atom.percent(),1)]% charge."
else
. += "Its recharging port is empty."
else
. += "Its recharging port is empty."
if(length(stored_atoms))
var/list/atom_names = list()
for(var/weakref/stored_ref in stored_atoms)
var/atom/movable/AM = stored_ref.resolve()
if(istype(AM))
atom_names += "\a [AM]"
if(length(atom_names))
. += "It has [english_list(atom_names)] loaded into its transport bay."
else
. += "Its cargo bay is empty."
/mob/living/silicon/robot/platform/update_braintype()
braintype = BORG_BRAINTYPE_PLATFORM
/mob/living/silicon/robot/platform/init()
. = ..()
if(ispath(module, /obj/item/weapon/robot_module))
module = new module(src)
/mob/living/silicon/robot/platform/module_reset()
return FALSE
/mob/living/silicon/robot/platform/use_power()
. = ..()
if(stat != DEAD && cell)
// TODO generalize solar occlusion to charge from the actual sun.
var/new_recharge_state = istype(loc, /turf/simulated/floor/outdoors) || /*, /turf/exterior) */ istype(loc, /turf/space)
if(new_recharge_state != last_recharge_state)
last_recharge_state = new_recharge_state
if(last_recharge_state)
to_chat(src, SPAN_NOTICE("<b>Your integrated solar panels begin recharging your battery.</b>"))
else
to_chat(src, SPAN_DANGER("Your integrated solar panels cease recharging your battery."))
if(last_recharge_state)
var/charge_amt = recharger_charge_amount * CELLRATE
cell.give(charge_amt)
used_power_this_tick -= (charge_amt)
module.respawn_consumable(src, (charge_amt / 250)) // magic number copied from borg charger.
if(recharging)
var/obj/item/weapon/cell/recharging_atom = recharging.resolve()
if(!istype(recharging_atom) || QDELETED(recharging_atom) || recharging_atom.loc != src)
recharging = null
return
if(recharging_atom.percent() < 100)
var/charge_amount = recharger_tick_cost * CELLRATE
if(cell.check_charge(charge_amount * 1.5) && cell.checked_use(charge_amount)) // Don't kill ourselves recharging the battery.
recharging_atom.give(charge_amount)
used_power_this_tick += charge_amount
if(!recharge_complete && recharging_atom.percent() >= 100)
recharge_complete = TRUE
visible_message(SPAN_NOTICE("\The [src] beeps and flashes a green light above \his recharging port."))
@@ -0,0 +1,109 @@
/mob/living/silicon/robot/platform/update_icon()
updateicon()
/mob/living/silicon/robot/platform/updateicon()
cut_overlays()
underlays.Cut()
var/obj/item/weapon/robot_module/robot/platform/tank_module = module
if(!istype(tank_module))
icon = initial(icon)
icon_state = initial(icon_state)
color = initial(color)
return
// This is necessary due to Polaris' liberal use of KEEP_TOGETHER and propensity for scaling transforms.
// If we just apply state/colour to the base icon, RESET_COLOR on the additional overlays is ignored.
icon = tank_module.user_icon
icon_state = "blank"
color = null
var/image/I = image(tank_module.user_icon, tank_module.user_icon_state)
I.color = tank_module.base_color
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
underlays += I
if(tank_module.armor_color)
I = image(icon, "[tank_module.user_icon_state]_armour")
I.color = tank_module.armor_color
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
add_overlay(I)
for(var/decal in tank_module.decals)
I = image(icon, "[tank_module.user_icon_state]_[decal]")
I.color = tank_module.decals[decal]
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
add_overlay(I)
if(tank_module.eye_color)
I = image(icon, "[tank_module.user_icon_state]_eyes")
I.color = tank_module.eye_color
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
add_overlay(I)
if(client && key && stat == CONSCIOUS && tank_module.pupil_color)
I = image(icon, "[tank_module.user_icon_state]_pupils")
I.color = tank_module.pupil_color
I.plane = PLANE_LIGHTING_ABOVE
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
add_overlay(I)
if(opened)
add_overlay("[tank_module.user_icon_state]-open")
if(wiresexposed)
I = image(icon, "[tank_module.user_icon_state]-wires")
else if(cell)
I = image(icon, "[tank_module.user_icon_state]-cell")
else
I = image(icon, "[tank_module.user_icon_state]-nowires")
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
add_overlay(I)
/mob/living/silicon/robot/platform/proc/try_paint(var/obj/item/device/floor_painter/painting, var/mob/user)
var/obj/item/weapon/robot_module/robot/platform/tank_module = module
if(!istype(tank_module))
to_chat(user, SPAN_WARNING("\The [src] is not paintable."))
return FALSE
var/list/options = list("Eyes", "Armour", "Body", "Clear Colors")
if(length(tank_module.available_decals))
options += "Decal"
if(length(tank_module.decals))
options += "Clear Decals"
for(var/option in options)
LAZYSET(options, option, new /image('icons/effects/thinktank_labels.dmi', option))
var/choice = show_radial_menu(user, painting, options, radius = 42, require_near = TRUE)
if(!choice || QDELETED(src) || QDELETED(painting) || QDELETED(user) || user.incapacitated() || tank_module.loc != src)
return FALSE
if(choice == "Decal")
choice = null
options = list()
for(var/decal_name in tank_module.available_decals)
LAZYSET(options, decal_name, new /image('icons/effects/thinktank_labels.dmi', decal_name))
choice = show_radial_menu(user, painting, options, radius = 42, require_near = TRUE)
if(!choice || QDELETED(src) || QDELETED(painting) || QDELETED(user) || user.incapacitated() || tank_module.loc != src)
return FALSE
. = TRUE
switch(choice)
if("Eyes")
tank_module.eye_color = painting.paint_colour
if("Armour")
tank_module.armor_color = painting.paint_colour
if("Body")
tank_module.base_color = painting.paint_colour
if("Clear Colors")
tank_module.eye_color = initial(tank_module.eye_color)
tank_module.armor_color = initial(tank_module.armor_color)
tank_module.base_color = initial(tank_module.base_color)
if("Clear Decals")
tank_module.decals = null
else
if(choice in tank_module.available_decals)
LAZYSET(tank_module.decals, tank_module.available_decals[choice], painting.paint_colour)
else
. = FALSE
if(.)
updateicon()
@@ -0,0 +1,77 @@
/mob/living/silicon/robot/platform/attack_hand(mob/user)
if(!opened)
if(recharging)
var/obj/item/recharging_atom = recharging.resolve()
if(istype(recharging_atom) && !QDELETED(recharging_atom) && recharging_atom.loc == src)
recharging_atom.dropInto(loc)
user.put_in_hands(recharging_atom)
user.visible_message(SPAN_NOTICE("\The [user] pops \the [recharging_atom] out of \the [src]'s recharging port."))
recharging = null
return TRUE
if(try_remove_cargo(user))
return TRUE
. = ..()
/mob/living/silicon/robot/platform/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/cell) && !opened)
if(recharging)
to_chat(user, SPAN_WARNING("\The [src] already has \a [recharging.resolve()] inserted into its recharging port."))
else if(user.unEquip(W))
W.forceMove(src)
recharging = weakref(W)
recharge_complete = FALSE
user.visible_message(SPAN_NOTICE("\The [user] slots \the [W] into \the [src]'s recharging port."))
return TRUE
if(istype(W, /obj/item/device/floor_painter))
return FALSE // Paint sprayer wil call try_paint() in afterattack()
. = ..()
/mob/living/silicon/robot/platform/attack_ghost(mob/observer/ghost/user)
if(client || key || stat == DEAD || !ticker || !ticker.mode)
return ..()
var/confirm = alert("Do you wish to take control of \the [src]?", "Platform Control", "No", "Yes")
if(confirm != "Yes" || QDELETED(src) || client || key || stat == DEAD || !ticker || !ticker.mode)
return ..()
if(jobban_isbanned(user, "Robot"))
to_chat(user, SPAN_WARNING("You are banned from synthetic roles and cannot take control of \the [src]."))
return
// Boilerplate from drone fabs, unsure if there's a shared proc to use instead.
var/deathtime = world.time - user.timeofdeath
var/deathtimeminutes = round(deathtime / (1 MINUTE))
var/pluralcheck = ""
if(deathtimeminutes == 1)
pluralcheck = "minute"
else if(deathtimeminutes > 0)
pluralcheck = " [deathtimeminutes] minute\s and"
var/deathtimeseconds = round((deathtime - deathtimeminutes * 1 MINUTE) / 10,1)
if (deathtime < platform_respawn_time)
to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.")
to_chat(usr, "You must wait [platform_respawn_time/600] minute\s to take control of \the [src]!")
return
// End boilerplate.
if(user.mind)
user.mind.transfer_to(src)
if(key != user.key)
key = user.key
SetName("[modtype] [braintype]-[rand(100,999)]")
addtimer(CALLBACK(src, .proc/welcome_client), 1)
qdel(user)
/mob/living/silicon/robot/platform/proc/welcome_client()
if(client)
to_chat(src, SPAN_NOTICE("<b>You are a think-tank</b>, a kind of flexible and adaptive drone intelligence installed into an armoured platform. Your programming compels you to be friendly and helpful wherever possible."))
SetSleeping(0)
SetWeakened(0)
SetParalysis(0)
resting = FALSE
@@ -0,0 +1,102 @@
/obj/item/weapon/robot_module/robot/platform
hide_on_manifest = TRUE
var/pupil_color = COLOR_CYAN
var/base_color = COLOR_WHITE
var/eye_color = COLOR_BEIGE
var/armor_color = "#68a2f2"
var/user_icon = 'icons/mob/robots_thinktank.dmi'
var/user_icon_state = "tachi"
var/list/decals
var/list/available_decals = list(
"Stripe" = "stripe",
"Vertical Stripe" = "stripe_vertical"
)
// Only show on manifest if they have a player.
/obj/item/weapon/robot_module/robot/platform/hide_on_manifest()
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
return !R.key
return ..()
/obj/item/weapon/robot_module/robot/platform/verb/set_eye_colour()
set name = "Set Eye Colour"
set desc = "Select an eye colour to use."
set category = "Robot Commands"
set src in usr
var/new_pupil_color = input(usr, "Select a pupil colour.", "Pupil Colour Selection") as color|null
if(usr.incapacitated() || QDELETED(usr) || QDELETED(src) || loc != usr)
return
pupil_color = new_pupil_color || initial(pupil_color)
usr.update_icon()
/obj/item/weapon/robot_module/robot/platform/explorer
armor_color = "#528052"
eye_color = "#7b7b46"
decals = list(
"stripe_vertical" = "#52b8b8",
"stripe" = "#52b8b8"
)
channels = list(
"Science" = 1,
"Explorer" = 1
)
/obj/item/weapon/robot_module/robot/platform/explorer/New()
..()
modules += new /obj/item/weapon/tool/wrench/cyborg(src)
modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
modules += new /obj/item/weapon/tool/wirecutters/cyborg(src)
modules += new /obj/item/weapon/tool/screwdriver/cyborg(src)
modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
modules += new /obj/item/weapon/material/knife/machete/cyborg(src)
var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(7500)
var/obj/item/stack/medical/bruise_pack/bandaid = new(src)
bandaid.uses_charge = 1
bandaid.charge_costs = list(1000)
bandaid.synths = list(medicine)
modules += bandaid
synths += medicine
var/obj/item/weapon/gun/energy/phasegun/mounted/cyborg/phasegun = new(src)
modules += phasegun
emag = new /obj/item/weapon/chainsaw(src)
/obj/item/weapon/robot_module/robot/platform/explorer/respawn_consumable(var/mob/living/silicon/robot/R, rate)
. = ..()
for(var/obj/item/weapon/gun/energy/pew in modules)
if(pew.power_supply && pew.power_supply.charge < pew.power_supply.maxcharge)
pew.power_supply.give(pew.charge_cost * rate)
pew.update_icon()
else
pew.charge_tick = 0
/obj/item/weapon/robot_module/robot/platform/cargo
armor_color = "#d5b222"
eye_color = "#686846"
decals = list(
"stripe_vertical" = "#bfbfa1",
"stripe" = "#bfbfa1"
)
channels = list("Supply" = 1)
networks = list(NETWORK_MINE)
/obj/item/weapon/robot_module/robot/platform/cargo/New()
..()
modules += new /obj/item/weapon/packageWrap(src)
modules += new /obj/item/weapon/pen/multi(src)
modules += new /obj/item/device/destTagger(src)
emag = new /obj/item/weapon/stamp/denied
/obj/item/weapon/robot_module/robot/platform/cargo/respawn_consumable(mob/living/silicon/robot/R, rate)
. = ..()
var/obj/item/weapon/packageWrap/wrapper = locate() in modules
if(wrapper.amount < initial(wrapper.amount))
wrapper.amount++
@@ -0,0 +1,139 @@
/mob/living/silicon/robot/platform/death(gibbed, deathmessage, show_dead_message)
if(gibbed)
if(recharging)
var/obj/item/recharging_atom = recharging.resolve()
if(istype(recharging_atom) && !QDELETED(recharging_atom) && recharging_atom.loc == src)
recharging_atom.dropInto(loc)
recharging_atom.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30)
recharging = null
if(length(stored_atoms))
for(var/weakref/stored_ref in stored_atoms)
var/atom/movable/dropping = stored_ref.resolve()
if(istype(dropping) && !QDELETED(dropping) && dropping.loc == src)
dropping.dropInto(loc)
dropping.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30)
stored_atoms = null
. = ..()
/mob/living/silicon/robot/platform/proc/can_store_atom(var/atom/movable/storing, var/mob/user)
if(!istype(storing))
var/storing_target = (user == src) ? "yourself" : "\the [src]"
to_chat(user, SPAN_WARNING("You cannot store that inside [storing_target]."))
return FALSE
if(!isturf(storing.loc))
return FALSE
if(storing.anchored || !storing.simulated)
to_chat(user, SPAN_WARNING("\The [storing] won't budge!"))
return FALSE
if(storing == src)
var/storing_target = (user == src) ? "yourself" : "\the [src]"
to_chat(user, SPAN_WARNING("You cannot store [storing_target] inside [storing_target]!"))
return FALSE
if(length(stored_atoms) >= max_stored_atoms)
var/storing_target = (user == src) ? "Your" : "\The [src]'s"
to_chat(user, SPAN_WARNING("[storing_target] cargo compartment is full."))
return FALSE
if(ismob(storing))
var/mob/M = storing
if(M.mob_size >= mob_size)
var/storing_target = (user == src) ? "your storage compartment" : "\the [src]"
to_chat(user, SPAN_WARNING("\The [storing] is too big for [storing_target]."))
return FALSE
for(var/store_type in can_store_types)
if(istype(storing, store_type))
. = TRUE
break
if(.)
for(var/store_type in cannot_store_types)
if(istype(storing, store_type))
. = FALSE
break
if(!.)
var/storing_target = (user == src) ? "yourself" : "\the [src]"
to_chat(user, SPAN_WARNING("You cannot store \the [storing] inside [storing_target]."))
/mob/living/silicon/robot/platform/proc/store_atom(var/atom/movable/storing, var/mob/user)
if(istype(storing))
storing.forceMove(src)
LAZYDISTINCTADD(stored_atoms, weakref(storing))
/mob/living/silicon/robot/platform/proc/drop_stored_atom(var/atom/movable/ejecting, var/mob/user)
if(!ejecting && length(stored_atoms))
var/weakref/stored_ref = stored_atoms[1]
if(!istype(stored_ref))
LAZYREMOVE(stored_atoms, stored_ref)
else
ejecting = stored_ref?.resolve()
LAZYREMOVE(stored_atoms, weakref(ejecting))
if(istype(ejecting) && !QDELETED(ejecting) && ejecting.loc == src)
ejecting.dropInto(loc)
if(user == src)
visible_message(SPAN_NOTICE("\The [src] ejects \the [ejecting] from its cargo compartment."))
else
user.visible_message(SPAN_NOTICE("\The [user] pulls \the [ejecting] from \the [src]'s cargo compartment."))
/mob/living/silicon/robot/platform/attack_ai(mob/user)
if(isrobot(user) && user.Adjacent(src))
return try_remove_cargo(user)
return ..()
/mob/living/silicon/robot/platform/proc/try_remove_cargo(var/mob/user)
if(!length(stored_atoms) || !istype(user))
return FALSE
var/weakref/remove_ref = stored_atoms[length(stored_atoms)]
var/atom/movable/removing = remove_ref?.resolve()
if(!istype(removing) || QDELETED(removing) || removing.loc != src)
LAZYREMOVE(stored_atoms, remove_ref)
else
user.visible_message(SPAN_NOTICE("\The [user] begins unloading \the [removing] from \the [src]'s cargo compartment."))
if(do_after(user, 3 SECONDS, src) && !QDELETED(removing) && removing.loc == src)
drop_stored_atom(removing, user)
return TRUE
/mob/living/silicon/robot/platform/verb/drop_stored_atom_verb()
set name = "Eject Cargo"
set category = "Robot Commands"
set desc = "Drop something from your internal storage."
if(incapacitated())
to_chat(src, SPAN_WARNING("You are not in any state to do that."))
return
if(length(stored_atoms))
drop_stored_atom(user = src)
else
to_chat(src, SPAN_WARNING("You have nothing in your cargo compartment."))
/mob/living/silicon/robot/platform/MouseDrop_T(atom/movable/dropping, mob/living/user)
if(!istype(user) || !istype(dropping) || user.incapacitated())
return FALSE
if(!can_mouse_drop(dropping, user) || !can_store_atom(dropping, user))
return FALSE
if(user == src)
visible_message(SPAN_NOTICE("\The [src] begins loading \the [dropping] into its cargo compartment."))
else
user.visible_message(SPAN_NOTICE("\The [user] begins loading \the [dropping] into \the [src]'s cargo compartment."))
if(do_after(user, 3 SECONDS, src) && can_mouse_drop(dropping, user) && can_store_atom(dropping, user))
store_atom(dropping, user)
return FALSE
/mob/living/silicon/robot/platform/proc/can_mouse_drop(var/atom/dropping, var/mob/user)
if(!istype(user) || !istype(dropping) || QDELETED(dropping) || QDELETED(user) || QDELETED(src))
return FALSE
if(user.incapacitated() || !Adjacent(user) || !dropping.Adjacent(user))
return FALSE
return TRUE
@@ -0,0 +1,32 @@
/mob/living/silicon/robot/platform/explorer
name = "recon platform"
desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one is lightly armoured and fitted with all-terrain wheels."
modtype = "Recon"
module = /obj/item/weapon/robot_module/robot/platform/explorer
/mob/living/silicon/robot/platform/explorer/Initialize()
. = ..()
laws = new /datum/ai_laws/explorer
/mob/living/silicon/robot/platform/explorer/welcome_client()
..()
if(client) // ganbatte tachikoma-san
to_chat(src, SPAN_NOTICE("You are tasked with supporting the Exploration and Science staff as they unearth the secrets of the planet. Do your best!"))
/obj/effect/landmark/robot_platform/explorer
platform_type = /mob/living/silicon/robot/platform/explorer
/mob/living/silicon/robot/platform/cargo
name = "logistics platform"
desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one has an expanded storage compartment."
modtype = "Logistics"
module = /obj/item/weapon/robot_module/robot/platform/cargo
max_stored_atoms = 3
/mob/living/silicon/robot/platform/cargo/welcome_client()
..()
if(client)
to_chat(src, SPAN_NOTICE("You are tasked with supporting the Cargo and Supply staff as they handle operational logistics. Do your best!"))
/obj/effect/landmark/robot_platform/cargo
platform_type = /mob/living/silicon/robot/platform/cargo
@@ -7,6 +7,7 @@
item_state = "mouse_gray"
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
kitchen_tag = "rodent"
maxHealth = 5
health = 5
@@ -0,0 +1,200 @@
// Possum catalog entry.
/datum/category_item/catalogue/fauna/opossum
name = "Opossums"
desc = "The opossum is a small, scavenging marsupial of the order Didelphimorphia, previously \
endemic to the Americas of Earth, but now inexplicably found across settled space. Nobody is \
entirely sure how they travel to such disparate locations, with the leading theories including \
smuggling, cargo stowaways, fungal spore reproduction, teleportation, or unknown quantum effects."
value = CATALOGUER_REWARD_TRIVIAL
unlocked_by_any = list(/datum/category_item/catalogue/fauna/opossum)
// Possum spawner, WAS GOING TO BE used for loot piles BUT CERB IS A DORK.
/obj/item/animal_spawner
var/critter_type = /mob/living/simple_mob/animal/passive/mouse
/obj/item/animal_spawner/Initialize()
..()
var/mob/living/simple_mob/critter = critter_type
if(!ispath(critter, /mob/living/simple_mob))
return INITIALIZE_HINT_QDEL
var/obj/item/weapon/holder/critter_holder = initial(critter.holder_type)
if(!ispath(critter_holder, /obj/item/weapon/holder))
return INITIALIZE_HINT_QDEL
var/mob/M = loc
var/was_in_hands = istype(M) && (src == M.get_active_hand() || src == M.get_inactive_hand())
critter_holder = new(loc)
critter = new critter(critter_holder)
critter_holder.held_mob = critter
critter_holder.sync(critter)
if(istype(M))
M.drop_from_inventory(src)
if(was_in_hands)
M.put_in_hands(critter_holder)
return INITIALIZE_HINT_QDEL
/obj/item/animal_spawner/possum
name = "possum"
desc = "The abstract concept of possum, embodied in physical form. If you witness the majesty of abstract possum, please make a bug report on the tracker."
icon = 'icons/mob/animal.dmi'
icon_state = "possum"
critter_type = /mob/living/simple_mob/animal/passive/opossum
// Possum AI holder, mostly just handles playing dead.
/datum/ai_holder/simple_mob/passive/possum
var/is_angry = FALSE
var/play_dead_until = 0
var/be_angery_until = 0
/datum/ai_holder/simple_mob/passive/possum/handle_special_strategical()
. = ..()
if(holder?.stat != DEAD && !holder.ckey && isturf(holder.loc))
if(holder.resting && world.time < play_dead_until)
return
var/last_resting = holder.resting
var/last_angery = is_angry
holder.resting = (holder.stat == UNCONSCIOUS)
if(!holder.resting)
wander = initial(wander)
speak_chance = initial(speak_chance)
holder.set_stat(CONSCIOUS)
is_angry = (world.time < be_angery_until) || prob(1)
else
wander = FALSE
speak_chance = 0
holder.set_stat(UNCONSCIOUS)
is_angry = FALSE
if(last_resting != holder.resting || last_angery != is_angry)
holder.update_icon()
/datum/ai_holder/simple_mob/passive/possum/poppy
var/static/list/aaa_words = list(
"delaminat",
"meteor",
"fire",
"breach",
"loose",
"level 7",
"level seven",
"biohazard",
"blob",
"vine"
)
/datum/ai_holder/simple_mob/passive/possum/poppy/on_hear_say(mob/living/speaker, message)
. = ..()
addtimer(CALLBACK(src, .proc/check_keywords, message), rand(1 SECOND, 3 SECONDS))
/datum/ai_holder/simple_mob/passive/possum/poppy/proc/check_keywords(var/message)
var/mob/living/simple_mob/animal/passive/opossum/poss = holder
if(!istype(poss) || holder.client || holder.stat != CONSCIOUS)
return
message = lowertext(message)
for(var/aaa in aaa_words)
if(findtext(message, aaa))
poss.respond_to_damage()
return
/datum/say_list/possum
speak = list("Hiss!","Aaa!","Aaa?")
emote_hear = list("hisses")
emote_see = list("forages for trash", "lounges")
// The poss itself.
/mob/living/simple_mob/animal/passive/opossum
name = "opossum"
real_name = "opossum"
tt_desc = "Didelphis astrum"
desc = "It's an opossum, a small scavenging marsupial."
icon_state = "possum"
item_state = "possum"
icon_living = "possum"
icon_dead = "possum_dead"
icon_rest = "possum_dead"
speak_emote = list("hisses")
pass_flags = PASSTABLE
ai_holder_type = /datum/ai_holder/simple_mob/passive/possum
see_in_dark = 6
maxHealth = 50
health = 50
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stamps on"
density = 0
minbodytemp = 223
maxbodytemp = 323
universal_speak = FALSE
universal_understand = TRUE
holder_type = /obj/item/weapon/holder/possum
mob_size = MOB_SMALL
can_pull_size = 2
can_pull_mobs = MOB_PULL_SMALLER
say_list_type = /datum/say_list/possum
catalogue_data = list(/datum/category_item/catalogue/fauna/opossum)
/mob/living/simple_mob/animal/passive/opossum/adjustBruteLoss(damage)
. = ..()
if(damage >= 3)
respond_to_damage()
/mob/living/simple_mob/animal/passive/opossum/adjustFireLoss(damage)
. = ..()
if(damage >= 3)
respond_to_damage()
/mob/living/simple_mob/animal/passive/opossum/lay_down()
. = ..()
update_icon()
/mob/living/simple_mob/animal/passive/opossum/proc/respond_to_damage()
if(!resting && stat == CONSCIOUS)
var/datum/ai_holder/simple_mob/passive/possum/poss_ai = ai_holder
if(!client && istype(poss_ai))
if(!poss_ai.is_angry)
visible_message("<b>\The [src]</b> hisses!")
poss_ai.is_angry = TRUE
poss_ai.be_angery_until = world.time + rand(30 SECONDS, 1 MINUTE)
else
visible_message("<b>\The [src]</b> dies!")
resting = TRUE
poss_ai.play_dead_until = world.time + rand(1 MINUTE, 2 MINUTES)
update_icon()
/mob/living/simple_mob/animal/passive/opossum/updateicon()
update_icon()
/mob/living/simple_mob/animal/passive/opossum/update_icon()
var/datum/ai_holder/simple_mob/passive/possum/poss_ai = ai_holder
var/is_angry = (!client && istype(poss_ai) && poss_ai.is_angry)
if(stat == DEAD || (resting && is_angry))
icon_state = icon_dead
else if(resting || stat == UNCONSCIOUS)
icon_state = "[icon_living]_sleep"
else if(is_angry)
icon_state = "[icon_living]_aaa"
else
icon_state = icon_living
/mob/living/simple_mob/animal/passive/opossum/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
/mob/living/simple_mob/animal/passive/opossum/poppy
name = "Poppy the Safety Possum"
desc = "It's an opossum, a small scavenging marsupial. It's wearing appropriate personal protective equipment, though."
icon_state = "poppy"
item_state = "poppy"
icon_living = "poppy"
icon_dead = "poppy_dead"
icon_rest = "poppy_dead"
tt_desc = "Didelphis astrum salutem"
holder_type = /obj/item/weapon/holder/possum/poppy
ai_holder_type = /datum/ai_holder/simple_mob/passive/possum/poppy
@@ -102,6 +102,7 @@
icon_state = "cat"
item_state = "cat"
named = TRUE
holder_type = /obj/item/weapon/holder/cat/runtime
makes_dirt = 0 //Vorestation Edit
/mob/living/simple_mob/animal/passive/cat/kitten
File diff suppressed because it is too large Load Diff
+12 -11
View File
@@ -45,12 +45,11 @@
/obj/item/weapon/disk/limb/eggnerdltdred
company = "Eggnerd Prototyping Ltd. (Red)"
// icon = 'icons/obj/items_vr.dmi'
// icon_state = "verkdisk"
icon = 'icons/obj/items_vr.dmi' //VOREStation add. Use the right sprites
icon_state = "verkdisk" //VOREStation add. Use the right sprites
//Darkside Incorperated synthetic augmentation list! Many current most used fuzzy and notsofuzzy races made into synths here.
/datum/robolimb/dsi_tajaran
company = "DSI - Tajaran"
desc = "This limb feels soft and fluffy, realistic design and squish. By Darkside Incorperated."
@@ -62,9 +61,10 @@
skin_tone = 1
suggested_species = "Tajara"
/datum/robolimb/dsi_tajaran/New()
/*/datum/robolimb/dsi_tajaran/New()
species_cannot_use = GLOB.all_species.Copy()
// species_cannot_use -= SPECIES_TAJ
species_cannot_use -= SPECIES_TAJ
VS Edit - anyone can select these. */
/obj/item/weapon/disk/limb/dsi_tajaran
company = "DSI - Tajaran"
@@ -80,13 +80,14 @@
skin_tone = 1
suggested_species = "Unathi"
/datum/robolimb/dsi_lizard/New()
/* /datum/robolimb/dsi_lizard/New() //
species_cannot_use = GLOB.all_species.Copy()
// species_cannot_use -= SPECIES_UNATHI
species_cannot_use -= SPECIES_UNATHI
VS Edit - anyone can select these. */
/obj/item/weapon/disk/limb/dsi_lizard
company = "DSI - Lizard"
/*
/datum/robolimb/dsi_sergal
company = "DSI - Sergal"
desc = "This limb feels soft and fluffy, realistic design and toned muscle. By Darkside Incorperated."
@@ -156,7 +157,7 @@
/obj/item/weapon/disk/limb/dsi_spider
company = "DSI - Vasilissan"
*/
/datum/robolimb/dsi_teshari
company = "DSI - Teshari"
desc = "This limb has a thin synthflesh casing with a few connection ports."
@@ -167,8 +168,8 @@
/datum/robolimb/dsi_teshari/New()
species_cannot_use = GLOB.all_species.Copy()
// species_cannot_use -= SPECIES_TESHARI
// species_cannot_use -= SPECIES_CUSTOM
species_cannot_use -= SPECIES_TESHARI //VOREStation add - let 'em be selected.
species_cannot_use -= SPECIES_CUSTOM //VOREStation add - let 'em be selected.
..()
/obj/item/weapon/disk/limb/dsi_teshari
-162
View File
@@ -46,20 +46,6 @@ var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\
/obj/item/weapon/disk/limb/white_kryten
company = "White Kryten Cybernetics"
// verkister : Rahwoof Boop
/datum/robolimb/eggnerdltd
company = "Eggnerd Prototyping Ltd."
desc = "This limb has a slight salvaged handicraft vibe to it. The CE-marking on it is definitely not the standardized one, it looks more like a hand-written sharpie monogram."
icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi'
blood_color = "#5e280d"
includes_tail = 1
unavailable_to_build = 1
/obj/item/weapon/disk/limb/eggnerdltd
company = "Eggnerd Prototyping Ltd."
icon = 'icons/obj/items_vr.dmi'
icon_state = "verkdisk"
// tucker0666 : Frost
/datum/robolimb/zenghu_frost
company = "Zeng-Hu (Custom)"
@@ -71,158 +57,10 @@ var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\
unavailable_to_build = 1
whitelisted_to = list("tucker0666")
/obj/item/weapon/disk/limb/zenghu_frost
company = "Zeng-Hu (Modified)"
catalogue_data = list(/datum/category_item/catalogue/information/organization/zeng_hu)
//////////////// General VS-only ones /////////////////
/datum/robolimb/talon //They're buildable by default due to being extremely basic.
company = "Talon LLC"
desc = "This metallic limb is sleek and featuresless apart from some exposed motors"
icon = 'icons/mob/human_races/cyberlimbs/talon/talon_main.dmi' //Sprited by: Viveret
/obj/item/weapon/disk/limb/talon
company = "Talon LLC"
/datum/robolimb/zenghu_taj //This wasn't indented. At all. It's a miracle this didn't break literally everything.
company = "Zeng-Hu - Tajaran"
desc = "This limb has a rubbery fleshtone covering with visible seams."
icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_taj.dmi'
unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/eggnerdltdred
company = "Eggnerd Prototyping Ltd. (Red)"
desc = "A slightly more refined limb variant from Eggnerd Prototyping. Its got red plating instead of orange."
icon = 'icons/mob/human_races/cyberlimbs/rahboopred/rahboopred.dmi'
blood_color = "#5e280d"
includes_tail = 1
unavailable_to_build = 1
/obj/item/weapon/disk/limb/eggnerdltdred
company = "Eggnerd Prototyping Ltd. (Red)"
icon = 'icons/obj/items_vr.dmi'
icon_state = "verkdisk"
//Darkside Incorperated synthetic augmentation list! Many current most used fuzzy and notsofuzzy races made into synths here.
/datum/robolimb/dsi_tajaran
company = "DSI - Tajaran"
desc = "This limb feels soft and fluffy, realistic design and squish. By Darkside Incorperated."
icon = 'icons/mob/human_races/cyberlimbs/DSITajaran/dsi_tajaran.dmi'
blood_color = "#ffe2ff"
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Tajara"
/obj/item/weapon/disk/limb/dsi_tajaran
company = "DSI - Tajaran"
/datum/robolimb/dsi_lizard
company = "DSI - Lizard"
desc = "This limb feels smooth and scalie, realistic design and squish. By Darkside Incorperated."
icon = 'icons/mob/human_races/cyberlimbs/DSILizard/dsi_lizard.dmi'
blood_color = "#ffe2ff"
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Unathi"
/obj/item/weapon/disk/limb/dsi_lizard
company = "DSI - Lizard"
/datum/robolimb/dsi_sergal
company = "DSI - Sergal"
desc = "This limb feels soft and fluffy, realistic design and toned muscle. By Darkside Incorperated."
icon = 'icons/mob/human_races/cyberlimbs/DSISergal/dsi_sergal.dmi'
blood_color = "#ffe2ff"
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Sergal"
/obj/item/weapon/disk/limb/dsi_sergal
company = "DSI - Sergal"
/datum/robolimb/dsi_nevrean
company = "DSI - Nevrean"
desc = "This limb feels soft and feathery, lightweight, realistic design and squish. By Darkside Incorperated."
icon = 'icons/mob/human_races/cyberlimbs/DSINevrean/dsi_nevrean.dmi'
blood_color = "#ffe2ff"
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Nevrean"
/obj/item/weapon/disk/limb/dsi_nevrean
company = "DSI - Nevrean"
/datum/robolimb/dsi_vulpkanin
company = "DSI - Vulpkanin"
desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated."
icon = 'icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi'
blood_color = "#ffe2ff"
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Vulpkanin"
/obj/item/weapon/disk/limb/dsi_vulpkanin
company = "DSI - Vulpkanin"
/datum/robolimb/dsi_akula
company = "DSI - Akula"
desc = "This limb feels soft and fleshy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated."
icon = 'icons/mob/human_races/cyberlimbs/DSIAkula/dsi_akula.dmi'
blood_color = "#ffe2ff"
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Akula"
/obj/item/weapon/disk/limb/dsi_akula
company = "DSI - Akula"
/datum/robolimb/dsi_spider
company = "DSI - Vasilissan"
desc = "This limb feels hard and chitinous, realistic design. Seems a little mischievous. By Darkside Incorperated."
icon = 'icons/mob/human_races/cyberlimbs/DSISpider/dsi_spider.dmi'
blood_color = "#ffe2ff"
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Vasilissan"
/obj/item/weapon/disk/limb/dsi_spider
company = "DSI - Vasilissan"
/datum/robolimb/dsi_teshari
company = "DSI - Teshari"
desc = "This limb has a thin synthflesh casing with a few connection ports."
icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi'
lifelike = 1
skin_tone = 1
suggested_species = "Teshari"
/datum/robolimb/dsi_teshari/New()
species_cannot_use = GLOB.all_species.Copy()
species_cannot_use -= SPECIES_TESHARI
species_cannot_use -= SPECIES_CUSTOM
..()
/obj/item/weapon/disk/limb/dsi_teshari
company = "DSI - Teshari"
//Ported from CitRP
/datum/robolimb/cyber_beast
company = "Cyber Tech"
+2 -2
View File
@@ -334,7 +334,7 @@
if(!iscarbon(owner) || !owner.species)
return
var/icon/eyecon //VOREStation Edit -- holds eye icon to render over markings later.
var/icon/eyecon
//Eye color/icon
var/should_have_eyes = owner.should_have_organ(O_EYES)
@@ -373,7 +373,7 @@
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode)
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
+27 -14
View File
@@ -21,50 +21,63 @@
return // don't set a label
if(!labels_left)
to_chat(user, "<span class='notice'>No labels left.</span>")
to_chat(user, SPAN_WARNING("\The [src] has no labels left."))
return
if(!label || !length(label))
to_chat(user, "<span class='notice'>No text set.</span>")
to_chat(user, SPAN_WARNING("\The [src] has no label text set."))
return
if(length(A.name) + length(label) > 64)
to_chat(user, "<span class='notice'>Label too big.</span>")
to_chat(user, SPAN_WARNING("\The [src]'s label too big."))
return
if(istype(A, /mob/living/silicon/robot/platform))
var/mob/living/silicon/robot/platform/P = A
if(!P.allowed(user))
to_chat(usr, SPAN_WARNING("Access denied."))
else if(P.client || P.key)
to_chat(user, SPAN_NOTICE("You rename \the [P] to [label]."))
to_chat(P, SPAN_NOTICE("\The [user] renames you to [label]."))
P.custom_name = label
P.SetName(P.custom_name)
else
to_chat(user, SPAN_WARNING("\The [src] is inactive and cannot be renamed."))
return
if(ishuman(A))
to_chat(user, "<span class='notice'>The label refuses to stick to [A.name].</span>")
to_chat(user, SPAN_WARNING("The label refuses to stick to [A.name]."))
return
if(issilicon(A))
to_chat(user, "<span class='notice'>The label refuses to stick to [A.name].</span>")
to_chat(user, SPAN_WARNING("The label refuses to stick to [A.name]."))
return
if(isobserver(A))
to_chat(user, "<span class='notice'>[src] passes through [A.name].</span>")
to_chat(user, SPAN_WARNING("[src] passes through [A.name]."))
return
if(istype(A, /obj/item/weapon/reagent_containers/glass))
to_chat(user, "<span class='notice'>The label can't stick to the [A.name]. (Try using a pen)</span>")
to_chat(user, SPAN_WARNING("The label can't stick to the [A.name] (Try using a pen)."))
return
if(istype(A, /obj/machinery/portable_atmospherics/hydroponics))
var/obj/machinery/portable_atmospherics/hydroponics/tray = A
if(!tray.mechanical)
to_chat(user, "<span class='notice'>How are you going to label that?</span>")
to_chat(user, SPAN_WARNING("How are you going to label that?"))
return
tray.labelled = label
spawn(1)
tray.update_icon()
user.visible_message("<span class='notice'>[user] labels [A] as [label].</span>", \
"<span class='notice'>You label [A] as [label].</span>")
user.visible_message( \
SPAN_NOTICE("\The [user] labels [A] as [label]."), \
SPAN_NOTICE("You label [A] as [label]."))
A.name = "[A.name] ([label])"
/obj/item/weapon/hand_labeler/attack_self(mob/user as mob)
mode = !mode
icon_state = "labeler[mode]"
if(mode)
to_chat(user, "<span class='notice'>You turn on \the [src].</span>")
to_chat(user, SPAN_NOTICE("You turn on \the [src]."))
//Now let them chose the text.
var/str = sanitizeSafe(input(user,"Label text?","Set label",""), MAX_NAME_LEN)
if(!str || !length(str))
to_chat(user, "<span class='notice'>Invalid text.</span>")
to_chat(user, SPAN_WARNING("Invalid text."))
return
label = str
to_chat(user, "<span class='notice'>You set the text to '[str]'.</span>")
to_chat(user, SPAN_NOTICE("You set the text to '[str]'."))
else
to_chat(user, "<span class='notice'>You turn off \the [src].</span>")
to_chat(user, SPAN_NOTICE("You turn off \the [src]."))
+5
View File
@@ -62,6 +62,11 @@
charge = 0
update_icon()
/obj/item/weapon/cell/mech
name = "mecha power cell"
charge = 15000
maxcharge = 15000
/obj/item/weapon/cell/infinite
name = "infinite-capacity power cell!"
icon_state = "icell"
@@ -12,6 +12,15 @@
projectile_type = /obj/item/projectile/energy/phase
one_handed_penalty = 15
/obj/item/weapon/gun/energy/phasegun/mounted
self_recharge = 1
use_external_power = 1
one_handed_penalty = 0
/obj/item/weapon/gun/energy/phasegun/mounted/cyborg
charge_cost = 400
recharge_time = 7
/obj/item/weapon/gun/energy/phasegun/pistol
name = "phase pistol"
desc = "The RayZar EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife."
@@ -4099,6 +4099,17 @@
allergen_type = FRUIT //Made from lemons(fruit)
/datum/reagent/ethanol/jager
name = "Schuss Konig"
id = "jager"
description = "A complex alcohol that leaves you feeling all warm inside."
taste_description = "complex, rich alcohol"
color = "#7f6906"
strength = 25
glass_name = "schusskonig"
glass_desc = "A glass of schusskonig digestif. Good for shooting or mixing."
/datum/reagent/ethanol/fusionnaire
name = "Fusionnaire"
id = "fusionnaire"
+6 -1
View File
@@ -357,10 +357,15 @@
build_path = /obj/item/robot_parts/robot_component/camera
/datum/design/item/prosfab/cyborg/component/armour
name = "Armour Plating"
name = "Armour Plating (Robot)"
id = "armour"
build_path = /obj/item/robot_parts/robot_component/armour
/datum/design/item/prosfab/cyborg/component/armour_heavy
name = "Armour Plating (Platform)"
id = "platform_armour"
build_path = /obj/item/robot_parts/robot_component/armour_platform
/datum/design/item/prosfab/cyborg/component/ai_shell
name = "AI Remote Interface"
id = "mmi_ai_shell"
+1 -1
View File
@@ -61,7 +61,7 @@ GLOBAL_DATUM_INIT(tgui_default_state, /datum/tgui_state/default, new)
return STATUS_CLOSE
/mob/living/simple_animal/default_can_use_tgui_topic(src_object)
/mob/living/simple_mob/default_can_use_tgui_topic(src_object)
. = shared_tgui_interaction(src_object)
if(. > STATUS_CLOSE)
. = min(., shared_living_tgui_distance(src_object)) //simple animals can only use things they're near.
+1 -1
View File
@@ -23,7 +23,7 @@
var/noisy = FALSE // Toggle audible hunger.
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon.
var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon.
var/permit_healbelly = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = TRUE // Mobs are pred by default.
+2
View File
@@ -40,6 +40,7 @@ magpiemayhem - Vox
marco_barko - Protean
mewchild - Diona
mewchild - Vox
milu - Xenochimera
mrsebbi - Xenochimera
natje - Xenochimera
nerdass - Protean
@@ -61,6 +62,7 @@ rixunie - Diona
rubyflamewing - Protean
rykkastormheart - Xenochimera
ryumi - Protean
ryumi - Xenochimera
scoutisafolflol - Xenochimera
seiga - Vox
sepulchre - Vox
Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 KiB

After

Width:  |  Height:  |  Size: 730 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

+3 -1
View File
@@ -292,7 +292,8 @@ Once in open space, consider disabling nonessential power-consuming electronics
/obj/item/clothing/suit/space/void/refurb/marine/talon,
/obj/item/weapon/tank/oxygen,
/obj/item/device/suit_cooling_unit,
/obj/item/device/gps/security/talonguard
/obj/item/device/gps/security/talonguard,
/obj/item/weapon/melee/baton
)
/obj/structure/closet/secure_closet/talon_doctor
@@ -439,6 +440,7 @@ Once in open space, consider disabling nonessential power-consuming electronics
/obj/item/modular_computer/laptop/preset/custom_loadout/standard/talon/pilot/install_default_programs()
..()
hard_drive.store_file(new/datum/computer_file/program/ship_nav())
/obj/item/modular_computer/laptop/preset/custom_loadout/standard/talon/engineer
name = "engineer's laptop"
+2
View File
@@ -1511,6 +1511,7 @@
"db" = (
/obj/machinery/vending/engivend{
products = list(/obj/item/device/geiger = 4, /obj/item/clothing/glasses/meson = 2, /obj/item/device/multitool = 4, /obj/item/weapon/cell/high = 10, /obj/item/weapon/airlock_electronics = 10, /obj/item/weapon/module/power_control = 10, /obj/item/weapon/circuitboard/airalarm = 10, /obj/item/weapon/circuitboard/firealarm = 10, /obj/item/weapon/circuitboard/status_display = 2, /obj/item/weapon/circuitboard/ai_status_display = 2, /obj/item/weapon/circuitboard/newscaster = 2, /obj/item/weapon/circuitboard/holopad = 2, /obj/item/weapon/circuitboard/intercom = 4, /obj/item/weapon/circuitboard/security/telescreen/entertainment = 4, /obj/item/weapon/stock_parts/motor = 2, /obj/item/weapon/stock_parts/spring = 2, /obj/item/weapon/stock_parts/gear = 2, /obj/item/weapon/circuitboard/atm, /obj/item/weapon/circuitboard/guestpass, /obj/item/weapon/circuitboard/keycard_auth, /obj/item/weapon/circuitboard/photocopier, /obj/item/weapon/circuitboard/fax, /obj/item/weapon/circuitboard/request, /obj/item/weapon/circuitboard/microwave, /obj/item/weapon/circuitboard/washing, /obj/item/weapon/circuitboard/scanner_console, /obj/item/weapon/circuitboard/sleeper_console, /obj/item/weapon/circuitboard/body_scanner, /obj/item/weapon/circuitboard/sleeper, /obj/item/weapon/circuitboard/dna_analyzer, /obj/item/weapon/circuitboard/partslathe);
req_access = list(301);
req_log_access = 301
},
/turf/simulated/floor/tiled/eris/dark/brown_platform,
@@ -2472,6 +2473,7 @@
"mS" = (
/obj/structure/table/standard,
/obj/fiftyspawner/steel,
/obj/fiftyspawner/copper,
/turf/simulated/floor/tiled/eris/steel/gray_perforated,
/area/talon/deckone/workroom)
"mT" = (
@@ -12,6 +12,9 @@
)
starting_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot1)
/obj/item/clothing/under/rank/pilot1/no_webbing
starting_accessories = null
/obj/item/clothing/under/rank/pilot2
name = "\improper NanoTrasen flight suit"
desc = "A dark blue NanoTrasen flight suit. Warm and practical, seveal patches are scattered across it."
@@ -24,4 +27,7 @@
sprite_sheets = list(
"Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_uniform.dmi'
)
starting_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot2)
starting_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot2)
/obj/item/clothing/under/rank/pilot2/no_webbing
starting_accessories = null
+2 -1
View File
@@ -39,11 +39,12 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go
/decl/hierarchy/outfit/job/pilot
name = OUTFIT_JOB_NAME("Pilot")
shoes = /obj/item/clothing/shoes/black
uniform = /obj/item/clothing/under/rank/pilot1
uniform = /obj/item/clothing/under/rank/pilot1/no_webbing
suit = /obj/item/clothing/suit/storage/toggle/bomber/pilot
gloves = /obj/item/clothing/gloves/fingerless
glasses = /obj/item/clothing/glasses/fakesunglasses/aviator
l_ear = /obj/item/device/radio/headset/pilot/alt
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 //VOREStation Edit - Civilian
+7 -6
View File
@@ -45963,6 +45963,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
},
/mob/living/simple_mob/animal/passive/opossum/poppy,
/turf/simulated/floor/tiled,
/area/engineering/foyer)
"bGL" = (
@@ -72952,12 +72953,9 @@
/obj/machinery/light/small{
dir = 1
},
/obj/effect/floor_decal/borderfloor{
dir = 1
},
/obj/effect/floor_decal/corner/brown/border{
dir = 1
},
/obj/machinery/mech_recharger,
/obj/effect/floor_decal/industrial/hatch/yellow,
/obj/effect/landmark/robot_platform/cargo,
/turf/simulated/floor/tiled/steel,
/area/quartermaster/warehouse)
"cHa" = (
@@ -72973,6 +72971,9 @@
/obj/effect/floor_decal/corner/brown/border{
dir = 1
},
/obj/structure/table/steel,
/obj/item/device/floor_painter,
/obj/item/weapon/weldingtool,
/turf/simulated/floor/tiled,
/area/quartermaster/warehouse)
"cHb" = (
+31 -9
View File
@@ -4043,6 +4043,8 @@
/area/surface/outpost/main/garage)
"iI" = (
/obj/structure/table/steel,
/obj/item/weapon/weldingtool,
/obj/item/device/floor_painter,
/turf/simulated/floor/tiled/steel_grid,
/area/surface/outpost/main/garage)
"iJ" = (
@@ -14234,6 +14236,26 @@
},
/turf/simulated/floor/tiled/freezer,
/area/surface/outpost/main/pool)
"GP" = (
/obj/effect/floor_decal/industrial/hatch/yellow,
/obj/machinery/light{
dir = 4
},
/obj/machinery/mech_recharger,
/obj/effect/landmark/robot_platform/explorer,
/turf/simulated/floor/plating,
/area/surface/outpost/main/garage)
"Iw" = (
/obj/effect/floor_decal/industrial/hatch/yellow,
/obj/machinery/mech_recharger,
/turf/simulated/floor/plating,
/area/surface/outpost/main/garage)
"Lz" = (
/obj/effect/floor_decal/industrial/hatch/yellow,
/obj/machinery/mech_recharger,
/obj/effect/landmark/robot_platform/explorer,
/turf/simulated/floor/plating,
/area/surface/outpost/main/garage)
(1,1,1) = {"
aa
@@ -54622,11 +54644,11 @@ hq
hG
ii
iG
iH
iH
iH
iH
iH
iG
iG
iG
iG
iG
kJ
hF
lq
@@ -54880,10 +54902,10 @@ hF
ij
iI
Ej
iH
iH
iH
iH
Lz
GP
Iw
iG
kK
hF
lr
+1
View File
@@ -7,6 +7,7 @@
#include "southern_cross_jobs.dm"
#include "southern_cross_elevator.dm"
#include "southern_cross_events.dm"
#include "southern_cross_overrides.dm"
#include "southern_cross_presets.dm"
#include "southern_cross_shuttles.dm"
@@ -0,0 +1,9 @@
/mob/living/silicon/robot/platform/explorer
req_access = list(access_explorer)
/mob/living/silicon/robot/platform/cargo
req_access = list(access_cargo_bot)
/obj/item/weapon/card/id/platform/Initialize()
. = ..()
access |= access_explorer
+209 -85
View File
@@ -8291,7 +8291,7 @@
icon_state = "4-8"
},
/obj/machinery/door/firedoor/glass,
/turf/simulated/floor/tiled/white,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/north)
"amS" = (
/obj/structure/cable{
@@ -8304,7 +8304,7 @@
dir = 4
},
/obj/machinery/door/firedoor/glass,
/turf/simulated/floor/tiled/white,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/north)
"amT" = (
/obj/structure/cable{
@@ -8325,7 +8325,7 @@
name = "Maintenance Access"
},
/obj/machinery/door/firedoor/glass,
/turf/simulated/floor/tiled/white,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/north)
"amV" = (
/obj/structure/railing{
@@ -13542,19 +13542,13 @@
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/bar)
"avQ" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 5
},
/obj/structure/cable/green{
d1 = 1;
d2 = 4;
icon_state = "1-4"
},
/obj/structure/table/rack/holorack,
/obj/effect/floor_decal/rust,
/obj/random/maintenance/clean,
/obj/random/tech_supply,
/obj/random/maintenance/research,
/turf/simulated/floor/plating,
/area/maintenance/lower/public_garden_maintenence/upper)
/area/tether/surfacebase/outside/outside2)
"avR" = (
/obj/structure/cable/green{
d1 = 4;
@@ -15902,11 +15896,14 @@
/turf/simulated/floor/plating,
/area/maintenance/lower/bar)
"aBb" = (
/obj/structure/railing{
dir = 4
/obj/structure/cable{
icon_state = "4-8"
},
/turf/simulated/wall,
/area/tether/surfacebase/fish_farm)
/obj/machinery/alarm{
pixel_y = 22
},
/turf/simulated/floor,
/area/maintenance/substation/research)
"aBc" = (
/obj/machinery/light{
dir = 8
@@ -20541,14 +20538,10 @@
/turf/simulated/floor,
/area/maintenance/substation/research)
"aKj" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/alarm{
pixel_y = 22
},
/turf/simulated/floor,
/area/maintenance/substation/research)
/obj/structure/railing,
/obj/effect/floor_decal/rust,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aKk" = (
/obj/structure/cable/green{
d1 = 4;
@@ -23061,6 +23054,10 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/south)
"aOM" = (
/obj/machinery/door/airlock/maintenance/common,
/turf/simulated/floor/tiled/techfloor,
/area/tether/surfacebase/fish_farm)
"aON" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -23205,6 +23202,22 @@
"aPc" = (
/turf/simulated/wall,
/area/rnd/research)
"aPd" = (
/obj/structure/railing{
dir = 8
},
/obj/effect/floor_decal/techfloor{
dir = 4
},
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/asmaint2)
"aPe" = (
/obj/effect/floor_decal/techfloor{
dir = 4
},
/obj/effect/floor_decal/industrial/danger/corner,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/asmaint2)
"aPf" = (
/obj/structure/cable/cyan{
d1 = 1;
@@ -23433,6 +23446,13 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/tether/surfacebase/east_stairs_two)
"aPv" = (
/obj/structure/railing{
dir = 4
},
/obj/effect/floor_decal/rust,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aPw" = (
/obj/effect/floor_decal/corner_techfloor_grid{
dir = 9
@@ -23443,6 +23463,10 @@
/obj/machinery/portable_atmospherics/hydroponics,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/south)
"aPx" = (
/obj/structure/catwalk,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aPy" = (
/obj/structure/closet/crate,
/obj/random/maintenance/clean,
@@ -23473,12 +23497,38 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/south)
"aPA" = (
/obj/machinery/door/airlock/maintenance/common,
/turf/simulated/floor/plating,
/area/maintenance/lower/public_garden_maintenence/upper)
"aPB" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 5
},
/obj/structure/cable/green{
d1 = 1;
d2 = 4;
icon_state = "1-4"
},
/obj/effect/floor_decal/rust,
/turf/simulated/floor/plating,
/area/maintenance/lower/public_garden_maintenence/upper)
"aPC" = (
/obj/effect/floor_decal/corner_techfloor_grid{
dir = 10
},
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/south)
"aPD" = (
/obj/structure/railing{
dir = 4
},
/obj/structure/railing,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aPE" = (
/obj/effect/floor_decal/borderfloor{
dir = 8
@@ -23613,6 +23663,22 @@
/obj/random/maintenance/research,
/turf/simulated/floor/plating,
/area/tether/surfacebase/emergency_storage/atmos)
"aPU" = (
/obj/structure/catwalk,
/obj/effect/floor_decal/rust,
/obj/random/junk,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aPV" = (
/obj/structure/railing{
dir = 8
},
/obj/structure/railing{
dir = 1
},
/obj/effect/floor_decal/rust,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aPW" = (
/obj/machinery/light{
dir = 8
@@ -23794,6 +23860,9 @@
/obj/structure/frame/computer,
/turf/simulated/floor,
/area/maintenance/lower/south)
"aQq" = (
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aQr" = (
/obj/structure/frame{
anchored = 1
@@ -24149,10 +24218,45 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/south)
"aRe" = (
/turf/simulated/wall{
can_open = 1
},
/area/tether/surfacebase/outside/outside2)
"aRf" = (
/obj/structure/catwalk,
/obj/effect/floor_decal/rust,
/obj/random/drinkbottle,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aRg" = (
/obj/structure/railing{
dir = 8
},
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aRh" = (
/obj/structure/table/rack/holorack,
/obj/random/maintenance/clean,
/obj/random/maintenance/clean,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aRi" = (
/obj/structure/catwalk,
/obj/effect/floor_decal/rust,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aRj" = (
/obj/random/tool,
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"aRk" = (
/obj/structure/railing{
dir = 8
},
/obj/effect/floor_decal/rust,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aRl" = (
/obj/machinery/requests_console{
department = "Science";
@@ -24354,6 +24458,13 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/tether/surfacebase/east_stairs_two)
"aRB" = (
/obj/structure/closet,
/obj/item/weapon/storage/mre/random,
/obj/item/weapon/storage/mre/random,
/obj/item/weapon/storage/mre/random,
/turf/simulated/floor/plating,
/area/tether/surfacebase/outside/outside2)
"aRC" = (
/obj/effect/floor_decal/corner_techfloor_grid{
dir = 5
@@ -24427,6 +24538,19 @@
can_open = 1
},
/area/maintenance/lower/south)
"aRJ" = (
/obj/structure/railing,
/obj/structure/railing{
dir = 8
},
/turf/simulated/floor/water/deep/indoors,
/area/maintenance/asmaint2)
"aRK" = (
/obj/structure/catwalk,
/obj/effect/floor_decal/rust,
/obj/random/junk,
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/asmaint2)
"aRL" = (
/obj/random/maintenance/research,
/turf/simulated/floor/plating,
@@ -39843,7 +39967,7 @@ akX
akX
adt
adt
adt
aQq
adt
adt
adt
@@ -39985,7 +40109,7 @@ aui
akX
akX
adt
adt
aQq
adt
adt
azs
@@ -40127,7 +40251,7 @@ ass
avi
akX
adt
adt
aQq
adt
adt
azs
@@ -40269,7 +40393,7 @@ ars
avj
akX
adt
adt
aQq
adt
adt
azs
@@ -40410,9 +40534,9 @@ atH
auj
akX
akX
adt
adt
adt
aac
aRe
aac
adt
azs
swg
@@ -40426,8 +40550,8 @@ adt
adt
adt
adt
adt
adt
aHm
aHm
aHm
aHE
aHE
@@ -40551,11 +40675,11 @@ ars
atI
aqt
akX
adt
adt
adt
adt
adt
aPv
aPD
aRf
aac
aac
azs
axO
bCs
@@ -40568,8 +40692,8 @@ azs
azs
azs
azs
adt
adt
aHm
aHm
aHm
aHm
aqp
@@ -40692,13 +40816,13 @@ ars
asw
akX
akX
adt
adt
adt
adt
adt
adt
azs
aKj
aPx
aPU
aPx
aRi
aPU
fLW
axO
pqb
bOW
@@ -40709,12 +40833,12 @@ aDj
aDV
aCm
aBB
azs
adt
adt
aHm
aHm
aHm
aOM
aJf
aRK
aJf
arY
aJf
aJf
aJf
aJf
@@ -40833,13 +40957,13 @@ aqB
art
akX
akX
adt
adt
adt
adt
adt
adt
adt
avQ
aKj
aPx
aPV
aRg
aRk
aRk
azs
awN
flk
@@ -40852,10 +40976,10 @@ aDk
aEx
aBd
azs
adt
adt
aHm
aHm
aRJ
arY
aJf
aJf
aqq
aJf
aJf
@@ -40977,11 +41101,11 @@ akX
ajV
ajV
ajV
aPA
ajV
ajV
adt
adt
adt
aRh
aRh
aRB
azs
axO
viY
@@ -40994,10 +41118,10 @@ aDk
aEy
azq
azs
adt
adt
aHm
aHm
aHE
aHE
aPd
aPe
aqr
are
arh
@@ -41119,11 +41243,11 @@ amQ
atJ
auk
auk
avQ
aPB
ajV
adt
adt
adt
aac
aac
aac
azs
azs
sgu
@@ -41136,9 +41260,9 @@ aDk
aEy
azq
azs
adt
adt
aGy
aHm
aHm
aHm
aHE
aqs
aHE
@@ -41270,14 +41394,14 @@ awY
azq
azq
azq
aBb
azs
aBC
aCo
aDk
aDk
aEz
aBC
aBb
azs
awY
awY
aGy
@@ -43132,7 +43256,7 @@ aEc
aEc
aEc
aJJ
aKj
aBb
aKW
aLD
aMo
+6 -2
View File
@@ -32564,7 +32564,9 @@
/area/tether/surfacebase/entertainment/backstage)
"bee" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/computer/arcade/orion_trail,
/obj/machinery/computer/arcade/orion_trail{
dir = 4
},
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"bef" = (
@@ -33407,7 +33409,9 @@
/turf/simulated/floor/tiled/eris/steel/bar_dance,
/area/tether/surfacebase/barbackmaintenance)
"bfR" = (
/obj/machinery/computer/arcade/battle,
/obj/machinery/computer/arcade/battle{
dir = 1
},
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"bfS" = (
+1
View File
@@ -13744,6 +13744,7 @@
dir = 4;
icon_state = "steel_decals_central5"
},
/mob/living/simple_mob/animal/passive/opossum/poppy,
/turf/simulated/floor/tiled/monotile,
/area/engineering/workshop)
"azg" = (
-1
View File
@@ -150,7 +150,6 @@
/decl/hierarchy/outfit/job/talon_pilot
name = OUTFIT_JOB_NAME("Talon Pilot")
id_pda_assignment = "Pilot"
id_slot = slot_wear_id
pda_type = null
+7
View File
@@ -2827,6 +2827,12 @@
#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm"
#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm"
#include "code\modules\mob\living\simple_mob\appearance.dm"
#include "code\modules\mob\living\simple_mob\butchering.dm"
#include "code\modules\mob\living\simple_mob\combat.dm"
@@ -2870,6 +2876,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm"