fixes merge conflict

This commit is contained in:
Kyep
2019-09-03 19:10:19 -07:00
456 changed files with 11246 additions and 4602 deletions
+12
View File
@@ -9,15 +9,27 @@ assignees: ''
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable -->
**Issue Description**:
<!---What is the problem?-->
**What did you expect to happen**:
<!--Why do you think this is an issue?-->
**What happened instead**:
<!--How is what happened different from what you expected?-->
**Why is this bad/What are the consequences**:
<!--Why do you think this is an important issue?-->
**Steps to reproduce the problem**:
<!--The most important section. Review everything you did leading up to causing the issue.-->
**When did the problem start happening**:
<!--If your report is about something that used to work but no longer does, when was the last time you remember it working?-->
**Extra information**:
<!--Anything else you can tell us.-->
+4 -4
View File
@@ -49652,8 +49652,8 @@
/obj/item/radio/intercom{
pixel_y = 28
},
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/turf/simulated/floor/plasteel{
icon_state = "vault";
dir = 8
@@ -49673,8 +49673,8 @@
},
/area/security/armoury)
"bLK" = (
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/turf/simulated/floor/plasteel{
icon_state = "vault";
dir = 8
@@ -4795,10 +4795,10 @@
/obj/structure/reagent_dispensers/peppertank{
pixel_y = 29
},
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/turf/simulated/floor/plasteel{
tag = "icon-vault (WEST)";
icon_state = "vault";
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1066,6 +1066,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 1
},
/obj/item/cultivator/rake,
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
@@ -1305,6 +1306,7 @@
dir = 8
},
/obj/structure/stone_tile/center,
/obj/item/hatchet/wooden,
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
@@ -1326,10 +1328,10 @@
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"dw" = (
/obj/item/reagent_containers/glass/bucket,
/obj/structure/stone_tile/block/cracked{
dir = 4
},
/obj/item/reagent_containers/glass/bucket/wooden,
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+4 -4
View File
@@ -13,7 +13,7 @@
/turf/unsimulated/beach/water/deep/rock_wall,
/area/awaymission/undersea)
"ae" = (
/obj/structure/ladder/dive_point/anchor{
/obj/structure/ladder/unbreakable/dive_point/anchor{
id = "pirate"
},
/turf/unsimulated/beach/water/deep/sand_floor,
@@ -217,7 +217,7 @@
/turf/unsimulated/beach/water/deep/wood_floor,
/area/awaymission/undersea)
"aU" = (
/obj/structure/ladder/dive_point/anchor,
/obj/structure/ladder/unbreakable/dive_point/anchor,
/turf/unsimulated/beach/water/deep/sand_floor,
/area/awaymission/undersea)
"aV" = (
@@ -1113,7 +1113,7 @@
/turf/unsimulated/beach/water/deep,
/area/awaymission/beach)
"dv" = (
/obj/structure/ladder/dive_point/buoy,
/obj/structure/ladder/unbreakable/dive_point/buoy,
/turf/unsimulated/beach/water/deep,
/area/awaymission/beach)
"dw" = (
@@ -1306,7 +1306,7 @@
},
/area/awaymission/beach)
"dW" = (
/obj/structure/ladder/dive_point/buoy{
/obj/structure/ladder/unbreakable/dive_point/buoy{
id = "pirate"
},
/turf/unsimulated/beach/water,
+2 -2
View File
@@ -261,7 +261,7 @@
/turf/simulated/floor/plasteel,
/area/awaymission/example)
"aH" = (
/obj/structure/ladder{
/obj/structure/ladder/unbreakable{
height = 1;
id = "example"
},
@@ -782,7 +782,7 @@
/turf/simulated/floor/plasteel,
/area/awaymission/example)
"ca" = (
/obj/structure/ladder{
/obj/structure/ladder/unbreakable{
id = "example"
},
/turf/simulated/floor/plating,
+6 -6
View File
@@ -540,7 +540,7 @@
requires_power = 0
})
"aZ" = (
/obj/structure/ladder/dive_point/anchor{
/obj/structure/ladder/unbreakable/dive_point/anchor{
id = "weirddive";
layer = 4.5
},
@@ -1996,7 +1996,7 @@
requires_power = 0
})
"dA" = (
/obj/structure/ladder/dive_point/anchor{
/obj/structure/ladder/unbreakable/dive_point/anchor{
layer = 4.5
},
/turf/unsimulated/beach/water/deep/wood_floor{
@@ -2721,8 +2721,8 @@
/turf/unsimulated/beach/water/drop,
/area/awaymission/spacehotel)
"fC" = (
/obj/structure/ladder/dive_point/buoy,
/obj/structure/ladder/dive_point/buoy{
/obj/structure/ladder/unbreakable/dive_point/buoy,
/obj/structure/ladder/unbreakable/dive_point/buoy{
id = "weirddive";
invisibility = 101
},
@@ -3465,7 +3465,7 @@
},
/area/awaymission/spacehotel)
"hG" = (
/obj/structure/ladder{
/obj/structure/ladder/unbreakable{
height = 1;
icon_state = "ladder10";
id = "service"
@@ -3525,7 +3525,7 @@
/area/awaymission/spacehotel)
"hN" = (
/obj/effect/decal/cleanable/blood/old,
/obj/structure/ladder{
/obj/structure/ladder/unbreakable{
height = 2;
icon_state = "ladder01";
id = "service"
+25 -24
View File
@@ -4055,7 +4055,7 @@
/turf/simulated/floor/plasteel,
/area/security/armoury)
"ahH" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 8
},
@@ -4155,7 +4155,7 @@
},
/area/security/brig)
"ahR" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 4
},
@@ -4324,7 +4324,7 @@
},
/area/security/brig)
"aif" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 8
},
@@ -4370,7 +4370,7 @@
},
/area/security/brig)
"aij" = (
/obj/machinery/deployable/barrier,
/obj/item/grenade/barrier,
/obj/structure/window/reinforced{
dir = 4
},
@@ -15799,7 +15799,7 @@
"aAd" = (
/obj/effect/spawner/window/reinforced,
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aAe" = (
/turf/space,
/turf/simulated/shuttle/wall{
@@ -15856,7 +15856,7 @@
tag = ""
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aAm" = (
/turf/simulated/wall/r_wall,
/area/crew_quarters/courtroom)
@@ -16579,7 +16579,7 @@
initialize_directions = 10
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aBF" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 4;
@@ -16609,7 +16609,7 @@
tag = ""
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aBG" = (
/obj/machinery/door/airlock/external{
id_tag = "s_docking_airlock";
@@ -17125,7 +17125,7 @@
/obj/effect/spawner/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/hidden,
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aCD" = (
/obj/machinery/door/airlock/external{
frequency = 1379;
@@ -17143,7 +17143,7 @@
tag = ""
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aCE" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "1"
@@ -17575,13 +17575,13 @@
d2 = 4
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aDv" = (
/turf/simulated/wall,
/area/security/lobby)
"aDw" = (
/turf/simulated/wall/r_wall,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aDx" = (
/obj/structure/sign/securearea{
desc = "A warning sign which reads 'EXTERNAL AIRLOCK'";
@@ -17598,7 +17598,7 @@
filled = 0.05
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aDy" = (
/obj/machinery/access_button{
command = "cycle_interior";
@@ -17622,7 +17622,7 @@
tag = ""
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aDz" = (
/obj/structure/rack,
/obj/item/clothing/mask/cigarette/pipe,
@@ -18153,7 +18153,7 @@
"aEC" = (
/obj/structure/chair/stool,
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aED" = (
/obj/machinery/power/terminal,
/obj/machinery/light/small{
@@ -18164,7 +18164,7 @@
icon_state = "0-8"
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aEE" = (
/obj/structure/cable{
d1 = 1;
@@ -18173,7 +18173,7 @@
tag = ""
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aEF" = (
/obj/structure/table,
/obj/item/paper_bin,
@@ -18753,7 +18753,7 @@
shock_proof = 1
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aFR" = (
/obj/structure/cable{
d2 = 8;
@@ -18763,7 +18763,7 @@
charge = 0
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aFS" = (
/obj/structure/cable{
d1 = 2;
@@ -18776,11 +18776,11 @@
icon_state = "2-4"
},
/turf/simulated/floor/plating,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aFT" = (
/obj/effect/decal/cleanable/fungus,
/turf/simulated/wall/r_wall,
/area/solar/auxport)
/area/maintenance/auxsolarport)
"aFU" = (
/obj/structure/table,
/obj/item/toy/figure/detective,
@@ -32864,8 +32864,8 @@
/obj/machinery/light{
dir = 1
},
/obj/structure/reagent_dispensers/watertank/high,
/obj/item/reagent_containers/glass/bucket,
/obj/structure/table,
/obj/machinery/smartfridge/disks,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -36338,6 +36338,7 @@
/turf/simulated/floor/carpet,
/area/crew_quarters/bar)
"bou" = (
/obj/item/reagent_containers/glass/bucket,
/obj/structure/sink{
icon_state = "sink";
dir = 8;
@@ -79987,7 +79988,7 @@
"cMF" = (
/obj/machinery/door/airlock/engineering{
name = "Engineering Checkpoint";
req_access_txt = "11"
req_one_access_txt = "11;24"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
+1 -1
View File
@@ -8742,7 +8742,7 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/glasses/hud/health/health_advanced,
/obj/item/clothing/glasses/hud/health/sunglasses,
/obj/item/clothing/glasses/hud/security/sunglasses,
/turf/unsimulated/floor{
tag = "icon-floor";
@@ -38,7 +38,7 @@
"f" = (
/obj/structure/rack,
/obj/item/clothing/head/collectable/police,
/obj/item/clothing/head/nun_hood,
/obj/item/clothing/head/hooded/nun_hood,
/obj/item/clothing/head/mailman,
/obj/item/clothing/head/nursehat,
/obj/item/clothing/head/wizard/fake,
@@ -38,7 +38,7 @@
"f" = (
/obj/structure/rack,
/obj/item/clothing/head/collectable/police,
/obj/item/clothing/head/nun_hood,
/obj/item/clothing/head/hooded/nun_hood,
/obj/item/clothing/head/mailman,
/obj/item/clothing/head/nursehat,
/obj/item/clothing/head/wizard/fake,
+3 -1
View File
@@ -19,6 +19,8 @@
// Lavaland Ruins
#include "map_files\RandomRuins\LavaRuins\lavaland_biodome_beach.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_biodome_clown_planet.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_biodome_winter.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_animal_hospital.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_ash_walker1.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_blooddrunk1.dmm"
@@ -44,7 +46,7 @@
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_syndicate_base1.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_ufo_crash.dmm"
#include "map_files\RandomRuins\LavaRuins\lavaland_surface_xeno_nest.dmm"
// Space Ruins
#include "map_files\RandomRuins\SpaceRuins\abandonedzoo.dmm"
+4 -3
View File
@@ -106,9 +106,10 @@
#define SAWN_INTACT 0
#define SAWN_OFF 1
#define WEAPON_LIGHT 0
#define WEAPON_MEDIUM 1
#define WEAPON_HEAVY 2
#define WEAPON_DUAL_WIELD 0
#define WEAPON_LIGHT 1
#define WEAPON_MEDIUM 2
#define WEAPON_HEAVY 3
#define EXPLODE_NONE 0 //Don't even ask me why we need this.
#define EXPLODE_DEVASTATE 1
+4
View File
@@ -155,6 +155,10 @@
// /mob/living/carbon signals
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
// /mob/living/simple_animal/hostile signals
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMPONENT_HOSTILE_NO_ATTACK 1
// /obj signals
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
+20 -2
View File
@@ -1,10 +1,28 @@
//tablecrafting defines
#define CAT_NONE ""
#define CAT_WEAPON "Weaponry"
#define CAT_WEAPONRY "Weaponry"
#define CAT_WEAPON "Weapons"
#define CAT_AMMO "Ammunition"
#define CAT_ROBOT "Robots"
#define CAT_FOOD "Food"
#define CAT_MISC "Misc"
#define CAT_PRIMAL "Tribal"
#define CAT_CLOTHING "Clothing"
#define CAT_FOOD "Foods"
#define CAT_BREAD "Breads"
#define CAT_BURGER "Burgers"
#define CAT_CAKE "Cakes"
#define CAT_EGG "Egg-Based Food"
#define CAT_MEAT "Meats"
#define CAT_SUSHI "Sushi"
#define CAT_MISCFOOD "Misc. Food"
#define CAT_PASTRY "Pastries"
#define CAT_PIE "Pies"
#define CAT_PIZZA "Pizzas"
#define CAT_SALAD "Salads"
#define CAT_SANDWICH "Sandwiches"
#define CAT_SOUP "Soups"
#define CAT_SPAGHETTI "Spaghettis"
#define CAT_ICE "Frozen"
#define RECIPE_MICROWAVE "Microwave"
#define RECIPE_OVEN "Oven"
+1
View File
@@ -13,6 +13,7 @@
#define CONDUCT 32 // conducts electricity (metal etc.)
#define ABSTRACT 64 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
#define ON_BORDER 128 // item has priority to check when entering or leaving
#define PREVENT_CLICK_UNDER 256
#define EARBANGPROTECT 1024
+7 -2
View File
@@ -1,6 +1,8 @@
// String identifiers for associative list lookup
#define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return
#define MUTCHK_FORCED 1
// mob/var/list/mutations
@@ -22,7 +24,6 @@
///////////////////////////////////////
// MUTATIONS
///////////////////////////////////////
// Generic mutations:
#define TK 1
#define COLDRES 2
@@ -105,6 +106,9 @@
#define NUTRITION_LEVEL_STARVING 150
#define NUTRITION_LEVEL_CURSED 0
//Used as an upper limit for species that continuously gain nutriment
#define NUTRITION_LEVEL_ALMOST_FULL 535
//Blood levels
#define BLOOD_VOLUME_MAXIMUM 2000
#define BLOOD_VOLUME_NORMAL 560
@@ -146,4 +150,5 @@
#define RESISTHOT 16
#define RESISTCOLD 17
#define NO_EXAMINE 18
#define CAN_WINGDINGS 19
#define CAN_WINGDINGS 19
#define NOZOMBIE 20
+3
View File
@@ -4,6 +4,7 @@
// Mobs
#define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna)
#define iszombie(A) (is_species(A, /datum/species/zombie))
//Simple animals
#define isshade(A) (istype(A, /mob/living/simple_animal/shade))
@@ -17,6 +18,8 @@
#define ismecha(A) (istype(A, /obj/mecha))
#define isspacepod(A) (istype(A, /obj/spacepod))
#define iseffect(A) (istype(A, /obj/effect))
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
+7 -1
View File
@@ -390,6 +390,8 @@
#define BLOODY_FOOTPRINT_BASE_ALPHA 150
#define BLOOD_GAIN_PER_STEP 100
#define BLOOD_LOSS_PER_STEP 5
#define BLOOD_LOSS_IN_SPREAD 20
#define BLOOD_AMOUNT_PER_DECAL 20
//Bloody shoe blood states
#define BLOOD_STATE_HUMAN "blood"
@@ -485,10 +487,14 @@
// Cult summon possibilities
#define SUMMON_POSSIBILITIES 3
// Dice rigged options.
#define DICE_NOT_RIGGED 1
#define DICE_BASICALLY_RIGGED 2
#define DICE_TOTALLY_RIGGED 3
// Water temperature
#define COLD_WATER_TEMPERATURE 283.15 // 10 degrees celsius
// Parallax
#define PARALLAX_DELAY_DEFAULT world.tick_lag
#define PARALLAX_DELAY_MED 1
@@ -498,4 +504,4 @@
// Engine types
#define ENGTYPE_SING "Singularity"
#define ENGTYPE_SM "Supermatter"
#define ENGTYPE_TESLA "Tesla"
#define ENGTYPE_TESLA "Tesla"
+8 -5
View File
@@ -64,11 +64,12 @@
// Factor of how fast mob nutrition decreases
#define HUNGER_FACTOR 0.1
// Taste sensitivity - the more the more reagents you'll taste
#define TASTE_SENSITIVITY_NORMAL 1
#define TASTE_SENSITIVITY_SHARP 1.5
#define TASTE_SENSITIVITY_DULL 0.75
#define TASTE_SENSITIVITY_NO_TASTE 0
// Taste sensitivity - lower is more sensitive
// Represents the minimum portion of total taste the mob can sense
#define TASTE_SENSITIVITY_NORMAL 15
#define TASTE_SENSITIVITY_SHARP 7.5
#define TASTE_SENSITIVITY_DULL 20
#define TASTE_SENSITIVITY_NO_TASTE 101
// Reagent type flags, defines the types of mobs this reagent will affect
#define ORGANIC 1
@@ -218,3 +219,5 @@
#define hasorgans(A) (ishuman(A))
#define is_admin(user) (check_rights(R_ADMIN, 0, (user)) != 0)
#define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return;
+3 -2
View File
@@ -7,8 +7,9 @@
#define SOUND_BUZZ 64
#define SOUND_INSTRUMENTS 128
#define SOUND_MENTORHELP 256
#define SOUND_DISCO 512
#define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_HEARTBEAT|SOUND_BUZZ|SOUND_INSTRUMENTS|SOUND_MENTORHELP)
#define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_HEARTBEAT|SOUND_BUZZ|SOUND_INSTRUMENTS|SOUND_MENTORHELP|SOUND_DISCO)
#define CHAT_OOC 1
#define CHAT_DEAD 2
@@ -34,7 +35,7 @@
#define AMBIENT_OCCLUSION 2097152
#define CHAT_GHOSTPDA 4194304
#define NUMPAD_TARGET 8388608
#define TOGGLES_TOTAL 16777215 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined.
#define TOGGLES_TOTAL 16777215 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined.
#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC|AMBIENT_OCCLUSION|CHAT_GHOSTPDA|NUMPAD_TARGET)
+8 -8
View File
@@ -34,14 +34,14 @@
#define WAIT_FINISH 3
//shuttle mode defines
#define SHUTTLE_IDLE 0
#define SHUTTLE_RECALL 1
#define SHUTTLE_CALL 2
#define SHUTTLE_DOCKED 3
#define SHUTTLE_STRANDED 4
#define SHUTTLE_ESCAPE 5
#define SHUTTLE_ENDGAME 6
#define SHUTTLE_IGNITING 7
#define SHUTTLE_IGNITING 0
#define SHUTTLE_IDLE 1
#define SHUTTLE_RECALL 2
#define SHUTTLE_CALL 3
#define SHUTTLE_DOCKED 4
#define SHUTTLE_STRANDED 5
#define SHUTTLE_ESCAPE 6
#define SHUTTLE_ENDGAME 7
// Shuttle return values
#define SHUTTLE_CAN_DOCK "can_dock"
+1 -5
View File
@@ -46,11 +46,7 @@
if(IS_WHITELISTED in S.species_traits)
GLOB.whitelisted_species += S.name
for(var/D in subtypesof(/datum/crafting_recipe))
var/datum/crafting_recipe/R = D
if(!initial(R.roundstart_enabled))
continue
GLOB.crafting_recipes += new R
init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes)
//Pipe list building
init_subtypes(/datum/pipes, GLOB.construction_pipe_list)
+11 -5
View File
@@ -948,10 +948,16 @@ The _flatIcons list is a cache for generated icon files.
return "#[color]"
//Imagine removing pixels from the main icon that are covered by pixels from the mask icon.
/proc/get_icon_difference(var/icon/main, var/icon/mask)
//Standard behaviour is to cut pixels from the main icon that are covered by pixels from the mask icon unless passed mask_ready, see below.
/proc/get_icon_difference(var/icon/main, var/icon/mask, var/mask_ready)
/*You should skip prep if the mask is already sprited properly. This significantly improves performance by eliminating most of the realtime icon work.
e.g. A 'ready' mask is a mask where the part you want cut out is missing (no pixels, 0 alpha) from the sprite, and everything else is solid white.*/
if(istype(main) && istype(mask))
mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white pixels.
if(!mask_ready) //Prep the mask if we're using a regular old sprite and not a special-made mask.
mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white background pixels.
main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent).
return main
return main
+26
View File
@@ -799,3 +799,29 @@ proc/dd_sortedObjectList(list/incoming)
L.Swap(start++, end--)
return L
/proc/counterlist_scale(list/L, scalar)
var/list/out = list()
for(var/key in L)
out[key] = L[key] * scalar
. = out
/proc/counterlist_sum(list/L)
. = 0
for(var/key in L)
. += L[key]
/proc/counterlist_normalise(list/L)
var/avg = counterlist_sum(L)
if(avg != 0)
. = counterlist_scale(L, 1 / avg)
else
. = L
/proc/counterlist_combine(list/L1, list/L2)
for(var/key in L2)
var/other_value = L2[key]
if(key in L1)
L1[key] += other_value
else
L1[key] = other_value
+2
View File
@@ -16,6 +16,7 @@ GLOBAL_LIST_INIT(prisoncomputer_list, list())
GLOBAL_LIST_INIT(celltimers_list, list()) // list of all cell timers
GLOBAL_LIST_INIT(cell_logs, list())
GLOBAL_LIST_INIT(navigation_computers, list())
GLOBAL_LIST_INIT(zombie_infection_list, list())
GLOBAL_LIST_INIT(all_areas, list())
GLOBAL_LIST_INIT(machines, list())
@@ -42,6 +43,7 @@ GLOBAL_LIST_INIT(global_radios, list()) //list of all radios, across all z-le
GLOBAL_LIST_INIT(meteor_list, list()) //list of all meteors
GLOBAL_LIST_INIT(poi_list, list()) //list of points of interest for observe/follow
GLOBAL_LIST_INIT(active_jammers, list()) // List of active radio jammers
GLOBAL_LIST_EMPTY(ladders)
GLOBAL_LIST_INIT(active_diseases, list()) //List of Active disease in all mobs; purely for quick referencing.
+27 -4
View File
@@ -107,6 +107,9 @@
if(next_move > world.time) // in the year 2000...
return
if(!modifiers["catcher"] && A.IsObscured())
return
if(istype(loc,/obj/mecha))
if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled
return
@@ -172,6 +175,24 @@
return
//Is the atom obscured by a PREVENT_CLICK_UNDER_1 object above it
/atom/proc/IsObscured()
if(!isturf(loc)) //This only makes sense for things directly on turfs for now
return FALSE
var/turf/T = get_turf_pixel(src)
if(!T)
return FALSE
for(var/atom/movable/AM in T)
if(AM.flags & PREVENT_CLICK_UNDER && AM.density && AM.layer > layer)
return TRUE
return FALSE
/turf/IsObscured()
for(var/atom/movable/AM in src)
if(AM.flags & PREVENT_CLICK_UNDER && AM.density)
return TRUE
return FALSE
// Default behavior: ignore double clicks, consider them normal clicks instead
/mob/proc/DblClickOn(var/atom/A, var/params)
return
@@ -399,8 +420,8 @@
dir = direction
/obj/screen/click_catcher
icon = 'icons/mob/screen_full.dmi'
icon_state = "passage0"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "catcher"
plane = CLICKCATCHER_PLANE
mouse_opacity = MOUSE_OPACITY_OPAQUE
screen_loc = "CENTER"
@@ -430,5 +451,7 @@
C.swap_hand()
else
var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr))
T.Click(location, control, params)
return 1
params += "&catcher=1"
if(T)
T.Click(location, control, params)
. = 1
+8 -1
View File
@@ -68,8 +68,14 @@ SUBSYSTEM_DEF(ticker)
current_state = GAME_STATE_PREGAME
fire() // TG says this is a good idea
if(GAME_STATE_PREGAME)
if(!going)
return
// This is so we dont have sleeps in controllers, because that is a bad, bad thing
pregame_timeleft = max(0,round_start_time - world.time)
if(!delay_end)
pregame_timeleft = max(0,round_start_time - world.time) // Normal lobby countdown when roundstart was not delayed
else
pregame_timeleft = max(0,pregame_timeleft - 20) // If roundstart was delayed, we should resume the countdown where it left off
if(pregame_timeleft <= 600 && !tipped) // 60 seconds
send_tip_of_the_round()
@@ -83,6 +89,7 @@ SUBSYSTEM_DEF(ticker)
current_state = GAME_STATE_STARTUP
Master.SetRunLevel(RUNLEVEL_LOBBY)
if(GAME_STATE_PLAYING)
delay_end = 0 // reset this in case round start was delayed
mode.process()
mode.process_job_tasks()
var/game_finished = SSshuttle.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked
+1 -16
View File
@@ -738,22 +738,7 @@
if(!istype(M))
to_chat(usr, "This can only be used on instances of type /mob")
return
to_chat(M, "Control of your mob has been offered to dead players.")
log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.")
var/minhours = input(usr, "Minimum hours required to play [M]?", "Set Min Hrs", 10) as num
message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts with [minhours] hrs playtime")
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name ? M.real_name : M.name]?", poll_time = 100, min_hours = minhours)
var/mob/dead/observer/theghost = null
if(candidates.len)
theghost = pick(candidates)
to_chat(M, "Your mob has been taken over by a ghost!")
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])")
M.ghostize()
M.key = theghost.key
else
to_chat(M, "There were no ghosts willing to take control.")
message_admins("No ghosts were willing to take control of [key_name_admin(M)])")
offer_control(M)
else if(href_list["delete"])
if(!check_rights(R_DEBUG, 0))
+3 -2
View File
@@ -59,5 +59,6 @@
if(prob(5))
affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/virusclown_hat))
affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/virusclown_hat(src), slot_wear_mask)
if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/clown_hat/nodrop))
affected_mob.unEquip(affected_mob.wear_mask, TRUE)
affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/clown_hat/nodrop(src), slot_wear_mask)
+3 -1
View File
@@ -80,6 +80,8 @@
//zealot_master is a reference to the mob that converted them into a zealot (for ease of investigation and such)
var/mob/living/carbon/human/zealot_master = null
var/list/learned_recipes //List of learned recipe TYPES.
/datum/mind/New(new_key)
key = new_key
soulOwner = src
@@ -1151,7 +1153,7 @@
A.set_zeroth_law("")
A.show_laws()
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
A.malf_picker.remove_verbs(A)
A.malf_picker.remove_malf_verbs(A)
qdel(A.malf_picker)
SSticker.mode.update_traitor_icons_removed(src)
+1 -1
View File
@@ -1127,7 +1127,7 @@
uniform = /obj/item/clothing/under/color/black
suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
back = /obj/item/storage/backpack
head = /obj/item/clothing/head/chaplain_hood
head = /obj/item/clothing/head/hooded/chaplain_hood
gloves = /obj/item/clothing/gloves/color/black
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/radio/headset/syndicate
+9 -6
View File
@@ -337,6 +337,13 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable
pipe_icon = "intake"
rpd_dispensable = TRUE
/datum/pipes/disposal/sortjunction
pipe_name = "disposals sort junction"
pipe_id = PIPE_DISPOSALS_SORT_RIGHT
orientations = 4
pipe_icon = "pipe-j1s"
rpd_dispensable = TRUE
//Pipes the RPD can't dispense. Since these don't use an interface, we don't need to bother with setting an icon. We do, however, want to name these for other purposes
/datum/pipes/atmospheric/circulator
@@ -363,12 +370,8 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable
pipe_name = "bent insulated pipe"
pipe_id = PIPE_INSULATED_BENT
/datum/pipes/disposal/sortjunction
pipe_name = "disposals sort junction"
pipe_id = PIPE_DISPOSALS_SORT_RIGHT
pipe_icon = "pipe-j1s"
/datum/pipes/disposal/sortjunction/left
/datum/pipes/disposal/left_sortjunction
pipe_name = "disposals sort junction left"
pipe_id = PIPE_DISPOSALS_SORT_LEFT
pipe_icon = "pipe-j2s"
+13
View File
@@ -12,6 +12,19 @@
Comes with a rustic wooden bar and suicidal bartender."
suffix = "lavaland_biodome_beach.dmm"
/datum/map_template/ruin/lavaland/biodome/winter
name = "Biodome Winter"
id = "biodome-winter"
description = "For those getaways where you want to get back to nature, but you don't want to leave the fortified military compound where you spend your days. \
Includes a unique(*) laser pistol display case, and the recently introduced I.C.E(tm)."
suffix = "lavaland_biodome_winter.dmm"
/datum/map_template/ruin/lavaland/biodome/clown
name = "Biodome Clown Planet"
id = "biodome-clown"
description = "WELCOME TO CLOWN PLANET! HONK HONK HONK etc.!"
suffix = "lavaland_biodome_clown_planet.dmm"
/datum/map_template/ruin/lavaland/cube
name = "The Wishgranter Cube"
id = "wishgranter-cube"
+64
View File
@@ -0,0 +1,64 @@
/obj/effect/proc_holder/spell/targeted/touch/banana
name = "Banana Touch"
desc = "A spell popular at wizard birthday parties, this spell will put on a clown costume on the target, \
stun them with a loud HONK, and mutate them to make them more entertaining! \
Warning : Effects are permanent on non-wizards."
hand_path = /obj/item/melee/touch_attack/banana
school = "transmutation"
charge_max = 300
clothes_req = 1
cooldown_min = 100 //50 deciseconds reduction per rank
action_icon_state = "clown"
/obj/item/melee/touch_attack/banana
name = "banana touch"
desc = "It's time to start clowning around."
catchphrase = "NWOLC YRGNA"
on_use_sound = 'sound/items/AirHorn.ogg'
icon_state = "banana_touch"
item_state = "banana_touch"
/obj/item/melee/touch_attack/banana/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || user.lying || user.handcuffed)
return
var/datum/effect_system/smoke_spread/s = new
s.set_up(5, 0, target)
s.start()
to_chat(user, "<font color='red' size='6'>HONK</font>")
var/mob/living/carbon/human/H = target
H.bananatouched()
..()
/mob/living/carbon/human/proc/bananatouched()
to_chat(src, "<font color='red' size='6'>HONK</font>")
Weaken(7)
Stun(7)
Stuttering(15)
do_jitter_animation(15)
if(iswizard(src) || (mind && mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE)) //Wizards get non-cursed clown robes and magical mask.
unEquip(shoes, TRUE)
unEquip(wear_mask, TRUE)
unEquip(head, TRUE)
unEquip(wear_suit, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/head/wizard/clown, slot_head, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/suit/wizrobe/clown, slot_wear_suit, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/shoes/clown_shoes/magical, slot_shoes, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clownwiz, slot_wear_mask, TRUE, TRUE)
else
qdel(shoes)
qdel(wear_mask)
qdel(w_uniform)
equip_to_slot_if_possible(new /obj/item/clothing/under/rank/clown/nodrop, slot_w_uniform, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/shoes/clown_shoes/nodrop, slot_shoes, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat/nodrop, slot_wear_mask, TRUE, TRUE)
dna.SetSEState(CLUMSYBLOCK, TRUE, TRUE)
dna.SetSEState(COMICBLOCK, TRUE, TRUE)
genemutcheck(src, CLUMSYBLOCK, null, MUTCHK_FORCED)
genemutcheck(src, COMICBLOCK, null, MUTCHK_FORCED)
if(!(iswizard(src) || (mind && mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE))) //Mutations are permanent on non-wizards. Can still be removed by genetics fuckery but not mutadone.
dna.default_blocks.Add(CLUMSYBLOCK)
dna.default_blocks.Add(COMICBLOCK)
+1 -2
View File
@@ -1,7 +1,6 @@
/obj/effect/proc_holder/spell/targeted/charge
name = "Charge"
desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user."
school = "transmutation"
charge_max = 600
clothes_req = 0
@@ -10,7 +9,7 @@
range = -1
cooldown_min = 400 //50 deciseconds reduction per rank
include_user = 1
action_icon_state = "charge"
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr)
for(var/mob/living/L in targets)
-2
View File
@@ -11,8 +11,6 @@
cooldown_min = 10 //Gun wizard
action_icon_state = "bolt_action"
/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
C.drop_item()
+54
View File
@@ -0,0 +1,54 @@
/obj/effect/proc_holder/spell/targeted/touch/mime_malaise
name = "Mime Malaise"
desc = "A spell popular with theater nerd wizards and contrarian pranksters, this spell will put on a mime costume on the target, \
stun them so that they may contemplate Art, and silence them. \
Warning : Effects are permanent on non-wizards."
hand_path = /obj/item/melee/touch_attack/mime_malaise
school = "transmutation"
charge_max = 300
clothes_req = 1
cooldown_min = 100 //50 deciseconds reduction per rank
action_icon_state = "mime"
/obj/item/melee/touch_attack/mime_malaise
name = "mime hand"
desc = "..."
catchphrase = null
on_use_sound = null
icon_state = "fleshtostone"
item_state = "fleshtostone"
/obj/item/melee/touch_attack/mime_malaise/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || user.lying || user.handcuffed)
return
var/datum/effect_system/smoke_spread/s = new
s.set_up(5, 0, target)
s.start()
var/mob/living/carbon/human/H = target
H.mimetouched()
..()
/mob/living/carbon/human/proc/mimetouched()
Weaken(7)
Stun(7)
if(iswizard(src) || (mind && mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE)) //Wizards get non-cursed mime outfit. Replace with mime robes if we add those.
unEquip(wear_mask, TRUE)
unEquip(w_uniform, TRUE)
unEquip(wear_suit, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/mime, slot_wear_mask, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/under/mime, slot_w_uniform, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/suit/suspenders, slot_wear_suit, TRUE, TRUE)
Silence(7)
else
qdel(wear_mask)
qdel(w_uniform)
qdel(wear_suit)
equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/mime/nodrop, slot_wear_mask, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/under/mime/nodrop, slot_w_uniform, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/suit/suspenders/nodrop, slot_wear_suit, TRUE, TRUE)
dna.SetSEState(MUTEBLOCK , TRUE, TRUE)
genemutcheck(src, MUTEBLOCK , null, MUTCHK_FORCED)
dna.default_blocks.Add(MUTEBLOCK)
+1
View File
@@ -72,6 +72,7 @@
/obj/effect/proc_holder/spell/noclothes
name = "No Clothes"
desc = "This always-on spell allows you to cast magic without your garments."
action_icon_state = "no_clothes"
/obj/effect/proc_holder/spell/targeted/genetic/mutate
name = "Mutate"
+12 -95
View File
@@ -45,13 +45,6 @@
duration = 10
tick_interval = 0
alert_type = /obj/screen/alert/status_effect/blooddrunk
var/last_health = 0
var/last_bruteloss = 0
var/last_fireloss = 0
var/last_toxloss = 0
var/last_oxyloss = 0
var/last_cloneloss = 0
var/last_staminaloss = 0
/obj/screen/alert/status_effect/blooddrunk
name = "Blood-Drunk"
@@ -61,108 +54,32 @@
/datum/status_effect/blooddrunk/on_apply()
. = ..()
if(.)
owner.maxHealth *= 10
owner.bruteloss *= 10
owner.fireloss *= 10
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
for(var/X in H.bodyparts)
var/obj/item/organ/external/BP = X
BP.max_damage *= 10
BP.min_broken_damage *= 10
BP.brute_dam *= 10
BP.burn_dam *= 10
owner.toxloss *= 10
owner.oxyloss *= 10
owner.cloneloss *= 10
owner.staminaloss *= 10
owner.updatehealth()
last_health = owner.health
last_bruteloss = owner.getBruteLoss()
last_fireloss = owner.getFireLoss()
last_toxloss = owner.getToxLoss()
last_oxyloss = owner.getOxyLoss()
last_cloneloss = owner.getCloneLoss()
last_staminaloss = owner.getStaminaLoss()
BP.brute_mod *= 0.1
BP.burn_mod *= 0.1
H.dna.species.tox_mod *= 0.1
H.dna.species.oxy_mod *= 0.1
H.dna.species.clone_mod *= 0.1
H.dna.species.stamina_mod *= 0.1
add_attack_logs(owner, owner, "gained blood-drunk stun immunity")
var/status = CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN
owner.status_flags &= ~status
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1)
/datum/status_effect/blooddrunk/tick() //multiply the effect of healing by 10
if(owner.health > last_health)
var/needs_health_update = FALSE
var/new_bruteloss = owner.getBruteLoss()
if(new_bruteloss < last_bruteloss)
var/heal_amount = (new_bruteloss - last_bruteloss) * 10
owner.adjustBruteLoss(heal_amount, updating_health = FALSE)
new_bruteloss = owner.getBruteLoss()
needs_health_update = TRUE
last_bruteloss = new_bruteloss
var/new_fireloss = owner.getFireLoss()
if(new_fireloss < last_fireloss)
var/heal_amount = (new_fireloss - last_fireloss) * 10
owner.adjustFireLoss(heal_amount, updating_health = FALSE)
new_fireloss = owner.getFireLoss()
needs_health_update = TRUE
last_fireloss = new_fireloss
var/new_toxloss = owner.getToxLoss()
if(new_toxloss < last_toxloss)
var/heal_amount = (new_toxloss - last_toxloss) * 10
owner.adjustToxLoss(heal_amount, updating_health = FALSE)
new_toxloss = owner.getToxLoss()
needs_health_update = TRUE
last_toxloss = new_toxloss
var/new_oxyloss = owner.getOxyLoss()
if(new_oxyloss < last_oxyloss)
var/heal_amount = (new_oxyloss - last_oxyloss) * 10
owner.adjustOxyLoss(heal_amount, updating_health = FALSE)
new_oxyloss = owner.getOxyLoss()
needs_health_update = TRUE
last_oxyloss = new_oxyloss
var/new_cloneloss = owner.getCloneLoss()
if(new_cloneloss < last_cloneloss)
var/heal_amount = (new_cloneloss - last_cloneloss) * 10
owner.adjustCloneLoss(heal_amount, updating_health = FALSE)
new_cloneloss = owner.getCloneLoss()
needs_health_update = TRUE
last_cloneloss = new_cloneloss
var/new_staminaloss = owner.getStaminaLoss()
if(new_staminaloss < last_staminaloss)
var/heal_amount = (new_staminaloss - last_staminaloss) * 10
owner.adjustStaminaLoss(heal_amount, updating_health = FALSE)
new_staminaloss = owner.getStaminaLoss()
needs_health_update = TRUE
last_staminaloss = new_staminaloss
if(needs_health_update)
owner.updatehealth()
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1)
last_health = owner.health
/datum/status_effect/blooddrunk/on_remove()
tick()
owner.maxHealth *= 0.1
owner.bruteloss *= 0.1
owner.fireloss *= 0.1
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
for(var/X in H.bodyparts)
var/obj/item/organ/external/BP = X
BP.brute_dam *= 0.1
BP.burn_dam *= 0.1
BP.max_damage /= 10
BP.min_broken_damage /= 10
owner.toxloss *= 0.1
owner.oxyloss *= 0.1
owner.cloneloss *= 0.1
owner.staminaloss *= 0.1
owner.updatehealth()
BP.brute_mod *= 10
BP.burn_mod *= 10
H.dna.species.tox_mod *= 10
H.dna.species.oxy_mod *= 10
H.dna.species.clone_mod *= 10
H.dna.species.stamina_mod *= 10
add_attack_logs(owner, owner, "lost blood-drunk stun immunity")
owner.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN
+5 -4
View File
@@ -482,10 +482,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/security/securitybarriers
name = "Security Barriers Crate"
contains = list(/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier)
contains = list(/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier)
cost = 20
containername = "security barriers crate"
@@ -1173,6 +1173,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/organic/hydroponics/seeds
name = "Seeds Crate"
contains = list(/obj/item/seeds/chili,
/obj/item/seeds/cotton,
/obj/item/seeds/berry,
/obj/item/seeds/corn,
/obj/item/seeds/eggplant,
+16
View File
@@ -190,6 +190,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
job = list("Clown")
/datum/uplink_item/stealthy_weapons/romerol_kit
name = "Romerol"
reference = "ROM"
desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
item = /obj/item/storage/box/syndie_kit/romerol
cost = 25
cant_discount = TRUE
//mime
/datum/uplink_item/jobspecific/caneshotgun
name = "Cane Shotgun and Assassination Shells"
@@ -646,6 +654,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/guardian
name = "Holoparasites"
reference = "HPA"
desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an organic host as a home base and source of fuel. \
The holoparasites are unable to incoporate themselves to changeling and vampire agents."
item = /obj/item/storage/box/syndie_kit/guardian
@@ -900,6 +909,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 3
surplus = 10
/datum/uplink_item/stealthy_weapons/false_briefcase
name = "False Bottomed Briefcase"
desc = "A modified briefcase capable of storing and firing a gun under a false bottom. Use a screwdriver to pry away the false bottom and make modifications. Distinguishable upon close examination due to the added weight."
reference = "FBBC"
item = /obj/item/storage/briefcase/false_bottomed
cost = 3
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people."
+3
View File
@@ -12,6 +12,9 @@
/area/ruin/powered/snow_biodome
icon_state = "dk_yellow"
/area/ruin/powered/snow_cabin
icon_state = "bar"
/area/ruin/powered/gluttony
icon_state = "dk_yellow"
+3
View File
@@ -328,6 +328,9 @@
/atom/proc/emag_act()
return
/atom/proc/fart_act(mob/living/M)
return FALSE
/atom/proc/rpd_act()
return
+5 -1
View File
@@ -234,14 +234,18 @@
blobber.color = blob_reagent_datum.complementary_color
blobber.overmind = src
blob_mobs.Add(blobber)
blobber.AIStatus = AI_OFF
blobber.LoseTarget()
spawn()
var/list/candidates = pollCandidates("Do you want to play as a blobbernaut?", ROLE_BLOB, 1, 150)
var/list/candidates = pollCandidates("Do you want to play as a blobbernaut?", ROLE_BLOB, 1, 100)
if(candidates.len)
var/mob/C = pick(candidates)
if(C)
blobber.key = C.key
to_chat(blobber, "<span class='biggerdanger'>You are a blobbernaut! You must assist all blob lifeforms in their mission to consume everything!</span>")
to_chat(blobber, "<span class='danger'>You heal while standing on blob structures, however you will decay slowly if you are damaged outside of the blob.</span>")
if(!blobber.ckey)
blobber.AIStatus = AI_ON
return
+1 -1
View File
@@ -303,7 +303,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling/proc/can_absorb_dna(mob/living/carbon/user, mob/living/carbon/target)
if(using_stale_dna(user))//If our current DNA is the stalest, we gotta ditch it.
to_chat(user, "<span class='warning'>We have reached our capacity to store genetic information! We must transform before absorbing more.</span>")
to_chat(user, "<span class='warning'>The DNA we are wearing is stale. Transform and try again.</span>")
return
if(!target || !target.dna)
+10 -11
View File
@@ -61,7 +61,7 @@
breakouttime = 45
weaken = 1
/obj/item/clothing/head/culthood
/obj/item/clothing/head/hooded/culthood
name = "cult hood"
icon_state = "culthood"
desc = "A hood worn by the followers of a cult."
@@ -72,7 +72,7 @@
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
/obj/item/clothing/head/culthood/alt
/obj/item/clothing/head/hooded/culthood/alt
icon_state = "cult_hoodalt"
item_state = "cult_hoodalt"
@@ -83,7 +83,7 @@
icon_state = "cultrobes"
item_state = "cultrobes"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
hoodtype = /obj/item/clothing/head/culthood
hoodtype = /obj/item/clothing/head/hooded/culthood
allowed = list(/obj/item/tome,/obj/item/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
flags_inv = HIDEJUMPSUIT
@@ -91,7 +91,7 @@
/obj/item/clothing/suit/hooded/cultrobes/alt
icon_state = "cultrobesalt"
item_state = "cultrobesalt"
hoodtype = /obj/item/clothing/head/culthood/alt
hoodtype = /obj/item/clothing/head/hooded/culthood/alt
/obj/item/clothing/head/magus
name = "magus helm"
@@ -140,15 +140,14 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/tome,/obj/item/melee/cultblade)
var/current_charges = 3
hoodtype = /obj/item/clothing/head/cult_hoodie
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
/obj/item/clothing/head/cult_hoodie
/obj/item/clothing/head/hooded/cult_hoodie
name = "empowered cultist robe"
desc = "Empowered garb which creates a powerful shield around the user."
icon_state = "cult_hoodalt"
armor = list(melee = 50, bullet = 40, laser = 50, energy = 30, bomb = 50, bio = 30, rad = 30)
body_parts_covered = HEAD
flags = NODROP
flags_inv = HIDEFACE
flags_cover = HEADCOVERSEYES
@@ -182,10 +181,10 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = -50, bullet = -50, laser = -100, energy = -50, bomb = -50, bio = -50, rad = -50)
slowdown = -1
hoodtype = /obj/item/clothing/head/berserkerhood
hoodtype = /obj/item/clothing/head/hooded/berserkerhood
/obj/item/clothing/head/berserkerhood
/obj/item/clothing/head/hooded/berserkerhood
name = "flagellant's robes"
desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
icon_state = "culthood"
@@ -349,7 +348,7 @@
force = 15
flags = NODROP | DROPDEL
/obj/item/clothing/head/culthood/alt/ghost
/obj/item/clothing/head/hooded/culthood/alt/ghost
flags = NODROP | DROPDEL
/obj/item/clothing/suit/cultrobesghost
@@ -374,5 +373,5 @@
uniform = /obj/item/clothing/under/color/black
suit = /obj/item/clothing/suit/cultrobesghost
shoes = /obj/item/clothing/shoes/cult/ghost
head = /obj/item/clothing/head/culthood/alt/ghost
head = /obj/item/clothing/head/hooded/culthood/alt/ghost
r_hand = /obj/item/melee/cultblade/ghost
File diff suppressed because it is too large Load Diff
@@ -158,9 +158,9 @@
////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
/mob/living/simple_animal/hostile/swarmer/AttackingTarget()
if(!isliving(target))
target.swarmer_act(src)
return target.swarmer_act(src)
else
..()
return ..()
/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A)
face_atom(A)
@@ -352,11 +352,11 @@
/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>We have created these for our own benefit. Aborting.</span>")
return FALSE
return FALSE
/obj/structure/shuttle/engine/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>This shuttle may be important to us later. Aborting.</span>")
return FALSE
return FALSE
////END CTRL CLICK FOR SWARMERS////
@@ -123,7 +123,7 @@
med_hud_set_health()
med_hud_set_status()
/mob/living/simple_animal/hostile/guardian/adjustHealth(amount) //The spirit is invincible, but passes on damage to the summoner
/mob/living/simple_animal/hostile/guardian/adjustHealth(amount, updating_health = TRUE) //The spirit is invincible, but passes on damage to the summoner
var/damage = amount * damage_transfer
if(summoner)
if(loc == summoner)
@@ -26,11 +26,12 @@
stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds")
/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
..()
if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
ToggleMode(1)
. = ..()
if(.)
if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
ToggleMode(1)
/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE)
. = ..()
if(. > 0 && toggle)
ToggleMode(1)
@@ -28,9 +28,9 @@
toggle = TRUE
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
..()
. = ..()
if(toggle)
if(ishuman(target) && !summoner)
if(. && ishuman(target) && !summoner)
spawn(0)
new /obj/effect/hallucination/delusion(target.loc, target, force_kind = "custom", duration = 200, skip_nearby = 0, custom_icon = icon_state, custom_icon_file = icon)
else
@@ -43,7 +43,7 @@
stat(null, "Bluespace Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds")
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
..()
. = ..()
if(toggle == TRUE)
if(loc == summoner)
to_chat(src, "<span class='danger'>You must be manifested to heal!</span>")
@@ -19,8 +19,8 @@
var/successfulshocks = 0
/mob/living/simple_animal/hostile/guardian/beam/AttackingTarget()
..()
if(isliving(target) && target != src && target != summoner)
. = ..()
if(. && isliving(target) && target != src && target != summoner)
cleardeletedchains()
for(var/chain in enemychains)
var/datum/beam/B = chain
@@ -11,10 +11,9 @@
melee_damage_upper = 10
damage_transfer = 0.9
projectiletype = /obj/item/projectile/guardian
ranged_cooldown_time = 10
ranged_cooldown_time = 1 //fast!
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
ranged = 1
rapid = 1
range = 13
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
see_in_dark = 8
@@ -19,7 +19,7 @@
battlecry = input
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
..()
. = ..()
if(iscarbon(target) && target != summoner)
if(length(battlecry) > 11)//no more then 11 letters in a battle cry.
visible_message("<span class='danger'>[src] punches [target]!</span>")
@@ -28,7 +28,7 @@
melee_damage_upper = 20
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
idle_vision_range = 1 // Only attack when target is close
vision_range = 1 // Only attack when target is close
wander = 0
attacktext = "glomps"
attack_sound = 'sound/effects/blobattack.ogg'
@@ -54,7 +54,7 @@
. = ..()
AddSpell(new /obj/effect/proc_holder/spell/targeted/smoke)
AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall)
/mob/living/simple_animal/hostile/morph/examine(mob/user)
if(morphed)
if(form)
@@ -153,7 +153,7 @@
restore()
/mob/living/simple_animal/hostile/morph/LoseAggro()
vision_range = idle_vision_range
vision_range = initial(vision_range)
/mob/living/simple_animal/hostile/morph/AIShouldSleep(var/list/possible_targets)
. = ..()
@@ -179,4 +179,4 @@
if(do_after(src, 20, target = I))
eat(I)
return
target.attack_animal(src)
return ..()
@@ -85,7 +85,7 @@
/mob/living/simple_animal/revenant/narsie_act()
return //most humans will now be either bones or harvesters, but we're still un-alive.
/mob/living/simple_animal/revenant/adjustHealth(amount)
/mob/living/simple_animal/revenant/adjustHealth(amount, updating_health = TRUE)
if(!revealed)
return
essence = max(0, essence-amount)
@@ -290,10 +290,10 @@
emote_hear = list("gaffaws", "laughs")
response_help = "hugs"
attacktext = "wildly tickles"
maxHealth = 150
health = 150
melee_damage_lower = 20
melee_damage_upper = 20
maxHealth = 175
health = 175
melee_damage_lower = 25
melee_damage_upper = 25
attack_sound = 'sound/items/bikehorn.ogg'
feast_sound = 'sound/spookoween/scary_horn2.ogg'
+5 -5
View File
@@ -66,7 +66,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
/datum/objective/assassinate/check_completion()
if(target && target.current)
if(target.current.stat == DEAD)
if(target.current.stat == DEAD || iszombie(target))
return 1
if(issilicon(target.current) || isbrain(target.current)) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
@@ -110,7 +110,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
/datum/objective/maroon/check_completion()
if(target && target.current)
if(target.current.stat == DEAD)
if(target.current.stat == DEAD || iszombie(target))
return 1
if(!target.current.ckey)
return 1
@@ -167,7 +167,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
if(!target) //If it's a free objective.
return 1
if(target.current)
if(target.current.stat == DEAD)
if(target.current.stat == DEAD || iszombie(target))
return 0
if(issilicon(target.current))
return 0
@@ -262,7 +262,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
return 0
if(isbrain(owner.current))
return 0
if(!owner.current || owner.current.stat == DEAD)
if(!owner.current || owner.current.stat == DEAD || iszombie(owner))
return 0
if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith
return 1
@@ -317,7 +317,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
explanation_text = "Die a glorious death."
/datum/objective/die/check_completion()
if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current) || iszombie(owner))
return 1
if(issilicon(owner.current) && owner.current != owner.original)
return 1
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -214,7 +214,7 @@
suit = /obj/item/clothing/suit/storage/fr_jacket
shoes = /obj/item/clothing/shoes/white
l_ear = /obj/item/radio/headset/headset_sec/alt
glasses = /obj/item/clothing/glasses/hud/health/health_advanced
glasses = /obj/item/clothing/glasses/hud/health/sunglasses
id = /obj/item/card/id/security
suit_store = /obj/item/flashlight/pen
l_hand = /obj/item/storage/firstaid/adv
+1 -1
View File
@@ -175,7 +175,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
gloves = /obj/item/clothing/gloves/combat
shoes = /obj/item/clothing/shoes/jackboots
l_ear = /obj/item/radio/headset/heads/blueshield/alt
glasses = /obj/item/clothing/glasses/hud/health/health_advanced
glasses = /obj/item/clothing/glasses/hud/health/sunglasses
id = /obj/item/card/id/nanotrasen
pda = /obj/item/pda/heads/blueshield
backpack_contents = list(
+6
View File
@@ -66,6 +66,12 @@
l_ear = /obj/item/radio/headset/headset_service
pda = /obj/item/pda/chef
/datum/outfit/job/chef/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
var/datum/martial_art/cqc/under_siege/justacook = new
justacook.teach(H)
/datum/job/hydro
+9 -5
View File
@@ -322,6 +322,9 @@
/obj/machinery/disco/proc/dance(mob/living/M) //Show your moves
set waitfor = FALSE
if(M.client && !(M.client.prefs.sound & SOUND_DISCO)) //We have a client that doesn't want to dance.
rangers -= M //Doing that here as it'll be checked less often than in processing.
return
switch(rand(0,9))
if(0 to 1)
dance2(M)
@@ -460,17 +463,18 @@
var/sound/song_played = sound(selection.song_path)
for(var/mob/M in range(10,src))
if(!(M in rangers))
rangers[M] = TRUE
M.playsound_local(get_turf(M), null, 100, channel = CHANNEL_JUKEBOX, S = song_played)
if(prob(5+(allowed(M) * 4)) && M.canmove && isliving(M))
dance(M)
if(!M.client || M.client.prefs.sound & SOUND_DISCO)
if(!(M in rangers))
rangers[M] = TRUE
M.playsound_local(get_turf(M), null, 100, channel = CHANNEL_JUKEBOX, S = song_played)
for(var/mob/L in rangers)
if(get_dist(src, L) > 10)
rangers -= L
if(!L || !L.client)
continue
L.stop_sound_channel(CHANNEL_JUKEBOX)
else if(prob(9) && L.canmove && isliving(L))
dance(L)
else if(active)
active = FALSE
STOP_PROCESSING(SSobj, src)
+210 -241
View File
@@ -1,144 +1,231 @@
/*
CONTAINS:
#define SINGLE "single"
#define VERTICAL "vertical"
#define HORIZONTAL "horizontal"
Deployable items
Barricades
#define METAL 1
#define WOOD 2
#define SAND 3
for reference:
//Barricades/cover
access_security = 1
access_brig = 2
access_armory = 3
access_forensics_lockers= 4
access_medical = 5
access_morgue = 6
access_tox = 7
access_tox_storage = 8
access_genetics = 9
access_engine = 10
access_engine_equip= 11
access_maint_tunnels = 12
access_external_airlocks = 13
access_emergency_storage = 14
access_change_ids = 15
access_ai_upload = 16
access_teleporter = 17
access_eva = 18
access_heads = 19
access_captain = 20
access_all_personal_lockers = 21
access_chapel_office = 22
access_tech_storage = 23
access_atmospherics = 24
access_bar = 25
access_janitor = 26
access_crematorium = 27
access_kitchen = 28
access_robotics = 29
access_rd = 30
access_cargo = 31
access_construction = 32
access_chemistry = 33
access_cargo_bot = 34
access_hydroponics = 35
access_manufacturing = 36
access_library = 37
access_lawyer = 38
access_virology = 39
access_cmo = 40
access_qm = 41
access_court = 42
access_clown = 43
access_mime = 44
*/
//Barricades, maybe there will be a metal one later...
/obj/structure/barricade
anchored = 1.0
density = 1.0
var/health = 100.0
var/maxhealth = 100.0
name = "chest high wall"
desc = "Looks like this would make good cover."
anchored = TRUE
density = TRUE
max_integrity = 100
var/proj_pass_rate = 50 //How many projectiles will pass the cover. Lower means stronger cover
var/bar_material = METAL
var/drop_amount = 3
var/stacktype = /obj/item/stack/sheet/metal
/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, stacktype))
if(src.health < src.maxhealth)
visible_message("<span class='warning'>[user] begins to repair the [src]!</span>")
if(do_after(user, 20 * W.toolspeed, target = src))
src.health = src.maxhealth
W:use(1)
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
return
else
return
return
else if(istype(W, /obj/item/crowbar))
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("<span class='notice'>[user] is prying apart \the [src].</span>", "<span class='notice'>You begin to pry apart \the [src].</span>")
playsound(src, W.usesound, 200, 1)
/obj/structure/barricade/blob_act(obj/structure/blob/B) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable
take_damage(400, BRUTE, "melee", 0, get_dir(src, B))
if(do_after(user, 300 * W.toolspeed, target = src) && !QDELETED(src))
user.visible_message("<span class='notice'>[user] pries apart \the [src].</span>", "<span class='notice'>You pry apart \the [src].</span>")
dismantle()
/obj/structure/barricade/ex_act(severity) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable
if(resistance_flags & INDESTRUCTIBLE)
return
else
switch(W.damtype)
if("fire")
src.health -= W.force * 1
if("brute")
src.health -= W.force * 0.75
else
if(src.health <= 0)
visible_message("<span class='danger'>\The [src] is smashed apart!</span>")
dismantle()
..()
/obj/structure/barricade/ex_act(severity)
switch(severity)
if(1.0)
visible_message("<span class='danger'>\The [src] is blown apart!</span>")
if(1)
obj_integrity = 0
qdel(src)
return
if(2.0)
src.health -= 25
if(src.health <= 0)
visible_message("<span class='danger'>\The [src] is blown apart!</span>")
dismantle()
return
if(2)
take_damage(rand(100, 250), BRUTE, "bomb", 0)
if(3)
take_damage(rand(10, 90), BRUTE, "bomb", 0)
/obj/structure/barricade/blob_act()
src.health -= 25
if(src.health <= 0)
visible_message("<span class='danger'>The blob eats through \the [src]!</span>")
qdel(src)
return
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
/obj/structure/barricade/mech_melee_attack(obj/mecha/M) //TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable
M.do_attack_animation(src)
var/play_soundeffect = 0
var/mech_damtype = M.damtype
if(M.selected)
mech_damtype = M.selected.damtype
play_soundeffect = 1
else
return 0
switch(M.damtype)
if(BRUTE)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if(BURN)
playsound(src, 'sound/items/welder.ogg', 50, 1)
if(TOX)
playsound(src, 'sound/effects/spray2.ogg', 50, 1)
return 0
else
return 0
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
return take_damage(M.force*3, mech_damtype, "melee", play_soundeffect, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs.
/obj/structure/barricade/proc/dismantle()
if(stacktype)
new stacktype(get_turf(src))
new stacktype(get_turf(src))
new stacktype(get_turf(src))
/obj/structure/barricade/deconstruct(disassembled = TRUE)
make_debris()
qdel(src)
/obj/structure/barricade/proc/make_debris()
if(stacktype)
new stacktype(get_turf(src), drop_amount)
/obj/structure/barricade/attackby(obj/item/I, mob/user, params)
if(iswelder(I) && user.a_intent != INTENT_HARM && bar_material == METAL)
var/obj/item/weldingtool/WT = I
if(obj_integrity < max_integrity)
if(WT.remove_fuel(0, user))
to_chat(user, "<span class='notice'>You begin repairing [src]...</span>")
playsound(loc, WT.usesound, 40, 1)
if(do_after(user, 40 * I.toolspeed, target = src))
obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity)
else
return ..()
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
if(locate(/obj/structure/barricade) in get_turf(mover))
return TRUE
else if(istype(mover, /obj/item/projectile))
if(!anchored)
return TRUE
var/obj/item/projectile/proj = mover
if(proj.firer && Adjacent(proj.firer))
return TRUE
if(prob(proj_pass_rate))
return TRUE
return FALSE
else
return !density
/////BARRICADE TYPES///////
/obj/structure/barricade/wooden
name = "wooden barricade"
desc = "This space is blocked off by a wooden barricade."
icon = 'icons/obj/structures.dmi'
icon_state = "woodenbarricade"
bar_material = WOOD
stacktype = /obj/item/stack/sheet/wood
burn_state = FLAMMABLE
burntime = 25
/obj/structure/barricade/wooden/attackby(obj/item/I, mob/user)
if(istype(I,/obj/item/stack/sheet/wood))
var/obj/item/stack/sheet/wood/W = I
if(W.amount < 5)
to_chat(user, "<span class='warning'>You need at least five wooden planks to make a wall!</span>")
return
else
to_chat(user, "<span class='notice'>You start adding [I] to [src]...</span>")
if(do_after(user, 50, target = src))
W.use(5)
new /turf/simulated/wall/mineral/wood/nonmetal(get_turf(src))
qdel(src)
return
return ..()
/obj/structure/barricade/wooden/crude
name = "crude plank barricade"
desc = "This space is blocked off by a crude assortment of planks."
icon_state = "woodenbarricade-old"
drop_amount = 1
max_integrity = 50
proj_pass_rate = 65
/obj/structure/barricade/wooden/crude/snow
desc = "This space is blocked off by a crude assortment of planks. It seems to be covered in a layer of snow."
icon_state = "woodenbarricade-snow-old"
max_integrity = 75
/obj/structure/barricade/sandbags
name = "sandbags"
desc = "Bags of sand. Self explanatory."
icon = 'icons/obj/smooth_structures/sandbags.dmi'
icon_state = "sandbags"
max_integrity = 280
proj_pass_rate = 20
pass_flags = LETPASSTHROW
bar_material = SAND
climbable = TRUE
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/barricade/sandbags, /turf/simulated/wall, /turf/simulated/wall/r_wall, /obj/structure/falsewall, /obj/structure/falsewall/reinforced, /turf/simulated/wall/rust, /turf/simulated/wall/r_wall/rust, /obj/structure/barricade/security)
stacktype = null
/obj/structure/barricade/security
name = "security barrier"
desc = "A deployable barrier. Provides good cover in fire fights."
icon = 'icons/obj/objects.dmi'
icon_state = "barrier0"
density = FALSE
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)
stacktype = null
var/deploy_time = 40
var/deploy_message = TRUE
/obj/structure/barricade/security/New()
..()
addtimer(CALLBACK(src, .proc/deploy), deploy_time)
/obj/structure/barricade/security/proc/deploy()
icon_state = "barrier1"
density = TRUE
anchored = TRUE
if(deploy_message)
visible_message("<span class='warning'>[src] deploys!</span>")
/obj/item/grenade/barrier
name = "barrier grenade"
desc = "Instant cover."
icon = 'icons/obj/grenade.dmi'
icon_state = "flashbang"
item_state = "flashbang"
actions_types = list(/datum/action/item_action/toggle_barrier_spread)
var/mode = SINGLE
/obj/item/grenade/barrier/examine(mob/user)
. = ..()
to_chat(user, "<span class='notice'>Alt-click to toggle modes.</span>")
/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.Adjacent(src) || user.incapacitated())
return
toggle_mode(user)
/obj/item/grenade/barrier/proc/toggle_mode(mob/user)
switch(mode)
if(SINGLE)
mode = VERTICAL
if(VERTICAL)
mode = HORIZONTAL
if(HORIZONTAL)
mode = SINGLE
to_chat(user, "[src] is now in [mode] mode.")
/obj/item/grenade/barrier/prime()
new /obj/structure/barricade/security(get_turf(loc))
switch(mode)
if(VERTICAL)
var/target_turf = get_step(src, NORTH)
if(!(is_blocked_turf(target_turf)))
new /obj/structure/barricade/security(target_turf)
var/target_turf2 = get_step(src, SOUTH)
if(!(is_blocked_turf(target_turf2)))
new /obj/structure/barricade/security(target_turf2)
if(HORIZONTAL)
var/target_turf = get_step(src, EAST)
if(!(is_blocked_turf(target_turf)))
new /obj/structure/barricade/security(target_turf)
var/target_turf2 = get_step(src, WEST)
if(!(is_blocked_turf(target_turf2)))
new /obj/structure/barricade/security(target_turf2)
qdel(src)
/obj/item/grenade/barrier/ui_action_click(mob/user)
toggle_mode(user)
/obj/structure/barricade/mime
name = "floor"
desc = "Is... this a floor?"
@@ -149,128 +236,10 @@ for reference:
/obj/structure/barricade/mime/mrcd
stacktype = null
//Actual Deployable machinery stuff
#undef SINGLE
#undef VERTICAL
#undef HORIZONTAL
/obj/machinery/deployable
name = "deployable"
desc = "deployable"
icon = 'icons/obj/objects.dmi'
req_access = list(access_security)//I'm changing this until these are properly tested./N
/obj/machinery/deployable/barrier
name = "deployable barrier"
desc = "A deployable barrier. Swipe your ID card to lock/unlock it."
icon = 'icons/obj/objects.dmi'
anchored = 0.0
density = 1.0
icon_state = "barrier0"
var/health = 100.0
var/maxhealth = 100.0
var/locked = 0.0
// req_access = list(access_maint_tunnels)
/obj/machinery/deployable/barrier/New()
..()
src.icon_state = "barrier[src.locked]"
/obj/machinery/deployable/barrier/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/card/id))
if(src.allowed(user))
if(src.emagged < 2.0)
src.locked = !src.locked
src.anchored = !src.anchored
src.icon_state = "barrier[src.locked]"
if((src.locked == 1.0) && (src.emagged < 2.0))
to_chat(user, "Barrier lock toggled on.")
return
else if((src.locked == 0.0) && (src.emagged < 2.0))
to_chat(user, "Barrier lock toggled off.")
return
else
do_sparks(2, 1, src)
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
return
return
else if(istype(W, /obj/item/wrench))
if(src.health < src.maxhealth)
src.health = src.maxhealth
src.emagged = 0
src.req_access = list(access_security)
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
return
else if(src.emagged > 0)
src.emagged = 0
src.req_access = list(access_security)
visible_message("<span class='warning'>[user] repairs the [src]!</span>")
return
return
else
switch(W.damtype)
if("fire")
src.health -= W.force * 0.75
if("brute")
src.health -= W.force * 0.5
else
if(src.health <= 0)
src.explode()
..()
/obj/machinery/deployable/barrier/emag_act(user as mob)
if(!emagged)
emagged = 1
req_access = null
to_chat(user, "You break the ID authentication lock on the [src].")
do_sparks(2, 1, src)
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
else if(src.emagged == 1)
src.emagged = 2
to_chat(user, "You short out the anchoring mechanism on the [src].")
do_sparks(2, 1, src)
visible_message("<span class='warning'>BZZzZZzZZzZT</span>")
/obj/machinery/deployable/barrier/ex_act(severity)
switch(severity)
if(1.0)
src.explode()
return
if(2.0)
src.health -= 25
if(src.health <= 0)
src.explode()
return
/obj/machinery/deployable/barrier/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
return
if(prob(50/severity))
locked = !locked
anchored = !anchored
icon_state = "barrier[src.locked]"
/obj/machinery/deployable/barrier/blob_act()
src.health -= 25
if(src.health <= 0)
src.explode()
return
/obj/machinery/deployable/barrier/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
else
return 0
/obj/machinery/deployable/barrier/proc/explode()
visible_message("<span class='danger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
/* var/obj/item/stack/rods/ =*/
new /obj/item/stack/rods(Tsec)
do_sparks(3, 1, src)
explosion(src.loc,-1,-1,0)
if(src)
qdel(src)
#undef METAL
#undef WOOD
#undef SAND
+1
View File
@@ -10,6 +10,7 @@
power_channel = ENVIRON
max_integrity = 350
armor = list(melee = 30, bullet = 30, laser = 20, energy = 20, bomb = 10, bio = 100, rad = 100)
flags = PREVENT_CLICK_UNDER
var/closingLayer = CLOSED_DOOR_LAYER
var/visible = 1
var/operating = FALSE
+1
View File
@@ -109,6 +109,7 @@
var/obj/item/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
E.power_supply.give(E.power_supply.chargerate * recharge_coeff)
E.on_recharge()
use_power(250)
using_power = TRUE
+1
View File
@@ -203,6 +203,7 @@
if(D.power_supply.charge < D.power_supply.maxcharge)
var/obj/item/ammo_casing/energy/E = D.ammo_type[D.select]
D.power_supply.give(E.e_cost)
D.on_recharge()
D.update_icon()
else
D.charge_tick = 0
+2 -2
View File
@@ -109,7 +109,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
"Mime" = "srvradio",
)
// Just command members
var/heads = list("Captain", "Head of Personnel", "Nanotrasen Representative", "Blueshield", "Chief Engineer", "Chief Medical Officer", "Research Director", "Head of Security")
var/heads = list("Captain", "Head of Personnel", "Nanotrasen Representative", "Blueshield", "Chief Engineer", "Chief Medical Officer", "Research Director", "Head of Security", "Magistrate", "AI")
// Just ERT
var/ert_jobs = list("Emergency Response Team Officer", "Emergency Response Team Engineer", "Emergency Response Team Medic", "Emergency Response Team Leader", "Emergency Response Team Member")
// Defined so code compiles and incase someone has a non-standard job
@@ -331,7 +331,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
var/job = signal.data["job"]
if((job in ert_jobs) || (job in heads))
for(var/datum/multilingual_say_piece/S in message_pieces)
S.message = "<b>[S.message]</b>"
S.message = "<b>[capitalize(S.message)]</b>" // This only capitalizes the first word
// Hacks!
// Censor dat shit like nobody's business
+91 -26
View File
@@ -10,15 +10,14 @@
var/display_color = null // Display color for vending machine listing
var/category = CAT_NORMAL // CAT_HIDDEN for contraband, CAT_COIN for premium
/datum/data/vending_product/New(var/path, var/name = null, var/amount = 1, var/price = 0, var/color = null, var/category = CAT_NORMAL)
/datum/data/vending_product/New(path, name = null, amount = 1, price = 0, color = null, category = CAT_NORMAL)
..()
product_path = path
if(!name)
var/atom/tmp = new path
product_name = initial(tmp.name)
qdel(tmp)
var/atom/temp = path
product_name = initial(temp.name)
else
product_name = name
@@ -138,7 +137,7 @@
var/category = current_list[2]
for(var/entry in current_list[1])
var/datum/data/vending_product/product = new/datum/data/vending_product(entry)
var/datum/data/vending_product/product = new /datum/data/vending_product(entry)
product.price = (entry in prices) ? prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
@@ -1191,7 +1190,7 @@
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds"
products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3, /obj/item/seeds/apple = 3, /obj/item/seeds/banana = 3, /obj/item/seeds/berry = 3,
products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3, /obj/item/seeds/apple = 3, /obj/item/seeds/cotton = 3, /obj/item/seeds/banana = 3, /obj/item/seeds/berry = 3,
/obj/item/seeds/cabbage = 3, /obj/item/seeds/carrot = 3, /obj/item/seeds/cherry = 3, /obj/item/seeds/chanter = 3,
/obj/item/seeds/chili = 3, /obj/item/seeds/cocoapod = 3, /obj/item/seeds/coffee = 3, /obj/item/seeds/comfrey =3, /obj/item/seeds/corn = 3,
/obj/item/seeds/nymph =3, /obj/item/seeds/eggplant = 3, /obj/item/seeds/grape = 3, /obj/item/seeds/grass = 3, /obj/item/seeds/lemon = 3,
@@ -1355,7 +1354,7 @@
desc = "Spare tool vending. What? Did you expect some witty description?"
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access_txt = "11" //Engineering Equipment access
req_one_access_txt = "11;24" // Engineers and atmos techs can use this
products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/multitool = 4,/obj/item/airlock_electronics = 10,/obj/item/firelock_electronics = 10,/obj/item/firealarm_electronics = 10,/obj/item/apc_electronics = 10,/obj/item/airalarm_electronics = 10,/obj/item/stock_parts/cell/high = 10,/obj/item/camera_assembly = 10)
contraband = list(/obj/item/stock_parts/cell/potato = 3)
premium = list(/obj/item/storage/belt/utility = 3)
@@ -1470,24 +1469,90 @@
product_slogans = "Dress for success!;Prepare to look swagalicious!;Look at all this free swag!;Why leave style up to fate? Use the ClothesMate!"
vend_delay = 15
vend_reply = "Thank you for using the ClothesMate!"
products = list(/obj/item/clothing/head/that=2,/obj/item/clothing/head/fedora=1,/obj/item/clothing/glasses/monocle=1,
/obj/item/clothing/under/suit_jacket/navy=2,/obj/item/clothing/under/kilt=1,/obj/item/clothing/under/overalls=1,
/obj/item/clothing/under/suit_jacket/really_black=2,/obj/item/clothing/suit/storage/lawyer/blackjacket=2,/obj/item/clothing/under/pants/jeans=3,/obj/item/clothing/under/pants/classicjeans=2,
/obj/item/clothing/under/pants/camo = 1,/obj/item/clothing/under/pants/blackjeans=2,/obj/item/clothing/under/pants/khaki=2,
/obj/item/clothing/under/pants/white=2,/obj/item/clothing/under/pants/red=1,/obj/item/clothing/under/pants/black=2,
/obj/item/clothing/under/pants/tan=2,/obj/item/clothing/under/pants/blue=1,/obj/item/clothing/under/pants/track=1,/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/accessory/scarf/red=1,/obj/item/clothing/accessory/scarf/green=1,/obj/item/clothing/accessory/scarf/darkblue=1,
/obj/item/clothing/accessory/scarf/purple=1,/obj/item/clothing/accessory/scarf/yellow=1,/obj/item/clothing/accessory/scarf/orange=1,
/obj/item/clothing/accessory/scarf/lightblue=1,/obj/item/clothing/accessory/scarf/white=1,/obj/item/clothing/accessory/scarf/black=1,
/obj/item/clothing/accessory/scarf/zebra=1,/obj/item/clothing/accessory/scarf/christmas=1,/obj/item/clothing/accessory/stripedredscarf=1,
/obj/item/clothing/accessory/stripedbluescarf=1,/obj/item/clothing/accessory/stripedgreenscarf=1,/obj/item/clothing/accessory/waistcoat=1,
/obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress = 1, /obj/item/clothing/under/sailordress = 1, /obj/item/clothing/under/redeveninggown = 1, /obj/item/clothing/under/blacktango=1,/obj/item/clothing/suit/jacket=3,
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/glasses/sunglasses/fake=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/black=4,
/obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,
/obj/item/storage/belt/fannypack=1, /obj/item/storage/belt/fannypack/blue=1, /obj/item/storage/belt/fannypack/red=1, /obj/item/clothing/suit/mantle = 2, /obj/item/clothing/suit/mantle/old = 1, /obj/item/clothing/suit/mantle/regal = 2)
contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/storage/belt/fannypack/black=1)
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/under/pants/mustangjeans=1)
products = list(/obj/item/clothing/head/that = 2,
/obj/item/clothing/head/fedora = 1,
/obj/item/clothing/glasses/monocle = 1,
/obj/item/clothing/under/suit_jacket/navy = 2,
/obj/item/clothing/under/kilt = 1,
/obj/item/clothing/under/overalls = 1,
/obj/item/clothing/under/suit_jacket/really_black = 2,
/obj/item/clothing/suit/storage/lawyer/blackjacket = 2,
/obj/item/clothing/under/pants/jeans = 3,
/obj/item/clothing/under/pants/classicjeans = 2,
/obj/item/clothing/under/pants/camo = 1,
/obj/item/clothing/under/pants/blackjeans = 2,
/obj/item/clothing/under/pants/khaki = 2,
/obj/item/clothing/under/pants/white = 2,
/obj/item/clothing/under/pants/red = 1,
/obj/item/clothing/under/pants/black = 2,
/obj/item/clothing/under/pants/tan = 2,
/obj/item/clothing/under/pants/blue = 1,
/obj/item/clothing/under/pants/track = 1,
/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/head/beanie = 3,
/obj/item/clothing/head/beanie/black = 3,
/obj/item/clothing/head/beanie/red = 3,
/obj/item/clothing/head/beanie/green = 3,
/obj/item/clothing/head/beanie/darkblue = 3,
/obj/item/clothing/head/beanie/purple = 3,
/obj/item/clothing/head/beanie/yellow = 3,
/obj/item/clothing/head/beanie/orange = 3,
/obj/item/clothing/head/beanie/cyan = 3,
/obj/item/clothing/head/beanie/christmas = 3,
/obj/item/clothing/head/beanie/striped = 3,
/obj/item/clothing/head/beanie/stripedred = 3,
/obj/item/clothing/head/beanie/stripedblue = 3,
/obj/item/clothing/head/beanie/stripedgreen = 3,
/obj/item/clothing/head/beanie/rasta = 3,
/obj/item/clothing/accessory/scarf/red = 1,
/obj/item/clothing/accessory/scarf/green = 1,
/obj/item/clothing/accessory/scarf/darkblue = 1,
/obj/item/clothing/accessory/scarf/purple = 1,
/obj/item/clothing/accessory/scarf/yellow = 1,
/obj/item/clothing/accessory/scarf/orange = 1,
/obj/item/clothing/accessory/scarf/lightblue = 1,
/obj/item/clothing/accessory/scarf/white = 1,
/obj/item/clothing/accessory/scarf/black = 1,
/obj/item/clothing/accessory/scarf/zebra = 1,
/obj/item/clothing/accessory/scarf/christmas = 1,
/obj/item/clothing/accessory/stripedredscarf = 1,
/obj/item/clothing/accessory/stripedbluescarf = 1,
/obj/item/clothing/accessory/stripedgreenscarf = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/under/sundress = 2,
/obj/item/clothing/under/stripeddress = 1,
/obj/item/clothing/under/sailordress = 1,
/obj/item/clothing/under/redeveninggown = 1,
/obj/item/clothing/under/blacktango = 1,
/obj/item/clothing/suit/jacket = 3,
/obj/item/clothing/glasses/regular = 2,
/obj/item/clothing/glasses/sunglasses_fake = 2,
/obj/item/clothing/head/sombrero = 1,
/obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/ianshirt = 1,
/obj/item/clothing/shoes/laceup = 2,
/obj/item/clothing/shoes/black = 4,
/obj/item/clothing/shoes/sandal = 1,
/obj/item/clothing/gloves/fingerless = 2,
/obj/item/storage/belt/fannypack = 1,
/obj/item/storage/belt/fannypack/blue = 1,
/obj/item/storage/belt/fannypack/red = 1,
/obj/item/clothing/suit/mantle = 2,
/obj/item/clothing/suit/mantle/old = 1,
/obj/item/clothing/suit/mantle/regal = 2)
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 1,
/obj/item/clothing/mask/balaclava = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/under/soviet = 1,
/obj/item/storage/belt/fannypack/black = 1)
premium = list(/obj/item/clothing/under/suit_jacket/checkered = 1,
/obj/item/clothing/head/mailman = 1,
/obj/item/clothing/under/rank/mailman = 1,
/obj/item/clothing/suit/jacket/leather = 1,
/obj/item/clothing/under/pants/mustangjeans = 1)
refill_canister = /obj/item/vending_refill/clothing
/obj/machinery/vending/clothing/New()
@@ -1533,7 +1598,7 @@
/obj/item/fish_eggs/electric_eel = 10, /obj/item/fish_eggs/shrimp = 5, /obj/item/toy/pet_rock = 100,
)
contraband = list(/obj/item/fish_eggs/babycarp = 5)
premium = list(/obj/item/toy/pet_rock/fred = 1, /obj/item/toy/pet_rock/roxie = 1)
premium = list(/obj/item/toy/pet_rock/fred = 1, /obj/item/toy/pet_rock/roxie = 1, /obj/item/clothing/gloves/fingerless/rapid/headpat = 1)
refill_canister = /obj/item/vending_refill/crittercare
/obj/machinery/vending/crittercare/free
@@ -3,7 +3,7 @@
desc = "It's green and acidic. It looks like... <i>blood?</i>"
icon = 'icons/effects/blood.dmi'
basecolor = "#05EE05"
bloodiness = MAX_SHOE_BLOODINESS
bloodiness = BLOOD_AMOUNT_PER_DECAL
blood_state = BLOOD_STATE_XENO
/obj/effect/decal/cleanable/blood/xeno/splatter
@@ -6,18 +6,18 @@
anchored = TRUE
var/amount = 1 //Basically moles.
/obj/effect/decal/cleanable/liquid_fuel/Initialize(newLoc, amt = 1)
/obj/effect/decal/cleanable/liquid_fuel/Initialize(mapload, amt = 1)
. = ..()
amount = amt
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
for(var/obj/effect/decal/cleanable/liquid_fuel/other in loc)
if(other != src)
other.amount += amount
spawn other.Spread()
qdel(src)
Spread()
. = ..()
/obj/effect/decal/cleanable/liquid_fuel/proc/Spread()
//Allows liquid fuels to sometimes flow into other tiles.
@@ -11,19 +11,30 @@ var/global/list/image/splatter_cache = list()
density = FALSE
anchored = TRUE
layer = TURF_LAYER
plane = GAME_PLANE
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
blood_DNA = list()
var/base_icon = 'icons/effects/blood.dmi'
var/blood_state = BLOOD_STATE_HUMAN
var/bloodiness = MAX_SHOE_BLOODINESS
bloodiness = BLOOD_AMOUNT_PER_DECAL
var/basecolor = "#A10808" // Color when wet.
var/amount = 5
var/dry_timer = 0
var/off_floor = FALSE
/obj/effect/decal/cleanable/blood/Initialize()
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
if(C.blood_DNA)
blood_DNA |= C.blood_DNA.Copy()
if(bloodiness)
if(C.bloodiness < MAX_SHOE_BLOODINESS)
C.bloodiness += bloodiness
return ..()
/obj/effect/decal/cleanable/blood/Initialize(mapload)
. = ..()
update_icon()
if(GAMEMODE_IS_CULT)
@@ -87,46 +98,6 @@ var/global/list/image/splatter_cache = list()
/obj/effect/decal/cleanable/blood/can_bloodcrawl_in()
return TRUE
//Add "bloodiness" of this blood's type, to the human's shoes
/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O, oldloc)
if(!off_floor && ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
var/hasfeet = TRUE
if(!l_foot && !r_foot)
hasfeet = FALSE
if(H.shoes && blood_state && bloodiness)
var/obj/item/clothing/shoes/S = H.shoes
var/add_blood = 0
if(bloodiness >= BLOOD_GAIN_PER_STEP)
add_blood = BLOOD_GAIN_PER_STEP
else
add_blood = bloodiness
bloodiness -= add_blood
S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS, S.bloody_shoes[blood_state] + add_blood)
if(blood_DNA && blood_DNA.len)
S.add_blood(H.blood_DNA, basecolor)
S.blood_state = blood_state
S.blood_color = basecolor
update_icon()
H.update_inv_shoes()
else if(hasfeet && blood_state && bloodiness)//Or feet
var/add_blood = 0
if(bloodiness >= BLOOD_GAIN_PER_STEP)
add_blood = BLOOD_GAIN_PER_STEP
else
add_blood = bloodiness
bloodiness -= add_blood
H.bloody_feet[blood_state] = min(MAX_SHOE_BLOODINESS, H.bloody_feet[blood_state] + add_blood)
if(!H.feet_blood_DNA)
H.feet_blood_DNA = list()
H.blood_state = blood_state
H.feet_blood_DNA |= blood_DNA.Copy()
H.feet_blood_color = basecolor
update_icon()
H.update_inv_shoes()
/obj/effect/decal/cleanable/blood/splatter
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
amount = 2
@@ -167,7 +138,7 @@ var/global/list/image/splatter_cache = list()
amount = 0
var/message
/obj/effect/decal/cleanable/blood/writing/Initialize()
/obj/effect/decal/cleanable/blood/writing/Initialize(mapload)
. = ..()
if(random_icon_states.len)
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
@@ -191,6 +162,8 @@ var/global/list/image/splatter_cache = list()
icon_state = "gibbl5"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
no_clear = TRUE
mergeable_decal = FALSE
var/fleshcolor = "#FFFFFF"
/obj/effect/decal/cleanable/blood/gibs/update_icon()
@@ -238,7 +211,7 @@ var/global/list/image/splatter_cache = list()
break
/obj/effect/decal/cleanable/blood/old/Initialize()
/obj/effect/decal/cleanable/blood/old/Initialize(mapload)
. = ..()
bloodiness = 0
dry()
@@ -246,7 +219,7 @@ var/global/list/image/splatter_cache = list()
/obj/effect/decal/cleanable/blood/old/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/blood/gibs/old/Initialize()
/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload)
. = ..()
bloodiness = 0
dry()
@@ -16,6 +16,7 @@
icon_state = "ash"
anchored = TRUE
scoop_reagents = list("ash" = 10)
mergeable_decal = FALSE
/obj/effect/decal/cleanable/dirt
name = "dirt"
@@ -30,8 +31,8 @@
smooth = SMOOTH_MORE
mouse_opacity = FALSE
/obj/effect/decal/cleanable/dirt/Initialize()
..()
/obj/effect/decal/cleanable/dirt/Initialize(mapload)
. = ..()
icon_state = ""
/obj/effect/decal/cleanable/dirt/blackpowder
@@ -55,7 +56,7 @@
desc = "It's foam."
color = "#EBEBEB"
/obj/effect/decal/cleanable/flour/foam/Initialize()
/obj/effect/decal/cleanable/flour/foam/Initialize(mapload)
. = ..()
QDEL_IN(src, 15 SECONDS)
@@ -97,6 +98,7 @@
gender = NEUTER
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
mergeable_decal = FALSE
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
@@ -173,6 +175,7 @@
density = FALSE
anchored = TRUE
layer = TURF_LAYER
plane = GAME_PLANE
icon = 'icons/effects/effects.dmi'
icon_state = "flour"
color = "#D5820B"
@@ -5,7 +5,8 @@
icon_state = "gib1"
basecolor = "#030303"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
bloodiness = MAX_SHOE_BLOODINESS
bloodiness = BLOOD_AMOUNT_PER_DECAL
mergeable_decal = FALSE
/obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in()
return FALSE
@@ -30,6 +30,7 @@ var/global/list/image/fluidtrack_cache = list()
/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O, oldloc)
..()
if(ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/clothing/shoes/S = H.shoes
@@ -40,19 +41,22 @@ var/global/list/image/fluidtrack_cache = list()
hasfeet = FALSE
if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor)
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
entered_dirs |= H.dir
if(!S.blood_DNA)
S.blood_DNA = list()
S.blood_DNA |= blood_DNA.Copy()
if(!(entered_dirs & H.dir))
entered_dirs |= H.dir
update_icon()
else if(hasfeet && H.bloody_feet[blood_state] && H.feet_blood_color == basecolor)//Or feet //This will need to be changed.
H.bloody_feet[blood_state] = max(H.bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP, 0)
entered_dirs |= H.dir
if(!H.feet_blood_DNA)
H.feet_blood_DNA = list()
H.feet_blood_DNA |= blood_DNA.Copy()
update_icon()
if(!(entered_dirs & H.dir))
entered_dirs |= H.dir
update_icon()
/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O)
..()
if(ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/clothing/shoes/S = H.shoes
@@ -63,17 +67,20 @@ var/global/list/image/fluidtrack_cache = list()
hasfeet = FALSE
if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor)
S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
exited_dirs |= H.dir
if(!S.blood_DNA)
S.blood_DNA = list()
S.blood_DNA |= blood_DNA.Copy()
if(!(exited_dirs & H.dir))
exited_dirs |= H.dir
update_icon()
else if(hasfeet && H.bloody_feet[blood_state] && H.feet_blood_color == basecolor)//Or feet
H.bloody_feet[blood_state] = max(H.bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP, 0)
exited_dirs |= H.dir
if(!H.feet_blood_DNA)
H.feet_blood_DNA = list()
H.feet_blood_DNA |= blood_DNA.Copy()
update_icon()
if(!(exited_dirs & H.dir))
exited_dirs |= H.dir
update_icon()
/obj/effect/decal/cleanable/blood/footprints/update_icon()
@@ -108,14 +115,14 @@ var/global/list/image/fluidtrack_cache = list()
if(ishuman(A))
var/mob/living/carbon/human/H = A
FP.blood_state = H.blood_state
FP.bloodiness = H.bloody_feet[H.blood_state]
FP.bloodiness = H.bloody_feet[H.blood_state] - BLOOD_LOSS_IN_SPREAD
FP.basecolor = H.feet_blood_color
if(H.blood_DNA)
FP.blood_DNA = H.blood_DNA.Copy()
else if(istype(A, /obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = A
FP.blood_state = S.blood_state
FP.bloodiness = S.bloody_shoes[S.blood_state]
FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD
FP.basecolor = S.blood_color
if(S.blood_DNA)
FP.blood_DNA = S.blood_DNA.Copy()
@@ -123,3 +130,8 @@ var/global/list/image/fluidtrack_cache = list()
FP.update_icon()
return FP
/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/blood/footprints/C)
if(blood_state != C.blood_state) //We only replace footprints of the same type as us
return
..()
+56 -2
View File
@@ -1,17 +1,71 @@
/obj/effect/decal/cleanable
anchored = TRUE
var/list/random_icon_states = list()
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one?
/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(mergeable_decal)
return TRUE
//Add "bloodiness" of this blood's type, to the human's shoes
//This is on /cleanable because fuck this ancient mess
/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O)
..()
if(!off_floor && ishuman(O))
var/mob/living/carbon/human/H = O
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
var/hasfeet = TRUE
if(!l_foot && !r_foot)
hasfeet = FALSE
if(H.shoes && blood_state && bloodiness)
var/obj/item/clothing/shoes/S = H.shoes
var/add_blood = 0
if(bloodiness >= BLOOD_GAIN_PER_STEP)
add_blood = BLOOD_GAIN_PER_STEP
else
add_blood = bloodiness
bloodiness -= add_blood
S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS, S.bloody_shoes[blood_state] + add_blood)
if(blood_DNA && blood_DNA.len)
S.add_blood(H.blood_DNA, basecolor)
S.blood_state = blood_state
S.blood_color = basecolor
update_icon()
H.update_inv_shoes()
else if(hasfeet && blood_state && bloodiness)//Or feet
var/add_blood = 0
if(bloodiness >= BLOOD_GAIN_PER_STEP)
add_blood = BLOOD_GAIN_PER_STEP
else
add_blood = bloodiness
bloodiness -= add_blood
H.bloody_feet[blood_state] = min(MAX_SHOE_BLOODINESS, H.bloody_feet[blood_state] + add_blood)
if(!H.feet_blood_DNA)
H.feet_blood_DNA = list()
H.blood_state = blood_state
H.feet_blood_DNA |= blood_DNA.Copy()
H.feet_blood_color = basecolor
update_icon()
H.update_inv_shoes()
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/New()
/obj/effect/decal/cleanable/Initialize(mapload)
. = ..()
if(loc && isturf(loc))
for(var/obj/effect/decal/cleanable/C in loc)
if(C != src && C.type == type && !QDELETED(C))
if(replace_decal(C))
qdel(src)
return
if(random_icon_states && length(src.random_icon_states) > 0)
src.icon_state = pick(src.random_icon_states)
if(smooth)
queue_smooth(src)
queue_smooth_neighbors(src)
..()
/obj/effect/decal/cleanable/Destroy()
if(smooth)
+3 -3
View File
@@ -4,12 +4,12 @@
icon = 'icons/effects/crayondecal.dmi'
icon_state = "rune1"
layer = MID_TURF_LAYER
plane = GAME_PLANE //makes the graffiti visible over a wall.
anchored = TRUE
/obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune")
..()
loc = location
/obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune")
. = ..()
name = e_name
desc = "A [name] drawn in crayon."
+1 -1
View File
@@ -79,7 +79,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
reagents.reaction(A)
if(istype(A,/atom/movable))
var/atom/movable/AM = A
AM.water_act(life, 310.15, src)
AM.water_act(life, COLD_WATER_TEMPERATURE, src)
return ..()
@@ -21,7 +21,7 @@
reagents.reaction(A)
if(istype(A,/atom/movable))
var/atom/movable/AM = A
AM.water_act(life, 310.15, src)
AM.water_act(life, COLD_WATER_TEMPERATURE, src)
return ..()
/////////////////////////////////////////////
@@ -140,6 +140,15 @@
..()
animate(src, alpha = 0, time = duration)
/obj/effect/temp_visual/decoy/fading/threesecond
duration = 40
/obj/effect/temp_visual/decoy/fading/fivesecond
duration = 50
/obj/effect/temp_visual/decoy/fading/halfsecond
duration = 5
/obj/effect/temp_visual/fire
icon = 'icons/goonstation/effects/fire.dmi'
icon_state = "3"
+1
View File
@@ -87,6 +87,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
If index term exists and icon_override is not set, this sprite sheet will be used.
*/
var/list/sprite_sheets = null
var/list/sprite_sheets_inhand = null //Used to override inhand items. Use a single .dmi and suffix the icon states inside with _l and _r for each hand.
var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc.
var/sprite_sheets_obj = null //Used to override hardcoded clothing inventory object dmis in human clothing proc.
+2 -2
View File
@@ -18,8 +18,8 @@
/obj/effect/decal/cleanable/random
name = "Random Mess"
/obj/effect/decal/cleanable/random/New()
..()
/obj/effect/decal/cleanable/random/Initialize(mapload)
. = ..()
var/list/list = subtypesof(/obj/effect/decal/cleanable) - list(/obj/effect/decal/cleanable/random,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2)
var/T = pick(list)
new T(loc)
+18
View File
@@ -123,6 +123,19 @@
origin_tech = "biotech=2"
stop_bleeding = 1800
/obj/item/stack/medical/bruise_pack/attackby(obj/item/I, mob/user, params)
if(I.sharp)
if(get_amount() < 2)
to_chat(user, "<span class='warning'>You need at least two gauzes to do this!</span>")
return
new /obj/item/stack/sheet/cloth(user.drop_location())
user.visible_message("[user] cuts [src] into pieces of cloth with [I].", \
"<span class='notice'>You cut [src] into pieces of cloth with [I].</span>", \
"<span class='italics'>You hear cutting.</span>")
use(2)
else
return ..()
/obj/item/stack/medical/bruise_pack/attack(mob/living/M, mob/user)
if(..())
return 1
@@ -145,6 +158,11 @@
else
to_chat(user, "<span class='warning'>[affecting] is cut open, you'll need more than a bandage!</span>")
/obj/item/stack/medical/bruise_pack/improvised
name = "improvised gauze"
singular_name = "improvised gauze"
desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds."
stop_bleeding = 900
/obj/item/stack/medical/bruise_pack/advanced
name = "advanced trauma kit"
@@ -137,6 +137,44 @@ var/global/list/datum/stack_recipe/snow_recipes = list(
..()
recipes = sandstone_recipes
/*
* Sandbags
*/
/obj/item/stack/sheet/mineral/sandbags
name = "sandbags"
icon_state = "sandbags"
singular_name = "sandbag"
layer = LOW_ITEM_LAYER
merge_type = /obj/item/stack/sheet/mineral/sandbags
GLOBAL_LIST_INIT(sandbag_recipes, list ( \
new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 25, one_per_turf = 1, on_floor = 1), \
))
/obj/item/stack/sheet/mineral/sandbags/New()
recipes = GLOB.sandbag_recipes
..()
/obj/item/emptysandbag
name = "empty sandbag"
desc = "A bag to be filled with sand."
icon = 'icons/obj/items.dmi'
icon_state = "sandbag"
w_class = WEIGHT_CLASS_TINY
/obj/item/emptysandbag/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/ore/glass))
var/obj/item/stack/ore/glass/G = I
to_chat(user, "<span class='notice'>You fill the sandbag.</span>")
var/obj/item/stack/sheet/mineral/sandbags/S = new /obj/item/stack/sheet/mineral/sandbags(drop_location())
qdel(src)
if(Adjacent(user) && !issilicon(user))
user.put_in_hands(S)
G.use(1)
else
return ..()
/obj/item/stack/sheet/mineral/diamond
name = "diamond"
icon_state = "sheet-diamond"
@@ -182,6 +182,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 10),
new /datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),
new /datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50),
new /datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 100)
)
@@ -204,8 +205,9 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
* Cloth
*/
var/global/list/datum/stack_recipe/cloth_recipes = list ( \
new/datum/stack_recipe("grey jumpsuit", /obj/item/clothing/under/color/grey, 3), \
new/datum/stack_recipe("black shoes", /obj/item/clothing/shoes/black, 2), \
new/datum/stack_recipe("white jumpsuit", /obj/item/clothing/under/color/white, 3), \
new/datum/stack_recipe("white shoes", /obj/item/clothing/shoes/white, 2), \
new/datum/stack_recipe("white scarf", /obj/item/clothing/accessory/scarf/white, 1), \
null, \
new/datum/stack_recipe("backpack", /obj/item/storage/backpack, 4), \
new/datum/stack_recipe("dufflebag", /obj/item/storage/backpack/duffel, 6), \
@@ -216,11 +218,15 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \
new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \
null, \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/bruise_pack/improvised, 1, 2, 6), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
null, \
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 3), \
new/datum/stack_recipe("white softcap", /obj/item/clothing/head/soft/mime, 2), \
new/datum/stack_recipe("white beanie", /obj/item/clothing/head/beanie, 2), \
null, \
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 3), \
)
@@ -243,6 +249,49 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
/obj/item/stack/sheet/cloth/ten
amount = 10
GLOBAL_LIST_INIT(durathread_recipes, list ( \
new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/misc/durathread, 4, time = 40),
new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \
))
/obj/item/stack/sheet/durathread
name = "durathread"
desc = "A fabric sown from incredibly durable threads, known for its usefulness in armor production."
singular_name = "durathread roll"
icon_state = "sheet-durathread"
item_state = "sheet-cloth"
resistance_flags = FLAMMABLE
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/durathread
/obj/item/stack/sheet/durathread/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.durathread_recipes
return ..()
/obj/item/stack/sheet/cotton
name = "raw cotton bundle"
desc = "A bundle of raw cotton ready to be spun on the loom."
singular_name = "raw cotton ball"
icon_state = "sheet-cotton"
resistance_flags = FLAMMABLE
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cotton
var/pull_effort = 30
var/loom_result = /obj/item/stack/sheet/cloth
/obj/item/stack/sheet/cotton/durathread
name = "raw durathread bundle"
desc = "A bundle of raw durathread ready to be spun on the loom."
singular_name = "raw durathread ball"
icon_state = "sheet-durathreadraw"
merge_type = /obj/item/stack/sheet/cotton/durathread
pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
/*
* Cardboard
*/
+1 -1
View File
@@ -299,7 +299,7 @@
/obj/effect/decal/cleanable/ash/snappop_phoenix
var/respawn_time = 300
/obj/effect/decal/cleanable/ash/snappop_phoenix/New()
/obj/effect/decal/cleanable/ash/snappop_phoenix/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src, .proc/respawn), respawn_time)
@@ -145,7 +145,8 @@
/obj/item/stack/packageWrap = 8,
/obj/item/pipe = 2)
time = 300
category = CAT_WEAPON
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/obj/item/pneumatic_cannon/proc/updateTank(obj/item/tank/thetank, removing = 0, mob/living/carbon/human/user)
if(removing)
@@ -14,6 +14,15 @@
user.dust()
return OBLITERATION
/obj/item/storage/bible/fart_act(mob/living/M)
if(QDELETED(M) || M.stat == DEAD)
return
M.visible_message("<span class='danger'>[M] farts on \the [name]!</span>")
M.visible_message("<span class='userdanger'>A mysterious force smites [M]!</span>")
M.suiciding = TRUE
do_sparks(3, 1, M)
M.gib()
return TRUE // Don't run the fart emote
/obj/item/storage/bible/booze
name = "bible"
@@ -1059,6 +1059,15 @@
desc = "A colorful cardboard box for the clown"
icon_state = "box_clown"
/obj/item/storage/box/emptysandbags
name = "box of empty sandbags"
/obj/item/storage/box/emptysandbags/New()
..()
contents = list()
for(var/i in 1 to 7)
new /obj/item/emptysandbag(src)
/obj/item/storage/box/rndboards
name = "the Liberator's legacy"
desc = "A box containing a gift for worthy golems."
@@ -5,7 +5,7 @@
item_state = "briefcase"
flags = CONDUCT
hitsound = "swing_hit"
force = 8.0
force = 8
throw_speed = 2
throw_range = 4
w_class = WEIGHT_CLASS_BULKY
@@ -20,10 +20,69 @@
force = 10
/obj/item/storage/briefcase/sniperbundle/New()
..()
..()
new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate(src)
new /obj/item/clothing/accessory/red(src)
new /obj/item/clothing/under/syndicate/sniper(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/suppressor/specialoffer(src)
new /obj/item/suppressor/specialoffer(src)
/obj/item/storage/briefcase/false_bottomed
max_w_class = WEIGHT_CLASS_SMALL
max_combined_w_class = 10
var/busy_hunting = FALSE
var/bottom_open = FALSE //is the false bottom open?
var/obj/item/stored_item = null //what's in the false bottom. If it's a gun, we can fire it
/obj/item/storage/briefcase/false_bottomed/Destroy()
if(stored_item)//since the stored_item isn't in the briefcase' contents we gotta remind the game to delete it here.
QDEL_NULL(stored_item)
return ..()
/obj/item/storage/briefcase/false_bottomed/afterattack(atom/A, mob/user, flag, params)
..()
if(stored_item && istype(stored_item, /obj/item/gun) && !Adjacent(A))
var/obj/item/gun/stored_gun = stored_item
stored_gun.afterattack(A, user, flag, params)
/obj/item/storage/briefcase/false_bottomed/attackby(var/obj/item/I, mob/user)
if(isscrewdriver(I))
if(!bottom_open && !busy_hunting)
to_chat(user, "You begin to hunt around the rim of the [src]...")
busy_hunting = TRUE
if(do_after(user, 20, target = src))
if(user)
to_chat(user, "You pry open the false bottom!")
bottom_open = TRUE
busy_hunting = FALSE
else if(bottom_open)
to_chat(user, "You push the false bottom down and close it with a click[stored_item ? ", with the [stored_item] snugly inside." : "."]")
bottom_open = FALSE
else if(bottom_open)
if(stored_item)
to_chat(user, "<span class='warning'>There's already something in the false bottom!</span>")
return
if(I.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user, "<span class='warning'>The [I] is too big to fit in the false bottom!</span>")
return
if(!user.drop_item(I))
user << "<span class='warning'>The [I] is stuck to your hands!</span>"
return
stored_item = I
max_w_class = WEIGHT_CLASS_NORMAL - stored_item.w_class
I.forceMove(null) //null space here we go - to stop it showing up in the briefcase
to_chat(user, "You place the [I] into the false bottom of the briefcase.")
else
return ..()
/obj/item/storage/briefcase/false_bottomed/attack_hand(mob/user)
if(bottom_open && stored_item)
user.put_in_hands(stored_item)
to_chat(user, "You pull out the [stored_item] from the [src]'s false bottom.")
stored_item = null
max_w_class = initial(max_w_class)
else
return ..()
@@ -121,6 +121,19 @@
desc = "A sleek, sturdy box"
icon_state = "box_of_doom"
/obj/item/storage/box/syndie_kit/romerol
name = "Romerol Kit"
desc = "A box containing a deadly virus capable of reanimating dead as zombies."
max_w_class = WEIGHT_CLASS_NORMAL
can_hold = list(/obj/item/reagent_containers/glass/bottle/romerol,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/dropper)
/obj/item/storage/box/syndie_kit/romerol/New()
..()
new /obj/item/reagent_containers/glass/bottle/romerol(src)
new /obj/item/reagent_containers/syringe(src)
new /obj/item/reagent_containers/dropper(src)
return
/obj/item/storage/box/syndie_kit/space
name = "Boxed Space Suit and Helmet"
can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate)
@@ -48,38 +48,38 @@
return
if(!on)
turn_on()
turn_on(user)
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
else
turn_off()
turn_off(user)
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/tank/jetpack/proc/turn_on()
/obj/item/tank/jetpack/proc/turn_on(mob/user)
on = TRUE
icon_state = "[initial(icon_state)]-on"
ion_trail.start()
/obj/item/tank/jetpack/proc/turn_off()
/obj/item/tank/jetpack/proc/turn_off(mob/user)
on = FALSE
stabilizers = FALSE
icon_state = initial(icon_state)
ion_trail.stop()
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob)
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
if(!on)
return 0
if((num < 0.005 || air_contents.total_moles() < num))
turn_off()
turn_off(user)
return 0
var/datum/gas_mixture/removed = air_contents.remove(num)
if(removed.total_moles() < 0.005)
turn_off()
turn_off(user)
return 0
var/turf/T = get_turf(user)
@@ -163,15 +163,65 @@
to_chat(user, "<span class='danger'>The meter on [src] indicates you are almost out of air!</span>")
playsound(user, 'sound/effects/alert.ogg', 50, 1)
/obj/item/tank/jetpack/carbondioxide/mining
name = "mining jetpack"
/obj/item/tank/jetpack/suit
name = "hardsuit jetpack upgrade"
desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
icon_state = "jetpack-mining"
item_state = "jetpack-mining"
item_state = "jetpack-black"
origin_tech = "materials=4;magnets=4;engineering=5"
desc = "A tank of compressed carbon dioxide for miners to use as propulsion in local space. The compact size allows for easy storage at the cost of capacity."
volume = 40
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL //same as syndie harness
w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
volume = 1
slot_flags = null
var/datum/gas_mixture/temp_air_contents
var/obj/item/tank/tank = null
var/mob/living/carbon/human/cur_user
/obj/item/tank/jetpack/suit/New()
..()
STOP_PROCESSING(SSobj, src)
temp_air_contents = air_contents
/obj/item/tank/jetpack/suit/attack_self()
return
/obj/item/tank/jetpack/suit/cycle(mob/user)
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
to_chat(user, "<span class='warning'>[src] must be connected to a hardsuit!</span>")
return
var/mob/living/carbon/human/H = user
if(!istype(H.s_store, /obj/item/tank))
to_chat(user, "<span class='warning'>You need a tank in your suit storage!</span>")
return
..()
/obj/item/tank/jetpack/suit/turn_on(mob/user)
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc) || loc.loc != user)
return
var/mob/living/carbon/human/H = user
tank = H.s_store
air_contents = tank.air_contents
START_PROCESSING(SSobj, src)
cur_user = user
..()
/obj/item/tank/jetpack/suit/turn_off(mob/user)
tank = null
air_contents = temp_air_contents
STOP_PROCESSING(SSobj, src)
cur_user = null
..()
/obj/item/tank/jetpack/suit/process()
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
turn_off(cur_user)
return
var/mob/living/carbon/human/H = loc.loc
if(!tank || tank != H.s_store)
turn_off(cur_user)
return
..()
/obj/item/tank/jetpack/rig
name = "jetpack"
@@ -182,7 +232,7 @@
to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.")
return 0
/obj/item/tank/jetpack/rig/allow_thrust(num, mob/living/user as mob)
/obj/item/tank/jetpack/rig/allow_thrust(num, mob/living/user)
if(!on)
return 0
@@ -191,7 +241,7 @@
var/datum/gas_mixture/removed = holder.air_supply.air_contents.remove(num)
if(removed.total_moles() < 0.005)
turn_off()
turn_off(user)
return 0
var/turf/T = get_turf(user)
+5 -5
View File
@@ -181,16 +181,16 @@
if(prob(10))
visible_message("<span class='boldwarning'>[owner] Deflects [I] directly back at the thrower! It's a home run!</span>", "<span class='boldwarning'>You deflect the [I] directly back at the thrower! It's a home run!</span>")
playsound(get_turf(owner), 'sound/weapons/homerun.ogg', 100, 1)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
I.throw_at(I.thrownby, 20, 20, owner)
deflectmode = FALSE
if(!istype(I, /obj/item/beach_ball))
lastdeflect = world.time + 3000
return TRUE
return TRUE
else if(prob(30))
visible_message("<span class='warning'>[owner] swings! And [p_they()] miss[p_es()]! How embarassing.</span>", "<span class='warning'>You swing! You miss! Oh no!</span>")
playsound(get_turf(owner), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
do_attack_animation(get_step(owner, pick(alldirs)), ATTACK_EFFECT_DISARM)
do_attack_animation(get_step(owner, pick(alldirs)), ATTACK_EFFECT_DISARM)
deflectmode = FALSE
if(!istype(I, /obj/item/beach_ball))
lastdeflect = world.time + 3000
@@ -198,7 +198,7 @@
else
visible_message("<span class='warning'>[owner] swings and deflects [I]!</span>", "<span class='warning'>You swing and deflect the [I]!</span>")
playsound(get_turf(owner), 'sound/weapons/baseball_hit.ogg', 50, 1, -1)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
I.throw_at(get_edge_target_turf(owner, pick(cardinal)), rand(8,10), 14, owner)
deflectmode = FALSE
if(!istype(I, /obj/item/beach_ball))
@@ -239,7 +239,7 @@
playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1)
homerun_ready = 0
return
else
else if(!target.anchored)
target.throw_at(throw_target, rand(1,2), 7, user)
/obj/item/melee/baseball_bat/ablative
@@ -34,6 +34,15 @@ LINEN BINS
add_fingerprint(user)
return
/obj/item/bedsheet/attackby(obj/item/I, mob/user, params)
if(I.sharp)
var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3)
transfer_fingerprints_to(C)
C.add_fingerprint(user)
qdel(src)
to_chat(user, "<span class='notice'>You tear [src] up.</span>")
else
return ..()
/obj/item/bedsheet/blue
icon_state = "sheetblue"
@@ -105,7 +105,7 @@
continue
if(istype(M, /mob/living/simple_animal/bot/mulebot))
continue
if(M.buckled)
if(M.buckled || M.anchored)
continue
M.forceMove(src)
@@ -15,15 +15,19 @@
var/move_delay = 0
var/egged = 0
/obj/structure/closet/cardboard/relaymove(mob/user, direction)
if(opened || move_delay || user.stat || user.stunned || user.weakened || user.paralysis || !isturf(loc) || !has_gravity(loc))
/obj/structure/closet/cardboard/relaymove(mob/living/user, direction)
if(!istype(user) || opened || move_delay || user.incapacitated() || !isturf(loc) || !has_gravity(loc))
return
move_delay = 1
if(step(src, direction))
spawn(config.walk_speed)
move_delay = 0
move_delay = TRUE
var/oldloc = loc
step(src, direction)
if(oldloc != loc)
addtimer(CALLBACK(src, .proc/ResetMoveDelay), config.walk_speed)
else
move_delay = 0
move_delay = FALSE
/obj/structure/closet/cardboard/proc/ResetMoveDelay()
move_delay = FALSE
/obj/structure/closet/cardboard/open()
if(opened || !can_open())

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