Merge pull request #3 from quotefox/master

update
This commit is contained in:
shellspeed1
2019-10-15 16:32:08 -07:00
committed by GitHub
104 changed files with 8484 additions and 7552 deletions
File diff suppressed because it is too large Load Diff
+2
View File
@@ -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
+1
View File
@@ -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
+10 -37
View File
@@ -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
-10
View File
@@ -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)
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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
+89
View File
@@ -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
+2
View File
@@ -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)
+2 -3
View File
@@ -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
+2
View File
@@ -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
+164
View File
@@ -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."
+1 -1
View File
@@ -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)
+46
View File
@@ -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
+11
View File
@@ -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
+1 -1
View File
@@ -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
+7 -7
View File
@@ -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
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+11 -11
View File
@@ -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
+7 -7
View File
@@ -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)
+29
View File
@@ -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)
. = ..()
+1 -1
View File
@@ -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()
+1 -2
View File
@@ -4,9 +4,8 @@
if(notransform)
return
if(damageoverlaytemp || stamdamageoverlaytemp)
if(damageoverlaytemp)
damageoverlaytemp = 0
stamdamageoverlaytemp = 0
update_damage_hud()
if(!IsInStasis())
+2 -4
View File
@@ -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()
+1 -1
View File
@@ -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)
+36 -10
View File
@@ -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
+1 -1
View File
@@ -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////////////
+2 -2
View File
@@ -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
+1
View File
@@ -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)
+2 -1
View File
@@ -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
+113 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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
+6
View File
@@ -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
+58
View File
@@ -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"
+25
View File
@@ -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
+233
View File
@@ -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"
+55
View File
@@ -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>")
Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 670 B

After

Width:  |  Height:  |  Size: 849 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

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()
..()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 668 B

After

Width:  |  Height:  |  Size: 967 B

+17 -14
View File
@@ -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"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

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