Merge remote-tracking branch 'refs/remotes/origin/master' into changelog-memes

This commit is contained in:
Poojawa
2018-09-10 23:51:25 -05:00
64 changed files with 580 additions and 300 deletions

View File

@@ -43117,7 +43117,6 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/ballistic/shotgun/riot,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/bot,
/obj/item/gun/ballistic/shotgun/riot,
@@ -43151,14 +43150,16 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/head/helmet{
layer = 3.00001
},
/obj/item/clothing/head/helmet{
layer = 3.00001;
pixel_x = 3;
pixel_y = -3
},
/obj/item/clothing/head/helmet{
layer = 3.00001;
pixel_x = -3;
pixel_y = 3
},
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -44015,7 +44016,6 @@
pixel_y = 3
},
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot{
pixel_x = 3;
pixel_y = -3
@@ -44038,7 +44038,6 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/energy/laser,
/obj/item/gun/energy/laser{
pixel_x = 3;
pixel_y = -3
@@ -44057,18 +44056,11 @@
pixel_y = 3
},
/obj/item/clothing/suit/armor/bulletproof,
/obj/item/clothing/suit/armor/bulletproof{
pixel_x = 3;
pixel_y = -3
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001;
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001;
pixel_x = 3;
@@ -45304,6 +45296,10 @@
/obj/structure/window/reinforced{
dir = 4
},
/obj/item/gun/energy/e_gun/advtaser{
pixel_x = 3;
pixel_y = -3
},
/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
"bVr" = (
@@ -45313,23 +45309,11 @@
pixel_y = 3
},
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/suit/armor/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/clothing/head/helmet/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/head/helmet/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/shield/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/shield/riot,
/obj/item/shield/riot{
pixel_x = 3;
@@ -46637,7 +46621,6 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/energy/e_gun,
/obj/item/gun/energy/e_gun{
pixel_x = 3;
pixel_y = -3

View File

@@ -2783,16 +2783,14 @@
/area/ai_monitored/security/armory)
"agb" = (
/obj/structure/rack,
/obj/item/gun/energy/e_gun/advtaser{
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/energy/e_gun/advtaser,
/obj/item/gun/energy/e_gun/advtaser{
pixel_x = 3;
pixel_y = -3
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/item/gun/energy/e_gun/advtaser,
/obj/item/gun/energy/e_gun/advtaser,
/turf/open/floor/plasteel/vault{
dir = 1
},
@@ -3188,14 +3186,11 @@
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot,
/obj/item/gun/ballistic/shotgun/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/ballistic/shotgun/riot,
/obj/item/gun/ballistic/shotgun/riot,
/turf/open/floor/plasteel/vault{
dir = 1
},
@@ -3206,7 +3201,6 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/energy/e_gun,
/obj/item/gun/energy/e_gun{
pixel_x = 3;
pixel_y = -3
@@ -3448,8 +3442,6 @@
/obj/structure/rack,
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/head/helmet/riot,
/obj/machinery/firealarm{
@@ -3528,10 +3520,6 @@
pixel_y = 3
},
/obj/item/shield/riot,
/obj/item/shield/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/machinery/button/door{
id = "armory";
name = "Armory Shutters";

View File

@@ -4093,10 +4093,6 @@
/obj/structure/rack,
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/storage/box/rubbershot{
pixel_x = 3;
pixel_y = -3
@@ -4132,24 +4128,11 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/suit/armor/bulletproof,
/obj/item/clothing/suit/armor/bulletproof{
pixel_x = 3;
pixel_y = -3
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001;
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001;
pixel_x = 3;
pixel_y = -3
},
/obj/structure/sign/warning/nosmoking{
pixel_y = 32
},
@@ -4974,10 +4957,6 @@
pixel_y = 3
},
/obj/item/gun/energy/e_gun,
/obj/item/gun/energy/e_gun{
pixel_x = 3;
pixel_y = -3
},
/obj/item/radio/intercom{
name = "Station Intercom";
pixel_x = -26
@@ -5007,28 +4986,16 @@
pixel_y = 3
},
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/suit/armor/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/clothing/head/helmet/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/head/helmet/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/shield/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/shield/riot,
/obj/item/shield/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/structure/cable/white{
icon_state = "4-8"
},

View File

@@ -2859,24 +2859,15 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/suit/armor/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/clothing/head/helmet/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/head/helmet/riot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/shield/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/shield/riot,
/obj/item/shield/riot{
pixel_x = 3;
@@ -2902,10 +2893,6 @@
},
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot,
/obj/item/storage/box/rubbershot{
pixel_x = 3;
pixel_y = -3
},
/obj/item/storage/box/rubbershot{
pixel_x = 3;
pixel_y = -3
@@ -3155,10 +3142,6 @@
pixel_y = 3
},
/obj/item/gun/energy/e_gun,
/obj/item/gun/energy/e_gun{
pixel_x = 3;
pixel_y = -3
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/machinery/firealarm{
dir = 8;
@@ -3177,15 +3160,6 @@
pixel_y = 3
},
/obj/item/clothing/suit/armor/bulletproof,
/obj/item/clothing/suit/armor/bulletproof{
pixel_x = 3;
pixel_y = -3
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001;
pixel_x = -3;
pixel_y = 3
},
/obj/item/clothing/head/helmet/alt{
layer = 3.00001
},
@@ -3209,7 +3183,6 @@
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/energy/laser,
/obj/item/gun/energy/laser{
pixel_x = 3;
pixel_y = -3
@@ -3633,6 +3606,7 @@
pixel_x = 3;
pixel_y = -3
},
/obj/item/gun/energy/e_gun/advtaser,
/turf/open/floor/plasteel/dark,
/area/security/armory)
"akM" = (
@@ -3661,10 +3635,6 @@
/area/security/armory)
"akP" = (
/obj/structure/rack,
/obj/item/gun/ballistic/shotgun/riot{
pixel_x = -3;
pixel_y = 3
},
/obj/item/gun/ballistic/shotgun/riot,
/obj/item/gun/ballistic/shotgun/riot{
pixel_x = 3;

View File

@@ -71,6 +71,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define TESLA_MOB_STUN (1<<4)
#define TESLA_DEFAULT_FLAGS ALL
#define TESLA_FUSION_FLAGS TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN
//EMP protection
#define EMP_PROTECT_SELF (1<<0)

View File

@@ -0,0 +1,65 @@
//Defines used in atmos gas reactions. Used to be located in ..\modules\atmospherics\gasmixtures\reactions.dm, but were moved here because fusion added so fucking many.
//Plasma fire properties
#define OXYGEN_BURN_RATE_BASE 1.4
#define PLASMA_BURN_RATE_DELTA 9
#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30
#define FIRE_CARBON_ENERGY_RELEASED 100000 //Amount of heat released per mole of burnt carbon into the tile
#define FIRE_HYDROGEN_ENERGY_RELEASED 280000 //Amount of heat released per mole of burnt hydrogen and/or tritium(hydrogen isotope)
#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
//General assmos defines.
#define WATER_VAPOR_FREEZE 200
#define NITRYL_FORMATION_ENERGY 100000
#define TRITIUM_BURN_OXY_FACTOR 100
#define TRITIUM_BURN_TRIT_FACTOR 10
#define TRITIUM_BURN_RADIOACTIVITY_FACTOR 50000 //The neutrons gotta go somewhere. Completely arbitrary number.
#define TRITIUM_MINIMUM_RADIATION_ENERGY 0.1 //minimum 0.01 moles trit or 10 moles oxygen to start producing rads
#define SUPER_SATURATION_THRESHOLD 96
#define STIMULUM_HEAT_SCALE 100000
#define STIMULUM_FIRST_RISE 0.65
#define STIMULUM_FIRST_DROP 0.065
#define STIMULUM_SECOND_RISE 0.0009
#define STIMULUM_ABSOLUTE_DROP 0.00000335
#define REACTION_OPPRESSION_THRESHOLD 5
#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense.
//Plasma fusion properties
#define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction
#define FUSION_TEMPERATURE_THRESHOLD 1000 //Temperature required to start a fusion reaction
#define FUSION_MOLE_THRESHOLD 250 //Mole count required (tritium/plasma) to start a fusion reaction
#define FUSION_RELEASE_ENERGY_SUPER 3e9 //Amount of energy released in the fusion process, super tier
#define FUSION_RELEASE_ENERGY_HIGH 1e9 //Amount of energy released in the fusion process, high tier
#define FUSION_RELEASE_ENERGY_MID 5e8 //Amount of energy released in the fusion process, mid tier
#define FUSION_RELEASE_ENERGY_LOW 1e8 //Amount of energy released in the fusion process, low tier
#define FUSION_MEDIATION_FACTOR 80 //Arbitrary
#define FUSION_SUPER_TIER_THRESHOLD 50 //anything above this is super tier
#define FUSION_HIGH_TIER_THRESHOLD 20 //anything above this and below 50 is high tier
#define FUSION_MID_TIER_THRESHOLD 5 //anything above this and below 20 is mid tier - below this is low tier, but that doesnt need a define
#define FUSION_ENERGY_DIVISOR_SUPER 25 //power_ratio is divided by this during energy calculations
#define FUSION_ENERGY_DIVISOR_HIGH 20
#define FUSION_ENERGY_DIVISOR_MID 10
#define FUSION_ENERGY_DIVISOR_LOW 2
#define FUSION_GAS_CREATION_FACTOR_TRITIUM 0.40 //trit - one gas rather than two, so think about that when calculating stuff - 40% in total
#define FUSION_GAS_CREATION_FACTOR_STIM 0.05 //stim percentage creation from high tier - 5%, 60% in total with pluox
#define FUSION_GAS_CREATION_FACTOR_PLUOX 0.55 //pluox percentage creation from high tier - 55%, 60% in total with stim
#define FUSION_GAS_CREATION_FACTOR_NITRYL 0.20 //nitryl and N2O - 80% in total
#define FUSION_GAS_CREATION_FACTOR_N2O 0.60 //nitryl and N2O - 80% in total
#define FUSION_GAS_CREATION_FACTOR_BZ 0.05 //BZ - 5% - 90% in total with CO2
#define FUSION_GAS_CREATION_FACTOR_CO2 0.85 //CO2 - 85% - 90% in total with BZ
#define FUSION_MID_TIER_RAD_PROB_FACTOR 2 //probability of radpulse is power ratio * this for whatever tier
#define FUSION_LOW_TIER_RAD_PROB_FACTOR 5
#define FUSION_EFFICIENCY_BASE 60 //used in the fusion efficiency calculations
#define FUSION_EFFICIENCY_DIVISOR 0.6 //ditto
#define FUSION_RADIATION_FACTOR 15000 //horizontal asymptote
#define FUSION_RADIATION_CONSTANT 30 //equation is form of (ax) / (x + b), where a = radiation factor and b = radiation constant and x = power ratio (https://www.desmos.com/calculator/4i1f296phl)
#define FUSION_ZAP_POWER_ASYMPTOTE 50000 //maximum value - not enough to instacrit but it'll still hurt like shit
#define FUSION_ZAP_POWER_CONSTANT 75 //equation is of from [ax / (x + b)] + c, where a = zap power asymptote, b = zap power constant, c = zap power base and x = power ratio
#define FUSION_ZAP_POWER_BASE 1000 //(https://www.desmos.com/calculator/vvbmhf4unm)
#define FUSION_ZAP_RANGE_SUPER 9 //range of the tesla zaps that occur from fusion
#define FUSION_ZAP_RANGE_HIGH 7
#define FUSION_ZAP_RANGE_MID 5
#define FUSION_ZAP_RANGE_LOW 3
#define FUSION_PARTICLE_FACTOR_SUPER 4 //# of particles fired out is equal to rand(3,6) * this for whatever tier
#define FUSION_PARTICLE_FACTOR_HIGH 3
#define FUSION_PARTICLE_FACTOR_MID 2
#define FUSION_PARTICLE_FACTOR_LOW 1

View File

@@ -67,6 +67,7 @@
#define INIT_ORDER_TIMER 1
#define INIT_ORDER_DEFAULT 0
#define INIT_ORDER_AIR -1
#define INIT_ORDER_AIR_TURFS -2
#define INIT_ORDER_MINIMAP -3
#define INIT_ORDER_ASSETS -4
#define INIT_ORDER_ICON_SMOOTHING -5
@@ -100,6 +101,7 @@
#define FIRE_PRIORITY_OBJ 40
#define FIRE_PRIORITY_ACID 40
#define FIRE_PRIOTITY_BURNING 40
#define FIRE_PRIORITY_AIR_TURFS 40
#define FIRE_PRIORITY_DEFAULT 50
#define FIRE_PRIORITY_PARALLAX 65
#define FIRE_PRIORITY_FLIGHTPACKS 80

View File

@@ -143,6 +143,17 @@
if(337.5 to 360)
return NORTH
/proc/angle2dir_cardinal(angle)
switch(round(angle, 0.1))
if(315.5 to 360, 0 to 45.5)
return NORTH
if(45.6 to 135.5)
return EAST
if(135.6 to 225.5)
return SOUTH
if(225.6 to 315.5)
return WEST
//returns the north-zero clockwise angle in degrees, given a direction
/proc/dir2angle(D)
switch(D)
@@ -437,6 +448,17 @@
else
. = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307))
/proc/fusionpower2text(power) //used when displaying fusion power on analyzers
switch(power)
if(0 to 5)
return "low"
if(5 to 20)
return "mid"
if(20 to 50)
return "high"
if(50 to INFINITY)
return "super"
/proc/color2hex(color) //web colors
if(!color)
return "#000000"

View File

@@ -1,6 +1,6 @@
#define SSAIR_PIPENETS 1
#define SSAIR_ATMOSMACHINERY 2
#define SSAIR_ACTIVETURFS 3
#define SSAIR_REACTQUEUE 3
#define SSAIR_EXCITEDGROUPS 4
#define SSAIR_HIGHPRESSURE 5
#define SSAIR_HOTSPOTS 6
@@ -14,7 +14,7 @@ SUBSYSTEM_DEF(air)
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/cost_turfs = 0
var/cost_turf_reactions = 0
var/cost_groups = 0
var/cost_highpressure = 0
var/cost_hotspots = 0
@@ -24,6 +24,7 @@ SUBSYSTEM_DEF(air)
var/list/excited_groups = list()
var/list/active_turfs = list()
var/list/turf_react_queue = list()
var/list/hotspots = list()
var/list/networks = list()
var/list/obj/machinery/atmos_machinery = list()
@@ -45,7 +46,7 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/stat_entry(msg)
msg += "C:{"
msg += "AT:[round(cost_turfs,1)]|"
msg += "RQ:[round(cost_turf_reactions,1)]|"
msg += "EG:[round(cost_groups,1)]|"
msg += "HP:[round(cost_highpressure,1)]|"
msg += "HS:[round(cost_hotspots,1)]|"
@@ -54,6 +55,7 @@ SUBSYSTEM_DEF(air)
msg += "AM:[round(cost_atmos_machinery,1)]"
msg += "} "
msg += "AT:[active_turfs.len]|"
msg += "RQ:[turf_react_queue.len]|"
msg += "EG:[excited_groups.len]|"
msg += "HS:[hotspots.len]|"
msg += "PN:[networks.len]|"
@@ -90,12 +92,12 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = 0
currentpart = SSAIR_ACTIVETURFS
currentpart = SSAIR_REACTQUEUE
if(currentpart == SSAIR_ACTIVETURFS)
if(currentpart == SSAIR_REACTQUEUE)
timer = TICK_USAGE_REAL
process_active_turfs(resumed)
cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
process_react_queue(resumed)
cost_turf_reactions = MC_AVERAGE(cost_turf_reactions, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
if(state != SS_RUNNING)
return
resumed = 0
@@ -170,6 +172,19 @@ SUBSYSTEM_DEF(air)
return
/datum/controller/subsystem/air/proc/process_react_queue(resumed = 0)
if(!resumed)
src.currentrun = turf_react_queue.Copy()
var/list/currentrun = src.currentrun
while(currentrun.len)
var/turf/open/T = currentrun[currentrun.len]
currentrun.len--
if(T)
T.process_cell_reaction()
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/air/proc/process_super_conductivity(resumed = 0)
if (!resumed)
src.currentrun = active_super_conductivity.Copy()
@@ -207,21 +222,6 @@ SUBSYSTEM_DEF(air)
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0)
//cache for sanic speed
var/fire_count = times_fired
if (!resumed)
src.currentrun = active_turfs.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/turf/open/T = currentrun[currentrun.len]
currentrun.len--
if (T)
T.process_cell(fire_count)
if (MC_TICK_CHECK)
return
/datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0)
if (!resumed)
src.currentrun = excited_groups.Copy()
@@ -242,8 +242,7 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T)
active_turfs -= T
if(currentpart == SSAIR_ACTIVETURFS)
currentrun -= T
SSair_turfs.currentrun -= T
#ifdef VISUALIZE_ACTIVE_TURFS
T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00")
#endif
@@ -251,6 +250,7 @@ SUBSYSTEM_DEF(air)
T.excited = 0
if(T.excited_group)
T.excited_group.garbage_collect()
remove_from_react_queue(T)
/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = 1)
if(istype(T) && T.air)
@@ -259,10 +259,10 @@ SUBSYSTEM_DEF(air)
#endif
T.excited = 1
active_turfs |= T
if(currentpart == SSAIR_ACTIVETURFS)
currentrun |= T
SSair_turfs.currentrun |= T
if(blockchanges && T.excited_group)
T.excited_group.garbage_collect()
add_to_react_queue(T)
else if(T.flags_1 & INITIALIZED_1)
for(var/turf/S in T.atmos_adjacent_turfs)
add_to_active(S)
@@ -273,6 +273,18 @@ SUBSYSTEM_DEF(air)
else
T.requires_activation = TRUE
/datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T)
if(istype(T) && T.air)
turf_react_queue |= T
if(currentpart == SSAIR_REACTQUEUE)
currentrun |= T
return
/datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T)
turf_react_queue -= T
if(currentpart == SSAIR_REACTQUEUE)
currentrun -= T
/datum/controller/subsystem/air/StartLoadingMap()
LAZYINITLIST(queued_for_activation)
map_loading = TRUE

View File

@@ -0,0 +1,27 @@
//WHAT IF WE TAKE THE ACTIVE TURF PROCESSING AND PUSH IT SOMEWHERE ELSE!!!
SUBSYSTEM_DEF(air_turfs)
name = "Atmospherics - Turfs"
init_order = INIT_ORDER_AIR_TURFS
priority = FIRE_PRIORITY_AIR_TURFS
wait = 1
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun = list()
/datum/controller/subsystem/air_turfs/fire(resumed = 0)
var/fire_count = times_fired
//cache for sanic speed
if (!resumed)
src.currentrun = SSair.active_turfs.Copy()
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/turf/open/T = currentrun[currentrun.len]
currentrun.len--
if (T)
T.process_cell(fire_count)
if (MC_TICK_CHECK)
return
resumed = 0
return

View File

@@ -433,6 +433,8 @@ SUBSYSTEM_DEF(job)
to_chat(M, "<b>To speak on your departments radio, use the :h button. To see others, look closely at your headset.</b>")
if(job.req_admin_notify)
to_chat(M, "<b>You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.</b>")
if(job.custom_spawn_text)
to_chat(M, "<b>[job.custom_spawn_text]</b>")
if(CONFIG_GET(number/minimal_access_threshold))
to_chat(M, "<FONT color='blue'><B>As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.</B></font>")

View File

@@ -17,10 +17,30 @@ SUBSYSTEM_DEF(research)
var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount))
var/list/techweb_nodes_hidden = list() //Nodes that should be hidden by default.
var/list/techweb_point_items = list( //path = list(point type = value)
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), // Cit three more anomalys anomalys
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 2500),
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 5000), // Cit three more anomalys anomalys
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 7500),
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 5000),
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 2500) // End of Cit changes
/obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000),
/obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = 500), // Adds in slime core deconing
/obj/item/slime_extract/metal = list(TECHWEB_POINT_TYPE_GENERIC = 750),
/obj/item/slime_extract/purple = list(TECHWEB_POINT_TYPE_GENERIC = 750),
/obj/item/slime_extract/orange = list(TECHWEB_POINT_TYPE_GENERIC = 750),
/obj/item/slime_extract/blue = list(TECHWEB_POINT_TYPE_GENERIC = 750),
/obj/item/slime_extract/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
/obj/item/slime_extract/silver = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
/obj/item/slime_extract/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
/obj/item/slime_extract/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 1000),
/obj/item/slime_extract/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
/obj/item/slime_extract/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
/obj/item/slime_extract/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
/obj/item/slime_extract/green = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
/obj/item/slime_extract/pink = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
/obj/item/slime_extract/gold = list(TECHWEB_POINT_TYPE_GENERIC = 1250),
/obj/item/slime_extract/black = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
/obj/item/slime_extract/adamantine =list (TECHWEB_POINT_TYPE_GENERIC = 1500),
/obj/item/slime_extract/oil = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
/obj/item/slime_extract/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 1500),
/obj/item/slime_extract/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 2500) // End of Cit changes
)
var/list/errored_datums = list()
var/list/point_types = list() //typecache style type = TRUE list

