Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 12/16/2015_newwizard

This commit is contained in:
Neerti
2016-03-15 10:17:31 -04:00
346 changed files with 9039 additions and 9286 deletions

11
.github/ISSUE_TEMPLATE.md vendored Normal file
View 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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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.

View File

@@ -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.

View File

@@ -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/////
////////////////////////// //////////////////////////

View File

@@ -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))

View File

@@ -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())

View File

@@ -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
View 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

View File

@@ -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()

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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())))

View File

@@ -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>"

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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.

View File

@@ -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)

View File

@@ -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

View File

@@ -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",

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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))

View File

@@ -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?

View File

@@ -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"])

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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.

View File

@@ -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")

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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(stat & (BROKEN|NOPOWER))
return
if(contents.len) 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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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,

View File

@@ -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"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
..() ..()

View File

@@ -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

View File

@@ -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

View File

@@ -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.
*/ */

View File

@@ -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))

View File

@@ -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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)</span>", 1) user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;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>")

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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."

View File

@@ -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()

View File

@@ -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)

View File

@@ -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()
..() ..()

View File

@@ -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)

View File

@@ -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

View File

@@ -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))

View File

@@ -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)

View File

@@ -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."

View File

@@ -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,

View File

@@ -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)

View File

@@ -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()
..() ..()

View 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

View File

@@ -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

View File

@@ -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.

View File

@@ -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
*/ */

View File

@@ -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...

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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()

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)
..()

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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.

View File

@@ -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