mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-23 20:17:15 +01:00
Merge remote-tracking branch 'VOREStation/master' into upstream-merge-7835
This commit is contained in:
@@ -61,4 +61,8 @@
|
||||
#define INFECTION_LEVEL_ONE 100
|
||||
#define INFECTION_LEVEL_TWO 500
|
||||
#define INFECTION_LEVEL_THREE 1000
|
||||
#define INFECTION_LEVEL_MAX 1500
|
||||
#define INFECTION_LEVEL_MAX 1500
|
||||
|
||||
#define MODULAR_BODYPART_INVALID 0 // Cannot be detached or reattached.
|
||||
#define MODULAR_BODYPART_PROSTHETIC 1 // Can be detached or reattached freely.
|
||||
#define MODULAR_BODYPART_CYBERNETIC 2 // Can be detached or reattached to compatible parent organs.
|
||||
|
||||
@@ -24,6 +24,29 @@
|
||||
#define EMP_TOX_DMG 0x80 // EMPs inflict toxin damage
|
||||
#define EMP_OXY_DMG 0x100 // EMPs inflict oxy damage
|
||||
|
||||
// Species allergens
|
||||
#define MEAT 0x1 // Skrell won't like this.
|
||||
#define FISH 0x2 // Seperate for completion's sake. Still bad for skrell.
|
||||
#define FRUIT 0x4 // An apple a day only keeps the doctor away if they're allergic.
|
||||
#define VEGETABLE 0x8 // Taters 'n' carrots. Potato allergy is a thing, apparently.
|
||||
#define GRAINS 0x10 // Wheat, oats, etc.
|
||||
#define BEANS 0x20 // The musical fruit! Includes soy.
|
||||
#define SEEDS 0x40 // Hope you don't have a nut allergy.
|
||||
#define DAIRY 0x80 // Lactose intolerance, ho! Also bad for skrell.
|
||||
#define FUNGI 0x100 // Delicious shrooms.
|
||||
#define COFFEE 0x200 // Mostly here for tajara.
|
||||
#define GENERIC 0x400 // Catchall for stuff that doesn't fall into the groups above. You shouldn't be allergic to this type, ever.
|
||||
#define SUGARS 0x800 // For unathi-like reactions
|
||||
|
||||
// Allergen reactions
|
||||
#define AG_TOX_DMG 0x1 // the classic
|
||||
#define AG_OXY_DMG 0x2 // intense airway reactions
|
||||
#define AG_EMOTE 0x4 // general emote reactions based on affect type
|
||||
#define AG_PAIN 0x8 // short-lived hurt
|
||||
#define AG_WEAKEN 0x10 // too weak to move, oof
|
||||
#define AG_BLURRY 0x20 // blurred vision!
|
||||
#define AG_SLEEPY 0x40 // fatigue/exhaustion
|
||||
|
||||
// Species spawn flags
|
||||
#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play.
|
||||
#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces)
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
|
||||
var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
|
||||
var/datum/gear_tweak/implant_location/gear_tweak_implant_location = new()
|
||||
@@ -94,13 +94,13 @@ var/global/list/string_slot_flags = list(
|
||||
"holster" = SLOT_HOLSTER
|
||||
)
|
||||
|
||||
/proc/get_mannequin(var/ckey)
|
||||
if(!mannequins_)
|
||||
mannequins_ = new()
|
||||
. = mannequins_[ckey]
|
||||
if(!.)
|
||||
. = new/mob/living/carbon/human/dummy/mannequin()
|
||||
mannequins_[ckey] = .
|
||||
GLOBAL_LIST_EMPTY(mannequins)
|
||||
/proc/get_mannequin(var/ckey = "NULL")
|
||||
var/mob/living/carbon/human/dummy/mannequin/M = GLOB.mannequins[ckey]
|
||||
if(!istype(M))
|
||||
GLOB.mannequins[ckey] = new /mob/living/carbon/human/dummy/mannequin(null)
|
||||
M = GLOB.mannequins[ckey]
|
||||
return M
|
||||
|
||||
//////////////////////////
|
||||
/////Initial Building/////
|
||||
|
||||
@@ -537,4 +537,22 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
for(var/species_name in whitelisted_icons)
|
||||
custom_species_bases += species_name
|
||||
|
||||
// Weaver recipe stuff
|
||||
paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure
|
||||
for(var/path in paths)
|
||||
var/datum/weaver_recipe/instance = new path()
|
||||
if(!instance.title)
|
||||
continue //A prototype or something
|
||||
weavable_structures[instance.title] = instance
|
||||
|
||||
paths = typesof(/datum/weaver_recipe/item) - /datum/weaver_recipe/item
|
||||
for(var/path in paths)
|
||||
var/datum/weaver_recipe/instance = new path()
|
||||
if(!instance.title)
|
||||
continue //A prototype or something
|
||||
weavable_items[instance.title] = instance
|
||||
|
||||
return 1 // Hooks must return 1
|
||||
|
||||
var/global/list/weavable_structures = list()
|
||||
var/global/list/weavable_items = list()
|
||||
+30
-7
@@ -60,6 +60,8 @@
|
||||
|
||||
// Cyborgs have no range-checking unless there is item use
|
||||
if(!W)
|
||||
if(bolt && !bolt.malfunction && A.loc != module)
|
||||
return
|
||||
A.add_hiddenprint(src)
|
||||
A.attack_robot(src)
|
||||
return
|
||||
@@ -120,35 +122,56 @@
|
||||
/atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
|
||||
CtrlShiftClick(user)
|
||||
|
||||
/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/user)
|
||||
/obj/machinery/door/airlock/BorgCtrlShiftClick(var/mob/living/silicon/robot/user)
|
||||
if(user.bolt && !user.bolt.malfunction)
|
||||
return
|
||||
|
||||
AICtrlShiftClick(user)
|
||||
|
||||
/atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
|
||||
ShiftClick(user)
|
||||
|
||||
/obj/machinery/door/airlock/BorgShiftClick(mob/user) // Opens and closes doors! Forwards to AI code.
|
||||
/obj/machinery/door/airlock/BorgShiftClick(var/mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code.
|
||||
if(user.bolt && !user.bolt.malfunction)
|
||||
return
|
||||
|
||||
AIShiftClick(user)
|
||||
|
||||
/atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
|
||||
CtrlClick(user)
|
||||
|
||||
/obj/machinery/door/airlock/BorgCtrlClick(mob/user) // Bolts doors. Forwards to AI code.
|
||||
/obj/machinery/door/airlock/BorgCtrlClick(var/mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
|
||||
if(user.bolt && !user.bolt.malfunction)
|
||||
return
|
||||
|
||||
AICtrlClick(user)
|
||||
|
||||
/obj/machinery/power/apc/BorgCtrlClick(mob/user) // turns off/on APCs. Forwards to AI code.
|
||||
/obj/machinery/power/apc/BorgCtrlClick(var/mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code.
|
||||
if(user.bolt && !user.bolt.malfunction)
|
||||
return
|
||||
|
||||
AICtrlClick(user)
|
||||
|
||||
/obj/machinery/turretid/BorgCtrlClick(mob/user) //turret control on/off. Forwards to AI code.
|
||||
/obj/machinery/turretid/BorgCtrlClick(var/mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code.
|
||||
if(user.bolt && !user.bolt.malfunction)
|
||||
return
|
||||
|
||||
AICtrlClick(user)
|
||||
|
||||
/atom/proc/BorgAltClick(var/mob/living/silicon/robot/user)
|
||||
AltClick(user)
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/BorgAltClick(mob/user) // Eletrifies doors. Forwards to AI code.
|
||||
/obj/machinery/door/airlock/BorgAltClick(var/mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.
|
||||
if(user.bolt && !user.bolt.malfunction)
|
||||
return
|
||||
|
||||
AIAltClick(user)
|
||||
|
||||
/obj/machinery/turretid/BorgAltClick(mob/user) //turret lethal on/off. Forwards to AI code.
|
||||
/obj/machinery/turretid/BorgAltClick(var/mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code.
|
||||
if(user.bolt && !user.bolt.malfunction)
|
||||
return
|
||||
|
||||
AIAltClick(user)
|
||||
|
||||
/*
|
||||
|
||||
@@ -5,7 +5,6 @@ SUBSYSTEM_DEF(overlays)
|
||||
priority = FIRE_PRIORITY_OVERLAYS
|
||||
init_order = INIT_ORDER_OVERLAY
|
||||
|
||||
var/initialized = FALSE
|
||||
var/list/queue // Queue of atoms needing overlay compiling (TODO-VERIFY!)
|
||||
var/list/stats
|
||||
var/list/overlay_icon_state_caches // Cache thing
|
||||
@@ -22,7 +21,6 @@ var/global/image/appearance_bro = new() // Temporarily super-global because of B
|
||||
stats = list()
|
||||
|
||||
/datum/controller/subsystem/overlays/Initialize()
|
||||
initialized = TRUE
|
||||
fire(mc_check = FALSE)
|
||||
..()
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ PROCESSING_SUBSYSTEM_DEF(chemistry)
|
||||
/datum/controller/subsystem/processing/chemistry/Initialize()
|
||||
initialize_chemical_reactions()
|
||||
initialize_chemical_reagents()
|
||||
..()
|
||||
|
||||
//Chemical Reactions - Initialises all /datum/chemical_reaction into a list
|
||||
// It is filtered into multiple lists within a list.
|
||||
|
||||
@@ -183,11 +183,6 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
if(adm["total"] == 0)
|
||||
send2adminirc("A round has started with no admins online.")
|
||||
|
||||
/* supply_controller.process() //Start the supply shuttle regenerating points -- TLE // handled in scheduler
|
||||
master_controller.process() //Start master_controller.process()
|
||||
lighting_controller.process() //Start processing DynamicAreaLighting updates
|
||||
*/
|
||||
|
||||
current_state = GAME_STATE_PLAYING
|
||||
Master.SetRunLevel(RUNLEVEL_GAME)
|
||||
|
||||
|
||||
@@ -4,4 +4,24 @@
|
||||
|
||||
/datum/category_item/autolathe/engineering/id_restorer
|
||||
name = "ID restoration console electronics"
|
||||
path =/obj/item/weapon/circuitboard/id_restorer
|
||||
path =/obj/item/weapon/circuitboard/id_restorer
|
||||
|
||||
/datum/category_item/autolathe/engineering/oven
|
||||
name = "oven electronics"
|
||||
path =/obj/item/weapon/circuitboard/oven
|
||||
|
||||
/datum/category_item/autolathe/engineering/fryer
|
||||
name = "fryer electronics"
|
||||
path =/obj/item/weapon/circuitboard/fryer
|
||||
|
||||
/datum/category_item/autolathe/engineering/grill
|
||||
name = "grill electronics"
|
||||
path =/obj/item/weapon/circuitboard/grill
|
||||
|
||||
/datum/category_item/autolathe/engineering/cerealmaker
|
||||
name = "cereal maker electronics"
|
||||
path =/obj/item/weapon/circuitboard/cerealmaker
|
||||
|
||||
/datum/category_item/autolathe/engineering/candymachine
|
||||
name = "candy machine electronics"
|
||||
path =/obj/item/weapon/circuitboard/candymachine
|
||||
+3
-2
@@ -513,8 +513,9 @@
|
||||
|
||||
//HUMAN
|
||||
/mob/living/carbon/human/mind_initialize()
|
||||
..()
|
||||
if(!mind.assigned_role) mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant
|
||||
. = ..()
|
||||
if(!mind.assigned_role)
|
||||
mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant
|
||||
|
||||
//slime
|
||||
/mob/living/simple_mob/slime/mind_initialize()
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
#define GOAL_GENERAL "Common Goal"
|
||||
#define GOAL_MEDICAL "Medical Goal"
|
||||
#define GOAL_SECURITY "Security Goal"
|
||||
#define GOAL_ENGINEERING "Engineering Goal"
|
||||
#define GOAL_CARGO "Cargo Goal"
|
||||
#define GOAL_RESEARCH "Research Goal"
|
||||
@@ -0,0 +1,101 @@
|
||||
|
||||
GLOBAL_LIST(department_goals)
|
||||
GLOBAL_LIST(active_department_goals)
|
||||
|
||||
/hook/startup/proc/initializeDepartmentGoals()
|
||||
GLOB.department_goals = list(GOAL_GENERAL, GOAL_MEDICAL, GOAL_SECURITY, GOAL_ENGINEERING, GOAL_CARGO, GOAL_RESEARCH)
|
||||
GLOB.active_department_goals = list(GOAL_GENERAL, GOAL_MEDICAL, GOAL_SECURITY, GOAL_ENGINEERING, GOAL_CARGO, GOAL_RESEARCH)
|
||||
|
||||
for(var/category in GLOB.department_goals)
|
||||
GLOB.department_goals[category] = list()
|
||||
|
||||
for(var/subtype in subtypesof(/datum/goal))
|
||||
var/datum/goal/SG = new subtype()
|
||||
|
||||
if(SG.name == "goal")
|
||||
continue
|
||||
|
||||
if(SG.category == category)
|
||||
GLOB.department_goals[category] |= SG
|
||||
|
||||
for(var/category in GLOB.active_department_goals)
|
||||
GLOB.active_department_goals[category] = list()
|
||||
var/list/cat_goals = GLOB.department_goals[category]
|
||||
|
||||
var/goal_count = rand(2,4)
|
||||
|
||||
for(var/count = 1 to goal_count)
|
||||
var/datum/goal/G
|
||||
|
||||
if(LAZYLEN(cat_goals))
|
||||
G = pick(cat_goals)
|
||||
|
||||
if(G)
|
||||
G.active_goal = TRUE
|
||||
cat_goals -= G
|
||||
|
||||
GLOB.active_department_goals[category] |= G
|
||||
return 1
|
||||
|
||||
/hook/roundend/proc/checkDepartmentGoals()
|
||||
for(var/category in GLOB.active_department_goals)
|
||||
var/list/cat_goals = GLOB.active_department_goals[category]
|
||||
|
||||
to_world("<span class='filter_system'><b>[category]</b></span>")
|
||||
|
||||
if(!LAZYLEN(cat_goals))
|
||||
to_world("<span class='filter_system'>There were no assigned goals!</span>")
|
||||
|
||||
else
|
||||
for(var/datum/goal/G in cat_goals)
|
||||
var/success = G.check_completion()
|
||||
to_world("<span class='filter_system'>[success ? "<span class='notice'>[G.name]</span>" : "<span class='warning'>[G.name]</span>"]</span>")
|
||||
to_world("<span class='filter_system'>[G.goal_text]</span>")
|
||||
return 1
|
||||
|
||||
/datum/goal
|
||||
var/name = "goal"
|
||||
|
||||
var/goal_text = "Do nothing! Congratulations."
|
||||
|
||||
var/active_goal = FALSE
|
||||
|
||||
var/category = GOAL_GENERAL
|
||||
|
||||
/datum/goal/proc/check_completion()
|
||||
return FALSE
|
||||
|
||||
/datum/goal/common
|
||||
name = "goal"
|
||||
|
||||
goal_text = "Congratulations, you still do nothing."
|
||||
|
||||
/datum/goal/medical
|
||||
name = "goal"
|
||||
|
||||
goal_text = "Congratulations, you still do nothing."
|
||||
category = GOAL_MEDICAL
|
||||
|
||||
/datum/goal/security
|
||||
name = "goal"
|
||||
|
||||
goal_text = "Congratulations, you still do nothing."
|
||||
category = GOAL_SECURITY
|
||||
|
||||
/datum/goal/engineering
|
||||
name = "goal"
|
||||
|
||||
goal_text = "Congratulations, you still do nothing."
|
||||
category = GOAL_ENGINEERING
|
||||
|
||||
/datum/goal/cargo
|
||||
name = "goal"
|
||||
|
||||
goal_text = "Congratulations, you still do nothing."
|
||||
category = GOAL_CARGO
|
||||
|
||||
/datum/goal/research
|
||||
name = "goal"
|
||||
|
||||
goal_text = "Congratulations, you still do nothing."
|
||||
category = GOAL_RESEARCH
|
||||
@@ -0,0 +1,57 @@
|
||||
|
||||
/*
|
||||
* lbnesquik - Github
|
||||
* Provided massive components of this. Polaris PR #5720.
|
||||
*/
|
||||
|
||||
//This is for the round end stats system.
|
||||
|
||||
//roundstat is used for easy finding of the variables, if you ever want to delete all of this,
|
||||
//just search roundstat and you'll find everywhere this thing reaches into.
|
||||
//It used to be bazinga but it only fly with microwaves.
|
||||
|
||||
GLOBAL_VAR_INIT(cans_opened_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(lights_switched_on_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(turbo_lift_floors_moved_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(lost_limbs_shift_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(seed_planted_shift_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(step_taken_shift_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(destroyed_research_items_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(items_sold_shift_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(disposals_flush_shift_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(rocks_drilled_roundstat, 0)
|
||||
GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
|
||||
|
||||
/hook/roundend/proc/RoundTrivia()//bazinga
|
||||
var/list/valid_stats_list = list() //This is to be populated with the good shit
|
||||
|
||||
if(GLOB.lost_limbs_shift_roundstat > 1)
|
||||
valid_stats_list.Add("[GLOB.lost_limbs_shift_roundstat] limbs left their owners bodies this shift, oh no!")
|
||||
else if(GLOB.destroyed_research_items_roundstat > 13)
|
||||
valid_stats_list.Add("[GLOB.destroyed_research_items_roundstat] objects were destroyed in the name of Science! Keep it up!")
|
||||
else if(GLOB.mech_destroyed_roundstat > 1)
|
||||
valid_stats_list.Add("[GLOB.mech_destroyed_roundstat] mechs were destroyed this shift. What did you do?")
|
||||
else if(GLOB.seed_planted_shift_roundstat > 20)
|
||||
valid_stats_list.Add("[GLOB.seed_planted_shift_roundstat] seeds were planted according to our sensors this shift.")
|
||||
|
||||
if(GLOB.rocks_drilled_roundstat > 80)
|
||||
valid_stats_list.Add("Our strong miners pulverized a whole [GLOB.rocks_drilled_roundstat] piles of pathetic rubble.")
|
||||
else if(GLOB.items_sold_shift_roundstat > 15)
|
||||
valid_stats_list.Add("The vending machines sold [GLOB.items_sold_shift_roundstat] items today.")
|
||||
else if(GLOB.step_taken_shift_roundstat > 900)
|
||||
valid_stats_list.Add("The employees walked a total of [GLOB.step_taken_shift_roundstat] steps for this shift! It should put them on the road to fitness!")
|
||||
|
||||
if(GLOB.cans_opened_roundstat > 0)
|
||||
valid_stats_list.Add("[GLOB.cans_opened_roundstat] cans were drank today!")
|
||||
else if(GLOB.lights_switched_on_roundstat > 0)
|
||||
valid_stats_list.Add("[GLOB.lights_switched_on_roundstat] light switches were flipped today!")
|
||||
else if(GLOB.turbo_lift_floors_moved_roundstat > 20)
|
||||
valid_stats_list.Add("The elevator moved up [GLOB.turbo_lift_floors_moved_roundstat] floors today!")
|
||||
else if(GLOB.disposals_flush_shift_roundstat > 40)
|
||||
valid_stats_list.Add("The disposal system flushed a whole [GLOB.disposals_flush_shift_roundstat] times for this shift. We should really invest in waste treatement.")
|
||||
|
||||
if(LAZYLEN(valid_stats_list))
|
||||
to_world("<B>Shift trivia!</B>")
|
||||
|
||||
for(var/body in valid_stats_list)
|
||||
to_world("[body]")
|
||||
@@ -189,6 +189,17 @@
|
||||
containername = "Jumper kit crate"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_pack/robotics/restrainingbolt
|
||||
name = "Restraining bolt crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/implanter = 1,
|
||||
/obj/item/weapon/implantcase/restrainingbolt = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/cybersolutions
|
||||
containername = "Restraining bolt crate"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_pack/robotics/bike
|
||||
name = "Spacebike Crate"
|
||||
contains = list()
|
||||
|
||||
@@ -281,10 +281,7 @@
|
||||
name = "Armor - Riot plates"
|
||||
contains = list(
|
||||
/obj/item/clothing/head/helmet/riot,
|
||||
/obj/item/clothing/suit/armor/pcarrier,
|
||||
/obj/item/clothing/accessory/armor/armorplate/riot,
|
||||
/obj/item/clothing/accessory/armor/armguards/riot,
|
||||
/obj/item/clothing/accessory/armor/legguards/riot
|
||||
/obj/item/clothing/suit/armor/pcarrier/riot/full
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
@@ -308,10 +305,7 @@
|
||||
name = "Armor - Ablative plates"
|
||||
contains = list(
|
||||
/obj/item/clothing/head/helmet/laserproof,
|
||||
/obj/item/clothing/suit/armor/pcarrier,
|
||||
/obj/item/clothing/accessory/armor/armorplate/laserproof,
|
||||
/obj/item/clothing/accessory/armor/armguards/laserproof,
|
||||
/obj/item/clothing/accessory/armor/legguards/laserproof
|
||||
/obj/item/clothing/suit/armor/pcarrier/laserproof/full
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/lawson
|
||||
@@ -336,10 +330,7 @@
|
||||
name = "Armor - Ballistic plates"
|
||||
contains = list(
|
||||
/obj/item/clothing/head/helmet/bulletproof,
|
||||
/obj/item/clothing/suit/armor/pcarrier,
|
||||
/obj/item/clothing/accessory/armor/armorplate/bulletproof,
|
||||
/obj/item/clothing/accessory/armor/armguards/bulletproof,
|
||||
/obj/item/clothing/accessory/armor/legguards/bulletproof
|
||||
/obj/item/clothing/suit/armor/pcarrier/bulletproof/full
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure/heph
|
||||
|
||||
@@ -186,4 +186,14 @@
|
||||
|
||||
/datum/category_item/underwear/undershirt/pinkblack_tshirt
|
||||
name = "Pink and Black T-Shirt"
|
||||
icon_state = "pinkblack_tshirt"
|
||||
icon_state = "pinkblack_tshirt"
|
||||
|
||||
/datum/category_item/underwear/undershirt/turtle
|
||||
name = "Turtleneck"
|
||||
icon_state = "turtleneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/sleevelessturtle
|
||||
name = "Turtleneck, Sleeveless"
|
||||
icon_state = "sleevelessturtle"
|
||||
has_color = TRUE
|
||||
@@ -54,10 +54,8 @@
|
||||
|
||||
/area/Initialize()
|
||||
. = ..()
|
||||
|
||||
luminosity = !(dynamic_lighting)
|
||||
icon_state = ""
|
||||
|
||||
return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms.
|
||||
|
||||
/area/LateInitialize()
|
||||
@@ -68,7 +66,6 @@
|
||||
power_change() // all machines set to current power level, also updates lighting icon
|
||||
if(no_spoilers)
|
||||
set_spoiler_obfuscation(TRUE)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
// Changes the area of T to A. Do not do this manually.
|
||||
// Area is expected to be a non-null instance.
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
for(var/i in loc)
|
||||
var/atom/movable/thing = i
|
||||
// We don't call parent so we are calling this for byond
|
||||
thing.Crossed(src)
|
||||
thing.Crossed(src, oldloc)
|
||||
|
||||
// We're a multi-tile object (multiple locs)
|
||||
else if(. && newloc)
|
||||
@@ -303,6 +303,8 @@
|
||||
if(AM == src)
|
||||
continue
|
||||
AM.Uncrossed(src)
|
||||
if(loc != destination) // Uncrossed() triggered a separate movement
|
||||
return
|
||||
|
||||
// Information about turf and z-levels for source and dest collected
|
||||
var/turf/oldturf = get_turf(oldloc)
|
||||
@@ -327,6 +329,8 @@
|
||||
if(AM == src)
|
||||
continue
|
||||
AM.Crossed(src, oldloc)
|
||||
if(loc != destination) // Crossed triggered a separate movement
|
||||
return
|
||||
|
||||
// Call our thingy to inform everyone we moved
|
||||
Moved(oldloc, NONE, TRUE)
|
||||
@@ -462,6 +466,8 @@
|
||||
minor_dir = dx
|
||||
minor_dist = dist_x
|
||||
|
||||
range = min(dist_x + dist_y, range)
|
||||
|
||||
while(src && target && src.throwing && istype(src.loc, /turf) \
|
||||
&& ((abs(target.x - src.x)+abs(target.y - src.y) > 0 && dist_travelled < range) \
|
||||
|| (a && a.has_gravity == 0) \
|
||||
|
||||
@@ -118,6 +118,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
var/base_species = "Human"
|
||||
var/list/species_traits = list()
|
||||
var/blood_color = "#A10808"
|
||||
var/custom_say
|
||||
var/custom_ask
|
||||
var/custom_whisper
|
||||
var/custom_exclaim
|
||||
// VOREStation
|
||||
|
||||
// New stuff
|
||||
@@ -139,6 +143,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
new_dna.custom_species=custom_species //VOREStaton Edit
|
||||
new_dna.species_traits=species_traits.Copy() //VOREStation Edit
|
||||
new_dna.blood_color=blood_color //VOREStation Edit
|
||||
new_dna.custom_say=custom_say //VOREStaton Edit
|
||||
new_dna.custom_ask=custom_ask //VOREStaton Edit
|
||||
new_dna.custom_whisper=custom_whisper //VOREStaton Edit
|
||||
new_dna.custom_exclaim=custom_exclaim //VOREStaton Edit
|
||||
for(var/b=1;b<=DNA_SE_LENGTH;b++)
|
||||
new_dna.SE[b]=SE[b]
|
||||
if(b<=DNA_UI_LENGTH)
|
||||
@@ -205,6 +213,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
src.base_species = character.species.base_species
|
||||
src.blood_color = character.species.blood_color
|
||||
src.species_traits = character.species.traits.Copy()
|
||||
src.custom_say = character.custom_say
|
||||
src.custom_ask = character.custom_ask
|
||||
src.custom_whisper = character.custom_whisper
|
||||
src.custom_exclaim = character.custom_exclaim
|
||||
|
||||
// +1 to account for the none-of-the-above possibility
|
||||
SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1)
|
||||
|
||||
@@ -237,6 +237,10 @@
|
||||
|
||||
// Technically custom_species is not part of the UI, but this place avoids merge problems.
|
||||
H.custom_species = dna.custom_species
|
||||
H.custom_say = dna.custom_say
|
||||
H.custom_ask = dna.custom_ask
|
||||
H.custom_whisper = dna.custom_whisper
|
||||
H.custom_exclaim = dna.custom_exclaim
|
||||
H.species.blood_color = dna.blood_color
|
||||
var/datum/species/S = H.species
|
||||
S.produceCopy(dna.base_species,dna.species_traits,src)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
var/last_activation = 0
|
||||
|
||||
/obj/structure/cult/pylon/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/structure/cult/pylon/attack_hand(mob/M as mob)
|
||||
|
||||
@@ -26,13 +26,13 @@
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth)
|
||||
access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth)
|
||||
access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway)
|
||||
|
||||
/datum/alt_title/deputy_manager
|
||||
title = "Deputy Manager"
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
|
||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||
access_heads, access_construction,
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway)
|
||||
|
||||
minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
|
||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||
access_heads, access_construction,
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway)
|
||||
alt_titles = list("Head Engineer" = /datum/alt_title/head_engineer, "Foreman" = /datum/alt_title/foreman, "Maintenance Manager" = /datum/alt_title/maintenance_manager)
|
||||
|
||||
/datum/alt_title/head_engineer
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
var/const/PATHFINDER =(1<<11)
|
||||
var/const/EXPLORER =(1<<12)
|
||||
var/const/PILOT =(1<<13)
|
||||
var/const/SAR =(1<<14)
|
||||
|
||||
/obj/item/weapon/card/id/medical/sar
|
||||
assignment = "Field Medic"
|
||||
rank = "Field Medic"
|
||||
@@ -64,13 +59,13 @@ var/const/SAR =(1<<14)
|
||||
/datum/job/pilot
|
||||
title = "Pilot"
|
||||
flag = PILOT
|
||||
departments = list(DEPARTMENT_PLANET)
|
||||
department_flag = MEDSCI
|
||||
departments = list(DEPARTMENT_CIVILIAN)
|
||||
department_flag = CIVILIAN
|
||||
faction = "Station"
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
supervisors = "the Pathfinder and the Head of Personnel"
|
||||
selection_color = "#999440"
|
||||
total_positions = 5
|
||||
spawn_positions = 5
|
||||
supervisors = "the Head of Personnel"
|
||||
selection_color = "#515151"
|
||||
economic_modifier = 5
|
||||
minimal_player_age = 3
|
||||
pto_type = PTO_EXPLORATION
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
|
||||
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
|
||||
access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels)
|
||||
access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway)
|
||||
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
|
||||
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
|
||||
access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels)
|
||||
access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway)
|
||||
alt_titles = list("Chief Physician" = /datum/alt_title/chief_physician, "Medical Director" = /datum/alt_title/medical_director, "Healthcare Manager" = /datum/alt_title/healthcare_manager)
|
||||
|
||||
/datum/alt_title/chief_physician
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
|
||||
access_tox_storage, access_teleporter,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_xenoarch, access_eva, access_network, access_xenobotany)
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_xenobotany)
|
||||
alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor, "Research Manager" = /datum/alt_title/research_manager,
|
||||
"Head of Development" = /datum/alt_title/head_of_development,"Head Scientist" = /datum/alt_title/head_scientist)
|
||||
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_construction,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_external_airlocks)
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
|
||||
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_construction,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_external_airlocks)
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
|
||||
alt_titles = list("Security Commander" = /datum/alt_title/sec_commander, "Chief of Security" = /datum/alt_title/sec_chief, "Security Manager" = /datum/alt_title/security_manager)
|
||||
|
||||
/datum/alt_title/security_manager
|
||||
|
||||
@@ -415,7 +415,7 @@ var/global/datum/controller/occupations/job_master
|
||||
|
||||
// Implants get special treatment
|
||||
if(G.slot == "implant")
|
||||
var/obj/item/weapon/implant/I = G.spawn_item(H)
|
||||
var/obj/item/weapon/implant/I = G.spawn_item(H, H.client.prefs.gear[G.display_name])
|
||||
I.invisibility = 100
|
||||
I.implant_loadout(H)
|
||||
continue
|
||||
@@ -514,11 +514,12 @@ var/global/datum/controller/occupations/job_master
|
||||
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
|
||||
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
|
||||
var/obj/item/weapon/storage/S = locate() in H.contents
|
||||
var/obj/item/wheelchair/R = null
|
||||
var/obj/item/wheelchair/R
|
||||
if(S)
|
||||
R = locate() in S.contents
|
||||
if(!l_foot || !r_foot || R)
|
||||
var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc)
|
||||
var/wheelchair_type = R?.unfolded_type || /obj/structure/bed/chair/wheelchair
|
||||
var/obj/structure/bed/chair/wheelchair/W = new wheelchair_type(H.loc)
|
||||
W.buckle_mob(H)
|
||||
H.update_canmove()
|
||||
W.set_dir(H.dir)
|
||||
|
||||
@@ -26,7 +26,10 @@ var/const/PSYCHIATRIST =(1<<7)
|
||||
var/const/ROBOTICIST =(1<<8)
|
||||
var/const/XENOBIOLOGIST =(1<<9)
|
||||
var/const/PARAMEDIC =(1<<10)
|
||||
var/const/XENOBOTANIST =(1<<15) //VOREStation Add
|
||||
var/const/PATHFINDER =(1<<11) //VOREStation Add
|
||||
var/const/EXPLORER =(1<<12) //VOREStation Add
|
||||
var/const/SAR =(1<<13) //VOREStation Add
|
||||
var/const/XENOBOTANIST =(1<<14) //VOREStation Add
|
||||
|
||||
var/const/CIVILIAN =(1<<2)
|
||||
|
||||
@@ -43,9 +46,10 @@ var/const/LAWYER =(1<<9)
|
||||
var/const/CHAPLAIN =(1<<10)
|
||||
var/const/ASSISTANT =(1<<11)
|
||||
var/const/BRIDGE =(1<<12)
|
||||
var/const/CLOWN =(1<<13) //VOREStation Add
|
||||
var/const/MIME =(1<<14) //VOREStation Add
|
||||
var/const/ENTERTAINER =(1<<15) //VOREStation Add
|
||||
var/const/PILOT =(1<<13) //VOREStation Add
|
||||
var/const/CLOWN =(1<<14) //VOREStation Add
|
||||
var/const/MIME =(1<<15) //VOREStation Add
|
||||
var/const/ENTERTAINER =(1<<16) //VOREStation Add
|
||||
|
||||
//VOREStation Add
|
||||
var/const/TALON =(1<<3)
|
||||
|
||||
@@ -529,5 +529,5 @@
|
||||
stasis_level = 100 //Just one setting
|
||||
|
||||
/obj/machinery/sleeper/survival_pod/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
RefreshParts(1)
|
||||
|
||||
@@ -270,6 +270,15 @@
|
||||
|
||||
//Create the desired item.
|
||||
var/obj/item/I = new making.path(src.loc)
|
||||
|
||||
if(LAZYLEN(I.matter)) // Sadly we must obey the laws of equivalent exchange.
|
||||
I.matter.Cut()
|
||||
else
|
||||
I.matter = list()
|
||||
|
||||
for(var/material in making.resources) // Handle the datum's autoscaling for waste, so we're properly wasting material, but not so much if we have efficiency.
|
||||
I.matter[material] = round(making.resources[material] / (making.no_scale ? 1 : 1.25)) * (making.no_scale ? 1 : mat_efficiency)
|
||||
|
||||
flick("[initial(icon_state)]_finish", src)
|
||||
if(multiplier > 1)
|
||||
if(istype(I, /obj/item/stack))
|
||||
@@ -277,7 +286,16 @@
|
||||
S.amount = multiplier
|
||||
else
|
||||
for(multiplier; multiplier > 1; --multiplier) // Create multiple items if it's not a stack.
|
||||
new making.path(src.loc)
|
||||
I = new making.path(src.loc)
|
||||
// We've already deducted the cost of multiple items. Process the matter the same.
|
||||
if(LAZYLEN(I.matter))
|
||||
I.matter.Cut()
|
||||
|
||||
else
|
||||
I.matter = list()
|
||||
|
||||
for(var/material in making.resources)
|
||||
I.matter[material] = round(making.resources[material] / (making.no_scale ? 1 : 1.25)) * (making.no_scale ? 1 : mat_efficiency)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/machinery/computer/arcade/
|
||||
/obj/machinery/computer/arcade
|
||||
name = "random arcade"
|
||||
desc = "random arcade machine"
|
||||
icon_state = "arcade"
|
||||
@@ -25,15 +25,15 @@
|
||||
/obj/item/toy/stickhorse = 2
|
||||
)
|
||||
|
||||
/obj/machinery/computer/arcade/New()
|
||||
..()
|
||||
/obj/machinery/computer/arcade/Initialize()
|
||||
. = ..()
|
||||
// If it's a generic arcade machine, pick a random arcade
|
||||
// circuit board for it and make the new machine
|
||||
if(!circuit)
|
||||
var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade/clawmachine)
|
||||
var/obj/item/weapon/circuitboard/CB = new choice()
|
||||
new CB.build_path(loc, CB)
|
||||
qdel(src)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/machinery/computer/arcade/proc/prizevend()
|
||||
if(!(contents-circuit).len)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
light_color = "#315ab4"
|
||||
|
||||
/obj/machinery/computer/cloning/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
pods = list()
|
||||
records = list()
|
||||
set_scan_temp("Scanner ready.", "good")
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
|
||||
/obj/machinery/computer/med_data/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
field_edit_questions = list(
|
||||
// General
|
||||
"sex" = "Please select new sex:",
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
name = "Monitor Decryption Key"
|
||||
|
||||
/obj/item/weapon/paper/monitorkey/Initialize()
|
||||
..() //Late init
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/item/weapon/paper/monitorkey/LateInitialize()
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/title = "Mass Driver Controls"
|
||||
|
||||
/obj/machinery/computer/pod/Initialize()
|
||||
..() //Not returning parent because lateload
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/machinery/computer/pod/LateInitialize()
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/static/list/field_edit_choices
|
||||
|
||||
/obj/machinery/computer/secure_data/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
field_edit_questions = list(
|
||||
// General
|
||||
"name" = "Please enter new name:",
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/static/list/field_edit_choices
|
||||
|
||||
/obj/machinery/computer/skills/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
field_edit_questions = list(
|
||||
// General
|
||||
"name" = "Please input new name:",
|
||||
|
||||
@@ -862,14 +862,14 @@ About the new airlock wires panel:
|
||||
|
||||
/obj/machinery/door/airlock/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
|
||||
var/list/power = list()
|
||||
power["main"] = main_power_lost_until > 0 ? 0 : 2
|
||||
power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1)
|
||||
power["backup"] = backup_power_lost_until > 0 ? 0 : 2
|
||||
power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1)
|
||||
data["power"] = power
|
||||
|
||||
|
||||
data["shock"] = (electrified_until == 0) ? 2 : 0
|
||||
data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1)
|
||||
data["id_scanner"] = !aiDisabledIdScanner
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
|
||||
/obj/machinery/door_timer/Initialize()
|
||||
..()
|
||||
//Doors need to go first, and can't rely on init order, so come back to me.
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/machinery/door_timer/LateInitialize()
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
L.updateicon()
|
||||
|
||||
area.power_change()
|
||||
GLOB.lights_switched_on_roundstat++
|
||||
|
||||
/obj/machinery/light_switch/power_change()
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
|
||||
securityCaster = 1
|
||||
|
||||
/obj/machinery/newscaster/Initialize()
|
||||
..() //Not returning . because lateload below
|
||||
..()
|
||||
allCasters += src
|
||||
unit_no = ++unit_no_cur
|
||||
paper_remaining = 15
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
sleep(2)
|
||||
go_out()
|
||||
sleep(2)
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/transportpod/relaymove(mob/user as mob)
|
||||
if(user.stat)
|
||||
|
||||
@@ -572,7 +572,7 @@ GLOBAL_LIST_EMPTY(vending_products)
|
||||
vend_ready = 1
|
||||
currently_vending = null
|
||||
SStgui.update_uis(src)
|
||||
|
||||
GLOB.items_sold_shift_roundstat++
|
||||
|
||||
/obj/machinery/vending/proc/do_logging(datum/stored_item/vending_product/R, mob/user, var/vending = 0)
|
||||
if(user.GetIdCard())
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
thrusters_possible = 1
|
||||
|
||||
/obj/mecha/combat/gorilla/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply.
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon(src)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
switch_dmg_type_possible = TRUE
|
||||
|
||||
/obj/mecha/combat/phazon/equipped/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
starting_equipment = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd,
|
||||
/obj/item/mecha_parts/mecha_equipment/gravcatapult
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
. += "<span class='warning'><b>It is completely destroyed.</b></span>"
|
||||
|
||||
/obj/item/mecha_parts/component/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
integrity = max_integrity
|
||||
|
||||
if(start_damaged)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/obj/item/weapon/inflatable_dispenser/my_deployer = null
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
my_deployer = my_tool
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Topic(href, href_list)
|
||||
|
||||
@@ -318,7 +318,7 @@
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
drone_overlay = new(src.icon, icon_state = droid_state)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy()
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
var/weapons_only_cycle = FALSE //So combat mechs don't switch to their equipment at times.
|
||||
|
||||
/obj/mecha/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
for(var/path in starting_components)
|
||||
var/obj/item/mecha_parts/component/C = new path(src)
|
||||
@@ -322,6 +322,8 @@
|
||||
if(smoke_possible) //Just making sure nothing is running.
|
||||
qdel(smoke_system)
|
||||
|
||||
GLOB.mech_destroyed_roundstat++
|
||||
|
||||
QDEL_NULL(pr_int_temp_processor)
|
||||
QDEL_NULL(pr_inertial_movement)
|
||||
QDEL_NULL(pr_give_air)
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
C.images += holder
|
||||
*/
|
||||
/obj/mecha/medical/odysseus/loaded/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
max_special_equip = 1
|
||||
|
||||
/obj/mecha/working/ripley/deathripley/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety
|
||||
ME.attach(src)
|
||||
return
|
||||
@@ -80,7 +80,7 @@
|
||||
name = "APLU \"Miner\""
|
||||
|
||||
/obj/mecha/working/ripley/mining/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
//Attach drill
|
||||
if(prob(25)) //Possible diamond drill... Feeling lucky?
|
||||
var/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
|
||||
|
||||
@@ -40,10 +40,7 @@
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/has_buckled_mobs()
|
||||
if(!buckled_mobs)
|
||||
return FALSE
|
||||
if(buckled_mobs.len)
|
||||
return TRUE
|
||||
return LAZYLEN(buckled_mobs)
|
||||
|
||||
/atom/movable/Destroy()
|
||||
unbuckle_all_mobs()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
create_reagents(100)
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T)
|
||||
for(var/obj/O in get_turf(src))
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/obj/effect/decal/warning_stripes
|
||||
icon = 'icons/effects/warning_stripes.dmi'
|
||||
|
||||
/obj/effect/decal/warning_stripes/New()
|
||||
/obj/effect/decal/warning_stripes/Initialize()
|
||||
. = ..()
|
||||
var/turf/T=get_turf(src)
|
||||
var/image/I=image(icon, icon_state = icon_state, dir = dir)
|
||||
I.color=color
|
||||
T.overlays += I
|
||||
qdel(src)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -10,32 +10,37 @@
|
||||
var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine
|
||||
var/panel_open = 0
|
||||
var/datum/wires/mines/wires = null
|
||||
register_as_dangerous_object = TRUE
|
||||
|
||||
var/camo_net = FALSE // Will the mine 'cloak' on deployment?
|
||||
|
||||
// The trap item will be triggered in some manner when detonating. Default only checks for grenades.
|
||||
var/obj/item/trap = null
|
||||
|
||||
/obj/effect/mine/New()
|
||||
/obj/effect/mine/Initialize()
|
||||
icon_state = "uglyminearmed"
|
||||
wires = new(src)
|
||||
|
||||
. = ..()
|
||||
if(ispath(trap))
|
||||
trap = new trap(src)
|
||||
|
||||
/obj/effect/mine/Initialize()
|
||||
..()
|
||||
|
||||
register_dangerous_to_step()
|
||||
if(camo_net)
|
||||
alpha = 50
|
||||
|
||||
/obj/effect/mine/Destroy()
|
||||
unregister_dangerous_to_step()
|
||||
if(trap)
|
||||
QDEL_NULL(trap)
|
||||
qdel_null(wires)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mine/Moved(atom/oldloc)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/turf/old_turf = get_turf(oldloc)
|
||||
var/turf/new_turf = get_turf(src)
|
||||
if(old_turf != new_turf)
|
||||
old_turf.unregister_dangerous_object(src)
|
||||
new_turf.register_dangerous_object(src)
|
||||
|
||||
/obj/effect/mine/proc/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
..()
|
||||
|
||||
/obj/effect/temporary_effect/eruption/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
flick("[icon_state]_create",src)
|
||||
|
||||
/obj/effect/temporary_effect/eruption/Destroy()
|
||||
|
||||
@@ -159,7 +159,6 @@
|
||||
|
||||
/obj/effect/spawner/newbomb/Initialize(newloc)
|
||||
..(newloc)
|
||||
|
||||
var/obj/item/device/transfer_valve/V = new(src.loc)
|
||||
var/obj/item/weapon/tank/phoron/PT = new(V)
|
||||
var/obj/item/weapon/tank/oxygen/OT = new(V)
|
||||
@@ -183,19 +182,14 @@
|
||||
OT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1
|
||||
OT.air_contents.update_values()
|
||||
|
||||
|
||||
var/obj/item/device/assembly/S = new assembly_type(V)
|
||||
|
||||
|
||||
V.attached_device = S
|
||||
|
||||
S.holder = V
|
||||
S.toggle_secure()
|
||||
|
||||
V.update_icon()
|
||||
|
||||
qdel(src)
|
||||
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
|
||||
///////////////////////
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
var/cell_type = /obj/item/weapon/cell/device
|
||||
|
||||
/obj/item/device/flash/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
power_supply = new cell_type(src)
|
||||
|
||||
/obj/item/device/flash/attackby(var/obj/item/W, var/mob/user)
|
||||
|
||||
@@ -84,7 +84,6 @@
|
||||
desc = "A headset used by pilots, has access to the explorer channel."
|
||||
icon_state = "pilot_headset"
|
||||
adhoc_fallback = TRUE
|
||||
ks2type = /obj/item/device/encryptionkey/pilot
|
||||
|
||||
/obj/item/device/radio/headset/pilot/alt
|
||||
name = "pilot's bowman headset"
|
||||
@@ -120,7 +119,7 @@
|
||||
desc = "A headset used by volunteers to expedition teams, has access to the exploration channel."
|
||||
icon_state = "pilot_headset"
|
||||
adhoc_fallback = TRUE
|
||||
ks2type = /obj/item/device/encryptionkey/pilot
|
||||
ks2type = /obj/item/device/encryptionkey/explorer
|
||||
|
||||
/obj/item/device/radio/headset/talon
|
||||
name = "talon headset"
|
||||
|
||||
@@ -7,15 +7,12 @@
|
||||
var/obj/item/stack/type_to_spawn = null
|
||||
|
||||
/obj/fiftyspawner/Initialize()
|
||||
..() //We're not returning . because we're going to ask to be deleted.
|
||||
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/item/stack/M = new type_to_spawn(T)
|
||||
var/obj/structure/closet/C = locate() in T
|
||||
var/obj/item/stack/M = new type_to_spawn(C || T)
|
||||
M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty
|
||||
M.update_icon() // Some stacks have different sprites depending on how full they are.
|
||||
var/obj/structure/closet/C = locate() in T
|
||||
if(C)
|
||||
C.contents += M
|
||||
return INITIALIZE_HINT_QDEL //Bye!
|
||||
|
||||
/obj/fiftyspawner/rods
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
stacktype = /obj/item/stack/rods
|
||||
no_variants = TRUE
|
||||
|
||||
/obj/item/stack/rods/New()
|
||||
..()
|
||||
/obj/item/stack/rods/Initialize()
|
||||
. = ..()
|
||||
recipes = rods_recipes
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -32,19 +32,15 @@
|
||||
|
||||
bag_material = MAT_SYNCLOTH
|
||||
|
||||
/obj/item/stack/sandbags/New(var/newloc, var/amt, var/bag_mat)
|
||||
..()
|
||||
/obj/item/stack/sandbags/Initialize(var/ml, var/amt, var/bag_mat)
|
||||
. = ..(ml, amt)
|
||||
recipes = sandbag_recipes
|
||||
update_icon()
|
||||
|
||||
if(bag_mat)
|
||||
bag_material = bag_mat
|
||||
|
||||
var/datum/material/M = get_material_by_name("[bag_material]")
|
||||
if(!M)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
return INITIALIZE_HINT_QDEL
|
||||
color = M.icon_colour
|
||||
|
||||
/obj/item/stack/sandbags/update_icon()
|
||||
@@ -136,17 +132,13 @@ var/global/list/datum/stack_recipe/sandbag_recipes = list( \
|
||||
|
||||
var/bag_material = "cloth"
|
||||
|
||||
/obj/item/stack/emptysandbag/New(var/newloc, var/amt, var/bag_mat)
|
||||
..(newloc, amt)
|
||||
|
||||
/obj/item/stack/emptysandbag/Initialize(var/ml, var/amt, var/bag_mat)
|
||||
. = ..(ml, amt)
|
||||
if(bag_mat)
|
||||
bag_material = bag_mat
|
||||
|
||||
var/datum/material/M = get_material_by_name("[bag_material]")
|
||||
if(!M)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
return INITIALIZE_HINT_QDEL
|
||||
color = M.icon_colour
|
||||
|
||||
/obj/item/stack/emptysandbag/attack_self(var/mob/user)
|
||||
|
||||
@@ -29,14 +29,13 @@
|
||||
var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc.
|
||||
var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc)
|
||||
|
||||
/obj/item/stack/New(var/loc, var/amount=null)
|
||||
..()
|
||||
if (!stacktype)
|
||||
/obj/item/stack/Initialize(var/ml, var/amount)
|
||||
. = ..()
|
||||
if(!stacktype)
|
||||
stacktype = type
|
||||
if (amount)
|
||||
if(amount)
|
||||
src.amount = amount
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/stack/Destroy()
|
||||
if(uses_charge)
|
||||
@@ -170,8 +169,37 @@
|
||||
var/atom/O
|
||||
if(recipe.use_material)
|
||||
O = new recipe.result_type(user.loc, recipe.use_material)
|
||||
|
||||
if(istype(O, /obj))
|
||||
var/obj/Ob = O
|
||||
|
||||
if(LAZYLEN(Ob.matter)) // Law of equivalent exchange.
|
||||
Ob.matter.Cut()
|
||||
|
||||
else
|
||||
Ob.matter = list()
|
||||
|
||||
var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000
|
||||
|
||||
Ob.matter[recipe.use_material] = mattermult / produced * required
|
||||
|
||||
else
|
||||
O = new recipe.result_type(user.loc)
|
||||
|
||||
if(recipe.matter_material)
|
||||
if(istype(O, /obj))
|
||||
var/obj/Ob = O
|
||||
|
||||
if(LAZYLEN(Ob.matter)) // Law of equivalent exchange.
|
||||
Ob.matter.Cut()
|
||||
|
||||
else
|
||||
Ob.matter = list()
|
||||
|
||||
var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000
|
||||
|
||||
Ob.matter[recipe.use_material] = mattermult / produced * required
|
||||
|
||||
O.set_dir(user.dir)
|
||||
O.add_fingerprint(user)
|
||||
|
||||
@@ -379,8 +407,9 @@
|
||||
var/on_floor = 0
|
||||
var/use_material
|
||||
var/pass_color
|
||||
var/matter_material // Material type used for recycling. Default, uses use_material. For non-material-based objects however, matter_material is needed.
|
||||
|
||||
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color)
|
||||
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color, recycle_material = null)
|
||||
src.title = title
|
||||
src.result_type = result_type
|
||||
src.req_amount = req_amount
|
||||
@@ -392,6 +421,12 @@
|
||||
src.use_material = supplied_material
|
||||
src.pass_color = pass_stack_color
|
||||
|
||||
if(!recycle_material && src.use_material)
|
||||
src.matter_material = src.use_material
|
||||
|
||||
else if(recycle_material)
|
||||
src.matter_material = recycle_material
|
||||
|
||||
/*
|
||||
* Recipe list datum
|
||||
*/
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
w_class = ITEMSIZE_TINY
|
||||
max_amount = 30
|
||||
|
||||
/obj/item/stack/arcadeticket/New(loc, amount = null)
|
||||
/obj/item/stack/arcadeticket/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
drop_sound = 'sound/items/drop/axe.ogg'
|
||||
pickup_sound = 'sound/items/pickup/axe.ogg'
|
||||
|
||||
/obj/item/stack/tile/New()
|
||||
..()
|
||||
/obj/item/stack/tile/Initialize()
|
||||
. = ..()
|
||||
randpixel_xy()
|
||||
|
||||
/*
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/obj/item/weapon/card/emag/examine(mob/user)
|
||||
. = ..()
|
||||
. += "[uses] uses remaining."
|
||||
|
||||
/obj/item/weapon/card/emag/used
|
||||
uses = 1
|
||||
|
||||
/obj/item/weapon/card/emag/used/Initialize()
|
||||
. = ..()
|
||||
uses = rand(1, 5)
|
||||
@@ -299,3 +299,13 @@
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/blade( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/restrainingbolt
|
||||
name = "glass case - 'Restraining Bolt'"
|
||||
desc = "A case containing a restraining bolt."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/restrainingbolt/New()
|
||||
src.imp = new /obj/item/weapon/implant/restrainingbolt( src )
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -4,18 +4,6 @@
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
initialize_loc = BP_HEAD
|
||||
var/roundstart = TRUE
|
||||
|
||||
/obj/item/weapon/implant/dud/torso
|
||||
name = "unknown implant"
|
||||
desc = "A small device with small connector wires."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
initialize_loc = BP_TORSO
|
||||
|
||||
/obj/item/weapon/implant/dud/old
|
||||
name = "old implant"
|
||||
desc = "A small device with small connector wires."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
roundstart = FALSE
|
||||
|
||||
@@ -150,3 +150,12 @@
|
||||
S.remove_from_storage(A)
|
||||
A.loc.contents.Remove(A)
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/restrainingbolt
|
||||
name = "implanter (bolt)"
|
||||
|
||||
/obj/item/weapon/implanter/restrainingbolt/New()
|
||||
src.imp = new /obj/item/weapon/implant/restrainingbolt( src )
|
||||
..()
|
||||
update()
|
||||
return
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
/obj/item/weapon/implant/restrainingbolt
|
||||
name = "\improper restraining bolt"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
@@ -75,61 +75,61 @@
|
||||
<center><h1>Food for Dummies 2</h1></center>
|
||||
<h5>Penned by Ali Big</h5>
|
||||
<p><b>Hello Newbie</b>, congratz on deciding to make food! This guide assumes you know absolutely nothing, so fret not, the information here will help you prepare food for your hungry crewmates!</p>
|
||||
<h3>Workspace prep:</h3>
|
||||
<h3>Workspace prep:</h3>
|
||||
This step is simple: merely go to the Grill, Oven, and Fryer and turn everything on so you do not need to wait for them to warm up later; they won’t start a fire unless food is left in them unchecked. It is also highly suggested to lay out at least a few Measuring Cups on the counters for ease of use.
|
||||
<h3>Basic ingredient prep:</h3>
|
||||
<h3>Basic ingredient prep:</h3>
|
||||
In the lockers and fridges, you have all your needed supplies for this guide, so look through them and familiarize yourself! This guide will only use ingredients you already have access to, so don't worry about missing items!
|
||||
<h2>Part 1: How to Create Various Essential Ingredients with What You Have</h2>
|
||||
<h3>Dough Creation:</h3>
|
||||
<h3>Dough Creation:</h3>
|
||||
The basis for a large quantity of meals. Simply take an Egg, crack it into a Beaker or Measuring Cup, and then add 10 units of Flour to create Dough.
|
||||
<h3>Dough Creation part 2:</h3>
|
||||
<h3>Dough Creation part 2:</h3>
|
||||
With Dough, you can make a wide variety of base ingredients. Flattening it with a Rolling Pin makes Flat Dough. Flat Dough can be cooked in a Microwave for Flatbread, or if one adds Water and Flour in with the Flat Dough in the Microwave you get a Tortilla. Water can be obtained by filling a Cup at the Sink or Soda Machine.
|
||||
<h3>Dough Creation Part 3:</h3>
|
||||
<h3>Dough Creation Part 3:</h3>
|
||||
Alternatively, Flat Dough can be cut with a Knife to make Dough Slices, and those can be cut to make Spaghetti.
|
||||
<h3>Cheese Creation:</h3>
|
||||
<h3>Cheese Creation:</h3>
|
||||
A common topping. Take a bottle of Universal Enzyme, put it in a Beaker or Measuring Cup, and add Milk until a Cheese Wheel pops out. Then cut the Cheese Wheel with a Knife to make Cheese Wedges, all recipes use Wedges not the full Wheel.
|
||||
<h3>Tofu Creation:</h3>
|
||||
Same as cheese, but with Soymilk!
|
||||
<h3>Meatball Creation:</h3>
|
||||
<h3>Meatball Creation:</h3>
|
||||
Mix Animal protein and Flour, to create Animal Protein grind down some Meat in the grinder, then remove the beaker and add Flour.
|
||||
<h3>Meat Uses:</h3>
|
||||
<h3>Meat Uses:</h3>
|
||||
Full pieces of Meat can be cut for Raw Cutlets, which can be cut once more to make Raw Bacon. Though be sure not to cut all of your meat, plenty of recipes need a full uncut piece!
|
||||
<h2>Part 2: Putting It All Together</h2>
|
||||
<p>Now that you know the fundamentals of how to make the base ingredients, here are some fairly easy recipes to put them together into something enjoyable for the crew.</p>
|
||||
<h4>Warning: recipes are upscale able, so you can add multiple of the same ingredients in the same ratio to cook lots of food at once!</h4>
|
||||
<h4>Warning: recipes are upscale able, so you can add multiple of the same ingredients in the same ratio to cook lots of food at once!</h4>
|
||||
<h4>Warning: do not try and cook multiple recipes at once as it is very likely it will default to a different recipe or will just cook the one and just "grill, bake, etc." the rest of the ingredients.</h4>
|
||||
<h2>Burgers:</h2>
|
||||
<h2>Burgers:</h2>
|
||||
<b>The cornerstone of basic food:</b> to prepare these, microwave a piece of Dough to get a bun and grab a piece of Meat. Open the Grill, remove the Rack, and add both Bun and Meat to the Rack. Then, place the Rack back into the Grill to cook and remove it once finished. If you feel fancy, you can add cheese afterwards for a cheeseburger.
|
||||
<h2>Meat Pie:</h2>
|
||||
<h2>Meat Pie:</h2>
|
||||
Flat Dough and Meat in an Oven Pan, same way you use the Grill; take the Pan out, put the ingredients in, and place it back to cook. Simple, but very good looking and tasty!
|
||||
<h2>Burritos:</h2>
|
||||
<h2>Burritos:</h2>
|
||||
Burritos: A personal favorite due to flexibility of options: Use a Tortilla as a base for all of these. For a Chili one, add 2 Meatballs and 1 Space Spice (found near the Flour) to the Microwave; very simple and filling! Add a Cheese Wedge instead of the spice to make a queso burrito. For a Breakfast Wrap, add a whole Egg, Cooked Bacon (Raw Bacon cooked in the Microwave), and Cheese in with the Tortilla. For Vegan Burritos, just cook a Tortilla and Tofu together in the Microwave.
|
||||
<h2>Tacos:</h2>
|
||||
<h2>Tacos:</h2>
|
||||
Use a tortilla then 1 cooked Cutlet, and a Cheese Wedge. Very easy to mass produce, great in a pinch!
|
||||
<h2>Cheesy Nachos:</h2>
|
||||
<h2>Cheesy Nachos:</h2>
|
||||
Tortilla, Cheese and 1 unit of Salt in the microwave, the perfect Finger Food!
|
||||
<h2>Spaghetti:</h2>
|
||||
<h2>Spaghetti:</h2>
|
||||
Without Tomato’s from Botany it's not going to be the flashiest, but one can make Boiled Spaghetti with Spaghetti and Water in the Microwave. Kitsune Udon can be made with Spaghetti, Egg Yolk (crack egg in beaker then add to microwave), and Tofu. Spaghetti and Meatballs can be made by doing the Boiled Spaghetti Recipe and adding 2 Meatballs; adding 4 Meatballs into the initial mix makes Spesslaw. Lastly, Spaghetti, Milk, and Cheese in the Oven makes Macaroni and Cheese.
|
||||
<h2>Steak:</h2>
|
||||
For the pure meat eaters, just add Meat, 1 Salt, and 1 Pepper into the grill for them, and try not to cry as they use up all your Meat quickly. (There's a second Meat Locker in the freezer room if you do run out!)
|
||||
<h2>Donk Pockets:</h2>
|
||||
<h2>Donk Pockets:</h2>
|
||||
Dough and Meatball in the Microwave, though we already have plenty lying around the station.
|
||||
<h2>Eggs:</h2>
|
||||
<h2>Eggs:</h2>
|
||||
Fried Egg, 1 Egg 1 Salt, 1 Pepper in a Microwave. Bacon and Eggs if you combine Cooked Bacon and Fried Egg in the Microwave. Great way to start the shift!
|
||||
<h2>Part 3: Final Notes</h2>
|
||||
<p>These recipes only scratch the surface, but it's all things that can be done with what is pre-provided. If you have a partner in Botany, feel free to request more meat or any other supplies to try new recipes!</p>
|
||||
<p>These recipes only scratch the surface, but it's all things that can be done with what is pre-provided. If you have a partner in Botany, feel free to request more meat or any other supplies to try new recipes!</p>
|
||||
<p>The Fryer, CondiMaster3000, and other nearby devices have been deliberately left out of this guide; as you get more advanced feel free to experiment with them, though be careful with the Fryer especially as it's the #1 source of fires for learning chefs, myself included. The one other machine that is worth understanding is the <b>Gibber</b> in the freezer room. If you are delivered fish or such they can be gibbed for extra Meat, though you may need to butcher the parts with a Knife afterwards to get usable Meat! Though if the meat is purple or comes from Koi or Spacecarp <b>do not directly serve it to crew!</b> It contains toxins that are better taken care of by other departments. </p>
|
||||
<p>Some wonderful websites share recipes and tips for learning chefs on the Extranet! Look on your PDA or preferred device at https://wiki.vore-station.net/Guide_to_Food_and_Drink and https://vore-station.net/infodump/recipes_food.html for further tips, though do note the latter is more accurate in regard to recipes. Happy cooking!</p>
|
||||
<h4>Pro Tips:</h4>
|
||||
<h4>((The Food Bags in the Chef's Closet are great for moving a lot of food at once!))</h4>
|
||||
<h4>((The Food Bags in the Chef's Closet are great for moving a lot of food at once!))</h4>
|
||||
<h4>((Stay out of the Freezer if you're Cold Blooded!))</h4>
|
||||
<h4>((The websites linked above are also on our stations wiki. Which is always in need of helping heads to fix it up. The recipes listed on the web link may not be fully accurate so please don't be afraid to pop into the discord wiki channel and lend a hand!))</h4>
|
||||
</body>
|
||||
</html>
|
||||
"}
|
||||
|
||||
//accurate as of 2/17/21
|
||||
/obj/item/weapon/book/manual//bar_guide
|
||||
//accurate as of 2/23/21
|
||||
/obj/item/weapon/book/manual/bar_guide
|
||||
name = "How to Alcohol (And other Drinks)"
|
||||
desc = "A helpful guide to the world of barkeeping."
|
||||
icon_state = "bar-guide"
|
||||
@@ -213,7 +213,7 @@
|
||||
1 part Beer, 2 parts Ale
|
||||
<h3>Whiskey Cola:</h3>
|
||||
2 parts Whiskey, 1 part Space Cola
|
||||
<h3>Binman Bliss:
|
||||
<h3>Binman Bliss:</h3>
|
||||
1 part Sake, 1 part Tequila
|
||||
|
||||
<h1>High Alcohol</h1>
|
||||
|
||||
@@ -31,7 +31,9 @@ Protectiveness | Armor %
|
||||
var/applies_material_color = TRUE
|
||||
var/unbreakable = FALSE
|
||||
var/default_material = null // Set this to something else if you want material attributes on init.
|
||||
var/material_armor_modifer = 1 // Adjust if you want seperate types of armor made from the same material to have different protectiveness (e.g. makeshift vs real armor)
|
||||
var/material_armor_modifier = 1 // Adjust if you want seperate types of armor made from the same material to have different protectiveness (e.g. makeshift vs real armor)
|
||||
var/material_slowdown_modifier = 0
|
||||
var/material_slowdown_multiplier = 1
|
||||
|
||||
/obj/item/clothing/New(var/newloc, var/material_key)
|
||||
..(newloc)
|
||||
@@ -138,7 +140,7 @@ Protectiveness | Armor %
|
||||
return ..()
|
||||
|
||||
var/reflectchance = (40 * material.reflectivity) - round(damage/3)
|
||||
reflectchance *= material_armor_modifer
|
||||
reflectchance *= material_armor_modifier
|
||||
if(!(def_zone in list(BP_TORSO, BP_GROIN)))
|
||||
reflectchance /= 2
|
||||
if(P.starting && prob(reflectchance))
|
||||
@@ -166,17 +168,17 @@ Protectiveness | Armor %
|
||||
if(material)
|
||||
var/melee_armor = 0, bullet_armor = 0, laser_armor = 0, energy_armor = 0, bomb_armor = 0
|
||||
|
||||
melee_armor = calculate_material_armor(material.protectiveness * material_armor_modifer)
|
||||
melee_armor = calculate_material_armor(material.protectiveness * material_armor_modifier)
|
||||
|
||||
bullet_armor = calculate_material_armor((material.protectiveness * (material.hardness / 100) * material_armor_modifer) * 0.7)
|
||||
bullet_armor = calculate_material_armor((material.protectiveness * (material.hardness / 100) * material_armor_modifier) * 0.7)
|
||||
|
||||
laser_armor = calculate_material_armor((material.protectiveness * (material.reflectivity + 1) * material_armor_modifer) * 0.7)
|
||||
laser_armor = calculate_material_armor((material.protectiveness * (material.reflectivity + 1) * material_armor_modifier) * 0.7)
|
||||
if(material.opacity != 1)
|
||||
laser_armor *= max(material.opacity - 0.3, 0) // Glass and such has an opacity of 0.3, but lasers should go through glass armor entirely.
|
||||
|
||||
energy_armor = calculate_material_armor((material.protectiveness * material_armor_modifer) * 0.4)
|
||||
energy_armor = calculate_material_armor((material.protectiveness * material_armor_modifier) * 0.4)
|
||||
|
||||
bomb_armor = calculate_material_armor((material.protectiveness * material_armor_modifer) * 0.5)
|
||||
bomb_armor = calculate_material_armor((material.protectiveness * material_armor_modifier) * 0.5)
|
||||
|
||||
// Makes sure the numbers stay capped.
|
||||
for(var/number in list(melee_armor, bullet_armor, laser_armor, energy_armor, bomb_armor))
|
||||
@@ -190,7 +192,12 @@ Protectiveness | Armor %
|
||||
|
||||
if(!isnull(material.conductivity))
|
||||
siemens_coefficient = between(0, material.conductivity / 10, 10)
|
||||
slowdown = between(0, round(material.weight / 10, 0.1), 6)
|
||||
|
||||
var/slowdownModified = between(0, round(material.weight / 10, 0.1), 6)
|
||||
|
||||
var/slowdownUncapped = (material_slowdown_multiplier * slowdownModified) - material_slowdown_modifier
|
||||
|
||||
slowdown = max(slowdownUncapped, 0)
|
||||
|
||||
/obj/item/clothing/suit/armor/material
|
||||
name = "armor"
|
||||
@@ -201,6 +208,67 @@ Protectiveness | Armor %
|
||||
desc = "This appears to be two 'sheets' of a material held together by cable. If the sheets are strong, this could be rather protective."
|
||||
icon_state = "material_armor_makeshift"
|
||||
|
||||
/obj/item/clothing/accessory/material/makeshift/light //Craftable with 4 material sheets, less slowdown, less armour
|
||||
name = "light armor plate"
|
||||
desc = "A thin plate of padded material, designed to fit into a plate carrier. Attaches to a plate carrier."
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_state = "armor_light"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
slot = ACCESSORY_SLOT_ARMOR_C
|
||||
material_armor_modifier = 0.8
|
||||
material_slowdown_modifier = 0.5 //Subtracted from total slowdown
|
||||
material_slowdown_multiplier = 0.8 //Multiplied by total slowdown
|
||||
|
||||
/obj/item/clothing/accessory/material/makeshift/heavy //Craftable with 8 material sheets, more slowdown, more armour
|
||||
name = "heavy armor plate"
|
||||
desc = "A thick plate of padded material, designed to fit into a plate carrier. Attaches to a plate carrier."
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_state = "armor_medium"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
slot = ACCESSORY_SLOT_ARMOR_C
|
||||
material_armor_modifier = 1.2
|
||||
material_slowdown_modifier = 0
|
||||
material_slowdown_multiplier = 1
|
||||
|
||||
/obj/item/clothing/accessory/material/custom //Not yet craftable, advanced version made with science!
|
||||
name = "custom armor plate"
|
||||
desc = "A composite plate of custom machined material, designed to fit into a plate carrier. Attaches to a plate carrier."
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_state = "armor_tactical"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
slot = ACCESSORY_SLOT_ARMOR_C
|
||||
material_armor_modifier = 1.2
|
||||
material_slowdown_modifier = 0.5
|
||||
material_slowdown_multiplier = 0.8
|
||||
|
||||
/obj/item/clothing/accessory/material/makeshift/armguards
|
||||
name = "arm guards"
|
||||
desc = "A pair of arm pads reinforced with material. Attaches to a plate carrier."
|
||||
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_override = 'icons/mob/modular_armor.dmi'
|
||||
icon_state = "armguards_material"
|
||||
gender = PLURAL
|
||||
body_parts_covered = ARMS
|
||||
slot = ACCESSORY_SLOT_ARMOR_A
|
||||
material_armor_modifier = 0.8
|
||||
material_slowdown_modifier = 0.8
|
||||
material_slowdown_multiplier = 0.8
|
||||
|
||||
/obj/item/clothing/accessory/material/makeshift/legguards
|
||||
name = "leg guards"
|
||||
desc = "A pair of leg guards reinforced with material. Attaches to a plate carrier."
|
||||
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
|
||||
icon = 'icons/obj/clothing/modular_armor.dmi'
|
||||
icon_override = 'icons/mob/modular_armor.dmi'
|
||||
icon_state = "legguards_material"
|
||||
gender = PLURAL
|
||||
body_parts_covered = LEGS
|
||||
slot = ACCESSORY_SLOT_ARMOR_L
|
||||
material_armor_modifier = 0.8
|
||||
material_slowdown_modifier = 0.8
|
||||
material_slowdown_multiplier = 0.8
|
||||
|
||||
/obj/item/clothing/suit/armor/material/makeshift/durasteel
|
||||
default_material = "durasteel"
|
||||
|
||||
@@ -218,6 +286,9 @@ Protectiveness | Armor %
|
||||
thrown_force_divisor = 0.2
|
||||
var/wired = FALSE
|
||||
|
||||
/obj/item/weapon/material/armor_plating/insert
|
||||
unbreakable = FALSE
|
||||
|
||||
/obj/item/weapon/material/armor_plating/attackby(var/obj/O, mob/user)
|
||||
if(istype(O, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/S = O
|
||||
@@ -249,6 +320,54 @@ Protectiveness | Armor %
|
||||
else
|
||||
..()
|
||||
|
||||
//Make plating inserts for modular armour.
|
||||
/obj/item/weapon/material/armor_plating/insert/attackby(var/obj/O, mob/user)
|
||||
|
||||
. = ..()
|
||||
|
||||
if(istype(O, /obj/item/weapon/weldingtool))
|
||||
var /obj/item/weapon/weldingtool/S = O
|
||||
if(S.remove_fuel(0,user))
|
||||
if(!src || !S.isOn()) return
|
||||
to_chat(user, "<span class='notice'>You trim down the edges to size.</span>")
|
||||
user.drop_from_inventory(src)
|
||||
var/obj/item/clothing/accessory/material/makeshift/light/new_armor = new(null, src.material.name)
|
||||
user.put_in_hands(new_armor)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/weapon/material/armor_plating/insert))
|
||||
var/obj/item/weapon/material/armor_plating/insert/second_plate = O
|
||||
if(second_plate.material != src.material)
|
||||
to_chat(user, "<span class='warning'>Both plates need to be the same type of material.</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You bond the two plates together.</span>")
|
||||
user.drop_from_inventory(src)
|
||||
user.drop_from_inventory(second_plate)
|
||||
var/obj/item/clothing/accessory/material/makeshift/heavy/new_armor = new(null, src.material.name)
|
||||
user.put_in_hands(new_armor)
|
||||
qdel(second_plate)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/weapon/tool/wirecutters))
|
||||
to_chat(user, "<span class='notice'>You split the plate down the middle, and joint it at the elbow.</span>")
|
||||
user.drop_from_inventory(src)
|
||||
var/obj/item/clothing/accessory/material/makeshift/armguards/new_armor = new(null, src.material.name)
|
||||
user.put_in_hands(new_armor)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/stack/material))
|
||||
var/obj/item/stack/material/S = O
|
||||
if(S.material == get_material_by_name("leather"))
|
||||
if(S.use(2))
|
||||
to_chat(user, "<span class='notice'>You curve the plate inwards, and add a strap for adjustment.</span>")
|
||||
user.drop_from_inventory(src)
|
||||
var/obj/item/clothing/accessory/material/makeshift/legguards/new_armor = new(null, src.material.name)
|
||||
user.put_in_hands(new_armor)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
// Used to craft the makeshift helmet
|
||||
/obj/item/clothing/head/helmet/bucket
|
||||
|
||||
@@ -77,14 +77,14 @@
|
||||
//visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.")
|
||||
to_chat(user, "<span class='notice'>You smash the snowball in your hand.</span>")
|
||||
var/atom/S = new /obj/item/stack/material/snow(user.loc)
|
||||
del(src)
|
||||
qdel(src)
|
||||
user.put_in_hands(S)
|
||||
else
|
||||
//visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.")
|
||||
to_chat(user, "<span class='notice'>You start compacting the snowball.</span>")
|
||||
if(do_after(user, 2 SECONDS))
|
||||
var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc)
|
||||
del(src)
|
||||
qdel(src)
|
||||
user.put_in_hands(S)
|
||||
|
||||
/obj/item/weapon/material/snow/snowball/reinforced
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
item_state = "saddlebag"
|
||||
icon_state = "saddlebag"
|
||||
max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags
|
||||
slowdown = 1 //And are slower, too...Unless you're a macro, that is.
|
||||
slowdown = 1 //And are slower, too...
|
||||
var/taurtype = /datum/sprite_accessory/tail/taur/horse //Acceptable taur type to be wearing this
|
||||
var/no_message = "You aren't the appropriate taur type to wear this!"
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
icon_state = "saddlebag"
|
||||
var/icon_base = "saddlebag"
|
||||
max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags
|
||||
slowdown = 1 //And are slower, too...Unless you're a macro, that is.
|
||||
slowdown = 1 //And are slower, too...
|
||||
var/no_message = "You aren't the appropriate taur type to wear this!"
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
@@ -44,11 +44,6 @@
|
||||
log_runtime("[H] was not a valid human!")
|
||||
return
|
||||
|
||||
if(H.size_multiplier >= RESIZE_BIG) //Are they a macro? If yes, they get no slowdown.
|
||||
slowdown = 0
|
||||
else
|
||||
slowdown = initial(slowdown)
|
||||
|
||||
var/datum/sprite_accessory/tail/taur/TT = H.tail_style
|
||||
item_state = "[icon_base]_[TT.icon_sprite_tag]" //icon_sprite_tag is something like "deer"
|
||||
return 1
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
gauge_icon = "indicator_emergency"
|
||||
|
||||
/obj/item/weapon/tank/emergency/nitrogen/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
src.air_contents.adjust_gas("nitrogen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
|
||||
/obj/item/weapon/tank/emergency/nitrogen/double
|
||||
|
||||
@@ -671,7 +671,7 @@
|
||||
always_process = TRUE
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/mounted/exosuit/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
if(istype(loc, /obj/item/mecha_parts/mecha_equipment))
|
||||
equip_mount = loc
|
||||
|
||||
@@ -19,29 +19,11 @@
|
||||
var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak.
|
||||
|
||||
var/show_examine = TRUE // Does this pop up on a mob when the mob is examined?
|
||||
var/register_as_dangerous_object = FALSE // Should this tell its turf that it is dangerous automatically?
|
||||
|
||||
/obj/Initialize()
|
||||
if(register_as_dangerous_object)
|
||||
register_dangerous_to_step()
|
||||
return ..()
|
||||
|
||||
/obj/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(register_as_dangerous_object)
|
||||
unregister_dangerous_to_step()
|
||||
return ..()
|
||||
|
||||
/obj/Moved(atom/oldloc)
|
||||
. = ..()
|
||||
if(register_as_dangerous_object)
|
||||
var/turf/old_turf = get_turf(oldloc)
|
||||
var/turf/new_turf = get_turf(src)
|
||||
|
||||
if(old_turf != new_turf)
|
||||
old_turf.unregister_dangerous_object(src)
|
||||
new_turf.register_dangerous_object(src)
|
||||
|
||||
/obj/Topic(href, href_list, var/datum/tgui_state/state = GLOB.tgui_default_state)
|
||||
if(usr && ..())
|
||||
return 1
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
// creates a new object and deletes itself
|
||||
/obj/random/Initialize()
|
||||
. = ..()
|
||||
..()
|
||||
if (!prob(spawn_nothing_percentage))
|
||||
spawn_item()
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -1,236 +1,252 @@
|
||||
GLOBAL_LIST_EMPTY(cliff_icon_cache)
|
||||
|
||||
/*
|
||||
Cliffs give a visual illusion of depth by seperating two places while presenting a 'top' and 'bottom' side.
|
||||
|
||||
Mobs moving into a cliff from the bottom side will simply bump into it and be denied moving into the tile,
|
||||
where as mobs moving into a cliff from the top side will 'fall' off the cliff, forcing them to the bottom, causing significant damage and stunning them.
|
||||
|
||||
Mobs can climb this while wearing climbing equipment by clickdragging themselves onto a cliff, as if it were a table.
|
||||
|
||||
Flying mobs can pass over all cliffs with no risk of falling.
|
||||
|
||||
Projectiles and thrown objects can pass, however if moving upwards, there is a chance for it to be stopped by the cliff.
|
||||
This makes fighting something that is on top of a cliff more challenging.
|
||||
|
||||
As a note, dir points upwards, e.g. pointing WEST means the left side is 'up', and the right side is 'down'.
|
||||
|
||||
When mapping these in, be sure to give at least a one tile clearance, as NORTH facing cliffs expand to
|
||||
two tiles on initialization, and which way a cliff is facing may change during maploading.
|
||||
*/
|
||||
|
||||
/obj/structure/cliff
|
||||
name = "cliff"
|
||||
desc = "A steep rock ledge. You might be able to climb it if you feel bold enough."
|
||||
description_info = "Walking off the edge of a cliff while on top will cause you to fall off, causing severe injury.<br>\
|
||||
You can climb this cliff if wearing special climbing equipment, by click-dragging yourself onto the cliff.<br>\
|
||||
Projectiles traveling up a cliff may hit the cliff instead, making it more difficult to fight something \
|
||||
on top."
|
||||
icon = 'icons/obj/flora/rocks.dmi'
|
||||
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = FALSE
|
||||
climbable = TRUE
|
||||
climb_delay = 10 SECONDS
|
||||
block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
|
||||
register_as_dangerous_object = TRUE
|
||||
|
||||
var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display.
|
||||
var/corner = FALSE // Used for icon things.
|
||||
var/ramp = FALSE // Ditto.
|
||||
var/bottom = FALSE // Used for 'bottom' typed cliffs, to avoid infinite cliffs, and for icons.
|
||||
|
||||
var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks.
|
||||
var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff.
|
||||
|
||||
// These arrange their sprites at runtime, as opposed to being statically placed in the map file.
|
||||
/obj/structure/cliff/automatic
|
||||
icon_state = "cliffbuilder"
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/cliff/automatic/corner
|
||||
icon_state = "cliffbuilder-corner"
|
||||
dir = NORTHEAST
|
||||
corner = TRUE
|
||||
|
||||
// Tiny part that doesn't block, used for making 'ramps'.
|
||||
/obj/structure/cliff/automatic/ramp
|
||||
icon_state = "cliffbuilder-ramp"
|
||||
dir = NORTHEAST
|
||||
density = FALSE
|
||||
ramp = TRUE
|
||||
|
||||
// Made automatically as needed by automatic cliffs.
|
||||
/obj/structure/cliff/bottom
|
||||
bottom = TRUE
|
||||
|
||||
/obj/structure/cliff/automatic/Initialize()
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
// Paranoid about the maploader, direction is very important to cliffs, since they may get bigger if initialized while facing NORTH.
|
||||
/obj/structure/cliff/automatic/LateInitialize()
|
||||
if(dir in GLOB.cardinal)
|
||||
icon_variant = pick("a", "b", "c")
|
||||
|
||||
if(dir & NORTH && !bottom) // North-facing cliffs require more cliffs to be made.
|
||||
make_bottom()
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/proc/make_bottom()
|
||||
// First, make sure there's room to put the bottom side.
|
||||
var/turf/T = locate(x, y - 1, z)
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
// Now make the bottom cliff have mostly the same variables.
|
||||
var/obj/structure/cliff/bottom/bottom = new(T)
|
||||
is_double_cliff = TRUE
|
||||
climb_delay /= 2 // Since there are two cliffs to climb when going north, both take half the time.
|
||||
|
||||
bottom.dir = dir
|
||||
bottom.is_double_cliff = TRUE
|
||||
bottom.climb_delay = climb_delay
|
||||
bottom.icon_variant = icon_variant
|
||||
bottom.corner = corner
|
||||
bottom.ramp = ramp
|
||||
bottom.layer = layer - 0.1
|
||||
bottom.density = density
|
||||
bottom.update_icon()
|
||||
|
||||
/obj/structure/cliff/set_dir(new_dir)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/update_icon()
|
||||
icon_state = "cliff-[dir][icon_variant][bottom ? "-bottom" : ""][corner ? "-corner" : ""][ramp ? "-ramp" : ""]"
|
||||
|
||||
// Now for making the top-side look like a different turf.
|
||||
var/turf/T = get_step(src, dir)
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
var/subtraction_icon_state = "[icon_state]-subtract"
|
||||
var/cache_string = "[icon_state]_[T.icon]_[T.icon_state]"
|
||||
if(T && subtraction_icon_state in cached_icon_states(icon))
|
||||
cut_overlays()
|
||||
// If we've made the same icon before, just recycle it.
|
||||
if(cache_string in GLOB.cliff_icon_cache)
|
||||
add_overlay(GLOB.cliff_icon_cache[cache_string])
|
||||
|
||||
else // Otherwise make a new one, but only once.
|
||||
var/icon/underlying_ground = icon(T.icon, T.icon_state, T.dir)
|
||||
var/icon/subtract = icon(icon, subtraction_icon_state)
|
||||
underlying_ground.Blend(subtract, ICON_SUBTRACT)
|
||||
var/image/final = image(underlying_ground)
|
||||
final.layer = src.layer - 0.2
|
||||
GLOB.cliff_icon_cache[cache_string] = final
|
||||
add_overlay(final)
|
||||
|
||||
|
||||
// Movement-related code.
|
||||
|
||||
/obj/structure/cliff/CanPass(atom/movable/mover, turf/target)
|
||||
if(isliving(mover))
|
||||
var/mob/living/L = mover
|
||||
if(L.hovering) // Flying mobs can always pass.
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
// Projectiles and objects flying 'upward' have a chance to hit the cliff instead, wasting the shot.
|
||||
else if(istype(mover, /obj))
|
||||
var/obj/O = mover
|
||||
if(check_shield_arc(src, dir, O)) // This is actually for mobs but it will work for our purposes as well.
|
||||
if(prob(uphill_penalty / (1 + is_double_cliff) )) // Firing upwards facing NORTH means it will likely have to pass through two cliffs, so the chance is halved.
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/cliff/Bumped(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(should_fall(L))
|
||||
fall_off_cliff(L)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/structure/cliff/proc/should_fall(mob/living/L)
|
||||
if(L.hovering)
|
||||
return FALSE
|
||||
|
||||
var/turf/T = get_turf(L)
|
||||
if(T && get_dir(T, loc) & reverse_dir[dir]) // dir points 'up' the cliff, e.g. cliff pointing NORTH will cause someone to fall if moving SOUTH into it.
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/cliff/proc/fall_off_cliff(mob/living/L)
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
var/turf/T = get_step(src, reverse_dir[dir])
|
||||
var/displaced = FALSE
|
||||
|
||||
if(dir in list(EAST, WEST)) // Apply an offset if flying sideways, to help maintain the illusion of depth.
|
||||
for(var/i = 1 to 2)
|
||||
var/turf/new_T = locate(T.x, T.y - i, T.z)
|
||||
if(!new_T || locate(/obj/structure/cliff) in new_T)
|
||||
break
|
||||
T = new_T
|
||||
displaced = TRUE
|
||||
|
||||
if(istype(T))
|
||||
visible_message(span("danger", "\The [L] falls off \the [src]!"))
|
||||
L.forceMove(T)
|
||||
|
||||
// Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
|
||||
var/harm = !is_double_cliff ? 1 : 0.5
|
||||
if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
|
||||
var/obj/vehicle/vehicle = L.buckled
|
||||
vehicle.adjust_health(40 * harm)
|
||||
to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
|
||||
harm /= 2
|
||||
|
||||
playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
|
||||
L.Weaken(5 * harm)
|
||||
var/fall_time = 3
|
||||
if(displaced) // Make the fall look more natural when falling sideways.
|
||||
L.pixel_z = 32 * 2
|
||||
animate(L, pixel_z = 0, time = fall_time)
|
||||
sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect.
|
||||
playsound(L, "punch", 70, 1)
|
||||
shake_camera(L, 1, 1)
|
||||
visible_message(span("danger", "\The [L] hits the ground!"))
|
||||
|
||||
// The bigger they are, the harder they fall.
|
||||
// They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health.
|
||||
// This scaling is capped at 100 total damage, which occurs if the thing that fell has more than 250 health.
|
||||
var/damage = between(20, L.getMaxHealth() * 0.4, 100)
|
||||
var/target_zone = ran_zone()
|
||||
var/blocked = L.run_armor_check(target_zone, "melee") * harm
|
||||
var/soaked = L.get_armor_soak(target_zone, "melee") * harm
|
||||
|
||||
L.apply_damage(damage * harm, BRUTE, target_zone, blocked, soaked, used_weapon=src)
|
||||
|
||||
// Now fall off more cliffs below this one if they exist.
|
||||
var/obj/structure/cliff/bottom_cliff = locate() in T
|
||||
if(bottom_cliff)
|
||||
visible_message(span("danger", "\The [L] rolls down towards \the [bottom_cliff]!"))
|
||||
sleep(5)
|
||||
bottom_cliff.fall_off_cliff(L)
|
||||
|
||||
/obj/structure/cliff/can_climb(mob/living/user, post_climb_check = FALSE)
|
||||
// Cliff climbing requires climbing gear.
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/clothing/shoes/shoes = H.shoes
|
||||
if(shoes && shoes.rock_climbing)
|
||||
return ..() // Do the other checks too.
|
||||
|
||||
to_chat(user, span("warning", "\The [src] is too steep to climb unassisted."))
|
||||
return FALSE
|
||||
|
||||
// This tells AI mobs to not be dumb and step off cliffs willingly.
|
||||
/obj/structure/cliff/is_safe_to_step(mob/living/L)
|
||||
if(should_fall(L))
|
||||
return FALSE
|
||||
return ..()
|
||||
GLOBAL_LIST_EMPTY(cliff_icon_cache)
|
||||
|
||||
/*
|
||||
Cliffs give a visual illusion of depth by seperating two places while presenting a 'top' and 'bottom' side.
|
||||
|
||||
Mobs moving into a cliff from the bottom side will simply bump into it and be denied moving into the tile,
|
||||
where as mobs moving into a cliff from the top side will 'fall' off the cliff, forcing them to the bottom, causing significant damage and stunning them.
|
||||
|
||||
Mobs can climb this while wearing climbing equipment by clickdragging themselves onto a cliff, as if it were a table.
|
||||
|
||||
Flying mobs can pass over all cliffs with no risk of falling.
|
||||
|
||||
Projectiles and thrown objects can pass, however if moving upwards, there is a chance for it to be stopped by the cliff.
|
||||
This makes fighting something that is on top of a cliff more challenging.
|
||||
|
||||
As a note, dir points upwards, e.g. pointing WEST means the left side is 'up', and the right side is 'down'.
|
||||
|
||||
When mapping these in, be sure to give at least a one tile clearance, as NORTH facing cliffs expand to
|
||||
two tiles on initialization, and which way a cliff is facing may change during maploading.
|
||||
*/
|
||||
|
||||
/obj/structure/cliff
|
||||
name = "cliff"
|
||||
desc = "A steep rock ledge. You might be able to climb it if you feel bold enough."
|
||||
description_info = "Walking off the edge of a cliff while on top will cause you to fall off, causing severe injury.<br>\
|
||||
You can climb this cliff if wearing special climbing equipment, by click-dragging yourself onto the cliff.<br>\
|
||||
Projectiles traveling up a cliff may hit the cliff instead, making it more difficult to fight something \
|
||||
on top."
|
||||
icon = 'icons/obj/flora/rocks.dmi'
|
||||
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
opacity = FALSE
|
||||
climbable = TRUE
|
||||
climb_delay = 10 SECONDS
|
||||
block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
|
||||
|
||||
var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display.
|
||||
var/corner = FALSE // Used for icon things.
|
||||
var/ramp = FALSE // Ditto.
|
||||
var/bottom = FALSE // Used for 'bottom' typed cliffs, to avoid infinite cliffs, and for icons.
|
||||
|
||||
var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks.
|
||||
var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff.
|
||||
|
||||
/obj/structure/cliff/Initialize()
|
||||
. = ..()
|
||||
register_dangerous_to_step()
|
||||
|
||||
/obj/structure/cliff/Destroy()
|
||||
unregister_dangerous_to_step()
|
||||
. = ..()
|
||||
|
||||
/obj/structure/cliff/Moved(atom/oldloc)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/turf/old_turf = get_turf(oldloc)
|
||||
var/turf/new_turf = get_turf(src)
|
||||
if(old_turf != new_turf)
|
||||
old_turf.unregister_dangerous_object(src)
|
||||
new_turf.register_dangerous_object(src)
|
||||
|
||||
// These arrange their sprites at runtime, as opposed to being statically placed in the map file.
|
||||
/obj/structure/cliff/automatic
|
||||
icon_state = "cliffbuilder"
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/cliff/automatic/corner
|
||||
icon_state = "cliffbuilder-corner"
|
||||
dir = NORTHEAST
|
||||
corner = TRUE
|
||||
|
||||
// Tiny part that doesn't block, used for making 'ramps'.
|
||||
/obj/structure/cliff/automatic/ramp
|
||||
icon_state = "cliffbuilder-ramp"
|
||||
dir = NORTHEAST
|
||||
density = FALSE
|
||||
ramp = TRUE
|
||||
|
||||
// Made automatically as needed by automatic cliffs.
|
||||
/obj/structure/cliff/bottom
|
||||
bottom = TRUE
|
||||
|
||||
/obj/structure/cliff/automatic/Initialize()
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
// Paranoid about the maploader, direction is very important to cliffs, since they may get bigger if initialized while facing NORTH.
|
||||
/obj/structure/cliff/automatic/LateInitialize()
|
||||
if(dir in GLOB.cardinal)
|
||||
icon_variant = pick("a", "b", "c")
|
||||
|
||||
if(dir & NORTH && !bottom) // North-facing cliffs require more cliffs to be made.
|
||||
make_bottom()
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/proc/make_bottom()
|
||||
// First, make sure there's room to put the bottom side.
|
||||
var/turf/T = locate(x, y - 1, z)
|
||||
if(!istype(T))
|
||||
return FALSE
|
||||
|
||||
// Now make the bottom cliff have mostly the same variables.
|
||||
var/obj/structure/cliff/bottom/bottom = new(T)
|
||||
is_double_cliff = TRUE
|
||||
climb_delay /= 2 // Since there are two cliffs to climb when going north, both take half the time.
|
||||
|
||||
bottom.dir = dir
|
||||
bottom.is_double_cliff = TRUE
|
||||
bottom.climb_delay = climb_delay
|
||||
bottom.icon_variant = icon_variant
|
||||
bottom.corner = corner
|
||||
bottom.ramp = ramp
|
||||
bottom.layer = layer - 0.1
|
||||
bottom.density = density
|
||||
bottom.update_icon()
|
||||
|
||||
/obj/structure/cliff/set_dir(new_dir)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/cliff/update_icon()
|
||||
icon_state = "cliff-[dir][icon_variant][bottom ? "-bottom" : ""][corner ? "-corner" : ""][ramp ? "-ramp" : ""]"
|
||||
|
||||
// Now for making the top-side look like a different turf.
|
||||
var/turf/T = get_step(src, dir)
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
var/subtraction_icon_state = "[icon_state]-subtract"
|
||||
var/cache_string = "[icon_state]_[T.icon]_[T.icon_state]"
|
||||
if(T && subtraction_icon_state in cached_icon_states(icon))
|
||||
cut_overlays()
|
||||
// If we've made the same icon before, just recycle it.
|
||||
if(cache_string in GLOB.cliff_icon_cache)
|
||||
add_overlay(GLOB.cliff_icon_cache[cache_string])
|
||||
|
||||
else // Otherwise make a new one, but only once.
|
||||
var/icon/underlying_ground = icon(T.icon, T.icon_state, T.dir)
|
||||
var/icon/subtract = icon(icon, subtraction_icon_state)
|
||||
underlying_ground.Blend(subtract, ICON_SUBTRACT)
|
||||
var/image/final = image(underlying_ground)
|
||||
final.layer = src.layer - 0.2
|
||||
GLOB.cliff_icon_cache[cache_string] = final
|
||||
add_overlay(final)
|
||||
|
||||
|
||||
// Movement-related code.
|
||||
|
||||
/obj/structure/cliff/CanPass(atom/movable/mover, turf/target)
|
||||
if(isliving(mover))
|
||||
var/mob/living/L = mover
|
||||
if(L.hovering) // Flying mobs can always pass.
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
// Projectiles and objects flying 'upward' have a chance to hit the cliff instead, wasting the shot.
|
||||
else if(istype(mover, /obj))
|
||||
var/obj/O = mover
|
||||
if(check_shield_arc(src, dir, O)) // This is actually for mobs but it will work for our purposes as well.
|
||||
if(prob(uphill_penalty / (1 + is_double_cliff) )) // Firing upwards facing NORTH means it will likely have to pass through two cliffs, so the chance is halved.
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/cliff/Bumped(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(should_fall(L))
|
||||
fall_off_cliff(L)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/structure/cliff/proc/should_fall(mob/living/L)
|
||||
if(L.hovering)
|
||||
return FALSE
|
||||
|
||||
var/turf/T = get_turf(L)
|
||||
if(T && get_dir(T, loc) & reverse_dir[dir]) // dir points 'up' the cliff, e.g. cliff pointing NORTH will cause someone to fall if moving SOUTH into it.
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/cliff/proc/fall_off_cliff(mob/living/L)
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
var/turf/T = get_step(src, reverse_dir[dir])
|
||||
var/displaced = FALSE
|
||||
|
||||
if(dir in list(EAST, WEST)) // Apply an offset if flying sideways, to help maintain the illusion of depth.
|
||||
for(var/i = 1 to 2)
|
||||
var/turf/new_T = locate(T.x, T.y - i, T.z)
|
||||
if(!new_T || locate(/obj/structure/cliff) in new_T)
|
||||
break
|
||||
T = new_T
|
||||
displaced = TRUE
|
||||
|
||||
if(istype(T))
|
||||
visible_message(span("danger", "\The [L] falls off \the [src]!"))
|
||||
L.forceMove(T)
|
||||
|
||||
// Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
|
||||
var/harm = !is_double_cliff ? 1 : 0.5
|
||||
if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
|
||||
var/obj/vehicle/vehicle = L.buckled
|
||||
vehicle.adjust_health(40 * harm)
|
||||
to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
|
||||
harm /= 2
|
||||
|
||||
playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
|
||||
L.Weaken(5 * harm)
|
||||
var/fall_time = 3
|
||||
if(displaced) // Make the fall look more natural when falling sideways.
|
||||
L.pixel_z = 32 * 2
|
||||
animate(L, pixel_z = 0, time = fall_time)
|
||||
sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect.
|
||||
playsound(L, "punch", 70, 1)
|
||||
shake_camera(L, 1, 1)
|
||||
visible_message(span("danger", "\The [L] hits the ground!"))
|
||||
|
||||
// The bigger they are, the harder they fall.
|
||||
// They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health.
|
||||
// This scaling is capped at 100 total damage, which occurs if the thing that fell has more than 250 health.
|
||||
var/damage = between(20, L.getMaxHealth() * 0.4, 100)
|
||||
var/target_zone = ran_zone()
|
||||
var/blocked = L.run_armor_check(target_zone, "melee") * harm
|
||||
var/soaked = L.get_armor_soak(target_zone, "melee") * harm
|
||||
|
||||
L.apply_damage(damage * harm, BRUTE, target_zone, blocked, soaked, used_weapon=src)
|
||||
|
||||
// Now fall off more cliffs below this one if they exist.
|
||||
var/obj/structure/cliff/bottom_cliff = locate() in T
|
||||
if(bottom_cliff)
|
||||
visible_message(span("danger", "\The [L] rolls down towards \the [bottom_cliff]!"))
|
||||
sleep(5)
|
||||
bottom_cliff.fall_off_cliff(L)
|
||||
|
||||
/obj/structure/cliff/can_climb(mob/living/user, post_climb_check = FALSE)
|
||||
// Cliff climbing requires climbing gear.
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/clothing/shoes/shoes = H.shoes
|
||||
if(shoes && shoes.rock_climbing)
|
||||
return ..() // Do the other checks too.
|
||||
|
||||
to_chat(user, span("warning", "\The [src] is too steep to climb unassisted."))
|
||||
return FALSE
|
||||
|
||||
// This tells AI mobs to not be dumb and step off cliffs willingly.
|
||||
/obj/structure/cliff/is_safe_to_step(mob/living/L)
|
||||
if(should_fall(L))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
|
||||
/obj/structure/closet/Initialize()
|
||||
..()
|
||||
// Closets need to come later because of spawners potentially creating objects during init.
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/structure/closet/LateInitialize()
|
||||
|
||||
@@ -133,7 +133,6 @@
|
||||
/obj/item/clothing/gloves/fingerless,
|
||||
/obj/item/device/radio/headset/pilot,
|
||||
/obj/item/device/radio/headset/pilot/alt,
|
||||
/obj/item/weapon/cartridge/explorer,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
//Dance pole
|
||||
/obj/structure/dancepole
|
||||
name = "dance pole"
|
||||
desc = "Engineered for your entertainment"
|
||||
icon = 'icons/obj/objects_vr.dmi'
|
||||
icon_state = "dancepole"
|
||||
density = 0
|
||||
anchored = 1
|
||||
|
||||
/obj/structure/dancepole/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.is_screwdriver())
|
||||
anchored = !anchored
|
||||
playsound(src, O.usesound, 50, 1)
|
||||
if(anchored)
|
||||
to_chat(user, "<font color='blue'>You secure \the [src].</font>")
|
||||
else
|
||||
to_chat(user, "<font color='blue'>You unsecure \the [src].</font>")
|
||||
if(O.is_wrench())
|
||||
playsound(src, O.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>Now disassembling \the [src]...</span>")
|
||||
if(do_after(user, 30 * O.toolspeed))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You dissasembled \the [src]!</span>")
|
||||
new /obj/item/stack/material/steel(src.loc, 1)
|
||||
qdel(src)
|
||||
@@ -14,7 +14,7 @@
|
||||
var/smashed = 0
|
||||
|
||||
/obj/structure/fireaxecabinet/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
fireaxe = new /obj/item/weapon/material/twohanded/fireaxe()
|
||||
|
||||
/obj/structure/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree.
|
||||
|
||||
/obj/structure/flora/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
if(randomize_size)
|
||||
icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
icon_state = icon_state_opened
|
||||
if(needscharger)
|
||||
new /obj/machinery/recharge_station/ghost_pod_recharger(src.loc)
|
||||
del(src)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/list/clothing_possibilities
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/human/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
handle_clothing_setup()
|
||||
|
||||
@@ -153,7 +153,7 @@
|
||||
var/list/clothing_possibilities
|
||||
|
||||
/obj/structure/ghost_pod/manual/human/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
handle_clothing_setup()
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/ghost_pod/ghost_activated/swarm_drone/event/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
say_dead_object("A <span class='notice'>[drone_class] swarm drone</span> shell is now available in \the [T.loc].", src)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
var/total_creature_max //If set, it can spawn this many creatures, total, ever.
|
||||
|
||||
/obj/structure/prop/nest/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
den_mobs = list()
|
||||
START_PROCESSING(SSobj, src)
|
||||
last_spawn = world.time
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/cult/pylon/swarm/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
active_beams = list()
|
||||
|
||||
/obj/structure/cult/pylon/swarm/Destroy()
|
||||
|
||||
@@ -1,26 +1,59 @@
|
||||
/obj/structure/bed/chair/wheelchair
|
||||
name = "wheelchair"
|
||||
desc = "You sit in this. Either by will or force."
|
||||
icon = 'icons/obj/wheelchair.dmi'
|
||||
icon_state = "wheelchair"
|
||||
anchored = 0
|
||||
buckle_movable = 1
|
||||
|
||||
var/folded_type = /obj/item/wheelchair
|
||||
var/driving = 0
|
||||
var/mob/living/pulling = null
|
||||
var/bloodiness
|
||||
var/min_mob_buckle_size = MOB_SMALL
|
||||
var/max_mob_buckle_size = MOB_LARGE
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/motor
|
||||
name = "electric wheelchair"
|
||||
desc = "A motorized wheelchair controlled with a joystick on one armrest"
|
||||
icon_state = "motorchair"
|
||||
folded_type = /obj/item/wheelchair/motor
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/smallmotor
|
||||
name = "small electric wheelchair"
|
||||
desc = "A small motorized wheelchair, it looks around the right size for a Teshari"
|
||||
icon_state = "teshchair"
|
||||
min_mob_buckle_size = MOB_SMALL
|
||||
max_mob_buckle_size = MOB_MEDIUM
|
||||
folded_type = /obj/item/wheelchair/motor/small
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/can_buckle_check(mob/living/M, forced = FALSE)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(M.mob_size < min_mob_buckle_size)
|
||||
to_chat(M, SPAN_WARNING("You are too small to use \the [src]."))
|
||||
. = FALSE
|
||||
else if(M.mob_size >= max_mob_buckle_size)
|
||||
to_chat(M, SPAN_WARNING("You are too large to use \the [src]."))
|
||||
. = FALSE
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/update_icon()
|
||||
return
|
||||
cut_overlays()
|
||||
var/image/O = image(icon = icon, icon_state = "[icon_state]_overlay", layer = ABOVE_MOB_LAYER)
|
||||
O.plane = MOB_PLANE
|
||||
add_overlay(O)
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/set_dir()
|
||||
..()
|
||||
cut_overlays()
|
||||
var/image/O = image(icon = 'icons/obj/furniture.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir)
|
||||
add_overlay(O)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
L.set_dir(dir)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
L.set_dir(dir)
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.is_wrench() || W.is_wirecutter() || istype(W,/obj/item/stack))
|
||||
@@ -93,8 +126,6 @@
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
|
||||
cut_overlays()
|
||||
playsound(src, 'sound/effects/roll.ogg', 75, 1)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
@@ -203,28 +234,13 @@
|
||||
usr.pulledby = null
|
||||
..()
|
||||
|
||||
/obj/item/wheelchair
|
||||
name = "wheelchair"
|
||||
desc = "A folded wheelchair that can be carried around."
|
||||
icon = 'icons/obj/furniture.dmi'
|
||||
icon_state = "wheelchair_folded"
|
||||
item_state = "wheelchair"
|
||||
w_class = ITEMSIZE_HUGE // Can't be put in backpacks. Oh well.
|
||||
|
||||
/obj/item/wheelchair/attack_self(mob/user)
|
||||
var/obj/structure/bed/chair/wheelchair/R = new /obj/structure/bed/chair/wheelchair(user.loc)
|
||||
R.add_fingerprint(user)
|
||||
R.name = src.name
|
||||
R.color = src.color
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location)
|
||||
..()
|
||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
||||
if(!ishuman(usr)) return
|
||||
if(has_buckled_mobs()) return 0
|
||||
visible_message("[usr] collapses \the [src.name].")
|
||||
var/obj/item/wheelchair/R = new/obj/item/wheelchair(get_turf(src))
|
||||
var/obj/item/wheelchair/R = new folded_type(get_turf(src))
|
||||
R.name = src.name
|
||||
R.color = src.color
|
||||
spawn(0)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
/obj/item/wheelchair
|
||||
name = "wheelchair"
|
||||
desc = "A folded wheelchair that can be carried around."
|
||||
icon = 'icons/obj/wheelchair.dmi'
|
||||
icon_state = "wheelchair_folded"
|
||||
item_state = "wheelchair"
|
||||
w_class = ITEMSIZE_HUGE // Can't be put in backpacks. Oh well.
|
||||
var/unfolded_type = /obj/structure/bed/chair/wheelchair
|
||||
|
||||
/obj/item/wheelchair/attack_self(mob/user)
|
||||
var/obj/structure/bed/chair/wheelchair/R = new unfolded_type(user.loc)
|
||||
R.add_fingerprint(user)
|
||||
R.name = src.name
|
||||
R.color = src.color
|
||||
qdel(src)
|
||||
|
||||
/obj/item/wheelchair/motor
|
||||
name = "electric wheelchair"
|
||||
desc = "A motorized wheelchair controlled with a joystick on one armrest"
|
||||
icon_state = "motorchair_folded"
|
||||
item_state = "motorchair"
|
||||
unfolded_type = /obj/structure/bed/chair/wheelchair/motor
|
||||
|
||||
/obj/item/wheelchair/motor/small
|
||||
name = "small electric wheelchair"
|
||||
desc = "A small motorized wheelchair, it looks around the right size for a Teshari."
|
||||
icon_state = "teshchair_folded"
|
||||
item_state = "teshchair"
|
||||
unfolded_type = /obj/structure/bed/chair/wheelchair/smallmotor
|
||||
@@ -180,6 +180,7 @@
|
||||
prob(2);/obj/item/clothing/shoes/galoshes,
|
||||
prob(2);/obj/item/clothing/under/pants/camo,
|
||||
prob(2);/obj/item/clothing/under/syndicate/tacticool,
|
||||
prob(2);/obj/item/clothing/under/hyperfiber,
|
||||
prob(2);/obj/item/device/camera,
|
||||
prob(2);/obj/item/device/flashlight/flare,
|
||||
prob(2);/obj/item/device/flashlight/glowstick,
|
||||
@@ -240,6 +241,7 @@
|
||||
prob(2);/obj/item/weapon/handcuffs/legcuffs/fuzzy,
|
||||
prob(2);/obj/item/weapon/storage/box/syndie_kit/spy,
|
||||
prob(2);/obj/item/weapon/grenade/anti_photon,
|
||||
prob(2);/obj/item/clothing/under/hyperfiber/bluespace,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
|
||||
prob(1);/obj/item/device/nif/bad,
|
||||
prob(1);/obj/item/device/radio_jammer,
|
||||
|
||||
@@ -27,11 +27,10 @@
|
||||
return FALSE
|
||||
|
||||
/obj/effect/wingrille_spawn/Initialize()
|
||||
. = ..()
|
||||
if(!win_path)
|
||||
return
|
||||
if(ticker && ticker.current_state < GAME_STATE_PLAYING)
|
||||
if(win_path && ticker && ticker.current_state < GAME_STATE_PLAYING)
|
||||
activate()
|
||||
..()
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/wingrille_spawn/proc/activate()
|
||||
if(activated) return
|
||||
@@ -58,7 +57,8 @@
|
||||
activated = 1
|
||||
for(var/obj/effect/wingrille_spawn/other in neighbours)
|
||||
if(!other.activated) other.activate()
|
||||
qdel(src)
|
||||
if(initialized && !QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/wingrille_spawn/proc/handle_window_spawn(var/obj/structure/window/W)
|
||||
return
|
||||
|
||||
@@ -148,7 +148,7 @@ var/list/flooring_types
|
||||
icon_base = "grass_sif"
|
||||
build_type = /obj/item/stack/tile/grass/sif
|
||||
has_base_range = 1
|
||||
|
||||
|
||||
/decl/flooring/grass/sif/forest
|
||||
name = "thick growth"
|
||||
desc = "A natural moss that has adapted to the sheer cold climate."
|
||||
@@ -379,7 +379,7 @@ var/list/flooring_types
|
||||
|
||||
/decl/flooring/linoleum
|
||||
name = "linoleum"
|
||||
desc = "It's like the 2390's all over again."
|
||||
desc = "It's like the 2090's all over again." // VOREStation Lore Edit - we're not past 2390's yet
|
||||
icon = 'icons/turf/flooring/linoleum.dmi'
|
||||
icon_base = "lino"
|
||||
can_paint = 1
|
||||
|
||||
@@ -12,9 +12,13 @@ var/list/floor_decals = list()
|
||||
|
||||
/obj/effect/floor_decal/New(var/newloc, var/newdir, var/newcolour)
|
||||
supplied_dir = newdir
|
||||
if(newcolour) color = newcolour
|
||||
if(newcolour)
|
||||
color = newcolour
|
||||
..(newloc)
|
||||
|
||||
// TODO: identify what is causing these atoms to be qdeleted in New()/Initialize()
|
||||
// somewhere in this chain. Alternatively repath to /obj/floor_decal or some other
|
||||
// abstract handler that explicitly doesn't invoke any obj behavior.
|
||||
/obj/effect/floor_decal/Initialize()
|
||||
add_to_turf_decals()
|
||||
initialized = TRUE
|
||||
@@ -42,11 +46,11 @@ var/list/floor_decals = list()
|
||||
name = "reset marker"
|
||||
|
||||
/obj/effect/floor_decal/reset/Initialize()
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.decals && T.decals.len)
|
||||
T.decals.Cut()
|
||||
T.update_icon()
|
||||
initialized = TRUE
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/floor_decal/corner
|
||||
|
||||
@@ -317,7 +317,6 @@
|
||||
name = "tiles"
|
||||
icon_state = "freezer"
|
||||
initial_flooring = /decl/flooring/tiling/freezer
|
||||
temperature = T0C - 5 // VOREStation Edit: Chillier Freezer Tiles on-start
|
||||
|
||||
/turf/simulated/floor/lino
|
||||
name = "lino"
|
||||
|
||||
@@ -23,4 +23,7 @@
|
||||
|
||||
/decl/flooring/grass/outdoors/forest
|
||||
icon = 'icons/turf/outdoors.dmi'
|
||||
icon_base = "grass-dark"
|
||||
icon_base = "grass-dark"
|
||||
|
||||
/turf/simulated/floor/tiled/freezer/cold
|
||||
temperature = T0C - 5
|
||||
@@ -86,7 +86,7 @@
|
||||
var/static/list/antilight_cache
|
||||
|
||||
/turf/simulated/shuttle/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
if(!antilight_cache)
|
||||
antilight_cache = list()
|
||||
for(var/diag in cornerdirs)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user