mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-11 15:15:32 +01:00
Merge remote-tracking branch 'polaris/master' into pl-chemistry
This commit is contained in:
@@ -81,7 +81,7 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging
|
||||
heat_limit = H.species.heat_level_3
|
||||
|
||||
if(pipe_air.temperature > heat_limit + 1)
|
||||
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest", used_weapon = "Excessive Heat")
|
||||
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_TORSO, used_weapon = "Excessive Heat")
|
||||
|
||||
//fancy radiation glowing
|
||||
if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K
|
||||
|
||||
+6
-6
@@ -227,14 +227,14 @@ mob/living/carbon/human/airflow_hit(atom/A)
|
||||
bloody_body(src)
|
||||
var/b_loss = airflow_speed * vsc.airflow_damage
|
||||
|
||||
var/blocked = run_armor_check("head","melee")
|
||||
apply_damage(b_loss/3, BRUTE, "head", blocked, 0, "Airflow")
|
||||
var/blocked = run_armor_check(BP_HEAD,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, 0, "Airflow")
|
||||
|
||||
blocked = run_armor_check("chest","melee")
|
||||
apply_damage(b_loss/3, BRUTE, "chest", blocked, 0, "Airflow")
|
||||
blocked = run_armor_check(BP_TORSO,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, 0, "Airflow")
|
||||
|
||||
blocked = run_armor_check("groin","melee")
|
||||
apply_damage(b_loss/3, BRUTE, "groin", blocked, 0, "Airflow")
|
||||
blocked = run_armor_check(BP_GROIN,"melee")
|
||||
apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, 0, "Airflow")
|
||||
|
||||
if(airflow_speed > 10)
|
||||
Paralyse(round(airflow_speed * vsc.airflow_stun))
|
||||
|
||||
+22
-22
@@ -65,12 +65,12 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
|
||||
/zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0)
|
||||
if(!fuel_objs.len)
|
||||
return
|
||||
|
||||
//As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel,
|
||||
|
||||
//As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel,
|
||||
//some have less, but whatever. It will mean that sometimes we will remove a tiny bit less fuel then we intended to.
|
||||
|
||||
|
||||
var/fuel_to_remove = used_liquid_fuel/(fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL) //convert back to liquid volume units
|
||||
|
||||
|
||||
for(var/O in fuel_objs)
|
||||
var/obj/effect/decal/cleanable/liquid_fuel/fuel = O
|
||||
if(!istype(fuel))
|
||||
@@ -188,7 +188,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
|
||||
return
|
||||
|
||||
set_dir(pick(cardinal))
|
||||
|
||||
|
||||
var/datum/gas_mixture/air_contents = loc.return_air()
|
||||
color = fire_color(air_contents.temperature)
|
||||
set_light(3, 1, color)
|
||||
@@ -209,7 +209,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
|
||||
var/turf/T = loc
|
||||
if (istype(T))
|
||||
set_light(0)
|
||||
|
||||
|
||||
T.fire = null
|
||||
loc = null
|
||||
air_master.active_hotspots.Remove(src)
|
||||
@@ -224,12 +224,12 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
|
||||
/datum/gas_mixture/proc/zburn(zone/zone, force_burn, no_check = 0)
|
||||
. = 0
|
||||
if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null)))
|
||||
|
||||
|
||||
#ifdef FIREDBG
|
||||
log_debug("***************** FIREDBG *****************")
|
||||
log_debug("Burning [zone? zone.name : "zoneless gas_mixture"]!")
|
||||
#endif
|
||||
|
||||
|
||||
var/gas_fuel = 0
|
||||
var/liquid_fuel = 0
|
||||
var/total_fuel = 0
|
||||
@@ -278,7 +278,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
|
||||
var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress
|
||||
var/used_fuel = min(total_reaction_progress, reaction_limit)
|
||||
var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT)
|
||||
|
||||
|
||||
#ifdef FIREDBG
|
||||
log_debug("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]")
|
||||
log_debug("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]")
|
||||
@@ -312,12 +312,12 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
|
||||
//calculate the energy produced by the reaction and then set the new temperature of the mix
|
||||
temperature = (starting_energy + vsc.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / heat_capacity()
|
||||
update_values()
|
||||
|
||||
|
||||
#ifdef FIREDBG
|
||||
log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]")
|
||||
log_debug("new temperature = [temperature]; new pressure = [return_pressure()]")
|
||||
#endif
|
||||
|
||||
|
||||
return firelevel
|
||||
|
||||
datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
|
||||
@@ -369,19 +369,19 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
|
||||
if(total_combustables > 0)
|
||||
//slows down the burning when the concentration of the reactants is low
|
||||
var/damping_multiplier = min(1, active_combustables / (total_moles/group_multiplier))
|
||||
|
||||
|
||||
//weight the damping mult so that it only really brings down the firelevel when the ratio is closer to 0
|
||||
damping_multiplier = 2*damping_multiplier - (damping_multiplier*damping_multiplier)
|
||||
|
||||
|
||||
//calculates how close the mixture of the reactants is to the optimum
|
||||
//fires burn better when there is more oxidizer -- too much fuel will choke the fire out a bit, reducing firelevel.
|
||||
var/mix_multiplier = 1 / (1 + (5 * ((total_fuel / total_combustables) ** 2)))
|
||||
|
||||
|
||||
#ifdef FIREDBG
|
||||
ASSERT(damping_multiplier <= 1)
|
||||
ASSERT(mix_multiplier <= 1)
|
||||
#endif
|
||||
|
||||
|
||||
//toss everything together -- should produce a value between 0 and fire_firelevel_multiplier
|
||||
firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * damping_multiplier
|
||||
|
||||
@@ -425,10 +425,10 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
|
||||
|
||||
//Always check these damage procs first if fire damage isn't working. They're probably what's wrong.
|
||||
|
||||
apply_damage(2.5*mx*head_exposure, BURN, "head", 0, 0, "Fire")
|
||||
apply_damage(2.5*mx*chest_exposure, BURN, "chest", 0, 0, "Fire")
|
||||
apply_damage(2.0*mx*groin_exposure, BURN, "groin", 0, 0, "Fire")
|
||||
apply_damage(0.6*mx*legs_exposure, BURN, "l_leg", 0, 0, "Fire")
|
||||
apply_damage(0.6*mx*legs_exposure, BURN, "r_leg", 0, 0, "Fire")
|
||||
apply_damage(0.4*mx*arms_exposure, BURN, "l_arm", 0, 0, "Fire")
|
||||
apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire")
|
||||
apply_damage(2.5*mx*head_exposure, BURN, BP_HEAD, 0, 0, "Fire")
|
||||
apply_damage(2.5*mx*chest_exposure, BURN, BP_TORSO, 0, 0, "Fire")
|
||||
apply_damage(2.0*mx*groin_exposure, BURN, BP_GROIN, 0, 0, "Fire")
|
||||
apply_damage(0.6*mx*legs_exposure, BURN, BP_L_LEG, 0, 0, "Fire")
|
||||
apply_damage(0.6*mx*legs_exposure, BURN, BP_R_LEG, 0, 0, "Fire")
|
||||
apply_damage(0.4*mx*arms_exposure, BURN, BP_L_ARM, 0, 0, "Fire")
|
||||
apply_damage(0.4*mx*arms_exposure, BURN, BP_R_ARM, 0, 0, "Fire")
|
||||
|
||||
+4
-8
@@ -116,11 +116,7 @@ obj/var/contaminated = 0
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/burn_eyes()
|
||||
//The proc that handles eye burning.
|
||||
if(!species.has_organ["eyes"])
|
||||
return
|
||||
|
||||
var/obj/item/organ/eyes/E = internal_organs_by_name["eyes"]
|
||||
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
|
||||
if(E)
|
||||
if(prob(20)) src << "<span class='danger'>Your eyes burn!</span>"
|
||||
E.damage += 2.5
|
||||
@@ -143,15 +139,15 @@ obj/var/contaminated = 0
|
||||
//Checks if the suit is adequately sealed.
|
||||
var/coverage = 0
|
||||
for(var/obj/item/protection in list(wear_suit, gloves, shoes))
|
||||
if(!protection)
|
||||
if(!protection)
|
||||
continue
|
||||
if(vsc.plc.PHORONGUARD_ONLY && !(protection.flags & PHORONGUARD))
|
||||
return 0
|
||||
coverage |= protection.body_parts_covered
|
||||
|
||||
|
||||
if(vsc.plc.PHORONGUARD_ONLY)
|
||||
return 1
|
||||
|
||||
|
||||
return BIT_TEST_ALL(coverage, UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS)
|
||||
|
||||
/mob/living/carbon/human/proc/suit_contamination()
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#define IS_UNATHI 4
|
||||
#define IS_TAJARA 5
|
||||
#define IS_XENOS 6
|
||||
#define IS_MACHINE 7
|
||||
|
||||
#define CE_STABLE "stable" // Inaprovaline
|
||||
#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin
|
||||
|
||||
@@ -30,15 +30,15 @@
|
||||
#define AIR_DAMAGE_MODIFIER 2.025 // More means less damage from hot air scalding lungs, less = more damage. (default 2.025)
|
||||
|
||||
// Organ defines.
|
||||
#define ORGAN_CUT_AWAY 1<<0
|
||||
#define ORGAN_BLEEDING 1<<1
|
||||
#define ORGAN_BROKEN 1<<2
|
||||
#define ORGAN_DESTROYED 1<<3
|
||||
#define ORGAN_ROBOT 1<<4
|
||||
#define ORGAN_SPLINTED 1<<5
|
||||
#define ORGAN_DEAD 1<<6
|
||||
#define ORGAN_MUTATED 1<<7
|
||||
#define ORGAN_ASSISTED 1<<8
|
||||
#define ORGAN_CUT_AWAY (1<<0)
|
||||
#define ORGAN_BLEEDING (1<<1)
|
||||
#define ORGAN_BROKEN (1<<2)
|
||||
#define ORGAN_DESTROYED (1<<3)
|
||||
#define ORGAN_ROBOT (1<<4)
|
||||
#define ORGAN_SPLINTED (1<<5)
|
||||
#define ORGAN_DEAD (1<<6)
|
||||
#define ORGAN_MUTATED (1<<7)
|
||||
#define ORGAN_ASSISTED (1<<8)
|
||||
|
||||
#define DROPLIMB_EDGE 0
|
||||
#define DROPLIMB_BLUNT 1
|
||||
|
||||
@@ -136,3 +136,39 @@
|
||||
|
||||
#define INCAPACITATION_DEFAULT (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY)
|
||||
#define INCAPACITATION_ALL (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY)
|
||||
|
||||
// Bodyparts and organs.
|
||||
#define O_MOUTH "mouth"
|
||||
#define O_EYES "eyes"
|
||||
#define O_HEART "heart"
|
||||
#define O_LUNGS "lungs"
|
||||
#define O_BRAIN "brain"
|
||||
#define O_LIVER "liver"
|
||||
#define O_KIDNEYS "kidneys"
|
||||
#define O_PLASMA "plasma vessel"
|
||||
#define O_HIVE "hive node"
|
||||
#define O_NUTRIENT "nutrient vessel"
|
||||
#define O_STRATA "neural strata"
|
||||
#define O_RESPONSE "response node"
|
||||
#define O_GBLADDER "gas bladder"
|
||||
#define O_POLYP "polyp segment"
|
||||
#define O_ANCHOR "anchoring ligament"
|
||||
#define O_ACID "acid gland"
|
||||
#define O_EGG "egg sac"
|
||||
#define O_RESIN "resin spinner"
|
||||
|
||||
#define BP_L_FOOT "l_foot"
|
||||
#define BP_R_FOOT "r_foot"
|
||||
#define BP_L_LEG "l_leg"
|
||||
#define BP_R_LEG "r_leg"
|
||||
#define BP_L_HAND "l_hand"
|
||||
#define BP_R_HAND "r_hand"
|
||||
#define BP_L_ARM "l_arm"
|
||||
#define BP_R_ARM "r_arm"
|
||||
#define BP_HEAD "head"
|
||||
#define BP_TORSO "torso"
|
||||
#define BP_GROIN "groin"
|
||||
#define BP_ALL list(BP_GROIN, BP_TORSO, BP_HEAD, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG)
|
||||
|
||||
#define SYNTH_BLOOD_COLOUR "#030303"
|
||||
#define SYNTH_FLESH_COLOUR "#575757"
|
||||
@@ -1,12 +1,10 @@
|
||||
// Species flags.
|
||||
#define NO_BLOOD 0x1 // Vessel var is not filled with blood, cannot bleed out.
|
||||
#define NO_BREATHE 0x2 // Cannot suffocate or take oxygen loss.
|
||||
#define NO_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona/vox), cut resistant (slimes) or incorporeal (shadows)
|
||||
#define IS_PLANT 0x2 // Is a treeperson.
|
||||
#define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen.
|
||||
#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator.
|
||||
#define NO_SLIP 0x10 // Cannot fall over.
|
||||
#define NO_POISON 0x20 // Cannot not suffer toxloss.
|
||||
#define IS_PLANT 0x40 // Is a treeperson.
|
||||
#define NO_MINOR_CUT 0x80 // Can step on broken glass with no ill-effects. Either thick skin (diona/vox), cut resistant (slimes) or incorporeal (shadows)
|
||||
// unused: 0x8000 - higher than this will overflow
|
||||
|
||||
// Species spawn flags
|
||||
|
||||
+16
-10
@@ -29,10 +29,13 @@ proc/random_hair_style(gender, species = "Human")
|
||||
var/list/valid_hairstyles = list()
|
||||
for(var/hairstyle in hair_styles_list)
|
||||
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
|
||||
if(gender == MALE && S.gender == FEMALE)
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
|
||||
if(gender != NEUTER && gender != PLURAL)
|
||||
if(gender == MALE && S.gender == FEMALE)
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
|
||||
if( !(species in S.species_allowed))
|
||||
continue
|
||||
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
|
||||
@@ -48,10 +51,13 @@ proc/random_facial_hair_style(gender, species = "Human")
|
||||
var/list/valid_facialhairstyles = list()
|
||||
for(var/facialhairstyle in facial_hair_styles_list)
|
||||
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
|
||||
if(gender == MALE && S.gender == FEMALE)
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
|
||||
if(gender != NEUTER && gender != PLURAL)
|
||||
if(gender == MALE && S.gender == FEMALE)
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
|
||||
if( !(species in S.species_allowed))
|
||||
continue
|
||||
|
||||
@@ -61,12 +67,12 @@ proc/random_facial_hair_style(gender, species = "Human")
|
||||
f_style = pick(valid_facialhairstyles)
|
||||
|
||||
return f_style
|
||||
|
||||
|
||||
proc/sanitize_name(name, species = "Human")
|
||||
var/datum/species/current_species
|
||||
if(species)
|
||||
current_species = all_species[species]
|
||||
|
||||
|
||||
return current_species ? current_species.sanitize_name(name) : sanitizeName(name)
|
||||
|
||||
proc/random_name(gender, species = "Human")
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
name = "damage zone"
|
||||
icon_state = "zone_sel"
|
||||
screen_loc = ui_zonesel
|
||||
var/selecting = "chest"
|
||||
var/selecting = BP_TORSO
|
||||
|
||||
/obj/screen/zone_sel/Click(location, control,params)
|
||||
var/list/PL = params2list(params)
|
||||
@@ -110,52 +110,52 @@
|
||||
if(1 to 3) //Feet
|
||||
switch(icon_x)
|
||||
if(10 to 15)
|
||||
selecting = "r_foot"
|
||||
selecting = BP_R_FOOT
|
||||
if(17 to 22)
|
||||
selecting = "l_foot"
|
||||
selecting = BP_L_FOOT
|
||||
else
|
||||
return 1
|
||||
if(4 to 9) //Legs
|
||||
switch(icon_x)
|
||||
if(10 to 15)
|
||||
selecting = "r_leg"
|
||||
selecting = BP_R_LEG
|
||||
if(17 to 22)
|
||||
selecting = "l_leg"
|
||||
selecting = BP_L_LEG
|
||||
else
|
||||
return 1
|
||||
if(10 to 13) //Hands and groin
|
||||
switch(icon_x)
|
||||
if(8 to 11)
|
||||
selecting = "r_hand"
|
||||
selecting = BP_R_HAND
|
||||
if(12 to 20)
|
||||
selecting = "groin"
|
||||
selecting = BP_GROIN
|
||||
if(21 to 24)
|
||||
selecting = "l_hand"
|
||||
selecting = BP_L_HAND
|
||||
else
|
||||
return 1
|
||||
if(14 to 22) //Chest and arms to shoulders
|
||||
switch(icon_x)
|
||||
if(8 to 11)
|
||||
selecting = "r_arm"
|
||||
selecting = BP_R_ARM
|
||||
if(12 to 20)
|
||||
selecting = "chest"
|
||||
selecting = BP_TORSO
|
||||
if(21 to 24)
|
||||
selecting = "l_arm"
|
||||
selecting = BP_L_ARM
|
||||
else
|
||||
return 1
|
||||
if(23 to 30) //Head, but we need to check for eye or mouth
|
||||
if(icon_x in 12 to 20)
|
||||
selecting = "head"
|
||||
selecting = BP_HEAD
|
||||
switch(icon_y)
|
||||
if(23 to 24)
|
||||
if(icon_x in 15 to 17)
|
||||
selecting = "mouth"
|
||||
selecting = O_MOUTH
|
||||
if(26) //Eyeline, eyes are on 15 and 17
|
||||
if(icon_x in 14 to 18)
|
||||
selecting = "eyes"
|
||||
selecting = O_EYES
|
||||
if(25 to 27)
|
||||
if(icon_x in 15 to 17)
|
||||
selecting = "eyes"
|
||||
selecting = O_EYES
|
||||
|
||||
if(old_selecting != selecting)
|
||||
update_icon()
|
||||
|
||||
@@ -48,7 +48,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
|
||||
if (evac)
|
||||
emergency_shuttle_docked.Announce("The Emergency Shuttle has docked with the station at docks one and two. You have approximately [round(estimate_launch_time()/60,1)] minutes to board the Emergency Shuttle.")
|
||||
else
|
||||
priority_announcement.Announce("The scheduled shuttle to the Vir Regional Spaceport has docked with the station at docks one and two. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.")
|
||||
priority_announcement.Announce("The scheduled shuttle to the Vir Interstellar Spaceport has docked with the station at docks one and two. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.")
|
||||
|
||||
//arm the escape pods
|
||||
if (evac)
|
||||
@@ -94,7 +94,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
|
||||
//reset the shuttle transit time if we need to
|
||||
shuttle.move_time = SHUTTLE_TRANSIT_DURATION
|
||||
|
||||
priority_announcement.Announce("The regularly scheduled shuttle to the Vir Regional Spaceport will arrive in in approximately [round(estimate_arrival_time()/60)] minutes. Those leaving should proceed to docks one and two.")
|
||||
priority_announcement.Announce("The regularly scheduled shuttle to the Vir Interstellar Spaceport will arrive in in approximately [round(estimate_arrival_time()/60)] minutes. Those leaving should proceed to docks one and two.")
|
||||
|
||||
//recalls the shuttle
|
||||
/datum/emergency_shuttle_controller/proc/recall()
|
||||
@@ -111,7 +111,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
|
||||
A.readyreset()
|
||||
evac = 0
|
||||
else
|
||||
priority_announcement.Announce("The scheduled crew transfer has been cancelled.")
|
||||
priority_announcement.Announce("The scheduled transfer shuttle has been cancelled.")
|
||||
|
||||
/datum/emergency_shuttle_controller/proc/can_call()
|
||||
if (!universe.OnShuttleCall(null))
|
||||
|
||||
@@ -286,9 +286,9 @@ var/global/datum/shuttle_controller/shuttle_controller
|
||||
"Mining Station" = locate(/area/skipjack_station/mining)
|
||||
)
|
||||
|
||||
VS.announcer = "NDV Icarus"
|
||||
VS.arrival_message = "Attention, [station_short], we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
|
||||
VS.departure_message = "Your guests are pulling away, [station_short] - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
|
||||
VS.announcer = "Colony Automated Radar Array"
|
||||
VS.arrival_message = "Attention. Unidentified object approaching the colony."
|
||||
VS.departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity."
|
||||
VS.interim = locate(/area/skipjack_station/transit)
|
||||
|
||||
VS.warmup_time = 0
|
||||
|
||||
@@ -222,6 +222,7 @@
|
||||
locked += L
|
||||
return
|
||||
|
||||
// TODO.
|
||||
proc/get_id_photo(var/mob/living/carbon/human/H, var/assigned_role)
|
||||
var/icon/preview_icon = null
|
||||
|
||||
@@ -258,7 +259,10 @@ proc/get_id_photo(var/mob/living/carbon/human/H, var/assigned_role)
|
||||
if(!H.species || H.species.flags & HAS_SKIN_COLOR)
|
||||
preview_icon.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD)
|
||||
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
|
||||
var/use_eye_icon = "eyes_s"
|
||||
var/obj/item/organ/external/head/temp_head = H.get_organ(BP_HEAD)
|
||||
if(temp_head) use_eye_icon = temp_head.eye_icon
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = use_eye_icon)
|
||||
|
||||
if (H.species.flags & HAS_EYE_COLOR)
|
||||
eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)
|
||||
|
||||
@@ -57,7 +57,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
|
||||
// Some species are immune to viruses entirely.
|
||||
if(affected_mob && istype(affected_mob, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = affected_mob
|
||||
if(H.species.virus_immune)
|
||||
if(H.species.get_virus_immune(H))
|
||||
cure()
|
||||
return
|
||||
age++
|
||||
|
||||
@@ -27,29 +27,15 @@ Bonus
|
||||
stage_speed = 0
|
||||
transmittable = 1
|
||||
level = 3
|
||||
var/bloodvomit
|
||||
|
||||
/datum/symptom/vomit/Activate(var/datum/disease/advance/A)
|
||||
..()
|
||||
if(prob(SYMPTOM_ACTIVATION_PROB / 2))
|
||||
var/mob/living/M = A.affected_mob
|
||||
switch(A.stage)
|
||||
if(1, 2, 3, 4)
|
||||
M << "<span class='notice'>[pick("You feel nauseous.", "You feel like you're going to throw up!")]</span>"
|
||||
else
|
||||
Vomit(M)
|
||||
|
||||
spawn M.vomit(M, bloodvomit)
|
||||
return
|
||||
|
||||
/datum/symptom/vomit/proc/Vomit(var/mob/living/M)
|
||||
|
||||
M.visible_message("<B>[M]</B> vomits on the floor!")
|
||||
|
||||
M.nutrition -= 20
|
||||
M.adjustToxLoss(-3)
|
||||
|
||||
var/turf/pos = get_turf(M)
|
||||
pos.add_vomit_floor(M)
|
||||
playsound(pos, 'sound/effects/splat.ogg', 50, 1)
|
||||
/*
|
||||
//////////////////////////////////////
|
||||
|
||||
@@ -78,17 +64,4 @@ Bonus
|
||||
stage_speed = -1
|
||||
transmittable = 1
|
||||
level = 4
|
||||
|
||||
/datum/symptom/vomit/blood/Vomit(var/mob/living/M)
|
||||
|
||||
M.Stun(1)
|
||||
M.visible_message("<B>[M]</B> vomits on the floor!")
|
||||
|
||||
// They lose blood and health.
|
||||
var/brute_dam = M.getBruteLoss()
|
||||
if(brute_dam < 50)
|
||||
M.adjustBruteLoss(3)
|
||||
|
||||
var/turf/simulated/pos = get_turf(M)
|
||||
pos.add_blood_floor(M)
|
||||
playsound(pos, 'sound/effects/splat.ogg', 50, 1)
|
||||
bloodvomit = 1
|
||||
|
||||
@@ -33,20 +33,16 @@
|
||||
affected_mob.adjustToxLoss(1)
|
||||
if(stage > 2)
|
||||
if(prob(1))
|
||||
if (affected_mob.nutrition > 100)
|
||||
var/mob/living/carbon/human/H = affected_mob
|
||||
H.vomit()
|
||||
else
|
||||
affected_mob << "<span class='danger'>You gag as you want to throw up, but there's nothing in your stomach!</span>"
|
||||
affected_mob.Weaken(10)
|
||||
affected_mob.adjustToxLoss(3)
|
||||
var/mob/living/carbon/human/H = affected_mob
|
||||
spawn H.vomit()
|
||||
|
||||
if(stage > 3)
|
||||
if(prob(1) && ishuman(affected_mob))
|
||||
var/mob/living/carbon/human/H = affected_mob
|
||||
H << "<span class='danger'>Your abdomen is a world of pain!</span>"
|
||||
H.Weaken(10)
|
||||
|
||||
var/obj/item/organ/external/groin = H.get_organ("groin")
|
||||
var/obj/item/organ/external/groin = H.get_organ(BP_GROIN)
|
||||
var/datum/wound/W = new /datum/wound/internal_bleeding(20)
|
||||
H.adjustToxLoss(25)
|
||||
groin.wounds += W
|
||||
|
||||
@@ -248,6 +248,23 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
containername = "Wizard costume crate"
|
||||
group = "Miscellaneous"
|
||||
|
||||
/datum/supply_packs/foam_weapons
|
||||
name = "Foam Weapon Crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/material/sword/foam,
|
||||
/obj/item/weapon/material/sword/foam,
|
||||
/obj/item/weapon/material/twohanded/baseballbat/foam,
|
||||
/obj/item/weapon/material/twohanded/baseballbat/foam,
|
||||
/obj/item/weapon/material/twohanded/spear/foam,
|
||||
/obj/item/weapon/material/twohanded/spear/foam,
|
||||
/obj/item/weapon/material/twohanded/fireaxe/foam,
|
||||
/obj/item/weapon/material/twohanded/fireaxe/foam
|
||||
)
|
||||
cost = 80
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "foam weapon crate"
|
||||
group = "Miscellaneous"
|
||||
|
||||
/datum/supply_packs/mule
|
||||
name = "MULEbot Crate"
|
||||
contains = list(/obj/machinery/bot/mulebot)
|
||||
@@ -2070,6 +2087,9 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
|
||||
/obj/item/clothing/head/surgery/green,
|
||||
/obj/item/clothing/head/surgery/green,
|
||||
/obj/item/clothing/head/surgery/green,
|
||||
/obj/item/clothing/head/surgery/black,
|
||||
/obj/item/clothing/head/surgery/black,
|
||||
/obj/item/clothing/head/surgery/black,
|
||||
/obj/item/weapon/storage/box/masks,
|
||||
/obj/item/weapon/storage/box/gloves)
|
||||
cost = 15
|
||||
|
||||
@@ -37,12 +37,12 @@ var/datum/antagonist/xenos/borer/borers
|
||||
var/mob/living/carbon/human/host
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.stat != DEAD && !H.has_brain_worms())
|
||||
var/obj/item/organ/external/head = H.get_organ("head")
|
||||
var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
|
||||
if(head && !(head.status & ORGAN_ROBOT))
|
||||
host = H
|
||||
break
|
||||
if(istype(host))
|
||||
var/obj/item/organ/external/head = host.get_organ("head")
|
||||
var/obj/item/organ/external/head = host.get_organ(BP_HEAD)
|
||||
borer.host = host
|
||||
head.implants += borer
|
||||
borer.forceMove(head)
|
||||
|
||||
@@ -54,3 +54,14 @@
|
||||
survive_objective.owner = changeling
|
||||
changeling.objectives += survive_objective
|
||||
return
|
||||
|
||||
/datum/antagonist/changeling/can_become_antag(var/datum/mind/player, var/ignore_role)
|
||||
if(..())
|
||||
if(player.current && ishuman(player.current))
|
||||
var/mob/living/carbon/human/H = player.current
|
||||
if(H.isSynthetic())
|
||||
return 0
|
||||
if(H.species.flags & NO_SCAN)
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
@@ -1480,6 +1480,7 @@ area/space/atmosalert()
|
||||
|
||||
/area/holodeck/source_thunderdomecourt
|
||||
name = "\improper Holodeck - Thunderdome Court"
|
||||
requires_power = 0
|
||||
sound_env = ARENA
|
||||
|
||||
/area/holodeck/source_courtroom
|
||||
|
||||
+2
-3
@@ -198,7 +198,7 @@ its easier to just keep the beam vertical.
|
||||
f_name = "some "
|
||||
else
|
||||
f_name = "a "
|
||||
if(blood_color != "#030303")
|
||||
if(blood_color != SYNTH_BLOOD_COLOUR)
|
||||
f_name += "<span class='danger'>blood-stained</span> [name][infix]!"
|
||||
else
|
||||
f_name += "oil-stained [name][infix]."
|
||||
@@ -399,8 +399,7 @@ its easier to just keep the beam vertical.
|
||||
M.dna = new /datum/dna(null)
|
||||
M.dna.real_name = M.real_name
|
||||
M.check_dna()
|
||||
if (M.species)
|
||||
blood_color = M.species.blood_color
|
||||
blood_color = M.species.get_blood_colour(M)
|
||||
. = 1
|
||||
return 1
|
||||
|
||||
|
||||
@@ -150,10 +150,11 @@
|
||||
|
||||
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
|
||||
|
||||
if (dna.GetUIState(DNA_UI_GENDER))
|
||||
H.gender = FEMALE
|
||||
else
|
||||
H.gender = MALE
|
||||
if(H.gender != NEUTER)
|
||||
if (dna.GetUIState(DNA_UI_GENDER))
|
||||
H.gender = FEMALE
|
||||
else
|
||||
H.gender = MALE
|
||||
|
||||
//Hair
|
||||
var/hair = dna.GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len)
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/T = G.affecting
|
||||
if(!istype(T))
|
||||
src << "<span class='warning'>[T] is not compatible with our biology.</span>"
|
||||
if(!istype(T) || T.isSynthetic())
|
||||
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
|
||||
return
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
|
||||
@@ -30,10 +30,10 @@
|
||||
if(istype(held_item,/obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = held_item
|
||||
if(G.affecting)
|
||||
G.affecting.electrocute_act(5,src,1.0,"chest")
|
||||
G.affecting.electrocute_act(5,src,1.0,BP_TORSO)
|
||||
var/agony = 60 //The same as a stunbaton.
|
||||
var/stun = 0
|
||||
G.affecting.stun_effect_act(stun, agony, "chest", src)
|
||||
G.affecting.stun_effect_act(stun, agony, BP_TORSO, src)
|
||||
|
||||
msg_admin_attack("[key_name(src)] stunned [key_name(G.affecting)] with the [src].")
|
||||
|
||||
@@ -112,10 +112,10 @@
|
||||
src << "<span class='warning'>We require more chemicals to electrocute [C]!</span>"
|
||||
return 0
|
||||
|
||||
C.electrocute_act(5,src,1.0,"chest")
|
||||
C.electrocute_act(5,src,1.0,BP_TORSO)
|
||||
var/agony = 60 //The same as a stunbaton.
|
||||
var/stun = 0
|
||||
C.stun_effect_act(stun, agony, "chest", src)
|
||||
C.stun_effect_act(stun, agony, BP_TORSO, src)
|
||||
|
||||
msg_admin_attack("[key_name(user)] stunned [key_name(C)] with the [src].")
|
||||
|
||||
|
||||
@@ -18,7 +18,18 @@
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
|
||||
if(!T) return 0
|
||||
|
||||
if(!istype(T) || T.isSynthetic())
|
||||
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
|
||||
return 0
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
||||
return 0
|
||||
|
||||
if(HUSK in T.mutations)
|
||||
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
||||
return 0
|
||||
|
||||
T.dna.real_name = T.real_name
|
||||
changeling.absorbed_dna |= T.dna
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
C.radiation = 0
|
||||
C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss())
|
||||
C.reagents.clear_reagents()
|
||||
C.restore_all_organs() //Covers things like fractures and other things not covered by the above.
|
||||
C.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above.
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = src
|
||||
H.restore_blood()
|
||||
|
||||
@@ -105,7 +105,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
|
||||
if(!iscultist(user))
|
||||
user << "You can't mouth the arcane scratchings without fumbling over them."
|
||||
return
|
||||
if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
if(user.is_muzzled())
|
||||
user << "You are unable to speak the words of the rune."
|
||||
return
|
||||
if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
|
||||
|
||||
@@ -162,8 +162,8 @@ var/list/sacrificed = list()
|
||||
target.adjustBrainLoss(rand(1,5))
|
||||
|
||||
initial_message = 1
|
||||
if (target.species && (target.species.flags & NO_PAIN))
|
||||
target.visible_message("<span class='warning'>The markings below [target] glow a bloody red.</span>")
|
||||
if (!target.can_feel_pain())
|
||||
target.visible_message("<span class='warning'>The markings below \the [target] glow a bloody red.</span>")
|
||||
else
|
||||
target.visible_message("<span class='warning'>[target] writhes in pain as the markings below \him glow a bloody red.</span>", "<span class='danger'>AAAAAAHHHH!</span>", "<span class='warning'>You hear an anguished scream.</span>")
|
||||
|
||||
@@ -631,8 +631,8 @@ var/list/sacrificed = list()
|
||||
if(!(iscultist(V)))
|
||||
victims += V//Checks for cult status and mob type
|
||||
for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
|
||||
if(istype(I,/obj/item/organ/brain))
|
||||
var/obj/item/organ/brain/B = I
|
||||
if(istype(I,/obj/item/organ/internal/brain))
|
||||
var/obj/item/organ/internal/brain/B = I
|
||||
victims += B.brainmob
|
||||
else if(istype(I,/obj/item/device/mmi))
|
||||
var/obj/item/device/mmi/B = I
|
||||
|
||||
@@ -10,7 +10,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
||||
required_players = 15
|
||||
required_players_secret = 15
|
||||
required_enemies = 4
|
||||
round_description = "An unidentified bluespace signature has slipped past the Icarus and is approaching the station!"
|
||||
round_description = "An unidentified bluespace signature is approaching the station!"
|
||||
end_on_antag_death = 0
|
||||
antag_tags = list(MODE_RAIDER)
|
||||
|
||||
|
||||
@@ -406,7 +406,7 @@ datum/objective/harm
|
||||
if(!found)
|
||||
return 1
|
||||
|
||||
var/obj/item/organ/external/head/head = H.get_organ("head")
|
||||
var/obj/item/organ/external/head/head = H.get_organ(BP_HEAD)
|
||||
if(head.disfigured)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
supervisors = "your laws and the AI" //Nodrak
|
||||
selection_color = "#ddffdd"
|
||||
minimal_player_age = 1
|
||||
alt_titles = list("Android", "Robot")
|
||||
alt_titles = list("Robot", "Drone")
|
||||
account_allowed = 0
|
||||
economic_modifier = 0
|
||||
|
||||
|
||||
@@ -399,9 +399,9 @@
|
||||
for(var/obj/item/organ/i in occ["internal_organs"])
|
||||
|
||||
var/mech = ""
|
||||
if(i.robotic == 1)
|
||||
if(i.status & ORGAN_ASSISTED)
|
||||
mech = "Assisted:"
|
||||
if(i.robotic == 2)
|
||||
if(i.status & ORGAN_ROBOT)
|
||||
mech = "Mechanical:"
|
||||
|
||||
var/infection = "None"
|
||||
|
||||
@@ -107,6 +107,11 @@
|
||||
path = /obj/item/device/radio/off
|
||||
category = "General"
|
||||
|
||||
/datum/autolathe/recipe/suit_cooler
|
||||
name = "suit cooling unit"
|
||||
path = /obj/item/device/suit_cooling_unit
|
||||
category = "General"
|
||||
|
||||
/datum/autolathe/recipe/weldermask
|
||||
name = "welding mask"
|
||||
path = /obj/item/clothing/head/welding
|
||||
@@ -413,3 +418,9 @@
|
||||
path = /obj/item/weapon/handcuffs
|
||||
hidden = 1
|
||||
category = "General"
|
||||
|
||||
/datum/autolathe/recipe/knuckledusters
|
||||
name = "knuckle dusters"
|
||||
path = /obj/item/weapon/material/knuckledusters
|
||||
hidden = 1
|
||||
category = "Arms and Ammunition"
|
||||
@@ -16,11 +16,11 @@
|
||||
var/stored_matter = 200
|
||||
var/loaded_dna //Blood sample for DNA hashing.
|
||||
var/list/products = list(
|
||||
"heart" = list(/obj/item/organ/heart, 50),
|
||||
"lungs" = list(/obj/item/organ/lungs, 40),
|
||||
"kidneys" = list(/obj/item/organ/kidneys,20),
|
||||
"eyes" = list(/obj/item/organ/eyes, 30),
|
||||
"liver" = list(/obj/item/organ/liver, 50)
|
||||
O_HEART = list(/obj/item/organ/internal/heart, 50),
|
||||
O_LUNGS = list(/obj/item/organ/internal/lungs, 40),
|
||||
O_KIDNEYS = list(/obj/item/organ/internal/kidneys,20),
|
||||
O_EYES = list(/obj/item/organ/internal/eyes, 30),
|
||||
O_LIVER = list(/obj/item/organ/internal/liver, 50)
|
||||
)
|
||||
|
||||
/obj/machinery/bioprinter/prosthetics
|
||||
@@ -41,7 +41,7 @@
|
||||
var/obj/item/organ/O = new new_organ(get_turf(src))
|
||||
|
||||
if(prints_prosthetics)
|
||||
O.robotic = 2
|
||||
O.robotize()
|
||||
else if(loaded_dna)
|
||||
visible_message("<span class='notice'>The printer injects the stored DNA into the biomass.</span>.")
|
||||
O.transplant_data = list()
|
||||
@@ -80,5 +80,5 @@
|
||||
user << "<span class='info'>\The [src] processes \the [W]. Levels of stored matter now: [stored_matter]</span>"
|
||||
qdel(W)
|
||||
return
|
||||
|
||||
|
||||
return..()
|
||||
@@ -722,12 +722,12 @@
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/damage = rand(5,15)
|
||||
H.apply_damage(2*damage, BRUTE, "head")
|
||||
H.apply_damage(2*damage, BRUTE, "chest")
|
||||
H.apply_damage(0.5*damage, BRUTE, "l_leg")
|
||||
H.apply_damage(0.5*damage, BRUTE, "r_leg")
|
||||
H.apply_damage(0.5*damage, BRUTE, "l_arm")
|
||||
H.apply_damage(0.5*damage, BRUTE, "r_arm")
|
||||
H.apply_damage(2*damage, BRUTE, BP_HEAD)
|
||||
H.apply_damage(2*damage, BRUTE, BP_TORSO)
|
||||
H.apply_damage(0.5*damage, BRUTE, BP_L_LEG)
|
||||
H.apply_damage(0.5*damage, BRUTE, BP_R_LEG)
|
||||
H.apply_damage(0.5*damage, BRUTE, BP_L_ARM)
|
||||
H.apply_damage(0.5*damage, BRUTE, BP_R_ARM)
|
||||
|
||||
blood_splatter(src,H,1)
|
||||
bloodiness += 4
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
//They need a brain!
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species.has_organ["brain"] && !H.has_brain())
|
||||
if(!H.has_brain())
|
||||
continue
|
||||
if(M.ckey == find_key)
|
||||
selected = M
|
||||
|
||||
@@ -353,11 +353,15 @@
|
||||
if (!subject.has_brain())
|
||||
if(istype(subject, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = subject
|
||||
if(H.species.has_organ["brain"])
|
||||
if(H.should_have_organ("brain"))
|
||||
scantemp = "Error: No signs of intelligence detected."
|
||||
else
|
||||
scantemp = "Error: No signs of intelligence detected."
|
||||
return
|
||||
|
||||
if(subject.isSynthetic())
|
||||
scantemp = "Error: Subject is not organic."
|
||||
return
|
||||
if (subject.suiciding == 1)
|
||||
scantemp = "Error: Subject's brain is not responding to scanning stimuli."
|
||||
return
|
||||
|
||||
@@ -645,24 +645,6 @@ About the new airlock wires panel:
|
||||
if(src.shock(user, 100))
|
||||
return
|
||||
|
||||
// No. -- cib
|
||||
/**
|
||||
if(ishuman(user) && prob(40) && src.density)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.getBrainLoss() >= 60)
|
||||
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
|
||||
if(!istype(H.head, /obj/item/clothing/head/helmet))
|
||||
visible_message("<span class='warning'>[user] headbutts the airlock.</span>")
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
H.Stun(8)
|
||||
H.Weaken(5)
|
||||
if(affecting.take_damage(10, 0))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
visible_message("<span class='warning'>[user] headbutts the airlock. Good thing they're wearing a helmet.</span>")
|
||||
return
|
||||
**/
|
||||
|
||||
if(src.p_open)
|
||||
user.set_machine(src)
|
||||
wires.Interact(user)
|
||||
@@ -943,7 +925,7 @@ About the new airlock wires panel:
|
||||
|
||||
/mob/living/carbon/airlock_crush(var/crush_damage)
|
||||
. = ..()
|
||||
if (!(species && (species.flags & NO_PAIN)))
|
||||
if(can_feel_pain())
|
||||
emote("scream")
|
||||
|
||||
/mob/living/silicon/robot/airlock_crush(var/crush_damage)
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
if(!H.eyecheck() <= 0)
|
||||
continue
|
||||
flash_time *= H.species.flash_mod
|
||||
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
|
||||
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
|
||||
if(!E)
|
||||
return
|
||||
if(E.is_bruised() && prob(E.damage + 50))
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
if(NOCLONE in T.mutations)
|
||||
return
|
||||
|
||||
if(T.species.flags & NO_BLOOD)
|
||||
if(!T.should_have_organ(O_HEART))
|
||||
return
|
||||
|
||||
// If the human is losing too much blood, beep.
|
||||
@@ -165,4 +165,4 @@
|
||||
/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, mice, drones, and the like through.
|
||||
return 1
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -172,8 +172,9 @@
|
||||
if(!src.occupant)
|
||||
visible_message("<span class='danger'>You hear a loud metallic grinding sound.</span>")
|
||||
return
|
||||
|
||||
use_power(1000)
|
||||
visible_message("<span class='danger'>You hear a loud squelchy grinding sound.</span>")
|
||||
visible_message("<span class='danger'>You hear a loud [occupant.isSynthetic() ? "metallic" : "squelchy"] grinding sound.</span>")
|
||||
src.operating = 1
|
||||
update_icon()
|
||||
|
||||
@@ -192,7 +193,7 @@
|
||||
else if(istype(src.occupant,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
slab_name = src.occupant.real_name
|
||||
slab_type = H.species.meat_type
|
||||
slab_type = H.isSynthetic() ? /obj/item/stack/material/steel : H.species.meat_type
|
||||
|
||||
// Small mobs don't give as much nutrition.
|
||||
if(issmall(src.occupant))
|
||||
@@ -200,12 +201,12 @@
|
||||
slab_nutrition /= slab_count
|
||||
|
||||
for(var/i=1 to slab_count)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/meat/new_meat = new slab_type(src)
|
||||
new_meat.name = "[slab_name] [new_meat.name]"
|
||||
new_meat.reagents.add_reagent("nutriment",slab_nutrition)
|
||||
|
||||
if(src.occupant.reagents)
|
||||
src.occupant.reagents.trans_to_obj(new_meat, round(occupant.reagents.total_volume/slab_count,1))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/meat/new_meat = new slab_type(src, rand(3,8))
|
||||
if(istype(new_meat))
|
||||
new_meat.name = "[slab_name] [new_meat.name]"
|
||||
new_meat.reagents.add_reagent("nutriment",slab_nutrition)
|
||||
if(src.occupant.reagents)
|
||||
src.occupant.reagents.trans_to_obj(new_meat, round(occupant.reagents.total_volume/slab_count,1))
|
||||
|
||||
src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by <b>[user]/[user.ckey]</b>" //One shall not simply gib a mob unnoticed!
|
||||
user.attack_log += "\[[time_stamp()]\] Gibbed <b>[src.occupant]/[src.occupant.ckey]</b>"
|
||||
|
||||
@@ -627,9 +627,9 @@ var/list/turret_icons
|
||||
var/def_zone
|
||||
var/obj/item/weapon/grab/G = locate() in target
|
||||
if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people.
|
||||
def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
|
||||
def_zone = pick(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT, BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG)
|
||||
else
|
||||
def_zone = pick("chest", "groin")
|
||||
def_zone = pick(BP_TORSO, BP_GROIN)
|
||||
|
||||
//Shooting Code:
|
||||
A.launch(target, def_zone)
|
||||
|
||||
@@ -104,6 +104,22 @@
|
||||
if(wire_rate && R.getFireLoss() && cell.checked_use(wire_power_use * wire_rate * CELLRATE))
|
||||
R.adjustFireLoss(-wire_rate)
|
||||
|
||||
else if(istype(occupant, /mob/living/carbon/human))
|
||||
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
|
||||
// In case they somehow end up with positive values for otherwise unobtainable damage...
|
||||
if(H.getToxLoss()>0) H.adjustToxLoss(-(rand(1,3)))
|
||||
if(H.getOxyLoss()>0) H.adjustOxyLoss(-(rand(1,3)))
|
||||
if(H.getCloneLoss()>0) H.adjustCloneLoss(-(rand(1,3)))
|
||||
if(H.getBrainLoss()>0) H.adjustBrainLoss(-(rand(1,3)))
|
||||
|
||||
// Also recharge their internal battery.
|
||||
if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450)
|
||||
H.nutrition = min(H.nutrition+10, 450)
|
||||
cell.use(7000/450*10)
|
||||
|
||||
|
||||
/obj/machinery/recharge_station/examine(mob/user)
|
||||
..(user)
|
||||
user << "The charge meter reads: [round(chargepercentage())]%"
|
||||
@@ -200,22 +216,36 @@
|
||||
go_in(R)
|
||||
|
||||
/obj/machinery/recharge_station/proc/go_in(var/mob/living/silicon/robot/R)
|
||||
if(!istype(R))
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
return
|
||||
|
||||
if(R.incapacitated())
|
||||
return
|
||||
if(!R.cell)
|
||||
return
|
||||
if(istype(R, /mob/living/silicon/robot))
|
||||
|
||||
add_fingerprint(R)
|
||||
R.reset_view(src)
|
||||
R.forceMove(src)
|
||||
occupant = R
|
||||
update_icon()
|
||||
return 1
|
||||
if(R.incapacitated())
|
||||
return
|
||||
|
||||
if(!R.cell)
|
||||
return
|
||||
|
||||
add_fingerprint(R)
|
||||
R.reset_view(src)
|
||||
R.forceMove(src)
|
||||
occupant = R
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
else if(istype(R, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = R
|
||||
if(!isnull(H.internal_organs_by_name["cell"]))
|
||||
add_fingerprint(H)
|
||||
H.reset_view(src)
|
||||
H.forceMove(src)
|
||||
occupant = H
|
||||
update_icon()
|
||||
return 1
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/recharge_station/proc/go_out()
|
||||
if(!occupant)
|
||||
|
||||
@@ -331,18 +331,16 @@
|
||||
sleep(50)
|
||||
if(src.OCCUPANT)
|
||||
OCCUPANT.apply_effect(50, IRRADIATE)
|
||||
var/obj/item/organ/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
|
||||
var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
|
||||
if (!rad_organ)
|
||||
if (OCCUPANT.can_feel_pain())
|
||||
OCCUPANT.emote("scream")
|
||||
if(src.issuperUV)
|
||||
var/burndamage = rand(28,35)
|
||||
OCCUPANT.take_organ_damage(0,burndamage)
|
||||
if (!(OCCUPANT.species && (OCCUPANT.species.flags & NO_PAIN)))
|
||||
OCCUPANT.emote("scream")
|
||||
else
|
||||
var/burndamage = rand(6,10)
|
||||
OCCUPANT.take_organ_damage(0,burndamage)
|
||||
if (!(OCCUPANT.species && (OCCUPANT.species.flags & NO_PAIN)))
|
||||
OCCUPANT.emote("scream")
|
||||
if(i==3) //End of the cycle
|
||||
if(!src.issuperUV)
|
||||
if(src.HELMET)
|
||||
|
||||
@@ -266,15 +266,15 @@
|
||||
else
|
||||
A = new /obj/item/projectile/energy/electrode( loc )
|
||||
use_power(200)
|
||||
|
||||
|
||||
//Turrets aim for the center of mass by default.
|
||||
//If the target is grabbing someone then the turret smartly aims for extremities
|
||||
var/obj/item/weapon/grab/G = locate() in target
|
||||
if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people.
|
||||
A.def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
|
||||
A.def_zone = pick(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT, BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG)
|
||||
else
|
||||
A.def_zone = pick("chest", "groin")
|
||||
|
||||
A.def_zone = pick(BP_TORSO, BP_GROIN)
|
||||
|
||||
A.current = T
|
||||
A.starting = T
|
||||
A.yo = U.y - T.y
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
var/mob/living/carbon/human/H = target
|
||||
// if (M.health <= 0) return
|
||||
|
||||
var/obj/item/organ/external/temp = H.get_organ(pick("chest", "chest", "chest", "head"))
|
||||
var/obj/item/organ/external/temp = H.get_organ(pick(BP_TORSO, BP_TORSO, BP_TORSO, BP_HEAD))
|
||||
if(temp)
|
||||
var/update = 0
|
||||
switch(damtype)
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
// Aliens can get straight through these.
|
||||
if(istype(usr,/mob/living/carbon))
|
||||
var/mob/living/carbon/M = usr
|
||||
if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
|
||||
if(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message("<span class='warning'>[usr] strokes the [name] and it melts away!</span>", 1)
|
||||
health = 0
|
||||
@@ -349,7 +349,7 @@ Alien plants should do something if theres a lot of poison
|
||||
/obj/effect/alien/egg/attack_hand(user as mob)
|
||||
|
||||
var/mob/living/carbon/M = user
|
||||
if(!istype(M) || !(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs))
|
||||
if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs))
|
||||
return attack_hand(user)
|
||||
|
||||
switch(status)
|
||||
|
||||
@@ -64,6 +64,12 @@ var/global/list/image/splatter_cache=list()
|
||||
/obj/effect/decal/cleanable/blood/update_icon()
|
||||
if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]"
|
||||
color = basecolor
|
||||
if(basecolor == SYNTH_BLOOD_COLOUR)
|
||||
name = "oil"
|
||||
desc = "It's black and greasy."
|
||||
else
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
|
||||
if (!istype(perp))
|
||||
|
||||
@@ -102,10 +102,10 @@
|
||||
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
|
||||
var/list/viruses = list()
|
||||
|
||||
Destroy()
|
||||
for(var/datum/disease/D in viruses)
|
||||
D.cure(0)
|
||||
..()
|
||||
/obj/effect/decal/cleanable/vomit/Destroy()
|
||||
for(var/datum/disease/D in viruses)
|
||||
D.cure(0)
|
||||
return ..()
|
||||
|
||||
/obj/effect/decal/cleanable/tomato_smudge
|
||||
name = "tomato smudge"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "It's a useless heap of junk... <i>or is it?</i>"
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "gib1"
|
||||
basecolor="#030303"
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
|
||||
@@ -38,9 +38,7 @@
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1") //2:7 is close enough to 1:4
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil
|
||||
name = "motor oil"
|
||||
desc = "It's black and greasy. Looks like Beepsky made another mess."
|
||||
basecolor="#030303"
|
||||
basecolor = SYNTH_BLOOD_COLOUR
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/dry()
|
||||
return
|
||||
|
||||
@@ -220,9 +220,9 @@
|
||||
src.loc = O.owner ? O.owner.loc : O.loc
|
||||
src.visible_message("<span class='warning'>\A [src] makes its way out of [O.owner ? "[O.owner]'s [O.name]" : "\the [O]"]!</span>")
|
||||
if(O.owner)
|
||||
O.owner.apply_damage(1, BRUTE, O.limb_name)
|
||||
O.owner.apply_damage(1, BRUTE, O.organ_tag)
|
||||
else if(prob(1))
|
||||
O.owner.apply_damage(1, TOX, O.limb_name)
|
||||
O.owner.apply_damage(1, TOX, O.organ_tag)
|
||||
if(world.time > last_itch + 30 SECONDS)
|
||||
last_itch = world.time
|
||||
O.owner << "<span class='notice'>Your [O.name] itches...</span>"
|
||||
|
||||
@@ -449,7 +449,7 @@ var/list/global/slot_flags_enumeration = list(
|
||||
|
||||
if(istype(H))
|
||||
|
||||
var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"]
|
||||
var/obj/item/organ/internal/eyes/eyes = H.internal_organs_by_name[O_EYES]
|
||||
|
||||
if(H != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
@@ -465,7 +465,7 @@ var/list/global/slot_flags_enumeration = list(
|
||||
eyes.damage += rand(3,4)
|
||||
if(eyes.damage >= eyes.min_bruised_damage)
|
||||
if(M.stat != 2)
|
||||
if(eyes.robotic <= 1) //robot eyes bleeding might be a bit silly
|
||||
if(!(eyes.status & ORGAN_ROBOT)) //robot eyes bleeding might be a bit silly
|
||||
M << "<span class='danger'>Your eyes start to bleed profusely!</span>"
|
||||
if(prob(50))
|
||||
if(M.stat != 2)
|
||||
@@ -477,7 +477,7 @@ var/list/global/slot_flags_enumeration = list(
|
||||
if (eyes.damage >= eyes.min_broken_damage)
|
||||
if(M.stat != 2)
|
||||
M << "<span class='warning'>You go blind!</span>"
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD)
|
||||
if(affecting.take_damage(7))
|
||||
M:UpdateDamageIcon()
|
||||
else
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/obj/item/device/flashlight/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
add_fingerprint(user)
|
||||
if(on && user.zone_sel.selecting == "eyes")
|
||||
if(on && user.zone_sel.selecting == O_EYES)
|
||||
|
||||
if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly
|
||||
return ..() //just hit them in the head
|
||||
|
||||
@@ -12,21 +12,25 @@
|
||||
throwforce = 10.0
|
||||
throw_speed = 1
|
||||
throw_range = 4
|
||||
action_button_name = "Toggle Heatsink"
|
||||
|
||||
matter = list("steel" = 15000, "glass" = 3500)
|
||||
origin_tech = list(TECH_MAGNET = 2, TECH_MATERIAL = 2)
|
||||
|
||||
var/on = 0 //is it turned on?
|
||||
var/cover_open = 0 //is the cover open?
|
||||
var/obj/item/weapon/cell/cell
|
||||
var/max_cooling = 12 //in degrees per second - probably don't need to mess with heat capacity here
|
||||
var/charge_consumption = 16.6 //charge per second at max_cooling
|
||||
var/max_cooling = 12 // in degrees per second - probably don't need to mess with heat capacity here
|
||||
var/charge_consumption = 3 // charge per second at max_cooling
|
||||
var/thermostat = T20C
|
||||
|
||||
//TODO: make it heat up the surroundings when not in space
|
||||
|
||||
/obj/item/device/suit_cooling_unit/ui_action_click()
|
||||
toggle(usr)
|
||||
|
||||
/obj/item/device/suit_cooling_unit/New()
|
||||
processing_objects |= src
|
||||
|
||||
cell = new/obj/item/weapon/cell() //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find
|
||||
cell.loc = src
|
||||
|
||||
@@ -56,7 +60,7 @@
|
||||
cell.use(charge_usage)
|
||||
|
||||
if(cell.charge <= 0)
|
||||
turn_off()
|
||||
turn_off(1)
|
||||
|
||||
/obj/item/device/suit_cooling_unit/proc/get_environment_temperature()
|
||||
if (ishuman(loc))
|
||||
@@ -97,14 +101,12 @@
|
||||
on = 1
|
||||
updateicon()
|
||||
|
||||
/obj/item/device/suit_cooling_unit/proc/turn_off()
|
||||
if (ismob(src.loc))
|
||||
var/mob/M = src.loc
|
||||
M.show_message("\The [src] clicks and whines as it powers down.", 2) //let them know in case it's run out of power.
|
||||
/obj/item/device/suit_cooling_unit/proc/turn_off(var/failed)
|
||||
if(failed) visible_message("\The [src] clicks and whines as it powers down.")
|
||||
on = 0
|
||||
updateicon()
|
||||
|
||||
/obj/item/device/suit_cooling_unit/attack_self(mob/user as mob)
|
||||
/obj/item/device/suit_cooling_unit/attack_self(var/mob/user)
|
||||
if(cover_open && cell)
|
||||
if(ishuman(user))
|
||||
user.put_in_hands(cell)
|
||||
@@ -114,18 +116,19 @@
|
||||
cell.add_fingerprint(user)
|
||||
cell.update_icon()
|
||||
|
||||
user << "You remove the [src.cell]."
|
||||
user << "You remove \the [src.cell]."
|
||||
src.cell = null
|
||||
updateicon()
|
||||
return
|
||||
|
||||
//TODO use a UI like the air tanks
|
||||
toggle(user)
|
||||
|
||||
/obj/item/device/suit_cooling_unit/proc/toggle(var/mob/user)
|
||||
if(on)
|
||||
turn_off()
|
||||
else
|
||||
turn_on()
|
||||
if (on)
|
||||
user << "You switch on the [src]."
|
||||
user << "<span class='notice'>You switch \the [src] [on ? "on" : "off"].</span>"
|
||||
|
||||
/obj/item/device/suit_cooling_unit/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/screwdriver))
|
||||
|
||||
@@ -30,35 +30,35 @@
|
||||
name = "left arm"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "l_arm"
|
||||
part = list("l_arm","l_hand")
|
||||
part = list(BP_L_ARM, BP_L_HAND)
|
||||
model_info = 1
|
||||
|
||||
/obj/item/robot_parts/r_arm
|
||||
name = "right arm"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "r_arm"
|
||||
part = list("r_arm","r_hand")
|
||||
part = list(BP_R_ARM, BP_R_HAND)
|
||||
model_info = 1
|
||||
|
||||
/obj/item/robot_parts/l_leg
|
||||
name = "left leg"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "l_leg"
|
||||
part = list("l_leg","l_foot")
|
||||
part = list(BP_L_LEG, BP_L_FOOT)
|
||||
model_info = 1
|
||||
|
||||
/obj/item/robot_parts/r_leg
|
||||
name = "right leg"
|
||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||
icon_state = "r_leg"
|
||||
part = list("r_leg","r_foot")
|
||||
part = list(BP_R_LEG, BP_R_FOOT)
|
||||
model_info = 1
|
||||
|
||||
/obj/item/robot_parts/chest
|
||||
name = "torso"
|
||||
name = "chest"
|
||||
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
|
||||
icon_state = "chest"
|
||||
part = list("groin","chest")
|
||||
part = list(BP_GROIN,BP_TORSO)
|
||||
var/wires = 0.0
|
||||
var/obj/item/weapon/cell/cell = null
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
name = "head"
|
||||
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
|
||||
icon_state = "head"
|
||||
part = list("head")
|
||||
part = list(BP_HEAD)
|
||||
var/obj/item/device/flash/flash1 = null
|
||||
var/obj/item/device/flash/flash2 = null
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||
|
||||
if(affecting.name == "head")
|
||||
if(affecting.organ_tag == BP_HEAD)
|
||||
if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space))
|
||||
user << "<span class='warning'>You can't apply [src] through [H.head]!</span>"
|
||||
return 1
|
||||
@@ -217,7 +217,7 @@
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||
var/limb = affecting.name
|
||||
if(!(affecting.limb_name in list("l_arm","r_arm","l_leg","r_leg")))
|
||||
if(!(affecting.organ_tag in list("l_arm","r_arm","l_leg","r_leg")))
|
||||
user << "<span class='danger'>You can't apply a splint there!</span>"
|
||||
return
|
||||
if(affecting.status & ORGAN_SPLINTED)
|
||||
@@ -226,7 +226,7 @@
|
||||
if (M != user)
|
||||
user.visible_message("<span class='danger'>[user] starts to apply \the [src] to [M]'s [limb].</span>", "<span class='danger'>You start to apply \the [src] to [M]'s [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
|
||||
else
|
||||
if((!user.hand && affecting.limb_name == "r_arm") || (user.hand && affecting.limb_name == "l_arm"))
|
||||
if((!user.hand && affecting.organ_tag == "r_arm") || (user.hand && affecting.organ_tag == "l_arm"))
|
||||
user << "<span class='danger'>You can't apply a splint to the arm you're using!</span>"
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] starts to apply \the [src] to their [limb].</span>", "<span class='danger'>You start to apply \the [src] to your [limb].</span>", "<span class='danger'>You hear something being wrapped.</span>")
|
||||
|
||||
@@ -794,7 +794,7 @@
|
||||
|
||||
/obj/structure/plushie/drone
|
||||
name = "plush drone"
|
||||
desc = "A plushie of a happy drone! It appears to be smiling, and has a small tag which reads \"N.D.V. Icarus Gift Shop\"."
|
||||
desc = "A plushie of a happy drone! It appears to be smiling."
|
||||
icon_state = "droneplushie"
|
||||
phrase = "Beep boop!"
|
||||
|
||||
|
||||
@@ -478,7 +478,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
return
|
||||
M.IgniteMob()
|
||||
|
||||
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == "mouth" && lit)
|
||||
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
|
||||
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
|
||||
if(M == user)
|
||||
cig.attackby(src, user)
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob)
|
||||
if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" )
|
||||
if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == O_MOUTH)
|
||||
user.visible_message("<span class='danger'>\The [user] washes \the [target]'s mouth out with soap!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
w_class = 2.0
|
||||
force = 2.0
|
||||
det_time = null
|
||||
|
||||
var/stage = 0
|
||||
var/state = 0
|
||||
var/path = 0
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
//This really should be in mob not every check
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
|
||||
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
|
||||
if (E && E.damage >= E.min_bruised_damage)
|
||||
M << "<span class='danger'>Your eyes start to burn badly!</span>"
|
||||
if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = SLOT_MASK|SLOT_BELT
|
||||
|
||||
var/active = 0
|
||||
var/det_time = 50
|
||||
|
||||
|
||||
@@ -9,27 +9,25 @@
|
||||
var/spawner_type = null // must be an object path
|
||||
var/deliveryamt = 1 // amount of type to deliver
|
||||
|
||||
prime() // Prime now just handles the two loops that query for people in lockers and people who can see it.
|
||||
// Prime now just handles the two loops that query for people in lockers and people who can see it.
|
||||
/obj/item/weapon/grenade/spawnergrenade/prime()
|
||||
|
||||
if(spawner_type && deliveryamt)
|
||||
// Make a quick flash
|
||||
var/turf/T = get_turf(src)
|
||||
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
|
||||
for(var/mob/living/carbon/human/M in viewers(T, null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
if(spawner_type && deliveryamt)
|
||||
// Make a quick flash
|
||||
var/turf/T = get_turf(src)
|
||||
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
|
||||
for(var/mob/living/carbon/human/M in viewers(T, null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
|
||||
for(var/i=1, i<=deliveryamt, i++)
|
||||
var/atom/movable/x = new spawner_type
|
||||
x.loc = T
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(x, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
// Spawn some hostile syndicate critters
|
||||
|
||||
qdel(src)
|
||||
return
|
||||
// Spawn some hostile syndicate critters
|
||||
for(var/i=1, i<=deliveryamt, i++)
|
||||
var/atom/movable/x = new spawner_type(T)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(x, pick(NORTH,SOUTH,EAST,WEST))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks
|
||||
name = "manhack delivery grenade"
|
||||
|
||||
@@ -94,11 +94,11 @@ var/last_chew = 0
|
||||
var/mob/living/carbon/human/H = A
|
||||
if (!H.handcuffed) return
|
||||
if (H.a_intent != I_HURT) return
|
||||
if (H.zone_sel.selecting != "mouth") return
|
||||
if (H.zone_sel.selecting != O_MOUTH) return
|
||||
if (H.wear_mask) return
|
||||
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) return
|
||||
|
||||
var/obj/item/organ/external/O = H.organs_by_name[H.hand?"l_hand":"r_hand"]
|
||||
var/obj/item/organ/external/O = H.organs_by_name[(H.hand ? BP_L_HAND : BP_R_HAND)]
|
||||
if (!O) return
|
||||
|
||||
var/s = "<span class='warning'>[H.name] chews on \his [O.name]!</span>"
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/obj/item/weapon/material/twohanded/baseballbat/foam/New(var/newloc)
|
||||
..(newloc,"foam")
|
||||
|
||||
/obj/item/weapon/material/sword/foam
|
||||
attack_verb = list("bonked","whacked")
|
||||
force_divisor = 0
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/twohanded/baseballbat/foam
|
||||
attack_verb = list("bonked","whacked")
|
||||
force_wielded = 0
|
||||
force_divisor = 0
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/sword/foam/New(var/newloc)
|
||||
..(newloc,"foam")
|
||||
|
||||
/obj/item/weapon/material/twohanded/spear/foam
|
||||
attack_verb = list("bonked","whacked")
|
||||
force_wielded = 0
|
||||
force_divisor = 0
|
||||
applies_material_colour = 1
|
||||
base_icon = "spear_mask"
|
||||
icon_state = "spear_mask0"
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/twohanded/spear/foam/New(var/newloc)
|
||||
..(newloc,"foam")
|
||||
|
||||
/obj/item/weapon/material/twohanded/fireaxe/foam
|
||||
attack_verb = list("bonked","whacked")
|
||||
force_wielded = 0
|
||||
force_divisor = 0
|
||||
applies_material_colour = 1
|
||||
base_icon = "fireaxe_mask"
|
||||
icon_state = "fireaxe_mask0"
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/twohanded/fireaxe/foam/New(var/newloc)
|
||||
..(newloc,"foam")
|
||||
@@ -27,7 +27,7 @@
|
||||
return ..()
|
||||
|
||||
if(user.a_intent != I_HELP)
|
||||
if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
|
||||
if(user.zone_sel.selecting == BP_HEAD || user.zone_sel.selecting == O_EYES)
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
@@ -8,6 +8,16 @@
|
||||
force_divisor = 0.3 // 18 with hardness 60 (steel)
|
||||
attack_verb = list("jabbed","stabbed","ripped")
|
||||
|
||||
/obj/item/weapon/material/knuckledusters
|
||||
name = "knuckle dusters"
|
||||
desc = "A pair of brass knuckles. Generally used to enhance the user's punches."
|
||||
icon_state = "knuckledusters"
|
||||
gender = PLURAL
|
||||
w_class = 2.0
|
||||
force_divisor = 0.63
|
||||
attack_verb = list("punched", "beaten", "struck")
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/hatchet
|
||||
name = "hatchet"
|
||||
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
..()
|
||||
if(isliving(AM))
|
||||
var/mob/M = AM
|
||||
|
||||
|
||||
if(M.buckled) //wheelchairs, office chairs, rollerbeds
|
||||
return
|
||||
|
||||
|
||||
M << "<span class='danger'>You step on \the [src]!</span>"
|
||||
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
|
||||
if(ishuman(M))
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) )
|
||||
return
|
||||
|
||||
|
||||
var/list/check = list("l_foot", "r_foot")
|
||||
while(check.len)
|
||||
var/picked = pick(check)
|
||||
@@ -89,7 +89,7 @@
|
||||
if(affecting.take_damage(5, 0))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
if(!(H.species.flags & NO_PAIN))
|
||||
if(affecting.can_feel_pain())
|
||||
H.Weaken(3)
|
||||
return
|
||||
check -= picked
|
||||
|
||||
@@ -194,3 +194,4 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
|
||||
default_material = "glass"
|
||||
applies_material_colour = 0
|
||||
@@ -159,7 +159,7 @@
|
||||
if(!istype(M, /mob))
|
||||
return
|
||||
|
||||
if(M == user && user.zone_sel.selecting == "mouth" && contents.len > 0 && !user.wear_mask)
|
||||
if(M == user && user.zone_sel.selecting == O_MOUTH && contents.len > 0 && !user.wear_mask)
|
||||
var/obj/item/clothing/mask/smokable/cigarette/W = new /obj/item/clothing/mask/smokable/cigarette(user)
|
||||
reagents.trans_to_obj(W, (reagents.total_volume/contents.len))
|
||||
user.equip_to_slot_if_possible(W, slot_wear_mask)
|
||||
@@ -252,7 +252,7 @@
|
||||
if(!istype(M, /mob))
|
||||
return
|
||||
|
||||
if(M == user && user.zone_sel.selecting == "mouth" && contents.len > 0 && !user.wear_mask)
|
||||
if(M == user && user.zone_sel.selecting == O_MOUTH && contents.len > 0 && !user.wear_mask)
|
||||
var/obj/item/clothing/mask/smokable/cigarette/cigar/W = new /obj/item/clothing/mask/smokable/cigarette/cigar(user)
|
||||
reagents.trans_to_obj(W, (reagents.total_volume/contents.len))
|
||||
user.equip_to_slot_if_possible(W, slot_wear_mask)
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
user.Weaken(3 * force)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.apply_damage(2*force, BRUTE, "head")
|
||||
H.apply_damage(2*force, BRUTE, BP_HEAD)
|
||||
else
|
||||
user.take_organ_damage(2*force)
|
||||
return
|
||||
@@ -123,7 +123,7 @@
|
||||
user.Weaken(3 * force)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.apply_damage(2*force, BRUTE, "head")
|
||||
H.apply_damage(2*force, BRUTE, BP_HEAD)
|
||||
else
|
||||
user.take_organ_damage(2*force)
|
||||
return
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
|
||||
/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user)
|
||||
if(istype(H))
|
||||
if(user.zone_sel.selecting == "eyes")
|
||||
if(user.zone_sel.selecting == O_EYES)
|
||||
|
||||
if(!H.organs_by_name["head"])
|
||||
if(!H.organs_by_name[BP_HEAD])
|
||||
user << "<span class='warning'>\The [H] doesn't have a head.</span>"
|
||||
return
|
||||
if(!H.has_eyes())
|
||||
@@ -27,14 +27,14 @@
|
||||
return
|
||||
|
||||
// Repeat failure checks.
|
||||
if(!H || !src || !H.organs_by_name["head"] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
|
||||
if(!H || !src || !H.organs_by_name[BP_HEAD] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s eyes!</span>")
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
|
||||
|
||||
else if(user.zone_sel.selecting == "mouth" || user.zone_sel.selecting == "head")
|
||||
if(!H.organs_by_name["head"])
|
||||
else if(user.zone_sel.selecting == O_MOUTH || user.zone_sel.selecting == BP_HEAD)
|
||||
if(!H.organs_by_name[BP_HEAD])
|
||||
user << "<span class='warning'>\The [H] doesn't have a head.</span>"
|
||||
return
|
||||
if(!H.check_has_mouth())
|
||||
@@ -52,10 +52,11 @@
|
||||
return
|
||||
|
||||
// Repeat failure checks.
|
||||
if(!H || !src || !H.organs_by_name["head"] || !H.check_has_mouth() || H.wear_mask || (H.head && (H.head.body_parts_covered & FACE)))
|
||||
if(!H || !src || !H.organs_by_name[BP_HEAD] || !H.check_has_mouth() || H.wear_mask || (H.head && (H.head.body_parts_covered & FACE)))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s mouth!</span>")
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
|
||||
|
||||
else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M) || user.a_intent == "help")
|
||||
return ..()
|
||||
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
|
||||
if(user.zone_sel.selecting != O_EYES && user.zone_sel.selecting != BP_HEAD)
|
||||
return ..()
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
@@ -333,7 +333,7 @@
|
||||
var/safety = user:eyecheck()
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
|
||||
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
|
||||
if(!E)
|
||||
return
|
||||
switch(safety)
|
||||
@@ -422,14 +422,18 @@
|
||||
icon_state = "red_crowbar"
|
||||
item_state = "crowbar_red"
|
||||
|
||||
/obj/item/weapon/weldingtool/attack(var/atom/A, var/mob/living/user, var/def_zone)
|
||||
if(ishuman(A) && user.a_intent == I_HELP)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/weldingtool/afterattack(var/mob/M, var/mob/user)
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
|
||||
|
||||
if (!S) return
|
||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
|
||||
if(!S || !(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
|
||||
return ..()
|
||||
|
||||
if(S.brute_dam)
|
||||
@@ -438,10 +442,9 @@
|
||||
user.visible_message("<span class='notice'>\The [user] patches some dents on \the [M]'s [S.name] with \the [src].</span>")
|
||||
else if(S.open != 2)
|
||||
user << "<span class='danger'>The damage is far too severe to patch over externally.</span>"
|
||||
return 1
|
||||
else if(S.open != 2)
|
||||
user << "<span class='notice'>Nothing to fix!</span>"
|
||||
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
|
||||
|
||||
|
||||
if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
|
||||
if(!(user.zone_sel.selecting == (O_EYES || BP_HEAD))) //////////////hitting anything else other than the eyes
|
||||
if(prob(33))
|
||||
src.add_blood(H)
|
||||
var/turf/location = H.loc
|
||||
@@ -79,7 +79,7 @@
|
||||
if(istype(protection) && (protection.body_parts_covered & FACE))
|
||||
protected = 1
|
||||
break
|
||||
|
||||
|
||||
if(protected)
|
||||
M << "<span class='warning'>You get slammed in the face with the tray, against your mask!</span>"
|
||||
if(prob(33))
|
||||
|
||||
@@ -140,15 +140,15 @@
|
||||
|
||||
switch(pick(list("ankle","wrist","head","knee","elbow")))
|
||||
if("ankle")
|
||||
affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||
affecting = H.get_organ(pick(BP_L_FOOT, BP_R_FOOT))
|
||||
if("knee")
|
||||
affecting = H.get_organ(pick("l_leg", "r_leg"))
|
||||
affecting = H.get_organ(pick(BP_L_LEG, BP_R_LEG))
|
||||
if("wrist")
|
||||
affecting = H.get_organ(pick("l_hand", "r_hand"))
|
||||
affecting = H.get_organ(pick(BP_L_HAND, BP_R_HAND))
|
||||
if("elbow")
|
||||
affecting = H.get_organ(pick("l_arm", "r_arm"))
|
||||
affecting = H.get_organ(pick(BP_L_ARM, BP_R_ARM))
|
||||
if("head")
|
||||
affecting = H.get_organ("head")
|
||||
affecting = H.get_organ(BP_HEAD)
|
||||
|
||||
if(affecting)
|
||||
M << "<span class='danger'>You land heavily on your [affecting.name]!</span>"
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
|
||||
new /obj/item/clothing/under/rank/nursesuit (src)
|
||||
new /obj/item/clothing/head/nursehat (src)
|
||||
switch(pick("blue", "green", "purple"))
|
||||
switch(pick("blue", "green", "purple", "black"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/blue(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
@@ -80,7 +80,10 @@
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
switch(pick("blue", "green", "purple"))
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
switch(pick("blue", "green", "purple", "black"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/blue(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
@@ -90,13 +93,16 @@
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
new /obj/item/clothing/under/rank/medical(src)
|
||||
new /obj/item/clothing/under/rank/nurse(src)
|
||||
new /obj/item/clothing/under/rank/orderly(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/fr_jacket(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
// new /obj/item/weapon/cartridge/medical(src)
|
||||
new /obj/item/weapon/cartridge/medical(src)
|
||||
new /obj/item/device/radio/headset/headset_med(src)
|
||||
new /obj/item/device/radio/headset/headset_med/alt(src)
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
|
||||
@@ -125,7 +131,7 @@
|
||||
new /obj/item/clothing/suit/bio_suit/cmo(src)
|
||||
new /obj/item/clothing/head/bio_hood/cmo(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
switch(pick("blue", "green", "purple"))
|
||||
switch(pick("blue", "green", "purple", "black"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/blue(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
@@ -135,6 +141,9 @@
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src)
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
M.emote("scream")
|
||||
else
|
||||
var/mob/living/carbon/C = M
|
||||
if (!(C.species && (C.species.flags & NO_PAIN)))
|
||||
if (C.can_feel_pain())
|
||||
C.emote("scream")
|
||||
|
||||
//Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out.
|
||||
|
||||
@@ -48,10 +48,10 @@
|
||||
var/mob/living/carbon/xenos = user
|
||||
var/mob/living/carbon/victim = M
|
||||
|
||||
if(istype(victim) && locate(/obj/item/organ/xenos/hivenode) in victim.internal_organs)
|
||||
if(istype(victim) && locate(/obj/item/organ/internal/xenos/hivenode) in victim.internal_organs)
|
||||
return
|
||||
|
||||
if(istype(xenos) && !(locate(/obj/item/organ/xenos/hivenode) in xenos.internal_organs))
|
||||
if(istype(xenos) && !(locate(/obj/item/organ/internal/xenos/hivenode) in xenos.internal_organs))
|
||||
return
|
||||
|
||||
if(M == usr)
|
||||
|
||||
@@ -880,12 +880,15 @@ var/list/admin_verbs_mentor = list(
|
||||
if(new_fstyle)
|
||||
M.f_style = new_fstyle
|
||||
|
||||
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
|
||||
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter")
|
||||
if (new_gender)
|
||||
if(new_gender == "Male")
|
||||
M.gender = MALE
|
||||
else
|
||||
else if (new_gender == "Female")
|
||||
M.gender = FEMALE
|
||||
else
|
||||
M.gender = NEUTER
|
||||
|
||||
M.update_hair()
|
||||
M.update_body()
|
||||
M.check_dna(M)
|
||||
|
||||
@@ -278,8 +278,8 @@ Ccomp's first proc.
|
||||
G.can_reenter_corpse = 1
|
||||
|
||||
G:show_message(text("\blue <B>You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead.</B>"), 1)
|
||||
log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 30 minute respawn limit")
|
||||
message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit", 1)
|
||||
log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 15 minute respawn limit")
|
||||
message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 15 minute respawn limit", 1)
|
||||
|
||||
|
||||
/client/proc/toggle_antagHUD_use()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/category_item/player_setup_item/general/basic
|
||||
name = "Basic"
|
||||
sort_order = 1
|
||||
var/list/valid_player_genders = list(MALE, FEMALE)
|
||||
var/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL)
|
||||
|
||||
/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
|
||||
S["real_name"] >> pref.real_name
|
||||
|
||||
@@ -75,8 +75,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
|
||||
pref.update_preview_icon()
|
||||
if(pref.preview_icon_front && pref.preview_icon_side)
|
||||
user << browse_rsc(pref.preview_icon_front, "previewicon.png")
|
||||
user << browse_rsc(pref.preview_icon_side, "previewicon2.png")
|
||||
user << browse_rsc(pref.preview_icon_front, "preview_icon.png")
|
||||
user << browse_rsc(pref.preview_icon_side, "preview_icon2.png")
|
||||
|
||||
var/mob_species = all_species[pref.species]
|
||||
. += "<table><tr style='vertical-align:top'><td><b>Body</b> "
|
||||
@@ -87,7 +87,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if(has_flag(mob_species, HAS_SKIN_TONE))
|
||||
. += "Skin Tone: <a href='?src=\ref[src];skin_tone=1'>[-pref.s_tone + 35]/220</a><br>"
|
||||
. += "Needs Glasses: <a href='?src=\ref[src];disabilities=[NEARSIGHTED]'><b>[pref.disabilities & NEARSIGHTED ? "Yes" : "No"]</b></a><br>"
|
||||
. += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a><br>"
|
||||
. += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a> <a href='?src=\ref[src];reset_limbs=1'>Reset</a><br>"
|
||||
. += "Internal Organs: <a href='?src=\ref[src];organs=1'>Adjust</a><br>"
|
||||
|
||||
//display limbs below
|
||||
@@ -96,26 +96,35 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
var/status = pref.organ_data[name]
|
||||
var/organ_name = null
|
||||
switch(name)
|
||||
if("l_arm")
|
||||
|
||||
if(BP_TORSO)
|
||||
organ_name = "torso"
|
||||
if(BP_GROIN)
|
||||
organ_name = "groin"
|
||||
if(BP_HEAD)
|
||||
organ_name = "head"
|
||||
if(BP_L_ARM)
|
||||
organ_name = "left arm"
|
||||
if("r_arm")
|
||||
if(BP_R_ARM)
|
||||
organ_name = "right arm"
|
||||
if("l_leg")
|
||||
if(BP_L_LEG)
|
||||
organ_name = "left leg"
|
||||
if("r_leg")
|
||||
if(BP_R_LEG)
|
||||
organ_name = "right leg"
|
||||
if("l_foot")
|
||||
if(BP_L_FOOT)
|
||||
organ_name = "left foot"
|
||||
if("r_foot")
|
||||
if(BP_R_FOOT)
|
||||
organ_name = "right foot"
|
||||
if("l_hand")
|
||||
if(BP_L_HAND)
|
||||
organ_name = "left hand"
|
||||
if("r_hand")
|
||||
if(BP_R_HAND)
|
||||
organ_name = "right hand"
|
||||
if("heart")
|
||||
if(O_HEART)
|
||||
organ_name = "heart"
|
||||
if("eyes")
|
||||
if(O_EYES)
|
||||
organ_name = "eyes"
|
||||
if(O_BRAIN)
|
||||
organ_name = "brain"
|
||||
|
||||
if(status == "cyborg")
|
||||
++ind
|
||||
@@ -136,7 +145,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
++ind
|
||||
if(ind > 1)
|
||||
. += ", "
|
||||
. += "\tMechanical [organ_name]"
|
||||
. += "\tSynthetic [organ_name]"
|
||||
else if(status == "assisted")
|
||||
++ind
|
||||
if(ind > 1)
|
||||
@@ -148,6 +157,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
. += "\tSurgically altered [organ_name]"
|
||||
if("eyes")
|
||||
. += "\tRetinal overlayed [organ_name]"
|
||||
if("brain")
|
||||
. += "\tAssisted-interface [organ_name]"
|
||||
else
|
||||
. += "\tMechanically assisted [organ_name]"
|
||||
if(!ind)
|
||||
@@ -155,7 +166,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
else
|
||||
. += "<br><br>"
|
||||
|
||||
. += "</td><td><b>Preview</b><br><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64>"
|
||||
. += "</td><td><b>Preview</b><br><img src=preview_icon.png height=64 width=64><img src=preview_icon2.png height=64 width=64>"
|
||||
. += "</td></tr></table>"
|
||||
|
||||
. += "<b>Hair</b><br>"
|
||||
@@ -252,6 +263,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.b_hair = 0//hex2num(copytext(new_hair, 6, 8))
|
||||
pref.s_tone = 0
|
||||
|
||||
reset_limbs() // Safety for species with incompatible manufacturers; easier than trying to do it case by case.
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["hair_color"])
|
||||
@@ -334,50 +346,78 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.f_style = new_f_style
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["reset_limbs"])
|
||||
reset_limbs()
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["limbs"])
|
||||
var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand")
|
||||
if(!limb_name && !CanUseTopic(user)) return TOPIC_NOACTION
|
||||
|
||||
var/list/limb_selection_list = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand","Full Body")
|
||||
|
||||
// Full prosthetic bodies without a brain are borderline unkillable so make sure they have a brain to remove/destroy.
|
||||
var/datum/species/current_species = all_species[pref.species]
|
||||
if(!current_species.has_organ["brain"])
|
||||
limb_selection_list -= "Full Body"
|
||||
|
||||
var/organ_tag = input(user, "Which limb do you want to change?") as null|anything in limb_selection_list
|
||||
|
||||
if(!organ_tag && !CanUseTopic(user)) return TOPIC_NOACTION
|
||||
|
||||
var/limb = null
|
||||
var/second_limb = null // if you try to change the arm, the hand should also change
|
||||
var/third_limb = null // if you try to unchange the hand, the arm should also change
|
||||
switch(limb_name)
|
||||
if("Left Leg")
|
||||
limb = "l_leg"
|
||||
second_limb = "l_foot"
|
||||
if("Right Leg")
|
||||
limb = "r_leg"
|
||||
second_limb = "r_foot"
|
||||
if("Left Arm")
|
||||
limb = "l_arm"
|
||||
second_limb = "l_hand"
|
||||
if("Right Arm")
|
||||
limb = "r_arm"
|
||||
second_limb = "r_hand"
|
||||
if("Left Foot")
|
||||
limb = "l_foot"
|
||||
third_limb = "l_leg"
|
||||
if("Right Foot")
|
||||
limb = "r_foot"
|
||||
third_limb = "r_leg"
|
||||
if("Left Hand")
|
||||
limb = "l_hand"
|
||||
third_limb = "l_arm"
|
||||
if("Right Hand")
|
||||
limb = "r_hand"
|
||||
third_limb = "r_arm"
|
||||
|
||||
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in list("Normal","Amputated","Prothesis")
|
||||
// Do not let them amputate their entire body, ty.
|
||||
var/list/choice_options = list("Normal","Amputated","Prothesis")
|
||||
switch(organ_tag)
|
||||
if("Left Leg")
|
||||
limb = BP_L_LEG
|
||||
second_limb = BP_L_FOOT
|
||||
if("Right Leg")
|
||||
limb = BP_R_LEG
|
||||
second_limb = BP_R_FOOT
|
||||
if("Left Arm")
|
||||
limb = BP_L_ARM
|
||||
second_limb = BP_L_HAND
|
||||
if("Right Arm")
|
||||
limb = BP_R_ARM
|
||||
second_limb = BP_R_HAND
|
||||
if("Left Foot")
|
||||
limb = BP_L_FOOT
|
||||
third_limb = BP_L_LEG
|
||||
if("Right Foot")
|
||||
limb = BP_R_FOOT
|
||||
third_limb = BP_R_LEG
|
||||
if("Left Hand")
|
||||
limb = BP_L_HAND
|
||||
third_limb = BP_L_ARM
|
||||
if("Right Hand")
|
||||
limb = BP_R_HAND
|
||||
third_limb = BP_R_ARM
|
||||
if("Full Body")
|
||||
limb = BP_TORSO
|
||||
third_limb = BP_GROIN
|
||||
choice_options = list("Normal","Prothesis")
|
||||
|
||||
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in choice_options
|
||||
if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION
|
||||
|
||||
switch(new_state)
|
||||
if("Normal")
|
||||
|
||||
if(limb == BP_TORSO)
|
||||
for(var/other_limb in BP_ALL - BP_TORSO)
|
||||
pref.organ_data[other_limb] = null
|
||||
pref.rlimb_data[other_limb] = null
|
||||
pref.organ_data[limb] = null
|
||||
pref.rlimb_data[limb] = null
|
||||
if(third_limb)
|
||||
pref.organ_data[third_limb] = null
|
||||
pref.rlimb_data[third_limb] = null
|
||||
|
||||
if("Amputated")
|
||||
if(limb == BP_TORSO)
|
||||
return
|
||||
pref.organ_data[limb] = "amputated"
|
||||
pref.rlimb_data[limb] = null
|
||||
if(second_limb)
|
||||
@@ -397,27 +437,51 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in usable_manufacturers
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
pref.rlimb_data[limb] = choice
|
||||
pref.organ_data[limb] = "cyborg"
|
||||
|
||||
if(second_limb)
|
||||
pref.rlimb_data[second_limb] = choice
|
||||
pref.organ_data[second_limb] = "cyborg"
|
||||
if(third_limb && pref.organ_data[third_limb] == "amputated")
|
||||
pref.organ_data[third_limb] = null
|
||||
|
||||
if(limb == BP_TORSO)
|
||||
for(var/other_limb in BP_ALL - BP_TORSO)
|
||||
if(pref.organ_data[other_limb])
|
||||
continue
|
||||
pref.organ_data[other_limb] = "cyborg"
|
||||
pref.rlimb_data[other_limb] = choice
|
||||
if(!pref.organ_data[O_BRAIN])
|
||||
pref.organ_data[O_BRAIN] = "assisted"
|
||||
for(var/internal_organ in list(O_HEART,O_EYES))
|
||||
pref.organ_data[internal_organ] = "mechanical"
|
||||
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["organs"])
|
||||
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
|
||||
|
||||
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes", "Brain")
|
||||
if(!organ_name) return
|
||||
|
||||
var/organ = null
|
||||
switch(organ_name)
|
||||
if("Heart")
|
||||
organ = "heart"
|
||||
organ = O_HEART
|
||||
if("Eyes")
|
||||
organ = "eyes"
|
||||
organ = O_EYES
|
||||
if("Brain")
|
||||
if(pref.organ_data[BP_HEAD] != "cyborg")
|
||||
user << "<span class='warning'>You may only select an assisted or synthetic brain if you have a full prosthetic body.</span>"
|
||||
return
|
||||
organ = "brain"
|
||||
|
||||
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical")
|
||||
var/list/organ_choices = list("Normal","Assisted","Mechanical")
|
||||
if(pref.organ_data[BP_TORSO] == "cyborg")
|
||||
organ_choices -= "Normal"
|
||||
|
||||
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices
|
||||
if(!new_state) return
|
||||
|
||||
switch(new_state)
|
||||
@@ -436,6 +500,18 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
|
||||
|
||||
for(var/organ in pref.organ_data)
|
||||
pref.organ_data[organ] = null
|
||||
while(null in pref.organ_data)
|
||||
pref.organ_data -= null
|
||||
|
||||
for(var/organ in pref.rlimb_data)
|
||||
pref.rlimb_data[organ] = null
|
||||
while(null in pref.rlimb_data)
|
||||
pref.rlimb_data -= null
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/proc/SetSpecies(mob/user)
|
||||
if(!pref.species_preview || !(pref.species_preview in all_species))
|
||||
pref.species_preview = "Human"
|
||||
@@ -455,10 +531,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
dat += "</br><b>Often present on human stations.</b>"
|
||||
if(current_species.spawn_flags & IS_WHITELISTED)
|
||||
dat += "</br><b>Whitelist restricted.</b>"
|
||||
if(current_species.flags & NO_BLOOD)
|
||||
dat += "</br><b>Does not have blood.</b>"
|
||||
if(current_species.flags & NO_BREATHE)
|
||||
dat += "</br><b>Does not breathe.</b>"
|
||||
if(!current_species.has_organ[O_HEART])
|
||||
dat += "</br><b>Does not have a circulatory system.</b>"
|
||||
if(!current_species.has_organ[O_LUNGS])
|
||||
dat += "</br><b>Does not have a respiratory system.</b>"
|
||||
if(current_species.flags & NO_SCAN)
|
||||
dat += "</br><b>Does not have DNA.</b>"
|
||||
if(current_species.flags & NO_PAIN)
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
|
||||
/datum/category_item/player_setup_item/player_global/pai/content(var/mob/user)
|
||||
. += "<b>pAI:</b><br>"
|
||||
if(!candidate)
|
||||
log_debug("[user] pAI prefs have a null candidate var.")
|
||||
return .
|
||||
. += "Name: <a href='?src=\ref[src];option=name'>[candidate.name ? candidate.name : "None Set"]</a><br>"
|
||||
. += "Description: <a href='?src=\ref[src];option=desc'>[candidate.description ? TextPreview(candidate.description, 40) : "None Set"]</a><br>"
|
||||
. += "Role: <a href='?src=\ref[src];option=role'>[candidate.role ? TextPreview(candidate.role, 40) : "None Set"]</a><br>"
|
||||
|
||||
@@ -304,50 +304,39 @@ datum/preferences
|
||||
character.skills = skills
|
||||
character.used_skillpoints = used_skillpoints
|
||||
|
||||
// Destroy/cyborgize organs
|
||||
|
||||
for(var/name in organ_data)
|
||||
|
||||
// Destroy/cyborgize organs and limbs.
|
||||
for(var/name in BP_ALL)
|
||||
var/status = organ_data[name]
|
||||
var/obj/item/organ/external/O = character.organs_by_name[name]
|
||||
if(O)
|
||||
O.status = 0
|
||||
if(status == "amputated")
|
||||
character.organs_by_name[O.limb_name] = null
|
||||
character.organs -= O
|
||||
if(O.children) // This might need to become recursive.
|
||||
for(var/obj/item/organ/external/child in O.children)
|
||||
character.organs_by_name[child.limb_name] = null
|
||||
character.organs -= child
|
||||
|
||||
O.remove_rejuv()
|
||||
else if(status == "cyborg")
|
||||
if(rlimb_data[name])
|
||||
O.robotize(rlimb_data[name])
|
||||
else
|
||||
O.robotize()
|
||||
else
|
||||
var/obj/item/organ/I = character.internal_organs_by_name[name]
|
||||
if(I)
|
||||
if(status == "assisted")
|
||||
I.mechassist()
|
||||
else if(status == "mechanical")
|
||||
I.robotize()
|
||||
|
||||
for(var/name in list(O_HEART,O_EYES,O_BRAIN))
|
||||
var/status = organ_data[name]
|
||||
if(!status)
|
||||
continue
|
||||
var/obj/item/organ/I = character.internal_organs_by_name[name]
|
||||
if(I)
|
||||
if(status == "assisted")
|
||||
I.mechassist()
|
||||
else if(status == "mechanical")
|
||||
I.robotize()
|
||||
|
||||
character.underwear = underwear
|
||||
|
||||
character.undershirt = undershirt
|
||||
|
||||
character.socks = socks
|
||||
|
||||
if(backbag > 4 || backbag < 1)
|
||||
backbag = 1 //Same as above
|
||||
character.backbag = backbag
|
||||
|
||||
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
|
||||
if(character.gender in list(PLURAL, NEUTER))
|
||||
if(isliving(src)) //Ghosts get neuter by default
|
||||
message_admins("[character] ([character.ckey]) has spawned with their gender as plural or neuter. Please notify coders.")
|
||||
character.gender = MALE
|
||||
character.update_body()
|
||||
|
||||
/datum/preferences/proc/open_load_dialog(mob/user)
|
||||
var/dat = "<body>"
|
||||
|
||||
@@ -120,3 +120,7 @@
|
||||
/obj/item/clothing/head/surgery/green
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is dark green."
|
||||
icon_state = "surgcap_green"
|
||||
|
||||
/obj/item/clothing/head/surgery/black
|
||||
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is black."
|
||||
icon_state = "surgcap_black"
|
||||
@@ -93,7 +93,7 @@
|
||||
var/obj/item/projectile/P = damage_source
|
||||
|
||||
var/reflectchance = 40 - round(damage/3)
|
||||
if(!(def_zone in list("chest", "groin")))
|
||||
if(!(def_zone in list(BP_TORSO, BP_GROIN)))
|
||||
reflectchance /= 2
|
||||
if(P.starting && prob(reflectchance))
|
||||
visible_message("<span class='danger'>\The [user]'s [src.name] reflects [attack_text]!</span>")
|
||||
|
||||
@@ -99,33 +99,31 @@
|
||||
var/sound = "heartbeat"
|
||||
var/sound_strength = "cannot hear"
|
||||
var/heartbeat = 0
|
||||
if(M.species && M.species.has_organ["heart"])
|
||||
var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
|
||||
if(heart && !heart.robotic)
|
||||
heartbeat = 1
|
||||
var/obj/item/organ/internal/heart/heart = M.internal_organs_by_name[O_HEART]
|
||||
if(heart && !(heart.status & ORGAN_ROBOT))
|
||||
heartbeat = 1
|
||||
if(M.stat == DEAD || (M.status_flags&FAKEDEATH))
|
||||
sound_strength = "cannot hear"
|
||||
sound = "anything"
|
||||
else
|
||||
switch(body_part)
|
||||
if("chest")
|
||||
if(BP_TORSO)
|
||||
sound_strength = "hear"
|
||||
sound = "no heartbeat"
|
||||
if(heartbeat)
|
||||
var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
|
||||
if(heart.is_bruised() || M.getOxyLoss() > 50)
|
||||
sound = "[pick("odd noises in","weak")] heartbeat"
|
||||
else
|
||||
sound = "healthy heartbeat"
|
||||
|
||||
var/obj/item/organ/heart/L = M.internal_organs_by_name["lungs"]
|
||||
var/obj/item/organ/internal/heart/L = M.internal_organs_by_name[O_LUNGS]
|
||||
if(!L || M.losebreath)
|
||||
sound += " and no respiration"
|
||||
else if(M.is_lung_ruptured() || M.getOxyLoss() > 50)
|
||||
sound += " and [pick("wheezing","gurgling")] sounds"
|
||||
else
|
||||
sound += " and healthy respiration"
|
||||
if("eyes","mouth")
|
||||
if(O_EYES,O_MOUTH)
|
||||
sound_strength = "cannot hear"
|
||||
sound = "anything"
|
||||
else
|
||||
|
||||
@@ -600,4 +600,11 @@
|
||||
desc = "A red shirt that has had the top cut low."
|
||||
icon_state = "cuttop_red"
|
||||
item_state = "r_suit"
|
||||
worn_state = "cuttop_red"
|
||||
worn_state = "cuttop_red"
|
||||
|
||||
/obj/item/clothing/under/harness
|
||||
name = "gear harness"
|
||||
desc = "How... minimalist."
|
||||
icon_state = "gear_harness"
|
||||
worn_state = "gear_harness"
|
||||
body_parts_covered = 0
|
||||
@@ -111,7 +111,7 @@
|
||||
user.do_attack_animation(src)
|
||||
M.IgniteMob()
|
||||
else if(reagents.total_volume)
|
||||
if(user.zone_sel.selecting == "mouth")
|
||||
if(user.zone_sel.selecting == O_MOUTH)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message(
|
||||
"<span class='danger'>\The [user] smothers [target] with [src]!</span>",
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
user.visible_message("<span class='danger'>\The [user] tries to take a swab sample from \the [H], but they move away.</span>")
|
||||
return
|
||||
|
||||
if(user.zone_sel.selecting == "mouth")
|
||||
if(!H.organs_by_name["head"])
|
||||
if(user.zone_sel.selecting == O_MOUTH)
|
||||
if(!H.organs_by_name[BP_HEAD])
|
||||
user << "<span class='warning'>They don't have a head.</span>"
|
||||
return
|
||||
if(!H.check_has_mouth())
|
||||
@@ -43,13 +43,13 @@
|
||||
dna = list(H.dna.unique_enzymes)
|
||||
sample_type = "DNA"
|
||||
|
||||
else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
|
||||
else if(user.zone_sel.selecting == BP_R_HAND || user.zone_sel.selecting == BP_L_HAND)
|
||||
var/has_hand
|
||||
var/obj/item/organ/external/O = H.organs_by_name["r_hand"]
|
||||
var/obj/item/organ/external/O = H.organs_by_name[BP_R_HAND]
|
||||
if(istype(O) && !O.is_stump())
|
||||
has_hand = 1
|
||||
else
|
||||
O = H.organs_by_name["l_hand"]
|
||||
O = H.organs_by_name[BP_L_HAND]
|
||||
if(istype(O) && !O.is_stump())
|
||||
has_hand = 1
|
||||
if(!has_hand)
|
||||
|
||||
@@ -41,14 +41,6 @@ var/list/weighted_mundaneevent_locations = list()
|
||||
[pick("mind-machine interfacing","neuroscience","nano-augmentation","genetics")]. [company_name] is expected to announce a co-exploitation deal within the fortnight."
|
||||
return null
|
||||
|
||||
/datum/trade_destination/icarus
|
||||
name = "NDV Icarus"
|
||||
description = "Corvette assigned to patrol local space."
|
||||
distance = 0.1
|
||||
willing_to_buy = list()
|
||||
willing_to_sell = list()
|
||||
viable_random_events = list(SECURITY_BREACH, AI_LIBERATION, PIRATES)
|
||||
|
||||
/datum/trade_destination/redolant
|
||||
name = "OAV Redolant"
|
||||
description = "Osiris Atmospherics station in orbit around the only gas giant insystem. They retain tight control over shipping rights, and Osiris warships protecting their prize are not an uncommon sight in Tau Ceti."
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
|
||||
|
||||
/datum/event/brand_intelligence/announce()
|
||||
command_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by.", "Machine Learning Alert")
|
||||
command_announcement.Announce("An ongoing mass upload of malware for vendors has been detected onboard [station_name()], which appears to transmit \
|
||||
to other nearby vendors. The original infected machine is believed to be \a [originMachine.name].", "Vendor Service Alert")
|
||||
|
||||
|
||||
/datum/event/brand_intelligence/start()
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
endWhen = 30
|
||||
|
||||
/datum/event/dust/announce()
|
||||
command_announcement.Announce("The station is now passing through a belt of space dust.", "Dust Alert")
|
||||
command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching your colony.", "Dust Alert")
|
||||
|
||||
/datum/event/dust/start()
|
||||
dust_swarm(get_severity())
|
||||
|
||||
/datum/event/dust/end()
|
||||
command_announcement.Announce("The station has now passed through the belt of space dust.", "Dust Notice")
|
||||
command_announcement.Announce("The colony is no longer in danger of impact from space debris.", "Dust Notice")
|
||||
|
||||
/datum/event/dust/proc/get_severity()
|
||||
switch(severity)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
|
||||
/datum/event/electrical_storm/announce()
|
||||
command_announcement.Announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
|
||||
command_announcement.Announce("An electrical issue has been detected in your area, please repair potential electronic overloads.", "Electrical Alert")
|
||||
|
||||
|
||||
/datum/event/electrical_storm/start()
|
||||
|
||||
@@ -160,7 +160,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 20, list(ASSIGNMENT_SECURITY = 20)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 30, list(ASSIGNMENT_ENGINEER = 5)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 150), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)),
|
||||
)
|
||||
@@ -174,7 +173,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0,list(ASSIGNMENT_ANY = 5)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 0, list(ASSIGNMENT_ENGINEER = 15), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 30), 1),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -76,7 +76,6 @@ var/list/event_last_fired = list()
|
||||
if(active_with_role["Medical"] > 0)
|
||||
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 10
|
||||
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 10
|
||||
possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 10
|
||||
|
||||
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50
|
||||
if(active_with_role["Security"] > 0)
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
endWhen = rand(15, 60)
|
||||
|
||||
/datum/event/gravity/announce()
|
||||
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes.", "Gravity Failure")
|
||||
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system \
|
||||
reinitializes. Please stand by while the gravity system reinitializes.", "Gravity Failure")
|
||||
|
||||
/datum/event/gravity/start()
|
||||
gravity_is_on = 0
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
#define LOC_KITCHEN 0
|
||||
#define LOC_ATMOS 1
|
||||
#define LOC_INCIN 2
|
||||
#define LOC_CHAPEL 3
|
||||
#define LOC_LIBRARY 4
|
||||
#define LOC_HYDRO 5
|
||||
#define LOC_VAULT 6
|
||||
#define LOC_CONSTR 7
|
||||
#define LOC_TECH 8
|
||||
#define LOC_TACTICAL 9
|
||||
#define LOC_CHAPEL 2
|
||||
#define LOC_LIBRARY 3
|
||||
#define LOC_HYDRO 4
|
||||
#define LOC_VAULT 5
|
||||
#define LOC_CONSTR 6
|
||||
#define LOC_TECH 7
|
||||
#define LOC_TACTICAL 8
|
||||
|
||||
#define VERM_MICE 0
|
||||
#define VERM_LIZARDS 1
|
||||
@@ -23,7 +22,7 @@
|
||||
|
||||
/datum/event/infestation/start()
|
||||
|
||||
location = rand(0,9)
|
||||
location = rand(0,8)
|
||||
var/list/turf/simulated/floor/turfs = list()
|
||||
var/spawn_area_type
|
||||
switch(location)
|
||||
@@ -33,9 +32,6 @@
|
||||
if(LOC_ATMOS)
|
||||
spawn_area_type = /area/engineering/atmos
|
||||
locstring = "atmospherics"
|
||||
if(LOC_INCIN)
|
||||
spawn_area_type = /area/maintenance/incinerator
|
||||
locstring = "the incinerator"
|
||||
if(LOC_CHAPEL)
|
||||
spawn_area_type = /area/chapel/main
|
||||
locstring = "the chapel"
|
||||
@@ -101,7 +97,6 @@
|
||||
|
||||
#undef LOC_KITCHEN
|
||||
#undef LOC_ATMOS
|
||||
#undef LOC_INCIN
|
||||
#undef LOC_CHAPEL
|
||||
#undef LOC_LIBRARY
|
||||
#undef LOC_HYDRO
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
/datum/event/meteor_wave/announce()
|
||||
switch(severity)
|
||||
if(EVENT_LEVEL_MAJOR)
|
||||
command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
|
||||
command_announcement.Announce("Meteors have been detected on collision course with the colony.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
|
||||
else
|
||||
command_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert")
|
||||
command_announcement.Announce("The colony is now in a meteor shower.", "Meteor Alert")
|
||||
|
||||
/datum/event/meteor_wave/tick()
|
||||
if(waves && activeFor >= next_meteor)
|
||||
@@ -32,9 +32,9 @@
|
||||
/datum/event/meteor_wave/end()
|
||||
switch(severity)
|
||||
if(EVENT_LEVEL_MAJOR)
|
||||
command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
|
||||
command_announcement.Announce("The colony has cleared the meteor storm.", "Meteor Alert")
|
||||
else
|
||||
command_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert")
|
||||
command_announcement.Announce("The colony has cleared the meteor shower", "Meteor Alert")
|
||||
|
||||
/datum/event/meteor_wave/proc/get_meteors()
|
||||
switch(severity)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
T.amount = winner_sum
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.source_terminal = "Biesel TCD Terminal #[rand(111,333)]"
|
||||
T.source_terminal = "Sif TCD Terminal #[rand(111,333)]"
|
||||
D.transaction_log.Add(T)
|
||||
|
||||
deposit_success = 1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user