mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 03:33:21 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 12/16/2015_newwizard
This commit is contained in:
11
.github/ISSUE_TEMPLATE.md
vendored
Normal file
11
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#### Brief description of the issue
|
||||||
|
|
||||||
|
#### What you expected to happen
|
||||||
|
|
||||||
|
#### What actually happened
|
||||||
|
|
||||||
|
#### Steps to reproduce
|
||||||
|
|
||||||
|
#### Additional info:
|
||||||
|
- **Server Revision**: Found using the "Show Server Revision" verb under the OOC tab.
|
||||||
|
- **Anything else you may wish to add** (Location if it's a mapping issue, etc)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#define HUNGER_FACTOR 0.05 // Factor of how fast mob nutrition decreases
|
#define DEFAULT_HUNGER_FACTOR 0.05 // Factor of how fast mob nutrition decreases
|
||||||
|
|
||||||
#define REM 0.2 // Means 'Reagent Effect Multiplier'. This is how many units of reagent are consumed per tick
|
#define REM 0.2 // Means 'Reagent Effect Multiplier'. This is how many units of reagent are consumed per tick
|
||||||
|
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
#define IS_UNATHI 4
|
#define IS_UNATHI 4
|
||||||
#define IS_TAJARA 5
|
#define IS_TAJARA 5
|
||||||
#define IS_XENOS 6
|
#define IS_XENOS 6
|
||||||
|
#define IS_TESHARI 7
|
||||||
|
|
||||||
#define CE_STABLE "stable" // Inaprovaline
|
#define CE_STABLE "stable" // Inaprovaline
|
||||||
#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin
|
#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ var/list/be_special_flags = list(
|
|||||||
|
|
||||||
// Mode/antag template macros.
|
// Mode/antag template macros.
|
||||||
#define MODE_BORER "borer"
|
#define MODE_BORER "borer"
|
||||||
#define MODE_XENOMORPH "xeno"
|
|
||||||
#define MODE_LOYALIST "loyalist"
|
#define MODE_LOYALIST "loyalist"
|
||||||
#define MODE_MUTINEER "mutineer"
|
#define MODE_MUTINEER "mutineer"
|
||||||
#define MODE_COMMANDO "commando"
|
#define MODE_COMMANDO "commando"
|
||||||
|
|||||||
@@ -23,11 +23,6 @@
|
|||||||
|
|
||||||
// Some arbitrary defines to be used by self-pruning global lists. (see master_controller)
|
// Some arbitrary defines to be used by self-pruning global lists. (see master_controller)
|
||||||
#define PROCESS_KILL 26 // Used to trigger removal from a processing list.
|
#define PROCESS_KILL 26 // Used to trigger removal from a processing list.
|
||||||
|
|
||||||
// Age limits on a character.
|
|
||||||
#define AGE_MIN 17
|
|
||||||
#define AGE_MAX 85
|
|
||||||
|
|
||||||
#define MAX_GEAR_COST 10 // Used in chargen for accessory loadout limit.
|
#define MAX_GEAR_COST 10 // Used in chargen for accessory loadout limit.
|
||||||
|
|
||||||
// Preference toggles.
|
// Preference toggles.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// Species flags.
|
// Species flags.
|
||||||
#define NO_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona/vox), cut resistant (slimes) or incorporeal (shadows)
|
#define NO_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona), cut resistant (slimes) or incorporeal (shadows)
|
||||||
#define IS_PLANT 0x2 // Is a treeperson.
|
#define IS_PLANT 0x2 // Is a treeperson.
|
||||||
#define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen.
|
#define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen.
|
||||||
#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator.
|
#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator.
|
||||||
|
|||||||
@@ -46,12 +46,18 @@ var/global/list/facial_hair_styles_male_list = list()
|
|||||||
var/global/list/facial_hair_styles_female_list = list()
|
var/global/list/facial_hair_styles_female_list = list()
|
||||||
var/global/list/skin_styles_female_list = list() //unused
|
var/global/list/skin_styles_female_list = list() //unused
|
||||||
//Underwear
|
//Underwear
|
||||||
var/global/list/underwear_m = list(
|
var/global/list/underwear_top_t = list(
|
||||||
"White" = "m1", "Grey" = "m2", "Green" = "m3", "Blue" = "m4", "Black" = "m5", "Mankini" = "m6",
|
"Bra, Red" = "t1", "Bra, White" = "t2", "Bra, Yellow" = "t3", "Bra, Blue" = "t4", "Bra, Black" = "t5", "Lacy Bra" = "t6", "Sports Bra, Black" = "t7", "Sports Bra, White" = "t8",
|
||||||
"Boxers Heart" = "m7", "Boxers Black" = "m8", "Boxers Grey" = "m9", "Boxers Stripe" = "m10", "None") //Curse whoever made male/female underwear diffrent colours
|
"Sports Bra Alt, Black" = "t9", "Sporta Bra Alt, White" = "t10", "Bra, Baby-Blue" = "t11", "Bra, Green" = "t12", "Bra, Pink" = "t13", "Bra, Violet" = "t14",
|
||||||
var/global/list/underwear_f = list(
|
"Lacy Bra Alt" = "t15", "Lacy Bra Alt, Violet" = "t16", "Halterneck Bra, Black" = "t17", "Halterneck Bra, Blue" = "t18", "Halterneck Bra, Green" = "t19", "Halterneck Bra, Purple" = "t20",
|
||||||
"Red" = "f1", "White" = "f2", "Yellow" = "f3", "Blue" = "f4", "Black" = "f5", "Thong" = "f6",
|
"Halterneck Bra, Red" = "t21", "Halterneck Bra, Teal" = "t22", "Halterneck Bra, Violet" = "t23", "Halterneck Bra, White" = "t24", "None")
|
||||||
"Black Sports" = "f7","White Sports" = "f8", "Black Sports Alt" = "f9", "White Sports Alt" = "f10", "Baby Blue" = "f11", "Green" = "f12", "Pink" = "f13", "None")
|
var/global/list/underwear_bottom_t = list(
|
||||||
|
"Briefs, White" = "b1", "Briefs, Grey" = "b2", "Briefs, Green" = "b3", "Briefs, Blue" = "b4", "Briefs, Black" = "b5", "Boxers, Loveheart" = "b7", "Boxers, Black" = "b8",
|
||||||
|
"Boxers, Grey" = "b9", "Boxers, Green & Blue Striped" = "b10", "Panties, Red" = "b11", "Panties, White" = "b12", "Panties, Yellow" = "b13", "Panties, Blue" = "b14",
|
||||||
|
"Panties, Light-Black" = "b15", "Thong" = "b16", "Panties, Black" = "b17", "Panties Alt, White" = "b18", "Compression Shorts, Black" = "b19", "Compression Shorts, White" = "b20",
|
||||||
|
"Compression Shorts, Baby-Blue" = "b21", "Panties, Green" = "b22", "Compression Shorts, Pink" = "b23", "Thong, Violet" = "b24", "Thong Alt" = "b25", "Thong Alt, Violet" = "b26",
|
||||||
|
"Alt Thong, Black" = "b27", "Alt Thong, Blue" = "b28", "Alt Thong, Green" = "b29", "Alt Thong, Purple" = "b30", "Alt Thong, Red" = "b31", "Alt Thong, Teal" = "b32",
|
||||||
|
"Alt Thong, Violet" = "b33", "Alt Thong, White" = "b34", "None")
|
||||||
//undershirt
|
//undershirt
|
||||||
var/global/list/undershirt_t = list(
|
var/global/list/undershirt_t = list(
|
||||||
"White tank top" = "u1", "Black tank top" = "u2", "Black shirt" = "u3",
|
"White tank top" = "u1", "Black tank top" = "u2", "Black shirt" = "u3",
|
||||||
@@ -91,6 +97,37 @@ var/global/list/endgame_exits = list()
|
|||||||
var/global/list/endgame_safespawns = list()
|
var/global/list/endgame_safespawns = list()
|
||||||
|
|
||||||
var/global/list/syndicate_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
|
var/global/list/syndicate_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
|
||||||
|
|
||||||
|
// Strings which corraspond to bodypart covering flags, useful for outputting what something covers.
|
||||||
|
var/global/list/string_part_flags = list(
|
||||||
|
"head" = HEAD,
|
||||||
|
"face" = FACE,
|
||||||
|
"eyes" = EYES,
|
||||||
|
"upper body" = UPPER_TORSO,
|
||||||
|
"lower body" = LOWER_TORSO,
|
||||||
|
"legs" = LEGS,
|
||||||
|
"feet" = FEET,
|
||||||
|
"arms" = ARMS,
|
||||||
|
"hands" = HANDS
|
||||||
|
)
|
||||||
|
|
||||||
|
// Strings which corraspond to slot flags, useful for outputting what slot something is.
|
||||||
|
var/global/list/string_slot_flags = list(
|
||||||
|
"back" = SLOT_BACK,
|
||||||
|
"face" = SLOT_MASK,
|
||||||
|
"waist" = SLOT_BELT,
|
||||||
|
"ID slot" = SLOT_ID,
|
||||||
|
"ears" = SLOT_EARS,
|
||||||
|
"eyes" = SLOT_EYES,
|
||||||
|
"hands" = SLOT_GLOVES,
|
||||||
|
"head" = SLOT_HEAD,
|
||||||
|
"feet" = SLOT_FEET,
|
||||||
|
"exo slot" = SLOT_OCLOTHING,
|
||||||
|
"body" = SLOT_ICLOTHING,
|
||||||
|
"uniform" = SLOT_TIE,
|
||||||
|
"holster" = SLOT_HOLSTER
|
||||||
|
)
|
||||||
|
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
/////Initial Building/////
|
/////Initial Building/////
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
/atom/movable/proc/get_mob()
|
/atom/movable/proc/get_mob()
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/get_mob()
|
|
||||||
if(load && istype(load,/mob/living))
|
|
||||||
return load
|
|
||||||
|
|
||||||
/obj/mecha/get_mob()
|
/obj/mecha/get_mob()
|
||||||
return occupant
|
return occupant
|
||||||
|
|
||||||
@@ -14,6 +10,11 @@
|
|||||||
/mob/get_mob()
|
/mob/get_mob()
|
||||||
return src
|
return src
|
||||||
|
|
||||||
|
/mob/living/bot/mulebot/get_mob()
|
||||||
|
if(load && istype(load, /mob/living))
|
||||||
|
return list(src, load)
|
||||||
|
return src
|
||||||
|
|
||||||
/proc/mobs_in_view(var/range, var/source)
|
/proc/mobs_in_view(var/range, var/source)
|
||||||
var/list/mobs = list()
|
var/list/mobs = list()
|
||||||
for(var/atom/movable/AM in view(range, source))
|
for(var/atom/movable/AM in view(range, source))
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
CtrlClickOn(A)
|
CtrlClickOn(A)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(stat || lockcharge || weakened || stunned || paralysis)
|
if(stat || lockdown || weakened || stunned || paralysis)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!canClick())
|
if(!canClick())
|
||||||
|
|||||||
@@ -61,6 +61,21 @@
|
|||||||
#define ui_borg_module "EAST-2:26,SOUTH+1:7"
|
#define ui_borg_module "EAST-2:26,SOUTH+1:7"
|
||||||
#define ui_borg_panel "EAST-1:28,SOUTH+1:7"
|
#define ui_borg_panel "EAST-1:28,SOUTH+1:7"
|
||||||
|
|
||||||
|
#define ui_ai_core "SOUTH:6,WEST:16"
|
||||||
|
#define ui_ai_camera_list "SOUTH:6,WEST+1:16"
|
||||||
|
#define ui_ai_track_with_camera "SOUTH:6,WEST+2:16"
|
||||||
|
#define ui_ai_camera_light "SOUTH:6,WEST+3:16"
|
||||||
|
#define ui_ai_crew_monitor "SOUTH:6,WEST+4:16"
|
||||||
|
#define ui_ai_crew_manifest "SOUTH:6,WEST+5:16"
|
||||||
|
#define ui_ai_alerts "SOUTH:6,WEST+6:16"
|
||||||
|
#define ui_ai_announcement "SOUTH:6,WEST+7:16"
|
||||||
|
#define ui_ai_shuttle "SOUTH:6,WEST+8:16"
|
||||||
|
#define ui_ai_state_laws "SOUTH:6,WEST+9:16"
|
||||||
|
#define ui_ai_pda_send "SOUTH:6,WEST+10:16"
|
||||||
|
#define ui_ai_pda_log "SOUTH:6,WEST+11:16"
|
||||||
|
#define ui_ai_take_picture "SOUTH:6,WEST+12:16"
|
||||||
|
#define ui_ai_view_images "SOUTH:6,WEST+13:16"
|
||||||
|
|
||||||
//Gun buttons
|
//Gun buttons
|
||||||
#define ui_gun1 "EAST-2:26,SOUTH+2:7"
|
#define ui_gun1 "EAST-2:26,SOUTH+2:7"
|
||||||
#define ui_gun2 "EAST-1:28, SOUTH+3:7"
|
#define ui_gun2 "EAST-1:28, SOUTH+3:7"
|
||||||
|
|||||||
135
code/_onclick/hud/ai.dm
Normal file
135
code/_onclick/hud/ai.dm
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
/datum/hud/proc/ai_hud()
|
||||||
|
adding = list()
|
||||||
|
other = list()
|
||||||
|
|
||||||
|
var/obj/screen/using
|
||||||
|
|
||||||
|
//AI core
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "AI Core"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "ai_core"
|
||||||
|
using.screen_loc = ui_ai_core
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Camera list
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Show Camera List"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "camera"
|
||||||
|
using.screen_loc = ui_ai_camera_list
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Track
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Track With Camera"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "track"
|
||||||
|
using.screen_loc = ui_ai_track_with_camera
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Camera light
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Toggle Camera Light"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "camera_light"
|
||||||
|
using.screen_loc = ui_ai_camera_light
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Crew Monitorting
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Crew Monitorting"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "crew_monitor"
|
||||||
|
using.screen_loc = ui_ai_crew_monitor
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Crew Manifest
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Show Crew Manifest"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "manifest"
|
||||||
|
using.screen_loc = ui_ai_crew_manifest
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Alerts
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Show Alerts"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "alerts"
|
||||||
|
using.screen_loc = ui_ai_alerts
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Announcement
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Announcement"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "announcement"
|
||||||
|
using.screen_loc = ui_ai_announcement
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Shuttle
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Call Emergency Shuttle"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "call_shuttle"
|
||||||
|
using.screen_loc = ui_ai_shuttle
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Laws
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "State Laws"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "state_laws"
|
||||||
|
using.screen_loc = ui_ai_state_laws
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//PDA message
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "PDA - Send Message"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "pda_send"
|
||||||
|
using.screen_loc = ui_ai_pda_send
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//PDA log
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "PDA - Show Message Log"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "pda_receive"
|
||||||
|
using.screen_loc = ui_ai_pda_log
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//Take image
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "Take Image"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "take_picture"
|
||||||
|
using.screen_loc = ui_ai_take_picture
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
//View images
|
||||||
|
using = new /obj/screen()
|
||||||
|
using.name = "View Images"
|
||||||
|
using.icon = 'icons/mob/screen_ai.dmi'
|
||||||
|
using.icon_state = "view_images"
|
||||||
|
using.screen_loc = ui_ai_view_images
|
||||||
|
using.layer = SCREEN_LAYER
|
||||||
|
adding += using
|
||||||
|
|
||||||
|
mymob.client.screen += adding + other
|
||||||
|
|
||||||
|
return
|
||||||
@@ -398,7 +398,8 @@
|
|||||||
if(dna.species == "Human") //no more xenos losing ears/tentacles
|
if(dna.species == "Human") //no more xenos losing ears/tentacles
|
||||||
h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
|
h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
|
||||||
undershirt = null
|
undershirt = null
|
||||||
underwear = null
|
underwear_top = null
|
||||||
|
underwear_bottom = null
|
||||||
socks = null
|
socks = null
|
||||||
regenerate_icons()
|
regenerate_icons()
|
||||||
|
|
||||||
|
|||||||
@@ -13,9 +13,6 @@
|
|||||||
mymob.blind.screen_loc = "1,1"
|
mymob.blind.screen_loc = "1,1"
|
||||||
mymob.blind.layer = 0
|
mymob.blind.layer = 0
|
||||||
|
|
||||||
/datum/hud/proc/ai_hud()
|
|
||||||
return
|
|
||||||
|
|
||||||
/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi')
|
/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi')
|
||||||
|
|
||||||
blobpwrdisplay = new /obj/screen()
|
blobpwrdisplay = new /obj/screen()
|
||||||
|
|||||||
@@ -397,6 +397,78 @@
|
|||||||
if("module3")
|
if("module3")
|
||||||
if(istype(usr, /mob/living/silicon/robot))
|
if(istype(usr, /mob/living/silicon/robot))
|
||||||
usr:toggle_module(3)
|
usr:toggle_module(3)
|
||||||
|
|
||||||
|
if("AI Core")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.view_core()
|
||||||
|
|
||||||
|
if("Show Camera List")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
var/camera = input(AI) in AI.get_camera_list()
|
||||||
|
AI.ai_camera_list(camera)
|
||||||
|
|
||||||
|
if("Track With Camera")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
var/target_name = input(AI) in AI.trackable_mobs()
|
||||||
|
AI.ai_camera_track(target_name)
|
||||||
|
|
||||||
|
if("Toggle Camera Light")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.toggle_camera_light()
|
||||||
|
|
||||||
|
if("Crew Monitorting")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.subsystem_crew_monitor()
|
||||||
|
|
||||||
|
if("Show Crew Manifest")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.ai_roster()
|
||||||
|
|
||||||
|
if("Show Alerts")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.subsystem_alarm_monitor()
|
||||||
|
|
||||||
|
if("Announcement")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.ai_announcement()
|
||||||
|
|
||||||
|
if("Call Emergency Shuttle")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.ai_call_shuttle()
|
||||||
|
|
||||||
|
if("State Laws")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.ai_checklaws()
|
||||||
|
|
||||||
|
if("PDA - Send Message")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.aiPDA.cmd_send_pdamesg(usr)
|
||||||
|
|
||||||
|
if("PDA - Show Message Log")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.aiPDA.cmd_show_message_log(usr)
|
||||||
|
|
||||||
|
if("Take Image")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.take_image()
|
||||||
|
|
||||||
|
if("View Images")
|
||||||
|
if(isAI(usr))
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.view_images()
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ attacked_by() will handle hitting/missing/logging as it does now, and will call
|
|||||||
|
|
||||||
// TODO: needs to be refactored into a mob/living level attacked_by() proc. ~Z
|
// TODO: needs to be refactored into a mob/living level attacked_by() proc. ~Z
|
||||||
user.do_attack_animation(M)
|
user.do_attack_animation(M)
|
||||||
|
user.break_cloak()
|
||||||
if(istype(M, /mob/living/carbon/human))
|
if(istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
return // seems legit.
|
return // seems legit.
|
||||||
|
|
||||||
// Things you might plausibly want to follow
|
// Things you might plausibly want to follow
|
||||||
if((ismob(A) && A != src) || istype(A,/obj/machinery/bot) || istype(A,/obj/singularity))
|
if((ismob(A) && A != src) || istype(A,/obj/singularity))
|
||||||
ManualFollow(A)
|
ManualFollow(A)
|
||||||
|
|
||||||
// Otherwise jump
|
// Otherwise jump
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
/obj/item/weapon/storage/box/swabs,
|
/obj/item/weapon/storage/box/swabs,
|
||||||
/obj/item/weapon/storage/box/swabs,
|
/obj/item/weapon/storage/box/swabs,
|
||||||
/obj/item/weapon/storage/box/swabs,
|
/obj/item/weapon/storage/box/swabs,
|
||||||
/obj/item/weapon/storage/box/slides,
|
|
||||||
/obj/item/device/uv_light,
|
/obj/item/device/uv_light,
|
||||||
/obj/item/weapon/reagent_containers/spray/luminol)
|
/obj/item/weapon/reagent_containers/spray/luminol)
|
||||||
cost = 30
|
cost = 30
|
||||||
@@ -278,11 +277,11 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
group = "Miscellaneous"
|
group = "Miscellaneous"
|
||||||
|
|
||||||
/datum/supply_packs/mule
|
/datum/supply_packs/mule
|
||||||
name = "MULEbot Crate"
|
name = "Mulebot Crate"
|
||||||
contains = list(/obj/machinery/bot/mulebot)
|
contains = list()
|
||||||
cost = 20
|
cost = 20
|
||||||
containertype = /obj/structure/largecrate/mule
|
containertype = /obj/structure/largecrate/animal/mulebot
|
||||||
containername = "MULEbot Crate"
|
containername = "Mulebot Crate"
|
||||||
group = "Operations"
|
group = "Operations"
|
||||||
|
|
||||||
/datum/supply_packs/cargotrain
|
/datum/supply_packs/cargotrain
|
||||||
@@ -456,7 +455,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
group = "Medical"
|
group = "Medical"
|
||||||
|
|
||||||
/datum/supply_packs/cryobag
|
/datum/supply_packs/cryobag
|
||||||
name = "Statis bag crate"
|
name = "Stasis bag crate"
|
||||||
contains = list(/obj/item/bodybag/cryobag,
|
contains = list(/obj/item/bodybag/cryobag,
|
||||||
/obj/item/bodybag/cryobag,
|
/obj/item/bodybag/cryobag,
|
||||||
/obj/item/bodybag/cryobag)
|
/obj/item/bodybag/cryobag)
|
||||||
@@ -771,13 +770,11 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
contains = list(/obj/item/weapon/gun/energy/xray,
|
contains = list(/obj/item/weapon/gun/energy/xray,
|
||||||
/obj/item/weapon/gun/energy/xray,
|
/obj/item/weapon/gun/energy/xray,
|
||||||
/obj/item/weapon/shield/energy,
|
/obj/item/weapon/shield/energy,
|
||||||
/obj/item/weapon/shield/energy,
|
/obj/item/weapon/shield/energy)
|
||||||
/obj/item/clothing/suit/armor/laserproof,
|
|
||||||
/obj/item/clothing/suit/armor/laserproof)
|
|
||||||
cost = 125
|
cost = 125
|
||||||
containertype = /obj/structure/closet/crate/secure/weapon
|
containertype = /obj/structure/closet/crate/secure/weapon
|
||||||
containername = "Experimental weapons crate"
|
containername = "Experimental weapons crate"
|
||||||
access = access_heads
|
access = access_armory
|
||||||
group = "Security"
|
group = "Security"
|
||||||
|
|
||||||
/datum/supply_packs/randomised/armor
|
/datum/supply_packs/randomised/armor
|
||||||
@@ -801,8 +798,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
access = access_security
|
access = access_security
|
||||||
group = "Security"
|
group = "Security"
|
||||||
|
|
||||||
|
/datum/supply_packs/riot_gear
|
||||||
/datum/supply_packs/riot
|
|
||||||
name = "Riot gear crate"
|
name = "Riot gear crate"
|
||||||
contains = list(/obj/item/weapon/melee/baton,
|
contains = list(/obj/item/weapon/melee/baton,
|
||||||
/obj/item/weapon/melee/baton,
|
/obj/item/weapon/melee/baton,
|
||||||
@@ -813,21 +809,87 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
/obj/item/weapon/handcuffs,
|
/obj/item/weapon/handcuffs,
|
||||||
/obj/item/weapon/handcuffs,
|
/obj/item/weapon/handcuffs,
|
||||||
/obj/item/weapon/handcuffs,
|
/obj/item/weapon/handcuffs,
|
||||||
/obj/item/clothing/head/helmet/riot,
|
|
||||||
/obj/item/clothing/suit/armor/riot,
|
|
||||||
/obj/item/clothing/head/helmet/riot,
|
|
||||||
/obj/item/clothing/suit/armor/riot,
|
|
||||||
/obj/item/clothing/head/helmet/riot,
|
|
||||||
/obj/item/clothing/suit/armor/riot,
|
|
||||||
/obj/item/weapon/storage/box/flashbangs,
|
/obj/item/weapon/storage/box/flashbangs,
|
||||||
/obj/item/weapon/storage/box/beanbags,
|
/obj/item/weapon/storage/box/beanbags,
|
||||||
/obj/item/weapon/storage/box/handcuffs)
|
/obj/item/weapon/storage/box/handcuffs)
|
||||||
cost = 60
|
cost = 40
|
||||||
containertype = /obj/structure/closet/crate/secure
|
containertype = /obj/structure/closet/crate/secure
|
||||||
containername = "Riot gear crate"
|
containername = "riot gear crate"
|
||||||
access = access_armory
|
access = access_armory
|
||||||
group = "Security"
|
group = "Security"
|
||||||
|
|
||||||
|
/datum/supply_packs/riot_armor
|
||||||
|
name = "Riot armor set crate"
|
||||||
|
contains = list(/obj/item/clothing/head/helmet/riot,
|
||||||
|
/obj/item/clothing/suit/armor/riot,
|
||||||
|
/obj/item/clothing/gloves/arm_guard/riot,
|
||||||
|
/obj/item/clothing/shoes/leg_guard/riot)
|
||||||
|
cost = 30
|
||||||
|
containertype = /obj/structure/closet/crate/secure
|
||||||
|
containername = "riot armor set crate"
|
||||||
|
access = access_armory
|
||||||
|
group = "Security"
|
||||||
|
|
||||||
|
/datum/supply_packs/ablative_armor
|
||||||
|
name = "Ablative armor set crate"
|
||||||
|
contains = list(/obj/item/clothing/head/helmet/laserproof,
|
||||||
|
/obj/item/clothing/suit/armor/laserproof,
|
||||||
|
/obj/item/clothing/gloves/arm_guard/laserproof,
|
||||||
|
/obj/item/clothing/shoes/leg_guard/laserproof)
|
||||||
|
cost = 40
|
||||||
|
containertype = /obj/structure/closet/crate/secure
|
||||||
|
containername = "ablative armor set crate"
|
||||||
|
access = access_armory
|
||||||
|
group = "Security"
|
||||||
|
|
||||||
|
/datum/supply_packs/bullet_resistant_armor
|
||||||
|
name = "Bullet resistant armor set crate"
|
||||||
|
contains = list(/obj/item/clothing/head/helmet/bulletproof,
|
||||||
|
/obj/item/clothing/suit/armor/bulletproof,
|
||||||
|
/obj/item/clothing/gloves/arm_guard/bulletproof,
|
||||||
|
/obj/item/clothing/shoes/leg_guard/bulletproof)
|
||||||
|
cost = 35
|
||||||
|
containertype = /obj/structure/closet/crate/secure
|
||||||
|
containername = "bullet resistant armor set crate"
|
||||||
|
access = access_armory
|
||||||
|
group = "Security"
|
||||||
|
|
||||||
|
/datum/supply_packs/combat_armor
|
||||||
|
name = "Combat armor set crate"
|
||||||
|
contains = list(/obj/item/clothing/head/helmet/combat,
|
||||||
|
/obj/item/clothing/suit/armor/combat,
|
||||||
|
/obj/item/clothing/gloves/arm_guard/combat,
|
||||||
|
/obj/item/clothing/shoes/leg_guard/combat)
|
||||||
|
cost = 40
|
||||||
|
containertype = /obj/structure/closet/crate/secure
|
||||||
|
containername = "combat armor set crate"
|
||||||
|
access = access_armory
|
||||||
|
group = "Security"
|
||||||
|
|
||||||
|
/datum/supply_packs/tactical
|
||||||
|
name = "Tactical suits"
|
||||||
|
containertype = /obj/structure/closet/crate/secure
|
||||||
|
containername = "Tactical Suit Locker"
|
||||||
|
cost = 60
|
||||||
|
group = "Security"
|
||||||
|
access = access_armory
|
||||||
|
contains = list(/obj/item/clothing/under/tactical,
|
||||||
|
/obj/item/clothing/suit/armor/tactical,
|
||||||
|
/obj/item/clothing/head/helmet/tactical,
|
||||||
|
/obj/item/clothing/mask/balaclava/tactical,
|
||||||
|
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
|
||||||
|
/obj/item/weapon/storage/belt/security/tactical,
|
||||||
|
/obj/item/clothing/shoes/jackboots,
|
||||||
|
/obj/item/clothing/gloves/black,
|
||||||
|
/obj/item/clothing/under/tactical,
|
||||||
|
/obj/item/clothing/suit/armor/tactical,
|
||||||
|
/obj/item/clothing/head/helmet/tactical,
|
||||||
|
/obj/item/clothing/mask/balaclava/tactical,
|
||||||
|
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
|
||||||
|
/obj/item/weapon/storage/belt/security/tactical,
|
||||||
|
/obj/item/clothing/shoes/jackboots,
|
||||||
|
/obj/item/clothing/gloves/black)
|
||||||
|
|
||||||
/datum/supply_packs/energyweapons
|
/datum/supply_packs/energyweapons
|
||||||
name = "Energy weapons crate"
|
name = "Energy weapons crate"
|
||||||
contains = list(/obj/item/weapon/gun/energy/laser,
|
contains = list(/obj/item/weapon/gun/energy/laser,
|
||||||
@@ -841,9 +903,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
|
|
||||||
/datum/supply_packs/shotgun
|
/datum/supply_packs/shotgun
|
||||||
name = "Shotgun crate"
|
name = "Shotgun crate"
|
||||||
contains = list(/obj/item/clothing/suit/armor/bulletproof,
|
contains = list(/obj/item/weapon/storage/box/shotgunammo,
|
||||||
/obj/item/clothing/suit/armor/bulletproof,
|
|
||||||
/obj/item/weapon/storage/box/shotgunammo,
|
|
||||||
/obj/item/weapon/storage/box/shotgunshells,
|
/obj/item/weapon/storage/box/shotgunshells,
|
||||||
/obj/item/weapon/gun/projectile/shotgun/pump/combat,
|
/obj/item/weapon/gun/projectile/shotgun/pump/combat,
|
||||||
/obj/item/weapon/gun/projectile/shotgun/pump/combat)
|
/obj/item/weapon/gun/projectile/shotgun/pump/combat)
|
||||||
@@ -855,9 +915,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
|
|
||||||
/datum/supply_packs/erifle
|
/datum/supply_packs/erifle
|
||||||
name = "Energy marksman crate"
|
name = "Energy marksman crate"
|
||||||
contains = list(/obj/item/clothing/suit/armor/laserproof,
|
contains = list(/obj/item/weapon/gun/energy/sniperrifle,
|
||||||
/obj/item/clothing/suit/armor/laserproof,
|
|
||||||
/obj/item/weapon/gun/energy/sniperrifle,
|
|
||||||
/obj/item/weapon/gun/energy/sniperrifle)
|
/obj/item/weapon/gun/energy/sniperrifle)
|
||||||
cost = 90
|
cost = 90
|
||||||
containertype = /obj/structure/closet/crate/secure
|
containertype = /obj/structure/closet/crate/secure
|
||||||
@@ -922,27 +980,13 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
group = "Security"
|
group = "Security"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/datum/supply_packs/expenergy
|
/datum/supply_packs/energy_guns
|
||||||
name = "Experimental energy gear crate"
|
name = "energy guns crate"
|
||||||
contains = list(/obj/item/clothing/suit/armor/laserproof,
|
contains = list(/obj/item/weapon/gun/energy/gun,
|
||||||
/obj/item/clothing/suit/armor/laserproof,
|
|
||||||
/obj/item/weapon/gun/energy/gun,
|
|
||||||
/obj/item/weapon/gun/energy/gun)
|
/obj/item/weapon/gun/energy/gun)
|
||||||
cost = 50
|
cost = 50
|
||||||
containertype = /obj/structure/closet/crate/secure
|
containertype = /obj/structure/closet/crate/secure
|
||||||
containername = "Experimental energy gear crate"
|
containername = "energy guns crate"
|
||||||
access = access_armory
|
|
||||||
group = "Security"
|
|
||||||
|
|
||||||
/datum/supply_packs/exparmor
|
|
||||||
name = "Experimental armor crate"
|
|
||||||
contains = list(/obj/item/clothing/suit/armor/laserproof,
|
|
||||||
/obj/item/clothing/suit/armor/bulletproof,
|
|
||||||
/obj/item/clothing/head/helmet/riot,
|
|
||||||
/obj/item/clothing/suit/armor/riot)
|
|
||||||
cost = 35
|
|
||||||
containertype = /obj/structure/closet/crate/secure
|
|
||||||
containername = "Experimental armor crate"
|
|
||||||
access = access_armory
|
access = access_armory
|
||||||
group = "Security"
|
group = "Security"
|
||||||
|
|
||||||
@@ -1142,8 +1186,9 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
/datum/supply_packs/formal_wear
|
/datum/supply_packs/formal_wear
|
||||||
contains = list(/obj/item/clothing/head/bowler,
|
contains = list(/obj/item/clothing/head/bowler,
|
||||||
/obj/item/clothing/head/that,
|
/obj/item/clothing/head/that,
|
||||||
|
/obj/item/clothing/suit/storage/toggle/internalaffairs,
|
||||||
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket,
|
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket,
|
||||||
/obj/item/clothing/suit/storage/lawyer/purpjacket,
|
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket,
|
||||||
/obj/item/clothing/under/suit_jacket,
|
/obj/item/clothing/under/suit_jacket,
|
||||||
/obj/item/clothing/under/suit_jacket/female,
|
/obj/item/clothing/under/suit_jacket/female,
|
||||||
/obj/item/clothing/under/suit_jacket/really_black,
|
/obj/item/clothing/under/suit_jacket/really_black,
|
||||||
@@ -1319,30 +1364,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
containername = "Radiation suit locker"
|
containername = "Radiation suit locker"
|
||||||
group = "Engineering"
|
group = "Engineering"
|
||||||
|
|
||||||
/datum/supply_packs/tactical
|
|
||||||
name = "Tactical suits"
|
|
||||||
containertype = /obj/structure/closet/crate/secure
|
|
||||||
containername = "Tactical Suit Locker"
|
|
||||||
cost = 45
|
|
||||||
group = "Security"
|
|
||||||
access = access_armory
|
|
||||||
contains = list(/obj/item/clothing/under/tactical,
|
|
||||||
/obj/item/clothing/suit/armor/tactical,
|
|
||||||
/obj/item/clothing/head/helmet/tactical,
|
|
||||||
/obj/item/clothing/mask/balaclava/tactical,
|
|
||||||
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
|
|
||||||
/obj/item/weapon/storage/belt/security/tactical,
|
|
||||||
/obj/item/clothing/shoes/jackboots,
|
|
||||||
/obj/item/clothing/gloves/black,
|
|
||||||
/obj/item/clothing/under/tactical,
|
|
||||||
/obj/item/clothing/suit/armor/tactical,
|
|
||||||
/obj/item/clothing/head/helmet/tactical,
|
|
||||||
/obj/item/clothing/mask/balaclava/tactical,
|
|
||||||
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
|
|
||||||
/obj/item/weapon/storage/belt/security/tactical,
|
|
||||||
/obj/item/clothing/shoes/jackboots,
|
|
||||||
/obj/item/clothing/gloves/black)
|
|
||||||
|
|
||||||
/datum/supply_packs/carpet
|
/datum/supply_packs/carpet
|
||||||
name = "Imported carpet"
|
name = "Imported carpet"
|
||||||
containertype = /obj/structure/closet
|
containertype = /obj/structure/closet
|
||||||
@@ -1352,6 +1373,15 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
|||||||
contains = list(/obj/item/stack/tile/carpet)
|
contains = list(/obj/item/stack/tile/carpet)
|
||||||
amount = 50
|
amount = 50
|
||||||
|
|
||||||
|
/datum/supply_packs/linoleum
|
||||||
|
name = "Linoleum"
|
||||||
|
containertype = /obj/structure/closet
|
||||||
|
containername = "Linoleum crate"
|
||||||
|
cost = 15
|
||||||
|
group = "Miscellaneous"
|
||||||
|
contains = list(/obj/item/stack/tile/linoleum)
|
||||||
|
amount = 50
|
||||||
|
|
||||||
/datum/supply_packs/hydrotray
|
/datum/supply_packs/hydrotray
|
||||||
name = "Empty hydroponics tray"
|
name = "Empty hydroponics tray"
|
||||||
cost = 30
|
cost = 30
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
/datum/wires/mulebot
|
|
||||||
random = 1
|
|
||||||
holder_type = /obj/machinery/bot/mulebot
|
|
||||||
wire_count = 10
|
|
||||||
|
|
||||||
var/const/WIRE_POWER1 = 1 // power connections
|
|
||||||
var/const/WIRE_POWER2 = 2
|
|
||||||
var/const/WIRE_AVOIDANCE = 4 // mob avoidance
|
|
||||||
var/const/WIRE_LOADCHECK = 8 // load checking (non-crate)
|
|
||||||
var/const/WIRE_MOTOR1 = 16 // motor wires
|
|
||||||
var/const/WIRE_MOTOR2 = 32 //
|
|
||||||
var/const/WIRE_REMOTE_RX = 64 // remote recv functions
|
|
||||||
var/const/WIRE_REMOTE_TX = 128 // remote trans status
|
|
||||||
var/const/WIRE_BEACON_RX = 256 // beacon ping recv
|
|
||||||
|
|
||||||
/datum/wires/mulebot/CanUse(var/mob/living/L)
|
|
||||||
var/obj/machinery/bot/mulebot/M = holder
|
|
||||||
if(M.open)
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
// So the wires do not open a new window, handle the interaction ourselves.
|
|
||||||
/datum/wires/mulebot/Interact(var/mob/living/user)
|
|
||||||
if(CanUse(user))
|
|
||||||
var/obj/machinery/bot/mulebot/M = holder
|
|
||||||
M.interact(user)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/UpdatePulsed(var/index)
|
|
||||||
switch(index)
|
|
||||||
if(WIRE_POWER1, WIRE_POWER2)
|
|
||||||
holder.visible_message("<span class='notice'>\icon[holder] The charge light flickers.</span>")
|
|
||||||
if(WIRE_AVOIDANCE)
|
|
||||||
holder.visible_message("<span class='notice'>\icon[holder] The external warning lights flash briefly.</span>")
|
|
||||||
if(WIRE_LOADCHECK)
|
|
||||||
holder.visible_message("<span class='notice'>\icon[holder] The load platform clunks.</span>")
|
|
||||||
if(WIRE_MOTOR1, WIRE_MOTOR2)
|
|
||||||
holder.visible_message("<span class='notice'>\icon[holder] The drive motor whines briefly.</span>")
|
|
||||||
else
|
|
||||||
holder.visible_message("<span class='notice'>\icon[holder] You hear a radio crackle.</span>")
|
|
||||||
|
|
||||||
// HELPER PROCS
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/Motor1()
|
|
||||||
return !(wires_status & WIRE_MOTOR1)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/Motor2()
|
|
||||||
return !(wires_status & WIRE_MOTOR2)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/HasPower()
|
|
||||||
return !(wires_status & WIRE_POWER1) && !(wires_status & WIRE_POWER2)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/LoadCheck()
|
|
||||||
return !(wires_status & WIRE_LOADCHECK)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/MobAvoid()
|
|
||||||
return !(wires_status & WIRE_AVOIDANCE)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/RemoteTX()
|
|
||||||
return !(wires_status & WIRE_REMOTE_TX)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/RemoteRX()
|
|
||||||
return !(wires_status & WIRE_REMOTE_RX)
|
|
||||||
|
|
||||||
/datum/wires/mulebot/proc/BeaconRX()
|
|
||||||
return !(wires_status & WIRE_BEACON_RX)
|
|
||||||
@@ -16,7 +16,7 @@ var/const/BORG_WIRE_CAMERA = 16
|
|||||||
. += text("<br>\n[(R.lawupdate ? "The LawSync light is on." : "The LawSync light is off.")]")
|
. += text("<br>\n[(R.lawupdate ? "The LawSync light is on." : "The LawSync light is off.")]")
|
||||||
. += text("<br>\n[(R.connected_ai ? "The AI link light is on." : "The AI link light is off.")]")
|
. += text("<br>\n[(R.connected_ai ? "The AI link light is on." : "The AI link light is off.")]")
|
||||||
. += text("<br>\n[((!isnull(R.camera) && R.camera.status == 1) ? "The Camera light is on." : "The Camera light is off.")]")
|
. += text("<br>\n[((!isnull(R.camera) && R.camera.status == 1) ? "The Camera light is on." : "The Camera light is off.")]")
|
||||||
. += text("<br>\n[(R.lockcharge ? "The lockdown light is on." : "The lockdown light is off.")]")
|
. += text("<br>\n[(R.lockdown ? "The lockdown light is on." : "The lockdown light is off.")]")
|
||||||
return .
|
return .
|
||||||
|
|
||||||
/datum/wires/robot/UpdateCut(var/index, var/mended)
|
/datum/wires/robot/UpdateCut(var/index, var/mended)
|
||||||
@@ -64,7 +64,7 @@ var/const/BORG_WIRE_CAMERA = 16
|
|||||||
R << "Your camera lense focuses loudly."
|
R << "Your camera lense focuses loudly."
|
||||||
|
|
||||||
if(BORG_WIRE_LOCKED_DOWN)
|
if(BORG_WIRE_LOCKED_DOWN)
|
||||||
R.SetLockdown(!R.lockcharge) // Toggle
|
R.SetLockdown(!R.lockdown) // Toggle
|
||||||
|
|
||||||
/datum/wires/robot/CanUse(var/mob/living/L)
|
/datum/wires/robot/CanUse(var/mob/living/L)
|
||||||
var/mob/living/silicon/robot/R = holder
|
var/mob/living/silicon/robot/R = holder
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
var/datum/antagonist/xenos/borer/borers
|
var/datum/antagonist/borer/borers
|
||||||
|
|
||||||
/datum/antagonist/xenos/borer
|
/datum/antagonist/borer
|
||||||
id = MODE_BORER
|
id = MODE_BORER
|
||||||
|
role_type = BE_ALIEN
|
||||||
role_text = "Cortical Borer"
|
role_text = "Cortical Borer"
|
||||||
role_text_plural = "Cortical Borers"
|
role_text_plural = "Cortical Borers"
|
||||||
mob_path = /mob/living/simple_animal/borer
|
mob_path = /mob/living/simple_animal/borer
|
||||||
@@ -10,6 +11,8 @@ var/datum/antagonist/xenos/borer/borers
|
|||||||
antag_indicator = "brainworm"
|
antag_indicator = "brainworm"
|
||||||
antaghud_indicator = "hudborer"
|
antaghud_indicator = "hudborer"
|
||||||
|
|
||||||
|
flags = ANTAG_OVERRIDE_MOB | ANTAG_RANDSPAWN | ANTAG_OVERRIDE_JOB | ANTAG_VOTABLE
|
||||||
|
|
||||||
faction_role_text = "Borer Thrall"
|
faction_role_text = "Borer Thrall"
|
||||||
faction_descriptor = "Unity"
|
faction_descriptor = "Unity"
|
||||||
faction_welcome = "You are now a thrall to a cortical borer. Please listen to what they have to say; they're in your head."
|
faction_welcome = "You are now a thrall to a cortical borer. Please listen to what they have to say; they're in your head."
|
||||||
@@ -17,21 +20,26 @@ var/datum/antagonist/xenos/borer/borers
|
|||||||
initial_spawn_req = 3
|
initial_spawn_req = 3
|
||||||
initial_spawn_target = 5
|
initial_spawn_target = 5
|
||||||
|
|
||||||
/datum/antagonist/xenos/borer/New()
|
spawn_announcement = "Unidentified lifesigns detected coming aboard the station. Secure any exterior access, including ducting and ventilation."
|
||||||
|
spawn_announcement_title = "Lifesign Alert"
|
||||||
|
spawn_announcement_sound = 'sound/AI/aliens.ogg'
|
||||||
|
spawn_announcement_delay = 5000
|
||||||
|
|
||||||
|
/datum/antagonist/borer/New()
|
||||||
..(1)
|
..(1)
|
||||||
borers = src
|
borers = src
|
||||||
|
|
||||||
/datum/antagonist/xenos/borer/get_extra_panel_options(var/datum/mind/player)
|
/datum/antagonist/xenos/borer/get_extra_panel_options(var/datum/mind/player)
|
||||||
return "<a href='?src=\ref[src];move_to_spawn=\ref[player.current]'>\[put in host\]</a>"
|
return "<a href='?src=\ref[src];move_to_spawn=\ref[player.current]'>\[put in host\]</a>"
|
||||||
|
|
||||||
/datum/antagonist/xenos/borer/create_objectives(var/datum/mind/player)
|
/datum/antagonist/borer/create_objectives(var/datum/mind/player)
|
||||||
if(!..())
|
if(!..())
|
||||||
return
|
return
|
||||||
player.objectives += new /datum/objective/borer_survive()
|
player.objectives += new /datum/objective/borer_survive()
|
||||||
player.objectives += new /datum/objective/borer_reproduce()
|
player.objectives += new /datum/objective/borer_reproduce()
|
||||||
player.objectives += new /datum/objective/escape()
|
player.objectives += new /datum/objective/escape()
|
||||||
|
|
||||||
/datum/antagonist/xenos/borer/place_mob(var/mob/living/mob)
|
/datum/antagonist/borer/place_mob(var/mob/living/mob)
|
||||||
var/mob/living/simple_animal/borer/borer = mob
|
var/mob/living/simple_animal/borer/borer = mob
|
||||||
if(istype(borer))
|
if(istype(borer))
|
||||||
var/mob/living/carbon/human/host
|
var/mob/living/carbon/human/host
|
||||||
@@ -51,4 +59,16 @@ var/datum/antagonist/xenos/borer/borers
|
|||||||
borer.host_brain.name = host.name
|
borer.host_brain.name = host.name
|
||||||
borer.host_brain.real_name = host.real_name
|
borer.host_brain.real_name = host.real_name
|
||||||
return
|
return
|
||||||
..() // Place them at a vent if they can't get a host.
|
// Place them at a vent if they can't get a host.
|
||||||
|
borer.forceMove(get_turf(pick(get_vents())))
|
||||||
|
|
||||||
|
/datum/antagonist/borer/attempt_random_spawn()
|
||||||
|
if(config.aliens_allowed) ..()
|
||||||
|
|
||||||
|
/datum/antagonist/borer/proc/get_vents()
|
||||||
|
var/list/vents = list()
|
||||||
|
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
|
||||||
|
if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in config.station_levels)
|
||||||
|
if(temp_vent.network.normal_members.len > 50)
|
||||||
|
vents += temp_vent
|
||||||
|
return vents
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
var/datum/antagonist/xenos/xenomorphs
|
|
||||||
|
|
||||||
/datum/antagonist/xenos
|
|
||||||
id = MODE_XENOMORPH
|
|
||||||
role_type = BE_ALIEN
|
|
||||||
role_text = "Xenomorph"
|
|
||||||
role_text_plural = "Xenomorphs"
|
|
||||||
mob_path = /mob/living/carbon/alien/larva
|
|
||||||
bantype = "Xenomorph"
|
|
||||||
flags = ANTAG_OVERRIDE_MOB | ANTAG_RANDSPAWN | ANTAG_OVERRIDE_JOB | ANTAG_VOTABLE
|
|
||||||
welcome_text = "Hiss! You are a larval alien. Hide and bide your time until you are ready to evolve."
|
|
||||||
antaghud_indicator = "hudalien"
|
|
||||||
|
|
||||||
hard_cap = 5
|
|
||||||
hard_cap_round = 8
|
|
||||||
initial_spawn_req = 4
|
|
||||||
initial_spawn_target = 6
|
|
||||||
|
|
||||||
spawn_announcement = "Unidentified lifesigns detected coming aboard the station. Secure any exterior access, including ducting and ventilation."
|
|
||||||
spawn_announcement_title = "Lifesign Alert"
|
|
||||||
spawn_announcement_sound = 'sound/AI/aliens.ogg'
|
|
||||||
spawn_announcement_delay = 5000
|
|
||||||
|
|
||||||
/datum/antagonist/xenos/New(var/no_reference)
|
|
||||||
..()
|
|
||||||
if(!no_reference)
|
|
||||||
xenomorphs = src
|
|
||||||
|
|
||||||
/datum/antagonist/xenos/attempt_random_spawn()
|
|
||||||
if(config.aliens_allowed) ..()
|
|
||||||
|
|
||||||
/datum/antagonist/xenos/proc/get_vents()
|
|
||||||
var/list/vents = list()
|
|
||||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
|
|
||||||
if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in config.station_levels)
|
|
||||||
if(temp_vent.network.normal_members.len > 50)
|
|
||||||
vents += temp_vent
|
|
||||||
return vents
|
|
||||||
|
|
||||||
/datum/antagonist/xenos/create_objectives(var/datum/mind/player)
|
|
||||||
if(!..())
|
|
||||||
return
|
|
||||||
player.objectives += new /datum/objective/survive()
|
|
||||||
player.objectives += new /datum/objective/escape()
|
|
||||||
|
|
||||||
/datum/antagonist/xenos/place_mob(var/mob/living/player)
|
|
||||||
player.forceMove(get_turf(pick(get_vents())))
|
|
||||||
@@ -27,13 +27,13 @@
|
|||||||
var/mob/M = player.current
|
var/mob/M = player.current
|
||||||
dat += "<tr>"
|
dat += "<tr>"
|
||||||
if(M)
|
if(M)
|
||||||
dat += "<td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>"
|
dat += "<td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]/([player.key])</a>"
|
||||||
if(!M.client) dat += " <i>(logged out)</i>"
|
if(!M.client) dat += " <i>(logged out)</i>"
|
||||||
if(M.stat == DEAD) dat += " <b><font color=red>(DEAD)</font></b>"
|
if(M.stat == DEAD) dat += " <b><font color=red>(DEAD)</font></b>"
|
||||||
dat += "</td>"
|
dat += "</td>"
|
||||||
dat += "<td>\[<A href='?src=\ref[caller];priv_msg=\ref[M]'>PM</A>\]\[<A href='?src=\ref[caller];traitor=\ref[M]'>TP</A>\]</td>"
|
dat += "<td>\[<A HREF='?src=\ref[caller];adminplayeropts=\ref[M]'>PP</A>]\[<A href='?src=\ref[caller];priv_msg=\ref[M]'>PM</A>\]\[<A href='?src=\ref[caller];traitor=\ref[M]'>TP</A>\]</td>"
|
||||||
else
|
else
|
||||||
dat += "<td><i>Mob not found!</i></td>"
|
dat += "<td>[player.key] <i>Mob not found!</i></td>"
|
||||||
dat += "</tr>"
|
dat += "</tr>"
|
||||||
dat += "</table>"
|
dat += "</table>"
|
||||||
|
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ var/datum/antagonist/raider/raiders
|
|||||||
else
|
else
|
||||||
win_type = "Minor"
|
win_type = "Minor"
|
||||||
win_group = "Crew"
|
win_group = "Crew"
|
||||||
//Now we modify that result by the state of the vox crew.
|
//Now we modify that result by the state of the crew.
|
||||||
if(antags_are_dead())
|
if(antags_are_dead())
|
||||||
win_type = "Major"
|
win_type = "Major"
|
||||||
win_group = "Crew"
|
win_group = "Crew"
|
||||||
@@ -198,9 +198,6 @@ var/datum/antagonist/raider/raiders
|
|||||||
if(!..())
|
if(!..())
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(player.species && player.species.get_bodytype() == "Vox")
|
|
||||||
equip_vox(player)
|
|
||||||
else
|
|
||||||
var/new_shoes = pick(raider_shoes)
|
var/new_shoes = pick(raider_shoes)
|
||||||
var/new_uniform = pick(raider_uniforms)
|
var/new_uniform = pick(raider_uniforms)
|
||||||
var/new_glasses = pick(raider_glasses)
|
var/new_glasses = pick(raider_glasses)
|
||||||
@@ -293,21 +290,3 @@ var/datum/antagonist/raider/raiders
|
|||||||
var/grenade_type = pick(grenades)
|
var/grenade_type = pick(grenades)
|
||||||
new grenade_type(ammobox)
|
new grenade_type(ammobox)
|
||||||
player.put_in_any_hand_if_possible(ammobox)
|
player.put_in_any_hand_if_possible(ammobox)
|
||||||
|
|
||||||
/datum/antagonist/raider/proc/equip_vox(var/mob/living/carbon/human/player)
|
|
||||||
|
|
||||||
var/uniform_type = pick(list(/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_casual))
|
|
||||||
|
|
||||||
player.equip_to_slot_or_del(new uniform_type(player), slot_w_uniform)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(player), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(player), slot_gloves) // AS ABOVE.
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat/vox(player), slot_wear_mask)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(player), slot_back)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/device/flashlight(player), slot_r_store)
|
|
||||||
|
|
||||||
player.internal = locate(/obj/item/weapon/tank) in player.contents
|
|
||||||
if(istype(player.internal,/obj/item/weapon/tank) && player.internals)
|
|
||||||
player.internals.icon_state = "internal1"
|
|
||||||
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|||||||
@@ -1397,6 +1397,10 @@ area/space/atmosalert()
|
|||||||
icon_state = "bar"
|
icon_state = "bar"
|
||||||
sound_env = LARGE_SOFTFLOOR
|
sound_env = LARGE_SOFTFLOOR
|
||||||
|
|
||||||
|
/area/crew_quarters/barrestroom
|
||||||
|
name = "\improper Bar Restroom"
|
||||||
|
icon_state = "bar"
|
||||||
|
|
||||||
/area/crew_quarters/theatre
|
/area/crew_quarters/theatre
|
||||||
name = "\improper Theatre"
|
name = "\improper Theatre"
|
||||||
icon_state = "Theatre"
|
icon_state = "Theatre"
|
||||||
@@ -1857,6 +1861,16 @@ area/space/atmosalert()
|
|||||||
name = "\improper Emergency Treatment Centre"
|
name = "\improper Emergency Treatment Centre"
|
||||||
icon_state = "exam_room"
|
icon_state = "exam_room"
|
||||||
|
|
||||||
|
/area/medical/first_aid_station_starboard
|
||||||
|
name = "\improper Starboard First-Aid Station"
|
||||||
|
icon_state = "medbay2"
|
||||||
|
|
||||||
|
/area/medical/first_aid_station
|
||||||
|
name = "\improper Port First-Aid Station"
|
||||||
|
icon_state = "medbay2"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Security
|
//Security
|
||||||
|
|
||||||
/area/security/main
|
/area/security/main
|
||||||
|
|||||||
@@ -29,6 +29,9 @@
|
|||||||
C.update_canmove()
|
C.update_canmove()
|
||||||
C.remove_changeling_powers()
|
C.remove_changeling_powers()
|
||||||
|
|
||||||
|
if(C.suiciding)
|
||||||
|
C.suiciding = 0
|
||||||
|
|
||||||
if(C.stat != DEAD)
|
if(C.stat != DEAD)
|
||||||
C.emote("deathgasp")
|
C.emote("deathgasp")
|
||||||
C.tod = worldtime2text()
|
C.tod = worldtime2text()
|
||||||
|
|||||||
@@ -22,8 +22,18 @@
|
|||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
||||||
if(!changeling) return 0
|
if(!changeling) return 0
|
||||||
changeling.chem_charges -= 20
|
|
||||||
|
|
||||||
|
if(is_muzzled())
|
||||||
|
src << "<span class='danger'>Mmmf mrrfff!</span>"
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(ishuman(src))
|
||||||
|
var/mob/living/carbon/human/H = src
|
||||||
|
if(H.silent)
|
||||||
|
src << "<span class='danger'>You can't speak!</span>"
|
||||||
|
return 0
|
||||||
|
|
||||||
|
changeling.chem_charges -= 20
|
||||||
var/range = 4
|
var/range = 4
|
||||||
if(src.mind.changeling.recursive_enhancement)
|
if(src.mind.changeling.recursive_enhancement)
|
||||||
range = range * 2
|
range = range * 2
|
||||||
@@ -33,13 +43,21 @@
|
|||||||
for(var/mob/living/M in range(range, src))
|
for(var/mob/living/M in range(range, src))
|
||||||
if(iscarbon(M))
|
if(iscarbon(M))
|
||||||
if(!M.mind || !M.mind.changeling)
|
if(!M.mind || !M.mind.changeling)
|
||||||
|
if(M.get_ear_protection() >= 2)
|
||||||
|
continue
|
||||||
|
M << "<span class='danger'>You hear an extremely loud screeching sound! It \
|
||||||
|
[pick("confuses","confounds","perturbs","befuddles","dazes","unsettles","disorients")] you.</span>"
|
||||||
M.adjustEarDamage(0,30)
|
M.adjustEarDamage(0,30)
|
||||||
M.confused += 20
|
M.confused += 20
|
||||||
|
M << sound('sound/effects/screech.ogg')
|
||||||
else
|
else
|
||||||
|
if(M != src)
|
||||||
|
M << "<span class='notice'>You hear a familiar screech from nearby. It has no effect on you.</span>"
|
||||||
M << sound('sound/effects/screech.ogg')
|
M << sound('sound/effects/screech.ogg')
|
||||||
|
|
||||||
if(issilicon(M))
|
if(issilicon(M))
|
||||||
M << sound('sound/weapons/flash.ogg')
|
M << sound('sound/weapons/flash.ogg')
|
||||||
|
M << "<span class='notice'>Auditory input overloaded. Reinitializing...</span>"
|
||||||
M.Weaken(rand(5,10))
|
M.Weaken(rand(5,10))
|
||||||
|
|
||||||
for(var/obj/machinery/light/L in range(range, src))
|
for(var/obj/machinery/light/L in range(range, src))
|
||||||
@@ -57,6 +75,17 @@
|
|||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
||||||
if(!changeling) return 0
|
if(!changeling) return 0
|
||||||
|
|
||||||
|
if(is_muzzled())
|
||||||
|
src << "<span class='danger'>Mmmf mrrfff!</span>"
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(ishuman(src))
|
||||||
|
var/mob/living/carbon/human/H = src
|
||||||
|
if(H.silent)
|
||||||
|
src << "<span class='danger'>You can't speak!</span>"
|
||||||
|
return 0
|
||||||
|
|
||||||
changeling.chem_charges -= 20
|
changeling.chem_charges -= 20
|
||||||
|
|
||||||
var/range_heavy = 2
|
var/range_heavy = 2
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
if(!changeling)
|
if(!changeling)
|
||||||
return 0
|
return 0
|
||||||
|
changeling.chem_charges -= 10
|
||||||
var/old_regen_rate = H.mind.changeling.chem_recharge_rate
|
var/old_regen_rate = H.mind.changeling.chem_recharge_rate
|
||||||
|
|
||||||
H << "<span class='notice'>We vanish from sight, and will remain hidden, so long as we move carefully.</span>"
|
H << "<span class='notice'>We vanish from sight, and will remain hidden, so long as we move carefully.</span>"
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
src << "<span class='notice'>We are now truly invisible.</span>"
|
src << "<span class='notice'>We are now truly invisible.</span>"
|
||||||
src.mind.changeling.recursive_enhancement = 0
|
src.mind.changeling.recursive_enhancement = 0
|
||||||
|
|
||||||
while(H.m_intent == "walk" && H.mind.changeling.cloaked) //This loop will keep going until the player uncloaks.
|
while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks.
|
||||||
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
|
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
|
||||||
old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time
|
old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time
|
||||||
mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding.
|
mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding.
|
||||||
|
|||||||
@@ -468,7 +468,8 @@ var/list/sacrificed = list()
|
|||||||
D.r_eyes = 200
|
D.r_eyes = 200
|
||||||
D.g_eyes = 200
|
D.g_eyes = 200
|
||||||
D.update_eyes()
|
D.update_eyes()
|
||||||
D.underwear = 0
|
D.underwear_top = 0
|
||||||
|
D.underwear_bottom = 0
|
||||||
D.key = ghost.key
|
D.key = ghost.key
|
||||||
cult.add_antagonist(D.mind)
|
cult.add_antagonist(D.mind)
|
||||||
|
|
||||||
|
|||||||
@@ -350,11 +350,6 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
|||||||
M << "<br>"
|
M << "<br>"
|
||||||
M.add_ion_law("THE STATION IS [who2pref] [who2]")
|
M.add_ion_law("THE STATION IS [who2pref] [who2]")
|
||||||
|
|
||||||
if(botEmagChance)
|
|
||||||
for(var/obj/machinery/bot/bot in machines)
|
|
||||||
if(prob(botEmagChance))
|
|
||||||
bot.emag_act(1)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
var/apcnum = 0
|
var/apcnum = 0
|
||||||
|
|||||||
@@ -254,13 +254,13 @@ var/global/list/additional_antag_types = list()
|
|||||||
"suspected criminal operatives",
|
"suspected criminal operatives",
|
||||||
"malfunctioning von Neumann probe swarms",
|
"malfunctioning von Neumann probe swarms",
|
||||||
"shadowy interlopers",
|
"shadowy interlopers",
|
||||||
"a stranded Vox arkship",
|
"a stranded alien arkship",
|
||||||
"haywire IPC constructs",
|
"haywire IPC constructs",
|
||||||
"rogue Unathi exiles",
|
"rogue Unathi exiles",
|
||||||
"artifacts of eldritch horror",
|
"artifacts of eldritch horror",
|
||||||
"a brain slug infestation",
|
"a brain slug infestation",
|
||||||
"killer bugs that lay eggs in the husks of the living",
|
"killer bugs that lay eggs in the husks of the living",
|
||||||
"a deserted transport carrying xenomorph specimens",
|
"a deserted transport carrying alien specimens",
|
||||||
"an emissary for the gestalt requesting a security detail",
|
"an emissary for the gestalt requesting a security detail",
|
||||||
"a Tajaran slave rebellion",
|
"a Tajaran slave rebellion",
|
||||||
"radical Skrellian transevolutionaries",
|
"radical Skrellian transevolutionaries",
|
||||||
|
|||||||
@@ -418,9 +418,9 @@ var/global/datum/controller/gameticker/ticker
|
|||||||
|
|
||||||
if (!robo.connected_ai)
|
if (!robo.connected_ai)
|
||||||
if (robo.stat != 2)
|
if (robo.stat != 2)
|
||||||
world << "<b>[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:</b>"
|
world << "<b>[robo.name] (Played by: [robo.key]) survived as an AI-less synthetic! Its laws were:</b>"
|
||||||
else
|
else
|
||||||
world << "<b>[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:</b>"
|
world << "<b>[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a synthetic without an AI. Its laws were:</b>"
|
||||||
|
|
||||||
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
|
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
|
||||||
robo.laws.show_laws(world)
|
robo.laws.show_laws(world)
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
/datum/game_mode/bughunt
|
|
||||||
name = "Bughunt"
|
|
||||||
round_description = "A mercenary strike force is approaching the station to eradicate a xenomorph infestation!"
|
|
||||||
extended_round_description = "Mercenaries and xenomorphs spawn in this game mode."
|
|
||||||
config_tag = "bughunt"
|
|
||||||
required_players = 15
|
|
||||||
required_players_secret = 25
|
|
||||||
required_enemies = 1
|
|
||||||
end_on_antag_death = 1
|
|
||||||
antag_tags = list(MODE_XENOMORPH, MODE_DEATHSQUAD)
|
|
||||||
auto_recall_shuttle = 1
|
|
||||||
ert_disabled = 1
|
|
||||||
require_all_templates = 1
|
|
||||||
votable = 0
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
/datum/game_mode/infestation
|
/datum/game_mode/infestation
|
||||||
name = "infestation"
|
name = "infestation"
|
||||||
round_description = "There's something in the walls!"
|
round_description = "There's something in the walls!"
|
||||||
extended_round_description = "Two alien antagonists (Xenomorphs, Cortical Borers or Changelings) may spawn during this round."
|
extended_round_description = "Two alien antagonists (Cortical Borers or Changelings) spawn during this round."
|
||||||
config_tag = "infestation"
|
config_tag = "infestation"
|
||||||
required_players = 15
|
required_players = 15
|
||||||
required_enemies = 5
|
required_enemies = 5
|
||||||
end_on_antag_death = 1
|
end_on_antag_death = 1
|
||||||
antag_tags = list(MODE_BORER, MODE_XENOMORPH, MODE_CHANGELING)
|
antag_tags = list(MODE_BORER, MODE_CHANGELING)
|
||||||
require_all_templates = 1
|
require_all_templates = 1
|
||||||
votable = 0
|
votable = 0
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ var/list/nuke_disks = list()
|
|||||||
|
|
||||||
/datum/game_mode/nuclear/declare_completion()
|
/datum/game_mode/nuclear/declare_completion()
|
||||||
if(config.objectives_disabled)
|
if(config.objectives_disabled)
|
||||||
|
..()
|
||||||
return
|
return
|
||||||
var/disk_rescued = 1
|
var/disk_rescued = 1
|
||||||
for(var/obj/item/weapon/disk/nuclear/D in world)
|
for(var/obj/item/weapon/disk/nuclear/D in world)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
config_tag = "revolution"
|
config_tag = "revolution"
|
||||||
round_description = "Some crewmembers are attempting to start a revolution!"
|
round_description = "Some crewmembers are attempting to start a revolution!"
|
||||||
extended_round_description = "Revolutionaries - Remove the heads of staff from power. Convert other crewmembers to your cause using the 'Convert Bourgeoise' verb. Protect your leaders."
|
extended_round_description = "Revolutionaries - Remove the heads of staff from power. Convert other crewmembers to your cause using the 'Convert Bourgeoise' verb. Protect your leaders."
|
||||||
required_players = 4
|
required_players = 15
|
||||||
required_players_secret = 15
|
required_players_secret = 15
|
||||||
required_enemies = 3
|
required_enemies = 3
|
||||||
auto_recall_shuttle = 0 //NO THANKS
|
auto_recall_shuttle = 0 //NO THANKS
|
||||||
|
|||||||
@@ -138,8 +138,6 @@ datum/hSB
|
|||||||
continue
|
continue
|
||||||
if(istype(O, /obj/item/device/camera))
|
if(istype(O, /obj/item/device/camera))
|
||||||
continue
|
continue
|
||||||
if(istype(O, /obj/item/weapon/cloaking_device))
|
|
||||||
continue
|
|
||||||
if(istype(O, /obj/item/weapon/dummy))
|
if(istype(O, /obj/item/weapon/dummy))
|
||||||
continue
|
continue
|
||||||
if(istype(O, /obj/item/weapon/melee/energy/sword))
|
if(istype(O, /obj/item/weapon/melee/energy/sword))
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
|
var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
|
||||||
var/department = null // Does this position have a department tag?
|
var/department = null // Does this position have a department tag?
|
||||||
var/head_position = 0 // Is this position Command?
|
var/head_position = 0 // Is this position Command?
|
||||||
var/minimum_character_age = 17
|
var/minimum_character_age = 0
|
||||||
var/ideal_character_age = 30
|
var/ideal_character_age = 30
|
||||||
|
|
||||||
var/account_allowed = 1 // Does this job type come with a station account?
|
var/account_allowed = 1 // Does this job type come with a station account?
|
||||||
|
|||||||
@@ -256,7 +256,7 @@
|
|||||||
var/list/occupant_data = list(
|
var/list/occupant_data = list(
|
||||||
"stationtime" = worldtime2text(),
|
"stationtime" = worldtime2text(),
|
||||||
"stat" = H.stat,
|
"stat" = H.stat,
|
||||||
"health" = H.health,
|
"health" = round(H.health/H.maxHealth)*100,
|
||||||
"virus_present" = H.virus2.len,
|
"virus_present" = H.virus2.len,
|
||||||
"bruteloss" = H.getBruteLoss(),
|
"bruteloss" = H.getBruteLoss(),
|
||||||
"fireloss" = H.getFireLoss(),
|
"fireloss" = H.getFireLoss(),
|
||||||
@@ -273,7 +273,7 @@
|
|||||||
"stoxin_amount" = H.reagents.get_reagent_amount("stoxin"),
|
"stoxin_amount" = H.reagents.get_reagent_amount("stoxin"),
|
||||||
"bicaridine_amount" = H.reagents.get_reagent_amount("bicaridine"),
|
"bicaridine_amount" = H.reagents.get_reagent_amount("bicaridine"),
|
||||||
"dermaline_amount" = H.reagents.get_reagent_amount("dermaline"),
|
"dermaline_amount" = H.reagents.get_reagent_amount("dermaline"),
|
||||||
"blood_amount" = H.vessel.get_reagent_amount("blood"),
|
"blood_amount" = round((H.vessel.get_reagent_amount("blood") / H.species.blood_volume)*100),
|
||||||
"disabilities" = H.sdisabilities,
|
"disabilities" = H.sdisabilities,
|
||||||
"lung_ruptured" = H.is_lung_ruptured(),
|
"lung_ruptured" = H.is_lung_ruptured(),
|
||||||
"external_organs" = H.organs.Copy(),
|
"external_organs" = H.organs.Copy(),
|
||||||
@@ -311,7 +311,7 @@
|
|||||||
if(occ["borer_present"])
|
if(occ["borer_present"])
|
||||||
dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.<br>"
|
dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.<br>"
|
||||||
|
|
||||||
dat += text("[]\tBlood Level %: [] ([] units)</FONT><BR>", ("<font color='[occ["blood_amount"] > 448 ? "blue" : "red"]'>"), occ["blood_amount"]*100 / 560, occ["blood_amount"])
|
dat += text("[]\tBlood Level %: [] ([] units)</FONT><BR>", ("<font color='[occ["blood_amount"] > 80 ? "blue" : "red"]'>"), occ["blood_amount"], occ["blood_amount"])
|
||||||
|
|
||||||
dat += text("Inaprovaline: [] units<BR>", occ["inaprovaline_amount"])
|
dat += text("Inaprovaline: [] units<BR>", occ["inaprovaline_amount"])
|
||||||
dat += text("Soporific: [] units<BR>", occ["stoxin_amount"])
|
dat += text("Soporific: [] units<BR>", occ["stoxin_amount"])
|
||||||
|
|||||||
@@ -311,6 +311,17 @@
|
|||||||
path = /obj/item/weapon/camera_assembly
|
path = /obj/item/weapon/camera_assembly
|
||||||
category = "Engineering"
|
category = "Engineering"
|
||||||
|
|
||||||
|
/datum/autolathe/recipe/weldinggoggles
|
||||||
|
name = "welding goggles"
|
||||||
|
path = /obj/item/clothing/glasses/welding
|
||||||
|
category = "General"
|
||||||
|
|
||||||
|
/datum/autolathe/recipe/maglight
|
||||||
|
name = "maglight"
|
||||||
|
path = /obj/item/device/flashlight/maglight
|
||||||
|
hidden = 1
|
||||||
|
category = "General"
|
||||||
|
|
||||||
/datum/autolathe/recipe/flamethrower
|
/datum/autolathe/recipe/flamethrower
|
||||||
name = "flamethrower"
|
name = "flamethrower"
|
||||||
path = /obj/item/weapon/flamethrower/full
|
path = /obj/item/weapon/flamethrower/full
|
||||||
|
|||||||
@@ -1,209 +0,0 @@
|
|||||||
// AI (i.e. game AI, not the AI player) controlled bots
|
|
||||||
|
|
||||||
/obj/machinery/bot
|
|
||||||
icon = 'icons/obj/aibots.dmi'
|
|
||||||
layer = MOB_LAYER
|
|
||||||
light_range = 3
|
|
||||||
use_power = 0
|
|
||||||
var/obj/item/weapon/card/id/botcard // the ID card that the bot "holds"
|
|
||||||
var/on = 1
|
|
||||||
var/health = 0 //do not forget to set health for your bot!
|
|
||||||
var/maxhealth = 0
|
|
||||||
var/fire_dam_coeff = 1.0
|
|
||||||
var/brute_dam_coeff = 1.0
|
|
||||||
var/open = 0//Maint panel
|
|
||||||
var/locked = 1
|
|
||||||
//var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
|
|
||||||
|
|
||||||
/obj/machinery/bot/proc/turn_on()
|
|
||||||
if(stat) return 0
|
|
||||||
on = 1
|
|
||||||
set_light(initial(light_range))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/obj/machinery/bot/proc/turn_off()
|
|
||||||
on = 0
|
|
||||||
set_light(0)
|
|
||||||
|
|
||||||
/obj/machinery/bot/proc/explode()
|
|
||||||
qdel(src)
|
|
||||||
|
|
||||||
/obj/machinery/bot/proc/healthcheck()
|
|
||||||
if (src.health <= 0)
|
|
||||||
src.explode()
|
|
||||||
|
|
||||||
/obj/machinery/bot/emag_act(var/remaining_charges, var/user)
|
|
||||||
if(locked && !emagged)
|
|
||||||
locked = 0
|
|
||||||
emagged = 1
|
|
||||||
user << "<span class='warning'>You short out [src]'s maintenance hatch lock.</span>"
|
|
||||||
log_and_message_admins("emagged [src]'s maintenance hatch lock")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if(!locked && open && emagged == 1)
|
|
||||||
emagged = 2
|
|
||||||
log_and_message_admins("emagged [src]'s inner circuits")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/obj/machinery/bot/examine(mob/user)
|
|
||||||
..(user)
|
|
||||||
if (src.health < maxhealth)
|
|
||||||
if (src.health > maxhealth/3)
|
|
||||||
user << "<span class='warning'>[src]'s parts look loose.</span>"
|
|
||||||
else
|
|
||||||
user << "<span class='danger'>[src]'s parts look very loose!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/machinery/bot/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
||||||
if(istype(W, /obj/item/weapon/screwdriver))
|
|
||||||
if(!locked)
|
|
||||||
open = !open
|
|
||||||
user << "<span class='notice'>Maintenance panel is now [src.open ? "opened" : "closed"].</span>"
|
|
||||||
else if(istype(W, /obj/item/weapon/weldingtool))
|
|
||||||
if(health < maxhealth)
|
|
||||||
if(open)
|
|
||||||
health = min(maxhealth, health+10)
|
|
||||||
user.visible_message("<span class='warning'>[user] repairs [src]!</span>","<span class='notice'>You repair [src]!</span>")
|
|
||||||
else
|
|
||||||
user << "<span class='notice'>Unable to repair with the maintenance panel closed.</span>"
|
|
||||||
else
|
|
||||||
user << "<span class='notice'>[src] does not need a repair.</span>"
|
|
||||||
else
|
|
||||||
if(hasvar(W,"force") && hasvar(W,"damtype"))
|
|
||||||
switch(W.damtype)
|
|
||||||
if("fire")
|
|
||||||
src.health -= W.force * fire_dam_coeff
|
|
||||||
if("brute")
|
|
||||||
src.health -= W.force * brute_dam_coeff
|
|
||||||
..()
|
|
||||||
healthcheck()
|
|
||||||
else
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/machinery/bot/bullet_act(var/obj/item/projectile/Proj)
|
|
||||||
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
|
||||||
return
|
|
||||||
health -= Proj.damage
|
|
||||||
..()
|
|
||||||
healthcheck()
|
|
||||||
|
|
||||||
/obj/machinery/bot/ex_act(severity)
|
|
||||||
switch(severity)
|
|
||||||
if(1.0)
|
|
||||||
src.explode()
|
|
||||||
return
|
|
||||||
if(2.0)
|
|
||||||
src.health -= rand(5,10)*fire_dam_coeff
|
|
||||||
src.health -= rand(10,20)*brute_dam_coeff
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
if(3.0)
|
|
||||||
if (prob(50))
|
|
||||||
src.health -= rand(1,5)*fire_dam_coeff
|
|
||||||
src.health -= rand(1,5)*brute_dam_coeff
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/machinery/bot/emp_act(severity)
|
|
||||||
var/was_on = on
|
|
||||||
stat |= EMPED
|
|
||||||
var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc )
|
|
||||||
pulse2.icon = 'icons/effects/effects.dmi'
|
|
||||||
pulse2.icon_state = "empdisable"
|
|
||||||
pulse2.name = "emp sparks"
|
|
||||||
pulse2.anchored = 1
|
|
||||||
pulse2.set_dir(pick(cardinal))
|
|
||||||
|
|
||||||
spawn(10)
|
|
||||||
qdel(pulse2)
|
|
||||||
if (on)
|
|
||||||
turn_off()
|
|
||||||
spawn(severity*300)
|
|
||||||
stat &= ~EMPED
|
|
||||||
if (was_on)
|
|
||||||
turn_on()
|
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/bot/attack_ai(mob/user as mob)
|
|
||||||
src.attack_hand(user)
|
|
||||||
|
|
||||||
/obj/machinery/bot/attack_hand(var/mob/living/carbon/human/user)
|
|
||||||
|
|
||||||
if(!istype(user))
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
if(user.species.can_shred(user))
|
|
||||||
src.health -= rand(15,30)*brute_dam_coeff
|
|
||||||
src.visible_message("<span class='danger'>[user] has slashed [src]!</span>")
|
|
||||||
playsound(src.loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
|
||||||
if(prob(10))
|
|
||||||
new /obj/effect/decal/cleanable/blood/oil(src.loc)
|
|
||||||
healthcheck()
|
|
||||||
|
|
||||||
/******************************************************************/
|
|
||||||
// Navigation procs
|
|
||||||
// Used for A-star pathfinding
|
|
||||||
|
|
||||||
|
|
||||||
// Returns the surrounding cardinal turfs with open links
|
|
||||||
// Including through doors openable with the ID
|
|
||||||
/turf/proc/CardinalTurfsWithAccess(var/obj/item/weapon/card/id/ID)
|
|
||||||
var/L[] = new()
|
|
||||||
|
|
||||||
// for(var/turf/simulated/t in oview(src,1))
|
|
||||||
|
|
||||||
for(var/d in cardinal)
|
|
||||||
var/turf/simulated/T = get_step(src, d)
|
|
||||||
if(istype(T) && !T.density)
|
|
||||||
if(!LinkBlockedWithAccess(src, T, ID))
|
|
||||||
L.Add(T)
|
|
||||||
return L
|
|
||||||
|
|
||||||
|
|
||||||
// Returns true if a link between A and B is blocked
|
|
||||||
// Movement through doors allowed if ID has access
|
|
||||||
/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/weapon/card/id/ID)
|
|
||||||
|
|
||||||
if(A == null || B == null) return 1
|
|
||||||
var/adir = get_dir(A,B)
|
|
||||||
var/rdir = get_dir(B,A)
|
|
||||||
if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal
|
|
||||||
var/iStep = get_step(A,adir&(NORTH|SOUTH))
|
|
||||||
if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
var/pStep = get_step(A,adir&(EAST|WEST))
|
|
||||||
if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID))
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if(DirBlockedWithAccess(A,adir, ID))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if(DirBlockedWithAccess(B,rdir, ID))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
for(var/obj/O in B)
|
|
||||||
if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
// Returns true if direction is blocked from loc
|
|
||||||
// Checks doors against access with given ID
|
|
||||||
/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/weapon/card/id/ID)
|
|
||||||
for(var/obj/structure/window/D in loc)
|
|
||||||
if(!D.density) continue
|
|
||||||
if(D.dir == SOUTHWEST) return 1
|
|
||||||
if(D.dir == dir) return 1
|
|
||||||
|
|
||||||
for(var/obj/machinery/door/D in loc)
|
|
||||||
if(!D.density) continue
|
|
||||||
if(istype(D, /obj/machinery/door/window))
|
|
||||||
if( dir & D.dir ) return !D.check_access(ID)
|
|
||||||
|
|
||||||
//if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID)
|
|
||||||
//if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID)
|
|
||||||
else return !D.check_access(ID) // it's a real, air blocking door
|
|
||||||
return 0
|
|
||||||
@@ -1,887 +0,0 @@
|
|||||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
|
||||||
|
|
||||||
// Mulebot - carries crates around for Quartermaster
|
|
||||||
// Navigates via floor navbeacons
|
|
||||||
// Remote Controlled from QM's PDA
|
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot
|
|
||||||
name = "Mulebot"
|
|
||||||
desc = "A Multiple Utility Load Effector bot."
|
|
||||||
icon_state = "mulebot0"
|
|
||||||
layer = MOB_LAYER
|
|
||||||
density = 1
|
|
||||||
anchored = 1
|
|
||||||
animate_movement=1
|
|
||||||
health = 150 //yeah, it's tougher than ed209 because it is a big metal box with wheels --rastaf0
|
|
||||||
maxhealth = 150
|
|
||||||
fire_dam_coeff = 0.7
|
|
||||||
brute_dam_coeff = 0.5
|
|
||||||
var/atom/movable/load = null // the loaded crate (usually)
|
|
||||||
var/beacon_freq = 1400
|
|
||||||
var/control_freq = BOT_FREQ
|
|
||||||
|
|
||||||
suffix = ""
|
|
||||||
|
|
||||||
var/turf/target // this is turf to navigate to (location of beacon)
|
|
||||||
var/loaddir = 0 // this the direction to unload onto/load from
|
|
||||||
var/new_destination = "" // pending new destination (waiting for beacon response)
|
|
||||||
var/destination = "" // destination description
|
|
||||||
var/home_destination = "" // tag of home beacon
|
|
||||||
req_access = list(access_cargo) // added robotics access so assembly line drop-off works properly -veyveyr //I don't think so, Tim. You need to add it to the MULE's hidden robot ID card. -NEO
|
|
||||||
var/path[] = new()
|
|
||||||
|
|
||||||
var/mode = 0 //0 = idle/ready
|
|
||||||
//1 = loading/unloading
|
|
||||||
//2 = moving to deliver
|
|
||||||
//3 = returning to home
|
|
||||||
//4 = blocked
|
|
||||||
//5 = computing navigation
|
|
||||||
//6 = waiting for nav computation
|
|
||||||
//7 = no destination beacon found (or no route)
|
|
||||||
|
|
||||||
var/blockcount = 0 //number of times retried a blocked path
|
|
||||||
var/reached_target = 1 //true if already reached the target
|
|
||||||
|
|
||||||
var/refresh = 1 // true to refresh dialogue
|
|
||||||
var/auto_return = 1 // true if auto return to home beacon after unload
|
|
||||||
var/auto_pickup = 1 // true if auto-pickup at beacon
|
|
||||||
|
|
||||||
var/obj/item/weapon/cell/cell
|
|
||||||
// the installed power cell
|
|
||||||
|
|
||||||
// constants for internal wiring bitflags
|
|
||||||
var/datum/wires/mulebot/wires = null
|
|
||||||
|
|
||||||
var/bloodiness = 0 // count of bloodiness
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/New()
|
|
||||||
..()
|
|
||||||
wires = new(src)
|
|
||||||
botcard = new(src)
|
|
||||||
botcard.access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
|
|
||||||
cell = new(src)
|
|
||||||
cell.charge = 2000
|
|
||||||
cell.maxcharge = 2000
|
|
||||||
|
|
||||||
spawn(5) // must wait for map loading to finish
|
|
||||||
if(radio_controller)
|
|
||||||
radio_controller.add_object(src, control_freq, filter = RADIO_MULEBOT)
|
|
||||||
radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS)
|
|
||||||
|
|
||||||
var/count = 0
|
|
||||||
for(var/obj/machinery/bot/mulebot/other in world)
|
|
||||||
count++
|
|
||||||
if(!suffix)
|
|
||||||
suffix = "#[count]"
|
|
||||||
name = "Mulebot ([suffix])"
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/Destroy()
|
|
||||||
unload(0)
|
|
||||||
qdel(wires)
|
|
||||||
wires = null
|
|
||||||
if(radio_controller)
|
|
||||||
radio_controller.remove_object(src,beacon_freq)
|
|
||||||
radio_controller.remove_object(src,control_freq)
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
// attack by item
|
|
||||||
// emag : lock/unlock,
|
|
||||||
// screwdriver: open/close hatch
|
|
||||||
// cell: insert it
|
|
||||||
// other: chance to knock rider off bot
|
|
||||||
/obj/machinery/bot/mulebot/attackby(var/obj/item/I, var/mob/user)
|
|
||||||
if(istype(I,/obj/item/weapon/cell) && open && !cell)
|
|
||||||
var/obj/item/weapon/cell/C = I
|
|
||||||
user.drop_item()
|
|
||||||
C.loc = src
|
|
||||||
cell = C
|
|
||||||
updateDialog()
|
|
||||||
else if(istype(I,/obj/item/weapon/screwdriver))
|
|
||||||
if(locked)
|
|
||||||
user << "<span class='notice'>The maintenance hatch cannot be opened or closed while the controls are locked.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
open = !open
|
|
||||||
if(open)
|
|
||||||
src.visible_message("[user] opens the maintenance hatch of [src]", "<span class='notice'>You open [src]'s maintenance hatch.</span>")
|
|
||||||
on = 0
|
|
||||||
icon_state="mulebot-hatch"
|
|
||||||
else
|
|
||||||
src.visible_message("[user] closes the maintenance hatch of [src]", "<span class='notice'>You close [src]'s maintenance hatch.</span>")
|
|
||||||
icon_state = "mulebot0"
|
|
||||||
|
|
||||||
updateDialog()
|
|
||||||
else if (istype(I, /obj/item/weapon/wrench))
|
|
||||||
if (src.health < maxhealth)
|
|
||||||
src.health = min(maxhealth, src.health+25)
|
|
||||||
user.visible_message(
|
|
||||||
"<span class='notice'>\The [user] repairs \the [src]!</span>",
|
|
||||||
"<span class='notice'>You repair \the [src]!</span>"
|
|
||||||
)
|
|
||||||
else
|
|
||||||
user << "<span class='notice'>[src] does not need a repair!</span>"
|
|
||||||
else if(load && ismob(load)) // chance to knock off rider
|
|
||||||
if(prob(1+I.force * 2))
|
|
||||||
unload(0)
|
|
||||||
user.visible_message("<span class='warning'>[user] knocks [load] off [src] with \the [I]!</span>", "<span class='warning'>You knock [load] off [src] with \the [I]!</span>")
|
|
||||||
else
|
|
||||||
user << "You hit [src] with \the [I] but to no effect."
|
|
||||||
else
|
|
||||||
..()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/emag_act(var/remaining_charges, var/user)
|
|
||||||
locked = !locked
|
|
||||||
user << "<span class='notice'>You [locked ? "lock" : "unlock"] the mulebot's controls!</span>"
|
|
||||||
flick("mulebot-emagged", src)
|
|
||||||
playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 0)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/ex_act(var/severity)
|
|
||||||
unload(0)
|
|
||||||
switch(severity)
|
|
||||||
if(2)
|
|
||||||
BITRESET(wires, rand(0,9))
|
|
||||||
BITRESET(wires, rand(0,9))
|
|
||||||
BITRESET(wires, rand(0,9))
|
|
||||||
if(3)
|
|
||||||
BITRESET(wires, rand(0,9))
|
|
||||||
..()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/bullet_act()
|
|
||||||
if(prob(50) && !isnull(load))
|
|
||||||
unload(0)
|
|
||||||
if(prob(25))
|
|
||||||
src.visible_message("<span class='warning'>Something shorts out inside [src]!</span>")
|
|
||||||
var/index = 1<< (rand(0,9))
|
|
||||||
if(wires & index)
|
|
||||||
wires &= ~index
|
|
||||||
else
|
|
||||||
wires |= index
|
|
||||||
..()
|
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/attack_ai(var/mob/user)
|
|
||||||
user.set_machine(src)
|
|
||||||
interact(user, 1)
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/attack_hand(var/mob/user)
|
|
||||||
. = ..()
|
|
||||||
if (.)
|
|
||||||
return
|
|
||||||
user.set_machine(src)
|
|
||||||
interact(user, 0)
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/interact(var/mob/user, var/ai=0)
|
|
||||||
var/dat
|
|
||||||
dat += "<TT><B>Multiple Utility Load Effector Mk. III</B></TT><BR><BR>"
|
|
||||||
dat += "ID: [suffix]<BR>"
|
|
||||||
dat += "Power: [on ? "On" : "Off"]<BR>"
|
|
||||||
|
|
||||||
if(!open)
|
|
||||||
|
|
||||||
dat += "Status: "
|
|
||||||
switch(mode)
|
|
||||||
if(0)
|
|
||||||
dat += "Ready"
|
|
||||||
if(1)
|
|
||||||
dat += "Loading/Unloading"
|
|
||||||
if(2)
|
|
||||||
dat += "Navigating to Delivery Location"
|
|
||||||
if(3)
|
|
||||||
dat += "Navigating to Home"
|
|
||||||
if(4)
|
|
||||||
dat += "Waiting for clear path"
|
|
||||||
if(5,6)
|
|
||||||
dat += "Calculating navigation path"
|
|
||||||
if(7)
|
|
||||||
dat += "Unable to locate destination"
|
|
||||||
|
|
||||||
|
|
||||||
dat += "<BR>Current Load: [load ? load.name : "<i>none</i>"]<BR>"
|
|
||||||
dat += "Destination: [!destination ? "<i>none</i>" : destination]<BR>"
|
|
||||||
dat += "Power level: [cell ? cell.percent() : 0]%<BR>"
|
|
||||||
|
|
||||||
if(locked && !ai)
|
|
||||||
dat += "<HR>Controls are locked <A href='byond://?src=\ref[src];op=unlock'><I>(unlock)</I></A>"
|
|
||||||
else
|
|
||||||
dat += "<HR>Controls are unlocked <A href='byond://?src=\ref[src];op=lock'><I>(lock)</I></A><BR><BR>"
|
|
||||||
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=power'>Toggle Power</A><BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=stop'>Stop</A><BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=go'>Proceed</A><BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=home'>Return to Home</A><BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=destination'>Set Destination</A><BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=setid'>Set Bot ID</A><BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=sethome'>Set Home</A><BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=autoret'>Toggle Auto Return Home</A> ([auto_return ? "On":"Off"])<BR>"
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=autopick'>Toggle Auto Pickup Crate</A> ([auto_pickup ? "On":"Off"])<BR>"
|
|
||||||
|
|
||||||
if(load)
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=unload'>Unload Now</A><BR>"
|
|
||||||
dat += "<HR>The maintenance hatch is closed.<BR>"
|
|
||||||
|
|
||||||
else
|
|
||||||
if(!ai)
|
|
||||||
dat += "The maintenance hatch is open.<BR><BR>"
|
|
||||||
dat += "Power cell: "
|
|
||||||
if(cell)
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=cellremove'>Installed</A><BR>"
|
|
||||||
else
|
|
||||||
dat += "<A href='byond://?src=\ref[src];op=cellinsert'>Removed</A><BR>"
|
|
||||||
|
|
||||||
dat += wires.GetInteractWindow()
|
|
||||||
else
|
|
||||||
dat += "The bot is in maintenance mode and cannot be controlled.<BR>"
|
|
||||||
|
|
||||||
user << browse("<HEAD><TITLE>Mulebot [suffix ? "([suffix])" : ""]</TITLE></HEAD>[dat]", "window=mulebot;size=350x500")
|
|
||||||
onclose(user, "mulebot")
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/Topic(href, href_list)
|
|
||||||
if(..())
|
|
||||||
return
|
|
||||||
if (usr.stat)
|
|
||||||
return
|
|
||||||
if ((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
|
|
||||||
usr.set_machine(src)
|
|
||||||
|
|
||||||
switch(href_list["op"])
|
|
||||||
if("lock", "unlock")
|
|
||||||
if(src.allowed(usr))
|
|
||||||
locked = !locked
|
|
||||||
updateDialog()
|
|
||||||
else
|
|
||||||
usr << "<span class='warning'>Access denied.</span>"
|
|
||||||
return
|
|
||||||
if("power")
|
|
||||||
if (src.on)
|
|
||||||
turn_off()
|
|
||||||
else if (cell && !open)
|
|
||||||
if (!turn_on())
|
|
||||||
usr << "<span class='warning'>You can't switch on [src].</span>"
|
|
||||||
return
|
|
||||||
else
|
|
||||||
return
|
|
||||||
visible_message("[usr] switches [on ? "on" : "off"] [src].")
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
|
|
||||||
if("cellremove")
|
|
||||||
if(open && cell && !usr.get_active_hand())
|
|
||||||
cell.update_icon()
|
|
||||||
usr.put_in_active_hand(cell)
|
|
||||||
cell.add_fingerprint(usr)
|
|
||||||
cell = null
|
|
||||||
|
|
||||||
usr.visible_message("<span class='notice'>[usr] removes the power cell from [src].</span>", "<span class='notice'>You remove the power cell from [src].</span>")
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
if("cellinsert")
|
|
||||||
if(open && !cell)
|
|
||||||
var/obj/item/weapon/cell/C = usr.get_active_hand()
|
|
||||||
if(istype(C))
|
|
||||||
usr.drop_item()
|
|
||||||
cell = C
|
|
||||||
C.loc = src
|
|
||||||
C.add_fingerprint(usr)
|
|
||||||
|
|
||||||
usr.visible_message("<span class='notice'>[usr] inserts a power cell into [src].</span>", "<span class='notice'>You insert the power cell into [src].</span>")
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
|
|
||||||
if("stop")
|
|
||||||
if(mode >=2)
|
|
||||||
mode = 0
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
if("go")
|
|
||||||
if(mode == 0)
|
|
||||||
start()
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
if("home")
|
|
||||||
if(mode == 0 || mode == 2)
|
|
||||||
start_home()
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
if("destination")
|
|
||||||
refresh=0
|
|
||||||
var/new_dest
|
|
||||||
var/list/beaconlist = new()
|
|
||||||
for(var/obj/machinery/navbeacon/N in navbeacons)
|
|
||||||
beaconlist.Add(N.location)
|
|
||||||
if(beaconlist.len)
|
|
||||||
new_dest = input("Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", destination) in beaconlist
|
|
||||||
else
|
|
||||||
alert("No destination beacons available.")
|
|
||||||
refresh=1
|
|
||||||
if(new_dest)
|
|
||||||
set_destination(new_dest)
|
|
||||||
|
|
||||||
|
|
||||||
if("setid")
|
|
||||||
refresh=0
|
|
||||||
var/new_id = sanitize(input("Enter new bot ID", "Mulebot [suffix ? "([suffix])" : ""]", suffix) as text|null, MAX_NAME_LEN)
|
|
||||||
refresh=1
|
|
||||||
if(new_id)
|
|
||||||
suffix = new_id
|
|
||||||
name = "Mulebot ([suffix])"
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
if("sethome")
|
|
||||||
refresh=0
|
|
||||||
var/new_home = input("Enter new home tag", "Mulebot [suffix ? "([suffix])" : ""]", home_destination) as text|null
|
|
||||||
refresh=1
|
|
||||||
if(new_home)
|
|
||||||
home_destination = new_home
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
if("unload")
|
|
||||||
if(load && mode !=1)
|
|
||||||
if(loc == target)
|
|
||||||
unload(loaddir)
|
|
||||||
else
|
|
||||||
unload(0)
|
|
||||||
|
|
||||||
if("autoret")
|
|
||||||
auto_return = !auto_return
|
|
||||||
|
|
||||||
if("autopick")
|
|
||||||
auto_pickup = !auto_pickup
|
|
||||||
|
|
||||||
if("close")
|
|
||||||
usr.unset_machine()
|
|
||||||
usr << browse(null,"window=mulebot")
|
|
||||||
|
|
||||||
updateDialog()
|
|
||||||
//src.updateUsrDialog()
|
|
||||||
else
|
|
||||||
usr << browse(null, "window=mulebot")
|
|
||||||
usr.unset_machine()
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// returns true if the bot has power
|
|
||||||
/obj/machinery/bot/mulebot/proc/has_power()
|
|
||||||
return !open && cell && cell.charge>0 && wires.HasPower()
|
|
||||||
|
|
||||||
// mousedrop a crate to load the bot
|
|
||||||
// can load anything if emagged
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/MouseDrop_T(var/atom/movable/C, mob/user)
|
|
||||||
|
|
||||||
if(user.stat)
|
|
||||||
return
|
|
||||||
|
|
||||||
if (!on || !istype(C)|| C.anchored || get_dist(user, src) > 1 || get_dist(src,C) > 1 )
|
|
||||||
return
|
|
||||||
|
|
||||||
if(load)
|
|
||||||
return
|
|
||||||
|
|
||||||
load(C)
|
|
||||||
|
|
||||||
|
|
||||||
// called to load a crate
|
|
||||||
/obj/machinery/bot/mulebot/proc/load(var/atom/movable/C)
|
|
||||||
if(wires.LoadCheck() && !istype(C,/obj/structure/closet/crate))
|
|
||||||
src.visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
|
|
||||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
|
||||||
return // if not emagged, only allow crates to be loaded
|
|
||||||
|
|
||||||
//I'm sure someone will come along and ask why this is here... well people were dragging screen items onto the mule, and that was not cool.
|
|
||||||
//So this is a simple fix that only allows a selection of item types to be considered. Further narrowing-down is below.
|
|
||||||
if(!istype(C,/obj/item) && !istype(C,/obj/machinery) && !istype(C,/obj/structure) && !ismob(C))
|
|
||||||
return
|
|
||||||
if(!isturf(C.loc)) //To prevent the loading from stuff from someone's inventory, which wouldn't get handled properly.
|
|
||||||
return
|
|
||||||
|
|
||||||
if(get_dist(C, src) > 1 || load || !on)
|
|
||||||
return
|
|
||||||
for(var/obj/structure/plasticflaps/P in src.loc)//Takes flaps into account
|
|
||||||
if(!CanPass(C,P))
|
|
||||||
return
|
|
||||||
mode = 1
|
|
||||||
|
|
||||||
// if a create, close before loading
|
|
||||||
var/obj/structure/closet/crate/crate = C
|
|
||||||
if(istype(crate))
|
|
||||||
crate.close()
|
|
||||||
|
|
||||||
C.loc = src.loc
|
|
||||||
sleep(2)
|
|
||||||
if(C.loc != src.loc) //To prevent you from going onto more thano ne bot.
|
|
||||||
return
|
|
||||||
C.loc = src
|
|
||||||
load = C
|
|
||||||
|
|
||||||
C.pixel_y += 9
|
|
||||||
if(C.layer < layer)
|
|
||||||
C.layer = layer + 0.1
|
|
||||||
overlays += C
|
|
||||||
|
|
||||||
if(ismob(C))
|
|
||||||
var/mob/M = C
|
|
||||||
if(M.client)
|
|
||||||
M.client.perspective = EYE_PERSPECTIVE
|
|
||||||
M.client.eye = src
|
|
||||||
|
|
||||||
mode = 0
|
|
||||||
send_status()
|
|
||||||
|
|
||||||
// called to unload the bot
|
|
||||||
// argument is optional direction to unload
|
|
||||||
// if zero, unload at bot's location
|
|
||||||
/obj/machinery/bot/mulebot/proc/unload(var/dirn = 0)
|
|
||||||
if(!load)
|
|
||||||
return
|
|
||||||
|
|
||||||
mode = 1
|
|
||||||
overlays.Cut()
|
|
||||||
|
|
||||||
load.loc = src.loc
|
|
||||||
load.pixel_y -= 9
|
|
||||||
load.layer = initial(load.layer)
|
|
||||||
if(ismob(load))
|
|
||||||
var/mob/M = load
|
|
||||||
if(M.client)
|
|
||||||
M.client.perspective = MOB_PERSPECTIVE
|
|
||||||
M.client.eye = src
|
|
||||||
|
|
||||||
|
|
||||||
if(dirn)
|
|
||||||
var/turf/T = src.loc
|
|
||||||
T = get_step(T,dirn)
|
|
||||||
if(CanPass(load,T))//Can't get off onto anything that wouldn't let you pass normally
|
|
||||||
step(load, dirn)
|
|
||||||
else
|
|
||||||
load.loc = src.loc//Drops you right there, so you shouldn't be able to get yourself stuck
|
|
||||||
|
|
||||||
load = null
|
|
||||||
|
|
||||||
// in case non-load items end up in contents, dump every else too
|
|
||||||
// this seems to happen sometimes due to race conditions
|
|
||||||
// with items dropping as mobs are loaded
|
|
||||||
|
|
||||||
for(var/atom/movable/AM in src)
|
|
||||||
if(AM == cell || AM == botcard) continue
|
|
||||||
|
|
||||||
AM.loc = src.loc
|
|
||||||
AM.layer = initial(AM.layer)
|
|
||||||
AM.pixel_y = initial(AM.pixel_y)
|
|
||||||
if(ismob(AM))
|
|
||||||
var/mob/M = AM
|
|
||||||
if(M.client)
|
|
||||||
M.client.perspective = MOB_PERSPECTIVE
|
|
||||||
M.client.eye = src
|
|
||||||
mode = 0
|
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/process()
|
|
||||||
if(!has_power())
|
|
||||||
on = 0
|
|
||||||
return
|
|
||||||
if(on)
|
|
||||||
var/speed = (wires.Motor1() ? 1:0) + (wires.Motor2() ? 2:0)
|
|
||||||
//world << "speed: [speed]"
|
|
||||||
switch(speed)
|
|
||||||
if(0)
|
|
||||||
// do nothing
|
|
||||||
if(1)
|
|
||||||
process_bot()
|
|
||||||
spawn(2)
|
|
||||||
process_bot()
|
|
||||||
sleep(2)
|
|
||||||
process_bot()
|
|
||||||
sleep(2)
|
|
||||||
process_bot()
|
|
||||||
sleep(2)
|
|
||||||
process_bot()
|
|
||||||
if(2)
|
|
||||||
process_bot()
|
|
||||||
spawn(4)
|
|
||||||
process_bot()
|
|
||||||
if(3)
|
|
||||||
process_bot()
|
|
||||||
|
|
||||||
if(refresh) updateDialog()
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/proc/process_bot()
|
|
||||||
//if(mode) world << "Mode: [mode]"
|
|
||||||
switch(mode)
|
|
||||||
if(0) // idle
|
|
||||||
icon_state = "mulebot0"
|
|
||||||
return
|
|
||||||
if(1) // loading/unloading
|
|
||||||
return
|
|
||||||
if(2,3,4) // navigating to deliver,home, or blocked
|
|
||||||
|
|
||||||
if(loc == target) // reached target
|
|
||||||
at_target()
|
|
||||||
return
|
|
||||||
|
|
||||||
else if(path.len > 0 && target) // valid path
|
|
||||||
|
|
||||||
var/turf/next = path[1]
|
|
||||||
reached_target = 0
|
|
||||||
if(next == loc)
|
|
||||||
path -= next
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
if(istype( next, /turf/simulated))
|
|
||||||
//world << "at ([x],[y]) moving to ([next.x],[next.y])"
|
|
||||||
|
|
||||||
|
|
||||||
if(bloodiness)
|
|
||||||
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
|
|
||||||
var/newdir = get_dir(next, loc)
|
|
||||||
if(newdir == dir)
|
|
||||||
B.set_dir(newdir)
|
|
||||||
else
|
|
||||||
newdir = newdir | dir
|
|
||||||
if(newdir == 3)
|
|
||||||
newdir = 1
|
|
||||||
else if(newdir == 12)
|
|
||||||
newdir = 4
|
|
||||||
B.set_dir(newdir)
|
|
||||||
bloodiness--
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var/moved = step_towards(src, next) // attempt to move
|
|
||||||
if(cell) cell.use(1)
|
|
||||||
if(moved) // successful move
|
|
||||||
//world << "Successful move."
|
|
||||||
blockcount = 0
|
|
||||||
path -= loc
|
|
||||||
|
|
||||||
|
|
||||||
if(mode==4)
|
|
||||||
spawn(1)
|
|
||||||
send_status()
|
|
||||||
|
|
||||||
if(destination == home_destination)
|
|
||||||
mode = 3
|
|
||||||
else
|
|
||||||
mode = 2
|
|
||||||
|
|
||||||
else // failed to move
|
|
||||||
|
|
||||||
//world << "Unable to move."
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
blockcount++
|
|
||||||
mode = 4
|
|
||||||
if(blockcount == 3)
|
|
||||||
src.visible_message("[src] makes an annoyed buzzing sound", "You hear an electronic buzzing sound.")
|
|
||||||
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
|
|
||||||
|
|
||||||
if(blockcount > 5) // attempt 5 times before recomputing
|
|
||||||
// find new path excluding blocked turf
|
|
||||||
src.visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
|
|
||||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
|
||||||
|
|
||||||
spawn(2)
|
|
||||||
calc_path(next)
|
|
||||||
if(path.len > 0)
|
|
||||||
src.visible_message("[src] makes a delighted ping!", "You hear a ping.")
|
|
||||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
|
||||||
mode = 4
|
|
||||||
mode =6
|
|
||||||
return
|
|
||||||
return
|
|
||||||
else
|
|
||||||
src.visible_message("[src] makes an annoyed buzzing sound", "You hear an electronic buzzing sound.")
|
|
||||||
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
|
|
||||||
//world << "Bad turf."
|
|
||||||
mode = 5
|
|
||||||
return
|
|
||||||
else
|
|
||||||
//world << "No path."
|
|
||||||
mode = 5
|
|
||||||
return
|
|
||||||
|
|
||||||
if(5) // calculate new path
|
|
||||||
//world << "Calc new path."
|
|
||||||
mode = 6
|
|
||||||
spawn(0)
|
|
||||||
|
|
||||||
calc_path()
|
|
||||||
|
|
||||||
if(path.len > 0)
|
|
||||||
blockcount = 0
|
|
||||||
mode = 4
|
|
||||||
src.visible_message("[src] makes a delighted ping!", "You hear a ping.")
|
|
||||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
|
||||||
|
|
||||||
else
|
|
||||||
src.visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
|
|
||||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
|
||||||
|
|
||||||
mode = 7
|
|
||||||
//if(6)
|
|
||||||
//world << "Pending path calc."
|
|
||||||
//if(7)
|
|
||||||
//world << "No dest / no route."
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
// calculates a path to the current destination
|
|
||||||
// given an optional turf to avoid
|
|
||||||
/obj/machinery/bot/mulebot/proc/calc_path(var/turf/avoid = null)
|
|
||||||
src.path = AStar(src.loc, src.target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, id=botcard, exclude=avoid)
|
|
||||||
if(!src.path)
|
|
||||||
src.path = list()
|
|
||||||
|
|
||||||
|
|
||||||
// sets the current destination
|
|
||||||
// signals all beacons matching the delivery code
|
|
||||||
// beacons will return a signal giving their locations
|
|
||||||
/obj/machinery/bot/mulebot/proc/set_destination(var/new_dest)
|
|
||||||
spawn(0)
|
|
||||||
new_destination = new_dest
|
|
||||||
post_signal(beacon_freq, "findbeacon", "delivery")
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
// starts bot moving to current destination
|
|
||||||
/obj/machinery/bot/mulebot/proc/start()
|
|
||||||
if(destination == home_destination)
|
|
||||||
mode = 3
|
|
||||||
else
|
|
||||||
mode = 2
|
|
||||||
icon_state = "mulebot[wires.MobAvoid()]"
|
|
||||||
|
|
||||||
// starts bot moving to home
|
|
||||||
// sends a beacon query to find
|
|
||||||
/obj/machinery/bot/mulebot/proc/start_home()
|
|
||||||
spawn(0)
|
|
||||||
set_destination(home_destination)
|
|
||||||
mode = 4
|
|
||||||
icon_state = "mulebot[wires.MobAvoid()]"
|
|
||||||
|
|
||||||
// called when bot reaches current target
|
|
||||||
/obj/machinery/bot/mulebot/proc/at_target()
|
|
||||||
if(!reached_target)
|
|
||||||
src.visible_message("[src] makes a chiming sound!", "You hear a chime.")
|
|
||||||
playsound(src.loc, 'sound/machines/chime.ogg', 50, 0)
|
|
||||||
reached_target = 1
|
|
||||||
|
|
||||||
if(load) // if loaded, unload at target
|
|
||||||
unload(loaddir)
|
|
||||||
else
|
|
||||||
// not loaded
|
|
||||||
if(auto_pickup) // find a crate
|
|
||||||
var/atom/movable/AM
|
|
||||||
if(!wires.LoadCheck()) // if emagged, load first unanchored thing we find
|
|
||||||
for(var/atom/movable/A in get_step(loc, loaddir))
|
|
||||||
if(!A.anchored)
|
|
||||||
AM = A
|
|
||||||
break
|
|
||||||
else // otherwise, look for crates only
|
|
||||||
AM = locate(/obj/structure/closet/crate) in get_step(loc,loaddir)
|
|
||||||
if(AM)
|
|
||||||
load(AM)
|
|
||||||
// whatever happened, check to see if we return home
|
|
||||||
|
|
||||||
if(auto_return && destination != home_destination)
|
|
||||||
// auto return set and not at home already
|
|
||||||
start_home()
|
|
||||||
mode = 4
|
|
||||||
else
|
|
||||||
mode = 0 // otherwise go idle
|
|
||||||
|
|
||||||
send_status() // report status to anyone listening
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
// called when bot bumps into anything
|
|
||||||
/obj/machinery/bot/mulebot/Bump(var/atom/obs)
|
|
||||||
if(!wires.MobAvoid()) //usually just bumps, but if avoidance disabled knock over mobs
|
|
||||||
var/mob/M = obs
|
|
||||||
if(ismob(M))
|
|
||||||
if(istype(M,/mob/living/silicon/robot))
|
|
||||||
src.visible_message("<span class='warning'>[src] bumps into [M]!</span>")
|
|
||||||
else
|
|
||||||
src.visible_message("<span class='warning'>[src] knocks over [M]!</span>")
|
|
||||||
M.stop_pulling()
|
|
||||||
M.Stun(8)
|
|
||||||
M.Weaken(5)
|
|
||||||
M.lying = 1
|
|
||||||
..()
|
|
||||||
|
|
||||||
// called from mob/living/carbon/human/Crossed()
|
|
||||||
// when mulebot is in the same loc
|
|
||||||
/obj/machinery/bot/mulebot/proc/RunOver(var/mob/living/carbon/human/H)
|
|
||||||
src.visible_message("<span class='warning'>[src] drives over [H]!</span>")
|
|
||||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
|
||||||
|
|
||||||
var/damage = rand(5,15)
|
|
||||||
H.apply_damage(2*damage, BRUTE, BP_HEAD)
|
|
||||||
H.apply_damage(2*damage, BRUTE, BP_TORSO)
|
|
||||||
H.apply_damage(0.5*damage, BRUTE, BP_L_LEG)
|
|
||||||
H.apply_damage(0.5*damage, BRUTE, BP_R_LEG)
|
|
||||||
H.apply_damage(0.5*damage, BRUTE, BP_L_ARM)
|
|
||||||
H.apply_damage(0.5*damage, BRUTE, BP_R_ARM)
|
|
||||||
|
|
||||||
blood_splatter(src,H,1)
|
|
||||||
bloodiness += 4
|
|
||||||
|
|
||||||
// player on mulebot attempted to move
|
|
||||||
/obj/machinery/bot/mulebot/relaymove(var/mob/user)
|
|
||||||
if(user.stat)
|
|
||||||
return
|
|
||||||
if(load == user)
|
|
||||||
unload(0)
|
|
||||||
return
|
|
||||||
|
|
||||||
// receive a radio signal
|
|
||||||
// used for control and beacon reception
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/receive_signal(datum/signal/signal)
|
|
||||||
|
|
||||||
if(!on)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/recv = signal.data["command"]
|
|
||||||
// process all-bot input
|
|
||||||
if(recv=="bot_status" && wires.RemoteRX())
|
|
||||||
send_status()
|
|
||||||
|
|
||||||
|
|
||||||
recv = signal.data["command [suffix]"]
|
|
||||||
if(wires.RemoteRX())
|
|
||||||
// process control input
|
|
||||||
switch(recv)
|
|
||||||
if("stop")
|
|
||||||
mode = 0
|
|
||||||
return
|
|
||||||
|
|
||||||
if("go")
|
|
||||||
start()
|
|
||||||
return
|
|
||||||
|
|
||||||
if("target")
|
|
||||||
set_destination(signal.data["destination"] )
|
|
||||||
return
|
|
||||||
|
|
||||||
if("unload")
|
|
||||||
if(loc == target)
|
|
||||||
unload(loaddir)
|
|
||||||
else
|
|
||||||
unload(0)
|
|
||||||
return
|
|
||||||
|
|
||||||
if("home")
|
|
||||||
start_home()
|
|
||||||
return
|
|
||||||
|
|
||||||
if("bot_status")
|
|
||||||
send_status()
|
|
||||||
return
|
|
||||||
|
|
||||||
if("autoret")
|
|
||||||
auto_return = text2num(signal.data["value"])
|
|
||||||
return
|
|
||||||
|
|
||||||
if("autopick")
|
|
||||||
auto_pickup = text2num(signal.data["value"])
|
|
||||||
return
|
|
||||||
|
|
||||||
// receive response from beacon
|
|
||||||
recv = signal.data["beacon"]
|
|
||||||
if(wires.BeaconRX())
|
|
||||||
if(recv == new_destination) // if the recvd beacon location matches the set destination
|
|
||||||
// the we will navigate there
|
|
||||||
destination = new_destination
|
|
||||||
target = signal.source.loc
|
|
||||||
var/direction = signal.data["dir"] // this will be the load/unload dir
|
|
||||||
if(direction)
|
|
||||||
loaddir = text2num(direction)
|
|
||||||
else
|
|
||||||
loaddir = 0
|
|
||||||
icon_state = "mulebot[wires.MobAvoid()]"
|
|
||||||
calc_path()
|
|
||||||
updateDialog()
|
|
||||||
|
|
||||||
// send a radio signal with a single data key/value pair
|
|
||||||
/obj/machinery/bot/mulebot/proc/post_signal(var/freq, var/key, var/value)
|
|
||||||
post_signal_multiple(freq, list("[key]" = value) )
|
|
||||||
|
|
||||||
// send a radio signal with multiple data key/values
|
|
||||||
/obj/machinery/bot/mulebot/proc/post_signal_multiple(var/freq, var/list/keyval)
|
|
||||||
|
|
||||||
if(freq == beacon_freq && !wires.BeaconRX())
|
|
||||||
return
|
|
||||||
if(freq == control_freq && !wires.RemoteTX())
|
|
||||||
return
|
|
||||||
|
|
||||||
var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq)
|
|
||||||
|
|
||||||
if(!frequency) return
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var/datum/signal/signal = new()
|
|
||||||
signal.source = src
|
|
||||||
signal.transmission_method = 1
|
|
||||||
//for(var/key in keyval)
|
|
||||||
// signal.data[key] = keyval[key]
|
|
||||||
signal.data = keyval
|
|
||||||
//world << "sent [key],[keyval[key]] on [freq]"
|
|
||||||
if (signal.data["findbeacon"])
|
|
||||||
frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
|
|
||||||
else if (signal.data["type"] == "mulebot")
|
|
||||||
frequency.post_signal(src, signal, filter = RADIO_MULEBOT)
|
|
||||||
else
|
|
||||||
frequency.post_signal(src, signal)
|
|
||||||
|
|
||||||
// signals bot status etc. to controller
|
|
||||||
/obj/machinery/bot/mulebot/proc/send_status()
|
|
||||||
var/list/kv = list(
|
|
||||||
"type" = "mulebot",
|
|
||||||
"name" = suffix,
|
|
||||||
"loca" = (loc ? loc.loc : "Unknown"), // somehow loc can be null and cause a runtime - Quarxink
|
|
||||||
"mode" = mode,
|
|
||||||
"powr" = (cell ? cell.percent() : 0),
|
|
||||||
"dest" = destination,
|
|
||||||
"home" = home_destination,
|
|
||||||
"load" = load,
|
|
||||||
"retn" = auto_return,
|
|
||||||
"pick" = auto_pickup,
|
|
||||||
)
|
|
||||||
post_signal_multiple(control_freq, kv)
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/emp_act(severity)
|
|
||||||
if (cell)
|
|
||||||
cell.emp_act(severity)
|
|
||||||
if(load)
|
|
||||||
load.emp_act(severity)
|
|
||||||
..()
|
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/bot/mulebot/explode()
|
|
||||||
src.visible_message("<span class='danger'>[src] blows apart!</span>", 1)
|
|
||||||
var/turf/Tsec = get_turf(src)
|
|
||||||
|
|
||||||
new /obj/item/device/assembly/prox_sensor(Tsec)
|
|
||||||
PoolOrNew(/obj/item/stack/rods, Tsec)
|
|
||||||
PoolOrNew(/obj/item/stack/rods, Tsec)
|
|
||||||
new /obj/item/stack/cable_coil/cut(Tsec)
|
|
||||||
if (cell)
|
|
||||||
cell.loc = Tsec
|
|
||||||
cell.update_icon()
|
|
||||||
cell = null
|
|
||||||
|
|
||||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
||||||
s.set_up(3, 1, src)
|
|
||||||
s.start()
|
|
||||||
|
|
||||||
new /obj/effect/decal/cleanable/blood/oil(src.loc)
|
|
||||||
unload(0)
|
|
||||||
qdel(src)
|
|
||||||
@@ -304,7 +304,7 @@
|
|||||||
|
|
||||||
/obj/machinery/computer/arcade/orion_trail
|
/obj/machinery/computer/arcade/orion_trail
|
||||||
name = "The Orion Trail"
|
name = "The Orion Trail"
|
||||||
desc = "Imported straight fron station-TG!"
|
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
|
||||||
icon_state = "arcade"
|
icon_state = "arcade"
|
||||||
circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
|
circuit = /obj/item/weapon/circuitboard/arcade/orion_trail
|
||||||
var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game.
|
var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game.
|
||||||
|
|||||||
@@ -41,13 +41,13 @@
|
|||||||
|
|
||||||
if(scan)
|
if(scan)
|
||||||
usr << "You remove \the [scan] from \the [src]."
|
usr << "You remove \the [scan] from \the [src]."
|
||||||
scan.loc = get_turf(src)
|
scan.forceMove(get_turf(src))
|
||||||
if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
|
if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
|
||||||
usr.put_in_hands(scan)
|
usr.put_in_hands(scan)
|
||||||
scan = null
|
scan = null
|
||||||
else if(modify)
|
else if(modify)
|
||||||
usr << "You remove \the [modify] from \the [src]."
|
usr << "You remove \the [modify] from \the [src]."
|
||||||
modify.loc = get_turf(src)
|
modify.forceMove(get_turf(src))
|
||||||
if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
|
if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
|
||||||
usr.put_in_hands(modify)
|
usr.put_in_hands(modify)
|
||||||
modify = null
|
modify = null
|
||||||
@@ -60,10 +60,12 @@
|
|||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
if(!scan && (access_change_ids in id_card.access) && user.unEquip(id_card))
|
if(!scan && (access_change_ids in id_card.access) && user.unEquip(id_card))
|
||||||
id_card.loc = src
|
user.drop_item()
|
||||||
|
id_card.forceMove(src)
|
||||||
scan = id_card
|
scan = id_card
|
||||||
else if(!modify)
|
else if(!modify)
|
||||||
id_card.loc = src
|
user.drop_item()
|
||||||
|
id_card.forceMove(src)
|
||||||
modify = id_card
|
modify = id_card
|
||||||
|
|
||||||
nanomanager.update_uis(src)
|
nanomanager.update_uis(src)
|
||||||
@@ -146,34 +148,34 @@
|
|||||||
data_core.manifest_modify(modify.registered_name, modify.assignment)
|
data_core.manifest_modify(modify.registered_name, modify.assignment)
|
||||||
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
|
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
|
||||||
if(ishuman(usr))
|
if(ishuman(usr))
|
||||||
modify.loc = usr.loc
|
modify.forceMove(get_turf(src))
|
||||||
if(!usr.get_active_hand())
|
if(!usr.get_active_hand())
|
||||||
usr.put_in_hands(modify)
|
usr.put_in_hands(modify)
|
||||||
modify = null
|
modify = null
|
||||||
else
|
else
|
||||||
modify.loc = loc
|
modify.forceMove(get_turf(src))
|
||||||
modify = null
|
modify = null
|
||||||
else
|
else
|
||||||
var/obj/item/I = usr.get_active_hand()
|
var/obj/item/I = usr.get_active_hand()
|
||||||
if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
|
if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
|
||||||
I.loc = src
|
I.forceMove(src)
|
||||||
modify = I
|
modify = I
|
||||||
|
|
||||||
if ("scan")
|
if ("scan")
|
||||||
if (scan)
|
if (scan)
|
||||||
if(ishuman(usr))
|
if(ishuman(usr))
|
||||||
scan.loc = usr.loc
|
scan.forceMove(get_turf(src))
|
||||||
if(!usr.get_active_hand())
|
if(!usr.get_active_hand())
|
||||||
usr.put_in_hands(scan)
|
usr.put_in_hands(scan)
|
||||||
scan = null
|
scan = null
|
||||||
else
|
else
|
||||||
scan.loc = src.loc
|
scan.forceMove(get_turf(src))
|
||||||
scan = null
|
scan = null
|
||||||
else
|
else
|
||||||
var/obj/item/I = usr.get_active_hand()
|
var/obj/item/I = usr.get_active_hand()
|
||||||
if (istype(I, /obj/item/weapon/card/id))
|
if (istype(I, /obj/item/weapon/card/id))
|
||||||
usr.drop_item()
|
usr.drop_item()
|
||||||
I.loc = src
|
I.forceMove(src)
|
||||||
scan = I
|
scan = I
|
||||||
|
|
||||||
if("access")
|
if("access")
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
// Antagonistic cyborgs? Left here for downstream
|
// Antagonistic cyborgs? Left here for downstream
|
||||||
if(target.mind && target.mind.special_role && target.emagged)
|
if(target.mind && (target.mind.special_role || target.emagged))
|
||||||
target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
|
target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
|
||||||
target.ResetSecurityCodes()
|
target.ResetSecurityCodes()
|
||||||
else
|
else
|
||||||
@@ -101,6 +101,7 @@
|
|||||||
else
|
else
|
||||||
target.canmove = !target.canmove
|
target.canmove = !target.canmove
|
||||||
target.lockcharge = !target.canmove //when canmove is 1, lockcharge should be 0
|
target.lockcharge = !target.canmove //when canmove is 1, lockcharge should be 0
|
||||||
|
target.lockdown = !target.canmove
|
||||||
if (target.lockcharge)
|
if (target.lockcharge)
|
||||||
target << "You have been locked down!"
|
target << "You have been locked down!"
|
||||||
else
|
else
|
||||||
@@ -115,8 +116,8 @@
|
|||||||
if(!target || !istype(target))
|
if(!target || !istype(target))
|
||||||
return
|
return
|
||||||
|
|
||||||
// Antag AI checks
|
// Antag synthetic checks
|
||||||
if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user))
|
if(!istype(user, /mob/living/silicon) || !(user.mind.special_role && user.mind.original == user))
|
||||||
user << "Access Denied"
|
user << "Access Denied"
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -202,6 +203,10 @@
|
|||||||
robot["module"] = R.module ? R.module.name : "None"
|
robot["module"] = R.module ? R.module.name : "None"
|
||||||
robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None"
|
robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None"
|
||||||
robot["hackable"] = 0
|
robot["hackable"] = 0
|
||||||
|
//Antag synths should be able to hack themselves and see their hacked status.
|
||||||
|
if(operator && istype(operator, /mob/living/silicon) && (operator.mind.special_role && operator.mind.original == operator))
|
||||||
|
robot["hacked"] = R.emagged ? 1 : 0
|
||||||
|
robot["hackable"] = R.emagged? 0 : 1
|
||||||
// Antag AIs know whether linked cyborgs are hacked or not.
|
// Antag AIs know whether linked cyborgs are hacked or not.
|
||||||
if(operator && istype(operator, /mob/living/silicon/ai) && (R.connected_ai == operator) && (operator.mind.special_role && operator.mind.original == operator))
|
if(operator && istype(operator, /mob/living/silicon/ai) && (R.connected_ai == operator) && (operator.mind.special_role && operator.mind.original == operator))
|
||||||
robot["hacked"] = R.emagged ? 1 : 0
|
robot["hacked"] = R.emagged ? 1 : 0
|
||||||
|
|||||||
@@ -225,6 +225,7 @@
|
|||||||
|
|
||||||
var/obj/machinery/computer/cryopod/control_computer
|
var/obj/machinery/computer/cryopod/control_computer
|
||||||
var/last_no_computer_message = 0
|
var/last_no_computer_message = 0
|
||||||
|
var/applies_stasis = 1
|
||||||
|
|
||||||
// These items are preserved when the process() despawn proc occurs.
|
// These items are preserved when the process() despawn proc occurs.
|
||||||
var/list/preserve_items = list(
|
var/list/preserve_items = list(
|
||||||
@@ -254,6 +255,7 @@
|
|||||||
on_enter_occupant_message = "The storage unit broadcasts a sleep signal to you. Your systems start to shut down, and you enter low-power mode."
|
on_enter_occupant_message = "The storage unit broadcasts a sleep signal to you. Your systems start to shut down, and you enter low-power mode."
|
||||||
allow_occupant_types = list(/mob/living/silicon/robot)
|
allow_occupant_types = list(/mob/living/silicon/robot)
|
||||||
disallow_occupant_types = list(/mob/living/silicon/robot/drone)
|
disallow_occupant_types = list(/mob/living/silicon/robot/drone)
|
||||||
|
applies_stasis = 0
|
||||||
|
|
||||||
/obj/machinery/cryopod/robot/door
|
/obj/machinery/cryopod/robot/door
|
||||||
//This inherits from the robot cryo, so synths can be properly cryo'd. If a non-synth enters and is cryo'd, ..() is called and it'll still work.
|
//This inherits from the robot cryo, so synths can be properly cryo'd. If a non-synth enters and is cryo'd, ..() is called and it'll still work.
|
||||||
@@ -524,6 +526,9 @@
|
|||||||
M << "<span class='notice'><b>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</b></span>"
|
M << "<span class='notice'><b>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</b></span>"
|
||||||
set_occupant(M)
|
set_occupant(M)
|
||||||
time_entered = world.time
|
time_entered = world.time
|
||||||
|
if(ishuman(M) && applies_stasis)
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
H.in_stasis = 1
|
||||||
|
|
||||||
// Book keeping!
|
// Book keeping!
|
||||||
var/turf/location = get_turf(src)
|
var/turf/location = get_turf(src)
|
||||||
@@ -589,6 +594,9 @@
|
|||||||
usr.client.eye = src
|
usr.client.eye = src
|
||||||
usr.forceMove(src)
|
usr.forceMove(src)
|
||||||
set_occupant(usr)
|
set_occupant(usr)
|
||||||
|
if(ishuman(usr) && applies_stasis)
|
||||||
|
var/mob/living/carbon/human/H = occupant
|
||||||
|
H.in_stasis = 1
|
||||||
|
|
||||||
icon_state = occupied_icon_state
|
icon_state = occupied_icon_state
|
||||||
|
|
||||||
@@ -622,6 +630,9 @@
|
|||||||
occupant.client.perspective = MOB_PERSPECTIVE
|
occupant.client.perspective = MOB_PERSPECTIVE
|
||||||
|
|
||||||
occupant.forceMove(get_turf(src))
|
occupant.forceMove(get_turf(src))
|
||||||
|
if(ishuman(occupant) && applies_stasis)
|
||||||
|
var/mob/living/carbon/human/H = occupant
|
||||||
|
H.in_stasis = 0
|
||||||
set_occupant(null)
|
set_occupant(null)
|
||||||
|
|
||||||
icon_state = base_icon_state
|
icon_state = base_icon_state
|
||||||
|
|||||||
@@ -103,13 +103,6 @@
|
|||||||
bumpopen(M)
|
bumpopen(M)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(istype(AM, /obj/machinery/bot))
|
|
||||||
var/obj/machinery/bot/bot = AM
|
|
||||||
if(src.check_access(bot.botcard))
|
|
||||||
if(density)
|
|
||||||
open()
|
|
||||||
return
|
|
||||||
|
|
||||||
if(istype(AM, /mob/living/bot))
|
if(istype(AM, /mob/living/bot))
|
||||||
var/mob/living/bot/bot = AM
|
var/mob/living/bot/bot = AM
|
||||||
if(src.check_access(bot.botcard))
|
if(src.check_access(bot.botcard))
|
||||||
|
|||||||
@@ -72,12 +72,11 @@
|
|||||||
sleep(50)
|
sleep(50)
|
||||||
close()
|
close()
|
||||||
return
|
return
|
||||||
var/mob/M = AM // we've returned by here if M is not a mob
|
|
||||||
if (!( ticker ))
|
if (!( ticker ))
|
||||||
return
|
return
|
||||||
if (src.operating)
|
if (src.operating)
|
||||||
return
|
return
|
||||||
if (src.density && !issmall(M) && src.allowed(AM))
|
if (src.density && src.allowed(AM))
|
||||||
open()
|
open()
|
||||||
if(src.check_access(null))
|
if(src.check_access(null))
|
||||||
sleep(50)
|
sleep(50)
|
||||||
|
|||||||
@@ -110,7 +110,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
// If the human is losing too much blood, beep.
|
// If the human is losing too much blood, beep.
|
||||||
if(T.vessel.get_reagent_amount("blood") < BLOOD_VOLUME_SAFE) if(prob(5))
|
if(((T.vessel.get_reagent_amount("blood")/T.species.blood_volume)*100) < BLOOD_VOLUME_SAFE)
|
||||||
visible_message("\The [src] beeps loudly.")
|
visible_message("\The [src] beeps loudly.")
|
||||||
|
|
||||||
var/datum/reagent/B = T.take_blood(beaker,amount)
|
var/datum/reagent/B = T.take_blood(beaker,amount)
|
||||||
|
|||||||
@@ -89,9 +89,7 @@ datum/track/New(var/title_name, var/audio)
|
|||||||
if(emagged)
|
if(emagged)
|
||||||
playsound(src.loc, 'sound/items/AirHorn.ogg', 100, 1)
|
playsound(src.loc, 'sound/items/AirHorn.ogg', 100, 1)
|
||||||
for(var/mob/living/carbon/M in ohearers(6, src))
|
for(var/mob/living/carbon/M in ohearers(6, src))
|
||||||
if(istype(M, /mob/living/carbon/human))
|
if(M.get_ear_protection() >= 2)
|
||||||
var/mob/living/carbon/human/H = M
|
|
||||||
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
|
|
||||||
continue
|
continue
|
||||||
M.sleeping = 0
|
M.sleeping = 0
|
||||||
M.stuttering += 20
|
M.stuttering += 20
|
||||||
|
|||||||
@@ -122,6 +122,9 @@
|
|||||||
/obj/machinery/smartfridge/drying_rack
|
/obj/machinery/smartfridge/drying_rack
|
||||||
name = "\improper Drying Rack"
|
name = "\improper Drying Rack"
|
||||||
desc = "A machine for drying plants."
|
desc = "A machine for drying plants."
|
||||||
|
icon_state = "drying_rack"
|
||||||
|
icon_on = "drying_rack_on"
|
||||||
|
icon_off = "drying_rack"
|
||||||
|
|
||||||
/obj/machinery/smartfridge/drying_rack/accept_check(var/obj/item/O as obj)
|
/obj/machinery/smartfridge/drying_rack/accept_check(var/obj/item/O as obj)
|
||||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/))
|
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/))
|
||||||
@@ -132,8 +135,23 @@
|
|||||||
|
|
||||||
/obj/machinery/smartfridge/drying_rack/process()
|
/obj/machinery/smartfridge/drying_rack/process()
|
||||||
..()
|
..()
|
||||||
if (contents.len)
|
if(stat & (BROKEN|NOPOWER))
|
||||||
|
return
|
||||||
|
if(contents.len)
|
||||||
dry()
|
dry()
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/machinery/smartfridge/drying_rack/update_icon()
|
||||||
|
overlays.Cut()
|
||||||
|
var/not_working = stat & (BROKEN|NOPOWER)
|
||||||
|
if(not_working)
|
||||||
|
icon_state = icon_off
|
||||||
|
else
|
||||||
|
icon_state = icon_on
|
||||||
|
if(contents.len)
|
||||||
|
overlays += "drying_rack_filled"
|
||||||
|
if(!not_working)
|
||||||
|
overlays += "drying_rack_drying"
|
||||||
|
|
||||||
/obj/machinery/smartfridge/drying_rack/proc/dry()
|
/obj/machinery/smartfridge/drying_rack/proc/dry()
|
||||||
for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
|
for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
|
||||||
|
|||||||
@@ -502,7 +502,7 @@ var/list/turret_icons
|
|||||||
if(isanimal(L) || issmall(L)) // Animals are not so dangerous
|
if(isanimal(L) || issmall(L)) // Animals are not so dangerous
|
||||||
return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
|
return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
|
||||||
|
|
||||||
if(isxenomorph(L) || isalien(L)) // Xenos are dangerous
|
if(isalien(L)) // Xenos are dangerous
|
||||||
return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
|
return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
|
||||||
|
|
||||||
if(ishuman(L)) //if the target is a human, analyze threat level
|
if(ishuman(L)) //if the target is a human, analyze threat level
|
||||||
|
|||||||
@@ -593,7 +593,7 @@
|
|||||||
//Departments that the cycler can paint suits to look like.
|
//Departments that the cycler can paint suits to look like.
|
||||||
var/list/departments = list("Engineering","Mining","Medical","Security","Atmos")
|
var/list/departments = list("Engineering","Mining","Medical","Security","Atmos")
|
||||||
//Species that the suits can be configured to fit.
|
//Species that the suits can be configured to fit.
|
||||||
var/list/species = list("Human","Skrell","Unathi","Tajara")
|
var/list/species = list("Human","Skrell","Unathi","Tajara", "Teshari")
|
||||||
|
|
||||||
var/target_department
|
var/target_department
|
||||||
var/target_species
|
var/target_species
|
||||||
@@ -622,35 +622,30 @@
|
|||||||
model_text = "Engineering"
|
model_text = "Engineering"
|
||||||
req_access = list(access_construction)
|
req_access = list(access_construction)
|
||||||
departments = list("Engineering","Atmos")
|
departments = list("Engineering","Atmos")
|
||||||
species = list("Human","Tajara","Skrell","Unathi") //Add Unathi when sprites exist for their suits.
|
|
||||||
|
|
||||||
/obj/machinery/suit_cycler/mining
|
/obj/machinery/suit_cycler/mining
|
||||||
name = "Mining suit cycler"
|
name = "Mining suit cycler"
|
||||||
model_text = "Mining"
|
model_text = "Mining"
|
||||||
req_access = list(access_mining)
|
req_access = list(access_mining)
|
||||||
departments = list("Mining")
|
departments = list("Mining")
|
||||||
species = list("Human","Tajara","Skrell","Unathi")
|
|
||||||
|
|
||||||
/obj/machinery/suit_cycler/security
|
/obj/machinery/suit_cycler/security
|
||||||
name = "Security suit cycler"
|
name = "Security suit cycler"
|
||||||
model_text = "Security"
|
model_text = "Security"
|
||||||
req_access = list(access_security)
|
req_access = list(access_security)
|
||||||
departments = list("Security")
|
departments = list("Security")
|
||||||
species = list("Human","Tajara","Skrell","Unathi")
|
|
||||||
|
|
||||||
/obj/machinery/suit_cycler/medical
|
/obj/machinery/suit_cycler/medical
|
||||||
name = "Medical suit cycler"
|
name = "Medical suit cycler"
|
||||||
model_text = "Medical"
|
model_text = "Medical"
|
||||||
req_access = list(access_medical)
|
req_access = list(access_medical)
|
||||||
departments = list("Medical")
|
departments = list("Medical")
|
||||||
species = list("Human","Tajara","Skrell","Unathi")
|
|
||||||
|
|
||||||
/obj/machinery/suit_cycler/syndicate
|
/obj/machinery/suit_cycler/syndicate
|
||||||
name = "Nonstandard suit cycler"
|
name = "Nonstandard suit cycler"
|
||||||
model_text = "Nonstandard"
|
model_text = "Nonstandard"
|
||||||
req_access = list(access_syndicate)
|
req_access = list(access_syndicate)
|
||||||
departments = list("Mercenary")
|
departments = list("Mercenary")
|
||||||
species = list("Human","Tajara","Skrell","Unathi", "Teshari")
|
|
||||||
can_repair = 1
|
can_repair = 1
|
||||||
|
|
||||||
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
|
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
|
||||||
|
|||||||
@@ -255,31 +255,16 @@
|
|||||||
usr << "\icon[cashmoney] <span class='warning'>That is not enough money.</span>"
|
usr << "\icon[cashmoney] <span class='warning'>That is not enough money.</span>"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(istype(cashmoney, /obj/item/weapon/spacecash/bundle))
|
if(istype(cashmoney, /obj/item/weapon/spacecash))
|
||||||
// Bundles can just have money subtracted, and will work
|
|
||||||
|
|
||||||
visible_message("<span class='info'>\The [usr] inserts some cash into \the [src].</span>")
|
visible_message("<span class='info'>\The [usr] inserts some cash into \the [src].</span>")
|
||||||
var/obj/item/weapon/spacecash/bundle/cashmoney_bundle = cashmoney
|
cashmoney.worth -= currently_vending.price
|
||||||
cashmoney_bundle.worth -= currently_vending.price
|
|
||||||
|
|
||||||
if(cashmoney_bundle.worth <= 0)
|
if(cashmoney.worth <= 0)
|
||||||
usr.drop_from_inventory(cashmoney_bundle)
|
|
||||||
qdel(cashmoney_bundle)
|
|
||||||
else
|
|
||||||
cashmoney_bundle.update_icon()
|
|
||||||
else
|
|
||||||
// Bills (banknotes) cannot really have worth different than face value,
|
|
||||||
// so we have to eat the bill and spit out change in a bundle
|
|
||||||
// This is really dirty, but there's no superclass for all bills, so we
|
|
||||||
// just assume that all spacecash that's not something else is a bill
|
|
||||||
|
|
||||||
visible_message("<span class='info'>\The [usr] inserts a bill into \the [src].</span>")
|
|
||||||
var/left = cashmoney.worth - currently_vending.price
|
|
||||||
usr.drop_from_inventory(cashmoney)
|
usr.drop_from_inventory(cashmoney)
|
||||||
qdel(cashmoney)
|
qdel(cashmoney)
|
||||||
|
else
|
||||||
if(left)
|
cashmoney.update_icon()
|
||||||
spawn_money(left, src.loc, user)
|
|
||||||
|
|
||||||
// Vending machines have no idea who paid with cash
|
// Vending machines have no idea who paid with cash
|
||||||
credit_purchase("(cash)")
|
credit_purchase("(cash)")
|
||||||
@@ -774,8 +759,7 @@
|
|||||||
contraband = list(/obj/item/weapon/flame/lighter/zippo = 4)
|
contraband = list(/obj/item/weapon/flame/lighter/zippo = 4)
|
||||||
premium = list(/obj/item/weapon/storage/fancy/cigar = 5,
|
premium = list(/obj/item/weapon/storage/fancy/cigar = 5,
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/carcinomas = 5,
|
/obj/item/weapon/storage/fancy/cigarettes/carcinomas = 5,
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/professionals = 5,
|
/obj/item/weapon/storage/fancy/cigarettes/professionals = 5)
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/killthroat = 5)
|
|
||||||
prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15,
|
prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15,
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/luckystars = 17,
|
/obj/item/weapon/storage/fancy/cigarettes/luckystars = 17,
|
||||||
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 22,
|
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 22,
|
||||||
|
|||||||
@@ -219,6 +219,24 @@
|
|||||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/Fire(atom/movable/AM, atom/target, turf/aimloc)
|
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/Fire(atom/movable/AM, atom/target, turf/aimloc)
|
||||||
AM.throw_at(target,missile_range, missile_speed, chassis)
|
AM.throw_at(target,missile_range, missile_speed, chassis)
|
||||||
|
|
||||||
|
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flare
|
||||||
|
name = "\improper BNI Flare Launcher"
|
||||||
|
icon_state = "mecha_flaregun"
|
||||||
|
projectile = /obj/item/device/flashlight/flare
|
||||||
|
fire_sound = 'sound/weapons/tablehit1.ogg'
|
||||||
|
auto_rearm = 1
|
||||||
|
fire_cooldown = 20
|
||||||
|
projectiles_per_shot = 1
|
||||||
|
projectile_energy_cost = 20
|
||||||
|
missile_speed = 1
|
||||||
|
missile_range = 15
|
||||||
|
required_type = /obj/mecha //Why restrict it to just mining or combat mechs?
|
||||||
|
|
||||||
|
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flare/Fire(atom/movable/AM, atom/target, turf/aimloc)
|
||||||
|
var/obj/item/device/flashlight/flare/fired = AM
|
||||||
|
fired.ignite()
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive
|
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive
|
||||||
name = "\improper SRM-8 missile rack"
|
name = "\improper SRM-8 missile rack"
|
||||||
icon_state = "mecha_missilerack"
|
icon_state = "mecha_missilerack"
|
||||||
|
|||||||
@@ -1,440 +0,0 @@
|
|||||||
/* Alien Effects!
|
|
||||||
* Contains:
|
|
||||||
* effect/alien
|
|
||||||
* Resin
|
|
||||||
* Weeds
|
|
||||||
* Acid
|
|
||||||
* Egg
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* effect/alien
|
|
||||||
*/
|
|
||||||
/obj/effect/alien
|
|
||||||
name = "alien thing"
|
|
||||||
desc = "theres something alien about this"
|
|
||||||
icon = 'icons/mob/alien.dmi'
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Resin
|
|
||||||
*/
|
|
||||||
/obj/effect/alien/resin
|
|
||||||
name = "resin"
|
|
||||||
desc = "Looks like some kind of slimy growth."
|
|
||||||
icon_state = "resin"
|
|
||||||
|
|
||||||
density = 1
|
|
||||||
opacity = 1
|
|
||||||
anchored = 1
|
|
||||||
var/health = 200
|
|
||||||
//var/mob/living/affecting = null
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/wall
|
|
||||||
name = "resin wall"
|
|
||||||
desc = "Purple slime solidified into a wall."
|
|
||||||
icon_state = "resinwall" //same as resin, but consistency ho!
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/membrane
|
|
||||||
name = "resin membrane"
|
|
||||||
desc = "Purple slime just thin enough to let light pass through."
|
|
||||||
icon_state = "resinmembrane"
|
|
||||||
opacity = 0
|
|
||||||
health = 120
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/New()
|
|
||||||
..()
|
|
||||||
var/turf/T = get_turf(src)
|
|
||||||
T.thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/Destroy()
|
|
||||||
var/turf/T = get_turf(src)
|
|
||||||
T.thermal_conductivity = initial(T.thermal_conductivity)
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/proc/healthcheck()
|
|
||||||
if(health <=0)
|
|
||||||
density = 0
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj)
|
|
||||||
health -= Proj.damage
|
|
||||||
..()
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/ex_act(severity)
|
|
||||||
switch(severity)
|
|
||||||
if(1.0)
|
|
||||||
health-=50
|
|
||||||
if(2.0)
|
|
||||||
health-=50
|
|
||||||
if(3.0)
|
|
||||||
if (prob(50))
|
|
||||||
health-=50
|
|
||||||
else
|
|
||||||
health-=25
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/hitby(AM as mob|obj)
|
|
||||||
..()
|
|
||||||
for(var/mob/O in viewers(src, null))
|
|
||||||
O.show_message("<span class='danger'>[src] was hit by [AM].</span>", 1)
|
|
||||||
var/tforce = 0
|
|
||||||
if(ismob(AM))
|
|
||||||
tforce = 10
|
|
||||||
else
|
|
||||||
tforce = AM:throwforce
|
|
||||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
|
||||||
health = max(0, health - tforce)
|
|
||||||
healthcheck()
|
|
||||||
..()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/attack_hand()
|
|
||||||
usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
||||||
if (HULK in usr.mutations)
|
|
||||||
usr << "<span class='notice'>You easily destroy the [name].</span>"
|
|
||||||
for(var/mob/O in oviewers(src))
|
|
||||||
O.show_message("<span class='warning'>[usr] destroys the [name]!</span>", 1)
|
|
||||||
health = 0
|
|
||||||
else
|
|
||||||
|
|
||||||
// Aliens can get straight through these.
|
|
||||||
if(istype(usr,/mob/living/carbon))
|
|
||||||
var/mob/living/carbon/M = usr
|
|
||||||
if(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
|
|
||||||
for(var/mob/O in oviewers(src))
|
|
||||||
O.show_message("<span class='warning'>[usr] strokes the [name] and it melts away!</span>", 1)
|
|
||||||
health = 0
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
|
|
||||||
usr << "<span class='notice'>You claw at the [name].</span>"
|
|
||||||
for(var/mob/O in oviewers(src))
|
|
||||||
O.show_message("<span class='warning'>[usr] claws at the [name]!</span>", 1)
|
|
||||||
health -= rand(5,10)
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
||||||
|
|
||||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
||||||
var/aforce = W.force
|
|
||||||
health = max(0, health - aforce)
|
|
||||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
|
||||||
healthcheck()
|
|
||||||
..()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/resin/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
||||||
if(air_group) return 0
|
|
||||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
|
||||||
return !opacity
|
|
||||||
return !density
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Weeds
|
|
||||||
*/
|
|
||||||
#define NODERANGE 3
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds
|
|
||||||
name = "weeds"
|
|
||||||
desc = "Weird purple weeds."
|
|
||||||
icon_state = "weeds"
|
|
||||||
|
|
||||||
anchored = 1
|
|
||||||
density = 0
|
|
||||||
layer = 2
|
|
||||||
var/health = 15
|
|
||||||
var/obj/effect/alien/weeds/node/linked_node = null
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/node
|
|
||||||
icon_state = "weednode"
|
|
||||||
name = "purple sac"
|
|
||||||
desc = "Weird purple octopus-like thing."
|
|
||||||
layer = 3
|
|
||||||
light_range = NODERANGE
|
|
||||||
var/node_range = NODERANGE
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/node/New()
|
|
||||||
..(src.loc, src)
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/New(pos, node)
|
|
||||||
..()
|
|
||||||
if(istype(loc, /turf/space))
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
linked_node = node
|
|
||||||
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
|
|
||||||
spawn(rand(150, 200))
|
|
||||||
if(src)
|
|
||||||
Life()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/proc/Life()
|
|
||||||
set background = 1
|
|
||||||
var/turf/U = get_turf(src)
|
|
||||||
/*
|
|
||||||
if (locate(/obj/movable, U))
|
|
||||||
U = locate(/obj/movable, U)
|
|
||||||
if(U.density == 1)
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
Alien plants should do something if theres a lot of poison
|
|
||||||
if(U.poison> 200000)
|
|
||||||
health -= round(U.poison/200000)
|
|
||||||
update()
|
|
||||||
return
|
|
||||||
*/
|
|
||||||
if (istype(U, /turf/space))
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
|
|
||||||
return
|
|
||||||
|
|
||||||
direction_loop:
|
|
||||||
for(var/dirn in cardinal)
|
|
||||||
var/turf/T = get_step(src, dirn)
|
|
||||||
|
|
||||||
if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
|
|
||||||
continue
|
|
||||||
|
|
||||||
// if (locate(/obj/movable, T)) // don't propogate into movables
|
|
||||||
// continue
|
|
||||||
|
|
||||||
for(var/obj/O in T)
|
|
||||||
if(O.density)
|
|
||||||
continue direction_loop
|
|
||||||
|
|
||||||
PoolOrNew(/obj/effect/alien/weeds, T, linked_node)
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/ex_act(severity)
|
|
||||||
switch(severity)
|
|
||||||
if(1.0)
|
|
||||||
qdel(src)
|
|
||||||
if(2.0)
|
|
||||||
if (prob(50))
|
|
||||||
qdel(src)
|
|
||||||
if(3.0)
|
|
||||||
if (prob(5))
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user)
|
|
||||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
||||||
if(W.attack_verb.len)
|
|
||||||
visible_message("<span class='danger'>\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
|
|
||||||
else
|
|
||||||
visible_message("<span class='danger'>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
|
||||||
|
|
||||||
var/damage = W.force / 4.0
|
|
||||||
|
|
||||||
if(istype(W, /obj/item/weapon/weldingtool))
|
|
||||||
var/obj/item/weapon/weldingtool/WT = W
|
|
||||||
|
|
||||||
if(WT.remove_fuel(0, user))
|
|
||||||
damage = 15
|
|
||||||
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
|
|
||||||
|
|
||||||
health -= damage
|
|
||||||
healthcheck()
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/proc/healthcheck()
|
|
||||||
if(health <= 0)
|
|
||||||
qdel(src)
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
|
||||||
if(exposed_temperature > 300 + T0C)
|
|
||||||
health -= 5
|
|
||||||
healthcheck()
|
|
||||||
|
|
||||||
#undef NODERANGE
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Acid
|
|
||||||
*/
|
|
||||||
/obj/effect/alien/acid
|
|
||||||
name = "acid"
|
|
||||||
desc = "Burbling corrossive stuff. I wouldn't want to touch it."
|
|
||||||
icon_state = "acid"
|
|
||||||
|
|
||||||
density = 0
|
|
||||||
opacity = 0
|
|
||||||
anchored = 1
|
|
||||||
|
|
||||||
var/atom/target
|
|
||||||
var/ticks = 0
|
|
||||||
var/target_strength = 0
|
|
||||||
|
|
||||||
/obj/effect/alien/acid/New(loc, target)
|
|
||||||
..(loc)
|
|
||||||
src.target = target
|
|
||||||
|
|
||||||
if(isturf(target)) // Turf take twice as long to take down.
|
|
||||||
target_strength = 8
|
|
||||||
else
|
|
||||||
target_strength = 4
|
|
||||||
tick()
|
|
||||||
|
|
||||||
/obj/effect/alien/acid/proc/tick()
|
|
||||||
if(!target)
|
|
||||||
qdel(src)
|
|
||||||
|
|
||||||
ticks += 1
|
|
||||||
|
|
||||||
if(ticks >= target_strength)
|
|
||||||
|
|
||||||
for(var/mob/O in hearers(src, null))
|
|
||||||
O.show_message("<span class='alium'>[src.target] collapses under its own weight into a puddle of goop and undigested debris!</span>", 1)
|
|
||||||
|
|
||||||
if(istype(target, /turf/simulated/wall)) // I hate turf code.
|
|
||||||
var/turf/simulated/wall/W = target
|
|
||||||
W.dismantle_wall(1)
|
|
||||||
else
|
|
||||||
qdel(target)
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
switch(target_strength - ticks)
|
|
||||||
if(6)
|
|
||||||
visible_message("<span class='alium'>[src.target] is holding up against the acid!</span>")
|
|
||||||
if(4)
|
|
||||||
visible_message("<span class='alium'>[src.target]\s structure is being melted by the acid!</span>")
|
|
||||||
if(2)
|
|
||||||
visible_message("<span class='alium'>[src.target] is struggling to withstand the acid!</span>")
|
|
||||||
if(0 to 1)
|
|
||||||
visible_message("<span class='alium'>[src.target] begins to crumble under the acid!</span>")
|
|
||||||
spawn(rand(150, 200)) tick()
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Egg
|
|
||||||
*/
|
|
||||||
/var/const //for the status var
|
|
||||||
BURST = 0
|
|
||||||
BURSTING = 1
|
|
||||||
GROWING = 2
|
|
||||||
GROWN = 3
|
|
||||||
|
|
||||||
MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
|
|
||||||
MAX_GROWTH_TIME = 3000
|
|
||||||
|
|
||||||
/obj/effect/alien/egg
|
|
||||||
desc = "It looks like a weird egg"
|
|
||||||
name = "egg"
|
|
||||||
icon_state = "egg_growing"
|
|
||||||
density = 0
|
|
||||||
anchored = 1
|
|
||||||
|
|
||||||
var/health = 100
|
|
||||||
var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
|
|
||||||
flags = PROXMOVE
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/New()
|
|
||||||
if(config.aliens_allowed)
|
|
||||||
..()
|
|
||||||
spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME))
|
|
||||||
Grow()
|
|
||||||
else
|
|
||||||
qdel(src)
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/attack_hand(user as mob)
|
|
||||||
|
|
||||||
var/mob/living/carbon/M = user
|
|
||||||
if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs))
|
|
||||||
return attack_hand(user)
|
|
||||||
|
|
||||||
switch(status)
|
|
||||||
if(BURST)
|
|
||||||
user << "<span class='warning'>You clear the hatched egg.</span>"
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
if(GROWING)
|
|
||||||
user << "<span class='warning'>The child is not developed yet.</span>"
|
|
||||||
return
|
|
||||||
if(GROWN)
|
|
||||||
user << "<span class='warning'>You retrieve the child.</span>"
|
|
||||||
Burst(0)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/proc/GetFacehugger()
|
|
||||||
return locate(/obj/item/clothing/mask/facehugger) in contents
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/proc/Grow()
|
|
||||||
icon_state = "egg"
|
|
||||||
status = GROWN
|
|
||||||
new /obj/item/clothing/mask/facehugger(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
|
|
||||||
if(status == GROWN || status == GROWING)
|
|
||||||
var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
|
|
||||||
icon_state = "egg_hatched"
|
|
||||||
flick("egg_opening", src)
|
|
||||||
status = BURSTING
|
|
||||||
spawn(15)
|
|
||||||
status = BURST
|
|
||||||
child.loc = get_turf(src)
|
|
||||||
|
|
||||||
if(kill && istype(child))
|
|
||||||
child.Die()
|
|
||||||
else
|
|
||||||
for(var/mob/M in range(1,src))
|
|
||||||
if(CanHug(M))
|
|
||||||
child.Attach(M)
|
|
||||||
break
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj)
|
|
||||||
health -= Proj.damage
|
|
||||||
..()
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
|
|
||||||
if(health <= 0)
|
|
||||||
return
|
|
||||||
if(W.attack_verb.len)
|
|
||||||
src.visible_message("<span class='danger'>\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
|
|
||||||
else
|
|
||||||
src.visible_message("<span class='danger'>\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
|
||||||
var/damage = W.force / 4.0
|
|
||||||
|
|
||||||
if(istype(W, /obj/item/weapon/weldingtool))
|
|
||||||
var/obj/item/weapon/weldingtool/WT = W
|
|
||||||
|
|
||||||
if(WT.remove_fuel(0, user))
|
|
||||||
damage = 15
|
|
||||||
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
|
|
||||||
|
|
||||||
src.health -= damage
|
|
||||||
src.healthcheck()
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/proc/healthcheck()
|
|
||||||
if(health <= 0)
|
|
||||||
Burst()
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
|
||||||
if(exposed_temperature > 500 + T0C)
|
|
||||||
health -= 5
|
|
||||||
healthcheck()
|
|
||||||
|
|
||||||
/obj/effect/alien/egg/HasProximity(atom/movable/AM as mob|obj)
|
|
||||||
if(status == GROWN)
|
|
||||||
if(!CanHug(AM))
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mob/living/carbon/C = AM
|
|
||||||
if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST)
|
|
||||||
return
|
|
||||||
|
|
||||||
Burst(0)
|
|
||||||
@@ -513,16 +513,3 @@ steam.start() -- spawns the effect
|
|||||||
round(min(light, BOMBCAP_LIGHT_RADIUS)),
|
round(min(light, BOMBCAP_LIGHT_RADIUS)),
|
||||||
round(min(flash, BOMBCAP_FLASH_RADIUS))
|
round(min(flash, BOMBCAP_FLASH_RADIUS))
|
||||||
)
|
)
|
||||||
|
|
||||||
proc/holder_damage(var/atom/holder)
|
|
||||||
if(holder)
|
|
||||||
var/dmglevel = 4
|
|
||||||
|
|
||||||
if (round(amount/8) > 0)
|
|
||||||
dmglevel = 1
|
|
||||||
else if (round(amount/4) > 0)
|
|
||||||
dmglevel = 2
|
|
||||||
else if (round(amount/2) > 0)
|
|
||||||
dmglevel = 3
|
|
||||||
|
|
||||||
if(dmglevel<4) holder.ex_act(dmglevel)
|
|
||||||
|
|||||||
@@ -98,25 +98,36 @@
|
|||||||
|
|
||||||
/obj/item/bodybag/cryobag
|
/obj/item/bodybag/cryobag
|
||||||
name = "stasis bag"
|
name = "stasis bag"
|
||||||
desc = "A folded, non-reusable bag designed to prevent additional damage to an occupant at the cost of genetic damage."
|
desc = "A folded, non-reusable bag designed to prevent additional damage to an occupant, especially useful if short on time or in \
|
||||||
|
a hostile enviroment."
|
||||||
icon = 'icons/obj/cryobag.dmi'
|
icon = 'icons/obj/cryobag.dmi'
|
||||||
icon_state = "bodybag_folded"
|
icon_state = "bodybag_folded"
|
||||||
|
origin_tech = list(TECH_BIO = 4)
|
||||||
|
|
||||||
attack_self(mob/user)
|
/obj/item/bodybag/cryobag/attack_self(mob/user)
|
||||||
var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc)
|
var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc)
|
||||||
R.add_fingerprint(user)
|
R.add_fingerprint(user)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag
|
/obj/structure/closet/body_bag/cryobag
|
||||||
name = "stasis bag"
|
name = "stasis bag"
|
||||||
desc = "A non-reusable plastic bag designed to prevent additional damage to an occupant at the cost of genetic damage."
|
desc = "A non-reusable plastic bag designed to prevent additional damage to an occupant, especially useful if short on time or in \
|
||||||
|
a hostile enviroment."
|
||||||
icon = 'icons/obj/cryobag.dmi'
|
icon = 'icons/obj/cryobag.dmi'
|
||||||
item_path = /obj/item/bodybag/cryobag
|
item_path = /obj/item/bodybag/cryobag
|
||||||
store_misc = 0
|
store_misc = 0
|
||||||
store_items = 0
|
store_items = 0
|
||||||
var/used = 0
|
var/used = 0
|
||||||
|
var/obj/item/weapon/tank/tank = null
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/New()
|
||||||
|
tank = new /obj/item/weapon/tank/emergency_oxygen(null) //It's in nullspace to prevent ejection when the bag is opened.
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/Destroy()
|
||||||
|
qdel(tank)
|
||||||
|
tank = null
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag/open()
|
/obj/structure/closet/body_bag/cryobag/open()
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -128,8 +139,38 @@
|
|||||||
O.desc = "Pretty useless now.."
|
O.desc = "Pretty useless now.."
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
/obj/structure/closet/body_bag/cryobag/MouseDrop(over_object, src_location, over_location)
|
/obj/structure/closet/body_bag/cryobag/Entered(atom/movable/AM)
|
||||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
if(ishuman(AM))
|
||||||
if(!ishuman(usr)) return
|
var/mob/living/carbon/human/H = AM
|
||||||
usr << "<span class='warning'>You can't fold that up anymore..</span>"
|
H.in_stasis = 1
|
||||||
|
src.used = 1
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM)
|
||||||
|
if(ishuman(AM))
|
||||||
|
var/mob/living/carbon/human/H = AM
|
||||||
|
H.in_stasis = 0
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/return_air() //Used to make stasis bags protect from vacuum.
|
||||||
|
if(tank)
|
||||||
|
return tank.air_contents
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/examine(mob/user)
|
||||||
|
..()
|
||||||
|
if(Adjacent(user)) //The bag's rather thick and opaque from a distance.
|
||||||
|
user << "<span class='info'>You peer into \the [src].</span>"
|
||||||
|
for(var/mob/living/L in contents)
|
||||||
|
L.examine(user)
|
||||||
|
|
||||||
|
/obj/structure/closet/body_bag/cryobag/attackby(obj/item/W, mob/user)
|
||||||
|
if(opened)
|
||||||
|
..()
|
||||||
|
else //Allows the bag to respond to a health analyzer by analyzing the mob inside without needing to open it.
|
||||||
|
if(istype(W,/obj/item/device/healthanalyzer))
|
||||||
|
var/obj/item/device/healthanalyzer/analyzer = W
|
||||||
|
for(var/mob/living/L in contents)
|
||||||
|
analyzer.attack(L,user)
|
||||||
|
else
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -235,7 +235,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
|||||||
ownrank = ownjob
|
ownrank = ownjob
|
||||||
name = newname + " (" + ownjob + ")"
|
name = newname + " (" + ownjob + ")"
|
||||||
|
|
||||||
|
|
||||||
//AI verb and proc for sending PDA messages.
|
//AI verb and proc for sending PDA messages.
|
||||||
/obj/item/device/pda/ai/verb/cmd_send_pdamesg()
|
/obj/item/device/pda/ai/verb/cmd_send_pdamesg()
|
||||||
set category = "AI IM"
|
set category = "AI IM"
|
||||||
@@ -252,7 +251,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
|||||||
var/selected = plist[c]
|
var/selected = plist[c]
|
||||||
create_message(usr, selected, 0)
|
create_message(usr, selected, 0)
|
||||||
|
|
||||||
|
|
||||||
/obj/item/device/pda/ai/verb/cmd_toggle_pda_receiver()
|
/obj/item/device/pda/ai/verb/cmd_toggle_pda_receiver()
|
||||||
set category = "AI IM"
|
set category = "AI IM"
|
||||||
set name = "Toggle Sender/Receiver"
|
set name = "Toggle Sender/Receiver"
|
||||||
@@ -263,7 +261,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
|||||||
toff = !toff
|
toff = !toff
|
||||||
usr << "<span class='notice'>PDA sender/receiver toggled [(toff ? "Off" : "On")]!</span>"
|
usr << "<span class='notice'>PDA sender/receiver toggled [(toff ? "Off" : "On")]!</span>"
|
||||||
|
|
||||||
|
|
||||||
/obj/item/device/pda/ai/verb/cmd_toggle_pda_silent()
|
/obj/item/device/pda/ai/verb/cmd_toggle_pda_silent()
|
||||||
set category = "AI IM"
|
set category = "AI IM"
|
||||||
set name = "Toggle Ringer"
|
set name = "Toggle Ringer"
|
||||||
@@ -420,8 +417,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
|||||||
cartdata["radio"] = 1
|
cartdata["radio"] = 1
|
||||||
if(istype(cartridge.radio, /obj/item/radio/integrated/signal))
|
if(istype(cartridge.radio, /obj/item/radio/integrated/signal))
|
||||||
cartdata["radio"] = 2
|
cartdata["radio"] = 2
|
||||||
if(istype(cartridge.radio, /obj/item/radio/integrated/mule))
|
//if(istype(cartridge.radio, /obj/item/radio/integrated/mule))
|
||||||
cartdata["radio"] = 3
|
// cartdata["radio"] = 3
|
||||||
|
|
||||||
if(mode == 2)
|
if(mode == 2)
|
||||||
cartdata["charges"] = cartridge.charges ? cartridge.charges : 0
|
cartdata["charges"] = cartridge.charges ? cartridge.charges : 0
|
||||||
|
|||||||
@@ -124,10 +124,6 @@
|
|||||||
icon_state = "cart-q"
|
icon_state = "cart-q"
|
||||||
access_quartermaster = 1
|
access_quartermaster = 1
|
||||||
|
|
||||||
/obj/item/weapon/cartridge/quartermaster/initialize()
|
|
||||||
radio = new /obj/item/radio/integrated/mule(src)
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/item/weapon/cartridge/head
|
/obj/item/weapon/cartridge/head
|
||||||
name = "\improper Easy-Record DELUXE"
|
name = "\improper Easy-Record DELUXE"
|
||||||
icon_state = "cart-h"
|
icon_state = "cart-h"
|
||||||
@@ -141,9 +137,6 @@
|
|||||||
access_janitor = 1
|
access_janitor = 1
|
||||||
access_security = 1
|
access_security = 1
|
||||||
|
|
||||||
/obj/item/weapon/cartridge/hop/initialize()
|
|
||||||
radio = new /obj/item/radio/integrated/mule(src)
|
|
||||||
|
|
||||||
/obj/item/weapon/cartridge/hos
|
/obj/item/weapon/cartridge/hos
|
||||||
name = "\improper R.O.B.U.S.T. DELUXE"
|
name = "\improper R.O.B.U.S.T. DELUXE"
|
||||||
icon_state = "cart-hos"
|
icon_state = "cart-hos"
|
||||||
@@ -351,40 +344,26 @@
|
|||||||
/* MULEBOT Control (Mode: 48) */
|
/* MULEBOT Control (Mode: 48) */
|
||||||
|
|
||||||
if(mode==48)
|
if(mode==48)
|
||||||
var/muleData[0]
|
|
||||||
var/mulebotsData[0]
|
var/mulebotsData[0]
|
||||||
if(istype(radio,/obj/item/radio/integrated/mule))
|
var/count = 0
|
||||||
var/obj/item/radio/integrated/mule/QC = radio
|
|
||||||
muleData["active"] = QC.active
|
|
||||||
if(QC.active && !isnull(QC.botstatus))
|
|
||||||
var/area/loca = QC.botstatus["loca"]
|
|
||||||
var/loca_name = sanitize(loca.name)
|
|
||||||
muleData["botstatus"] = list("loca" = loca_name, "mode" = QC.botstatus["mode"],"home"=QC.botstatus["home"],"powr" = QC.botstatus["powr"],"retn" =QC.botstatus["retn"], "pick"=QC.botstatus["pick"], "load" = QC.botstatus["load"], "dest" = sanitize(QC.botstatus["dest"]))
|
|
||||||
|
|
||||||
else
|
for(var/mob/living/bot/mulebot/M in living_mob_list)
|
||||||
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
|
if(!M.on)
|
||||||
|
continue
|
||||||
|
++count
|
||||||
|
var/muleData[0]
|
||||||
|
muleData["name"] = M.suffix
|
||||||
|
muleData["location"] = get_area(M)
|
||||||
|
muleData["mode"] = M.mode
|
||||||
|
muleData["home"] = M.homeName
|
||||||
|
muleData["target"] = M.targetName
|
||||||
|
muleData["ref"] = "\ref[M]"
|
||||||
|
muleData["load"] = M.load ? M.load.name : "Nothing"
|
||||||
|
|
||||||
|
mulebotsData[++mulebotsData.len] = muleData.Copy()
|
||||||
|
|
||||||
var/mulebotsCount=0
|
values["mulebotcount"] = count
|
||||||
for(var/obj/machinery/bot/B in QC.botlist)
|
values["mulebots"] = mulebotsData
|
||||||
mulebotsCount++
|
|
||||||
if(B.loc)
|
|
||||||
mulebotsData[++mulebotsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
|
|
||||||
|
|
||||||
if(!mulebotsData.len)
|
|
||||||
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
|
||||||
|
|
||||||
muleData["bots"] = mulebotsData
|
|
||||||
muleData["count"] = mulebotsCount
|
|
||||||
|
|
||||||
else
|
|
||||||
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
|
|
||||||
muleData["active"] = 0
|
|
||||||
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
|
|
||||||
muleData["bots"] = mulebotsData
|
|
||||||
muleData["count"] = 0
|
|
||||||
|
|
||||||
values["mulebot"] = muleData
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -575,5 +554,9 @@
|
|||||||
loc:mode = 43
|
loc:mode = 43
|
||||||
mode = 43
|
mode = 43
|
||||||
|
|
||||||
|
if("MULEbot")
|
||||||
|
var/mob/living/bot/mulebot/M = locate(href_list["ref"])
|
||||||
|
if(istype(M))
|
||||||
|
M.obeyCommand(href_list["command"])
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -105,107 +105,6 @@
|
|||||||
radio_controller.remove_object(src, control_freq)
|
radio_controller.remove_object(src, control_freq)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/item/radio/integrated/mule
|
|
||||||
var/list/botlist = null // list of bots
|
|
||||||
var/obj/machinery/bot/mulebot/active // the active bot; if null, show bot list
|
|
||||||
var/list/botstatus // the status signal sent by the bot
|
|
||||||
var/list/beacons
|
|
||||||
|
|
||||||
var/beacon_freq = 1400
|
|
||||||
var/control_freq = BOT_FREQ
|
|
||||||
|
|
||||||
// create a new QM cartridge, and register to receive bot control & beacon message
|
|
||||||
New()
|
|
||||||
..()
|
|
||||||
spawn(5)
|
|
||||||
if(radio_controller)
|
|
||||||
radio_controller.add_object(src, control_freq, filter = RADIO_MULEBOT)
|
|
||||||
radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS)
|
|
||||||
spawn(10)
|
|
||||||
post_signal(beacon_freq, "findbeacon", "delivery", s_filter = RADIO_NAVBEACONS)
|
|
||||||
|
|
||||||
// receive radio signals
|
|
||||||
// can detect bot status signals
|
|
||||||
// and beacon locations
|
|
||||||
// create/populate lists as they are recvd
|
|
||||||
|
|
||||||
receive_signal(datum/signal/signal)
|
|
||||||
// var/obj/item/device/pda/P = src.loc
|
|
||||||
|
|
||||||
/*
|
|
||||||
world << "recvd:[P] : [signal.source]"
|
|
||||||
for(var/d in signal.data)
|
|
||||||
world << "- [d] = [signal.data[d]]"
|
|
||||||
*/
|
|
||||||
if(signal.data["type"] == "mulebot")
|
|
||||||
if(!botlist)
|
|
||||||
botlist = new()
|
|
||||||
|
|
||||||
if(!(signal.source in botlist))
|
|
||||||
botlist += signal.source
|
|
||||||
|
|
||||||
if(active == signal.source)
|
|
||||||
var/list/b = signal.data
|
|
||||||
botstatus = b.Copy()
|
|
||||||
|
|
||||||
else if(signal.data["beacon"])
|
|
||||||
if(!beacons)
|
|
||||||
beacons = new()
|
|
||||||
|
|
||||||
beacons[signal.data["beacon"] ] = signal.source
|
|
||||||
|
|
||||||
|
|
||||||
// if(istype(P)) P.updateSelfDialog()
|
|
||||||
|
|
||||||
Topic(href, href_list)
|
|
||||||
..()
|
|
||||||
var/cmd = "command"
|
|
||||||
if(active) cmd = "command [active.suffix]"
|
|
||||||
|
|
||||||
switch(href_list["op"])
|
|
||||||
|
|
||||||
if("control")
|
|
||||||
active = locate(href_list["bot"])
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
|
|
||||||
if("scanbots") // find all bots
|
|
||||||
botlist = null
|
|
||||||
post_signal(control_freq, "command", "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
|
|
||||||
if("botlist")
|
|
||||||
active = null
|
|
||||||
|
|
||||||
|
|
||||||
if("unload")
|
|
||||||
post_signal(control_freq, cmd, "unload", s_filter = RADIO_MULEBOT)
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
if("setdest")
|
|
||||||
if(beacons)
|
|
||||||
var/dest = input("Select Bot Destination", "Mulebot [active.suffix] Interlink", active.destination) as null|anything in beacons
|
|
||||||
if(dest)
|
|
||||||
post_signal(control_freq, cmd, "target", "destination", dest, s_filter = RADIO_MULEBOT)
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
|
|
||||||
if("retoff")
|
|
||||||
post_signal(control_freq, cmd, "autoret", "value", 0, s_filter = RADIO_MULEBOT)
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
if("reton")
|
|
||||||
post_signal(control_freq, cmd, "autoret", "value", 1, s_filter = RADIO_MULEBOT)
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
|
|
||||||
if("pickoff")
|
|
||||||
post_signal(control_freq, cmd, "autopick", "value", 0, s_filter = RADIO_MULEBOT)
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
if("pickon")
|
|
||||||
post_signal(control_freq, cmd, "autopick", "value", 1, s_filter = RADIO_MULEBOT)
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
|
|
||||||
if("stop", "go", "home")
|
|
||||||
post_signal(control_freq, cmd, href_list["op"], s_filter = RADIO_MULEBOT)
|
|
||||||
post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Radio Cartridge, essentially a signaler.
|
* Radio Cartridge, essentially a signaler.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
item_state = "electronic"
|
item_state = "electronic"
|
||||||
w_class = 2.0
|
w_class = 2.0
|
||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
show_messages = 1
|
show_messages = 0
|
||||||
|
|
||||||
var/flush = null
|
var/flush = null
|
||||||
origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
|
origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
|
||||||
@@ -100,10 +100,10 @@
|
|||||||
user << "<span class='danger'>Transfer failed:</span> Existing AI found on remote terminal. Remove existing AI to install a new one."
|
user << "<span class='danger'>Transfer failed:</span> Existing AI found on remote terminal. Remove existing AI to install a new one."
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(ai.is_malf())
|
user.visible_message("\The [user] starts downloading \the [ai] into \the [src]...", "You start downloading \the [ai] into \the [src]...")
|
||||||
user << "<span class='danger'>ERROR:</span> Remote transfer interface disabled."
|
ai << "<span class='danger'>\The [user] is downloading you into \the [src]!</span>"
|
||||||
return 0
|
|
||||||
|
|
||||||
|
if(do_after(user, 100))
|
||||||
if(istype(ai.loc, /turf/))
|
if(istype(ai.loc, /turf/))
|
||||||
new /obj/structure/AIcore/deactivated(get_turf(ai))
|
new /obj/structure/AIcore/deactivated(get_turf(ai))
|
||||||
|
|
||||||
|
|||||||
@@ -145,11 +145,6 @@
|
|||||||
qdel(animation)
|
qdel(animation)
|
||||||
|
|
||||||
for(var/mob/living/carbon/M in oviewers(3, null))
|
for(var/mob/living/carbon/M in oviewers(3, null))
|
||||||
if(prob(50))
|
|
||||||
if (locate(/obj/item/weapon/cloaking_device, M))
|
|
||||||
for(var/obj/item/weapon/cloaking_device/S in M)
|
|
||||||
S.active = 0
|
|
||||||
S.icon_state = "shield0"
|
|
||||||
var/safety = M:eyecheck()
|
var/safety = M:eyecheck()
|
||||||
if(!safety)
|
if(!safety)
|
||||||
if(!M.blinded)
|
if(!M.blinded)
|
||||||
|
|||||||
@@ -93,6 +93,20 @@
|
|||||||
brightness_on = 2
|
brightness_on = 2
|
||||||
w_class = 1
|
w_class = 1
|
||||||
|
|
||||||
|
/obj/item/device/flashlight/maglight
|
||||||
|
name = "maglight"
|
||||||
|
desc = "A very, very heavy duty flashlight."
|
||||||
|
icon_state = "maglight"
|
||||||
|
item_state = "maglight"
|
||||||
|
force = 10
|
||||||
|
flags = CONDUCT
|
||||||
|
brightness_on = 4
|
||||||
|
slot_flags = SLOT_BELT
|
||||||
|
w_class = 2
|
||||||
|
attack_verb = list ("smacked", "thwacked", "thunked")
|
||||||
|
matter = list(DEFAULT_WALL_MATERIAL = 200,"glass" = 50)
|
||||||
|
hitsound = "swing_hit"
|
||||||
|
|
||||||
/obj/item/device/flashlight/drone
|
/obj/item/device/flashlight/drone
|
||||||
name = "low-power flashlight"
|
name = "low-power flashlight"
|
||||||
desc = "A miniature lamp, that might be used by small robots."
|
desc = "A miniature lamp, that might be used by small robots."
|
||||||
@@ -186,6 +200,14 @@
|
|||||||
src.damtype = "fire"
|
src.damtype = "fire"
|
||||||
processing_objects += src
|
processing_objects += src
|
||||||
|
|
||||||
|
/obj/item/device/flashlight/flare/proc/ignite() //Used for flare launchers.
|
||||||
|
on = !on
|
||||||
|
update_icon()
|
||||||
|
force = on_damage
|
||||||
|
damtype = "fire"
|
||||||
|
processing_objects += src
|
||||||
|
return 1
|
||||||
|
|
||||||
/obj/item/device/flashlight/slime
|
/obj/item/device/flashlight/slime
|
||||||
gender = PLURAL
|
gender = PLURAL
|
||||||
name = "glowing slime extract"
|
name = "glowing slime extract"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
w_class = 2.0
|
w_class = 2.0
|
||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
origin_tech = list(TECH_DATA = 2)
|
origin_tech = list(TECH_DATA = 2)
|
||||||
show_messages = 1
|
show_messages = 0
|
||||||
|
|
||||||
var/obj/item/device/radio/radio
|
var/obj/item/device/radio/radio
|
||||||
var/looking_for_personality = 0
|
var/looking_for_personality = 0
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ REAGENT SCANNER
|
|||||||
user.show_message("<span class='notice'>Analyzing Results for [M]:</span>")
|
user.show_message("<span class='notice'>Analyzing Results for [M]:</span>")
|
||||||
user.show_message("<span class='notice'>Overall Status: dead</span>")
|
user.show_message("<span class='notice'>Overall Status: dead</span>")
|
||||||
else
|
else
|
||||||
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health - M.halloss]% healthy"]</span>")
|
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health/M.maxHealth)*100]% healthy"]</span>")
|
||||||
user.show_message("<span class='notice'> Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
|
user.show_message("<span class='notice'> Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
|
||||||
user.show_message("<span class='notice'> Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font></span>")
|
user.show_message("<span class='notice'> Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font></span>")
|
||||||
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)</span>", 1)
|
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)</span>", 1)
|
||||||
@@ -158,13 +158,12 @@ REAGENT SCANNER
|
|||||||
user.show_message(text("<span class='warning'>Internal bleeding detected. Advanced scanner required for location.</span>"), 1)
|
user.show_message(text("<span class='warning'>Internal bleeding detected. Advanced scanner required for location.</span>"), 1)
|
||||||
break
|
break
|
||||||
if(M:vessel)
|
if(M:vessel)
|
||||||
var/blood_volume = round(M:vessel.get_reagent_amount("blood"))
|
var/blood_volume = H.vessel.get_reagent_amount("blood")
|
||||||
var/blood_percent = blood_volume / 560
|
var/blood_percent = round((blood_volume / H.species.blood_volume)*100)
|
||||||
var/blood_type = M.dna.b_type
|
var/blood_type = H.dna.b_type
|
||||||
blood_percent *= 100
|
if((blood_percent <= BLOOD_VOLUME_SAFE) && (blood_percent > BLOOD_VOLUME_BAD))
|
||||||
if(blood_volume <= 500 && blood_volume > 336)
|
|
||||||
user.show_message("<span class='danger'>Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl.</span> <span class='notice'>Type: [blood_type]</span>")
|
user.show_message("<span class='danger'>Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl.</span> <span class='notice'>Type: [blood_type]</span>")
|
||||||
else if(blood_volume <= 336)
|
else if(blood_percent <= BLOOD_VOLUME_BAD)
|
||||||
user.show_message("<span class='danger'><i>Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl.</i></span> <span class='notice'>Type: [blood_type]</span>")
|
user.show_message("<span class='danger'><i>Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl.</i></span> <span class='notice'>Type: [blood_type]</span>")
|
||||||
else
|
else
|
||||||
user.show_message("<span class='notice'>Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]</span>")
|
user.show_message("<span class='notice'>Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]</span>")
|
||||||
|
|||||||
@@ -27,6 +27,9 @@
|
|||||||
/datum/uplink_category/stealth_items
|
/datum/uplink_category/stealth_items
|
||||||
name = "Stealth and Camouflage Items"
|
name = "Stealth and Camouflage Items"
|
||||||
|
|
||||||
|
/datum/uplink_category/armor
|
||||||
|
name = "Armor"
|
||||||
|
|
||||||
/datum/uplink_category/tools
|
/datum/uplink_category/tools
|
||||||
name = "Devices and Tools"
|
name = "Devices and Tools"
|
||||||
|
|
||||||
|
|||||||
@@ -305,6 +305,22 @@ datum/uplink_item/dd_SortValue()
|
|||||||
item_cost = 6
|
item_cost = 6
|
||||||
path = /obj/item/weapon/disk/file/cameras/syndicate
|
path = /obj/item/weapon/disk/file/cameras/syndicate
|
||||||
|
|
||||||
|
/********
|
||||||
|
* Armor *
|
||||||
|
********/
|
||||||
|
/datum/uplink_item/item/armor
|
||||||
|
category = /datum/uplink_category/armor
|
||||||
|
|
||||||
|
/datum/uplink_item/item/armor/combat
|
||||||
|
name = "Combat Armor Set"
|
||||||
|
item_cost = 5
|
||||||
|
path = /obj/item/weapon/storage/box/syndie_kit/combat_armor
|
||||||
|
|
||||||
|
/datum/uplink_item/item/armor/heavy_vest
|
||||||
|
name = "Heavy Armor Vest"
|
||||||
|
item_cost = 4
|
||||||
|
path = /obj/item/clothing/suit/storage/vest/heavy/merc
|
||||||
|
|
||||||
/********************
|
/********************
|
||||||
* Devices and Tools *
|
* Devices and Tools *
|
||||||
********************/
|
********************/
|
||||||
@@ -351,11 +367,6 @@ datum/uplink_item/dd_SortValue()
|
|||||||
item_cost = 3
|
item_cost = 3
|
||||||
path = /obj/item/clothing/glasses/thermal/syndi
|
path = /obj/item/clothing/glasses/thermal/syndi
|
||||||
|
|
||||||
/datum/uplink_item/item/tools/heavy_vest
|
|
||||||
name = "Heavy Armor Vest"
|
|
||||||
item_cost = 4
|
|
||||||
path = /obj/item/clothing/suit/storage/vest/heavy/merc
|
|
||||||
|
|
||||||
/datum/uplink_item/item/tools/powersink
|
/datum/uplink_item/item/tools/powersink
|
||||||
name = "Powersink (DANGER!)"
|
name = "Powersink (DANGER!)"
|
||||||
item_cost = 5
|
item_cost = 5
|
||||||
|
|||||||
@@ -61,6 +61,9 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
|
|||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/voice)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/voice)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/camera_floppy, 10, 0)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/camera_floppy, 10, 0)
|
||||||
|
|
||||||
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/armor/heavy_vest)
|
||||||
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/armor/combat)
|
||||||
|
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/toolbox, reselect_propbability = 10)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/toolbox, reselect_propbability = 10)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/plastique)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/plastique)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/encryptionkey_radio)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/encryptionkey_radio)
|
||||||
@@ -69,7 +72,6 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
|
|||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/clerical)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/clerical)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/space_suit, 50, 10)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/space_suit, 50, 10)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/thermal)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/thermal)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/heavy_vest)
|
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/powersink, 10, 10)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/powersink, 10, 10)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/ai_module, 25, 0)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/ai_module, 25, 0)
|
||||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/teleporter, 10, 0)
|
items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/teleporter, 10, 0)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
* Grass
|
* Grass
|
||||||
* Wood
|
* Wood
|
||||||
* Carpet
|
* Carpet
|
||||||
|
* Linoleum
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/obj/item/stack/tile
|
/obj/item/stack/tile
|
||||||
@@ -126,3 +127,14 @@
|
|||||||
charge_costs = list(250)
|
charge_costs = list(250)
|
||||||
stacktype = /obj/item/stack/tile/floor
|
stacktype = /obj/item/stack/tile/floor
|
||||||
build_type = /obj/item/stack/tile/floor
|
build_type = /obj/item/stack/tile/floor
|
||||||
|
|
||||||
|
/obj/item/stack/tile/linoleum
|
||||||
|
name = "linoleum"
|
||||||
|
singular_name = "linoleum"
|
||||||
|
desc = "A piece of linoleum. It is the same size as a normal floor tile!"
|
||||||
|
icon_state = "tile-linoleum"
|
||||||
|
force = 1.0
|
||||||
|
throwforce = 1.0
|
||||||
|
throw_speed = 5
|
||||||
|
throw_range = 20
|
||||||
|
flags = 0
|
||||||
@@ -195,6 +195,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
|||||||
text = replacetext(text, "FLAME", "[W.name]")
|
text = replacetext(text, "FLAME", "[W.name]")
|
||||||
light(text)
|
light(text)
|
||||||
|
|
||||||
|
/obj/item/clothing/mask/smokable/attack(var/mob/living/M, var/mob/living/user, def_zone)
|
||||||
|
if(istype(M) && M.on_fire)
|
||||||
|
user.do_attack_animation(M)
|
||||||
|
light("<span class='notice'>[user] coldly lights the [name] with the burning body of [M].</span>")
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return ..()
|
||||||
|
|
||||||
/obj/item/clothing/mask/smokable/cigarette
|
/obj/item/clothing/mask/smokable/cigarette
|
||||||
name = "cigarette"
|
name = "cigarette"
|
||||||
desc = "A roll of tobacco and nicotine."
|
desc = "A roll of tobacco and nicotine."
|
||||||
|
|||||||
@@ -12,3 +12,10 @@
|
|||||||
"/obj/item/weapon/cell" = 1,
|
"/obj/item/weapon/cell" = 1,
|
||||||
"/obj/item/weapon/stock_parts/matter_bin" = 1,
|
"/obj/item/weapon/stock_parts/matter_bin" = 1,
|
||||||
"/obj/item/weapon/stock_parts/micro_laser" = 1)
|
"/obj/item/weapon/stock_parts/micro_laser" = 1)
|
||||||
|
|
||||||
|
/obj/item/weapon/circuitboard/miningdrillbrace
|
||||||
|
name = T_BOARD("mining drill brace")
|
||||||
|
build_path = "/obj/machinery/mining/brace"
|
||||||
|
board_type = "machine"
|
||||||
|
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
|
||||||
|
req_components = list()
|
||||||
|
|||||||
@@ -17,9 +17,7 @@
|
|||||||
var/affected_area = 3
|
var/affected_area = 3
|
||||||
|
|
||||||
New()
|
New()
|
||||||
var/datum/reagents/R = new/datum/reagents(1000)
|
create_reagents(1000)
|
||||||
reagents = R
|
|
||||||
R.my_atom = src
|
|
||||||
|
|
||||||
attack_self(mob/user as mob)
|
attack_self(mob/user as mob)
|
||||||
if(!stage || stage==1)
|
if(!stage || stage==1)
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
|
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
|
||||||
var/spread_range = 7
|
var/spread_range = 7
|
||||||
|
loadable = null
|
||||||
|
|
||||||
/obj/item/weapon/grenade/explosive/prime()
|
/obj/item/weapon/grenade/explosive/prime()
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -27,26 +27,16 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged.
|
proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged.
|
||||||
if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging
|
M << "<span class='danger'>BANG</span>" // Called during the loop that bangs people in lockers/containers and when banging
|
||||||
for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions.
|
playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) // people in normal view. Could theroetically be called during other explosions.
|
||||||
S.active = 0 // -- Polymorph
|
// -- Polymorph
|
||||||
S.icon_state = "shield0"
|
|
||||||
|
|
||||||
M << "<span class='danger'>BANG</span>"
|
|
||||||
playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5)
|
|
||||||
|
|
||||||
//Checking for protections
|
//Checking for protections
|
||||||
var/eye_safety = 0
|
var/eye_safety = 0
|
||||||
var/ear_safety = 0
|
var/ear_safety = 0
|
||||||
if(iscarbon(M))
|
if(iscarbon(M))
|
||||||
eye_safety = M.eyecheck()
|
eye_safety = M.eyecheck()
|
||||||
if(ishuman(M))
|
ear_safety = M.get_ear_protection()
|
||||||
if(istype(M:l_ear, /obj/item/clothing/ears/earmuffs) || istype(M:r_ear, /obj/item/clothing/ears/earmuffs))
|
|
||||||
ear_safety += 2
|
|
||||||
if(HULK in M.mutations)
|
|
||||||
ear_safety += 1
|
|
||||||
if(istype(M:head, /obj/item/clothing/head/helmet))
|
|
||||||
ear_safety += 1
|
|
||||||
|
|
||||||
//Flashing everyone
|
//Flashing everyone
|
||||||
if(eye_safety < 1)
|
if(eye_safety < 1)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
name = "fragmentation grenade"
|
name = "fragmentation grenade"
|
||||||
desc = "A military fragmentation grenade, designed to explode in a deadly shower of fragments."
|
desc = "A military fragmentation grenade, designed to explode in a deadly shower of fragments."
|
||||||
icon_state = "frag"
|
icon_state = "frag"
|
||||||
|
loadable = null
|
||||||
|
|
||||||
var/num_fragments = 200 //total number of fragments produced by the grenade
|
var/num_fragments = 200 //total number of fragments produced by the grenade
|
||||||
var/fragment_damage = 15
|
var/fragment_damage = 15
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
var/active = 0
|
var/active = 0
|
||||||
var/det_time = 50
|
var/det_time = 50
|
||||||
|
var/loadable = 1
|
||||||
|
|
||||||
/obj/item/weapon/grenade/proc/clown_check(var/mob/living/user)
|
/obj/item/weapon/grenade/proc/clown_check(var/mob/living/user)
|
||||||
if((CLUMSY in user.mutations) && prob(50))
|
if((CLUMSY in user.mutations) && prob(50))
|
||||||
|
|||||||
@@ -68,7 +68,6 @@
|
|||||||
if(M.buckled) //wheelchairs, office chairs, rollerbeds
|
if(M.buckled) //wheelchairs, office chairs, rollerbeds
|
||||||
return
|
return
|
||||||
|
|
||||||
M << "<span class='danger'>You step on \the [src]!</span>"
|
|
||||||
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
|
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
@@ -79,6 +78,8 @@
|
|||||||
if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) )
|
if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) )
|
||||||
return
|
return
|
||||||
|
|
||||||
|
M << "<span class='danger'>You step on \the [src]!</span>"
|
||||||
|
|
||||||
var/list/check = list("l_foot", "r_foot")
|
var/list/check = list("l_foot", "r_foot")
|
||||||
while(check.len)
|
while(check.len)
|
||||||
var/picked = pick(check)
|
var/picked = pick(check)
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
/obj/item/weapon/shield/riot
|
/obj/item/weapon/shield/riot
|
||||||
name = "riot shield"
|
name = "riot shield"
|
||||||
desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder."
|
desc = "A shield adept for close quarters engagement. It's also capable of protecting from less powerful projectiles."
|
||||||
icon = 'icons/obj/weapons.dmi'
|
icon = 'icons/obj/weapons.dmi'
|
||||||
icon_state = "riot"
|
icon_state = "riot"
|
||||||
flags = CONDUCT
|
flags = CONDUCT
|
||||||
@@ -65,17 +65,31 @@
|
|||||||
attack_verb = list("shoved", "bashed")
|
attack_verb = list("shoved", "bashed")
|
||||||
var/cooldown = 0 //shield bash cooldown. based on world.time
|
var/cooldown = 0 //shield bash cooldown. based on world.time
|
||||||
|
|
||||||
/obj/item/weapon/shield/riot/handle_shield(mob/user)
|
/obj/item/weapon/shield/riot/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||||
. = ..()
|
if(user.incapacitated())
|
||||||
if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1)
|
return 0
|
||||||
|
|
||||||
/obj/item/weapon/shield/riot/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null)
|
//block as long as they are not directly behind us
|
||||||
|
var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block
|
||||||
|
if(check_shield_arc(user, bad_arc, damage_source, attacker))
|
||||||
|
if(prob(get_block_chance(user, damage, damage_source, attacker)))
|
||||||
|
//At this point, we succeeded in our roll for a block attempt, however these kinds of shields struggle to stand up
|
||||||
|
//to strong bullets and lasers. They still do fine to pistol rounds of all kinds, however.
|
||||||
if(istype(damage_source, /obj/item/projectile))
|
if(istype(damage_source, /obj/item/projectile))
|
||||||
var/obj/item/projectile/P = damage_source
|
var/obj/item/projectile/P = damage_source
|
||||||
//plastic shields do not stop bullets or lasers, even in space. Will block beanbags, rubber bullets, and stunshots just fine though.
|
if((is_sharp(P) && P.armor_penetration >= 10) || istype(P, /obj/item/projectile/beam))
|
||||||
if((is_sharp(P) && damage > 10) || istype(P, /obj/item/projectile/beam))
|
//If we're at this point, the bullet/beam is going to go through the shield, however it will hit for less damage.
|
||||||
|
//Bullets get slowed down, while beams are diffused as they hit the shield, so these shields are not /completely/
|
||||||
|
//useless. Extremely penetrating projectiles will go through the shield without less damage.
|
||||||
|
user.visible_message("<span class='danger'>\The [user]'s [src.name] is pierced by [attack_text]!</span>")
|
||||||
|
if(P.armor_penetration < 30) //PTR bullets and x-rays will bypass this entirely.
|
||||||
|
P.damage = P.damage / 2
|
||||||
|
return 0
|
||||||
|
//Otherwise, if we're here, we're gonna stop the attack entirely.
|
||||||
|
user.visible_message("<span class='danger'>\The [user] blocks [attack_text] with \the [src]!</span>")
|
||||||
|
playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||||
|
return 1
|
||||||
return 0
|
return 0
|
||||||
return base_block_chance
|
|
||||||
|
|
||||||
/obj/item/weapon/shield/riot/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/item/weapon/shield/riot/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
if(istype(W, /obj/item/weapon/melee/baton))
|
if(istype(W, /obj/item/weapon/melee/baton))
|
||||||
@@ -160,39 +174,6 @@
|
|||||||
else
|
else
|
||||||
set_light(0)
|
set_light(0)
|
||||||
|
|
||||||
/obj/item/weapon/cloaking_device
|
|
||||||
name = "cloaking device"
|
|
||||||
desc = "Use this to become invisible to the human eye."
|
|
||||||
icon = 'icons/obj/device.dmi'
|
|
||||||
icon_state = "shield0"
|
|
||||||
var/active = 0.0
|
|
||||||
flags = CONDUCT
|
|
||||||
item_state = "electronic"
|
|
||||||
throwforce = 10.0
|
|
||||||
throw_speed = 2
|
|
||||||
throw_range = 10
|
|
||||||
w_class = 2.0
|
|
||||||
origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/weapon/cloaking_device/attack_self(mob/user as mob)
|
|
||||||
src.active = !( src.active )
|
|
||||||
if (src.active)
|
|
||||||
user << "<span class='notice'>\The [src] is now active.</span>"
|
|
||||||
src.icon_state = "shield1"
|
|
||||||
else
|
|
||||||
user << "<span class='notice'>\The [src] is now inactive.</span>"
|
|
||||||
src.icon_state = "shield0"
|
|
||||||
src.add_fingerprint(user)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/item/weapon/cloaking_device/emp_act(severity)
|
|
||||||
active = 0
|
|
||||||
icon_state = "shield0"
|
|
||||||
if(ismob(loc))
|
|
||||||
loc:update_icons()
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/item/weapon/shield/riot/tele
|
/obj/item/weapon/shield/riot/tele
|
||||||
name = "telescopic shield"
|
name = "telescopic shield"
|
||||||
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
|
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
|
||||||
|
|||||||
@@ -53,7 +53,8 @@
|
|||||||
/obj/item/weapon/material/minihoe,
|
/obj/item/weapon/material/minihoe,
|
||||||
/obj/item/weapon/material/hatchet,
|
/obj/item/weapon/material/hatchet,
|
||||||
/obj/item/device/analyzer/plant_analyzer,
|
/obj/item/device/analyzer/plant_analyzer,
|
||||||
/obj/item/weapon/extinguisher/mini
|
/obj/item/weapon/extinguisher/mini,
|
||||||
|
/obj/item/device/flashlight/maglight
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -135,7 +136,6 @@
|
|||||||
/obj/item/weapon/melee/baton,
|
/obj/item/weapon/melee/baton,
|
||||||
/obj/item/weapon/gun/energy/taser,
|
/obj/item/weapon/gun/energy/taser,
|
||||||
/obj/item/weapon/flame/lighter,
|
/obj/item/weapon/flame/lighter,
|
||||||
/obj/item/clothing/glasses/hud/security,
|
|
||||||
/obj/item/device/flashlight,
|
/obj/item/device/flashlight,
|
||||||
/obj/item/device/pda,
|
/obj/item/device/pda,
|
||||||
/obj/item/device/radio/headset,
|
/obj/item/device/radio/headset,
|
||||||
@@ -165,7 +165,6 @@
|
|||||||
/obj/item/weapon/forensics/sample_kit/powder,
|
/obj/item/weapon/forensics/sample_kit/powder,
|
||||||
/obj/item/weapon/forensics/swab,
|
/obj/item/weapon/forensics/swab,
|
||||||
/obj/item/device/uv_light,
|
/obj/item/device/uv_light,
|
||||||
/obj/item/weapon/forensics/slide,
|
|
||||||
/obj/item/weapon/forensics/sample_kit,
|
/obj/item/weapon/forensics/sample_kit,
|
||||||
/obj/item/weapon/photo,
|
/obj/item/weapon/photo,
|
||||||
/obj/item/device/camera_film,
|
/obj/item/device/camera_film,
|
||||||
|
|||||||
@@ -56,12 +56,6 @@
|
|||||||
new /obj/item/clothing/mask/breath( src )
|
new /obj/item/clothing/mask/breath( src )
|
||||||
new /obj/item/weapon/tank/emergency_oxygen( src )
|
new /obj/item/weapon/tank/emergency_oxygen( src )
|
||||||
|
|
||||||
/obj/item/weapon/storage/box/vox/
|
|
||||||
New()
|
|
||||||
..()
|
|
||||||
new /obj/item/clothing/mask/breath( src )
|
|
||||||
new /obj/item/weapon/tank/emergency_nitrogen( src )
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/box/engineer/
|
/obj/item/weapon/storage/box/engineer/
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -161,6 +155,8 @@
|
|||||||
/obj/item/weapon/storage/box/blanks
|
/obj/item/weapon/storage/box/blanks
|
||||||
name = "box of blank shells"
|
name = "box of blank shells"
|
||||||
desc = "It has a picture of a gun and several warning symbols on the front."
|
desc = "It has a picture of a gun and several warning symbols on the front."
|
||||||
|
icon_state = "blankshot_box"
|
||||||
|
item_state = "syringe_kit"
|
||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -175,6 +171,8 @@
|
|||||||
/obj/item/weapon/storage/box/beanbags
|
/obj/item/weapon/storage/box/beanbags
|
||||||
name = "box of beanbag shells"
|
name = "box of beanbag shells"
|
||||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||||
|
icon_state = "beanshot_box"
|
||||||
|
item_state = "syringe_kit"
|
||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -189,6 +187,8 @@
|
|||||||
/obj/item/weapon/storage/box/shotgunammo
|
/obj/item/weapon/storage/box/shotgunammo
|
||||||
name = "box of shotgun slugs"
|
name = "box of shotgun slugs"
|
||||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||||
|
icon_state = "lethalshellshot_box"
|
||||||
|
item_state = "syringe_kit"
|
||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -203,6 +203,8 @@
|
|||||||
/obj/item/weapon/storage/box/shotgunshells
|
/obj/item/weapon/storage/box/shotgunshells
|
||||||
name = "box of shotgun shells"
|
name = "box of shotgun shells"
|
||||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||||
|
icon_state = "lethalslug_box"
|
||||||
|
item_state = "syringe_kit"
|
||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -217,6 +219,8 @@
|
|||||||
/obj/item/weapon/storage/box/flashshells
|
/obj/item/weapon/storage/box/flashshells
|
||||||
name = "box of illumination shells"
|
name = "box of illumination shells"
|
||||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||||
|
icon_state = "illumshot_box"
|
||||||
|
item_state = "syringe_kit"
|
||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -231,6 +235,8 @@
|
|||||||
/obj/item/weapon/storage/box/stunshells
|
/obj/item/weapon/storage/box/stunshells
|
||||||
name = "box of stun shells"
|
name = "box of stun shells"
|
||||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||||
|
icon_state = "stunshot_box"
|
||||||
|
item_state = "syringe_kit"
|
||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -245,6 +251,8 @@
|
|||||||
/obj/item/weapon/storage/box/practiceshells
|
/obj/item/weapon/storage/box/practiceshells
|
||||||
name = "box of practice shells"
|
name = "box of practice shells"
|
||||||
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
desc = "It has a picture of a gun and several warning symbols on the front.<br>WARNING: Live ammunition. Misuse may result in serious injury or death."
|
||||||
|
icon_state = "blankshot_box"
|
||||||
|
item_state = "syringe_kit"
|
||||||
|
|
||||||
New()
|
New()
|
||||||
..()
|
..()
|
||||||
@@ -687,6 +695,7 @@
|
|||||||
icon = 'icons/obj/storage.dmi'
|
icon = 'icons/obj/storage.dmi'
|
||||||
icon_state = "portafreezer"
|
icon_state = "portafreezer"
|
||||||
item_state = "medicalpack"
|
item_state = "medicalpack"
|
||||||
|
foldable = null
|
||||||
storage_slots=7
|
storage_slots=7
|
||||||
max_w_class = 3
|
max_w_class = 3
|
||||||
can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass)
|
can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass)
|
||||||
|
|||||||
@@ -132,6 +132,7 @@
|
|||||||
name = "surgery kit"
|
name = "surgery kit"
|
||||||
desc = "Contains tools for surgery."
|
desc = "Contains tools for surgery."
|
||||||
storage_slots = 10
|
storage_slots = 10
|
||||||
|
max_storage_space = 23
|
||||||
|
|
||||||
/obj/item/weapon/storage/firstaid/surgery/New()
|
/obj/item/weapon/storage/firstaid/surgery/New()
|
||||||
..()
|
..()
|
||||||
|
|||||||
87
code/game/objects/items/weapons/storage/laundry_basket.dm
Normal file
87
code/game/objects/items/weapons/storage/laundry_basket.dm
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
// -----------------------------
|
||||||
|
// Laundry Basket
|
||||||
|
// -----------------------------
|
||||||
|
// An item designed for hauling the belongings of a character.
|
||||||
|
// So this cannot be abused for other uses, we make it two-handed and inable to have its storage looked into.
|
||||||
|
/obj/item/weapon/storage/laundry_basket
|
||||||
|
name = "laundry basket"
|
||||||
|
icon = 'icons/obj/janitor.dmi'
|
||||||
|
icon_state = "laundry-empty"
|
||||||
|
item_state = "laundry"
|
||||||
|
desc = "The peak of thousands of years of laundry evolution."
|
||||||
|
|
||||||
|
w_class = 5
|
||||||
|
max_w_class = 4
|
||||||
|
max_storage_space = 25 //20 for clothes + a bit of additional space for non-clothing items that were worn on body
|
||||||
|
storage_slots = 14
|
||||||
|
use_to_pickup = 1
|
||||||
|
allow_quick_empty = 1
|
||||||
|
allow_quick_gather = 1
|
||||||
|
collection_mode = 1
|
||||||
|
var/linked
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/attack_hand(mob/user as mob)
|
||||||
|
if(ishuman(user))
|
||||||
|
var/mob/living/carbon/human/H = user
|
||||||
|
var/obj/item/organ/external/temp = H.get_organ("r_hand")
|
||||||
|
if (user.hand)
|
||||||
|
temp = H.get_organ("l_hand")
|
||||||
|
if(!temp)
|
||||||
|
user << "<span class='warning'>You need two hands to pick this up!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
if(user.get_inactive_hand())
|
||||||
|
user << "<span class='warning'>You need your other hand to be empty</span>"
|
||||||
|
return
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/attack_self(mob/user as mob)
|
||||||
|
var/turf/T = get_turf(user)
|
||||||
|
user << "<span class='notice'>You dump the [src]'s contents onto \the [T].</span>"
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/pickup(mob/user)
|
||||||
|
var/obj/item/weapon/storage/laundry_basket/offhand/O = new(user)
|
||||||
|
O.name = "[name] - second hand"
|
||||||
|
O.desc = "Your second grip on the [name]."
|
||||||
|
O.linked = src
|
||||||
|
user.put_in_inactive_hand(O)
|
||||||
|
linked = O
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/update_icon()
|
||||||
|
if(contents.len)
|
||||||
|
icon_state = "laundry-full"
|
||||||
|
else
|
||||||
|
icon_state = "laundry-empty"
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/MouseDrop(obj/over_object as obj)
|
||||||
|
if(over_object == usr)
|
||||||
|
return
|
||||||
|
else
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/dropped(mob/user as mob)
|
||||||
|
qdel(linked)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/show_to(mob/user as mob)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/open(mob/user as mob)
|
||||||
|
|
||||||
|
|
||||||
|
//Offhand
|
||||||
|
/obj/item/weapon/storage/laundry_basket/offhand
|
||||||
|
icon = 'icons/obj/weapons.dmi'
|
||||||
|
icon_state = "offhand"
|
||||||
|
name = "second hand"
|
||||||
|
use_to_pickup = 0
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/laundry_basket/offhand/dropped(mob/user as mob)
|
||||||
|
user.drop_from_inventory(linked)
|
||||||
|
return
|
||||||
|
|
||||||
@@ -256,4 +256,14 @@
|
|||||||
new /obj/item/weapon/spacecash/c1000(src)
|
new /obj/item/weapon/spacecash/c1000(src)
|
||||||
new /obj/item/weapon/spacecash/c1000(src)
|
new /obj/item/weapon/spacecash/c1000(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/box/syndie_kit/combat_armor
|
||||||
|
name = "combat armor kit"
|
||||||
|
desc = "Contains a full set of combat armor."
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/box/syndie_kit/combat_armor/New()
|
||||||
|
..()
|
||||||
|
new /obj/item/clothing/head/helmet/combat(src)
|
||||||
|
new /obj/item/clothing/suit/armor/combat(src)
|
||||||
|
new /obj/item/clothing/gloves/arm_guard/combat(src)
|
||||||
|
new /obj/item/clothing/shoes/leg_guard/combat(src)
|
||||||
|
return
|
||||||
@@ -122,8 +122,11 @@
|
|||||||
if(user.a_intent == I_HURT)
|
if(user.a_intent == I_HURT)
|
||||||
if (!..()) //item/attack() does it's own messaging and logs
|
if (!..()) //item/attack() does it's own messaging and logs
|
||||||
return 0 // item/attack() will return 1 if they hit, 0 if they missed.
|
return 0 // item/attack() will return 1 if they hit, 0 if they missed.
|
||||||
agony *= 0.5 //whacking someone causes a much poorer contact than prodding them.
|
|
||||||
stun *= 0.5
|
stun *= 0.5
|
||||||
|
if(status) //Checks to see if the stunbaton is on.
|
||||||
|
agony *= 0.5 //whacking someone causes a much poorer contact than prodding them.
|
||||||
|
else
|
||||||
|
agony = 0 //Shouldn't really stun if it's off, should it?
|
||||||
//we can't really extract the actual hit zone from ..(), unfortunately. Just act like they attacked the area they intended to.
|
//we can't really extract the actual hit zone from ..(), unfortunately. Just act like they attacked the area they intended to.
|
||||||
else
|
else
|
||||||
//copied from human_defense.dm - human defence code should really be refactored some time.
|
//copied from human_defense.dm - human defence code should really be refactored some time.
|
||||||
|
|||||||
@@ -148,31 +148,6 @@
|
|||||||
gauge_icon = "indicator_emergency_double"
|
gauge_icon = "indicator_emergency_double"
|
||||||
volume = 10
|
volume = 10
|
||||||
|
|
||||||
/obj/item/weapon/tank/emergency_nitrogen
|
|
||||||
name = "emergency nitrogen tank"
|
|
||||||
desc = "An emergency air tank hastily painted red and issued to Vox crewmembers."
|
|
||||||
icon_state = "emergency_nitro"
|
|
||||||
gauge_icon = "indicator_emergency"
|
|
||||||
gauge_cap = 4
|
|
||||||
flags = CONDUCT
|
|
||||||
slot_flags = SLOT_BELT
|
|
||||||
w_class = 2.0
|
|
||||||
force = 4.0
|
|
||||||
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
|
|
||||||
volume = 2
|
|
||||||
|
|
||||||
New()
|
|
||||||
..()
|
|
||||||
src.air_contents.adjust_gas("nitrogen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
examine(mob/user)
|
|
||||||
if(..(user, 0) && air_contents.gas["nitrogen"] < 0.2 && loc==user)
|
|
||||||
user << text("<span class='danger'>The meter on \the [src] indicates you are almost out of air!</span>")
|
|
||||||
user << sound('sound/effects/alert.ogg')
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Nitrogen
|
* Nitrogen
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -216,7 +216,7 @@
|
|||||||
if(prob(5))
|
if(prob(5))
|
||||||
remove_fuel(1)
|
remove_fuel(1)
|
||||||
|
|
||||||
if(get_fuel() == 0)
|
if(get_fuel() < 1)
|
||||||
setWelding(0)
|
setWelding(0)
|
||||||
|
|
||||||
//I'm not sure what this does. I assume it has to do with starting fires...
|
//I'm not sure what this does. I assume it has to do with starting fires...
|
||||||
|
|||||||
@@ -102,7 +102,7 @@
|
|||||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||||
climbers |= user
|
climbers |= user
|
||||||
|
|
||||||
if(!do_after(user,50))
|
if(!do_after(user,(issmall(user) ? 30 : 50)))
|
||||||
climbers -= user
|
climbers -= user
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -217,6 +217,15 @@
|
|||||||
M.show_message("<span class='notice'>\The [src] has been cut apart by [user] with \the [WT].</span>", 3, "You hear welding.", 2)
|
M.show_message("<span class='notice'>\The [src] has been cut apart by [user] with \the [WT].</span>", 3, "You hear welding.", 2)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
|
if(istype(W, /obj/item/weapon/storage/laundry_basket) && W.contents.len)
|
||||||
|
var/obj/item/weapon/storage/laundry_basket/LB = W
|
||||||
|
var/turf/T = get_turf(src)
|
||||||
|
for(var/obj/item/I in LB.contents)
|
||||||
|
LB.remove_from_storage(I, T)
|
||||||
|
user.visible_message("<span class='notice'>[user] empties \the [LB] into \the [src].</span>", \
|
||||||
|
"<span class='notice'>You empty \the [LB] into \the [src].</span>", \
|
||||||
|
"<span class='notice'>You hear rustling of clothes.</span>")
|
||||||
|
return
|
||||||
if(isrobot(user))
|
if(isrobot(user))
|
||||||
return
|
return
|
||||||
if(W.loc != user) // This should stop mounted modules ending up outside the module.
|
if(W.loc != user) // This should stop mounted modules ending up outside the module.
|
||||||
@@ -317,8 +326,6 @@
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/structure/closet/proc/req_breakout()
|
/obj/structure/closet/proc/req_breakout()
|
||||||
if(breakout)
|
|
||||||
return 0 //Already breaking out.
|
|
||||||
if(opened)
|
if(opened)
|
||||||
return 0 //Door's open... wait, why are you in it's contents then?
|
return 0 //Door's open... wait, why are you in it's contents then?
|
||||||
if(!welded)
|
if(!welded)
|
||||||
@@ -328,10 +335,7 @@
|
|||||||
/obj/structure/closet/proc/mob_breakout(var/mob/living/escapee)
|
/obj/structure/closet/proc/mob_breakout(var/mob/living/escapee)
|
||||||
var/breakout_time = 2 //2 minutes by default
|
var/breakout_time = 2 //2 minutes by default
|
||||||
|
|
||||||
if(!req_breakout())
|
if(breakout || !req_breakout())
|
||||||
return
|
|
||||||
|
|
||||||
if(!escapee.canClick())
|
|
||||||
return
|
return
|
||||||
|
|
||||||
escapee.setClickCooldown(100)
|
escapee.setClickCooldown(100)
|
||||||
@@ -339,17 +343,14 @@
|
|||||||
//okay, so the closet is either welded or locked... resist!!!
|
//okay, so the closet is either welded or locked... resist!!!
|
||||||
escapee << "<span class='warning'>You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)</span>"
|
escapee << "<span class='warning'>You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)</span>"
|
||||||
|
|
||||||
visible_message("<span class='danger'>The [src] begins to shake violently!</span>")
|
visible_message("<span class='danger'>\The [src] begins to shake violently!</span>")
|
||||||
|
|
||||||
breakout = 1 //can't think of a better way to do this right now.
|
breakout = 1 //can't think of a better way to do this right now.
|
||||||
for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2
|
for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2
|
||||||
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
|
|
||||||
animate_shake()
|
|
||||||
|
|
||||||
if(!do_after(escapee, 50)) //5 seconds
|
if(!do_after(escapee, 50)) //5 seconds
|
||||||
breakout = 0
|
breakout = 0
|
||||||
return
|
return
|
||||||
if(!escapee || escapee.stat || escapee.loc != src)
|
if(!escapee || escapee.incapacitated() || escapee.loc != src)
|
||||||
breakout = 0
|
breakout = 0
|
||||||
return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened
|
return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened
|
||||||
//Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'...
|
//Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'...
|
||||||
@@ -357,10 +358,14 @@
|
|||||||
breakout = 0
|
breakout = 0
|
||||||
return
|
return
|
||||||
|
|
||||||
|
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
|
||||||
|
animate_shake()
|
||||||
|
add_fingerprint(escapee)
|
||||||
|
|
||||||
//Well then break it!
|
//Well then break it!
|
||||||
breakout = 0
|
breakout = 0
|
||||||
escapee << "<span class='warning'>You successfully break out!</span>"
|
escapee << "<span class='warning'>You successfully break out!</span>"
|
||||||
visible_message("<span class='danger'>\the [escapee] successfully broke out of \the [src]!</span>")
|
visible_message("<span class='danger'>\The [escapee] successfully broke out of \the [src]!</span>")
|
||||||
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
|
playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1)
|
||||||
break_open()
|
break_open()
|
||||||
animate_shake()
|
animate_shake()
|
||||||
|
|||||||
@@ -93,11 +93,24 @@
|
|||||||
/obj/structure/closet/lawcloset/New()
|
/obj/structure/closet/lawcloset/New()
|
||||||
..()
|
..()
|
||||||
new /obj/item/clothing/under/lawyer/female(src)
|
new /obj/item/clothing/under/lawyer/female(src)
|
||||||
|
new /obj/item/clothing/under/lawyer/female(src)
|
||||||
|
new /obj/item/clothing/under/lawyer/black(src)
|
||||||
new /obj/item/clothing/under/lawyer/black(src)
|
new /obj/item/clothing/under/lawyer/black(src)
|
||||||
new /obj/item/clothing/under/lawyer/red(src)
|
new /obj/item/clothing/under/lawyer/red(src)
|
||||||
|
new /obj/item/clothing/under/lawyer/red(src)
|
||||||
|
new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
|
||||||
|
new /obj/item/clothing/suit/storage/toggle/internalaffairs(src)
|
||||||
|
new /obj/item/clothing/under/lawyer/bluesuit(src)
|
||||||
new /obj/item/clothing/under/lawyer/bluesuit(src)
|
new /obj/item/clothing/under/lawyer/bluesuit(src)
|
||||||
new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
|
new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
|
||||||
|
new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src)
|
||||||
new /obj/item/clothing/under/lawyer/purpsuit(src)
|
new /obj/item/clothing/under/lawyer/purpsuit(src)
|
||||||
new /obj/item/clothing/suit/storage/lawyer/purpjacket(src)
|
new /obj/item/clothing/under/lawyer/purpsuit(src)
|
||||||
|
new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
|
||||||
|
new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src)
|
||||||
|
new /obj/item/clothing/shoes/brown(src)
|
||||||
new /obj/item/clothing/shoes/brown(src)
|
new /obj/item/clothing/shoes/brown(src)
|
||||||
new /obj/item/clothing/shoes/black(src)
|
new /obj/item/clothing/shoes/black(src)
|
||||||
|
new /obj/item/clothing/shoes/black(src)
|
||||||
|
new /obj/item/clothing/shoes/laceup(src)
|
||||||
|
new /obj/item/clothing/shoes/laceup(src)
|
||||||
|
|||||||
@@ -65,6 +65,8 @@
|
|||||||
|
|
||||||
/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
if(src.opened)
|
if(src.opened)
|
||||||
|
if(istype(W, /obj/item/weapon/storage/laundry_basket))
|
||||||
|
return ..(W,user)
|
||||||
if(istype(W, /obj/item/weapon/grab))
|
if(istype(W, /obj/item/weapon/grab))
|
||||||
var/obj/item/weapon/grab/G = W
|
var/obj/item/weapon/grab/G = W
|
||||||
if(src.large)
|
if(src.large)
|
||||||
@@ -129,8 +131,11 @@
|
|||||||
|
|
||||||
/obj/structure/closet/secure_closet/update_icon()//Putting the welded stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot)
|
/obj/structure/closet/secure_closet/update_icon()//Putting the welded stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot)
|
||||||
overlays.Cut()
|
overlays.Cut()
|
||||||
|
|
||||||
if(!opened)
|
if(!opened)
|
||||||
if(locked)
|
if(broken)
|
||||||
|
icon_state = icon_off
|
||||||
|
else if(locked)
|
||||||
icon_state = icon_locked
|
icon_state = icon_locked
|
||||||
else
|
else
|
||||||
icon_state = icon_closed
|
icon_state = icon_closed
|
||||||
@@ -139,24 +144,12 @@
|
|||||||
else
|
else
|
||||||
icon_state = icon_opened
|
icon_state = icon_opened
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/closet/secure_closet/req_breakout()
|
/obj/structure/closet/secure_closet/req_breakout()
|
||||||
if(!opened && locked) return 1
|
if(!opened && locked) return 1
|
||||||
return ..() //It's a secure closet, but isn't locked.
|
return ..() //It's a secure closet, but isn't locked.
|
||||||
|
|
||||||
/obj/structure/closet/secure_closet/break_open()
|
/obj/structure/closet/secure_closet/break_open()
|
||||||
desc += " It appears to be broken."
|
desc += " It appears to be broken."
|
||||||
icon_state = icon_off
|
|
||||||
spawn()
|
|
||||||
flick(icon_broken, src)
|
|
||||||
sleep(10)
|
|
||||||
flick(icon_broken, src)
|
|
||||||
sleep(10)
|
|
||||||
broken = 1
|
broken = 1
|
||||||
locked = 0
|
locked = 0
|
||||||
update_icon()
|
..()
|
||||||
//Do this to prevent contents from being opened into nullspace (read: bluespace)
|
|
||||||
if(istype(loc, /obj/structure/bigDelivery))
|
|
||||||
var/obj/structure/bigDelivery/BD = loc
|
|
||||||
BD.unwrap()
|
|
||||||
open()
|
|
||||||
|
|||||||
@@ -136,6 +136,7 @@
|
|||||||
new /obj/item/weapon/melee/telebaton(src)
|
new /obj/item/weapon/melee/telebaton(src)
|
||||||
new /obj/item/clothing/head/beret/sec/corporate/hos(src)
|
new /obj/item/clothing/head/beret/sec/corporate/hos(src)
|
||||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
|
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
|
||||||
|
new /obj/item/device/flashlight/maglight(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -179,6 +180,8 @@
|
|||||||
new /obj/item/weapon/storage/box/holobadge(src)
|
new /obj/item/weapon/storage/box/holobadge(src)
|
||||||
new /obj/item/clothing/head/beret/sec/corporate/warden(src)
|
new /obj/item/clothing/head/beret/sec/corporate/warden(src)
|
||||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
|
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
|
||||||
|
new /obj/item/device/flashlight/maglight(src)
|
||||||
|
new /obj/item/device/megaphone(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -221,6 +224,7 @@
|
|||||||
new /obj/item/ammo_magazine/c45m/rubber(src)
|
new /obj/item/ammo_magazine/c45m/rubber(src)
|
||||||
new /obj/item/weapon/gun/energy/taser(src)
|
new /obj/item/weapon/gun/energy/taser(src)
|
||||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
|
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
|
||||||
|
new /obj/item/device/flashlight/maglight(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -202,8 +202,8 @@
|
|||||||
|
|
||||||
/obj/structure/closet/wardrobe/yellow
|
/obj/structure/closet/wardrobe/yellow
|
||||||
name = "yellow wardrobe"
|
name = "yellow wardrobe"
|
||||||
icon_state = "wardrobe-y"
|
icon_state = "yellow"
|
||||||
icon_closed = "wardrobe-y"
|
icon_closed = "yellow"
|
||||||
|
|
||||||
/obj/structure/closet/wardrobe/yellow/New()
|
/obj/structure/closet/wardrobe/yellow/New()
|
||||||
..()
|
..()
|
||||||
@@ -342,27 +342,12 @@
|
|||||||
new /obj/item/clothing/shoes/slippers(src)
|
new /obj/item/clothing/shoes/slippers(src)
|
||||||
new /obj/item/clothing/shoes/slippers(src)
|
new /obj/item/clothing/shoes/slippers(src)
|
||||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/science(src)
|
new /obj/item/clothing/suit/storage/hooded/wintercoat/science(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/toxins(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/toxins(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_tox(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_tox(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/structure/closet/wardrobe/toxins_white/New()
|
|
||||||
..()
|
|
||||||
new /obj/item/clothing/under/rank/scientist(src)
|
|
||||||
new /obj/item/clothing/under/rank/scientist(src)
|
|
||||||
new /obj/item/clothing/under/rank/scientist(src)
|
|
||||||
new /obj/item/clothing/under/rank/scientist/skirt(src)
|
|
||||||
new /obj/item/clothing/under/rank/scientist/skirt(src)
|
|
||||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
|
||||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
|
||||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
|
||||||
new /obj/item/clothing/shoes/white(src)
|
|
||||||
new /obj/item/clothing/shoes/white(src)
|
|
||||||
new /obj/item/clothing/shoes/white(src)
|
|
||||||
new /obj/item/clothing/shoes/slippers(src)
|
|
||||||
new /obj/item/clothing/shoes/slippers(src)
|
|
||||||
new /obj/item/clothing/shoes/slippers(src)
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/closet/wardrobe/robotics_black
|
/obj/structure/closet/wardrobe/robotics_black
|
||||||
name = "robotics wardrobe"
|
name = "robotics wardrobe"
|
||||||
icon_state = "black"
|
icon_state = "black"
|
||||||
@@ -378,6 +363,10 @@
|
|||||||
new /obj/item/clothing/shoes/black(src)
|
new /obj/item/clothing/shoes/black(src)
|
||||||
new /obj/item/clothing/gloves/black(src)
|
new /obj/item/clothing/gloves/black(src)
|
||||||
new /obj/item/clothing/gloves/black(src)
|
new /obj/item/clothing/gloves/black(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/toxins(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/toxins(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_tox(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_tox(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -396,6 +385,10 @@
|
|||||||
new /obj/item/clothing/shoes/white(src)
|
new /obj/item/clothing/shoes/white(src)
|
||||||
new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(src)
|
new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(src)
|
||||||
new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(src)
|
new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/chemistry(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/chemistry(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_chem(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_chem(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -414,6 +407,10 @@
|
|||||||
new /obj/item/clothing/shoes/white(src)
|
new /obj/item/clothing/shoes/white(src)
|
||||||
new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(src)
|
new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(src)
|
||||||
new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(src)
|
new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/genetics(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/genetics(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_gen(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_gen(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -434,6 +431,10 @@
|
|||||||
new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(src)
|
new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(src)
|
||||||
new /obj/item/clothing/mask/surgical(src)
|
new /obj/item/clothing/mask/surgical(src)
|
||||||
new /obj/item/clothing/mask/surgical(src)
|
new /obj/item/clothing/mask/surgical(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/virology(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/virology(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_vir(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel_vir(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -533,6 +534,7 @@
|
|||||||
new /obj/item/clothing/suit/armor/tactical(src)
|
new /obj/item/clothing/suit/armor/tactical(src)
|
||||||
new /obj/item/clothing/head/helmet/tactical(src)
|
new /obj/item/clothing/head/helmet/tactical(src)
|
||||||
new /obj/item/clothing/mask/balaclava/tactical(src)
|
new /obj/item/clothing/mask/balaclava/tactical(src)
|
||||||
|
new /obj/item/clothing/mask/balaclava(src)
|
||||||
new /obj/item/clothing/glasses/sunglasses/sechud/tactical(src)
|
new /obj/item/clothing/glasses/sunglasses/sechud/tactical(src)
|
||||||
if(prob(25))
|
if(prob(25))
|
||||||
new /obj/item/weapon/storage/belt/security/tactical/bandolier(src)
|
new /obj/item/weapon/storage/belt/security/tactical/bandolier(src)
|
||||||
@@ -556,10 +558,12 @@
|
|||||||
new /obj/item/clothing/under/rank/centcom(src)
|
new /obj/item/clothing/under/rank/centcom(src)
|
||||||
new /obj/item/clothing/under/ert(src)
|
new /obj/item/clothing/under/ert(src)
|
||||||
new /obj/item/clothing/under/syndicate/combat(src)
|
new /obj/item/clothing/under/syndicate/combat(src)
|
||||||
new /obj/item/device/radio/headset/ert(src)
|
new /obj/item/device/radio/headset/ert/alt(src)
|
||||||
new /obj/item/clothing/glasses/sunglasses(src)
|
new /obj/item/clothing/glasses/sunglasses(src)
|
||||||
new /obj/item/clothing/shoes/swat(src)
|
new /obj/item/clothing/shoes/swat(src)
|
||||||
new /obj/item/clothing/gloves/swat(src)
|
new /obj/item/clothing/gloves/swat(src)
|
||||||
|
new /obj/item/clothing/mask/balaclava/tactical(src)
|
||||||
|
new /obj/item/clothing/mask/balaclava(src)
|
||||||
new /obj/item/clothing/mask/bandana/skull(src)
|
new /obj/item/clothing/mask/bandana/skull(src)
|
||||||
new /obj/item/clothing/mask/bandana/skull(src)
|
new /obj/item/clothing/mask/bandana/skull(src)
|
||||||
return
|
return
|
||||||
@@ -583,3 +587,5 @@
|
|||||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||||
new /obj/item/clothing/under/suit_jacket/red(src)
|
new /obj/item/clothing/under/suit_jacket/red(src)
|
||||||
new /obj/item/clothing/under/scratch(src)
|
new /obj/item/clothing/under/scratch(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel(src)
|
||||||
|
new /obj/item/weapon/storage/backpack/satchel(src)
|
||||||
|
|||||||
@@ -51,6 +51,10 @@
|
|||||||
for(var/i = 1;i<=held_count;i++)
|
for(var/i = 1;i<=held_count;i++)
|
||||||
new held_type(src)
|
new held_type(src)
|
||||||
|
|
||||||
|
/obj/structure/largecrate/animal/mulebot
|
||||||
|
name = "Mulebot crate"
|
||||||
|
held_type = /mob/living/bot/mulebot
|
||||||
|
|
||||||
/obj/structure/largecrate/animal/corgi
|
/obj/structure/largecrate/animal/corgi
|
||||||
name = "corgi carrier"
|
name = "corgi carrier"
|
||||||
held_type = /mob/living/simple_animal/corgi
|
held_type = /mob/living/simple_animal/corgi
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
/obj/structure/lamarr
|
|
||||||
name = "lab cage"
|
|
||||||
icon = 'icons/obj/stationobjs.dmi'
|
|
||||||
icon_state = "labcage1"
|
|
||||||
desc = "A glass lab container for storing interesting creatures."
|
|
||||||
density = 1
|
|
||||||
anchored = 1
|
|
||||||
unacidable = 1//Dissolving the case would also delete Lamarr
|
|
||||||
var/health = 30
|
|
||||||
var/occupied = 1
|
|
||||||
var/destroyed = 0
|
|
||||||
|
|
||||||
/obj/structure/lamarr/ex_act(severity)
|
|
||||||
switch(severity)
|
|
||||||
if (1)
|
|
||||||
new /obj/item/weapon/material/shard( src.loc )
|
|
||||||
Break()
|
|
||||||
qdel(src)
|
|
||||||
if (2)
|
|
||||||
if (prob(50))
|
|
||||||
src.health -= 15
|
|
||||||
src.healthcheck()
|
|
||||||
if (3)
|
|
||||||
if (prob(50))
|
|
||||||
src.health -= 5
|
|
||||||
src.healthcheck()
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/lamarr/bullet_act(var/obj/item/projectile/Proj)
|
|
||||||
health -= Proj.damage
|
|
||||||
..()
|
|
||||||
src.healthcheck()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/lamarr/proc/healthcheck()
|
|
||||||
if (src.health <= 0)
|
|
||||||
if (!( src.destroyed ))
|
|
||||||
src.density = 0
|
|
||||||
src.destroyed = 1
|
|
||||||
new /obj/item/weapon/material/shard( src.loc )
|
|
||||||
playsound(src, "shatter", 70, 1)
|
|
||||||
Break()
|
|
||||||
else
|
|
||||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/lamarr/update_icon()
|
|
||||||
if(src.destroyed)
|
|
||||||
src.icon_state = "labcageb[src.occupied]"
|
|
||||||
else
|
|
||||||
src.icon_state = "labcage[src.occupied]"
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/lamarr/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
||||||
src.health -= W.force
|
|
||||||
src.healthcheck()
|
|
||||||
..()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/lamarr/attack_hand(mob/user as mob)
|
|
||||||
if (src.destroyed)
|
|
||||||
return
|
|
||||||
else
|
|
||||||
usr << "<span class='notice'>You kick the lab cage.</span>"
|
|
||||||
for(var/mob/O in oviewers())
|
|
||||||
if ((O.client && !( O.blinded )))
|
|
||||||
O << "<span class='warning'>[usr] kicks the lab cage.</span>"
|
|
||||||
src.health -= 2
|
|
||||||
healthcheck()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/lamarr/proc/Break()
|
|
||||||
if(occupied)
|
|
||||||
new /obj/item/clothing/mask/facehugger/lamarr(src.loc)
|
|
||||||
occupied = 0
|
|
||||||
update_icon()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/item/clothing/mask/facehugger/lamarr
|
|
||||||
name = "Lamarr"
|
|
||||||
desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite?
|
|
||||||
sterile = 1
|
|
||||||
gender = FEMALE
|
|
||||||
|
|
||||||
/obj/item/clothing/mask/facehugger/lamarr/New()//to prevent deleting it if aliums are disabled
|
|
||||||
return
|
|
||||||
@@ -63,31 +63,3 @@
|
|||||||
else
|
else
|
||||||
user.visible_message("<span class='danger'>[user] hits [src] and bounces off!</span>")
|
user.visible_message("<span class='danger'>[user] hits [src] and bounces off!</span>")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
// The following mirror is ~special~.
|
|
||||||
/obj/structure/mirror/raider
|
|
||||||
name = "cracked mirror"
|
|
||||||
desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it."
|
|
||||||
icon_state = "mirror_broke"
|
|
||||||
shattered = 1
|
|
||||||
|
|
||||||
/obj/structure/mirror/raider/attack_hand(var/mob/living/carbon/human/user)
|
|
||||||
if(istype(get_area(src),/area/syndicate_mothership))
|
|
||||||
if(istype(user) && user.mind && user.mind.special_role == "Raider" && user.species.name != "Vox" && is_alien_whitelisted(user, "Vox"))
|
|
||||||
var/choice = input("Do you wish to become a true Vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes")
|
|
||||||
if(choice && choice == "Yes")
|
|
||||||
var/mob/living/carbon/human/vox/vox = new(get_turf(src),"Vox")
|
|
||||||
vox.gender = user.gender
|
|
||||||
raiders.equip(vox)
|
|
||||||
if(user.mind)
|
|
||||||
user.mind.transfer_to(vox)
|
|
||||||
spawn(1)
|
|
||||||
var/newname = sanitizeSafe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
|
|
||||||
if(!newname || newname == "")
|
|
||||||
var/datum/language/L = all_languages[vox.species.default_language]
|
|
||||||
newname = L.get_random_name()
|
|
||||||
vox.real_name = newname
|
|
||||||
vox.name = vox.real_name
|
|
||||||
raiders.update_access(vox)
|
|
||||||
qdel(user)
|
|
||||||
..()
|
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
//Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to.
|
|
||||||
#define NEST_RESIST_TIME 1200
|
|
||||||
|
|
||||||
/obj/structure/bed/nest
|
|
||||||
name = "alien nest"
|
|
||||||
desc = "It's a gruesome pile of thick, sticky resin shaped like a nest."
|
|
||||||
icon = 'icons/mob/alien.dmi'
|
|
||||||
icon_state = "nest"
|
|
||||||
var/health = 100
|
|
||||||
|
|
||||||
/obj/structure/bed/nest/update_icon()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/bed/nest/user_unbuckle_mob(mob/user as mob)
|
|
||||||
if(buckled_mob)
|
|
||||||
if(buckled_mob.buckled == src)
|
|
||||||
if(buckled_mob != user)
|
|
||||||
buckled_mob.visible_message(\
|
|
||||||
"<span class='notice'>[user.name] pulls [buckled_mob.name] free from the sticky nest!</span>",\
|
|
||||||
"<span class='notice'>[user.name] pulls you free from the gelatinous resin.</span>",\
|
|
||||||
"<span class='notice'>You hear squelching...</span>")
|
|
||||||
buckled_mob.pixel_y = 0
|
|
||||||
buckled_mob.old_y = 0
|
|
||||||
unbuckle_mob()
|
|
||||||
else
|
|
||||||
if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME)
|
|
||||||
return
|
|
||||||
buckled_mob.last_special = world.time
|
|
||||||
buckled_mob.visible_message(\
|
|
||||||
"<span class='warning'>[buckled_mob.name] struggles to break free of the gelatinous resin...</span>",\
|
|
||||||
"<span class='warning'>You struggle to break free from the gelatinous resin...</span>",\
|
|
||||||
"<span class='notice'>You hear squelching...</span>")
|
|
||||||
spawn(NEST_RESIST_TIME)
|
|
||||||
if(user && buckled_mob && user.buckled == src)
|
|
||||||
buckled_mob.last_special = world.time
|
|
||||||
buckled_mob.pixel_y = 0
|
|
||||||
buckled_mob.old_y = 0
|
|
||||||
unbuckle_mob()
|
|
||||||
src.add_fingerprint(user)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob)
|
|
||||||
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
|
|
||||||
return
|
|
||||||
|
|
||||||
unbuckle_mob()
|
|
||||||
|
|
||||||
var/mob/living/carbon/xenos = user
|
|
||||||
var/mob/living/carbon/victim = M
|
|
||||||
|
|
||||||
if(istype(victim) && locate(/obj/item/organ/internal/xenos/hivenode) in victim.internal_organs)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(istype(xenos) && !(locate(/obj/item/organ/internal/xenos/hivenode) in xenos.internal_organs))
|
|
||||||
return
|
|
||||||
|
|
||||||
if(M == usr)
|
|
||||||
return
|
|
||||||
else
|
|
||||||
M.visible_message(\
|
|
||||||
"<span class='notice'>[user.name] secretes a thick vile goo, securing [M.name] into [src]!</span>",\
|
|
||||||
"<span class='warning'>[user.name] drenches you in a foul-smelling resin, trapping you in the [src]!</span>",\
|
|
||||||
"<span class='notice'>You hear squelching...</span>")
|
|
||||||
M.buckled = src
|
|
||||||
M.loc = src.loc
|
|
||||||
M.set_dir(src.dir)
|
|
||||||
M.update_canmove()
|
|
||||||
M.pixel_y = 6
|
|
||||||
M.old_y = 6
|
|
||||||
src.buckled_mob = M
|
|
||||||
src.add_fingerprint(user)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/structure/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
||||||
var/aforce = W.force
|
|
||||||
health = max(0, health - aforce)
|
|
||||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
|
||||||
for(var/mob/M in viewers(src, 7))
|
|
||||||
M.show_message("<span class='warning'>[user] hits [src] with [W]!</span>", 1)
|
|
||||||
healthcheck()
|
|
||||||
|
|
||||||
/obj/structure/bed/nest/proc/healthcheck()
|
|
||||||
if(health <=0)
|
|
||||||
density = 0
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
@@ -16,12 +16,12 @@
|
|||||||
var/list/selection
|
var/list/selection
|
||||||
switch(utype)
|
switch(utype)
|
||||||
if("Underwear")
|
if("Underwear")
|
||||||
var/utype2 = alert("Which section do you want to pick from?",,"Male", "Female")
|
utype = alert("Which section do you want to pick from?",, "Top", "Bottom",)
|
||||||
switch(utype2)
|
switch(utype)
|
||||||
if("Male")
|
if("Top")
|
||||||
selection = underwear_m
|
selection = underwear_top_t
|
||||||
if("Female")
|
if("Bottom")
|
||||||
selection = underwear_f
|
selection = underwear_bottom_t
|
||||||
if("Undershirts")
|
if("Undershirts")
|
||||||
selection = undershirt_t
|
selection = undershirt_t
|
||||||
if("Socks")
|
if("Socks")
|
||||||
@@ -34,8 +34,10 @@
|
|||||||
H.undershirt = selection[pick]
|
H.undershirt = selection[pick]
|
||||||
else if(utype == "Socks")
|
else if(utype == "Socks")
|
||||||
H.socks = selection[pick]
|
H.socks = selection[pick]
|
||||||
|
else if(utype == "Top")
|
||||||
|
H.underwear_top = selection[pick]
|
||||||
else
|
else
|
||||||
H.underwear = selection[pick]
|
H.underwear_bottom = selection[pick]
|
||||||
H.update_body(1)
|
H.update_body(1)
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
@@ -127,13 +127,12 @@
|
|||||||
var/obj/effect/mist/mymist = null
|
var/obj/effect/mist/mymist = null
|
||||||
var/ismist = 0 //needs a var so we can make it linger~
|
var/ismist = 0 //needs a var so we can make it linger~
|
||||||
var/watertemp = "normal" //freezing, normal, or boiling
|
var/watertemp = "normal" //freezing, normal, or boiling
|
||||||
var/mobpresent = 0 //true if there is a mob on the shower's loc, this is to ease process()
|
|
||||||
var/is_washing = 0
|
var/is_washing = 0
|
||||||
var/list/temperature_settings = list("normal" = 310, "boiling" = T0C+100, "freezing" = T0C)
|
var/list/temperature_settings = list("normal" = 310, "boiling" = T0C+100, "freezing" = T0C)
|
||||||
|
|
||||||
/obj/machinery/shower/New()
|
/obj/machinery/shower/New()
|
||||||
..()
|
..()
|
||||||
create_reagents(2)
|
create_reagents(50)
|
||||||
|
|
||||||
//add heat controls? when emagged, you can freeze to death in it?
|
//add heat controls? when emagged, you can freeze to death in it?
|
||||||
|
|
||||||
@@ -171,6 +170,7 @@
|
|||||||
overlays.Cut() //once it's been on for a while, in addition to handling the water overlay.
|
overlays.Cut() //once it's been on for a while, in addition to handling the water overlay.
|
||||||
if(mymist)
|
if(mymist)
|
||||||
qdel(mymist)
|
qdel(mymist)
|
||||||
|
mymist = null
|
||||||
|
|
||||||
if(on)
|
if(on)
|
||||||
overlays += image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir)
|
overlays += image('icons/obj/watercloset.dmi', src, "water", MOB_LAYER + 1, dir)
|
||||||
@@ -190,20 +190,9 @@
|
|||||||
spawn(250)
|
spawn(250)
|
||||||
if(src && !on)
|
if(src && !on)
|
||||||
qdel(mymist)
|
qdel(mymist)
|
||||||
|
mymist = null
|
||||||
ismist = 0
|
ismist = 0
|
||||||
|
|
||||||
/obj/machinery/shower/Crossed(atom/movable/O)
|
|
||||||
..()
|
|
||||||
wash(O)
|
|
||||||
if(ismob(O))
|
|
||||||
mobpresent += 1
|
|
||||||
process_heat(O)
|
|
||||||
|
|
||||||
/obj/machinery/shower/Uncrossed(atom/movable/O)
|
|
||||||
if(ismob(O))
|
|
||||||
mobpresent -= 1
|
|
||||||
..()
|
|
||||||
|
|
||||||
//Yes, showers are super powerful as far as washing goes.
|
//Yes, showers are super powerful as far as washing goes.
|
||||||
/obj/machinery/shower/proc/wash(atom/movable/O as obj|mob)
|
/obj/machinery/shower/proc/wash(atom/movable/O as obj|mob)
|
||||||
if(!on) return
|
if(!on) return
|
||||||
@@ -292,24 +281,30 @@
|
|||||||
|
|
||||||
if(isturf(loc))
|
if(isturf(loc))
|
||||||
var/turf/tile = loc
|
var/turf/tile = loc
|
||||||
loc.clean_blood()
|
|
||||||
for(var/obj/effect/E in tile)
|
for(var/obj/effect/E in tile)
|
||||||
if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay))
|
if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay))
|
||||||
qdel(E)
|
qdel(E)
|
||||||
|
|
||||||
|
reagents.splash(O, 10)
|
||||||
|
|
||||||
/obj/machinery/shower/process()
|
/obj/machinery/shower/process()
|
||||||
if(!on) return
|
if(!on) return
|
||||||
wash_floor()
|
for(var/thing in loc)
|
||||||
if(!mobpresent) return
|
var/atom/movable/AM = thing
|
||||||
for(var/mob/living/L in loc)
|
var/mob/living/L = thing
|
||||||
|
if(istype(AM) && AM.simulated)
|
||||||
|
wash(AM)
|
||||||
|
if(istype(L))
|
||||||
process_heat(L)
|
process_heat(L)
|
||||||
|
wash_floor()
|
||||||
|
reagents.add_reagent("water", reagents.get_free_space())
|
||||||
|
|
||||||
/obj/machinery/shower/proc/wash_floor()
|
/obj/machinery/shower/proc/wash_floor()
|
||||||
if(!ismist && is_washing)
|
if(!ismist && is_washing)
|
||||||
return
|
return
|
||||||
is_washing = 1
|
is_washing = 1
|
||||||
var/turf/T = get_turf(src)
|
var/turf/T = get_turf(src)
|
||||||
reagents.add_reagent("water", 2)
|
reagents.splash(T, reagents.total_volume)
|
||||||
T.clean(src)
|
T.clean(src)
|
||||||
spawn(100)
|
spawn(100)
|
||||||
is_washing = 0
|
is_washing = 0
|
||||||
@@ -345,6 +340,20 @@
|
|||||||
anchored = 1
|
anchored = 1
|
||||||
var/busy = 0 //Something's being washed at the moment
|
var/busy = 0 //Something's being washed at the moment
|
||||||
|
|
||||||
|
/obj/structure/sink/MouseDrop_T(var/obj/item/thing, var/mob/user)
|
||||||
|
..()
|
||||||
|
if(!istype(thing) || !thing.is_open_container())
|
||||||
|
return ..()
|
||||||
|
if(!usr.Adjacent(src))
|
||||||
|
return ..()
|
||||||
|
if(!thing.reagents || thing.reagents.total_volume == 0)
|
||||||
|
usr << "<span class='warning'>\The [thing] is empty.</span>"
|
||||||
|
return
|
||||||
|
// Clear the vessel.
|
||||||
|
visible_message("<span class='notice'>\The [usr] tips the contents of \the [thing] into \the [src].</span>")
|
||||||
|
thing.reagents.clear_reagents()
|
||||||
|
thing.update_icon()
|
||||||
|
|
||||||
/obj/structure/sink/attack_hand(mob/user as mob)
|
/obj/structure/sink/attack_hand(mob/user as mob)
|
||||||
if (ishuman(user))
|
if (ishuman(user))
|
||||||
var/mob/living/carbon/human/H = user
|
var/mob/living/carbon/human/H = user
|
||||||
@@ -408,9 +417,6 @@
|
|||||||
"<span class='danger'>[user] was stunned by \his wet [O]!</span>", \
|
"<span class='danger'>[user] was stunned by \his wet [O]!</span>", \
|
||||||
"<span class='userdanger'>[user] was stunned by \his wet [O]!</span>")
|
"<span class='userdanger'>[user] was stunned by \his wet [O]!</span>")
|
||||||
return 1
|
return 1
|
||||||
// Short of a rewrite, this is necessary to stop monkeycubes being washed.
|
|
||||||
else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
|
|
||||||
return
|
|
||||||
else if(istype(O, /obj/item/weapon/mop))
|
else if(istype(O, /obj/item/weapon/mop))
|
||||||
O.reagents.add_reagent("water", 5)
|
O.reagents.add_reagent("water", 5)
|
||||||
user << "<span class='notice'>You wet \the [O] in \the [src].</span>"
|
user << "<span class='notice'>You wet \the [O] in \the [src].</span>"
|
||||||
@@ -443,7 +449,6 @@
|
|||||||
name = "kitchen sink"
|
name = "kitchen sink"
|
||||||
icon_state = "sink_alt"
|
icon_state = "sink_alt"
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/sink/puddle //splishy splashy ^_^
|
/obj/structure/sink/puddle //splishy splashy ^_^
|
||||||
name = "puddle"
|
name = "puddle"
|
||||||
icon_state = "puddle"
|
icon_state = "puddle"
|
||||||
|
|||||||
@@ -246,11 +246,13 @@
|
|||||||
else if(reinf && state == 0)
|
else if(reinf && state == 0)
|
||||||
anchored = !anchored
|
anchored = !anchored
|
||||||
update_nearby_icons()
|
update_nearby_icons()
|
||||||
|
update_verbs()
|
||||||
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
||||||
user << (anchored ? "<span class='notice'>You have fastened the frame to the floor.</span>" : "<span class='notice'>You have unfastened the frame from the floor.</span>")
|
user << (anchored ? "<span class='notice'>You have fastened the frame to the floor.</span>" : "<span class='notice'>You have unfastened the frame from the floor.</span>")
|
||||||
else if(!reinf)
|
else if(!reinf)
|
||||||
anchored = !anchored
|
anchored = !anchored
|
||||||
update_nearby_icons()
|
update_nearby_icons()
|
||||||
|
update_verbs()
|
||||||
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
||||||
user << (anchored ? "<span class='notice'>You have fastened the window to the floor.</span>" : "<span class='notice'>You have unfastened the window.</span>")
|
user << (anchored ? "<span class='notice'>You have fastened the window to the floor.</span>" : "<span class='notice'>You have unfastened the window.</span>")
|
||||||
else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
|
else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
|
||||||
@@ -261,6 +263,7 @@
|
|||||||
if(!glasstype)
|
if(!glasstype)
|
||||||
user << "<span class='notice'>You're not sure how to dismantle \the [src] properly.</span>"
|
user << "<span class='notice'>You're not sure how to dismantle \the [src] properly.</span>"
|
||||||
else
|
else
|
||||||
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
|
||||||
visible_message("<span class='notice'>[user] dismantles \the [src].</span>")
|
visible_message("<span class='notice'>[user] dismantles \the [src].</span>")
|
||||||
if(dir == SOUTHWEST)
|
if(dir == SOUTHWEST)
|
||||||
var/obj/item/stack/material/mats = new glasstype(loc)
|
var/obj/item/stack/material/mats = new glasstype(loc)
|
||||||
@@ -288,7 +291,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/window/verb/rotate()
|
/obj/structure/window/proc/rotate()
|
||||||
set name = "Rotate Window Counter-Clockwise"
|
set name = "Rotate Window Counter-Clockwise"
|
||||||
set category = "Object"
|
set category = "Object"
|
||||||
set src in oview(1)
|
set src in oview(1)
|
||||||
@@ -307,7 +310,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/window/verb/revrotate()
|
/obj/structure/window/proc/revrotate()
|
||||||
set name = "Rotate Window Clockwise"
|
set name = "Rotate Window Clockwise"
|
||||||
set category = "Object"
|
set category = "Object"
|
||||||
set src in oview(1)
|
set src in oview(1)
|
||||||
@@ -331,6 +334,7 @@
|
|||||||
//player-constructed windows
|
//player-constructed windows
|
||||||
if (constructed)
|
if (constructed)
|
||||||
anchored = 0
|
anchored = 0
|
||||||
|
update_verbs()
|
||||||
|
|
||||||
if (start_dir)
|
if (start_dir)
|
||||||
set_dir(start_dir)
|
set_dir(start_dir)
|
||||||
@@ -373,6 +377,15 @@
|
|||||||
for(var/obj/structure/window/W in orange(src, 1))
|
for(var/obj/structure/window/W in orange(src, 1))
|
||||||
W.update_icon()
|
W.update_icon()
|
||||||
|
|
||||||
|
//Updates the availabiliy of the rotation verbs
|
||||||
|
/obj/structure/window/proc/update_verbs()
|
||||||
|
if(anchored)
|
||||||
|
verbs -= /obj/structure/window/proc/rotate
|
||||||
|
verbs -= /obj/structure/window/proc/revrotate
|
||||||
|
else
|
||||||
|
verbs += /obj/structure/window/proc/rotate
|
||||||
|
verbs += /obj/structure/window/proc/revrotate
|
||||||
|
|
||||||
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
|
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
|
||||||
/obj/structure/window/update_icon()
|
/obj/structure/window/update_icon()
|
||||||
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
|
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ var/list/mechtoys = list(
|
|||||||
layer = 4
|
layer = 4
|
||||||
explosion_resistance = 5
|
explosion_resistance = 5
|
||||||
var/list/mobs_can_pass = list(
|
var/list/mobs_can_pass = list(
|
||||||
|
/mob/living/bot,
|
||||||
/mob/living/carbon/slime,
|
/mob/living/carbon/slime,
|
||||||
/mob/living/simple_animal/mouse,
|
/mob/living/simple_animal/mouse,
|
||||||
/mob/living/silicon/robot/drone
|
/mob/living/silicon/robot/drone
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user