View File

@@ -487,6 +487,27 @@
else
to_chat(owner, "<span class='cultitalic'>Your hands are full!</span>")
/datum/action/item_action/agent_box
name = "Deploy Box"
desc = "Find inner peace, here, in the box."
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS
background_icon_state = "bg_agent"
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "deploy_box"
var/cooldown = 0
var/obj/structure/closet/cardboard/agent/box
/datum/action/item_action/agent_box/Trigger()
if(!box)
if(cooldown < world.time - 30)
box = new(get_turf(owner))
owner.forceMove(box)
cooldown = world.time
owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
else
owner.forceMove(get_turf(box))
owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
QDEL_NULL(box)
//Preset for spells
/datum/action/spell_action

View File

@@ -42,7 +42,7 @@ SLIME SCANNER
/obj/item/t_scanner/proc/scan()
t_ray_scan(loc)
/proc/t_ray_scan(mob/viewer, flick_time = 8, distance = 2)
/proc/t_ray_scan(mob/viewer, flick_time = 8, distance = 3)
if(!ismob(viewer) || !viewer.client)
return
var/list/t_ray_images = list()
@@ -528,6 +528,7 @@ SLIME SCANNER
var/pressure = air_contents.return_pressure()
var/volume = air_contents.return_volume() //could just do mixture.volume... but safety, I guess?
var/temperature = air_contents.temperature
var/cached_scan_results = air_contents.analyzer_results
if(total_moles > 0)
to_chat(user, "<span class='notice'>Moles: [round(total_moles, 0.01)] mol</span>")
@@ -545,6 +546,12 @@ SLIME SCANNER
to_chat(user, "<span class='notice'>This node is empty!</span>")
else
to_chat(user, "<span class='notice'>[target] is empty!</span>")
if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
var/fusion_power = round(cached_scan_results["fusion"], 0.01)
var/tier = fusionpower2text(fusion_power)
to_chat(user, "<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>")
to_chat(user, "<span class='notice'>Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.</span>")
return
//slime scanner
@@ -629,4 +636,4 @@ SLIME SCANNER
var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE)
if(!response)
to_chat(user, "<span class='info'>No nanites detected in the subject.</span>")
to_chat(user, "<span class='info'>No nanites detected in the subject.</span>")

