mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-31 07:57:47 +01:00
fixes merge conflict
This commit is contained in:
@@ -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.-->
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -328,6 +328,9 @@
|
||||
/atom/proc/emag_act()
|
||||
return
|
||||
|
||||
/atom/proc/fart_act(mob/living/M)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/rpd_act()
|
||||
return
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user