@@ -121,6 +121,8 @@
|
||||
//Atmos pipe limits
|
||||
#define MAX_OUTPUT_PRESSURE 4500 // (kPa) What pressure pumps and powered equipment max out at.
|
||||
#define MAX_TRANSFER_RATE 200 // (L/s) Maximum speed powered equipment can work at.
|
||||
#define VOLUME_PUMP_LEAK_AMOUNT 0.05 //5% of an overclocked volume pump leaks into the air
|
||||
#define VOLUME_PUMP_THRESHOLD_LEAK_AMOUNT 0.10 //10% of an overclocked volume pump leaks into the air if it goes beyond normal threshold
|
||||
|
||||
//used for device_type vars
|
||||
#define UNARY 1
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult
|
||||
GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total
|
||||
GLOBAL_VAR_INIT(clockwork_power, 0) //How many watts of power are globally available to the clockwork cult
|
||||
GLOBAL_VAR_INIT(neovgre_exists, 0) //Does neovgre exist?
|
||||
|
||||
GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence
|
||||
GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) in existence
|
||||
|
||||
@@ -30,41 +30,14 @@
|
||||
#define STIMULUM_RESEARCH_AMOUNT 50
|
||||
//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
|
||||
#define FUSION_TRITIUM_CONVERSION_COEFFICIENT (1e-10)
|
||||
#define INSTABILITY_GAS_POWER_FACTOR 0.003
|
||||
#define FUSION_TRITIUM_MOLES_USED 1
|
||||
#define PLASMA_BINDING_ENERGY 20000000
|
||||
#define TOROID_VOLUME_BREAKEVEN 1000
|
||||
#define FUSION_TEMPERATURE_THRESHOLD 10000
|
||||
#define PARTICLE_CHANCE_CONSTANT (-20000000)
|
||||
#define FUSION_RAD_MAX 2000
|
||||
#define FUSION_RAD_COEFFICIENT (-1000)
|
||||
#define FUSION_INSTABILITY_ENDOTHERMALITY 2
|
||||
@@ -448,16 +448,6 @@
|
||||
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)
|
||||
|
||||
@@ -53,7 +53,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
|
||||
var/lockdown = FALSE //disallow transit after nuke goes off
|
||||
|
||||
var/auto_call = 72000 //CIT CHANGE - time before in deciseconds in which the shuttle is auto called. Default is 2ish hours plus 15 for the shuttle. So total is 3.
|
||||
var/auto_call = 108000 //CIT CHANGE - time before in deciseconds in which the shuttle is auto called. Default is 2ish hours plus 15 for the shuttle. So total is 3./// Set to 3 by Nam previously 72000
|
||||
var/realtimeofstart = 0
|
||||
|
||||
/datum/controller/subsystem/shuttle/Initialize(timeofday)
|
||||
|
||||
@@ -19,12 +19,12 @@
|
||||
var/atom/inertia_last_loc
|
||||
var/inertia_moving = 0
|
||||
var/inertia_next_move = 0
|
||||
var/inertia_move_delay = 3
|
||||
var/inertia_move_delay = 7
|
||||
var/pass_flags = 0
|
||||
var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
|
||||
var/list/client_mobs_in_contents // This contains all the client mobs within this container
|
||||
var/list/acted_explosions //for explosion dodging
|
||||
glide_size = 7
|
||||
glide_size = 14
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE
|
||||
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
|
||||
var/floating = FALSE
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
/obj/mecha/combat/neovgre
|
||||
name = "Neovgre, the Anima Bulwark"
|
||||
desc = "Nezbere's most powerful creation, a mighty war machine of unmatched power said to have ended wars in a single night."
|
||||
icon = 'icons/mecha/neovgre.dmi'
|
||||
icon_state = "neovgre"
|
||||
max_integrity = 500 //This is THE ratvarian superweaon, its deployment is an investment
|
||||
armor = list("melee" = 50, "bullet" = 40, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) //Its similar to the clockwork armour albeit with a few buffs becuase RATVARIAN SUPERWEAPON!!
|
||||
force = 50 //SMASHY SMASHY!!
|
||||
internal_damage_threshold = 0
|
||||
step_in = 3
|
||||
pixel_x = -16
|
||||
layer = ABOVE_MOB_LAYER
|
||||
breach_time = 100 //ten seconds till all goes to shit
|
||||
recharge_rate = 100
|
||||
wreckage = /obj/structure/mecha_wreckage/durand/neovgre
|
||||
|
||||
/obj/mecha/combat/neovgre/GrantActions(mob/living/user, human_occupant = 0) //No Eject action for you sonny jim, your life for Ratvar!
|
||||
internals_action.Grant(user, src)
|
||||
cycle_action.Grant(user, src)
|
||||
lights_action.Grant(user, src)
|
||||
stats_action.Grant(user, src)
|
||||
strafing_action.Grant(user, src)
|
||||
|
||||
/obj/mecha/combat/neovgre/RemoveActions(mob/living/user, human_occupant = 0)
|
||||
internals_action.Remove(user)
|
||||
cycle_action.Remove(user)
|
||||
lights_action.Remove(user)
|
||||
stats_action.Remove(user)
|
||||
strafing_action.Remove(user)
|
||||
|
||||
/obj/mecha/combat/neovgre/MouseDrop_T(mob/M, mob/user)
|
||||
if(!is_servant_of_ratvar(user))
|
||||
to_chat(user, "<span class='brass'>BEGONE HERETIC!</span>")
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/mecha/combat/neovgre/obj_destruction()
|
||||
for(var/mob/M in src)
|
||||
to_chat(M, "<span class='brass'>You are consumed by the fires raging within Neovgre...</span>")
|
||||
M.dust()
|
||||
playsound(src, 'sound/mecha/neovgre_exploding.ogg', 100, 0)
|
||||
src.visible_message("<span class = 'userdanger'>The reactor has gone critical, its going to blow!</span>")
|
||||
addtimer(CALLBACK(src,.proc/go_critical),breach_time)
|
||||
|
||||
/obj/mecha/combat/neovgre/proc/go_critical()
|
||||
explosion(get_turf(loc), 3, 5, 10, 20, 30)
|
||||
Destroy(src)
|
||||
|
||||
/obj/mecha/combat/neovgre/container_resist(mob/living/user)
|
||||
to_chat(user, "<span class='brass'>Neovgre requires a lifetime commitment friend, no backing out now!</span>")
|
||||
return
|
||||
|
||||
/obj/mecha/combat/neovgre/process()
|
||||
..()
|
||||
if(GLOB.ratvar_awakens) // At this point only timley intervention by lord singulo could hople to stop the superweapon
|
||||
cell.charge = INFINITY
|
||||
max_integrity = INFINITY
|
||||
obj_integrity = max_integrity
|
||||
CHECK_TICK //Just to be on the safe side lag wise
|
||||
else if(cell.charge < cell.maxcharge)
|
||||
for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src))
|
||||
var/delta = min(recharge_rate, cell.maxcharge - cell.charge)
|
||||
if (get_clockwork_power() <= delta)
|
||||
cell.charge += delta
|
||||
adjust_clockwork_power(-delta)
|
||||
CHECK_TICK
|
||||
|
||||
/obj/mecha/combat/neovgre/Initialize()
|
||||
.=..()
|
||||
GLOB.neovgre_exists ++
|
||||
var/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/N = new
|
||||
N.attach(src)
|
||||
|
||||
/obj/structure/mecha_wreckage/durand/neovgre
|
||||
name = "\improper Neovgre wreckage?"
|
||||
desc = "On closer inspection this looks like the wreck of a durand with some spraypainted cardboard duct taped to it!"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre
|
||||
equip_cooldown = 8 //Rapid fire heavy laser cannon, simple yet elegant
|
||||
energy_drain = 30
|
||||
name = "Aribter Laser Cannon"
|
||||
desc = "Please re-attach this to neovgre and stop asking questions about why it looks like a normal Nanotrasen issue Solaris laser cannon - Nezbere"
|
||||
fire_sound = "sound/weapons/neovgre_laser.ogg"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy/neovgre/can_attach(obj/mecha/combat/neovgre/M)
|
||||
if(istype(M))
|
||||
return 1
|
||||
return 0
|
||||
@@ -49,6 +49,8 @@
|
||||
var/lights = FALSE
|
||||
var/lights_power = 6
|
||||
var/last_user_hud = 1 // used to show/hide the mecha hud while preserving previous preference
|
||||
var/breach_time = 0
|
||||
var/recharge_rate = 0
|
||||
|
||||
var/bumpsmash = 0 //Whether or not the mech destroys walls by running into it.
|
||||
//inner atmos
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
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/Initialize(mapload, list/datum/disease/diseases)
|
||||
. = ..()
|
||||
if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0)
|
||||
|
||||
@@ -612,10 +612,9 @@ SLIME SCANNER
|
||||
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)
|
||||
var/instability = round(cached_scan_results["fusion"], 0.01)
|
||||
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>")
|
||||
to_chat(user, "<span class='notice'>Instability of the last fusion reaction: [instability].</span>")
|
||||
return
|
||||
|
||||
//slime scanner
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
icon_state = "fork"
|
||||
force = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
grind_results = list(/datum/reagent/iron = 3, /datum/reagent/silver = 3)
|
||||
throwforce = 0
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
@@ -58,6 +59,7 @@
|
||||
name = "kitchen knife"
|
||||
icon_state = "knife"
|
||||
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
|
||||
grind_results = list(/datum/reagent/iron = 3, /datum/reagent/silver = 3)
|
||||
flags_1 = CONDUCT_1
|
||||
force = 10
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
///Reuses fire extinguisher cabinet wall mount code to create an equivalent for medkits. Honestly not sure how most of this works beyond that it does work.
|
||||
|
||||
//structure code
|
||||
/obj/structure/medkit_cabinet
|
||||
name = "Medkit Cabinet"
|
||||
desc = "A small wall mounted cabinet designed to hold a medical kit."
|
||||
icon = 'icons/obj/wallmounts.dmi'
|
||||
icon_state = "medkit_closed"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
max_integrity = 200
|
||||
integrity_failure = 50
|
||||
var/obj/item/storage/firstaid/regular/stored_medkit
|
||||
var/opened = FALSE
|
||||
|
||||
//initilization stuff for when map is loading, think it spawns medkits possibly. Honestly not sure what it does.
|
||||
/obj/structure/medkit_cabinet/Initialize(mapload, ndir, building)
|
||||
. = ..()
|
||||
if(building)
|
||||
setDir(ndir)
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -27 : 27)
|
||||
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
|
||||
opened = TRUE
|
||||
icon_state = "medkit_empty"
|
||||
else
|
||||
stored_medkit = new /obj/item/storage/firstaid/regular(src)
|
||||
|
||||
/obj/structure/medkit_cabinet/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to [opened ? "close":"open"] it.</span>")
|
||||
|
||||
/obj/structure/medkit_cabinet/Destroy()
|
||||
if(stored_medkit)
|
||||
qdel(stored_medkit)
|
||||
stored_medkit = null
|
||||
return ..()
|
||||
|
||||
//code from fire extinguishers, doesn't apply here so far as I can tell so commented out.
|
||||
obj/structure/medkit_cabinet/contents_explosion(severity, target)
|
||||
if(stored_medkit)
|
||||
stored_medkit.ex_act(severity, target)
|
||||
|
||||
/obj/structure/medkit_cabinet/handle_atom_del(atom/A)
|
||||
if(A == stored_medkit)
|
||||
stored_medkit = null
|
||||
update_icon()
|
||||
|
||||
//disassembly code
|
||||
/obj/structure/medkit_cabinet/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wrench) && !stored_medkit)
|
||||
to_chat(user, "<span class='notice'>You start unsecuring [name]...</span>")
|
||||
I.play_tool_sound(src)
|
||||
if(I.use_tool(src, user, 60))
|
||||
playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You unsecure [name].</span>")
|
||||
deconstruct(TRUE)
|
||||
return
|
||||
|
||||
if(iscyborg(user) || isalien(user))
|
||||
return
|
||||
if(istype(I, /obj/item/storage/firstaid))
|
||||
if(!stored_medkit && opened)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
stored_medkit = I
|
||||
to_chat(user, "<span class='notice'>You place [I] in [src].</span>")
|
||||
update_icon()
|
||||
return TRUE
|
||||
else
|
||||
toggle_cabinet(user)
|
||||
else if(user.a_intent != INTENT_HARM)
|
||||
toggle_cabinet(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
//storing and removing medkits.
|
||||
/obj/structure/medkit_cabinet/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(iscyborg(user) || isalien(user))
|
||||
return
|
||||
if(stored_medkit)
|
||||
user.put_in_hands(stored_medkit)
|
||||
to_chat(user, "<span class='notice'>You take [stored_medkit] from [src].</span>")
|
||||
stored_medkit = null
|
||||
if(!opened)
|
||||
opened = 1
|
||||
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
|
||||
update_icon()
|
||||
else
|
||||
toggle_cabinet(user)
|
||||
|
||||
|
||||
/obj/structure/medkit_cabinet/attack_tk(mob/user)
|
||||
if(stored_medkit)
|
||||
stored_medkit.forceMove(loc)
|
||||
to_chat(user, "<span class='notice'>You telekinetically remove [stored_medkit] from [src].</span>")
|
||||
stored_medkit = null
|
||||
opened = 1
|
||||
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
|
||||
update_icon()
|
||||
else
|
||||
toggle_cabinet(user)
|
||||
|
||||
|
||||
/obj/structure/medkit_cabinet/attack_paw(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
//closes it
|
||||
/obj/structure/medkit_cabinet/AltClick(mob/living/user)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
toggle_cabinet(user)
|
||||
|
||||
/obj/structure/medkit_cabinet/proc/toggle_cabinet(mob/user)
|
||||
if(opened && broken)
|
||||
to_chat(user, "<span class='warning'>[src] is broken open.</span>")
|
||||
else
|
||||
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
|
||||
opened = !opened
|
||||
update_icon()
|
||||
|
||||
//sprite code
|
||||
/obj/structure/medkit_cabinet/update_icon()
|
||||
if(!opened)
|
||||
icon_state = "medkit_closed"
|
||||
return
|
||||
if(stored_medkit)
|
||||
if(istype(stored_medkit, /obj/item/storage/firstaid))
|
||||
icon_state = "medkit_white"
|
||||
else
|
||||
icon_state = "medkit_white"
|
||||
else
|
||||
icon_state = "medkit_empty"
|
||||
|
||||
//drops medkit when busted
|
||||
/obj/structure/medkit_cabinet/obj_break(damage_flag)
|
||||
if(!broken && !(flags_1 & NODECONSTRUCT_1))
|
||||
broken = 1
|
||||
opened = 1
|
||||
if(stored_medkit)
|
||||
stored_medkit.forceMove(loc)
|
||||
stored_medkit = null
|
||||
update_icon()
|
||||
|
||||
//I think this is the code to determine mats you get out of it?
|
||||
/obj/structure/medkit_cabinet/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(disassembled)
|
||||
new /obj/item/wallframe/medkit_cabinet(loc)
|
||||
else
|
||||
new /obj/item/stack/sheet/metal (loc, 2)
|
||||
if(stored_medkit)
|
||||
stored_medkit.forceMove(loc)
|
||||
stored_medkit = null
|
||||
qdel(src)
|
||||
|
||||
//wall mount to put it on a wall
|
||||
/obj/item/wallframe/medkit_cabinet
|
||||
name = "Medkit wall frame."
|
||||
desc = "Used for building wall-mounted medkit cabinets."
|
||||
icon_state = "medkit"
|
||||
result_path = /obj/structure/medkit_cabinet
|
||||
@@ -60,6 +60,8 @@
|
||||
desc = "A sign labelling a restroom."
|
||||
icon_state = "restroom"
|
||||
|
||||
|
||||
|
||||
/obj/structure/sign/departments/medbay
|
||||
name = "\improper MEDBAY"
|
||||
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
|
||||
|
||||
@@ -187,6 +187,14 @@
|
||||
icon = 'icons/turf/walls/rusty_wall.dmi'
|
||||
hardness = 45
|
||||
|
||||
|
||||
/obj/effect/decal/walldivider
|
||||
name = "wall divider"
|
||||
desc = "To make things look neat"
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
icon_state = "walldiv"
|
||||
|
||||
|
||||
/turf/closed/wall/r_wall/rust
|
||||
name = "rusted reinforced wall"
|
||||
desc = "A huge chunk of rusted reinforced metal."
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
..()
|
||||
|
||||
if(usr.client != src.owner || !check_rights(0))
|
||||
message_admins("[usr.key] has attempted to override the admin panel!")
|
||||
message_admins("[usr.key] tried to use the admin panel without authorization.")
|
||||
log_admin("[key_name(usr)] tried to use the admin panel without authorization.")
|
||||
return
|
||||
|
||||
|
||||
@@ -119,3 +119,33 @@
|
||||
var/datum/clockwork_scripture/create_object/construct/clockwork_marauder/CM = new()
|
||||
CM.recent_marauders--
|
||||
qdel(CM)
|
||||
|
||||
//Summon Neovgre: Summon a very powerful combat mech that explodes when destroyed for massive damage.
|
||||
/datum/clockwork_scripture/create_object/summon_arbiter
|
||||
descname = "Powerful Assault Mech"
|
||||
name = "Summon Neovgre, the Anima Bulwark"
|
||||
desc = "Calls forth the mighty Anima Bulwark, a weapon of unmatched power,\
|
||||
mech with superior defensive and offensive capabilities. It will \
|
||||
steadily regenerate HP and triple its regeneration speed while standing \
|
||||
on a clockwork tile. It will automatically draw power from nearby sigils of \
|
||||
transmission should the need arise. Its Arbiter laser cannon can decimate foes \
|
||||
from a range and is capable of smashing through any barrier presented to it. \
|
||||
Be warned, choosing to pilot Neovgre is a lifetime commitment, once you are \
|
||||
in you cannot leave and when it is destroyed it will explode catastrophically with you inside."
|
||||
invocations = list("By the strength of the alloy...!!", "...call forth the Arbiter!!")
|
||||
channel_time = 200 // This is a strong fucking weapon, 20 seconds channel time is getting off light I tell ya.
|
||||
power_cost = 75000 //75 KW
|
||||
usage_tip = "Neovgre is a powerful mech that will crush your enemies!"
|
||||
invokers_required = 5
|
||||
multiple_invokers_used = TRUE
|
||||
object_path = /obj/mecha/combat/neovgre
|
||||
tier = SCRIPTURE_APPLICATION
|
||||
primary_component = BELLIGERENT_EYE
|
||||
sort_priority = 2
|
||||
creator_message = "<span class='brass'>Neovgre, the Anima Bulwark towers over you... your enemies reckoning has come.</span>"
|
||||
|
||||
/datum/clockwork_scripture/create_object/summon_arbiter/check_special_requirements()
|
||||
if(GLOB.neovgre_exists)
|
||||
to_chat(invoker, "<span class='brass'>\"You've already got one...\"</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
@@ -96,7 +96,6 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
id = "co2"
|
||||
specific_heat = 30
|
||||
name = "Carbon Dioxide"
|
||||
fusion_power = 3
|
||||
rarity = 700
|
||||
|
||||
/datum/gas/plasma
|
||||
@@ -132,6 +131,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
name = "Nitrous Oxide"
|
||||
gas_overlay = "nitrous_oxide"
|
||||
moles_visible = MOLES_GAS_VISIBLE * 2
|
||||
fusion_power = 10
|
||||
dangerous = TRUE
|
||||
rarity = 600
|
||||
|
||||
@@ -174,7 +174,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
|
||||
id = "pluox"
|
||||
specific_heat = 80
|
||||
name = "Pluoxium"
|
||||
fusion_power = 10
|
||||
fusion_power = -10
|
||||
rarity = 200
|
||||
|
||||
/datum/gas/miasma
|
||||
|
||||
@@ -210,9 +210,9 @@
|
||||
|
||||
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, 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). Again!
|
||||
//Fusion Rework Counter: Please increment this if you make a major overhaul to this system again.
|
||||
//5 reworks
|
||||
//6 reworks
|
||||
|
||||
/datum/gas_reaction/fusion
|
||||
exclude = FALSE
|
||||
@@ -220,100 +220,79 @@
|
||||
name = "Plasmic Fusion"
|
||||
id = "fusion"
|
||||
|
||||
//Since fusion isn't really intended to happen in successive chains, the requirements are very high
|
||||
/datum/gas_reaction/fusion/init_reqs()
|
||||
min_requirements = list(
|
||||
"TEMP" = FUSION_TEMPERATURE_THRESHOLD,
|
||||
"ENER" = FUSION_ENERGY_THRESHOLD,
|
||||
/datum/gas/tritium = FUSION_TRITIUM_MOLES_USED,
|
||||
/datum/gas/plasma = FUSION_MOLE_THRESHOLD,
|
||||
/datum/gas/tritium = FUSION_MOLE_THRESHOLD
|
||||
)
|
||||
/datum/gas/carbon_dioxide = FUSION_MOLE_THRESHOLD)
|
||||
|
||||
/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
|
||||
location = get_turf(pick(fusion_pipenet.members))
|
||||
else
|
||||
location = get_turf(holder)
|
||||
|
||||
if(!air.analyzer_results)
|
||||
air.analyzer_results = new
|
||||
var/list/cached_scan_results = air.analyzer_results
|
||||
var/old_heat_capacity = air.heat_capacity()
|
||||
var/reaction_energy = 0
|
||||
|
||||
var/mediation = FUSION_MEDIATION_FACTOR*(air.heat_capacity()-(cached_gases[/datum/gas/plasma]*GLOB.meta_gas_specific_heats[/datum/gas/plasma]))/(air.total_moles()-cached_gases[/datum/gas/plasma]) //This is the average specific heat of the mixture,not including plasma.
|
||||
|
||||
var/gases_fused = air.total_moles() - cached_gases[/datum/gas/plasma]
|
||||
var/plasma_differential = (cached_gases[/datum/gas/plasma] - gases_fused) / air.total_moles()
|
||||
var/reaction_efficiency = FUSION_EFFICIENCY_BASE ** -((plasma_differential ** 2) / FUSION_EFFICIENCY_DIVISOR) //https://www.desmos.com/calculator/6jjx3vdrvx
|
||||
|
||||
var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions.
|
||||
var/initial_plasma = cached_gases[/datum/gas/plasma]
|
||||
var/initial_carbon = cached_gases[/datum/gas/carbon_dioxide]
|
||||
var/scale_factor = (air.volume)/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions.
|
||||
var/toroidal_size = (2*PI)+TORADIANS(arctan((air.volume-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus
|
||||
var/gas_power = 0
|
||||
var/list/gas_fusion_powers = GLOB.meta_gas_fusions
|
||||
for (var/gas_id in cached_gases)
|
||||
gas_power += reaction_efficiency * (GLOB.meta_gas_fusions[gas_id]*cached_gases[gas_id])
|
||||
gas_power += (gas_fusion_powers[gas_id]*cached_gases[gas_id])
|
||||
var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR)**2,toroidal_size) //Instability effects how chaotic the behavior of the reaction is
|
||||
cached_scan_results[id] = instability//used for analyzer feedback
|
||||
|
||||
var/power_ratio = gas_power/mediation
|
||||
cached_scan_results[id] = power_ratio //used for analyzer feedback
|
||||
var/plasma = (initial_plasma-FUSION_MOLE_THRESHOLD)/(scale_factor) //We have to scale the amounts of carbon and plasma down a significant amount in order to show the chaotic dynamics we want
|
||||
var/carbon = (initial_carbon-FUSION_MOLE_THRESHOLD)/(scale_factor) //We also subtract out the threshold amount to make it harder for fusion to burn itself out.
|
||||
|
||||
for (var/gas_id in cached_gases) //and now we fuse
|
||||
cached_gases[gas_id] = 0
|
||||
//The reaction is a specific form of the Kicked Rotator system, which displays chaotic behavior and can be used to model particle interactions.
|
||||
plasma = MODULUS(plasma - (instability*sin(TODEGREES(carbon))), toroidal_size)
|
||||
carbon = MODULUS(carbon - plasma, toroidal_size)
|
||||
|
||||
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_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)
|
||||
cached_gases[/datum/gas/tritium] += 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
|
||||
cached_gases[/datum/gas/plasma] = plasma*scale_factor + FUSION_MOLE_THRESHOLD //Scales the gases back up
|
||||
cached_gases[/datum/gas/carbon_dioxide] = carbon*scale_factor + FUSION_MOLE_THRESHOLD
|
||||
var/delta_plasma = initial_plasma - cached_gases[/datum/gas/plasma]
|
||||
|
||||
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)
|
||||
cached_gases[/datum/gas/stimulum] += 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] += 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_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)
|
||||
cached_gases[/datum/gas/nitryl] += 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] += 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)
|
||||
cached_gases[/datum/gas/bz] += 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] += 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?
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, 30000)//The science is cool though.
|
||||
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
|
||||
reaction_energy += delta_plasma*PLASMA_BINDING_ENERGY //Energy is gained or lost corresponding to the creation or destruction of mass.
|
||||
if(instability < FUSION_INSTABILITY_ENDOTHERMALITY)
|
||||
reaction_energy = max(reaction_energy,0) //Stable reactions don't end up endothermic.
|
||||
else if (reaction_energy < 0)
|
||||
reaction_energy *= (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5
|
||||
|
||||
if(air.thermal_energy() + reaction_energy < 0) //No using energy that doesn't exist.
|
||||
cached_gases[/datum/gas/plasma] = initial_plasma
|
||||
cached_gases[/datum/gas/carbon_dioxide] = initial_carbon
|
||||
return NO_REACTION
|
||||
cached_gases[/datum/gas/tritium] -= FUSION_TRITIUM_MOLES_USED
|
||||
//The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic
|
||||
if(reaction_energy > 0)
|
||||
cached_gases[/datum/gas/oxygen] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
|
||||
cached_gases[/datum/gas/nitrous_oxide] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)
|
||||
else
|
||||
cached_gases[/datum/gas/bz] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
|
||||
cached_gases[/datum/gas/nitryl] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)
|
||||
|
||||
if(reaction_energy)
|
||||
if(location)
|
||||
var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up.
|
||||
if(prob(PERCENT(particle_chance)))
|
||||
location.fire_nuclear_particle()
|
||||
var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + FUSION_RAD_MAX,0)
|
||||
radiation_pulse(location,rad_power)
|
||||
|
||||
var/new_heat_capacity = air.heat_capacity()
|
||||
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
|
||||
air.temperature = max(((temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB)
|
||||
air.temperature = CLAMP(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY)
|
||||
return REACTING
|
||||
|
||||
/datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst.
|
||||
|
||||
@@ -20,6 +20,7 @@ Thus, the two variables affect pump operation are set in New():
|
||||
can_unwrench = TRUE
|
||||
|
||||
var/transfer_rate = MAX_TRANSFER_RATE
|
||||
var/overclocked = FALSE
|
||||
|
||||
var/frequency = 0
|
||||
var/id = null
|
||||
@@ -32,6 +33,8 @@ Thus, the two variables affect pump operation are set in New():
|
||||
. = ..()
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Ctrl</b> and click on it to toggle it on and off.</span>")
|
||||
to_chat(user,"<span class='notice'>You can hold <b>Alt</b> and click on it to maximize its pressure.</span>")
|
||||
if(overclocked)
|
||||
to_chat(user,"Its warning light is on" + (on ? " and it's spewing gas!" : "."))
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user)
|
||||
var/area/A = get_area(src)
|
||||
@@ -86,18 +89,33 @@ Thus, the two variables affect pump operation are set in New():
|
||||
var/datum/gas_mixture/air1 = airs[1]
|
||||
var/datum/gas_mixture/air2 = airs[2]
|
||||
|
||||
// Pump mechanism just won't do anything if the pressure is too high/too low
|
||||
// Pump mechanism just won't do anything if the pressure is too high/too low unless you overclock it.
|
||||
|
||||
var/input_starting_pressure = air1.return_pressure()
|
||||
var/output_starting_pressure = air2.return_pressure()
|
||||
|
||||
if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000))
|
||||
if((input_starting_pressure < 0.01) || ((output_starting_pressure > 9000))&&!overclocked)
|
||||
return
|
||||
|
||||
if((input_starting_pressure < 0.01) || ((output_starting_pressure > 15000)))//Overclocked pumps can only force gas a certain amount.
|
||||
return
|
||||
|
||||
var/transfer_ratio = transfer_rate/air1.volume
|
||||
|
||||
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
|
||||
|
||||
if(overclocked)//Some of the gas from the mixture leaks to the environment when overclocked
|
||||
var/turf/open/T = loc
|
||||
if(istype(T))
|
||||
if(output_starting_pressure > 9000)
|
||||
var/datum/gas_mixture/leaked = removed.remove_ratio(VOLUME_PUMP_THRESHOLD_LEAK_AMOUNT)
|
||||
T.assume_air(leaked)
|
||||
T.air_update_turf()
|
||||
else
|
||||
var/datum/gas_mixture/leaked = removed.remove_ratio(VOLUME_PUMP_LEAK_AMOUNT)
|
||||
T.assume_air(leaked)
|
||||
T.air_update_turf()
|
||||
|
||||
air2.merge(removed)
|
||||
|
||||
update_parents()
|
||||
@@ -208,3 +226,12 @@ Thus, the two variables affect pump operation are set in New():
|
||||
investigate_log("Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(user)] at [A]")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/volume_pump/multitool_act(mob/living/user, obj/item/I)
|
||||
if(!overclocked)
|
||||
overclocked = TRUE
|
||||
to_chat(user, "The pump makes a grinding noise and air starts to hiss out as you disable its pressure limits.")
|
||||
else
|
||||
overclocked = FALSE
|
||||
to_chat(user, "The pump quiets down as you turn its limiters back on.")
|
||||
return TRUE
|
||||
@@ -4,7 +4,7 @@
|
||||
desc = "Very useful for filtering gasses."
|
||||
density = FALSE
|
||||
can_unwrench = TRUE
|
||||
var/target_pressure = ONE_ATMOSPHERE
|
||||
var/transfer_rate = MAX_TRANSFER_RATE
|
||||
var/filter_type = null
|
||||
var/frequency = 0
|
||||
var/datum/radio_frequency/radio_connection
|
||||
@@ -31,8 +31,8 @@
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
|
||||
target_pressure = MAX_OUTPUT_PRESSURE
|
||||
to_chat(user,"<span class='notice'>You maximize the pressure on the [src].</span>")
|
||||
transfer_rate = MAX_TRANSFER_RATE
|
||||
to_chat(user,"<span class='notice'>You maximize the transfer rate on the [src].</span>")
|
||||
investigate_log("Filter, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
|
||||
message_admins("Filter, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
@@ -146,52 +146,52 @@
|
||||
if(!on || !(nodes[1] && nodes[2] && nodes[3]) || !is_operational())
|
||||
return
|
||||
|
||||
//Early return
|
||||
var/datum/gas_mixture/air1 = airs[1]
|
||||
if(!air1 || air1.temperature <= 0)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air2 = airs[2]
|
||||
var/datum/gas_mixture/air3 = airs[3]
|
||||
|
||||
var/output_starting_pressure = air3.return_pressure()
|
||||
|
||||
if(output_starting_pressure >= target_pressure)
|
||||
if(output_starting_pressure >= MAX_OUTPUT_PRESSURE)
|
||||
//No need to transfer if target is already full!
|
||||
return
|
||||
|
||||
//Calculate necessary moles to transfer using PV=nRT
|
||||
|
||||
var/pressure_delta = target_pressure - output_starting_pressure
|
||||
var/transfer_moles
|
||||
|
||||
if(air1.temperature > 0)
|
||||
transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
|
||||
var/transfer_ratio = transfer_rate/air1.volume
|
||||
|
||||
//Actually transfer the gas
|
||||
|
||||
if(transfer_moles > 0)
|
||||
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
|
||||
if(transfer_ratio <= 0)
|
||||
return
|
||||
|
||||
if(!removed)
|
||||
return
|
||||
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
|
||||
|
||||
var/filtering = TRUE
|
||||
if(!ispath(filter_type))
|
||||
if(filter_type)
|
||||
filter_type = gas_id2path(filter_type) //support for mappers so they don't need to type out paths
|
||||
else
|
||||
filtering = FALSE
|
||||
if(!removed)
|
||||
return
|
||||
|
||||
if(filtering && removed.gases[filter_type])
|
||||
var/datum/gas_mixture/filtered_out = new
|
||||
var/filtering = TRUE
|
||||
if(!ispath(filter_type))
|
||||
if(filter_type)
|
||||
filter_type = gas_id2path(filter_type) //support for mappers so they don't need to type out paths
|
||||
else
|
||||
filtering = FALSE
|
||||
|
||||
filtered_out.temperature = removed.temperature
|
||||
filtered_out.gases[filter_type] = removed.gases[filter_type]
|
||||
if(filtering && removed.gases[filter_type])
|
||||
var/datum/gas_mixture/filtered_out = new
|
||||
|
||||
removed.gases[filter_type] = 0
|
||||
GAS_GARBAGE_COLLECT(removed.gases)
|
||||
filtered_out.temperature = removed.temperature
|
||||
filtered_out.gases[filter_type] = removed.gases[filter_type]
|
||||
|
||||
var/datum/gas_mixture/target = (air2.return_pressure() < target_pressure ? air2 : air1) //if there's no room for the filtered gas; just leave it in air1
|
||||
target.merge(filtered_out)
|
||||
removed.gases[filter_type] = 0
|
||||
GAS_GARBAGE_COLLECT(removed.gases)
|
||||
|
||||
air3.merge(removed)
|
||||
var/datum/gas_mixture/target = (air2.return_pressure() < MAX_OUTPUT_PRESSURE ? air2 : air1) //if there's no room for the filtered gas; just leave it in air1
|
||||
target.merge(filtered_out)
|
||||
|
||||
air3.merge(removed)
|
||||
|
||||
update_parents()
|
||||
|
||||
@@ -209,8 +209,8 @@
|
||||
/obj/machinery/atmospherics/components/trinary/filter/ui_data()
|
||||
var/data = list()
|
||||
data["on"] = on
|
||||
data["pressure"] = round(target_pressure)
|
||||
data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
|
||||
data["rate"] = round(transfer_rate)
|
||||
data["max_rate"] = round(MAX_TRANSFER_RATE)
|
||||
|
||||
data["filter_types"] = list()
|
||||
data["filter_types"] += list(list("name" = "Nothing", "path" = "", "selected" = !filter_type))
|
||||
@@ -227,21 +227,21 @@
|
||||
on = !on
|
||||
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
. = TRUE
|
||||
if("pressure")
|
||||
var/pressure = params["pressure"]
|
||||
if(pressure == "max")
|
||||
pressure = MAX_OUTPUT_PRESSURE
|
||||
if("rate")
|
||||
var/rate = params["rate"]
|
||||
if(rate == "max")
|
||||
rate = MAX_TRANSFER_RATE
|
||||
. = TRUE
|
||||
else if(pressure == "input")
|
||||
pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
|
||||
if(!isnull(pressure) && !..())
|
||||
else if(rate == "input")
|
||||
rate = input("New transfer rate (0-[MAX_TRANSFER_RATE] L/s):", name, transfer_rate) as num|null
|
||||
if(!isnull(rate) && !..())
|
||||
. = TRUE
|
||||
else if(text2num(pressure) != null)
|
||||
pressure = text2num(pressure)
|
||||
else if(text2num(rate) != null)
|
||||
rate = text2num(rate)
|
||||
. = TRUE
|
||||
if(.)
|
||||
target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE)
|
||||
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE)
|
||||
investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
if("filter")
|
||||
filter_type = null
|
||||
var/filter_name = "nothing"
|
||||
|
||||
@@ -145,6 +145,30 @@
|
||||
gas_type = /datum/gas/miasma
|
||||
filled = 1
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/fusion_test
|
||||
name = "Fusion Test Canister"
|
||||
desc = "This should never be spawned in game."
|
||||
icon_state = "green"
|
||||
/obj/machinery/portable_atmospherics/canister/fusion_test/create_gas()
|
||||
//air_contents.add_gases(/datum/gas/tritium,/datum/gas/plasma,/datum/gas/carbon_dioxide,/datum/gas/nitrous_oxide)
|
||||
air_contents.gases[/datum/gas/tritium] = 100
|
||||
air_contents.gases[/datum/gas/plasma] = 500
|
||||
air_contents.gases[/datum/gas/carbon_dioxide] = 500
|
||||
air_contents.gases[/datum/gas/nitrous_oxide] = 100
|
||||
air_contents.temperature = 9999
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/fusion_test_2
|
||||
name = "Fusion Test Canister"
|
||||
desc = "This should never be spawned in game."
|
||||
icon_state = "green"
|
||||
/obj/machinery/portable_atmospherics/canister/fusion_test_2/create_gas()
|
||||
//air_contents.add_gases(/datum/gas/tritium,/datum/gas/plasma,/datum/gas/carbon_dioxide,/datum/gas/nitrous_oxide)
|
||||
air_contents.gases[/datum/gas/tritium] = 100
|
||||
air_contents.gases[/datum/gas/plasma] = 15000
|
||||
air_contents.gases[/datum/gas/carbon_dioxide] = 1500
|
||||
air_contents.gases[/datum/gas/nitrous_oxide] = 100
|
||||
air_contents.temperature = 9999
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/proc/get_time_left()
|
||||
if(timing)
|
||||
. = round(max(0, valve_timer - world.time) / 10, 1)
|
||||
|
||||
@@ -41,6 +41,16 @@
|
||||
var/dynamic_hair_suffix = ""//head > mask for head hair
|
||||
var/dynamic_fhair_suffix = ""//mask > head for facial hair
|
||||
|
||||
|
||||
//basically a restriction list.
|
||||
var/list/species_restricted = null
|
||||
//Basically syntax is species_restricted = list("Species Name","Species Name")
|
||||
//Add a "exclude" string to do the opposite, making it only only species listed that can't wear it.
|
||||
//You append this to clothing objects.
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/Initialize()
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
|
||||
@@ -338,3 +348,39 @@ BLIND // can't see anything
|
||||
deconstruct(FALSE)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
|
||||
//Species-restricted clothing check. - Thanks Oraclestation, BS13, /vg/station etc.
|
||||
/obj/item/clothing/mob_can_equip(mob/M, slot, disable_warning = TRUE)
|
||||
|
||||
//if we can't equip the item anyway, don't bother with species_restricted (also cuts down on spam)
|
||||
if(!..())
|
||||
return FALSE
|
||||
|
||||
// Skip species restriction checks on non-equipment slots
|
||||
if(slot in list(SLOT_IN_BACKPACK, SLOT_L_STORE, SLOT_R_STORE))
|
||||
return TRUE
|
||||
|
||||
if(species_restricted && ishuman(M))
|
||||
|
||||
var/wearable = null
|
||||
var/exclusive = null
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if("exclude" in species_restricted) //TURNS IT INTO A BLACKLIST - AKA ALL MINUS SPECIES LISTED.
|
||||
exclusive = TRUE
|
||||
|
||||
if(H.dna.species)
|
||||
if(exclusive)
|
||||
if(!(H.dna.species.name in species_restricted))
|
||||
wearable = TRUE
|
||||
else
|
||||
if(H.dna.species.name in species_restricted)
|
||||
wearable = TRUE
|
||||
|
||||
if(!wearable)
|
||||
to_chat(M, "<span class='warning'>Your species cannot wear [src].</span>")
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
@@ -25,6 +25,7 @@
|
||||
icon_state = "tactifool"
|
||||
item_state = "bl_suit"
|
||||
item_color = "tactifool"
|
||||
has_sensor = HAS_SENSORS
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
|
||||
/obj/item/clothing/under/syndicate/tacticool/skirt
|
||||
@@ -33,6 +34,7 @@
|
||||
icon_state = "tactifool_skirt"
|
||||
item_state = "bl_suit"
|
||||
item_color = "tactifool_skirt"
|
||||
has_sensor = HAS_SENSORS
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
@@ -67,3 +69,12 @@
|
||||
icon_state = "syndicate_combat"
|
||||
item_color = "syndicate_combat"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/syndicate/comfortable
|
||||
name = "Padded Uniform"
|
||||
desc = "A uniform of similar design to the combat uniform, it has had it's armor replaced with extra padding while providing pockets to hold useful gear."
|
||||
icon_state = "syndicate_combat"
|
||||
item_color = "syndicate_combat"
|
||||
can_adjust = FALSE
|
||||
has_sensor = HAS_SENSORS
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
|
||||
|
||||
@@ -225,3 +225,11 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
|
||||
tastes = list("beet" = 1)
|
||||
foodtype = VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soup/macaco
|
||||
name = "Macaco soup"
|
||||
desc = "To think, the monkey would've beat you to death and steal your gun."
|
||||
icon_state = "macaco"
|
||||
bonus_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 5)
|
||||
tastes = list("Monkey" = 1)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
@@ -236,3 +236,14 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/soup/beet/red
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/macaco
|
||||
name = "Macaco soup"
|
||||
reqs = list(
|
||||
/datum/reagent/water = 10,
|
||||
/obj/item/reagent_containers/glass/bowl = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/potato = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 2
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/soup/macaco
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
@@ -160,7 +160,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
|
||||
var/list/row = src.connectionHistory[i]
|
||||
if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object
|
||||
return
|
||||
if (world.IsBanned(row["ckey"], row["compid"], row["ip"], real_bans_only=TRUE))
|
||||
if (world.IsBanned(row["ckey"], row["ip"], row["compid"], real_bans_only=TRUE))
|
||||
found = row
|
||||
break
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@ Captain
|
||||
supervisors = "Nanotrasen officials and Space law"
|
||||
selection_color = "#ccccff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
minimal_player_age = 5
|
||||
// exp_requirements = 180
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/captain
|
||||
|
||||
@@ -76,10 +76,10 @@ Head of Personnel
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ddddff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_SUPPLY
|
||||
minimal_player_age = 3
|
||||
// exp_requirements = 180
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
// exp_type_department = EXP_TYPE_SUPPLY
|
||||
|
||||
outfit = /datum/outfit/job/hop
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ Chief Engineer
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ffeeaa"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 3
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_ENGINEERING
|
||||
|
||||
@@ -13,10 +13,10 @@ Chief Medical Officer
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ffddf0"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 7
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_MEDICAL
|
||||
minimal_player_age = 3
|
||||
// exp_requirements = 180
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
// exp_type_department = EXP_TYPE_MEDICAL
|
||||
|
||||
outfit = /datum/outfit/job/cmo
|
||||
|
||||
|
||||
@@ -13,10 +13,10 @@ Research Director
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ffddff"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 7
|
||||
exp_type_department = EXP_TYPE_SCIENCE
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
minimal_player_age = 3
|
||||
// exp_type_department = EXP_TYPE_SCIENCE
|
||||
// exp_requirements = 180
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/rd
|
||||
|
||||
|
||||
@@ -19,10 +19,10 @@ Head of Security
|
||||
supervisors = "the captain"
|
||||
selection_color = "#ffdddd"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 14
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_SECURITY
|
||||
minimal_player_age = 3
|
||||
// exp_requirements = 300
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
// exp_type_department = EXP_TYPE_SECURITY
|
||||
|
||||
outfit = /datum/outfit/job/hos
|
||||
|
||||
@@ -87,7 +87,7 @@ Warden
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
minimal_player_age = 7
|
||||
minimal_player_age = 3
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
@@ -143,9 +143,9 @@ Detective
|
||||
spawn_positions = 1
|
||||
supervisors = "the head of security"
|
||||
selection_color = "#ffeeee"
|
||||
minimal_player_age = 7
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
minimal_player_age = 3
|
||||
// exp_requirements = 300
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/detective
|
||||
|
||||
@@ -199,9 +199,9 @@ Security Officer
|
||||
spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions()
|
||||
supervisors = "the head of security, and the head of your assigned department (if applicable)"
|
||||
selection_color = "#ffeeee"
|
||||
minimal_player_age = 7
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
minimal_player_age = 0
|
||||
// exp_requirements = 300
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
|
||||
outfit = /datum/outfit/job/security
|
||||
|
||||
|
||||
@@ -11,10 +11,10 @@ AI
|
||||
selection_color = "#ccffcc"
|
||||
supervisors = "your laws"
|
||||
req_admin_notify = TRUE
|
||||
minimal_player_age = 30
|
||||
exp_requirements = 180
|
||||
exp_type = EXP_TYPE_CREW
|
||||
exp_type_department = EXP_TYPE_SILICON
|
||||
minimal_player_age = 5
|
||||
// exp_requirements = 180
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
// exp_type_department = EXP_TYPE_SILICON
|
||||
var/do_special_check = TRUE
|
||||
|
||||
/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, outfit_override)
|
||||
@@ -78,9 +78,9 @@ Cyborg
|
||||
spawn_positions = 1
|
||||
supervisors = "your laws and the AI" //Nodrak
|
||||
selection_color = "#ddffdd"
|
||||
minimal_player_age = 21
|
||||
exp_requirements = 120
|
||||
exp_type = EXP_TYPE_CREW
|
||||
// minimal_player_age = 0
|
||||
// exp_requirements = 120
|
||||
// exp_type = EXP_TYPE_CREW
|
||||
|
||||
/datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, outfit_override = null)
|
||||
return H.Robotize(FALSE, latejoin)
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
to_chat(user, "<span class='notice'>[src] are useless on the dead.</span>")
|
||||
return
|
||||
if(H != user)
|
||||
H.visible_message("[user] forces [H] to apply [src]... [H.p_they()] quickly regenerate all injuries!")
|
||||
H.visible_message("[user] forces [H] to apply [src]... they quickly regenerate all injuries!")
|
||||
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other"))
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.</span>")
|
||||
|
||||
@@ -957,7 +957,7 @@
|
||||
if(1)
|
||||
new /obj/item/mayhem(src)
|
||||
if(2)
|
||||
new /obj/item/blood_contract(src)
|
||||
new /obj/item/gun/magic/staff/spellblade(src)
|
||||
if(3)
|
||||
new /obj/item/gun/magic/staff/spellblade(src)
|
||||
|
||||
|
||||
@@ -46,3 +46,32 @@
|
||||
riding_datum.force_dismount(M)
|
||||
else
|
||||
R.unbuckle_all_mobs()
|
||||
|
||||
/datum/emote/speen
|
||||
key = "speen"
|
||||
key_third_person = "speeeeens!"
|
||||
restraint_check = TRUE
|
||||
mob_type_allowed_typecache = list(/mob/living, /mob/dead/observer)
|
||||
mob_type_ignore_stat_typecache = list(/mob/dead/observer)
|
||||
|
||||
/datum/emote/speen/run_emote(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
user.spin(20, 1)
|
||||
|
||||
if(iscyborg(user) && user.has_buckled_mobs())
|
||||
var/mob/living/silicon/robot/R = user
|
||||
GET_COMPONENT_FROM(riding_datum, /datum/component/riding, R)
|
||||
if(riding_datum)
|
||||
for(var/mob/M in R.buckled_mobs)
|
||||
riding_datum.force_dismount(M)
|
||||
else
|
||||
R.unbuckle_all_mobs()
|
||||
|
||||
/datum/emote/speen/run_emote(mob/living/user, params)
|
||||
if(ishuman(user))
|
||||
if(user.nextsoundemote >= world.time)
|
||||
return
|
||||
user.nextsoundemote = world.time + 7
|
||||
playsound(user, 'modular_citadel/sound/voice/speen.ogg', 50, 1, -1)
|
||||
. = ..()
|
||||
@@ -702,7 +702,7 @@
|
||||
clear_fullscreen("critvision")
|
||||
|
||||
//Oxygen damage overlay
|
||||
var/windedup = getOxyLoss() + getStaminaLoss() * 0.2 + stamdamageoverlaytemp
|
||||
var/windedup = getOxyLoss() + getStaminaLoss() * 0.2
|
||||
if(windedup)
|
||||
var/severity = 0
|
||||
switch(windedup)
|
||||
|
||||
@@ -61,6 +61,6 @@
|
||||
var/next_hallucination = 0
|
||||
var/cpr_time = 1 //CPR cooldown.
|
||||
var/damageoverlaytemp = 0
|
||||
var/stamdamageoverlaytemp = 0
|
||||
|
||||
|
||||
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
|
||||
|
||||
@@ -1783,7 +1783,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(CLONE)
|
||||
H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
|
||||
if(STAMINA)
|
||||
H.stamdamageoverlaytemp = 20
|
||||
if(BP)
|
||||
if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
|
||||
H.update_stamina()
|
||||
|
||||
@@ -4,9 +4,8 @@
|
||||
if(notransform)
|
||||
return
|
||||
|
||||
if(damageoverlaytemp || stamdamageoverlaytemp)
|
||||
if(damageoverlaytemp)
|
||||
damageoverlaytemp = 0
|
||||
stamdamageoverlaytemp = 0
|
||||
update_damage_hud()
|
||||
|
||||
if(!IsInStasis())
|
||||
|
||||
@@ -339,7 +339,7 @@
|
||||
death()
|
||||
|
||||
|
||||
/mob/living/incapacitated(ignore_restraints, ignore_grab, ignore_stasis)
|
||||
/mob/living/incapacitated(ignore_restraints, ignore_grab)
|
||||
if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here
|
||||
return TRUE
|
||||
|
||||
@@ -603,7 +603,7 @@
|
||||
..(pressure_difference, direction, pressure_resistance_prob_delta)
|
||||
|
||||
/mob/living/can_resist()
|
||||
return !((next_move > world.time) || incapacitated(ignore_restraints = TRUE, ignore_stasis= TRUE))
|
||||
return !((next_move > world.time) || incapacitated(ignore_restraints = TRUE))
|
||||
|
||||
/mob/living/verb/resist()
|
||||
set name = "Resist"
|
||||
@@ -1011,8 +1011,6 @@
|
||||
var/has_legs = get_num_legs()
|
||||
var/has_arms = get_num_arms()
|
||||
var/ignore_legs = get_leg_ignore()
|
||||
var/in_stasis = IsInStasis()
|
||||
var/canmove = !buckled && (pulledby) && !chokehold && !IsFrozen() && !in_stasis && (has_arms || ignore_legs || has_legs)
|
||||
var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground
|
||||
if(ko || move_and_fall || IsStun() || chokehold) // Cit change - makes resting not force you to drop everything
|
||||
drop_all_held_items()
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
|
||||
if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
|
||||
var/efficiency = 0.00025 + (hot_air.reaction_results["fire"]*0.01)
|
||||
var/efficiency = 0.45
|
||||
|
||||
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
|
||||
|
||||
|
||||
@@ -5,12 +5,21 @@
|
||||
#define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty.
|
||||
#define OXYGEN_HEAT_PENALTY 1
|
||||
#define CO2_HEAT_PENALTY 0.1
|
||||
#define NITROGEN_HEAT_MODIFIER -1.5
|
||||
#define PLUOXIUM_HEAT_PENALTY -1
|
||||
#define TRITIUM_HEAT_PENALTY 10
|
||||
#define NITROGEN_HEAT_PENALTY -1.5
|
||||
#define BZ_HEAT_PENALTY 5
|
||||
|
||||
#define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation.
|
||||
#define PLASMA_TRANSMIT_MODIFIER 4
|
||||
#define BZ_TRANSMIT_MODIFIER -2
|
||||
|
||||
#define TRITIUM_RADIOACTIVITY_MODIFIER 3 //Higher == Crystal spews out more radiation
|
||||
#define BZ_RADIOACTIVITY_MODIFIER 5
|
||||
#define PLUOXIUM_RADIOACTIVITY_MODIFIER -2
|
||||
|
||||
#define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage.
|
||||
#define PLUOXIUM_HEAT_RESISTANCE 3
|
||||
|
||||
#define POWERLOSS_INHIBITION_GAS_THRESHOLD 0.20 //Higher == Higher percentage of inhibitor gas needed before the charge inertia chain reaction effect starts.
|
||||
#define POWERLOSS_INHIBITION_MOLE_THRESHOLD 20 //Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. //Scales powerloss inhibition down until this amount of moles is reached
|
||||
@@ -53,6 +62,7 @@
|
||||
#define SUPERMATTER_EMERGENCY_PERCENT 25
|
||||
#define SUPERMATTER_DANGER_PERCENT 50
|
||||
#define SUPERMATTER_WARNING_PERCENT 100
|
||||
#define CRITICAL_TEMPERATURE 10000
|
||||
|
||||
#define SUPERMATTER_COUNTDOWN_TIME 30 SECONDS
|
||||
|
||||
@@ -102,6 +112,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
var/o2comp = 0
|
||||
var/co2comp = 0
|
||||
var/n2ocomp = 0
|
||||
var/pluoxiumcomp = 0
|
||||
var/tritiumcomp = 0
|
||||
var/bzcomp = 0
|
||||
|
||||
var/pluoxiumbonus = 0
|
||||
|
||||
var/combined_gas = 0
|
||||
var/gasmix_power_ratio = 0
|
||||
@@ -184,8 +199,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
to_chat(H, "<span class='danger'>You get headaches just from looking at it.</span>")
|
||||
return
|
||||
|
||||
#define CRITICAL_TEMPERATURE 10000
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/proc/get_status()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
@@ -354,16 +367,24 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
plasmacomp = max(removed.gases[/datum/gas/plasma]/combined_gas, 0)
|
||||
o2comp = max(removed.gases[/datum/gas/oxygen]/combined_gas, 0)
|
||||
co2comp = max(removed.gases[/datum/gas/carbon_dioxide]/combined_gas, 0)
|
||||
pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium]/combined_gas, 0)
|
||||
tritiumcomp = max(removed.gases[/datum/gas/tritium]/combined_gas, 0)
|
||||
bzcomp = max(removed.gases[/datum/gas/bz]/combined_gas, 0)
|
||||
|
||||
n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide]/combined_gas, 0)
|
||||
n2comp = max(removed.gases[/datum/gas/nitrogen]/combined_gas, 0)
|
||||
|
||||
gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp, 0), 1)
|
||||
if(pluoxiumcomp >= 0.15)
|
||||
pluoxiumbonus = 1 //makes pluoxium only work at 15%+
|
||||
else
|
||||
pluoxiumbonus = 0
|
||||
|
||||
dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY)+(o2comp * OXYGEN_HEAT_PENALTY)+(co2comp * CO2_HEAT_PENALTY)+(n2comp * NITROGEN_HEAT_MODIFIER), 0.5)
|
||||
dynamic_heat_resistance = max(n2ocomp * N2O_HEAT_RESISTANCE, 1)
|
||||
gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp + tritiumcomp + bzcomp - pluoxiumcomp - n2comp, 0), 1)
|
||||
|
||||
power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER), 0)
|
||||
dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY) + (o2comp * OXYGEN_HEAT_PENALTY) + (co2comp * CO2_HEAT_PENALTY) + (tritiumcomp * TRITIUM_HEAT_PENALTY) + ((pluoxiumcomp * PLUOXIUM_HEAT_PENALTY) * pluoxiumbonus) + (n2comp * NITROGEN_HEAT_PENALTY) + (bzcomp * BZ_HEAT_PENALTY), 0.5)
|
||||
dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1)
|
||||
|
||||
power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER), 0)
|
||||
|
||||
//more moles of gases are harder to heat than fewer, so let's scale heat damage around them
|
||||
mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25)
|
||||
@@ -392,7 +413,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
|
||||
|
||||
if(prob(50))
|
||||
radiation_pulse(src, power * (1 + power_transmission_bonus/10))
|
||||
radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%)
|
||||
if(bzcomp >= 0.4 && prob(50 * bzcomp))
|
||||
fire_nuclear_particle() // Start to emit radballs at a maximum of 50% chance per tick - was 30% before but figured that's mild
|
||||
|
||||
var/device_energy = power * REACTION_POWER_MODIFIER
|
||||
|
||||
@@ -527,11 +550,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
/obj/machinery/power/supermatter_crystal/attack_tk(mob/user)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a supermatter crystal.</span>")
|
||||
to_chat(C, "<span class='userdanger'>That was a really dense idea.</span>")
|
||||
C.ghostize()
|
||||
C.visible_message("<span class='userdanger'>A bright flare of radiation is seen from [C]'s head, shortly before you hear a sickening sizzling!</span>")
|
||||
var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
|
||||
rip_u.Remove(C)
|
||||
qdel(rip_u)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/attack_paw(mob/user)
|
||||
dust_mob(user, cause = "monkey attack")
|
||||
@@ -787,4 +813,4 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
#undef HALLUCINATION_RANGE
|
||||
#undef GRAVITATIONAL_ANOMALY
|
||||
#undef FLUX_ANOMALY
|
||||
#undef PYRO_ANOMALY
|
||||
#undef PYRO_ANOMALY
|
||||
@@ -36,7 +36,7 @@
|
||||
var/datum/point/vector/trajectory
|
||||
var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location!
|
||||
|
||||
var/speed = 0.8 //Amount of deciseconds it takes for projectile to travel
|
||||
var/speed = 0.5 //Amount of deciseconds it takes for projectile to travel
|
||||
var/Angle = 0
|
||||
var/original_angle = 0 //Angle at firing
|
||||
var/nondirectional_sprite = FALSE //Set TRUE to prevent projectiles from having their sprites rotated based on firing angle
|
||||
|
||||
@@ -3,10 +3,9 @@
|
||||
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
|
||||
flag = "rad"
|
||||
irradiate = 5000
|
||||
speed = 0.4
|
||||
hitsound = 'sound/weapons/emitter2.ogg'
|
||||
impact_type = /obj/effect/projectile/impact/xray
|
||||
var/static/list/particle_colors = list(
|
||||
@@ -25,22 +24,6 @@
|
||||
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--
|
||||
/atom/proc/fire_nuclear_particle(angle = rand(0,360)) //used by fusion to fire random nuclear particles. Fires one particle in a random direction.
|
||||
var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src)
|
||||
P.fire(angle)
|
||||
@@ -1170,6 +1170,7 @@
|
||||
overdose_threshold = 25
|
||||
pH = 11
|
||||
|
||||
//Hyperstation 13 nerf.
|
||||
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-3 * REM, 0)
|
||||
M.adjustFireLoss(-3 * REM, 0)
|
||||
@@ -1177,7 +1178,7 @@
|
||||
M.adjustToxLoss(-3 * REM, 0, TRUE) //Heals TOXINLOVERS
|
||||
M.adjustBrainLoss(2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
|
||||
M.adjustCloneLoss(-1 * REM, 0)
|
||||
M.adjustStaminaLoss(-30 * REM, 0)
|
||||
M.adjustStaminaLoss(-3 * REM, 0)
|
||||
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
|
||||
M.druggy = min(max(0, M.druggy + 10), 15) //See above
|
||||
..()
|
||||
|
||||
@@ -1328,10 +1328,12 @@
|
||||
..()
|
||||
ADD_TRAIT(L, TRAIT_STUNIMMUNE, id)
|
||||
ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, id)
|
||||
ADD_TRAIT(L, TRAIT_NOSLIPALL, id)
|
||||
|
||||
/datum/reagent/stimulum/on_mob_end_metabolize(mob/living/L)
|
||||
REMOVE_TRAIT(L, TRAIT_STUNIMMUNE, id)
|
||||
REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, id)
|
||||
REMOVE_TRAIT(L, TRAIT_NOSLIPALL, id)
|
||||
..()
|
||||
|
||||
/datum/reagent/stimulum/on_mob_life(mob/living/carbon/M)
|
||||
@@ -1358,6 +1360,11 @@
|
||||
REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, id)
|
||||
..()
|
||||
|
||||
/datum/reagent/nitryl/on_mob_life(mob/living/carbon/M)
|
||||
current_cycle++
|
||||
holder.remove_reagent(id, 0.99) //Gives time for the next tick of life().
|
||||
. = TRUE //Update status effects.
|
||||
|
||||
/////////////////////////Coloured Crayon Powder////////////////////////////
|
||||
//For colouring in /proc/mix_color_from_reagents
|
||||
|
||||
|
||||
@@ -65,6 +65,15 @@
|
||||
///Medical//
|
||||
////////////
|
||||
|
||||
|
||||
/datum/design/medkit
|
||||
name = "Medkit Cabinent"
|
||||
id = "medkit_cabinet"
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 4000)
|
||||
build_path = /obj/item/wallframe/medkit_cabinet
|
||||
category = list("initial", "Medical")
|
||||
|
||||
/datum/design/scalpel
|
||||
name = "Scalpel"
|
||||
id = "scalpel"
|
||||
|
||||
@@ -574,9 +574,39 @@
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
|
||||
/////////////////////
|
||||
//Adv Surgery Tools//
|
||||
/////////////////////
|
||||
/datum/design/laserscalpel
|
||||
name = "Laser Scalpel"
|
||||
desc = "A laser scalpel used for precise cutting."
|
||||
id = "laserscalpel"
|
||||
build_path = /obj/item/scalpel/advanced
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 6000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 1500, MAT_DIAMOND = 200, MAT_TITANIUM = 4000)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/mechanicalpinches
|
||||
name = "Mechanical Pinches"
|
||||
desc = "These pinches can be either used as retractor or hemostat."
|
||||
id = "mechanicalpinches"
|
||||
build_path = /obj/item/retractor/advanced
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 12000, MAT_GLASS = 4000, MAT_SILVER = 4000, MAT_TITANIUM = 5000)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/searingtool
|
||||
name = "Searing Tool"
|
||||
desc = "Used to mend tissue togheter."
|
||||
id = "searingtool"
|
||||
build_path = /obj/item/cautery/advanced
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 4000, MAT_GLASS = 2000, MAT_PLASMA = 2000, MAT_URANIUM = 3000, MAT_TITANIUM = 3000)
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/drapes
|
||||
name = "Plastic Drapes"
|
||||
@@ -588,65 +618,6 @@
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/retractor_adv
|
||||
name = "Advanced Retractor"
|
||||
desc = "A high-class, premium retractor, featuring precision crafted, silver-plated hook-ends and an electrum handle."
|
||||
id = "retractor_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_GOLD = 1000)
|
||||
build_path = /obj/item/retractor/adv
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/hemostat_adv
|
||||
name = "Advanced Hemostat"
|
||||
desc = "An exceptionally fine pair of arterial forceps. These appear to be plated in electrum and feel soft to the touch."
|
||||
id = "hemostat_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1000, MAT_GOLD = 1500)
|
||||
build_path = /obj/item/hemostat/adv
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/cautery_adv
|
||||
name = "Electrocautery" //This is based on real-life science.
|
||||
desc = "A high-tech unipolar Electrocauter. This tiny device contains an extremely powerful microbattery that uses arcs of electricity to painlessly sear wounds shut. It seems to recharge with the user's body-heat. Wow!"
|
||||
id = "cautery_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1000, MAT_GOLD = 1500)
|
||||
build_path = /obj/item/cautery/adv
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/surgicaldrill_adv
|
||||
name = "Surgical Autodrill"
|
||||
desc = "With a diamond tip and built-in depth and safety sensors, this drill alerts the user before overpenetrating a patient's skull or tooth. There also appears to be a disable switch."
|
||||
id = "surgicaldrill_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2500, MAT_GLASS = 2500, MAT_SILVER = 6000, MAT_GOLD = 5500, MAT_DIAMOND = 3500)
|
||||
build_path = /obj/item/surgicaldrill/adv
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/scalpel_adv
|
||||
name = "Precision Scalpel"
|
||||
desc = "A perfectly balanced electrum scalpel with a silicon-coated edge to eliminate wear and tear."
|
||||
id = "scalpel_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1500, MAT_GLASS = 1500, MAT_SILVER = 4000, MAT_GOLD = 2500)
|
||||
build_path = /obj/item/scalpel/adv
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/circular_saw_adv
|
||||
name = "Diamond-Grit Circular Saw"
|
||||
desc = "For those Assistants with REALLY thick skulls."
|
||||
id = "circular_saw_adv"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 7500, MAT_GLASS = 6000, MAT_SILVER = 6500, MAT_GOLD = 7500, MAT_DIAMOND = 4500)
|
||||
build_path = /obj/item/circular_saw/adv
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////Alien Surgery Tools////////////
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani",
|
||||
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
|
||||
"space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
|
||||
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","chem_pack")
|
||||
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","chem_pack","medkit_cabinet")
|
||||
|
||||
/datum/techweb_node/mmi
|
||||
id = "mmi"
|
||||
@@ -96,7 +96,7 @@
|
||||
display_name = "Advanced Surgery Tools"
|
||||
description = "Refined and improved redesigns for the run-of-the-mill medical utensils."
|
||||
prereq_ids = list("adv_biotech", "adv_surgery")
|
||||
design_ids = list("drapes", "retractor_adv", "hemostat_adv", "cautery_adv", "surgicaldrill_adv", "scalpel_adv", "circular_saw_adv")
|
||||
design_ids = list("drapes", "laserscalpel", "mechanicalpinches", "searingtool" )
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
|
||||
@@ -285,3 +285,4 @@
|
||||
|
||||
/obj/effect/decal/hammerandsickle/shuttleRotate(rotation)
|
||||
setDir(angle2dir(rotation+dir2angle(dir))) // No parentcall, rest of the rotate code breaks the pixel offset.
|
||||
|
||||
|
||||
@@ -79,8 +79,7 @@ GLOBAL_LIST_INIT(summoned_special_magic, list(
|
||||
/obj/item/storage/belt/wands/full,
|
||||
/obj/item/antag_spawner/contract,
|
||||
/obj/item/gun/magic/staff/chaos,
|
||||
/obj/item/necromantic_stone,
|
||||
/obj/item/blood_contract))
|
||||
/obj/item/necromantic_stone))
|
||||
|
||||
// If true, it's the probability of triggering "survivor" antag.
|
||||
GLOBAL_VAR_INIT(summon_guns_triggered, FALSE)
|
||||
|
||||
@@ -317,7 +317,8 @@
|
||||
H.adjustFireLoss(nitryl_pp/4)
|
||||
gas_breathed = breath_gases[/datum/gas/nitryl]
|
||||
if (gas_breathed > gas_stimulation_min)
|
||||
H.reagents.add_reagent("no2",1)
|
||||
var/existing = H.reagents.get_reagent_amount("no2")
|
||||
H.reagents.add_reagent("no2", max(0, 5 - existing))
|
||||
|
||||
breath_gases[/datum/gas/nitryl]-=gas_breathed
|
||||
|
||||
|
||||
@@ -332,7 +332,7 @@
|
||||
icon_state = "spectrometer"
|
||||
item_flags = NOBLUDGEON
|
||||
var/list/advanced_surgeries = list()
|
||||
|
||||
|
||||
/obj/item/surgical_processor/afterattack(obj/item/O, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
@@ -350,3 +350,115 @@
|
||||
advanced_surgeries |= OC.advanced_surgeries
|
||||
return TRUE
|
||||
return
|
||||
|
||||
/obj/item/scalpel/advanced
|
||||
name = "laser scalpel"
|
||||
desc = "An advanced scalpel which uses laser technology to cut. It's set to scalpel mode."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "scalpel_a"
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
force = 16
|
||||
toolspeed = 0.7
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
|
||||
/obj/item/scalpel/advanced/Initialize()
|
||||
. = ..()
|
||||
set_light(1)
|
||||
|
||||
/obj/item/scalpel/advanced/attack_self(mob/user)
|
||||
playsound(get_turf(user),'sound/machines/click.ogg',50,TRUE)
|
||||
var/obj/item/circular_saw/advanced/saw = new /obj/item/circular_saw/advanced(drop_location())
|
||||
to_chat(user, "<span class='notice'>You incease the power, now it can cut bones.</span>")
|
||||
qdel(src)
|
||||
user.put_in_active_hand(saw)
|
||||
|
||||
/obj/item/circular_saw/advanced
|
||||
name = "laser scalpel"
|
||||
desc = "An advanced scalpel which uses laser technology to cut. It's set to saw mode."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "saw_a"
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
force = 17
|
||||
toolspeed = 0.7
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
|
||||
/obj/item/circular_saw/advanced/Initialize()
|
||||
. = ..()
|
||||
set_light(2)
|
||||
|
||||
/obj/item/circular_saw/advanced/attack_self(mob/user)
|
||||
playsound(get_turf(user),'sound/machines/click.ogg',50,TRUE)
|
||||
var/obj/item/scalpel/advanced/scalpel = new /obj/item/scalpel/advanced(drop_location())
|
||||
to_chat(user, "<span class='notice'>You lower the power.</span>")
|
||||
qdel(src)
|
||||
user.put_in_active_hand(scalpel)
|
||||
|
||||
/obj/item/retractor/advanced
|
||||
name = "mechanical pinches"
|
||||
desc = "An agglomerate of rods and gears. It resembles a retractor."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "retractor_a"
|
||||
toolspeed = 0.7
|
||||
|
||||
/obj/item/retractor/advanced/attack_self(mob/user)
|
||||
playsound(get_turf(user),'sound/items/change_drill.ogg',50,TRUE)
|
||||
var/obj/item/hemostat/advanced/hemostat = new /obj/item/hemostat/advanced(drop_location())
|
||||
to_chat(user, "<span class='notice'>You set the [src] to hemostat mode.</span>")
|
||||
qdel(src)
|
||||
user.put_in_active_hand(hemostat)
|
||||
|
||||
/obj/item/hemostat/advanced
|
||||
name = "mechanical pinches"
|
||||
desc = "An agglomerate of rods and gears. It resembles an hemostat."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "hemostat_a"
|
||||
toolspeed = 0.7
|
||||
|
||||
/obj/item/hemostat/advanced/attack_self(mob/user)
|
||||
playsound(get_turf(user),'sound/items/change_drill.ogg',50,TRUE)
|
||||
var/obj/item/retractor/advanced/retractor = new /obj/item/retractor/advanced(drop_location())
|
||||
to_chat(user, "<span class='notice'>You set the [src] to retractor mode.</span>")
|
||||
qdel(src)
|
||||
user.put_in_active_hand(retractor)
|
||||
|
||||
/obj/item/surgicaldrill/advanced
|
||||
name = "searing tool"
|
||||
desc = "It projects a high power laser used for medical application. It's set to drilling mode."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "surgicaldrill_a"
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
toolspeed = 0.7
|
||||
light_color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/item/surgicaldrill/advanced/Initialize()
|
||||
. = ..()
|
||||
set_light(1)
|
||||
|
||||
/obj/item/surgicaldrill/advanced/attack_self(mob/user)
|
||||
playsound(get_turf(user),'sound/weapons/tap.ogg',50,TRUE)
|
||||
var/obj/item/cautery/advanced/cautery = new /obj/item/cautery/advanced(drop_location())
|
||||
to_chat(user, "<span class='notice'>You dilate the lenses, setting it to mending mode.</span>")
|
||||
qdel(src)
|
||||
user.put_in_active_hand(cautery)
|
||||
|
||||
/obj/item/cautery/advanced
|
||||
name = "searing tool"
|
||||
desc = "It projects a high power laser used for medical application. It's set to mending mode."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "cautery_a"
|
||||
hitsound = 'sound/items/welder2.ogg'
|
||||
force = 15
|
||||
toolspeed = 0.7
|
||||
light_color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/item/cautery/advanced/Initialize()
|
||||
. = ..()
|
||||
set_light(1)
|
||||
|
||||
/obj/item/cautery/advanced/attack_self(mob/user)
|
||||
playsound(get_turf(user),'sound/items/welderdeactivate.ogg',50,TRUE)
|
||||
var/obj/item/surgicaldrill/advanced/surgicaldrill = new /obj/item/surgicaldrill/advanced(drop_location())
|
||||
to_chat(user, "<span class='notice'>You focus the lensess, it is now set to drilling mode.</span>")
|
||||
qdel(src)
|
||||
user.put_in_active_hand(surgicaldrill)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
view = "15x15"
|
||||
hub = "Exadv1.spacestation13"
|
||||
name = "/tg/ Station 13"
|
||||
fps = 20
|
||||
fps = 10
|
||||
#ifdef FIND_REF_NO_CHECK_TICK
|
||||
loop_checks = FALSE
|
||||
#endif
|
||||
|
||||
@@ -7,17 +7,17 @@
|
||||
#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
|
||||
#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
|
||||
|
||||
#_maps/RandomZLevels/blackmarketpackers.dmm
|
||||
_maps/RandomZLevels/blackmarketpackers.dmm
|
||||
#_maps/RandomZLevels/spacebattle.dmm
|
||||
#_maps/RandomZLevels/beach.dmm
|
||||
#_maps/RandomZLevels/Academy.dmm
|
||||
#_maps/RandomZLevels/wildwest.dmm
|
||||
#_maps/RandomZLevels/challenge.dmm
|
||||
#_maps/RandomZLevels/centcomAway.dmm
|
||||
#_maps/RandomZLevels/moonoutpost19.dmm
|
||||
#_maps/RandomZLevels/undergroundoutpost45.dmm
|
||||
#_maps/RandomZLevels/caves.dmm
|
||||
#_maps/RandomZLevels/snowdin.dmm
|
||||
#_maps/RandomZLevels/research.dmm
|
||||
_maps/RandomZLevels/moonoutpost19.dmm
|
||||
_maps/RandomZLevels/undergroundoutpost45.dmm
|
||||
_maps/RandomZLevels/caves.dmm
|
||||
_maps/RandomZLevels/snowdin.dmm
|
||||
_maps/RandomZLevels/research.dmm
|
||||
#_maps/RandomZLevels/Cabin.dmm
|
||||
#_maps/RandomZLevels/beach2.dmm
|
||||
|
||||
@@ -291,10 +291,10 @@ TICK_LIMIT_MC_INIT 500
|
||||
|
||||
##Defines the ticklag for the world. Ticklag is the amount of time between game ticks (aka byond ticks) (in 1/10ths of a second).
|
||||
## This also controls the client network update rate, as well as the default client fps
|
||||
TICKLAG 0.5
|
||||
#TICKLAG 0.5
|
||||
|
||||
##Can also be set as per-second value, the following value is identical to the above.
|
||||
#FPS 20
|
||||
FPS 10
|
||||
|
||||
## Comment this out to disable automuting
|
||||
#AUTOMUTE_ON
|
||||
|
||||
@@ -92,6 +92,7 @@ PROBABILITY SECRET_EXTENDED 0
|
||||
PROBABILITY DEVIL 0
|
||||
PROBABILITY DEVIL_AGENTS 0
|
||||
PROBABILITY CLOWNOPS 0
|
||||
PROBABILITY WEREWOLF 1
|
||||
|
||||
## You probably want to keep sandbox off by default for secret and random.
|
||||
PROBABILITY SANDBOX 0
|
||||
@@ -114,6 +115,7 @@ CONTINUOUS CLOCKWORK_CULT
|
||||
CONTINUOUS CHANGELING
|
||||
CONTINUOUS WIZARD
|
||||
#CONTINUOUS MONKEY
|
||||
#CONTINUOUS WEREWOLF
|
||||
|
||||
##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately!
|
||||
|
||||
@@ -136,6 +138,7 @@ MIDROUND_ANTAG CLOCKWORK_CULT
|
||||
MIDROUND_ANTAG CHANGELING
|
||||
MIDROUND_ANTAG WIZARD
|
||||
#MIDROUND_ANTAG MONKEY
|
||||
#MIDROUND_ANTAG WEREWOLF
|
||||
|
||||
## Uncomment these for overrides of the minimum / maximum number of players in a round type.
|
||||
## If you set any of these occasionally check to see if you still need them as the modes
|
||||
@@ -176,6 +179,9 @@ MIDROUND_ANTAG WIZARD
|
||||
#MIN_POP MONKEY 20
|
||||
#MAX_POP MONKEY -1
|
||||
|
||||
#MIN_POP WEREWOLF 20
|
||||
#MAX_POP WEREWOLF -1
|
||||
|
||||
#MIN_POP METEOR 0
|
||||
#MAX_POP METEOR -1
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/mob/living/simple_animal/hostile/mimic
|
||||
name = "Mimic"
|
||||
icon = 'hyperstation/icons/mobs/mimic.dmi'
|
||||
icon_state = "mimic"
|
||||
icon_living = "mimic"
|
||||
icon_dead = "mimic_dead"
|
||||
gender = NEUTER
|
||||
speak_chance = 0
|
||||
turns_per_move = 5
|
||||
maxHealth = 30
|
||||
health = 30
|
||||
see_in_dark = 3
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/killertomato = 2)
|
||||
response_help = "prods"
|
||||
response_disarm = "pushes aside"
|
||||
response_harm = "smacks"
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 12
|
||||
attacktext = "slams"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
faction = list("plants")
|
||||
|
||||
var/unstealth = FALSE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/Initialize()
|
||||
// When initialized, make sure they take the form of something.
|
||||
unstealth = FALSE
|
||||
Mimictransform()
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/proc/Mimictransform()
|
||||
|
||||
var/transformitem = rand(1,3)
|
||||
|
||||
if (unstealth == FALSE)
|
||||
switch(transformitem)
|
||||
if(1)
|
||||
//Glass
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "glass_empty"
|
||||
aggro_vision_range = 0
|
||||
|
||||
if(2)
|
||||
//Glass
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "glass_empty"
|
||||
aggro_vision_range = 0
|
||||
|
||||
if(3)
|
||||
//Glass
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "glass_empty"
|
||||
aggro_vision_range = 0
|
||||
else
|
||||
//back to normal
|
||||
icon = 'hyperstation/icons/mobs/mimic.dmi'
|
||||
icon_state = "mimic"
|
||||
@@ -0,0 +1,25 @@
|
||||
/mob/living/simple_animal/hostile/werewolf
|
||||
name = "Werewolf"
|
||||
desc = "A towering creature!"
|
||||
icon = 'hyperstation/icons/mobs/werewolf.dmi'
|
||||
icon_state = "idle"
|
||||
icon_living = "idle"
|
||||
icon_dead = "idle"
|
||||
gender = NEUTER
|
||||
speak_chance = 0
|
||||
turns_per_move = 2
|
||||
maxHealth = 30
|
||||
health = 30
|
||||
see_in_dark = 7
|
||||
response_help = "pets"
|
||||
response_disarm = "pushes aside"
|
||||
response_harm = "smacks"
|
||||
melee_damage_lower = 12
|
||||
melee_damage_upper = 20
|
||||
attacktext = "slams"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
faction = list("werewolf")
|
||||
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 150
|
||||
maxbodytemp = 500
|
||||
@@ -0,0 +1,233 @@
|
||||
/obj/decal/stencil
|
||||
name = "stencil"
|
||||
desc = "A letter, one of many used to make words."
|
||||
icon = 'hyperstation/icons/decals/decal_new.dmi'
|
||||
icon_state = "a"
|
||||
anchored = TRUE
|
||||
layer = WALL_OBJ_LAYER
|
||||
|
||||
left
|
||||
pixel_x = -3 //fine-tune from this offset
|
||||
pixel_y = 8
|
||||
alpha = 200
|
||||
a
|
||||
name = "a"
|
||||
icon_state = "a"
|
||||
b
|
||||
name = "b"
|
||||
icon_state = "b"
|
||||
c
|
||||
name = "c"
|
||||
icon_state = "c"
|
||||
d
|
||||
name = "d"
|
||||
icon_state = "d"
|
||||
e
|
||||
name = "e"
|
||||
icon_state = "e"
|
||||
f
|
||||
name = "f"
|
||||
icon_state = "f"
|
||||
g
|
||||
name = "g"
|
||||
icon_state = "g"
|
||||
h
|
||||
name = "h"
|
||||
icon_state = "h"
|
||||
i
|
||||
name = "i"
|
||||
icon_state = "i"
|
||||
j
|
||||
name = "j"
|
||||
icon_state = "j"
|
||||
k
|
||||
name = "k"
|
||||
icon_state = "k"
|
||||
l
|
||||
name = "l"
|
||||
icon_state = "l"
|
||||
m
|
||||
name = "m"
|
||||
icon_state = "m"
|
||||
n
|
||||
name = "n"
|
||||
icon_state = "n"
|
||||
o
|
||||
name = "o"
|
||||
icon_state = "o"
|
||||
p
|
||||
name = "p"
|
||||
icon_state = "p"
|
||||
q
|
||||
name = "q"
|
||||
icon_state = "q"
|
||||
r
|
||||
name = "r"
|
||||
icon_state = "r"
|
||||
s
|
||||
name = "s"
|
||||
icon_state = "s"
|
||||
t
|
||||
name = "t"
|
||||
icon_state = "t"
|
||||
u
|
||||
name = "u"
|
||||
icon_state = "u"
|
||||
v
|
||||
name = "v"
|
||||
icon_state = "v"
|
||||
w
|
||||
name = "w"
|
||||
icon_state = "w"
|
||||
x
|
||||
name = "x"
|
||||
icon_state = "x"
|
||||
y
|
||||
name = "y"
|
||||
icon_state = "y"
|
||||
z
|
||||
name = "z"
|
||||
icon_state = "z"
|
||||
one
|
||||
name = "one"
|
||||
icon_state = "1"
|
||||
two
|
||||
name = "two"
|
||||
icon_state = "2"
|
||||
three
|
||||
name = "three"
|
||||
icon_state = "3"
|
||||
four
|
||||
name = "four"
|
||||
icon_state = "4"
|
||||
five
|
||||
name = "five"
|
||||
icon_state = "5"
|
||||
six
|
||||
name = "six"
|
||||
icon_state = "6"
|
||||
seven
|
||||
name = "seven"
|
||||
icon_state = "7"
|
||||
eight
|
||||
name = "eight"
|
||||
icon_state = "8"
|
||||
nine
|
||||
name = "nine"
|
||||
icon_state = "9"
|
||||
zero
|
||||
name = "zero"
|
||||
icon_state = "0"
|
||||
|
||||
right
|
||||
pixel_x = 13 // fine-tune from this offset
|
||||
pixel_y = 8
|
||||
alpha = 200
|
||||
a
|
||||
name = "a"
|
||||
icon_state = "a"
|
||||
b
|
||||
name = "b"
|
||||
icon_state = "b"
|
||||
c
|
||||
name = "c"
|
||||
icon_state = "c"
|
||||
d
|
||||
name = "d"
|
||||
icon_state = "d"
|
||||
e
|
||||
name = "e"
|
||||
icon_state = "e"
|
||||
f
|
||||
name = "f"
|
||||
icon_state = "f"
|
||||
g
|
||||
name = "g"
|
||||
icon_state = "g"
|
||||
h
|
||||
name = "h"
|
||||
icon_state = "h"
|
||||
i
|
||||
name = "i"
|
||||
icon_state = "i"
|
||||
j
|
||||
name = "j"
|
||||
icon_state = "j"
|
||||
k
|
||||
name = "k"
|
||||
icon_state = "k"
|
||||
l
|
||||
name = "l"
|
||||
icon_state = "l"
|
||||
m
|
||||
name = "m"
|
||||
icon_state = "m"
|
||||
n
|
||||
name = "n"
|
||||
icon_state = "n"
|
||||
o
|
||||
name = "o"
|
||||
icon_state = "o"
|
||||
p
|
||||
name = "p"
|
||||
icon_state = "p"
|
||||
q
|
||||
name = "q"
|
||||
icon_state = "q"
|
||||
r
|
||||
name = "r"
|
||||
icon_state = "r"
|
||||
s
|
||||
name = "s"
|
||||
icon_state = "s"
|
||||
t
|
||||
name = "t"
|
||||
icon_state = "t"
|
||||
u
|
||||
name = "u"
|
||||
icon_state = "u"
|
||||
v
|
||||
name = "v"
|
||||
icon_state = "v"
|
||||
w
|
||||
name = "w"
|
||||
icon_state = "w"
|
||||
x
|
||||
name = "x"
|
||||
icon_state = "x"
|
||||
y
|
||||
name = "y"
|
||||
icon_state = "y"
|
||||
z
|
||||
name = "z"
|
||||
icon_state = "z"
|
||||
one
|
||||
name = "one"
|
||||
icon_state = "1"
|
||||
two
|
||||
name = "two"
|
||||
icon_state = "2"
|
||||
three
|
||||
name = "three"
|
||||
icon_state = "3"
|
||||
four
|
||||
name = "four"
|
||||
icon_state = "4"
|
||||
five
|
||||
name = "five"
|
||||
icon_state = "5"
|
||||
six
|
||||
name = "six"
|
||||
icon_state = "6"
|
||||
seven
|
||||
name = "seven"
|
||||
icon_state = "7"
|
||||
eight
|
||||
name = "eight"
|
||||
icon_state = "8"
|
||||
nine
|
||||
name = "nine"
|
||||
icon_state = "9"
|
||||
zero
|
||||
name = "zero"
|
||||
icon_state = "0"
|
||||
@@ -0,0 +1,55 @@
|
||||
/obj/item/pregnancytest
|
||||
name = "pregnancy test"
|
||||
desc = "a one time use small device, used to determine if someone is pregnant or not. Also comes with a force feature to freak out your ex (alt click)."
|
||||
icon = 'hyperstation/icons/obj/pregnancytest.dmi'
|
||||
throwforce = 0
|
||||
icon_state = "ptest"
|
||||
var/status = 0
|
||||
var/results = "null"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
|
||||
/obj/item/pregnancytest/attack_self(mob/user)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(!isliving(user))
|
||||
return
|
||||
if(isAI(user))
|
||||
return
|
||||
if(user.stat > 0)//unconscious or dead
|
||||
return
|
||||
if(status == 1)
|
||||
return //Already been used once, pregnancy tests only work once.
|
||||
test(user)
|
||||
|
||||
|
||||
/obj/item/pregnancytest/AltClick(mob/living/user)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(!isliving(user))
|
||||
return
|
||||
if(isAI(user))
|
||||
return
|
||||
if(user.stat > 0)//unconscious or dead
|
||||
return //Already been used once, pregnancy tests only work once.
|
||||
if(status == 1)
|
||||
return
|
||||
force(user)
|
||||
|
||||
/obj/item/pregnancytest/proc/force(mob/living/user)
|
||||
//just for fun or roleplay, force it.
|
||||
results = "positive"
|
||||
icon_state = "positive"
|
||||
status = 1
|
||||
name = "[results] pregnancy test"
|
||||
to_chat(user, "<span class='notice'>You force the device to read possive.</span>")
|
||||
|
||||
|
||||
|
||||
/obj/item/pregnancytest/proc/test(mob/living/user)
|
||||
//This is where the pregancy checker would be, if and when pregnancy is coded. SO we can always assume the person is not pregnant because there is no code for it.
|
||||
results = "negative"
|
||||
icon_state = "negative"
|
||||
name = "[results] pregnancy test"
|
||||
status = 1
|
||||
to_chat(user, "<span class='notice'>You use the pregnancy test, after a pause one pink line lights up on the display, reading negative.</span>")
|
||||
|
After Width: | Height: | Size: 659 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 472 B |
|
After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 670 B After Width: | Height: | Size: 849 B |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -151,10 +151,14 @@
|
||||
|
||||
var/items = o.get_contents()
|
||||
for(var/obj/item/W in items)
|
||||
if(W == o.w_uniform || W == o.wear_suit)
|
||||
o.dropItemToGround(W, TRUE)
|
||||
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
|
||||
to_chat(owner, "<span class='warning'>Your enormous package is way to large to fit anything over!</b></span>")
|
||||
if (o.arousalloss > 32) // warning that your shaft is getting errect!
|
||||
if(W == o.w_uniform || W == o.wear_suit )
|
||||
to_chat(M, "<span class='warning'>Your swelling cock begins to strain against your clothes tightly!</b></span>")
|
||||
if (o.arousalloss > 33)
|
||||
if(W == o.w_uniform || W == o.wear_suit )
|
||||
o.dropItemToGround(W, TRUE)
|
||||
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
|
||||
to_chat(owner, "<span class='warning'>Your erect member is way to large to fit anything over! You will need to be flaccid again to wear clothes!</b></span>")
|
||||
/*
|
||||
switch(round(P.cached_length))
|
||||
if(21)
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
/obj/item/reagent_containers/glass/bottle/morphine = 4,
|
||||
/obj/item/reagent_containers/glass/bottle/toxin = 3,
|
||||
/obj/item/reagent_containers/syringe/antiviral = 6,
|
||||
/obj/item/pregnancytest = 5,
|
||||
/obj/item/storage/hypospraykit/fire = 2,
|
||||
/obj/item/storage/hypospraykit/toxin = 2,
|
||||
/obj/item/storage/hypospraykit/o2 = 2,
|
||||
|
||||
@@ -143,6 +143,11 @@
|
||||
category = SLOT_W_UNIFORM
|
||||
path = /obj/item/clothing/under/pants/track
|
||||
|
||||
/datum/gear/comfortable
|
||||
name = "Padded Uniform"
|
||||
category = SLOT_W_UNIFORM
|
||||
path = /obj/item/clothing/under/syndicate/comfortable
|
||||
|
||||
// Pantsless Sweaters
|
||||
|
||||
/datum/gear/turtleneck
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/datum/job/captain
|
||||
minimal_player_age = 20
|
||||
exp_type = EXP_TYPE_COMMAND
|
||||
minimal_player_age = 3
|
||||
// exp_type = EXP_TYPE_COMMAND
|
||||
|
||||
/datum/job/hop
|
||||
minimal_player_age = 20
|
||||
exp_type_department = EXP_TYPE_SERVICE
|
||||
minimal_player_age = 3
|
||||
// exp_type_department = EXP_TYPE_SERVICE
|
||||
|
||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
||||
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
department_head = list("Captain")
|
||||
supervisors = "the captain"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 10
|
||||
exp_requirements = 180
|
||||
exp_type_department = EXP_TYPE_SUPPLY
|
||||
minimal_player_age = 3
|
||||
// exp_requirements = 180
|
||||
// exp_type_department = EXP_TYPE_SUPPLY
|
||||
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS)
|
||||
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/job/chief_engineer
|
||||
minimal_player_age = 10
|
||||
|
||||
minimal_player_age = 3
|
||||
|
||||
/datum/job/engineer
|
||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||
@@ -10,5 +10,5 @@
|
||||
/datum/job/atmos
|
||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
|
||||
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE,
|
||||
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE,
|
||||
ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/job/cmo
|
||||
minimal_player_age = 10
|
||||
minimal_player_age = 3
|
||||
|
||||
/datum/outfit/job/doctor
|
||||
backpack_contents = list(/obj/item/storage/hypospraykit/regular)
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
/datum/job/rd
|
||||
minimal_player_age = 10
|
||||
minimal_player_age = 3
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/job/hos
|
||||
minimal_player_age = 10
|
||||
|
||||
minimal_player_age = 3
|
||||
|
||||
/datum/outfit/job/warden
|
||||
suit_store = /obj/item/gun/energy/pumpaction/defender
|
||||
|
||||
@@ -273,8 +273,8 @@
|
||||
if (P.cached_length >= 20.5 && P.cached_length < 21)
|
||||
if(H.w_uniform || H.wear_suit|| H.arousalloss > 33)
|
||||
var/target = M.get_bodypart(BODY_ZONE_CHEST)
|
||||
to_chat(M, "<span class='warning'>Your cock begin to strain against your clothes tightly!</b></span>")
|
||||
M.apply_damage(2.5, BRUTE, target)
|
||||
to_chat(M, "<span class='warning'>Your cock begins to strain against your clothes tightly!</b></span>")
|
||||
M.apply_damage(1, BRUTE, target)
|
||||
|
||||
P.update()
|
||||
..()
|
||||
|
||||
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 668 B After Width: | Height: | Size: 967 B |
@@ -50,7 +50,7 @@ menu "menu"
|
||||
window "mainwindow"
|
||||
elem "mainwindow"
|
||||
type = MAIN
|
||||
pos = 0,0
|
||||
pos = 281,0
|
||||
size = 640x440
|
||||
anchor1 = none
|
||||
anchor2 = none
|
||||
@@ -94,10 +94,11 @@ window "mainwindow"
|
||||
window "mapwindow"
|
||||
elem "mapwindow"
|
||||
type = MAIN
|
||||
pos = 0,0
|
||||
pos = 281,0
|
||||
size = 640x480
|
||||
anchor1 = none
|
||||
anchor2 = none
|
||||
background-color = none
|
||||
saved-params = "pos;size;is-minimized;is-maximized"
|
||||
is-pane = true
|
||||
elem "map"
|
||||
@@ -115,7 +116,7 @@ window "mapwindow"
|
||||
window "infowindow"
|
||||
elem "infowindow"
|
||||
type = MAIN
|
||||
pos = 0,0
|
||||
pos = 281,0
|
||||
size = 640x480
|
||||
anchor1 = none
|
||||
anchor2 = none
|
||||
@@ -197,7 +198,7 @@ window "infowindow"
|
||||
window "outputwindow"
|
||||
elem "outputwindow"
|
||||
type = MAIN
|
||||
pos = 0,0
|
||||
pos = 281,0
|
||||
size = 640x480
|
||||
anchor1 = none
|
||||
anchor2 = none
|
||||
@@ -274,26 +275,28 @@ window "statwindow"
|
||||
window "preferences_window"
|
||||
elem "preferences_window"
|
||||
type = MAIN
|
||||
pos = 372,0
|
||||
size = 1280x1000
|
||||
pos = 435,99
|
||||
size = 1000x600
|
||||
anchor1 = none
|
||||
anchor2 = none
|
||||
background-color = none
|
||||
is-visible = false
|
||||
saved-params = "pos;size;is-minimized;is-maximized"
|
||||
statusbar = false
|
||||
elem "preferences_browser"
|
||||
type = BROWSER
|
||||
pos = 0,0
|
||||
size = 960x1000
|
||||
anchor1 = 0,0
|
||||
anchor2 = 75,100
|
||||
pos = 250,0
|
||||
size = 750x618
|
||||
anchor1 = 25,0
|
||||
anchor2 = 100,100
|
||||
background-color = none
|
||||
saved-params = ""
|
||||
elem "character_preview_map"
|
||||
type = MAP
|
||||
pos = 960,0
|
||||
size = 320x1000
|
||||
anchor1 = 75,0
|
||||
anchor2 = 100,100
|
||||
pos = 0,0
|
||||
size = 250x618
|
||||
anchor1 = 0,0
|
||||
anchor2 = 25,100
|
||||
right-click = true
|
||||
saved-params = "zoom;letterbox;zoom-mode"
|
||||
|
||||
|
||||