View File

@@ -0,0 +1,38 @@
/obj/item/implant/stealth
name = "S3 implant"
desc = "Allows you to be hidden in plain sight."
actions_types = list(/datum/action/item_action/agent_box)
//Box Object
/obj/structure/closet/cardboard/agent
name = "inconspicious box"
desc = "It's so normal that you didn't notice it before."
icon_state = "agentbox"
use_mob_movespeed = TRUE
/obj/structure/closet/cardboard/agent/proc/go_invisible()
animate(src, , alpha = 0, time = 5)
START_PROCESSING(SSobj, src)
/obj/structure/closet/cardboard/agent/Initialize()
. = ..()
go_invisible()
/obj/structure/closet/cardboard/agent/open()
. = ..()
qdel(src)
/obj/structure/closet/cardboard/agent/process()
animate(src, , alpha = alpha - 50, time = 3)
/obj/structure/closet/cardboard/agent/Move()
. = ..()
if(.)
alpha = min(alpha + 5, 255)
/obj/structure/closet/cardboard/agent/Bump(atom/movable/A)
. = ..()
if(isliving(A))
alpha = 255

View File

@@ -71,3 +71,7 @@
/obj/item/implanter/emp
name = "implanter (EMP)"
imp_type = /obj/item/implant/emp
/obj/item/implanter/stealth
name = "implanter (stealth)"
imp_type = /obj/item/implant/stealth

