Merge branch 'release' of https://github.com/VOREStation/VOREStation into izac
@@ -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.
|
||||
|
||||
@@ -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(\
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
..()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -691,3 +691,6 @@
|
||||
selfimage.loc = src
|
||||
|
||||
return selfimage
|
||||
|
||||
/atom/movable/proc/get_cell()
|
||||
return
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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---//
|
||||
//***************//
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"]]"
|
||||
|
||||
@@ -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]."))
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 727 KiB After Width: | Height: | Size: 730 KiB |
|
After Width: | Height: | Size: 589 B |
|
Before Width: | Height: | Size: 293 KiB After Width: | Height: | Size: 301 KiB |
|
Before Width: | Height: | Size: 214 KiB After Width: | Height: | Size: 215 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||