Merge branch 'master' into QM-as-Head

This commit is contained in:
Chayse Ramsay
2018-02-18 03:46:35 +00:00
committed by GitHub
355 changed files with 74624 additions and 281692 deletions
+2 -1
View File
@@ -91,6 +91,7 @@
#define MAT_BANANIUM "$bananium"
#define MAT_TITANIUM "$titanium"
#define MAT_BIOMASS "$biomass"
#define MAT_PLASTIC "$plastic"
//The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
#define MINERAL_MATERIAL_AMOUNT 2000
//The maximum size of a stack object.
@@ -125,4 +126,4 @@
#define RCD_FLOORWALL 1
#define RCD_AIRLOCK 2
#define RCD_DECONSTRUCT 3
#define RCD_WINDOWGRILLE 4
#define RCD_WINDOWGRILLE 4
+1
View File
@@ -36,6 +36,7 @@
#define BELOW_OPEN_DOOR_LAYER 2.6
#define BLASTDOOR_LAYER 2.65
#define OPEN_DOOR_LAYER 2.7
#define DOOR_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER
#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
#define TABLE_LAYER 2.8
#define BELOW_OBJ_LAYER 2.9
+2 -1
View File
@@ -29,6 +29,7 @@
#define BIOGENERATOR 32 //Uses biomass
#define LIMBGROWER 64 //Uses synthetic flesh
#define SMELTER 128 //uses various minerals
#define AUTOYLATHE 256 //Uses glass/metal/Plastic
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
//Modular computer/NTNet defines
@@ -86,4 +87,4 @@
#define SUPERMATTER_DELAMINATING 6 // Pretty obvious.
//R&D Snowflakes
#define RD_CONSOLE_LOCKED_SCREEN 0.2
#define RD_CONSOLE_LOCKED_SCREEN 0.2
+48 -48
View File
@@ -1,46 +1,32 @@
/*
The /tg/ codebase currently requires you to have 11 z-levels of the same size dimensions.
z-level order is important, the order you put them in inside the map config.dm will determine what z level number they are assigned ingame.
Names of z-level do not matter, but order does greatly, for instances such as checking alive status of revheads on z1
The /tg/ codebase allows mixing of hardcoded and dynamically-loaded z-levels.
Z-levels can be reordered as desired and their properties are set by "traits".
See map_config.dm for how a particular station's traits may be chosen.
The list DEFAULT_MAP_TRAITS at the bottom of this file should correspond to
the maps that are hardcoded, as set in _maps/_basemap.dm. SSmapping is
responsible for loading every non-hardcoded z-level.
current as of september 17, 2017
z1 = station
z2 = centcom
z5 = mining
z6 = city of cogs
Everything else = randomized space
Last space-z level = empty
As of 2018-02-04, the typical z-levels for a single-level station are:
1: CentCom
2: Station
3-4: Randomized space
5: Mining
6: City of Cogs
7-11: Randomized space
12: Empty space
13: Transit space
Multi-Z stations are supported and multi-Z mining and away missions would
require only minor tweaks.
*/
#define CROSSLINKED 2
#define SELFLOOPING 1
#define UNAFFECTED 0
#define MAIN_STATION "Main Station"
#define CENTCOM "CentCom"
#define CITY_OF_COGS "City of Cogs"
#define EMPTY_AREA_1 "Empty Area 1"
#define EMPTY_AREA_2 "Empty Area 2"
#define MINING_ASTEROID "Mining Asteroid"
#define EMPTY_AREA_3 "Empty Area 3"
#define EMPTY_AREA_4 "Empty Area 4"
#define EMPTY_AREA_5 "Empty Area 5"
#define EMPTY_AREA_6 "Empty Area 6"
#define EMPTY_AREA_7 "Empty Area 7"
#define EMPTY_AREA_8 "Empty Area 8"
#define AWAY_MISSION "Away Mission"
//for modifying jobs
// helpers for modifying jobs, used in various job_changes.dm files
#define MAP_JOB_CHECK if(SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) { return; }
#define MAP_JOB_CHECK_BASE if(SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) { return ..(); }
#define MAP_REMOVE_JOB(jobpath) /datum/job/##jobpath/map_check() { return (SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) && ..() }
//zlevel defines, can be overridden for different maps in the appropriate _maps file.
#define ZLEVEL_STATION_PRIMARY 2
#define ZLEVEL_EMPTY_SPACE 12
#define SPACERUIN_MAP_EDGE_PAD 15
#define ZLEVEL_SPACE_RUIN_COUNT 5
#define ZLEVEL_SPACE_RUIN_COUNT 7
// traits
// boolean - marks a level as having that property if present
@@ -52,26 +38,40 @@ Last space-z level = empty
#define ZTRAIT_AWAY "Away Mission"
#define ZTRAIT_SPACE_RUINS "Space Ruins"
#define ZTRAIT_LAVA_RUINS "Lava Ruins"
// number - bombcap is multiplied by this before being applied to bombs
#define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier"
// trait definitions
#define DL_NAME "name"
#define DL_LINKAGE "linkage"
#define DL_TRAITS "traits"
// numeric offsets - e.g. {"Down": -1} means that chasms will fall to z - 1 rather than oblivion
#define ZTRAIT_UP "Up"
#define ZTRAIT_DOWN "Down"
#define DECLARE_LEVEL(NAME, LINKAGE, TRAITS) list(DL_NAME = NAME, DL_LINKAGE = LINKAGE, DL_TRAITS = TRAITS)
// corresponds to basemap.dm
// enum - how space transitions should affect this level
#define ZTRAIT_LINKAGE "Linkage"
// UNAFFECTED if absent - no space transitions
#define UNAFFECTED null
// SELFLOOPING - space transitions always self-loop
#define SELFLOOPING "Self"
// CROSSLINKED - mixed in with the cross-linked space pool
#define CROSSLINKED "Cross"
// default trait definitions, used by SSmapping
#define ZTRAITS_CENTCOM list(ZTRAIT_LINKAGE = SELFLOOPING, ZTRAIT_CENTCOM = TRUE)
#define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE)
#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE)
#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 2)
#define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5)
#define DL_NAME "name"
#define DL_TRAITS "traits"
#define DECLARE_LEVEL(NAME, TRAITS) list(DL_NAME = NAME, DL_TRAITS = TRAITS)
// must correspond to _basemap.dm for things to work correctly
#define DEFAULT_MAP_TRAITS list(\
DECLARE_LEVEL("CentCom", SELFLOOPING, list(ZTRAIT_CENTCOM = TRUE)),\
DECLARE_LEVEL("Main Station", CROSSLINKED, list(ZTRAIT_STATION = TRUE)),\
DECLARE_LEVEL("Empty Area 1", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE)),\
DECLARE_LEVEL("Empty Area 2", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE)),\
DECLARE_LEVEL("Lavaland", UNAFFECTED, list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 2)),\
DECLARE_LEVEL("Reebe", UNAFFECTED, list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5)),\
DECLARE_LEVEL("CentCom", ZTRAITS_CENTCOM),\
)
//Camera lock flags
// Camera lock flags
#define CAMERA_LOCK_STATION 1
#define CAMERA_LOCK_MINING 2
#define CAMERA_LOCK_CENTCOM 4
@@ -85,4 +85,4 @@ Last space-z level = empty
#define PLACE_DEFAULT "random"
#define PLACE_SAME_Z "same"
#define PLACE_SPACE_RUIN "space"
#define PLACE_LAVA_RUIN "lavaland"
#define PLACE_LAVA_RUIN "lavaland"
+29
View File
@@ -0,0 +1,29 @@
// Medal names
#define BOSS_KILL_MEDAL "Killer"
#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type
#define BOSS_KILL_MEDAL_CRUSHER "Crusher"
//Defines for boss medals
#define BOSS_MEDAL_MINER "Blood-drunk Miner"
#define BOSS_MEDAL_BUBBLEGUM "Bubblegum"
#define BOSS_MEDAL_COLOSSUS "Colossus"
#define BOSS_MEDAL_DRAKE "Drake"
#define BOSS_MEDAL_HIEROPHANT "Hierophant"
#define BOSS_MEDAL_LEGION "Legion"
#define BOSS_MEDAL_SWARMER "Swarmer Beacon"
#define BOSS_MEDAL_TENDRIL "Tendril"
// Score names
#define HIEROPHANT_SCORE "Hierophants Killed"
#define BOSS_SCORE "Bosses Killed"
#define BUBBLEGUM_SCORE "Bubblegum Killed"
#define COLOSSUS_SCORE "Colossus Killed"
#define DRAKE_SCORE "Drakes Killed"
#define LEGION_SCORE "Legion Killed"
#define SWARMER_BEACON_SCORE "Swarmer Beacons Killed"
#define TENDRIL_CLEAR_SCORE "Tendrils Killed"
//Misc medals
#define MEDAL_METEOR "Your Life Before Your Eyes"
#define MEDAL_PULSE "Jackpot"
#define MEDAL_TIMEWASTE "Overextended The Joke"
-14
View File
@@ -378,20 +378,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define INCREMENT_TALLY(L, stat) if(L[stat]){L[stat]++}else{L[stat] = 1}
// Medal names
#define BOSS_KILL_MEDAL "Killer"
#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type
// Score names
#define LEGION_SCORE "Legion Killed"
#define COLOSSUS_SCORE "Colossus Killed"
#define BUBBLEGUM_SCORE "Bubblegum Killed"
#define DRAKE_SCORE "Drakes Killed"
#define BIRD_SCORE "Hierophants Killed"
#define SWARMER_BEACON_SCORE "Swarmer Beacons Killed"
#define BOSS_SCORE "Bosses Killed"
#define TENDRIL_CLEAR_SCORE "Tendrils Killed"
//TODO Move to a pref
#define STATION_GOAL_BUDGET 1
+3 -3
View File
@@ -9,13 +9,13 @@ GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys,
//Since it didn't really belong in any other category, I'm putting this here
//This is for procs to replace all the goddamn 'in world's that are chilling around the code
GLOBAL_LIST_EMPTY(player_list) //all mobs **with clients attached**. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(player_list) //all mobs **with clients attached**.
GLOBAL_LIST_EMPTY(mob_list) //all mobs, including clientless
GLOBAL_LIST_EMPTY(mob_directory) //mob_id -> mob
GLOBAL_LIST_EMPTY(mob_directory) //mob_id -> mob
GLOBAL_LIST_EMPTY(alive_mob_list) //all alive mobs, including clientless. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(drones_list)
GLOBAL_LIST_EMPTY(dead_mob_list) //all dead mobs, including clientless. Excludes /mob/dead/new_player
GLOBAL_LIST_EMPTY(joined_player_list) //all clients that have joined the game at round-start or as a latejoin.
GLOBAL_LIST_EMPTY(joined_player_list) //all clients that have joined the game at round-start or as a latejoin.
GLOBAL_LIST_EMPTY(silicon_mobs) //all silicon mobs
GLOBAL_LIST_EMPTY(mob_living_list) //all instances of /mob/living and subtypes
GLOBAL_LIST_EMPTY(carbon_list) //all instances of /mob/living/carbon and subtypes, notably does not contain brains or simple animals
-75
View File
@@ -189,15 +189,6 @@
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_HEAVY
/datum/design/foam_x9
name = "Foam Force X9 Rifle"
id = "foam_x9"
build_type = AUTOLATHE
materials = list(MAT_METAL = 24000, MAT_GLASS = 14000)
build_path = /obj/item/gun/ballistic/automatic/x9/toy
category = list("hacked", "Misc")
////////XCOM2 Magpistol/////////
//////projectiles//////
@@ -352,22 +343,6 @@
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
max_ammo = 42
/datum/design/magfoam_dart
name = "Box of MagFoam Darts"
id = "magfoam_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 200)
build_path = /obj/item/ammo_box/foambox/mag
category = list("initial", "Misc")
/datum/design/foam_magpistol
name = "Foam Force Magpistol"
id = "magfoam_launcher"
build_type = AUTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
build_path = /obj/item/gun/ballistic/shotgun/toy/mag
category = list("hacked", "Misc")
//////Magrifle//////
///projectiles///
@@ -502,14 +477,6 @@
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_HEAVY
/datum/design/foam_magrifle
name = "Foam Force MagRifle"
id = "foam_magrifle"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 7500)
build_path = /obj/item/gun/ballistic/automatic/magrifle/toy
category = list("hacked", "Misc")
/*
// TECHWEBS IMPLEMENTATION
*/
@@ -648,14 +615,6 @@
name = "toy mag burst rifle power supply"
maxcharge = 4000
/datum/design/foam_hyperburst
name = "MagTag Hyper Rifle"
id = "foam_hyperburst"
build_type = AUTOLATHE
materials = list(MAT_METAL = 35000, MAT_GLASS = 25000)
build_path = /obj/item/gun/energy/laser/practice/hyperburst
category = list("hacked", "Misc")
/* made redundant by reskinnable stetchkins
//////Stealth Pistol//////
@@ -708,15 +667,6 @@
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/datum/design/foam_sp
name = "Foam Force Stealth Pistol"
id = "foam_sp"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000, MAT_GLASS = 15000)
build_path = /obj/item/gun/ballistic/automatic/toy/pistol/stealth
category = list("hacked", "Misc")
//////10mm soporific bullets//////
obj/item/projectile/bullet/c10mm/soporific
@@ -923,14 +873,6 @@ obj/item/projectile/bullet/c10mm/soporific
ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag)
selfcharge = TRUE
/datum/design/toyray
name = "RayTag Gun"
id = "toyray"
build_type = AUTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
build_path = /obj/item/gun/energy/laser/practice/raygun
category = list("hacked", "Misc")
/*/////////////////////////////////////////////////////////////////////////////////////////////
The Recolourable Gun
*//////////////////////////////////////////////////////////////////////////////////////////////
@@ -1179,15 +1121,6 @@ obj/item/projectile/bullet/c10mm/soporific
can_suppress = FALSE
actions_types = list(/datum/action/item_action/pick_color)
/datum/design/foam_p37
name = "Foam Force Mk.37F"
id = "foam_p37"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 10000)
build_path = /obj/item/gun/ballistic/automatic/pistol/p37/foam
category = list("hacked", "Misc")
/*/////////////////////////////////////////////////////////////////////////////////////////////
The Recolourable Energy Gun
*//////////////////////////////////////////////////////////////////////////////////////////////
@@ -1311,11 +1244,3 @@ obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file)
w_class = WEIGHT_CLASS_NORMAL
burst_size = 4 //Shh.
fire_delay = 1
/datum/design/am4c
name = "Foam Force AM4-C Rifle"
id = "foam_am4c"
build_type = AUTOLATHE
materials = list(MAT_METAL = 24000, MAT_GLASS = 14000)
build_path = /obj/item/gun/ballistic/automatic/AM4C
category = list("hacked", "Misc")
@@ -17,11 +17,11 @@
var/petcount = target_amount
for(var/mob/living/simple_animal/pet/P in GLOB.mob_list)
if(!(P.stat == DEAD))
if(P.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(P)])
if(P.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(P)])
petcount--
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!(H.stat == DEAD))
if(H.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar))
petcount--
if(petcount <= 0)
@@ -65,7 +65,7 @@
/datum/objective/crew/responsibility/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(H.stat == DEAD && H.drunkenness >= 80)
if(H.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
return FALSE
return TRUE
@@ -6,7 +6,7 @@
/datum/objective/crew/morgue/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(H.stat == DEAD && H.z == ZLEVEL_STATION_PRIMARY)
if(H.stat == DEAD && H.z == SSmapping.station_start)
if(get_area(H) != /area/medical/morgue)
return FALSE
return TRUE
@@ -80,7 +80,7 @@
/datum/objective/crew/noinfections/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!H.stat == DEAD)
if(H.z == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(H.check_virus() == 2)
return FALSE
return TRUE
@@ -263,3 +263,37 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
icon = 'icons/obj/custom.dmi'
icon_override = 'icons/mob/custom_w.dmi'
/*TechnicalMagi*/
/obj/item/clothing/under/bb_sweater/black/naomi
name = "worn black sweater"
desc = "A well-loved sweater, showing signs of several cleanings and re-stitchings. And a few stains. Is that cat fur?"
/obj/item/clothing/neck/petcollar/naomi
name = "worn pet collar"
desc = "a pet collar that looks well used."
/obj/item/clothing/neck/petcollar/naomi/examine(mob/user)
. = ..()
if(usr.ckey != "technicalmagi")
to_chat(user, "There's something odd about the it. You probably shouldn't wear it...")//warn people not to wear it if they're not Naomi, lest they become as crazy as she is
/obj/item/clothing/neck/petcollar/naomi/equipped()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/clothing/neck/petcollar/naomi/dropped()
. = ..()
STOP_PROCESSING(SSobj, src)
/obj/item/clothing/neck/petcollar/naomi/process()
var/mob/living/carbon/human/H
if(ishuman(loc))
H = loc
if(!H)
return
else if(H.get_item_by_slot(slot_neck) == src)
if(H.arousalloss < H.max_arousal / 3)
H.arousalloss = H.max_arousal / 3
if(prob(5) && H.hallucination < 15)
H.hallucination += 10
@@ -236,7 +236,7 @@
switch (command)
if ("map")
currentmap = new ("_maps/[data].json")
currentmap = load_map_config("_maps/[data].json")
if(currentmap.defaulted)
log_config("Failed to load map config for [data]!")
currentmap = null
@@ -20,8 +20,6 @@
/datum/config_entry/string/cross_comms_name
GLOBAL_VAR_INIT(medals_enabled, TRUE) //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls.
/datum/config_entry/string/medal_hub_address
/datum/config_entry/string/medal_hub_password
+78 -24
View File
@@ -23,15 +23,19 @@ SUBSYSTEM_DEF(mapping)
var/loading_ruins = FALSE
// Z-manager stuff
var/station_start // should only be used for maploading-related tasks
var/space_levels_so_far = 0
var/list/z_list
var/datum/space_level/transit
var/datum/space_level/empty_space
var/dmm_suite/loader
/datum/controller/subsystem/mapping/PreInit()
if(!config)
#ifdef FORCE_MAP
config = new(FORCE_MAP)
config = load_map_config(FORCE_MAP)
#else
config = new(error_if_missing = FALSE)
config = load_map_config(error_if_missing = FALSE)
#endif
return ..()
@@ -39,16 +43,20 @@ SUBSYSTEM_DEF(mapping)
/datum/controller/subsystem/mapping/Initialize(timeofday)
if(config.defaulted)
to_chat(world, "<span class='boldannounce'>Unable to load next map config, defaulting to Box Station</span>")
loader = new
loadWorld()
repopulate_sorted_areas()
process_teleport_locs() //Sets up the wizard teleport locations
preloadTemplates()
#ifndef LOWMEMORYMODE
// Create space levels
for(var/I in 1 to ZLEVEL_SPACE_RUIN_COUNT)
add_new_zlevel("Empty Area [2 + I]", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE))
add_new_zlevel("Empty Area [3 + ZLEVEL_SPACE_RUIN_COUNT]", CROSSLINKED, list()) // no ruins
transit = add_new_zlevel("Transit", UNAFFECTED, list(ZTRAIT_TRANSIT = TRUE))
// Create space ruin levels
while (space_levels_so_far < ZLEVEL_SPACE_RUIN_COUNT)
++space_levels_so_far
add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE)
// and one level with no ruins
empty_space = add_new_zlevel("Empty Area [1 + space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED))
// and the transit level
transit = add_new_zlevel("Transit", list(ZTRAIT_TRANSIT = TRUE))
// Pick a random away mission.
createRandomZlevel()
@@ -71,6 +79,7 @@ SUBSYSTEM_DEF(mapping)
// Set up Z-level transitions.
setup_map_transitions()
generate_station_area_list()
QDEL_NULL(loader)
..()
/* Nuke threats, for making the blue tiles on the station go RED
@@ -108,32 +117,77 @@ SUBSYSTEM_DEF(mapping)
z_list = SSmapping.z_list
/datum/controller/subsystem/mapping/proc/TryLoadZ(filename, errorList, forceLevel, last)
var/static/dmm_suite/loader
if(!loader)
loader = new
if(!loader.load_map(file(filename), 0, 0, forceLevel, no_changeturf = TRUE))
errorList |= filename
if(last)
QDEL_NULL(loader)
#define INIT_ANNOUNCE(X) to_chat(world, "<span class='boldannounce'>[X]</span>"); log_world(X)
/datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits)
var/start_time = REALTIMEOFDAY
if (!islist(files)) // handle single-level maps
files = list(files)
// check that the total z count of all maps matches the list of traits
var/total_z = 0
for (var/file in files)
var/full_path = "_maps/[path]/[file]"
var/bounds = loader.load_map(file(full_path), 1, 1, 1, cropMap=FALSE, measureOnly=TRUE)
files[file] = total_z // save the start Z of this file
total_z += bounds[MAP_MAXZ] - bounds[MAP_MINZ] + 1
if (!length(traits)) // null or empty - default
for (var/i in 1 to total_z)
traits += list(default_traits)
else if (total_z != traits.len) // mismatch
INIT_ANNOUNCE("WARNING: [traits.len] trait sets specified for [total_z] z-levels in [path]!")
if (total_z < traits.len) // ignore extra traits
traits.Cut(total_z + 1)
while (total_z > traits.len) // fall back to defaults on extra levels
traits += list(default_traits)
// preload the relevant space_level datums
var/start_z = world.maxz + 1
var/i = 0
for (var/level in traits)
add_new_zlevel("[name][i ? " [i + 1]" : ""]", level)
++i
// load the maps
for (var/file in files)
var/full_path = "_maps/[path]/[file]"
if(!loader.load_map(file(full_path), 0, 0, start_z + files[file], no_changeturf = TRUE))
errorList |= full_path
INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!")
/datum/controller/subsystem/mapping/proc/loadWorld()
//if any of these fail, something has gone horribly, HORRIBLY, wrong
var/list/FailedZs = list()
var/start_time = REALTIMEOFDAY
INIT_ANNOUNCE("Loading [config.map_name]...")
TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION_PRIMARY)
// ensure we have space_level datums for compiled-in maps
InitializeDefaultZLevels()
INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!")
// load the station
station_start = world.maxz + 1
INIT_ANNOUNCE("Loading [config.map_name]...")
LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION)
if(SSdbcore.Connect())
var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]")
query_round_map_name.Execute()
if(config.minetype != "lavaland")
INIT_ANNOUNCE("WARNING: A map without lavaland set as its minetype was loaded! This is being ignored! Update the maploader code!")
#ifndef LOWMEMORYMODE
// TODO: remove this when the DB is prepared for the z-levels getting reordered
while (world.maxz < (5 - 1) && space_levels_so_far < ZLEVEL_SPACE_RUIN_COUNT)
++space_levels_so_far
add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE)
// load mining
if(config.minetype == "lavaland")
LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND)
else if (!isnull(config.minetype))
INIT_ANNOUNCE("WARNING: An unknown minetype '[config.minetype]' was set! This is being ignored! Update the maploader code!")
// load Reebe
LoadGroup(FailedZs, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE)
#endif
if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen
var/msg = "RED ALERT! The following map files failed to load: [FailedZs[1]]"
@@ -209,7 +263,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
/datum/controller/subsystem/mapping/proc/changemap(var/datum/map_config/VM)
if(!VM.MakeNextMap())
next_map_config = new(default_to_box = TRUE)
next_map_config = load_map_config(default_to_box = TRUE)
message_admins("Failed to set new map with next_map.json for [VM.map_name]! Using default as backup!")
return
+87
View File
@@ -0,0 +1,87 @@
SUBSYSTEM_DEF(medals)
name = "Medals"
flags = SS_NO_FIRE
var/hub_enabled = FALSE
/datum/controller/subsystem/medals/Initialize(timeofday)
if(CONFIG_GET(string/medal_hub_address) && CONFIG_GET(string/medal_hub_password))
hub_enabled = TRUE
..()
/datum/controller/subsystem/medals/proc/UnlockMedal(medal, client/player)
set waitfor = FALSE
if(!medal || !hub_enabled)
return
if(isnull(world.SetMedal(medal, player, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
hub_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]")
message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!")
return
to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
/datum/controller/subsystem/medals/proc/SetScore(score, client/player, increment, force)
set waitfor = FALSE
if(!score || !hub_enabled)
return
var/list/oldscore = GetScore(score, player, TRUE)
if(increment)
if(!oldscore[score])
oldscore[score] = 1
else
oldscore[score] = (text2num(oldscore[score]) + 1)
else
oldscore[score] = force
var/newscoreparam = list2params(oldscore)
if(isnull(world.SetScores(player.ckey, newscoreparam, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
hub_enabled = FALSE
log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]")
message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!")
/datum/controller/subsystem/medals/proc/GetScore(score, client/player, returnlist)
if(!score || !hub_enabled)
return
var/scoreget = world.GetScores(player.ckey, score, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))
if(isnull(scoreget))
hub_enabled = FALSE
log_game("SCORE ERROR: Could not contact hub to get score. Score:[score] player:[player.ckey]")
message_admins("Error! Failed to contact hub to get score: [score] for [player.ckey]!")
return
. = params2list(scoreget)
if(!returnlist)
return .[score]
/datum/controller/subsystem/medals/proc/CheckMedal(medal, client/player)
if(!medal || !hub_enabled)
return
if(isnull(world.GetMedal(medal, player, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
hub_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to get medal:[medal] player: [player.ckey]")
message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!")
return
to_chat(player, "[medal] is unlocked")
/datum/controller/subsystem/medals/proc/LockMedal(medal, client/player)
if(!player || !medal || !hub_enabled)
return
var/result = world.ClearMedal(medal, player, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))
switch(result)
if(null)
hub_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to clear medal:[medal] player:[player.ckey]")
message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!")
if(TRUE)
message_admins("Medal: [medal] removed for [player.ckey]")
if(FALSE)
message_admins("Medal: [medal] was not found for [player.ckey]. Unable to clear.")
/datum/controller/subsystem/medals/proc/ClearScore(client/player)
if(isnull(world.SetScores(player.ckey, "", CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
log_game("MEDAL ERROR: Could not contact hub to clear scores for [player.ckey]!")
message_admins("Error! Failed to contact hub to clear scores for [player.ckey]!")
+4 -1
View File
@@ -9,7 +9,10 @@ SUBSYSTEM_DEF(minimap)
/datum/controller/subsystem/minimap/Initialize(timeofday)
z_levels = SSmapping.levels_by_trait(ZTRAIT_STATION)
var/hash = md5(SSmapping.config.GetFullMapPath())
var/list/hashlist = list()
for (var/file in SSmapping.config.GetFullMapPaths())
hashlist += md5(file2text(file))
var/hash = hashlist.Join("\n")
if(CONFIG_GET(flag/generate_minimaps))
if(hash == trim(file2text(hash_path())))
for(var/z in z_levels) //We have these files cached, let's register them
+3 -3
View File
@@ -56,7 +56,7 @@ SUBSYSTEM_DEF(persistence)
old_secret_satchels.Cut(pos, pos+1 % old_secret_satchels.len)
F.x = old_secret_satchels[pos]["x"]
F.y = old_secret_satchels[pos]["y"]
F.z = ZLEVEL_STATION_PRIMARY
F.z = SSmapping.station_start
path = text2path(old_secret_satchels[pos]["saved_obj"])
if(F)
@@ -67,7 +67,7 @@ SUBSYSTEM_DEF(persistence)
spawned_objects[spawned_item] = TRUE
placed_satchel++
var/free_satchels = 0
for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,ZLEVEL_STATION_PRIMARY), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,ZLEVEL_STATION_PRIMARY)))) //Nontrivially expensive but it's roundstart only
for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,SSmapping.station_start), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,SSmapping.station_start)))) //Nontrivially expensive but it's roundstart only
if(isfloorturf(T) && !isplatingturf(T))
new /obj/item/storage/backpack/satchel/flat/secret(T)
free_satchels++
@@ -189,7 +189,7 @@ SUBSYSTEM_DEF(persistence)
var/list/satchels_to_add = list()
for(var/A in new_secret_satchels)
var/obj/item/storage/backpack/satchel/flat/F = A
if(QDELETED(F) || F.z != ZLEVEL_STATION_PRIMARY || F.invisibility != INVISIBILITY_MAXIMUM)
if(QDELETED(F) || F.z != SSmapping.station_start || F.invisibility != INVISIBILITY_MAXIMUM)
continue
var/list/savable_obj = list()
for(var/obj/O in F)
+1 -1
View File
@@ -41,7 +41,7 @@
set waitfor = FALSE
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend)
if(LAZYLEN(candidates))
var/client/C = pick(candidates)
var/mob/dead/observer/C = pick(candidates)
friend.key = C.key
friend_initialized = TRUE
else
@@ -25,7 +25,7 @@
set waitfor = FALSE
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat)
if(LAZYLEN(candidates))
var/client/C = pick(candidates)
var/mob/dead/observer/C = pick(candidates)
stranger_backseat.key = C.key
log_game("[key_name(stranger_backseat)] became [key_name(owner)]'s split personality.")
message_admins("[key_name_admin(stranger_backseat)] became [key_name_admin(owner)]'s split personality.")
@@ -183,7 +183,7 @@
set waitfor = FALSE
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s brainwashed mind?", null, null, null, 75, stranger_backseat)
if(LAZYLEN(candidates))
var/client/C = pick(candidates)
var/mob/dead/observer/C = pick(candidates)
stranger_backseat.key = C.key
else
qdel(src)
@@ -350,3 +350,8 @@
/datum/material/biomass
name = "Biomass"
id = MAT_BIOMASS
/datum/material/plastic
name = "Plastic"
id = MAT_PLASTIC
sheet_type = /obj/item/stack/sheet/plastic
+58 -82
View File
@@ -1,44 +1,50 @@
#define FORWARD -1
#define BACKWARD 1
#define FORWARD 1
#define BACKWARD -1
#define ITEM_DELETE "delete"
#define ITEM_MOVE_INSIDE "move_inside"
/datum/construction
var/list/steps
var/atom/holder
var/result
var/list/steps_desc
var/index = 1
/datum/construction/New(atom)
..()
holder = atom
if(!holder) //don't want this without a holder
qdel(src)
set_desc(steps.len)
return
update_holder(index)
/datum/construction/proc/next_step()
steps.len--
if(!steps.len)
/datum/construction/proc/on_step()
if(index > steps.len)
spawn_result()
else
set_desc(steps.len)
return
update_holder(index)
/datum/construction/proc/action(obj/item/I, mob/user)
return
/datum/construction/proc/action(obj/item/I, mob/living/user)
return check_step(I, user)
/datum/construction/proc/check_step(obj/item/I, mob/user) //check last step only
var/valid_step = is_right_key(I)
if(valid_step)
if(custom_action(valid_step, I, user))
next_step()
return 1
return 0
/datum/construction/proc/update_index(diff)
index += diff
on_step()
/datum/construction/proc/is_right_key(obj/item/I) // returns current step num if I is of the right type.
var/list/L = steps[steps.len]
/datum/construction/proc/check_step(obj/item/I, mob/living/user)
var/diff = is_right_key(I)
if(diff && custom_action(I, user, diff))
update_index(diff)
return TRUE
return FALSE
/datum/construction/proc/is_right_key(obj/item/I) // returns index step
var/list/L = steps[index]
if(check_used_item(I, L["key"]))
return steps.len
return 0
return FORWARD //to the first step -> forward
else if(check_used_item(I, L["back_key"]))
return BACKWARD //to the last step -> backwards
return FALSE
/datum/construction/proc/check_used_item(obj/item/I, key)
if(!key)
@@ -52,77 +58,47 @@
return FALSE
/datum/construction/proc/custom_action(step, obj/item/I, user)
return 1
/datum/construction/proc/check_all_steps(obj/item/I, mob/user) //check all steps, remove matching one.
for(var/i=1;i<=steps.len;i++)
var/list/L = steps[i]
if(check_used_item(I, L["key"]))
if(custom_action(i, I, user))
steps[i] = null//stupid byond list from list removal...
listclearnulls(steps)
if(!steps.len)
spawn_result()
return 1
return 0
/datum/construction/proc/custom_action(obj/item/I, mob/living/user, diff)
return TRUE
/datum/construction/proc/spawn_result()
if(result)
new result(get_turf(holder))
new result(drop_location())
qdel(holder)
return
/datum/construction/proc/spawn_mecha_result()
if(result)
var/obj/mecha/m = new result(get_turf(holder))
var/obj/item/oldcell = locate (/obj/item/stock_parts/cell) in m
QDEL_NULL(oldcell)
m.CheckParts(holder.contents)
SSblackbox.record_feedback("tally", "mechas_created", 1, m.name)
QDEL_NULL(holder)
/datum/construction/proc/update_holder(step_index)
var/list/step = steps[step_index]
/datum/construction/proc/set_desc(index as num)
var/list/step = steps[index]
holder.desc = step["desc"]
return
if(step["desc"])
holder.desc = step["desc"]
if(step["icon_state"])
holder.icon_state = step["icon_state"]
/datum/construction/proc/drop_location()
return holder.drop_location()
/datum/construction/reversible
var/index
/datum/construction/reversible/New(atom)
..()
index = steps.len
return
/datum/construction/reversible/proc/update_index(diff as num)
index+=diff
if(index==0)
spawn_result()
else
set_desc(index)
return
/datum/construction/reversible/is_right_key(obj/item/I) // returns index step
var/list/L = steps[index]
if(check_used_item(I, L["key"]))
return FORWARD //to the first step -> forward
else if(check_used_item(I, L["backkey"]))
return BACKWARD //to the last step -> backwards
// Unordered construction.
// Takes a list of part types, to be added in any order, as steps.
// Calls spawn_result() when every type has been added.
/datum/construction/unordered/check_step(obj/item/I, mob/living/user)
for(var/typepath in steps)
if(istype(I, typepath) && custom_action(I, user, typepath))
steps -= typepath
on_step()
return TRUE
return FALSE
/datum/construction/reversible/check_step(obj/item/I, mob/user)
var/diff = is_right_key(I)
if(diff)
if(custom_action(index, diff, I, user))
update_index(diff)
return 1
return 0
/datum/construction/unordered/on_step()
if(!steps.len)
spawn_result()
else
update_holder(steps.len)
/datum/construction/reversible/custom_action(index, diff, obj/item/I, user)
return 1
/datum/construction/unordered/update_holder(steps_left)
return
/datum/construction/unordered/custom_action(obj/item/I, mob/living/user, typepath)
return TRUE
+65 -102
View File
@@ -4,46 +4,42 @@
// -Cyberboss
/datum/map_config
// Metadata
var/config_filename = "_maps/boxstation.json"
var/defaulted = TRUE // set to FALSE by LoadConfig() succeeding
// Config from maps.txt
var/config_max_users = 0
var/config_min_users = 0
var/voteweight = 1
// Config actually from the JSON - should default to Box
var/map_name = "Box Station"
var/map_path = "map_files/BoxStation"
var/map_file = "BoxStation.dmm"
var/traits = null
var/minetype = "lavaland"
var/allow_custom_shuttles = TRUE
var/shuttles = list(
"cargo" = "cargo_box",
"ferry" = "ferry_fancy",
"whiteship" = "whiteship_box",
"emergency" = "emergency_box")
//Order matters here.
var/list/transition_config = list(CENTCOM = SELFLOOPING,
MAIN_STATION = CROSSLINKED,
EMPTY_AREA_1 = CROSSLINKED,
EMPTY_AREA_2 = CROSSLINKED,
MINING = SELFLOOPING,
CITY_OF_COGS = SELFLOOPING,
EMPTY_AREA_3 = CROSSLINKED,
EMPTY_AREA_4 = CROSSLINKED,
EMPTY_AREA_5 = CROSSLINKED,
EMPTY_AREA_6 = CROSSLINKED,
EMPTY_AREA_7 = CROSSLINKED,
EMPTY_AREA_8 = CROSSLINKED)
var/defaulted = TRUE //if New failed
var/config_max_users = 0
var/config_min_users = 0
var/voteweight = 1
var/allow_custom_shuttles = TRUE
/datum/map_config/New(filename = "data/next_map.json", default_to_box, delete_after, error_if_missing = TRUE)
if(default_to_box)
return
LoadConfig(filename, error_if_missing)
if(delete_after)
/proc/load_map_config(filename = "data/next_map.json", default_to_box, delete_after, error_if_missing = TRUE)
var/datum/map_config/config = new
if (default_to_box)
return config
if (!config.LoadConfig(filename, error_if_missing))
qdel(config)
config = new /datum/map_config // Fall back to Box
if (delete_after)
fdel(filename)
return config
#define CHECK_EXISTS(X) if(!istext(json[X])) { log_world("[##X] missing from json!"); return; }
/datum/map_config/proc/LoadConfig(filename, error_if_missing)
if(!fexists(filename))
if(error_if_missing)
@@ -65,99 +61,66 @@
log_world("map_config is not json: [filename]")
return
if(!ValidateJSON(json))
log_world("map_config failed to validate for above reason: [filename]")
return
config_filename = filename
CHECK_EXISTS("map_name")
map_name = json["map_name"]
CHECK_EXISTS("map_path")
map_path = json["map_path"]
map_file = json["map_file"]
if(islist(json["shuttles"]))
map_file = json["map_file"]
// "map_file": "BoxStation.dmm"
if (istext(map_file))
if (!fexists("_maps/[map_path]/[map_file]"))
log_world("Map file ([map_path]/[map_file]) does not exist!")
return
// "map_file": ["Lower.dmm", "Upper.dmm"]
else if (islist(map_file))
for (var/file in map_file)
if (!fexists("_maps/[map_path]/[file]"))
log_world("Map file ([map_path]/[file]) does not exist!")
return
else
log_world("map_file missing from json!")
return
if (islist(json["shuttles"]))
var/list/L = json["shuttles"]
for(var/key in L)
var/value = L[key]
shuttles[key] = value
minetype = json["minetype"] || minetype
allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE
var/jtcl = json["transition_config"]
if(jtcl && jtcl != "default")
transition_config.Cut()
for(var/I in jtcl)
transition_config[TransitionStringToEnum(I)] = TransitionStringToEnum(jtcl[I])
defaulted = FALSE
#define CHECK_EXISTS(X) if(!istext(json[X])) { log_world("[##X] missing from json!"); return; }
/datum/map_config/proc/ValidateJSON(list/json)
CHECK_EXISTS("map_name")
CHECK_EXISTS("map_path")
CHECK_EXISTS("map_file")
var/shuttles = json["shuttles"]
if(shuttles && !islist(shuttles))
log_world("json\[shuttles\] is not a list!")
var/path = GetFullMapPath(json["map_path"], json["map_file"])
if(!fexists(path))
log_world("Map file ([path]) does not exist!")
else if ("shuttles" in json)
log_world("map_config shuttles is not a list!")
return
var/tc = json["transition_config"]
if(tc != null && tc != "default")
if(!islist(tc))
log_world("transition_config is not a list!")
return
traits = json["traits"]
// "traits": [{"Linkage": "Cross"}, {"Space Ruins": true}]
if (islist(traits))
// "Station" is set by default, but it's assumed if you're setting
// traits you want to customize which level is cross-linked
for (var/level in traits)
if (!(ZTRAIT_STATION in level))
level[ZTRAIT_STATION] = TRUE
// "traits": null or absent -> default
else if (!isnull(traits))
log_world("map_config traits is not a list!")
return
for(var/I in tc)
if(isnull(TransitionStringToEnum(I)))
log_world("Invalid transition_config option: [I]!")
if(isnull(TransitionStringToEnum(tc[I])))
log_world("Invalid transition_config option: [I]!")
if ("minetype" in json)
minetype = json["minetype"]
allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE
defaulted = FALSE
return TRUE
#undef CHECK_EXISTS
/datum/map_config/proc/TransitionStringToEnum(string)
switch(string)
if("CROSSLINKED")
return CROSSLINKED
if("SELFLOOPING")
return SELFLOOPING
if("UNAFFECTED")
return UNAFFECTED
if("MAIN_STATION")
return MAIN_STATION
if("CENTCOM")
return CENTCOM
if("CITY_OF_COGS")
return CITY_OF_COGS
if("MINING")
return MINING
if("EMPTY_AREA_1")
return EMPTY_AREA_1
if("EMPTY_AREA_2")
return EMPTY_AREA_2
if("EMPTY_AREA_3")
return EMPTY_AREA_3
if("EMPTY_AREA_4")
return EMPTY_AREA_4
if("EMPTY_AREA_5")
return EMPTY_AREA_5
if("EMPTY_AREA_6")
return EMPTY_AREA_6
if("EMPTY_AREA_7")
return EMPTY_AREA_7
if("EMPTY_AREA_8")
return EMPTY_AREA_8
/datum/map_config/proc/GetFullMapPath(mp = map_path, mf = map_file)
return "_maps/[mp]/[mf]"
/datum/map_config/proc/GetFullMapPaths()
if (istext(map_file))
return list("_maps/[map_path]/[map_file]")
. = list()
for (var/file in map_file)
. += "_maps/[map_path]/[file]"
/datum/map_config/proc/MakeNextMap()
return config_filename == "data/next_map.json" || fcopy(config_filename, "data/next_map.json")
-186
View File
@@ -95,16 +95,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
. = ..()
set_dynamic_lighting()
/area/planet/clown
name = "Clown Planet"
icon_state = "honk"
requires_power = FALSE
/area/telesciareas
name = "Cosmic Anomaly"
icon_state = "telesci"
requires_power = FALSE
//STATION13
@@ -258,105 +248,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "disposal"
/area/maintenance/disposal/incinerator
// /area/maintenance/incinerator
name = "Incinerator"
icon_state = "disposal"
//Cere / Asteroid Specific
/area/maintenance/asteroid/aft/science
name = "Aft Maintenance"
icon_state = "amaint"
/area/maintenance/asteroid/aft/arrivals
name = "Aft Maintenance"
icon_state = "amaint"
/area/maintenance/asteroid/central
name = "Central Asteroid Maintenance"
icon_state = "maintcentral"
/area/maintenance/asteroid/disposal
icon_state = "disposal"
/area/maintenance/asteroid/disposal/north
name = "Northern Disposal"
/area/maintenance/asteroid/disposal/north/east
name = "North-Eastern Disposal"
/area/maintenance/asteroid/disposal/north/west
name = "North-Western Disposal"
/area/maintenance/asteroid/disposal/east
name = "Eastern Disposal"
/area/maintenance/asteroid/disposal/west
name = "Western Disposal"
/area/maintenance/asteroid/disposal/west/secondary
name = "Secondary Western Disposal"
/area/maintenance/asteroid/disposal/south
name = "Southern Disposal"
/area/maintenance/asteroid/disposal/south/west
name = "South-Western Disposal"
/area/maintenance/asteroid/disposal/external/east
name = "Eastern External Waste Belt"
/area/maintenance/asteroid/disposal/external/north
name = "Northern External Waste Belt"
/area/maintenance/asteroid/disposal/external/southeast
name = "South-Eastern External Waste Belt"
/area/maintenance/asteroid/disposal/external/southwest
name = "South-Western External Waste Belt"
/area/maintenance/asteroid/fore/cargo_west
name = "Fore Asteroid Maintenance"
icon_state = "fmaint"
/area/maintenance/asteroid/fore/cargo_south
name = "Fore Asteroid Maintenance"
icon_state = "fmaint"
/area/maintenance/asteroid/fore/com_west
name = "Fore Asteroid Maintenance"
icon_state = "fmaint"
/area/maintenance/asteroid/fore/com_north
name = "Fore Asteroid Maintenance"
icon_state = "fmaint"
/area/maintenance/asteroid/fore/com_east
name = "Fore Asteroid Maintenance"
icon_state = "fmaint"
/area/maintenance/asteroid/fore/com_south
name = "Fore Asteroid Maintenance"
icon_state = "fmaint"
/area/maintenance/asteroid/port/neast
name = "Port Asteroid Maintenance"
icon_state = "pmaint"
/area/maintenance/asteroid/port/east
name = "Port Asteroid Maintenance"
icon_state = "pmaint"
/area/maintenance/asteroid/port/west
name = "Port Asteroid Maintenance"
icon_state = "pmaint"
/area/maintenance/asteroid/starboard
name = "Starboard Asteroid Maintenance"
icon_state = "smaint"
//Hallway
/area/hallway/primary/aft
@@ -419,42 +314,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Service Hallway"
icon_state = "hall_service"
/area/hallway/secondary/bridges/cargo_ai
name = "Cargo-AI-Command Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/com_engi
name = "Command-Engineering Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/com_serv
name = "Command-Service Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/dock_med
name = "Docking-Medical Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/engi_med
name = "Engineering-Medical Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/med_cargo
name = "Medical-Cargo Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/sci_dock
name = "Science-Docking Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/serv_engi
name = "Service-Engineering Bridge"
icon_state = "yellow"
/area/hallway/secondary/bridges/serv_sci
name = "Service-Science Bridge"
icon_state = "yellow"
//Command
/area/bridge
@@ -745,18 +604,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
flags_1 = NONE
ambientsounds = ENGINEERING
/area/solar/asteroid/aft
name = "Aft Asteroid Solar"
icon_state = "panelsA"
/area/solar/asteroid/command
name = "Command Asteroid Solar"
icon_state = "panelsA"
/area/solar/asteroid/fore
name = "Fore Asteroid Solar"
icon_state = "panelsA"
/area/solar/fore
name = "Fore Solar Array"
icon_state = "yellow"
@@ -804,18 +651,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Solar Maintenance"
icon_state = "yellow"
/area/maintenance/solars/asteroid/aft
name = "Aft Asteroid Solar Maintenance"
icon_state = "SolarcontrolA"
/area/maintenance/solars/asteroid/command
name = "Command Asteroid Solar Maintenance"
icon_state = "SolarcontrolP"
/area/maintenance/solars/asteroid/fore
name = "Fore Asteroid Solar Maintenance"
icon_state = "SolarcontrolP"
/area/maintenance/solars/port
name = "Port Solar Maintenance"
icon_state = "SolarcontrolP"
@@ -872,22 +707,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
music = "signal"
ambientsounds = ENGINEERING
/area/teleporter/quantum/cargo
name = "Cargo Quantum Pad"
icon_state = "teleporter"
/area/teleporter/quantum/docking
name = "Docking Quantum Pad"
icon_state = "teleporter"
/area/teleporter/quantum/research
name = "Research Quantum Pad"
icon_state = "teleporter"
/area/teleporter/quantum/security
name = "Security Quantum Pad"
icon_state = "teleporter"
/area/gateway
name = "Gateway"
icon_state = "gateway"
@@ -1458,11 +1277,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "AI Sat Ext"
icon_state = "storage"
/area/ai_monitored/turret_protected/NewAIMain
name = "AI Main New"
icon_state = "storage"
// Telecommunications Satellite
-6
View File
@@ -65,12 +65,6 @@
/area/mine/sleeper
name = "Mining Station Emergency Sleeper"
/area/mine/north_outpost
name = "North Mining Outpost"
/area/mine/west_outpost
name = "West Mining Outpost"
/area/mine/laborcamp
name = "Labor Camp"
-122
View File
@@ -1,122 +0,0 @@
// Hell
/area/hell
name = "Hell Lobby"
//icon = "ICON FILENAME"
//icon_state = "NAME OF ICON"
requires_power = FALSE
ambientsounds = SPOOKY
/area/hell/trial1
name = "Hell Trial1"
//icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
/area/hell/trial1
name = "Hell Trial2"
//icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
/area/hell/trial1
name = "Hell Trial3"
//icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
//Misc
/area/generic
name = "Unknown"
icon_state = "storage"
//PRISON
/area/prison
name = "Prison Station"
icon_state = "brig"
ambientsounds = HIGHSEC
/area/prison/arrival_airlock
name = "Prison Station Airlock"
icon_state = "green"
requires_power = FALSE
/area/prison/control
name = "Prison Security Checkpoint"
icon_state = "security"
/area/prison/crew_quarters
name = "Prison Security Quarters"
icon_state = "security"
/area/prison/rec_room
name = "Prison Rec Room"
icon_state = "green"
/area/prison/closet
name = "Prison Supply Closet"
icon_state = "dk_yellow"
/area/prison/hallway/fore
name = "Prison Fore Hallway"
icon_state = "yellow"
/area/prison/hallway/aft
name = "Prison Aft Hallway"
icon_state = "yellow"
/area/prison/hallway/port
name = "Prison Port Hallway"
icon_state = "yellow"
/area/prison/hallway/starboard
name = "Prison Starboard Hallway"
icon_state = "yellow"
/area/prison/morgue
name = "Prison Morgue"
icon_state = "morgue"
ambientsounds = SPOOKY
/area/prison/medical_research
name = "Prison Genetic Research"
icon_state = "medresearch"
/area/prison/medical
name = "Prison Medbay"
icon_state = "medbay"
/area/prison/solar
name = "Prison Solar Array"
icon_state = "storage"
requires_power = FALSE
/area/prison/podbay
name = "Prison Podbay"
icon_state = "dk_yellow"
/area/prison/solar_control
name = "Prison Solar Array Control"
icon_state = "dk_yellow"
/area/prison/solitary
name = "Solitary Confinement"
icon_state = "brig"
/area/prison/execution_room
name = "Prisoner Education Chamber"
icon_state = "execution_room"
/area/prison/cell_block/a
// /area/prison/cell_block/A
name = "Prison Cell Block A"
icon_state = "brig"
/area/prison/cell_block/b
// /area/prison/cell_block/B
name = "Prison Cell Block B"
icon_state = "brig"
/area/prison/cell_block/c
// /area/prison/cell_block/C
name = "Prison Cell Block C"
icon_state = "brig"
-98
View File
@@ -1,98 +0,0 @@
/area/spacecontent
name = "space"
ambientsounds = AWAY_MISSION
/area/spacecontent/a1
icon_state = "spacecontent1"
/area/spacecontent/a2
icon_state = "spacecontent2"
/area/spacecontent/a3
icon_state = "spacecontent3"
/area/spacecontent/a4
icon_state = "spacecontent4"
/area/spacecontent/a5
icon_state = "spacecontent5"
/area/spacecontent/a6
icon_state = "spacecontent6"
/area/spacecontent/a7
icon_state = "spacecontent7"
/area/spacecontent/a8
icon_state = "spacecontent8"
/area/spacecontent/a9
icon_state = "spacecontent9"
/area/spacecontent/a10
icon_state = "spacecontent10"
/area/spacecontent/a11
icon_state = "spacecontent11"
/area/spacecontent/a11
icon_state = "spacecontent12"
/area/spacecontent/a12
icon_state = "spacecontent13"
/area/spacecontent/a13
icon_state = "spacecontent14"
/area/spacecontent/a14
icon_state = "spacecontent14"
/area/spacecontent/a15
icon_state = "spacecontent15"
/area/spacecontent/a16
icon_state = "spacecontent16"
/area/spacecontent/a17
icon_state = "spacecontent17"
/area/spacecontent/a18
icon_state = "spacecontent18"
/area/spacecontent/a19
icon_state = "spacecontent19"
/area/spacecontent/a20
icon_state = "spacecontent20"
/area/spacecontent/a21
icon_state = "spacecontent21"
/area/spacecontent/a22
icon_state = "spacecontent22"
/area/spacecontent/a23
icon_state = "spacecontent23"
/area/spacecontent/a24
icon_state = "spacecontent24"
/area/spacecontent/a25
icon_state = "spacecontent25"
/area/spacecontent/a26
icon_state = "spacecontent26"
/area/spacecontent/a27
icon_state = "spacecontent27"
/area/spacecontent/a28
icon_state = "spacecontent28"
/area/spacecontent/a29
icon_state = "spacecontent29"
/area/spacecontent/a30
icon_state = "spacecontent30"
+1 -5
View File
@@ -164,15 +164,11 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/ex_act()
return
#define METEOR_MEDAL "Your Life Before Your Eyes"
/obj/effect/meteor/examine(mob/user)
if(!admin_spawned && isliving(user))
UnlockMedal(METEOR_MEDAL,user.client)
SSmedals.UnlockMedal(MEDAL_METEOR, user.client)
..()
#undef METEOR_MEDAL
/obj/effect/meteor/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_MINING)
make_debris()
+6 -2
View File
@@ -221,8 +221,9 @@ GLOBAL_LIST_EMPTY(objectives)
explanation_text = "Free Objective"
/datum/objective/protect//The opposite of killing a dude.
var/target_role_type=0
martyr_compatible = 1
var/target_role_type = 0
var/human_check = TRUE
/datum/objective/protect/find_target_by_role(role, role_type=0, invert=0)
if(!invert)
@@ -231,7 +232,7 @@ GLOBAL_LIST_EMPTY(objectives)
return target
/datum/objective/protect/check_completion()
return !target || considered_alive(target)
return !target || considered_alive(target, enforce_human = human_check)
/datum/objective/protect/update_explanation_text()
..()
@@ -240,6 +241,9 @@ GLOBAL_LIST_EMPTY(objectives)
else
explanation_text = "Free Objective"
/datum/objective/protect/nonhuman
human_check = FALSE
/datum/objective/hijack
explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody."
team_explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody. Leave no team member behind."
+3 -3
View File
@@ -114,7 +114,7 @@ Class Procs:
/obj/machinery/Initialize()
if(!armor)
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
. = ..()
GLOB.machines += src
@@ -391,9 +391,9 @@ Class Procs:
/obj/machinery/proc/exchange_parts(mob/user, obj/item/storage/part_replacer/W)
if(!istype(W))
return
return FALSE
if((flags_1 & NODECONSTRUCT_1) && !W.works_from_distance)
return
return FALSE
var/shouldplaysound = 0
if(component_parts)
if(panel_open || W.works_from_distance)
+1 -1
View File
@@ -6,7 +6,7 @@
layer = PROJECTILE_HIT_THRESHHOLD_LAYER
anchored = TRUE
max_integrity = 200
armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/uses = 20
var/cooldown = 0
+1 -1
View File
@@ -10,7 +10,7 @@
var/device_type = null
var/id = null
var/initialized_button = 0
armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 90, acid = 70)
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70)
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 2
+1 -1
View File
@@ -14,7 +14,7 @@
resistance_flags = FIRE_PROOF
armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 50)
armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 50)
max_integrity = 100
integrity_failure = 50
var/list/network = list("SS13")
+1 -1
View File
@@ -9,7 +9,7 @@
active_power_usage = 300
max_integrity = 200
integrity_failure = 100
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 20)
var/processing = FALSE
var/brightness_on = 2
var/icon_keyboard = "generic_key"
+1 -4
View File
@@ -67,12 +67,10 @@
return INITIALIZE_HINT_QDEL
Reset()
#define PULSE_MEDAL "Jackpot"
/obj/machinery/computer/arcade/proc/prizevend()
if(prob(0.0001)) //1 in a million
new /obj/item/gun/energy/pulse/prize(src)
UnlockMedal(PULSE_MEDAL,usr.client)
SSmedals.UnlockMedal(MEDAL_PULSE, usr.client)
if(!contents.len)
var/prizeselect = pickweight(prizes)
@@ -82,7 +80,6 @@
visible_message("<span class='notice'>[src] dispenses [prize]!</span>", "<span class='notice'>You hear a chime and a clunk.</span>")
prize.forceMove(get_turf(src))
#undef PULSE_MEDAL
/obj/machinery/computer/arcade/emp_act(severity)
..(severity)
+1 -1
View File
@@ -104,7 +104,7 @@
anchored = FALSE
max_integrity = 180
proj_pass_rate = 20
armor = list(melee = 10, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 10, acid = 0)
armor = list("melee" = 10, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 10, "acid" = 0)
var/deploy_time = 40
var/deploy_message = TRUE
+1 -1
View File
@@ -489,7 +489,7 @@
desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state."
normal_integrity = 180
damage_deflection = 5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
//Pinion airlocks: Clockwork doors that only let servants of Ratvar through.
/obj/machinery/door/airlock/clockwork
+4 -2
View File
@@ -9,7 +9,7 @@
layer = OPEN_DOOR_LAYER
power_channel = ENVIRON
max_integrity = 350
armor = list(melee = 30, bullet = 30, laser = 20, energy = 20, bomb = 10, bio = 100, rad = 100, fire = 80, acid = 70)
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70)
CanAtmosPass = ATMOS_PASS_DENSITY
flags_1 = PREVENT_CLICK_UNDER_1
@@ -33,6 +33,7 @@
var/damage_deflection = 10
var/real_explosion_block //ignore this, just use explosion_block
var/red_alert_access = FALSE //if TRUE, this door will always open on red alert
var/poddoor = FALSE
/obj/machinery/door/examine(mob/user)
..()
@@ -41,7 +42,8 @@
to_chat(user, "<span class='notice'>Due to a security threat, its access requirements have been lifted!</span>")
else
to_chat(user, "<span class='notice'>In the event of a red alert, its access requirements will automatically lift.</span>")
to_chat(user, "<span class='notice'>Its maintenance panel is <b>screwed</b> in place.</span>")
if(!poddoor)
to_chat(user, "<span class='notice'>Its maintenance panel is <b>screwed</b> in place.</span>")
/obj/machinery/door/check_access(access)
if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED)
+1 -1
View File
@@ -6,7 +6,7 @@
explosion_block = 3
heat_proof = TRUE
max_integrity = 600
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
damage_deflection = 70
var/password = "Swordfish"
+3 -2
View File
@@ -11,9 +11,10 @@
heat_proof = TRUE
safe = FALSE
max_integrity = 600
armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70)
armor = list("melee" = 50, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
damage_deflection = 70
poddoor = TRUE
/obj/machinery/door/poddoor/preopen
icon_state = "open"
@@ -67,4 +68,4 @@
/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user)
if(stat & NOPOWER)
open(1)
open(1)
+1 -1
View File
@@ -9,7 +9,7 @@
var/base_state = "left"
max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file
integrity_failure = 0
armor = list(melee = 20, bullet = 50, laser = 50, energy = 50, bomb = 10, bio = 100, rad = 100, fire = 70, acid = 100)
armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100)
visible = FALSE
flags_1 = ON_BORDER_1
opacity = 0
+1 -1
View File
@@ -19,7 +19,7 @@
anchored = TRUE
max_integrity = 250
integrity_failure = 100
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100, fire = 90, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 6
+1 -1
View File
@@ -39,7 +39,7 @@ Possible to do for anyone motivated enough:
idle_power_usage = 5
active_power_usage = 100
max_integrity = 300
armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
armor = list("melee" = 50, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
circuit = /obj/item/circuitboard/machine/holopad
var/list/masters //List of living mobs that use the holopad
var/list/holorays //Holoray-mob link.
+1 -1
View File
@@ -10,7 +10,7 @@
idle_power_usage = 2
active_power_usage = 4
max_integrity = 300
armor = list(melee = 50, bullet = 30, laser = 70, energy = 50, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 70)
armor = list("melee" = 50, "bullet" = 30, "laser" = 70, "energy" = 50, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
/obj/machinery/igniter/attack_ai(mob/user)
+1 -1
View File
@@ -11,7 +11,7 @@
layer = LOW_OBJ_LAYER
anchored = TRUE
max_integrity = 500
armor = list(melee = 70, bullet = 70, laser = 70, energy = 70, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
var/open = FALSE // true if cover is open
var/locked = TRUE // true if controls are locked
+1 -1
View File
@@ -186,7 +186,7 @@ GLOBAL_LIST_EMPTY(allCasters)
verb_say = "beeps"
verb_ask = "beeps"
verb_exclaim = "beeps"
armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
max_integrity = 200
integrity_failure = 50
var/screen = 0
+2
View File
@@ -83,6 +83,8 @@ Buildable meters
var/obj/machinery/atmospherics/fakeA = pipe_type
name = "[initial(fakeA.name)] fitting"
icon_state = initial(fakeA.pipe_state)
if(ispath(pipe_type,/obj/machinery/atmospherics/pipe/heat_exchanging))
resistance_flags |= FIRE_PROOF | LAVA_PROOF
/obj/item/pipe/verb/flip()
set category = "Object"
@@ -31,7 +31,7 @@
max_integrity = 160 //the turret's health
integrity_failure = 80
armor = list(melee = 50, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 90, acid = 90)
armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
var/locked = TRUE //if the turret's behaviour control access is locked
var/controllock = 0 //if the turret responds to control panels
+1 -1
View File
@@ -55,7 +55,7 @@ GLOBAL_LIST_EMPTY(allConsoles)
var/emergency //If an emergency has been called by this device. Acts as both a cooldown and lets the responder know where it the emergency was triggered from
var/receive_ore_updates = FALSE //If ore redemption machines will send an update when it receives new ores.
max_integrity = 300
armor = list(melee = 70, bullet = 30, laser = 30, energy = 30, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90)
armor = list("melee" = 70, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
/obj/machinery/requests_console/power_change()
..()
+1 -1
View File
@@ -11,7 +11,7 @@
name = "space heater"
desc = "Made by Space Amish using traditional space techniques, this heater/cooler is guaranteed not to set the station on fire. Warranty void if used in engines."
max_integrity = 250
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 10)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 10)
circuit = /obj/item/circuitboard/machine/space_heater
var/obj/item/stock_parts/cell/cell
var/on = FALSE
@@ -1,181 +1,180 @@
/*
The equivalent of the server, for PDA and request console messages.
Without it, PDA and request console messages cannot be transmitted.
PDAs require the rest of the telecomms setup, but request consoles only
require the message server.
*/
// A decorational representation of SSblackbox, usually placed alongside the message server.
/obj/machinery/blackbox_recorder
icon = 'icons/obj/stationobjs.dmi'
icon_state = "blackbox"
name = "Blackbox Recorder"
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
// The message server itself.
/obj/machinery/telecomms/message_server
icon = 'icons/obj/machines/research.dmi'
icon_state = "server"
name = "Messaging Server"
desc = "A machine that attempts to gather the secret knowledge of the universe."
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
id = "Messaging Server"
network = "tcommsat"
autolinkers = list("common")
var/list/datum/data_pda_msg/pda_msgs = list()
var/list/datum/data_rc_msg/rc_msgs = list()
var/decryptkey
/obj/machinery/telecomms/message_server/Initialize()
. = ..()
if (!decryptkey)
decryptkey = GenerateKey()
pda_msgs += new /datum/data_pda_msg("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.")
/obj/machinery/telecomms/message_server/Destroy()
for(var/obj/machinery/computer/message_monitor/monitor in GLOB.telecomms_list)
if(monitor.linkedServer && monitor.linkedServer == src)
monitor.linkedServer = null
. = ..()
/obj/machinery/telecomms/message_server/proc/GenerateKey()
var/newKey
newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le")
newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai")
newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
return newKey
/obj/machinery/telecomms/message_server/process()
if(toggled && (stat & (BROKEN|NOPOWER)))
toggled = FALSE
update_icon()
/obj/machinery/telecomms/message_server/receive_information(datum/signal/subspace/pda/signal, obj/machinery/telecomms/machine_from)
// can't log non-PDA signals
if(!istype(signal) || !signal.data["message"] || !toggled)
return
// log the signal
var/datum/data_pda_msg/M = new(signal.format_target(), "[signal.data["name"]] ([signal.data["job"]])", signal.data["message"], signal.data["photo"])
pda_msgs += M
signal.logged = M
// pass it along to either the hub or the broadcaster
if(!relay_information(signal, /obj/machinery/telecomms/hub))
relay_information(signal, /obj/machinery/telecomms/broadcaster)
/obj/machinery/telecomms/message_server/update_icon()
if((stat & (BROKEN|NOPOWER)))
icon_state = "server-nopower"
else if (!toggled)
icon_state = "server-off"
else
icon_state = "server-on"
// PDA signal datum
/datum/signal/subspace/pda
frequency = FREQ_COMMON
server_type = /obj/machinery/telecomms/message_server
var/datum/data_pda_msg/logged
/datum/signal/subspace/pda/New(source, data)
src.source = source
src.data = data
var/turf/T = get_turf(source)
levels = list(T.z)
/datum/signal/subspace/pda/copy()
var/datum/signal/subspace/pda/copy = new(source, data.Copy())
copy.original = src
copy.levels = levels
return copy
/datum/signal/subspace/pda/proc/format_target()
if (length(data["targets"]) > 1)
return "Everyone"
return data["targets"][1]
/datum/signal/subspace/pda/proc/format_message()
if (logged && data["photo"])
return "\"[data["message"]]\" (<a href='byond://?src=[REF(logged)];photo=1'>Photo</a>)"
return "\"[data["message"]]\""
/datum/signal/subspace/pda/broadcast()
if (!logged) // Can only go through if a message server logs it
return
for (var/obj/item/device/pda/P in GLOB.PDAs)
if ("[P.owner] ([P.ownjob])" in data["targets"])
P.receive_message(src)
// Log datums stored by the message server.
/datum/data_pda_msg
var/sender = "Unspecified"
var/recipient = "Unspecified"
var/message = "Blank" // transferred message
var/icon/photo // attached photo
/datum/data_pda_msg/New(param_rec, param_sender, param_message, param_photo)
if(param_rec)
recipient = param_rec
if(param_sender)
sender = param_sender
if(param_message)
message = param_message
if(param_photo)
photo = param_photo
/datum/data_pda_msg/Topic(href,href_list)
..()
if(href_list["photo"])
var/mob/M = usr
M << browse_rsc(photo, "pda_photo.png")
M << browse("<html><head><title>PDA Photo</title></head>" \
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
+ "<img src='pda_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' />" \
+ "</body></html>", "window=pdaphoto;size=192x192")
onclose(M, "pdaphoto")
/datum/data_rc_msg
var/rec_dpt = "Unspecified" // receiving department
var/send_dpt = "Unspecified" // sending department
var/message = "Blank"
var/stamp = "Unstamped"
var/id_auth = "Unauthenticated"
var/priority = "Normal"
/datum/data_rc_msg/New(param_rec, param_sender, param_message, param_stamp, param_id_auth, param_priority)
if(param_rec)
rec_dpt = param_rec
if(param_sender)
send_dpt = param_sender
if(param_message)
message = param_message
if(param_stamp)
stamp = param_stamp
if(param_id_auth)
id_auth = param_id_auth
if(param_priority)
switch(param_priority)
if(1)
priority = "Normal"
if(2)
priority = "High"
if(3)
priority = "Extreme"
else
priority = "Undetermined"
/*
The equivalent of the server, for PDA and request console messages.
Without it, PDA and request console messages cannot be transmitted.
PDAs require the rest of the telecomms setup, but request consoles only
require the message server.
*/
// A decorational representation of SSblackbox, usually placed alongside the message server.
/obj/machinery/blackbox_recorder
icon = 'icons/obj/stationobjs.dmi'
icon_state = "blackbox"
name = "Blackbox Recorder"
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
// The message server itself.
/obj/machinery/telecomms/message_server
icon = 'icons/obj/machines/research.dmi'
icon_state = "server"
name = "Messaging Server"
desc = "A machine that attempts to gather the secret knowledge of the universe."
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
id = "Messaging Server"
network = "tcommsat"
autolinkers = list("common")
var/list/datum/data_pda_msg/pda_msgs = list()
var/list/datum/data_rc_msg/rc_msgs = list()
var/decryptkey
/obj/machinery/telecomms/message_server/Initialize()
. = ..()
if (!decryptkey)
decryptkey = GenerateKey()
pda_msgs += new /datum/data_pda_msg("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.")
/obj/machinery/telecomms/message_server/Destroy()
for(var/obj/machinery/computer/message_monitor/monitor in GLOB.telecomms_list)
if(monitor.linkedServer && monitor.linkedServer == src)
monitor.linkedServer = null
. = ..()
/obj/machinery/telecomms/message_server/proc/GenerateKey()
var/newKey
newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le")
newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai")
newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
return newKey
/obj/machinery/telecomms/message_server/process()
if(toggled && (stat & (BROKEN|NOPOWER)))
toggled = FALSE
update_icon()
/obj/machinery/telecomms/message_server/receive_information(datum/signal/subspace/pda/signal, obj/machinery/telecomms/machine_from)
// can't log non-PDA signals
if(!istype(signal) || !signal.data["message"] || !toggled)
return
// log the signal
var/datum/data_pda_msg/M = new(signal.format_target(), "[signal.data["name"]] ([signal.data["job"]])", signal.data["message"], signal.data["photo"])
pda_msgs += M
signal.logged = M
// pass it along to either the hub or the broadcaster
if(!relay_information(signal, /obj/machinery/telecomms/hub))
relay_information(signal, /obj/machinery/telecomms/broadcaster)
/obj/machinery/telecomms/message_server/update_icon()
if((stat & (BROKEN|NOPOWER)))
icon_state = "server-nopower"
else if (!toggled)
icon_state = "server-off"
else
icon_state = "server-on"
// PDA signal datum
/datum/signal/subspace/pda
frequency = FREQ_COMMON
server_type = /obj/machinery/telecomms/message_server
var/datum/data_pda_msg/logged
/datum/signal/subspace/pda/New(source, data)
src.source = source
src.data = data
var/turf/T = get_turf(source)
levels = list(T.z)
/datum/signal/subspace/pda/copy()
var/datum/signal/subspace/pda/copy = new(source, data.Copy())
copy.original = src
copy.levels = levels
return copy
/datum/signal/subspace/pda/proc/format_target()
if (length(data["targets"]) > 1)
return "Everyone"
return data["targets"][1]
/datum/signal/subspace/pda/proc/format_message()
if (logged && data["photo"])
return "\"[data["message"]]\" (<a href='byond://?src=[REF(logged)];photo=1'>Photo</a>)"
return "\"[data["message"]]\""
/datum/signal/subspace/pda/broadcast()
if (!logged) // Can only go through if a message server logs it
return
for (var/obj/item/device/pda/P in GLOB.PDAs)
if ("[P.owner] ([P.ownjob])" in data["targets"])
P.receive_message(src)
// Log datums stored by the message server.
/datum/data_pda_msg
var/sender = "Unspecified"
var/recipient = "Unspecified"
var/message = "Blank" // transferred message
var/icon/photo // attached photo
/datum/data_pda_msg/New(param_rec, param_sender, param_message, param_photo)
if(param_rec)
recipient = param_rec
if(param_sender)
sender = param_sender
if(param_message)
message = param_message
if(param_photo)
photo = param_photo
/datum/data_pda_msg/Topic(href,href_list)
..()
if(href_list["photo"])
var/mob/M = usr
M << browse_rsc(photo, "pda_photo.png")
M << browse("<html><head><title>PDA Photo</title></head>" \
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
+ "<img src='pda_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' />" \
+ "</body></html>", "window=pdaphoto;size=192x192")
onclose(M, "pdaphoto")
/datum/data_rc_msg
var/rec_dpt = "Unspecified" // receiving department
var/send_dpt = "Unspecified" // sending department
var/message = "Blank"
var/stamp = "Unstamped"
var/id_auth = "Unauthenticated"
var/priority = "Normal"
/datum/data_rc_msg/New(param_rec, param_sender, param_message, param_stamp, param_id_auth, param_priority)
if(param_rec)
rec_dpt = param_rec
if(param_sender)
send_dpt = param_sender
if(param_message)
message = param_message
if(param_stamp)
stamp = param_stamp
if(param_id_auth)
id_auth = param_id_auth
if(param_priority)
switch(param_priority)
if(1)
priority = "Normal"
if(2)
priority = "High"
if(3)
priority = "Extreme"
else
priority = "Undetermined"
+19 -19
View File
@@ -23,7 +23,7 @@
verb_exclaim = "beeps"
max_integrity = 300
integrity_failure = 100
armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 70)
circuit = /obj/item/circuitboard/machine/vendor
var/active = 1 //No sales pitches if off!
var/vend_ready = 1 //Are we ready to vend?? Is it time??
@@ -652,7 +652,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/wirecutters = 1, /obj/item/cartridge/signal = 4)
contraband = list(/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2, /obj/item/device/assembly/health = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/coffee
@@ -714,7 +714,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/reagent_containers/food/drinks/coffee = 12,
/obj/item/tank/internals/emergency_oxygen = 6,
/obj/item/clothing/mask/breath = 6)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/cola
@@ -797,7 +797,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/cartridge/medical = 10, /obj/item/cartridge/engineering = 10, /obj/item/cartridge/security = 10,
/obj/item/cartridge/janitor = 10, /obj/item/cartridge/signal/toxins = 10, /obj/item/device/pda/heads = 10,
/obj/item/cartridge/captain = 3, /obj/item/cartridge/quartermaster = 10)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/liberationstation
@@ -814,7 +814,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/gun/ballistic/shotgun = 2, /obj/item/gun/ballistic/automatic/ar = 2)
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2, /obj/item/ammo_box/magazine/m50 = 4, /obj/item/ammo_box/magazine/m45 = 2, /obj/item/ammo_box/magazine/m75 = 2)
contraband = list(/obj/item/clothing/under/patriotsuit = 1, /obj/item/bedsheet/patriot = 3)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/cigarette
@@ -854,7 +854,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6, /obj/item/reagent_containers/pill/salbutamol = 2, /obj/item/device/healthanalyzer = 4, /obj/item/device/sensor_device = 2, /obj/item/pinpointer/crew = 2)
contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/charcoal = 6)
premium = list(/obj/item/storage/box/hug/medical = 1, /obj/item/reagent_containers/hypospray/medipen = 3, /obj/item/storage/belt/medical = 3, /obj/item/wrench/medical = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical
@@ -877,7 +877,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/pill/charcoal = 2,
/obj/item/reagent_containers/spray/medical/sterilizer = 1)
contraband = list(/obj/item/reagent_containers/pill/tox = 2, /obj/item/reagent_containers/pill/morphine = 2)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical
refill_count = 1
@@ -893,7 +893,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/reagent_containers/food/snacks/donut = 12, /obj/item/storage/box/evidence = 6, /obj/item/device/flashlight/seclite = 4, /obj/item/restraints/legcuffs/bola/energy = 7)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2)
premium = list(/obj/item/coin/antagtoken = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/security/pre_throw(obj/item/I)
@@ -915,7 +915,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/reagent_containers/glass/bottle/nutrient/ez = 30, /obj/item/reagent_containers/glass/bottle/nutrient/l4z = 20, /obj/item/reagent_containers/glass/bottle/nutrient/rh = 10, /obj/item/reagent_containers/spray/pestspray = 20,
/obj/item/reagent_containers/syringe = 5, /obj/item/storage/bag/plants = 5, /obj/item/cultivator = 3, /obj/item/shovel/spade = 3, /obj/item/device/plant_analyzer = 4)
contraband = list(/obj/item/reagent_containers/glass/bottle/ammonia = 10, /obj/item/reagent_containers/glass/bottle/diethylamine = 5)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/hydroseeds
@@ -936,7 +936,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/seeds/plump = 2, /obj/item/seeds/reishi = 2, /obj/item/seeds/cannabis = 3, /obj/item/seeds/starthistle = 2,
/obj/item/seeds/random = 2)
premium = list(/obj/item/reagent_containers/spray/waterflower = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/magivend
@@ -948,7 +948,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
products = list(/obj/item/clothing/head/wizard = 1, /obj/item/clothing/suit/wizrobe = 1, /obj/item/clothing/head/wizard/red = 1, /obj/item/clothing/suit/wizrobe/red = 1, /obj/item/clothing/head/wizard/yellow = 1, /obj/item/clothing/suit/wizrobe/yellow = 1, /obj/item/clothing/shoes/sandal/magic = 1, /obj/item/staff = 2)
contraband = list(/obj/item/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/autodrobe
@@ -1005,7 +1005,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "dinnerware"
products = list(/obj/item/storage/bag/tray = 8, /obj/item/kitchen/fork = 6, /obj/item/kitchen/knife = 6, /obj/item/kitchen/rollingpin = 2, /obj/item/reagent_containers/food/drinks/drinkingglass = 8, /obj/item/clothing/suit/apron/chef = 2, /obj/item/reagent_containers/food/condiment/pack/ketchup = 5, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 5, /obj/item/reagent_containers/food/condiment/saltshaker = 5, /obj/item/reagent_containers/food/condiment/peppermill = 5, /obj/item/reagent_containers/glass/bowl = 20)
contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/sovietsoda
@@ -1015,7 +1015,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda = 30)
contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola = 20)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/tool
@@ -1041,7 +1041,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/gloves/color/fyellow = 2)
premium = list(
/obj/item/clothing/gloves/color/yellow = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/engivend
@@ -1053,7 +1053,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/clothing/glasses/meson/engine = 2, /obj/item/device/multitool = 4, /obj/item/electronics/airlock = 10, /obj/item/electronics/apc = 10, /obj/item/electronics/airalarm = 10, /obj/item/stock_parts/cell/high = 10, /obj/item/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5, /obj/item/grenade/chem_grenade/smart_metal_foam = 10)
contraband = list(/obj/item/stock_parts/cell/potato = 3)
premium = list(/obj/item/storage/belt/utility = 3, /obj/item/storage/box/smart_metal_foam = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
//This one's from bay12
@@ -1069,7 +1069,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/stock_parts/cell = 8, /obj/item/weldingtool = 8, /obj/item/clothing/head/welding = 8,
/obj/item/light/tube = 10, /obj/item/clothing/suit/fire = 4, /obj/item/stock_parts/scanning_module = 5, /obj/item/stock_parts/micro_laser = 5,
/obj/item/stock_parts/matter_bin = 5, /obj/item/stock_parts/manipulator = 5)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
//This one's from bay12
@@ -1083,7 +1083,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3, /obj/item/device/assembly/signaler = 3, /obj/item/device/healthanalyzer = 3,
/obj/item/scalpel = 2, /obj/item/circular_saw = 2, /obj/item/tank/internals/anesthetic = 2, /obj/item/clothing/mask/breath/medical = 5,
/obj/item/screwdriver = 5, /obj/item/crowbar = 5)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
//DON'T FORGET TO CHANGE THE REFILL SIZE IF YOU CHANGE THE MACHINE'S CONTENTS!
@@ -1147,7 +1147,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/toy/katana = 10,
/obj/item/twohanded/dualsaber/toy = 5,
/obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/donksoft
@@ -1172,7 +1172,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10,
/obj/item/toy/katana = 10,
/obj/item/twohanded/dualsaber/toy = 5)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/donksoft
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/mecha/combat
force = 30
internal_damage_threshold = 50
armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
/obj/mecha/combat/moved_inside(mob/living/carbon/human/H)
if(..())
+21 -22
View File
@@ -1,22 +1,21 @@
/obj/mecha/combat/durand
desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
name = "\improper Durand"
icon_state = "durand"
step_in = 4
dir_in = 1 //Facing North.
max_integrity = 400
deflect_chance = 20
armor = list(melee = 40, bullet = 35, laser = 15, energy = 10, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 30000
infra_luminosity = 8
force = 40
wreckage = /obj/structure/mecha_wreckage/durand
/obj/mecha/combat/durand/GrantActions(mob/living/user, human_occupant = 0)
..()
defense_action.Grant(user, src)
/obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0)
..()
defense_action.Remove(user)
/obj/mecha/combat/durand
desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
name = "\improper Durand"
icon_state = "durand"
step_in = 4
dir_in = 1 //Facing North.
max_integrity = 400
deflect_chance = 20
armor = list("melee" = 40, "bullet" = 35, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 30000
infra_luminosity = 8
force = 40
wreckage = /obj/structure/mecha_wreckage/durand
/obj/mecha/combat/durand/GrantActions(mob/living/user, human_occupant = 0)
..()
defense_action.Grant(user, src)
/obj/mecha/combat/durand/RemoveActions(mob/living/user, human_occupant = 0)
..()
defense_action.Remove(user)
+2 -2
View File
@@ -6,7 +6,7 @@
dir_in = 1 //Facing North.
max_integrity = 250
deflect_chance = 5
armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 25000
infra_luminosity = 6
wreckage = /obj/structure/mecha_wreckage/gygax
@@ -20,7 +20,7 @@
icon_state = "darkgygax"
max_integrity = 300
deflect_chance = 15
armor = list(melee = 40, bullet = 40, laser = 50, energy = 35, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 35000
leg_overload_coeff = 100
operation_req_access = list(ACCESS_SYNDICATE)
+1 -1
View File
@@ -6,7 +6,7 @@
max_integrity = 140
deflect_chance = 60
internal_damage_threshold = 60
armor = list(melee = -20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = -20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 25000
infra_luminosity = 5
operation_req_access = list(ACCESS_THEATRE)
+1 -1
View File
@@ -5,7 +5,7 @@
step_in = 5
max_integrity = 500
deflect_chance = 25
armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 50, "bullet" = 55, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 60000
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
infra_luminosity = 3
+29 -30
View File
@@ -1,30 +1,29 @@
/obj/mecha/combat/phazon
desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials."
name = "\improper Phazon"
icon_state = "phazon"
step_in = 2
dir_in = 2 //Facing South.
step_energy_drain = 3
max_integrity = 200
deflect_chance = 30
armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 25000
infra_luminosity = 3
wreckage = /obj/structure/mecha_wreckage/phazon
add_req_access = 1
internal_damage_threshold = 25
force = 15
max_equip = 3
phase_state = "phazon-phase"
/obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0)
..()
switch_damtype_action.Grant(user, src)
phasing_action.Grant(user, src)
/obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0)
..()
switch_damtype_action.Remove(user)
phasing_action.Remove(user)
/obj/mecha/combat/phazon
desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials."
name = "\improper Phazon"
icon_state = "phazon"
step_in = 2
dir_in = 2 //Facing South.
step_energy_drain = 3
max_integrity = 200
deflect_chance = 30
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 25000
infra_luminosity = 3
wreckage = /obj/structure/mecha_wreckage/phazon
add_req_access = 1
internal_damage_threshold = 25
force = 15
max_equip = 3
phase_state = "phazon-phase"
/obj/mecha/combat/phazon/GrantActions(mob/living/user, human_occupant = 0)
..()
switch_damtype_action.Grant(user, src)
phasing_action.Grant(user, src)
/obj/mecha/combat/phazon/RemoveActions(mob/living/user, human_occupant = 0)
..()
switch_damtype_action.Remove(user)
phasing_action.Remove(user)
+1 -1
View File
@@ -6,7 +6,7 @@
dir_in = 1 //Facing North.
max_integrity = 100
deflect_chance = 3
armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 15000
wreckage = /obj/structure/mecha_wreckage/reticence
operation_req_access = list(ACCESS_THEATRE)
+2 -3
View File
@@ -34,7 +34,7 @@
var/overload_step_energy_drain_min = 100
max_integrity = 300 //max_integrity is base health
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 20, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
var/list/facing_modifiers = list(FRONT_ARMOUR = 1.5, SIDE_ARMOUR = 1, BACK_ARMOUR = 0.5)
var/obj/item/stock_parts/cell/cell
var/state = 0
@@ -206,8 +206,7 @@
/obj/mecha/CheckParts(list/parts_list)
..()
var/obj/item/C = locate(/obj/item/stock_parts/cell) in contents
cell = C
cell = locate(/obj/item/stock_parts/cell) in contents
var/obj/item/stock_parts/scanning_module/SM = locate() in contents
var/obj/item/stock_parts/capacitor/CP = locate() in contents
if(SM)
File diff suppressed because it is too large Load Diff
+15 -30
View File
@@ -10,9 +10,15 @@
flags_1 = CONDUCT_1
/obj/item/mecha_parts/chassis
name="Mecha Chassis"
name = "Mecha Chassis"
icon_state = "backbone"
var/datum/construction/construct
var/construct_type
/obj/item/mecha_parts/chassis/Initialize()
. = ..()
if(construct_type)
construct = new construct_type(src)
/obj/item/mecha_parts/chassis/attackby(obj/item/W, mob/user, params)
if(!construct || !construct.action(W, user))
@@ -25,10 +31,7 @@
/obj/item/mecha_parts/chassis/ripley
name = "\improper Ripley chassis"
/obj/item/mecha_parts/chassis/ripley/Initialize()
. = ..()
construct = new /datum/construction/mecha/ripley_chassis(src)
construct_type = /datum/construction/unordered/mecha_chassis/ripley
/obj/item/mecha_parts/part/ripley_torso
name = "\improper Ripley torso"
@@ -59,10 +62,7 @@
/obj/item/mecha_parts/chassis/odysseus
name = "\improper Odysseus chassis"
/obj/item/mecha_parts/chassis/odysseus/Initialize()
. = ..()
construct = new /datum/construction/mecha/odysseus_chassis(src)
construct_type = /datum/construction/unordered/mecha_chassis/odysseus
/obj/item/mecha_parts/part/odysseus_head
name = "\improper Odysseus head"
@@ -98,10 +98,7 @@
/obj/item/mecha_parts/chassis/gygax
name = "\improper Gygax chassis"
/obj/item/mecha_parts/chassis/gygax/Initialize()
. = ..()
construct = new /datum/construction/mecha/gygax_chassis(src)
construct_type = /datum/construction/unordered/mecha_chassis/gygax
/obj/item/mecha_parts/part/gygax_torso
name = "\improper Gygax torso"
@@ -144,10 +141,7 @@
/obj/item/mecha_parts/chassis/durand
name = "\improper Durand chassis"
/obj/item/mecha_parts/chassis/durand/Initialize()
. = ..()
construct = new /datum/construction/mecha/durand_chassis(src)
construct_type = /datum/construction/unordered/mecha_chassis/durand
/obj/item/mecha_parts/part/durand_torso
name = "\improper Durand torso"
@@ -188,21 +182,15 @@
////////// Firefighter
/obj/item/mecha_parts/chassis/firefighter
name = "Firefighter chassis"
/obj/item/mecha_parts/chassis/firefighter/Initialize()
. = ..()
construct = new /datum/construction/mecha/firefighter_chassis(src)
name = "\improper Firefighter chassis"
construct_type = /datum/construction/unordered/mecha_chassis/firefighter
////////// HONK
/obj/item/mecha_parts/chassis/honker
name = "\improper H.O.N.K chassis"
/obj/item/mecha_parts/chassis/honker/Initialize()
. = ..()
construct = new /datum/construction/mecha/honker_chassis(src)
construct_type = /datum/construction/unordered/mecha_chassis/honker
/obj/item/mecha_parts/part/honker_torso
name = "\improper H.O.N.K torso"
@@ -239,10 +227,7 @@
/obj/item/mecha_parts/chassis/phazon
name = "\improper Phazon chassis"
/obj/item/mecha_parts/chassis/phazon/Initialize()
. = ..()
construct = new /datum/construction/mecha/phazon_chassis(src)
construct_type = /datum/construction/unordered/mecha_chassis/phazon
/obj/item/mecha_parts/part/phazon_torso
name="\improper Phazon torso"
+2 -2
View File
@@ -9,7 +9,7 @@
max_integrity = 200
lights_power = 7
deflect_chance = 15
armor = list(melee = 40, bullet = 20, laser = 10, energy = 20, bomb = 40, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_equip = 6
wreckage = /obj/structure/mecha_wreckage/ripley
var/list/cargo = new
@@ -65,7 +65,7 @@
max_integrity = 250
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
lights_power = 7
armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_equip = 5 // More armor, less tools
wreckage = /obj/structure/mecha_wreckage/ripley/firefighter
+16 -11
View File
@@ -245,18 +245,23 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(resistance_flags & ON_FIRE)
var/mob/living/carbon/C = user
if(istype(C))
if(C.gloves && (C.gloves.max_heat_protection_temperature > 360))
extinguish()
to_chat(user, "<span class='notice'>You put out the fire on [src].</span>")
else
to_chat(user, "<span class='warning'>You burn your hand on [src]!</span>")
var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
C.update_damage_overlays()
return
else
var/can_handle_hot = FALSE
if(!istype(C))
can_handle_hot = TRUE
else if(C.gloves && (C.gloves.max_heat_protection_temperature > 360))
can_handle_hot = TRUE
else if(RESISTHOT in C.dna.species.species_traits)
can_handle_hot = TRUE
if(can_handle_hot)
extinguish()
to_chat(user, "<span class='notice'>You put out the fire on [src].</span>")
else
to_chat(user, "<span class='warning'>You burn your hand on [src]!</span>")
var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
C.update_damage_overlays()
return
if(acid_level > 20 && !ismob(loc))// so we can still remove the clothes on us that have acid.
var/mob/living/carbon/C = user
+1 -1
View File
@@ -22,7 +22,7 @@ ARCD
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=100000)
req_access_txt = "11"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/matter = 0
+1 -1
View File
@@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
throw_range = 5
w_class = WEIGHT_CLASS_NORMAL
materials = list(MAT_METAL=75000, MAT_GLASS=37500)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/working = 0
+1 -1
View File
@@ -14,7 +14,7 @@ RSF
density = FALSE
anchored = FALSE
flags_1 = NOBLUDGEON_1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
var/matter = 0
var/mode = 1
w_class = WEIGHT_CLASS_NORMAL
+1 -2
View File
@@ -146,8 +146,7 @@
/area/centcom,
/area/asteroid,
/area/tdome,
/area/wizard_station,
/area/prison
/area/wizard_station
)
for (var/type in SPECIALS)
if ( istype(A,type) )
+1 -1
View File
@@ -98,7 +98,7 @@
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
slot_flags = SLOT_ID
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/mining_points = 0 //For redeeming at mining equipment vendors
var/list/access = list()
+1 -1
View File
@@ -14,7 +14,7 @@
throwforce = 6
w_class = WEIGHT_CLASS_BULKY
actions_types = list(/datum/action/item_action/toggle_paddles)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/on = FALSE //if the paddles are equipped (1) or on the defib (0)
var/safety = TRUE //if you can zap people with the defibs on harm mode
+1 -1
View File
@@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(PDAs)
flags_1 = NOBLUDGEON_1
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_ID | SLOT_BELT
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -79,7 +79,7 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE
resistance_flags = INDESTRUCTIBLE
CanAtmosPass = ATMOS_PASS_DENSITY
armor = list(melee = 0, bullet = 25, laser = 50, energy = 50, bomb = 25, bio = 100, rad = 100, fire = 100, acid = 100)
armor = list("melee" = 0, "bullet" = 25, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
var/obj/item/device/forcefield/generator
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/device/forcefield/origin)
@@ -6,28 +6,31 @@
name = "clusterbang"
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang"
var/base_state = "clusterbang"
var/payload = /obj/item/grenade/flashbang/cluster
var/payload_spawner = /obj/effect/payload_spawner
var/prime_sound = 'sound/weapons/armbomb.ogg'
var/min_spawned = 4
var/max_spawned = 8
var/segment_chance = 35
/obj/item/grenade/clusterbuster/prime()
update_mob()
var/numspawned = rand(4,8)
var/numspawned = rand(min_spawned,max_spawned)
var/again = 0
for(var/more = numspawned,more > 0,more--)
if(prob(35))
if(prob(segment_chance))
again++
numspawned--
for(var/loop = again ,loop > 0, loop--)
new /obj/item/grenade/clusterbuster/segment(loc, payload)//Creates 'segments' that launches a few more payloads
new /obj/effect/payload_spawner(loc, payload, numspawned)//Launches payload
playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
for(var/loop in 1 to again)
new /obj/item/grenade/clusterbuster/segment(drop_location(), src)//Creates 'segments' that launches a few more payloads
new payload_spawner(drop_location(), payload, numspawned)//Launches payload
playsound(src, prime_sound, 75, 1, -3)
qdel(src)
//////////////////////
//Clusterbang segment
//////////////////////
@@ -36,38 +39,64 @@
name = "clusterbang segment"
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang_segment"
base_state = "clusterbang_segment"
/obj/item/grenade/clusterbuster/segment/New(var/loc, var/payload_type = /obj/item/grenade/flashbang/cluster)
..()
icon_state = "clusterbang_segment_active"
payload = payload_type
active = 1
/obj/item/grenade/clusterbuster/segment/Initialize(mapload, obj/item/grenade/clusterbuster/base)
. = ..()
if(base)
name = "[base.name] segment"
base_state = "[base.base_state]_segment"
icon_state = base_state
payload_spawner = base.payload_spawner
payload = base.payload
prime_sound = base.prime_sound
min_spawned = base.min_spawned
max_spawned = base.max_spawned
icon_state = "[base_state]_active"
active = TRUE
walk_away(src,loc,rand(1,4))
addtimer(CALLBACK(src, .proc/prime), rand(15,60))
/obj/item/grenade/clusterbuster/segment/prime()
new /obj/effect/payload_spawner(loc, payload, rand(4,8))
playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
new payload_spawner(drop_location(), payload, rand(min_spawned,max_spawned))
playsound(src, prime_sound, 75, 1, -3)
qdel(src)
//////////////////////////////////
//The payload spawner effect
/////////////////////////////////
/obj/effect/payload_spawner/New(var/turf/newloc,var/type, var/numspawned as num)
/obj/effect/payload_spawner/Initialize(mapload, type, numspawned)
..()
spawn_payload(type, numspawned)
return INITIALIZE_HINT_QDEL
for(var/loop = numspawned ,loop > 0, loop--)
/obj/effect/payload_spawner/proc/spawn_payload(type, numspawned)
for(var/loop in 1 to numspawned)
var/obj/item/grenade/P = new type(loc)
P.active = 1
if(istype(P))
P.active = TRUE
addtimer(CALLBACK(P, /obj/item/grenade/proc/prime), rand(15,60))
walk_away(P,loc,rand(1,4))
spawn(rand(15,60))
if(P && !QDELETED(P))
P.prime()
qdel(src)
/obj/effect/payload_spawner/random_slime
var/volatile = FALSE
/obj/effect/payload_spawner/random_slime/volatile
volatile = TRUE
/obj/item/slime_extract/proc/activate_slime()
var/list/slime_chems = list("plasma","water","blood")
for(var/i in 1 to slime_chems.len)
if(!QDELETED(src))
reagents.add_reagent(pick_n_take(slime_chems),5) //Add them in random order so we get all effects
/obj/effect/payload_spawner/random_slime/spawn_payload(type, numspawned)
for(var/loop = numspawned ,loop > 0, loop--)
var/chosen = pick(subtypesof(/obj/item/slime_extract))
var/obj/item/slime_extract/P = new chosen(loc)
if(volatile)
addtimer(CALLBACK(P, /obj/item/slime_extract/proc/activate_slime), rand(15,60))
walk_away(P,loc,rand(1,4))
//////////////////////////////////
//Custom payload clusterbusters
@@ -127,7 +156,6 @@
name = "WELCOME TO HELL"
payload = /obj/item/grenade/chem_grenade/clf3
//random clusterbuster spawner
/obj/item/grenade/clusterbuster/random
icon_state = "random_clusterbang"
@@ -136,3 +164,14 @@
var/real_type = pick(subtypesof(/obj/item/grenade/clusterbuster))
new real_type(loc)
qdel(src)
//rainbow slime effect
/obj/item/grenade/clusterbuster/slime
name = "Blorble Blorble"
icon_state = "slimebang"
base_state = "slimebang"
payload_spawner = /obj/effect/payload_spawner/random_slime
prime_sound = 'sound/effects/bubbles.ogg'
/obj/item/grenade/clusterbuster/slime/volatile
payload_spawner = /obj/effect/payload_spawner/random_slime/volatile
+1 -1
View File
@@ -36,7 +36,7 @@
throw_range = 5
materials = list(MAT_METAL=500)
breakouttime = 600 //Deciseconds = 60s = 1 minute
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/cuffsound = 'sound/weapons/handcuffs.ogg'
var/trashtype = null //for disposable cuffs
+1 -1
View File
@@ -243,7 +243,7 @@
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
if(LAZYLEN(candidates))
var/client/C = pick(candidates)
var/mob/dead/observer/C = pick(candidates)
var/mob/living/simple_animal/shade/S = new(src)
S.real_name = name
S.name = name
+3 -3
View File
@@ -26,7 +26,7 @@
flags_1 = CONDUCT_1
attack_verb = list("attacked", "stabbed", "poked")
hitsound = 'sound/weapons/bladeslice.ogg'
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/datum/reagent/forkload //used to eat omelette
/obj/item/kitchen/fork/suicide_act(mob/living/carbon/user)
@@ -70,7 +70,7 @@
materials = list(MAT_METAL=12000)
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP_ACCURATE
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/bayonet = FALSE //Can this be attached to a gun?
/obj/item/kitchen/knife/attack(mob/living/carbon/M, mob/living/carbon/user)
@@ -155,7 +155,7 @@
throwforce = 12//fuck git
materials = list()
attack_verb = list("shanked", "shivved")
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/kitchen/rollingpin
name = "rolling pin"
+1 -1
View File
@@ -2,7 +2,7 @@
hitsound_on = 'sound/weapons/blade1.ogg'
heat = 3500
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
var/brightness_on = 3
+1 -1
View File
@@ -13,7 +13,7 @@
item_state = "bulldog"
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 60, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50)
var/maxWeightClass = 20 //The max weight of items that can fit into the cannon
var/loadedWeightClass = 0 //The weight of items currently in the cannon
var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things
+1 -1
View File
@@ -11,7 +11,7 @@
throwforce = 10
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 40)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 40)
resistance_flags = FIRE_PROOF
var/click_delay = 1.5
var/fisto_setting = 1
+4 -4
View File
@@ -233,7 +233,7 @@
w_class = WEIGHT_CLASS_BULKY
slowdown = 2.0 //gotta pretend we're balanced.
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0, fire = 60, acid = 60)
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
/obj/item/clothing/suit/armor/plate/crusader/red
icon_state = "crusader-red"
@@ -247,7 +247,7 @@
icon_state = "crusader"
w_class = WEIGHT_CLASS_NORMAL
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE
armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0, fire = 60, acid = 60)
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
/obj/item/clothing/head/helmet/plate/crusader/blue
icon_state = "crusader-blue"
@@ -261,7 +261,7 @@
desc = "A religious-looking hat."
alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
flags_1 = 0
armor = list(melee = 60, bullet = 60, laser = 60, energy = 50, bomb = 70, bio = 50, rad = 50, fire = 60, acid = 60) //religion protects you from disease and radiation, honk.
armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 50, "bomb" = 70, "bio" = 50, "rad" = 50, "fire" = 60, "acid" = 60) //religion protects you from disease and radiation, honk.
worn_x_dimension = 64
worn_y_dimension = 64
@@ -320,7 +320,7 @@
desc = "Metal boots, they look heavy."
icon_state = "crusader"
w_class = WEIGHT_CLASS_NORMAL
armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0, fire = 60, acid = 60) //does this even do anything on boots?
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //does this even do anything on boots?
flags_1 = NOSLIP_1
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
@@ -397,7 +397,7 @@
if(..())
return
if(locate(/obj/item/borg/upgrade/expand, R))
if(R.hasExpanded)
to_chat(usr, "<span class='notice'>This unit already has an expand module installed!</span>")
return
@@ -417,5 +417,6 @@
R.anchored = FALSE
R.notransform = FALSE
R.resize = 2
R.hasExpanded = TRUE
R.update_transform()
return TRUE
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/shield
name = "shield"
block_chance = 50
armor = list(melee = 50, bullet = 50, laser = 50, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 80, acid = 70)
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
/obj/item/shield/riot
name = "riot shield"
+112 -112
View File
@@ -1,112 +1,112 @@
/obj/item/twohanded/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_state = "mjollnir0"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BACK
force = 5
force_unwielded = 5
force_wielded = 20
throwforce = 15
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
var/charged = 5
armor = list(melee = 50, bullet = 50, laser = 50, energy = 0, bomb = 50, bio = 0, rad = 0, fire = 100, acid = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
/obj/item/twohanded/singularityhammer/New()
..()
START_PROCESSING(SSobj, src)
/obj/item/twohanded/singularityhammer/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/twohanded/singularityhammer/process()
if(charged < 5)
charged++
return
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
return
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
for(var/atom/X in orange(5,pull))
if(ismovableatom(X))
var/atom/movable/A = X
if(A == wielder)
continue
if(A && !A.anchored && !ishuman(X))
step_towards(A,pull)
step_towards(A,pull)
step_towards(A,pull)
else if(ishuman(X))
var/mob/living/carbon/human/H = X
if(istype(H.shoes, /obj/item/clothing/shoes/magboots))
var/obj/item/clothing/shoes/magboots/M = H.shoes
if(M.magpulse)
continue
H.apply_effect(20, KNOCKDOWN, 0)
step_towards(H,pull)
step_towards(H,pull)
step_towards(H,pull)
return
/obj/item/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
if(!proximity)
return
if(wielded)
if(charged == 5)
charged = 0
if(istype(A, /mob/living/))
var/mob/living/Z = A
Z.take_bodypart_damage(20,0)
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
var/turf/target = get_turf(A)
vortex(target,user)
/obj/item/twohanded/mjollnir
name = "Mjolnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon_state = "mjollnir0"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BACK
force = 5
force_unwielded = 5
force_wielded = 25
throwforce = 30
throw_range = 7
w_class = WEIGHT_CLASS_HUGE
/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
target.Stun(60)
var/datum/effect_system/lightning_spread/s = new /datum/effect_system/lightning_spread
s.set_up(5, 1, target.loc)
s.start()
target.visible_message("<span class='danger'>[target.name] was shocked by [src]!</span>", \
"<span class='userdanger'>You feel a powerful shock course through your body sending you flying!</span>", \
"<span class='italics'>You hear a heavy electrical crack!</span>")
var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src)))
target.throw_at(throw_target, 200, 4)
return
/obj/item/twohanded/mjollnir/attack(mob/living/M, mob/user)
..()
if(wielded)
playsound(src.loc, "sparks", 50, 1)
shock(M)
/obj/item/twohanded/mjollnir/throw_impact(atom/target)
. = ..()
if(isliving(target))
shock(target)
/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
return
/obj/item/twohanded/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_state = "mjollnir0"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BACK
force = 5
force_unwielded = 5
force_wielded = 20
throwforce = 15
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
var/charged = 5
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
/obj/item/twohanded/singularityhammer/New()
..()
START_PROCESSING(SSobj, src)
/obj/item/twohanded/singularityhammer/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/twohanded/singularityhammer/process()
if(charged < 5)
charged++
return
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
return
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
for(var/atom/X in orange(5,pull))
if(ismovableatom(X))
var/atom/movable/A = X
if(A == wielder)
continue
if(A && !A.anchored && !ishuman(X))
step_towards(A,pull)
step_towards(A,pull)
step_towards(A,pull)
else if(ishuman(X))
var/mob/living/carbon/human/H = X
if(istype(H.shoes, /obj/item/clothing/shoes/magboots))
var/obj/item/clothing/shoes/magboots/M = H.shoes
if(M.magpulse)
continue
H.apply_effect(20, KNOCKDOWN, 0)
step_towards(H,pull)
step_towards(H,pull)
step_towards(H,pull)
return
/obj/item/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
if(!proximity)
return
if(wielded)
if(charged == 5)
charged = 0
if(istype(A, /mob/living/))
var/mob/living/Z = A
Z.take_bodypart_damage(20,0)
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
var/turf/target = get_turf(A)
vortex(target,user)
/obj/item/twohanded/mjollnir
name = "Mjolnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon_state = "mjollnir0"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BACK
force = 5
force_unwielded = 5
force_wielded = 25
throwforce = 30
throw_range = 7
w_class = WEIGHT_CLASS_HUGE
/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
target.Stun(60)
var/datum/effect_system/lightning_spread/s = new /datum/effect_system/lightning_spread
s.set_up(5, 1, target.loc)
s.start()
target.visible_message("<span class='danger'>[target.name] was shocked by [src]!</span>", \
"<span class='userdanger'>You feel a powerful shock course through your body sending you flying!</span>", \
"<span class='italics'>You hear a heavy electrical crack!</span>")
var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src)))
target.throw_at(throw_target, 200, 4)
return
/obj/item/twohanded/mjollnir/attack(mob/living/M, mob/user)
..()
if(wielded)
playsound(src.loc, "sparks", 50, 1)
shock(M)
/obj/item/twohanded/mjollnir/throw_impact(atom/target)
. = ..()
if(isliving(target))
shock(target)
/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
return
@@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
singular_name = "glass sheet"
icon_state = "sheet-glass"
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 100)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/glass
grind_results = list("silicon" = 20)
@@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
singular_name = "reinforced glass sheet"
icon_state = "sheet-rglass"
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 100)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/rglass
grind_results = list("silicon" = 20, "iron" = 10)
@@ -157,7 +157,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
materials = list(MAT_METAL=2000, MAT_PLASMA=2000)
throwforce = 10
flags_1 = CONDUCT_1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 80)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80)
resistance_flags = FIRE_PROOF
merge_type = /obj/item/stack/sheet/plasteel
grind_results = list("iron" = 20, "plasma" = 20)
@@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
icon_state = "sheet-wood"
icon = 'icons/obj/stack_objects.dmi'
sheettype = "wood"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/wood
novariants = TRUE
@@ -458,6 +458,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
desc = "Compress dinosaur over millions of years, then refine, split and mold, and voila! You have plastic."
singular_name = "plastic sheet"
icon_state = "sheet-plastic"
materials = list(MAT_PLASTIC=MINERAL_MATERIAL_AMOUNT)
throwforce = 7
merge_type = /obj/item/stack/sheet/plastic
@@ -206,7 +206,7 @@
flags_1 = CONDUCT_1
turf_type = /turf/open/floor/plasteel
mineralType = "metal"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
/obj/item/stack/tile/plasteel/cyborg
+1 -1
View File
@@ -42,7 +42,7 @@
flags_2 = NO_MAT_REDEMPTION_2
var/pshoom = 'sound/items/pshoom.ogg'
var/alt_sound = 'sound/items/pshoom_2.ogg'
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 60, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50)
/obj/item/storage/backpack/holding/suicide_act(mob/living/user)
+1 -1
View File
@@ -10,7 +10,7 @@
throwforce = 7
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("beaten")
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 50, bio = 0, rad = 0, fire = 80, acid = 80)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
var/stunforce = 140
var/status = 0
+1 -1
View File
@@ -13,7 +13,7 @@
throw_range = 4
materials = list(MAT_METAL = 500)
actions_types = list(/datum/action/item_action/set_internals)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 80, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 30)
var/datum/gas_mixture/air_contents = null
var/distribute_pressure = ONE_ATMOSPHERE
var/integrity = 3
+1 -1
View File
@@ -10,7 +10,7 @@
slowdown = 1
actions_types = list(/datum/action/item_action/toggle_mister)
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
var/obj/item/noz
+1 -1
View File
@@ -140,7 +140,7 @@ Frequency:
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=10000)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/list/active_portal_pairs
var/max_portal_pairs = 3
+7 -4
View File
@@ -11,11 +11,12 @@
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50)
materials = list(MAT_METAL=50)
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
tool_behaviour = TOOL_CROWBAR
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
/obj/item/crowbar/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -39,7 +40,8 @@
icon = 'icons/obj/abductor.dmi'
usesound = 'sound/weapons/sonic_jackhammer.ogg'
icon_state = "crowbar"
toolspeed = 0.1
toolspeed = 0.1
/obj/item/crowbar/large
name = "crowbar"
@@ -67,7 +69,8 @@
item_state = "jawsoflife"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
usesound = 'sound/items/jaws_pry.ogg'
force = 15
toolspeed = 0.25
+1 -1
View File
@@ -19,7 +19,7 @@
usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg')
tool_behaviour = TOOL_SCREWDRIVER
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/random_color = TRUE //if the screwdriver uses random coloring
var/static/list/screwdriver_colors = list(
"blue" = rgb(24, 97, 213),
+3 -3
View File
@@ -18,7 +18,7 @@
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
materials = list(MAT_METAL=70, MAT_GLASS=30)
@@ -357,5 +357,5 @@
if(get_fuel() < max_fuel && nextrefueltick < world.time)
nextrefueltick = world.time + 10
reagents.add_reagent("welding_fuel", 1)
#undef WELDER_FUEL_BURN_INTERVAL
#undef WELDER_FUEL_BURN_INTERVAL
+1 -1
View File
@@ -19,7 +19,7 @@
tool_behaviour = TOOL_WIRECUTTER
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/random_color = TRUE
var/static/list/wirecutter_colors = list(
"blue" = "#1861d5",
+9 -5
View File
@@ -11,11 +11,12 @@
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
usesound = 'sound/items/ratchet.ogg'
materials = list(MAT_METAL=150)
materials = list(MAT_METAL=150)
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
tool_behaviour = TOOL_WRENCH
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
/obj/item/wrench/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -40,7 +41,8 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "wrench"
usesound = 'sound/effects/empulse.ogg'
toolspeed = 0.1
toolspeed = 0.1
/obj/item/wrench/power
name = "hand drill"
@@ -50,7 +52,8 @@
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
usesound = 'sound/items/drill_use.ogg'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) //done for balance reasons, making them high value for research, but harder to get
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
//done for balance reasons, making them high value for research, but harder to get
force = 8 //might or might not be too high, subject to change
w_class = WEIGHT_CLASS_SMALL
throwforce = 8
@@ -73,7 +76,8 @@
desc = "A medical wrench with common(medical?) uses. Can be found in your hand."
icon_state = "wrench_medical"
force = 2 //MEDICAL
throwforce = 4
throwforce = 4
attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked")
/obj/item/wrench/medical/suicide_act(mob/living/user)
+1 -3
View File
@@ -42,7 +42,6 @@
icon_state = "waterballoon-e"
item_state = "balloon-empty"
/obj/item/toy/balloon/New()
create_reagents(10)
..()
@@ -287,7 +286,6 @@
w_class = WEIGHT_CLASS_SMALL
resistance_flags = FLAMMABLE
/obj/item/toy/windupToolbox
name = "windup toolbox"
desc = "A replica toolbox that rumbles when you turn the key."
@@ -334,7 +332,7 @@
/obj/item/toy/katana
name = "replica katana"
desc = "Woefully underpowered in D20."
desc = "Woefully underpowered in D20. Almost has a sharp edge."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "katana"
item_state = "katana"
+4 -4
View File
@@ -231,7 +231,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
@@ -280,7 +280,7 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 75
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
var/hacked = FALSE
var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
@@ -466,7 +466,7 @@
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
sharpness = IS_SHARP
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/obj/item/grenade/explosive = null
var/war_cry = "AAAAARGH!!!"
@@ -650,7 +650,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
/obj/item/twohanded/pitchfork/demonic
+1 -1
View File
@@ -14,7 +14,7 @@
throw_speed = 1
throw_range = 7
w_class = WEIGHT_CLASS_BULKY
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 30)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30)
var/charges = list(0, 0, 0) //how many restocking "charges" the refill has for standard/contraband/coin products
var/init_charges = list(0, 0, 0)
+3 -3
View File
@@ -11,7 +11,7 @@
throw_range = 7
attack_verb = list("banned")
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
/obj/item/banhammer/suicide_act(mob/user)
@@ -63,7 +63,7 @@
block_chance = 50
sharpness = IS_SHARP
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/item/claymore/suicide_act(mob/user)
@@ -210,7 +210,7 @@
block_chance = 50
sharpness = IS_SHARP
max_integrity = 200
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
/obj/item/katana/cursed

Some files were not shown because too many files have changed in this diff Show More