View File

@@ -339,3 +339,11 @@
new /obj/item/stamp/chameleon/broken(src)
new /obj/item/pda/chameleon/broken(src)
// No chameleon laser, they can't randomise for //REASONS//
/obj/item/storage/box/syndie_kit/kitchen_gun
name = "Kitchen Gun (TM) package"
/obj/item/storage/box/syndie_kit/kitchen_gun/PopulateContents()
new /obj/item/gun/ballistic/automatic/pistol/m1911/kitchengun(src)
new /obj/item/ammo_box/magazine/m45/kitchengun(src)
new /obj/item/ammo_box/magazine/m45/kitchengun(src)

View File

@@ -14,6 +14,7 @@
delivery_icon = "deliverybox"
anchorable = FALSE
var/move_speed_multiplier = 1
var/use_mob_movespeed = FALSE
var/move_delay = FALSE
var/egged = 0
@@ -22,7 +23,7 @@
return
move_delay = TRUE
if(step(src, direction))
addtimer(CALLBACK(src, .proc/ResetMoveDelay), CONFIG_GET(number/walk_delay) * move_speed_multiplier)
addtimer(CALLBACK(src, .proc/ResetMoveDelay), (use_mob_movespeed ? user.movement_delay() : CONFIG_GET(number/walk_delay)) * move_speed_multiplier)
else
ResetMoveDelay()

View File

@@ -176,7 +176,7 @@
Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.<br>
By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.<br>
Example: <i>C,D,E,F,G,A,B</i> will play a C major scale.<br>
After a note has an accidental placed, it will be remembered: <i>C,C4,C,C3</i> is C3,C4,C4,C3</i><br>
After a note has an accidental placed, it will be remembered: <i>C,C4,C,C3</i> is <i>C3,C4,C4,C3</i><br>
Chords can be played simply by seperating each note with a hyphon: <i>A-C#,Cn-E,E-G#,Gn-B</i><br>
A pause may be denoted by an empty chord: <i>C,E,,C,G</i><br>
To make a chord be a different time, end it with /x, where the chord length will be length<br>

View File

@@ -223,9 +223,7 @@
our_air.share(G, adjacent_turfs_length)
LAST_SHARE_CHECK
our_air.react(src)
update_visuals()
SSair.add_to_react_queue(src)
if((!our_excited_group && !(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION && consider_superconductivity(starting = TRUE))) \
|| (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
@@ -233,6 +231,15 @@
atmos_cooldown = cached_atmos_cooldown
/turf/proc/process_cell_reaction()
SSair.remove_from_react_queue(src)
/turf/open/process_cell_reaction()
air.react(src)
update_visuals()
SSair.remove_from_react_queue(src)
return
//////////////////////////SPACEWIND/////////////////////////////
/turf/open/proc/consider_pressure_difference(turf/T, difference)

View File

@@ -28,6 +28,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
var/volume = CELL_VOLUME //liters
var/last_share = 0
var/list/reaction_results
var/list/analyzer_results //used for analyzer feedback - not initialized until its used
/datum/gas_mixture/New(volume)
gases = new
@@ -427,14 +428,14 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
for(var/r in SSair.gas_reactions)
var/datum/gas_reaction/reaction = r
var/list/min_reqs = reaction.min_requirements.Copy()
var/list/min_reqs = reaction.min_requirements
if((min_reqs["TEMP"] && temp < min_reqs["TEMP"]) \
|| (min_reqs["ENER"] && ener < min_reqs["ENER"]))
continue
min_reqs -= "TEMP"
min_reqs -= "ENER"
for(var/id in min_reqs)
if (id == "TEMP" || id == "ENER")
continue
if(!cached_gases[id] || cached_gases[id][MOLES] < min_reqs[id])
continue reaction_loop
//at this point, all minimum requirements for the reaction are satisfied.

View File

@@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
name = "Water Vapor"
gas_overlay = "water_vapor"
moles_visible = MOLES_GAS_VISIBLE
fusion_power = 4
fusion_power = 8
/datum/gas/hypernoblium
id = "nob"
@@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
gas_overlay = "nitryl"
moles_visible = MOLES_GAS_VISIBLE
dangerous = TRUE
fusion_power = 10
fusion_power = 15
/datum/gas/tritium
id = "tritium"
@@ -115,7 +115,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
specific_heat = 20
name = "BZ"
dangerous = TRUE
fusion_power = 15
fusion_power = 8
/datum/gas/stimulum
id = "stim"

View File

@@ -1,57 +1,4 @@
//Plasma fire properties
#define OXYGEN_BURN_RATE_BASE 1.4
#define PLASMA_BURN_RATE_DELTA 9
#define PLASMA_MINIMUM_OXYGEN_NEEDED 2
#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30
#define FIRE_CARBON_ENERGY_RELEASED 100000 //Amount of heat released per mole of burnt carbon into the tile
#define FIRE_HYDROGEN_ENERGY_RELEASED 280000 //Amount of heat released per mole of burnt hydrogen and/or tritium(hydrogen isotope)
#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile
//General assmos defines.
#define WATER_VAPOR_FREEZE 200
#define NITRYL_FORMATION_ENERGY 100000
#define TRITIUM_BURN_OXY_FACTOR 100
#define TRITIUM_BURN_TRIT_FACTOR 10
#define TRITIUM_BURN_RADIOACTIVITY_FACTOR 50000 //The neutrons gotta go somewhere. Completely arbitrary number.
#define TRITIUM_MINIMUM_RADIATION_ENERGY 0.1 //minimum 0.01 moles trit or 10 moles oxygen to start producing rads
#define SUPER_SATURATION_THRESHOLD 96
#define STIMULUM_HEAT_SCALE 100000
#define STIMULUM_FIRST_RISE 0.65
#define STIMULUM_FIRST_DROP 0.065
#define STIMULUM_SECOND_RISE 0.0009
#define STIMULUM_ABSOLUTE_DROP 0.00000335
#define REACTION_OPPRESSION_THRESHOLD 5
#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense.
//Plasma fusion properties
#define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction
#define FUSION_TEMPERATURE_THRESHOLD 1000 //Temperature required to start a fusion reaction
#define FUSION_MOLE_THRESHOLD 250 //Mole count required (tritium/plasma) to start a fusion reaction
#define FUSION_RELEASE_ENERGY_SUPER 3e9 //Amount of energy released in the fusion process, super tier
#define FUSION_RELEASE_ENERGY_HIGH 1e9 //Amount of energy released in the fusion process, high tier
#define FUSION_RELEASE_ENERGY_MID 5e8 //Amount of energy released in the fusion process, mid tier
#define FUSION_RELEASE_ENERGY_LOW 1e8 //Amount of energy released in the fusion process, low tier
#define FUSION_MEDIATION_FACTOR 80 //Arbitrary
#define FUSION_SUPER_TIER 50 //anything above this is super tier
#define FUSION_HIGH_TIER 20 //anything above this and below 50 is high tier
#define FUSION_MID_TIER 5 //anything above this and below 20 is mid tier - below this is low tier, but that doesnt need a define
#define FUSION_ENERGY_DIVISOR_SUPER 25
#define FUSION_ENERGY_DIVISOR_HIGH 20
#define FUSION_ENERGY_DIVISOR_MID 10
#define FUSION_ENERGY_DIVISOR_LOW 2
#define FUSION_GAS_CREATION_FACTOR_SUPER 0.20 //stimulum and pluoxium - 40% in total
#define FUSION_GAS_CREATION_FACTOR_HIGH 0.60 //trit - one gas, so its higher than the other two - 60% in total
#define FUSION_GAS_CREATION_FACTOR_MID 0.45 //BZ and N2O - 90% in total
#define FUSION_GAS_CREATION_FACTOR_LOW 0.48 //O2 and CO2 - 96% in total
#define FUSION_MID_TIER_RAD_PROB_FACTOR 2 //probability of radpulse is power ratio * this for whatever tier
#define FUSION_LOW_TIER_RAD_PROB_FACTOR 5
#define FUSION_EFFICIENCY_BASE 60 //used in the fusion efficiency calculations
#define FUSION_EFFICIENCY_DIVISOR 0.6 //ditto
#define FUSION_RADIATION_FACTOR 15000 //horizontal asymptote
#define FUSION_RADIATION_CONSTANT 30 //equation is form of (ax) / (x + b), where a = radiation factor and b = radiation constant (https://www.desmos.com/calculator/4i1f296phl)
#define FUSION_VOLUME_SUPER 100 //volume of the sound the fusion noises make
#define FUSION_VOLUME_HIGH 50
#define FUSION_VOLUME_MID 25
#define FUSION_VOLUME_LOW 10
//All defines used in reactions are located in ..\__DEFINES\reactions.dm
/proc/init_gas_reactions()
var/list/reaction_types = list()
@@ -249,7 +196,10 @@
return cached_results["fire"] ? REACTING : NO_REACTION
//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again).
//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again)
//Fusion Rework Counter: Please increment this if you make a major overhaul to this system again.
//5 reworks
/datum/gas_reaction/fusion
exclude = FALSE
priority = 2
@@ -268,6 +218,9 @@
/datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder)
var/list/cached_gases = air.gases
var/temperature = air.temperature
if(!air.analyzer_results)
air.analyzer_results = new
var/list/cached_scan_results = air.analyzer_results
var/turf/open/location
if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet.
var/datum/pipeline/fusion_pipenet = holder
@@ -280,70 +233,70 @@
var/mediation = FUSION_MEDIATION_FACTOR*(air.heat_capacity()-(cached_gases[/datum/gas/plasma][MOLES]*cached_gases[/datum/gas/plasma][GAS_META][META_GAS_SPECIFIC_HEAT]))/(air.total_moles()-cached_gases[/datum/gas/plasma][MOLES]) //This is the average specific heat of the mixture,not including plasma.
var/moles_excluding_plasma = air.total_moles() - cached_gases[/datum/gas/plasma][MOLES]
var/plasma_differential = (cached_gases[/datum/gas/plasma][MOLES] - moles_excluding_plasma) / air.total_moles()
var/gases_fused = air.total_moles() - cached_gases[/datum/gas/plasma][MOLES]
var/plasma_differential = (cached_gases[/datum/gas/plasma][MOLES] - gases_fused) / air.total_moles()
var/reaction_efficiency = FUSION_EFFICIENCY_BASE ** -((plasma_differential ** 2) / FUSION_EFFICIENCY_DIVISOR) //https://www.desmos.com/calculator/6jjx3vdrvx
var/gases_fused = air.total_moles()
var/gas_power = 0
for (var/id in cached_gases)
gas_power += reaction_efficiency * (cached_gases[id][GAS_META][META_GAS_FUSION_POWER]*cached_gases[id][MOLES])
for (var/gas_id in cached_gases)
gas_power += reaction_efficiency * (cached_gases[gas_id][GAS_META][META_GAS_FUSION_POWER]*cached_gases[gas_id][MOLES])
var/power_ratio = gas_power/mediation
cached_scan_results[id] = power_ratio //used for analyzer feedback
for (var/gas_id in cached_gases) //and now we fuse
cached_gases[gas_id][MOLES] = 0
var/radiation_power = (FUSION_RADIATION_FACTOR * power_ratio) / (power_ratio + FUSION_RADIATION_CONSTANT) //https://www.desmos.com/calculator/4i1f296phl
var/zap_power = ((FUSION_ZAP_POWER_ASYMPTOTE * power_ratio) / (power_ratio + FUSION_ZAP_POWER_CONSTANT)) + FUSION_ZAP_POWER_BASE //https://www.desmos.com/calculator/n0zkdpxnrr
var/do_explosion = FALSE
var/zap_range //these ones are set later
var/fusion_prepare_to_die_edition_rng
if (power_ratio > FUSION_SUPER_TIER) //power ratio 50+: SUPER TIER. The gases become so energized that they fuse into stimulum and pluoxium, which is pretty nice! IF you can salvage them, which is going to be hard because this reaction is ridiculously dangerous.
if (power_ratio > FUSION_SUPER_TIER_THRESHOLD) //power ratio 50+: SUPER TIER. The gases become so energized that they fuse into a ton of tritium, which is pretty nice! Until you consider the fact that everything just exploded, the canister is probably going to break and you're irradiated.
reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_SUPER * (power_ratio / FUSION_ENERGY_DIVISOR_SUPER)
for (var/id in cached_gases)
cached_gases[id][MOLES] = 0
air.assert_gases(/datum/gas/stimulum,/datum/gas/pluoxium)
cached_gases[/datum/gas/stimulum][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_SUPER //60% of the gas is converted to energy, 40% to stimulum and pluoxium
cached_gases[/datum/gas/pluoxium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_SUPER
if (location) //It's going to happen regardless of whether you want it to or not
radiation_pulse(location, radiation_power * 2)
explosion(location,0,0,10,power_ratio,TRUE,TRUE)//A decent explosion with a huge shockwave. People WILL know you're doing fusion.
playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_SUPER, 0)
cached_gases[/datum/gas/tritium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_TRITIUM //60% of the gas is converted to energy, 40% to trit
fusion_prepare_to_die_edition_rng = 100 //Wait a minute..
do_explosion = TRUE
zap_range = FUSION_ZAP_RANGE_SUPER
else if (power_ratio > FUSION_HIGH_TIER) //power ratio 20-50; High tier. Fuses into one big atom which then turns to tritium instantly. Very dangerous, but super cool.
else if (power_ratio > FUSION_HIGH_TIER_THRESHOLD) //power ratio 20-50; High tier. The reaction is so energized that it fuses into a small amount of stimulum, and some pluoxium. Very dangerous, but super cool and super useful.
reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_HIGH * (power_ratio / FUSION_ENERGY_DIVISOR_HIGH)
for (var/id in cached_gases)
cached_gases[id][MOLES] = 0
cached_gases[/datum/gas/tritium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_HIGH //40% of the gas is converted to energy, 60% to tritium
if (location)
if(prob(power_ratio)) //You really don't want this to happen.
radiation_pulse(location, radiation_power)
explosion(location,0,0,3,power_ratio * 0.5,TRUE,TRUE)//A tiny explosion with a large shockwave. People will know you're doing fusion.
playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_HIGH, 0)
else
playsound(location, "sound/effects/phasein.ogg", FUSION_VOLUME_HIGH, 0)
air.assert_gases(/datum/gas/stimulum, /datum/gas/pluoxium)
cached_gases[/datum/gas/stimulum][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_STIM //40% of the gas is converted to energy, 60% to stim and pluox
cached_gases[/datum/gas/pluoxium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_PLUOX
fusion_prepare_to_die_edition_rng = power_ratio //Now we're getting into dangerous territory
do_explosion = TRUE
zap_range = FUSION_ZAP_RANGE_HIGH
else if (power_ratio > FUSION_MID_TIER) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down.
else if (power_ratio > FUSION_MID_TIER_THRESHOLD) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down.
reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_MID * (power_ratio / FUSION_ENERGY_DIVISOR_MID)
for (var/id in cached_gases)
cached_gases[id][MOLES] = 0
air.assert_gases(/datum/gas/bz,/datum/gas/nitrous_oxide)
cached_gases[/datum/gas/bz][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_MID //10% of the gas is converted to energy, 90% to BZ and N2O
cached_gases[/datum/gas/nitrous_oxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_MID
if (location)
if(prob(power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR)) //Still weak, but don't stand next to it unprotected
radiation_pulse(location, radiation_power * 0.5)
playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_MID, 0)
else
playsound(location, "sound/effects/phasein.ogg", FUSION_VOLUME_MID, 0)
air.assert_gases(/datum/gas/nitryl,/datum/gas/nitrous_oxide)
cached_gases[/datum/gas/nitryl][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_NITRYL //20% of the gas is converted to energy, 80% to nitryl and N2O
cached_gases[/datum/gas/nitrous_oxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_N2O
fusion_prepare_to_die_edition_rng = power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR //Still unlikely, but don't stand next to the reaction unprotected
zap_range = FUSION_ZAP_RANGE_MID
else //power ratio 0 to 5; Gas power is overpowered. Fusion isn't nearly as powerful.
reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_LOW * (power_ratio / FUSION_ENERGY_DIVISOR_LOW)
for (var/gas in cached_gases)
cached_gases[gas][MOLES] = 0
air.assert_gases(/datum/gas/oxygen, /datum/gas/carbon_dioxide)
cached_gases[/datum/gas/oxygen][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_LOW //4% of the gas is converted to energy, 94% to oxygen and CO2
cached_gases[/datum/gas/carbon_dioxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_LOW
if (location)
if(prob(power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR)) //Weak, but still something to look out for
radiation_pulse(location, radiation_power * 0.25)
playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_LOW, 0)
else
playsound(location, "sound/effects/phasein.ogg", FUSION_VOLUME_LOW, 0)
air.assert_gases(/datum/gas/bz, /datum/gas/carbon_dioxide)
cached_gases[/datum/gas/bz][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_BZ //10% of the gas is converted to energy, 90% to BZ and CO2
cached_gases[/datum/gas/carbon_dioxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_CO2
fusion_prepare_to_die_edition_rng = power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR //Low, but still something to look out for
zap_range = FUSION_ZAP_RANGE_LOW
//All the deadly consequences of fusion, consolidated for your viewing pleasure
if (location)
if(prob(fusion_prepare_to_die_edition_rng)) //Some.. permanent effects
if(do_explosion)
explosion(location, 0, 0, 5, power_ratio, TRUE, TRUE) //large shockwave, the actual radius is quite small - people will recognize that you're doing fusion
radiation_pulse(location, radiation_power) //You mean causing a super-tier fusion reaction in the halls is a bad idea?
playsound(location, 'sound/effects/supermatter.ogg', 100, 0)
else
playsound(location, 'sound/effects/phasein.ogg', 75, 0)
//These will always happen, so be prepared
tesla_zap(location, zap_range, zap_power, TESLA_FUSION_FLAGS) //larpers beware
location.fire_nuclear_particles(power_ratio) //see code/modules/projectile/energy/nuclear_particle.dm
if(reaction_energy > 0)
var/new_heat_capacity = air.heat_capacity()
@@ -480,21 +433,3 @@
var/new_heat_capacity = air.heat_capacity()
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
air.temperature = max(((air.temperature*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB)
#undef OXYGEN_BURN_RATE_BASE
#undef PLASMA_BURN_RATE_DELTA
#undef PLASMA_MINIMUM_OXYGEN_NEEDED
#undef PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO
#undef FIRE_CARBON_ENERGY_RELEASED
#undef FIRE_PLASMA_ENERGY_RELEASED
#undef WATER_VAPOR_FREEZE
#undef NITRYL_FORMATION_ENERGY
#undef TRITIUM_BURN_OXY_FACTOR
#undef SUPER_SATURATION_THRESHOLD
#undef STIMULUM_HEAT_SCALE
#undef STIMULUM_FIRST_RISE
#undef STIMULUM_FIRST_DROP
#undef STIMULUM_SECOND_RISE
#undef STIMULUM_ABSOLUTE_DROP
#undef REACTION_OPPRESSION_THRESHOLD
#undef NOBLIUM_FORMATION_ENERGY

View File

@@ -71,6 +71,7 @@ Shaft Miner
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dcba97"
custom_spawn_text = "Remember, you are a miner, not a hunter. Hunting monsters is not a requirement of your job, the only requirement of your job is to provide materials for the station. Don't be afraid to run away if you're inexperienced with fighting the mining area's locals."
outfit = /datum/outfit/job/miner

View File

@@ -38,6 +38,9 @@
//If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
var/req_admin_notify
//Allows defining arbitrary spawn text for the job
var/custom_spawn_text
//If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
var/minimal_player_age = 0

View File

@@ -1381,6 +1381,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
target.visible_message("<span class='danger'>[user] has [atk_verb]ed [target]!</span>", \
"<span class='userdanger'>[user] has [atk_verb]ed [target]!</span>", null, COMBAT_MESSAGE_RANGE)
target.lastattacker = user.real_name
target.lastattackerckey = user.ckey
if(user.limb_destroyer)
target.dismembering_strike(user, affecting.body_zone)
target.apply_damage(damage, BRUTE, affecting, armor_block)

View File

@@ -69,7 +69,7 @@
var/visualAppearence = MAINTDRONE //What we appear as
var/hacked = FALSE //If we have laws to destroy the station
var/flavortext = \
"\n<big><span class='warning'>DO NOT INTERFERE WITH THE ROUND AS A DRONE OR YOU WILL BE DRONE BANNED</span></big>\n"+\
"\n<big><span class='warning'>UNLESS YOU ARE A FREE DRONE, DO NOT INTERFERE WITH THE ROUND AS A DRONE OR YOU WILL BE DRONE BANNED</span></big>\n"+\
"<span class='notify'>Drones are a ghost role that are allowed to fix the station and build things. Interfering with the round as a drone is against the rules.</span>\n"+\
"<span class='notify'>Actions that constitute interference include, but are not limited to:</span>\n"+\
"<span class='notify'> - Interacting with round critical objects (IDs, weapons, contraband, powersinks, bombs, etc.)</span>\n"+\

View File

@@ -48,7 +48,7 @@
icon_living = "ranged"
icon_dead = "ranged"
ranged = 1
rapid = 1
rapid = 3
retreat_distance = 5
minimum_distance = 5

View File

@@ -5,7 +5,8 @@
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls
var/atom/target
var/ranged = 0
var/rapid = 0
var/rapid = 0 //How many shots per volley.
var/rapid_fire_delay = 2 //Time between rapid fire shots
var/projectiletype //set ONLY it and NULLIFY casingtype var, if we have ONLY projectile
var/projectilesound
var/casingtype //set ONLY it and NULLIFY projectiletype, if we have projectile IN CASING
@@ -330,11 +331,10 @@
return
visible_message("<span class='danger'><b>[src]</b> [ranged_message] at [A]!</span>")
if(rapid)
if(rapid > 1)
var/datum/callback/cb = CALLBACK(src, .proc/Shoot, A)
addtimer(cb, 1)
addtimer(cb, 4)
addtimer(cb, 6)
for(var/i in 1 to rapid)
addtimer(cb, (i - 1)*rapid_fire_delay)
else
Shoot(A)
ranged_cooldown = world.time + ranged_cooldown_time

View File

@@ -53,7 +53,7 @@
/mob/living/simple_animal/hostile/nanotrasen/ranged/smg
icon_state = "nanotrasenrangedsmg"
icon_living = "nanotrasenrangedsmg"
rapid = 1
rapid = 3
casingtype = /obj/item/ammo_casing/c46x30mm
projectilesound = 'sound/weapons/gunshot_smg.ogg'
loot = list(/obj/item/gun/ballistic/automatic/wt550,

View File

@@ -47,7 +47,7 @@
icon_dead = "piratemelee_dead"
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
rapid = 1
rapid = 3
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam/laser
@@ -72,7 +72,7 @@
icon_living = "piratespaceranged"
projectilesound = 'sound/weapons/laser.ogg'
ranged = 1
rapid = 1
rapid = 3
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/beam/laser

View File

@@ -64,7 +64,7 @@
icon_state = "nanotrasenrangedsmg"
icon_living = "nanotrasenrangedsmg"
vision_range = 9
rapid = 1
rapid = 3
ranged = 1
retreat_distance = 3
minimum_distance = 5

View File

@@ -62,7 +62,7 @@
icon_living = "russianofficer"
maxHealth = 65
health = 65
rapid = 1
rapid = 3
casingtype = /obj/item/ammo_casing/c9mm
loot = list(/obj/effect/mob_spawn/human/corpse/russian/ranged/officer,
/obj/item/gun/ballistic/automatic/pistol/APS)

View File

@@ -109,7 +109,7 @@
/mob/living/simple_animal/hostile/syndicate/ranged
ranged = 1
rapid = 1
rapid = 3
retreat_distance = 5
minimum_distance = 5
icon_state = "syndicateranged"

View File

@@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
if(iscarbon(src) && ventcrawler < 2)//It must have atleast been 1 to get this far
var/failed = 0
var/list/items_list = get_equipped_items()
var/list/items_list = get_equipped_items(include_pockets = TRUE)
if(items_list.len)
failed = 1
for(var/obj/item/I in held_items)
@@ -120,4 +120,3 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
. = new_loc
remove_ventcrawl()
add_ventcrawl(.)

View File

@@ -256,5 +256,5 @@
/////////////////////////////////// TEMPERATURE ////////////////////////////////////
/mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY)
if(bodytemperature > min_temp && bodytemperature < max_temp)
if(bodytemperature >= min_temp && bodytemperature <= max_temp)
bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp)

View File

@@ -135,6 +135,8 @@
p.pixel_x = rand(-10, 10)
p.pixel_y = rand(-10, 10)
p.picture = new(null, "You see [ass]'s ass on the photo.", temp_img)
p.picture.psize_x = 128
p.picture.psize_y = 128
p.update_icon()
toner -= 5
busy = TRUE

View File

@@ -26,3 +26,7 @@
/obj/item/ammo_casing/c45/nostamina
projectile_type = /obj/item/projectile/bullet/c45_nostamina
/obj/item/ammo_casing/c45/kitchengun
desc = "A .45 bullet casing. It has a small sponge attached to it."
projectile_type = /obj/item/projectile/bullet/c45_cleaning

View File

@@ -36,6 +36,11 @@
..()
icon_state = "45-[ammo_count() ? "8" : "0"]"
/obj/item/ammo_box/magazine/m45/kitchengun
name = "handgun magazine (.45 cleaning)"
desc = "BANG! BANG! BANG!"
ammo_type = /obj/item/ammo_casing/c45/kitchengun
/obj/item/ammo_box/magazine/pistolm9mm
name = "pistol magazine (9mm)"
icon_state = "9x19p-8"

View File

@@ -26,6 +26,12 @@
mag_type = /obj/item/ammo_box/magazine/m45
can_suppress = FALSE
/obj/item/gun/ballistic/automatic/pistol/m1911/kitchengun
name = "\improper Kitchen Gun (TM)"
desc = "Say goodbye to dirt with Kitchen Gun (TM)! Laser sight and night vision accessories sold separately."
icon_state = "kitchengun"
mag_type = /obj/item/ammo_box/magazine/m45/kitchengun
/obj/item/gun/ballistic/automatic/pistol/deagle
name = "\improper Desert Eagle"
desc = "A robust .50 AE handgun."
@@ -78,4 +84,3 @@
else
to_chat(user, "<span class='notice'>..and falls into view. Whew, that was a close one.</span>")
user.dropItemToGround(src)

View File

@@ -135,7 +135,7 @@
..()
if(!automatic_charge_overlays)
return
var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1)
var/ratio = CEILING(CLAMP(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1)
if(ratio == old_ratio && !force_update)
return
old_ratio = ratio

View File

@@ -539,7 +539,7 @@
if(check_pierce(target))
permutated += target
trajectory_ignore_forcemove = TRUE
forceMove(target)
forceMove(target.loc)
trajectory_ignore_forcemove = FALSE
return FALSE
if(!QDELETED(target))

View File

@@ -9,6 +9,40 @@
name = ".45 bullet"
damage = 30
/obj/item/projectile/bullet/c45_cleaning
name = ".45 bullet"
damage = 24
stamina = 10
/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE)
. = ..()
var/turf/T = get_turf(target)
//section shamelessly copypasta'd from the clean component
SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
for(var/A in T)
if(is_cleanable(A))
qdel(A)
else if(istype(A, /obj/item))
var/obj/item/I = A
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
if(ismob(I.loc))
var/mob/M = I.loc
M.regenerate_icons()
else if(ishuman(A))
var/mob/living/carbon/human/cleaned_human = A
if(cleaned_human.head)
SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
if(cleaned_human.wear_suit)
SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
else if(cleaned_human.w_uniform)
SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
if(cleaned_human.shoes)
SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
cleaned_human.wash_cream()
cleaned_human.regenerate_icons()
// 4.6x30mm (Autorifles)
/obj/item/projectile/bullet/c46x30mm
@@ -23,4 +57,4 @@
/obj/item/projectile/bullet/incendiary/c46x30mm
name = "4.6x30mm incendiary bullet"
damage = 10
fire_stacks = 1
fire_stacks = 1

View File

@@ -0,0 +1,46 @@
//Nuclear particle projectile - a deadly side effect of fusion
/obj/item/projectile/energy/nuclear_particle
name = "nuclear particle"
icon_state = "nuclear_particle"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 20
damage_type = TOX
irradiate = 2500 //enough to knockdown and induce vomiting
speed = 0.4
hitsound = 'sound/weapons/emitter2.ogg'
impact_type = /obj/effect/projectile/impact/xray
var/static/list/particle_colors = list(
"red" = "#FF0000",
"blue" = "#00FF00",
"green" = "#0000FF",
"yellow" = "#FFFF00",
"cyan" = "#00FFFF",
"purple" = "#FF00FF"
)
/obj/item/projectile/energy/nuclear_particle/Initialize()
. = ..()
//Random color time!
var/our_color = pick(particle_colors)
add_atom_colour(particle_colors[our_color], FIXED_COLOUR_PRIORITY)
set_light(4, 3, particle_colors[our_color]) //Range of 4, brightness of 3 - Same range as a flashlight
/atom/proc/fire_nuclear_particles(power_ratio) //used by fusion to fire random # of nuclear particles - power ratio determines about how many are fired
var/random_particles = rand(3,6)
var/particles_to_fire
var/particles_fired
switch(power_ratio) //multiply random_particles * factor for whatever tier
if(0 to FUSION_MID_TIER_THRESHOLD)
particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_LOW
if(FUSION_MID_TIER_THRESHOLD to FUSION_HIGH_TIER_THRESHOLD)
particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_MID
if(FUSION_HIGH_TIER_THRESHOLD to FUSION_SUPER_TIER_THRESHOLD)
particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_HIGH
if(FUSION_SUPER_TIER_THRESHOLD to INFINITY)
particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_SUPER
while(particles_to_fire)
particles_fired++
var/angle = rand(0,360)
var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src)
addtimer(CALLBACK(P, /obj/item/projectile.proc/fire, angle), particles_fired) //multiply particles fired * delay so the particles end up stagnated (once every decisecond)
particles_to_fire--

View File

@@ -1293,6 +1293,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 40
cant_discount = TRUE
/datum/uplink_item/cyber_implants/stealthimplant
name = "Stealth Implant"
desc = "This one-of-a-kind implant will make you almost invisible if you play your cards right."
item = /obj/item/implanter/stealth
cost = 8
// Role-specific items
/datum/uplink_item/role_restricted
category = "Role-Restricted"
@@ -1332,6 +1338,22 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 20
restricted_roles = list("Janitor")
/datum/uplink_item/role_restricted/kitchen_gun
name = "Kitchen Gun (TM)"
desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!"
cost = 10
surplus = 40
restricted_roles = list("Cook", "Janitor")
item = /obj/item/storage/box/syndie_kit/kitchen_gun
/datum/uplink_item/role_restricted/kitchen_gun_ammo
name = "Kitchen Gun (TM) .45 Magazine"
desc = "An extra eight bullets for an extra eight uses of Kitchen Gun (TM)!"
cost = 1
surplus = 0
restricted_roles = list("Cook", "Janitor")
item = /obj/item/ammo_box/magazine/m45/kitchengun
/datum/uplink_item/role_restricted/explosive_hot_potato
name = "Exploding Hot Potato"
desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead."

View File

@@ -0,0 +1,4 @@
author: "deathride58 (Original PR by Basilman/Militaires)"
delete-after: True
changes:
- rscadd: "Ported TGstation's Agent Stealth Box! You can the implanter in the syndicate uplink for 8 TC. Credit goes to Basilman/Militaires. This port includes minor adjustments, see the GitHub for details."

View File

@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- balance: "The stamina buffer now only takes 1 second to start regenerating."

View File

@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- rscadd: "Introducing the Kitchen Gun (TM)! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips for the low, low price of just 10 TC! Laser sight and night vision accessories sold separately! Magazines can be purchased individually for 1 TC a pop!"

View File

@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- tweak: "Active turf processing is now its own subsystem."

View File

@@ -0,0 +1,4 @@
author: "izzyinbox"
delete-after: True
changes:
- rscadd: "Added an integrated circuit part that interacts with the arousal system"

View File

@@ -0,0 +1,9 @@
author: "TGstation contributors"
delete-after: True
changes:
- bugfix: "(tgstation/tgstation#40043) - Beam rifles no longer open lockers"
- bugfix: "(tgstation/tgstation#40061) - Mobs can no longer get stuck at min/max body temperature"
- bugfix: "(tgstation/tgstation#40041) - Pictures of asses are now properly sized"
- bugfix: "(tgstation/tgstation#40084) - The lastattacker var now includes unarmed attacks"
- bugfix: "(tgstation/tgstation#39968) - Plastic golems can no longer ventcrawl with items in their pockets"
- bugfix: "(tgstation/tgstation#39885) - You can no longer crash the server by overcharging energy guns."

View File

@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- code_imp: "Ports tgstation/tgstation#39287 - You can now configure how fast a mob fires, and how many shots they fire in a single burst"

View File

@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- rscadd: "When you spawn as a miner, you'll get text clarifying your job description. You might not think it's necessary, but believe me, it is."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

@@ -0,0 +1,33 @@
/obj/item/integrated_circuit/manipulation/electric_stimulator
name = "electronic stimulation module"
desc = "Used to induce sexual stimulation with electricity."
icon_state = "power_relay"
extended_desc = "The circuit accepts a reference to a person and upon activation, attempts to stimulate them to orgasm."
complexity = 10
size = 3
inputs = list("target" = IC_PINTYPE_REF)
outputs = list()
activators = list("fire" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_RESEARCH
power_draw_per_use = 500
cooldown_per_use = 50
/obj/item/integrated_circuit/manipulation/electric_stimulator/do_work()
..()
var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
if(!check_target(M))
return
if(ismob(M) && M.canbearoused)
if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
var/mob/living/carbon/human/H = M
var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!")
H.visible_message("<span class='warning'>\The [assembly] electrodes shock [H]!</span>", "<span class='warning'>[orgasm_message]</span>")
playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
H.mob_climax(forced_climax=TRUE)
else
M.adjustArousalLoss(35)
var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!")
M.visible_message("<span class='warning'>\The [assembly] electrodes shock [M]!</span>", "<span class='warning'>[stimulate_message]</span>")
playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
else
visible_message("<span class='warning'>\The [assembly] electrodes fail to shock [M]!</span>")

View File

@@ -5,7 +5,7 @@
if(directstamloss > 0)
adjustStaminaLoss(directstamloss)
bufferedstam = CLAMP(bufferedstam + amount, 0, stambuffer)
stambufferregentime = world.time + 2 SECONDS
stambufferregentime = world.time + 10
if(updating_stamina)
update_health_hud()

View File

@@ -14,9 +14,9 @@
desc = "A gun magazine."
id = "10mm"
build_type = PROTOLATHE
materials = list(MAT_METAL = 18000)
materials = list(MAT_METAL = 55000)
build_path = /obj/item/ammo_box/magazine/m10mm
category = list("Weapons")
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/m10mm/hp
@@ -24,10 +24,10 @@
desc = "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
id = "10mmhp"
build_type = PROTOLATHE
materials = list(MAT_METAL = 18000, MAT_GLASS = 25000)
materials = list(MAT_METAL = 40000, MAT_GLASS = 50000)
reagents_list = list("sonic_powder" = 280)
build_path = /obj/item/ammo_box/magazine/m10mm/hp
category = list("Weapons")
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/m10mm/ap
@@ -35,9 +35,9 @@
desc = "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
id = "10mmap"
build_type = PROTOLATHE
materials = list(MAT_METAL = 18000, MAT_TITANIUM = 22000)
materials = list(MAT_METAL = 40000, MAT_TITANIUM = 60000)
build_path = /obj/item/ammo_box/magazine/m10mm/ap
category = list("Weapons")
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/bolt_clip
@@ -47,16 +47,16 @@
build_type = PROTOLATHE
materials = list(MAT_METAL = 8000)
build_path = /obj/item/ammo_box/a762
category = list("Weapons")
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/m45 //Kinda NT in throey
name = "handgun magazine (.45)"
id = "m45"
build_type = PROTOLATHE
materials = list(MAT_METAL = 8000)
materials = list(MAT_METAL = 80000)
build_path = /obj/item/ammo_box/magazine/m45
category = list("Weapons")
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/pistolm9mm
@@ -64,7 +64,7 @@
desc = "A gun magazine."
id = "pistolm9mm"
build_type = PROTOLATHE
materials = list(MAT_METAL = 16000)
materials = list(MAT_METAL = 80000)
build_path = /obj/item/ammo_box/magazine/pistolm9mm
category = list("Weapons")
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY

BIN
sound/misc/box_deploy.ogg Normal file

Binary file not shown.

View File

@@ -73,6 +73,7 @@
#include "code\__DEFINES\qdel.dm"
#include "code\__DEFINES\radiation.dm"
#include "code\__DEFINES\radio.dm"
#include "code\__DEFINES\reactions.dm"
#include "code\__DEFINES\reagents.dm"
#include "code\__DEFINES\reagents_specific_heat.dm"
#include "code\__DEFINES\research.dm"
@@ -210,6 +211,7 @@
#include "code\controllers\configuration\entries\general.dm"
#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\air.dm"
#include "code\controllers\subsystem\air_turfs.dm"
#include "code\controllers\subsystem\assets.dm"
#include "code\controllers\subsystem\atoms.dm"
#include "code\controllers\subsystem\augury.dm"
@@ -876,6 +878,7 @@
#include "code\game\objects\items\implants\implant_mindshield.dm"
#include "code\game\objects\items\implants\implant_misc.dm"
#include "code\game\objects\items\implants\implant_spell.dm"
#include "code\game\objects\items\implants\implant_stealth.dm"
#include "code\game\objects\items\implants\implant_storage.dm"
#include "code\game\objects\items\implants\implant_track.dm"
#include "code\game\objects\items\implants\implantcase.dm"
@@ -2354,6 +2357,7 @@
#include "code\modules\projectiles\projectile\energy\ebow.dm"
#include "code\modules\projectiles\projectile\energy\misc.dm"
#include "code\modules\projectiles\projectile\energy\net_snare.dm"
#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm"
#include "code\modules\projectiles\projectile\energy\stun.dm"
#include "code\modules\projectiles\projectile\energy\tesla.dm"
#include "code\modules\projectiles\projectile\magic\spellcard.dm"
@@ -2837,6 +2841,7 @@
#include "modular_citadel\code\modules\events\blob.dm"
#include "modular_citadel\code\modules\events\wizard\magicarp.dm"
#include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm"
#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm"
#include "modular_citadel\code\modules\jobs\jobs.dm"
#include "modular_citadel\code\modules\jobs\job_types\captain.dm"
#include "modular_citadel\code\modules\jobs\job_types\cargo_service.dm"