Conflicts II

This commit is contained in:
Xhuis
2016-05-16 18:17:33 -04:00
30 changed files with 144 additions and 142 deletions
+15 -15
View File
@@ -53,21 +53,21 @@
#define MUTCOLORS 1
#define HAIR 2
#define FACEHAIR 4
#define EYECOLOR 8
#define LIPS 16
#define RESISTCOLD 32
#define RESISTHEAT 64
#define RADIMMUNE 128
#define NOBREATH 256
#define NOGUNS 512
#define NOBLOOD 1024
#define NOFIRE 2048
#define VIRUSIMMUNE 4096
#define PIERCEIMMUNE 8192
#define NOTRANSSTING 16384
#define MUTCOLORS_PARTSONLY 32768 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless.
#define FACEHAIR 3
#define EYECOLOR 4
#define LIPS 5
#define RESISTTEMP 6
#define RADIMMUNE 7
#define NOBREATH 8
#define NOGUNS 9
#define NOBLOOD 10
#define NOFIRE 11
#define VIRUSIMMUNE 12
#define PIERCEIMMUNE 13
#define NOTRANSSTING 14
#define MUTCOLORS_PARTSONLY 15 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless.
#define NODISMEMBER 16
#define NOHUNGER 17
/*
These defines are used specifically with the atom/movable/languages bitmask.
+2 -2
View File
@@ -1,9 +1,9 @@
/datum/game_mode/blob/check_finished()
if(blob_overminds.len > cores_to_spawn && cores_to_spawn > blob_cores.len)//Some blobs have yet to burst
if(overminds.len)
return 0
if(blobwincount <= blobs_legit.len)//Blob took over
return 1
if(!overminds.len && !blob_cores.len) //blob is dead
if(!blob_cores.len) //blob is dead
if(config.continuous["blob"])
continuous_sanity_checked = 1 //Nonstandard definition of "alive" gets past the check otherwise
SSshuttle.emergencyNoEscape = 0
+14
View File
@@ -45,6 +45,20 @@
return ..()
/obj/effect/blob/Adjacent(var/atom/neighbour)
. = ..()
if(.)
var/result = 0
var/direction = get_dir(src, neighbour)
var/list/dirs = list("[NORTHWEST]" = list(NORTH, WEST), "[NORTHEAST]" = list(NORTH, EAST), "[SOUTHEAST]" = list(SOUTH, EAST), "[SOUTHWEST]" = list(SOUTH, WEST))
for(var/A in dirs)
if(direction == text2num(A))
for(var/B in dirs[A])
var/C = locate(/obj/effect/blob) in get_step(src, B)
if(C)
result++
. -= result - 1
/obj/effect/blob/CanAtmosPass(turf/T)
return !atmosblock
@@ -1,13 +1,17 @@
/obj/effect/proc_holder/changeling/fleshmend
name = "Fleshmend"
desc = "Our flesh rapidly regenerates, healing our wounds. Effectiveness decreases with quick, repeated use."
helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious, and will alert nearby crew."
desc = "Our flesh rapidly regenerates, healing our wounds, and growing \
back missing limbs. Effectiveness decreases with quick, repeated use."
helptext = "Heals a moderate amount of damage over a short period of \
time. Can be used while unconscious. Will alert nearby crew if \
any limbs are regenerated."
chemical_cost = 25
dna_cost = 2
req_stat = UNCONSCIOUS
var/recent_uses = 1 //The factor of which the healing should be divided by
var/healing_ticks = 10
// The ideal total healing amount, divided by healing_ticks to get heal/tick
// The ideal total healing amount,
// divided by healing_ticks to get heal/tick
var/total_healing = 100
/obj/effect/proc_holder/changeling/fleshmend/New()
@@ -22,25 +26,29 @@
if(recent_uses > 1)
recent_uses = max(1, recent_uses - (1 / healing_ticks))
//Starts healing you every second for 10 seconds. Can be used whilst unconscious.
//Starts healing you every second for 10 seconds.
//Can be used whilst unconscious.
/obj/effect/proc_holder/changeling/fleshmend/sting_action(mob/living/user)
user << "<span class='notice'>We begin to heal rapidly.</span>"
if(recent_uses > 1)
user << "<span class='warning'>Our healing's effectiveness is reduced by quickly repeated use!</span>"
user << "<span class='warning'>Our healing's effectiveness is reduced \
by quick repeated use!</span>"
spawn(0)
recent_uses++
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.restore_blood()
H.remove_all_embedded_objects()
if(H.get_missing_limbs())
var/list/missing = H.get_missing_limbs()
if(missing.len)
playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1)
H.visible_message("<span class='warning'>[user]'s missing limbs reform, making a loud, grotesque sound!</span>", "<span class='userdanger'>Your limbs regrow, making a loud, crunchy sound and giving you great pain!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
H.emote("scream")
H.regenerate_limbs(1)
// The healing itself - doesn't heal toxin damage (that's anatomic panacea) and
// effectiveness decreases with each use in a short timespan
// The healing itself - doesn't heal toxin damage
// (that's anatomic panacea) and the effectiveness decreases with
// each use in a short timespan
for(var/i in 1 to healing_ticks)
if(user)
var/healpertick = -(total_healing / healing_ticks)
+1 -1
View File
@@ -68,7 +68,7 @@
restricted_jobs += "Assistant"
//cult scaling goes here
recommended_enemies = 3 + round(num_players()/20)
recommended_enemies = 3 + round(num_players()/15)
for(var/cultists_number = 1 to recommended_enemies)
+7 -2
View File
@@ -759,7 +759,7 @@ var/list/teleport_runes = list()
var/mob/living/user = invokers[1]
var/list/cultists = list()
for(var/datum/mind/M in ticker.mode.cult)
if(!(M.current in invokers))
if(!(M.current in invokers) && M.current.stat != DEAD)
cultists |= M.current
var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
@@ -769,10 +769,15 @@ var/list/teleport_runes = list()
fail_invoke()
log_game("Summon Cultist rune failed - no target")
return
if(cultist_to_summon.stat == DEAD)
user << "<span class='cultitalic'>[cultist_to_summon] has died!</span>"
fail_invoke()
log_game("Summon Cultist rune failed - target died")
return
if(!iscultist(cultist_to_summon))
user << "<span class='cultitalic'>[cultist_to_summon] is not a follower of the Geometer!</span>"
fail_invoke()
log_game("Summon Cultist rune failed - no target")
log_game("Summon Cultist rune failed - target was deconverted")
return
if(cultist_to_summon.z > ZLEVEL_SPACEMAX)
user << "<span class='cultitalic'>[cultist_to_summon] is not in our dimension!</span>"
+2 -2
View File
@@ -254,10 +254,10 @@ Made by Xhuis
name = "Shadowling"
id = "shadowling"
say_mod = "chitters"
specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS) //Can't use guns due to muzzle flash
specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS,NODISMEMBER) //Can't use guns due to muzzle flash
burnmod = 1.5 //1.5x burn damage, 2x is excessive
heatmod = 1.5
has_dismemberment = 0
/datum/species/shadow/ling/spec_life(mob/living/carbon/human/H)
if(!H.weakeyes) H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs
@@ -72,7 +72,7 @@ effective or pretty fucking useless.
name = "health analyzer"
icon_state = "health"
item_state = "analyzer"
desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end."
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
+1 -1
View File
@@ -626,7 +626,7 @@
return OXYLOSS
/obj/item/toy/talking/skeleton/generate_messages()
return list(regular_messages)
return list(pick(regular_messages))
/obj/item/toy/talking/skeleton/toy_talk(user, message)
phomeme = pick("sans", "papyrus")
+7 -1
View File
@@ -5,6 +5,9 @@
circuit = /obj/item/weapon/circuitboard/computer/cargo
var/requestonly = FALSE
var/contraband = FALSE
var/safety_warning = "For safety reasons the automated supply shuttle \
cannot transport live organisms, classified nuclear weaponry or \
homing beacons."
/obj/machinery/computer/cargo/request
name = "supply request console"
@@ -94,7 +97,7 @@
switch(action)
if("send")
if(SSshuttle.supply.canMove())
say("For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.")
say(safety_warning)
return
if(SSshuttle.supply.getDockedId() == "supply_home")
SSshuttle.supply.emagged = emagged
@@ -110,6 +113,9 @@
if("loan")
if(!SSshuttle.shuttle_loan)
return
if(SSshuttle.supply.canMove())
say(safety_warning)
return
else if(SSshuttle.supply.mode == SHUTTLE_IDLE)
SSshuttle.shuttle_loan.loan_shuttle()
say("The supply shuttle has been loaned to Centcom.")
+1 -2
View File
@@ -10,8 +10,7 @@
var/list/punctuation = list(",",":",";",".","?","!","\'","-")
var/regex/R = regex("(\[\\l\\d]*)(\[^\\l\\d\\s])?", "g")
var/list/letter_count = list()
while(R.next <= length(message))
R.Find(message)
while(R.Find(message) != 0)
if(R.group[1])
letter_count += length(R.group[1])
if(R.group[2])
+1 -1
View File
@@ -16,7 +16,7 @@
/datum/round_event/ghost_role/abductor/spawn_role()
var/list/mob/dead/observer/candidates = get_candidates("abductor", null, ROLE_ABDUCTOR)
if(!candidates.len < 2)
if(candidates.len < 2)
return NOT_ENOUGH_PLAYERS
//Oh god why we can't have static functions
// I feel your pain, bro
+4 -4
View File
@@ -11,15 +11,15 @@
/mob/living/simple_animal/hostile/syndicate/ranged/space/noloot = 2)
/datum/round_event_control/portal_storm_narsie
name = "Portal Storm: Nar-sie"
name = "Portal Storm: Constructs"
typepath = /datum/round_event/portal_storm/portal_storm_narsie
weight = 0
max_occurrences = 0
/datum/round_event/portal_storm/portal_storm_narsie
boss_types = list(/obj/singularity/narsie/large = 1)
hostile_types = list(/mob/living/simple_animal/hostile/construct/armored/hostile = 10,\
/mob/living/simple_animal/hostile/construct/wraith/hostile = 10)
boss_types = list(/mob/living/simple_animal/hostile/construct/builder = 6)
hostile_types = list(/mob/living/simple_animal/hostile/construct/armored/hostile = 8,\
/mob/living/simple_animal/hostile/construct/wraith/hostile = 6)
/datum/round_event/portal_storm
startWhen = 7
+23 -23
View File
@@ -227,7 +227,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if (!injected || !our || !dna)
return
if(blood_incompatible(injected.data["blood_type"], dna.blood_type,injected.data["species"], dna.species.id) )
if (!(injected.data["blood_type"] in get_safe_blood(dna.blood_type)) || injected.data["species"] != dna.species.id)
reagents.add_reagent("toxin",amount * 0.5)
our.on_merge(injected.data) //still transfer viruses and such, even if incompatibles bloods
reagents.update_total()
@@ -246,28 +246,28 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
return D
return res
/proc/blood_incompatible(donor,receiver,donor_species,receiver_species)
if(!donor || !receiver) return 0
if(donor_species && receiver_species)
if(donor_species != receiver_species)
return 1
var/donor_antigen = copytext(donor,1,lentext(donor))
var/receiver_antigen = copytext(receiver,1,lentext(receiver))
var/donor_rh = (findtext(donor,"+")>0)
var/receiver_rh = (findtext(receiver,"+")>0)
if(donor_rh && !receiver_rh) return 1
switch(receiver_antigen)
if("A")
if(donor_antigen != "A" && donor_antigen != "O") return 1
if("B")
if(donor_antigen != "B" && donor_antigen != "O") return 1
if("O")
if(donor_antigen != "O") return 1
//AB is a universal receiver.
return 0
// This is has more potential uses, and is probably faster than the old proc.
/proc/get_safe_blood(bloodtype)
. = list()
if(!bloodtype)
return
switch(bloodtype)
if("A-")
return list("A-", "O-")
if("A+")
return list("A", "A+", "O-", "O+")
if("B-")
return list("B-", "O-")
if("B+")
return list("B-", "B+", "O-", "O+")
if("AB-")
return list("A-", "B-", "O-", "AB-")
if("AB+")
return list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+")
if("O-")
return list("O-")
if("O+")
return list("O-", "O+")
/proc/blood_splatter(target,datum/reagent/blood/source,large)
+1 -1
View File
@@ -214,7 +214,7 @@
if(dna.check_mutation(COLDRES))
return 1 //Fully protected from the cold.
if(dna && (RESISTCOLD in dna.species.specflags))
if(dna && (RESISTTEMP in dna.species.specflags))
return 1
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
+12 -13
View File
@@ -30,7 +30,6 @@
var/hair_color = null // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color
var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent.
var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans)
var/need_nutrition = 1 //Does it need to eat food on a regular basis?
var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id.
var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing
var/skinned_type = /obj/item/stack/sheet/animalhide/generic
@@ -83,8 +82,6 @@
var/tox_breath_dam_min = MIN_PLASMA_DAMAGE
var/tox_breath_dam_max = MAX_PLASMA_DAMAGE
var/has_dismemberment = 1 //Whether or not this species uses dismemberment for its limbs
///////////
// PROCS //
///////////
@@ -127,7 +124,7 @@
var/obj/item/thing = C.get_item_by_slot(slot_id)
if(thing)
C.unEquip(thing)
if(!has_dismemberment)
if(NODISMEMBER in specflags)
C.regenerate_limbs() //if we don't handle dismemberment, we grow our missing limbs back
if(exotic_blood)
C.reagents.add_reagent(exotic_blood, 80)
@@ -152,7 +149,7 @@
return "[id]"
/datum/species/proc/update_color(mob/living/carbon/human/H, forced_colour)
if(has_dismemberment) //only species without dismemberment still use base icon states.
if(!(NODISMEMBER in specflags)) //only species without dismemberment still use base icon states.
return
H.remove_overlay(SPECIES_LAYER)
@@ -276,7 +273,7 @@
var/list/standing = list()
if(!has_dismemberment) //Legacy support
if(NODISMEMBER in specflags) //Legacy support
H.update_base_icon_state()
if(!(H.disabilities & HUSK))
update_color(H)
@@ -703,7 +700,9 @@
H.update_inv_wear_suit()
// nutrition decrease and satiety
if (H.nutrition > 0 && H.stat != DEAD && H.dna.species.need_nutrition)
if (H.nutrition > 0 && H.stat != DEAD && \
H.dna && H.dna.species && (!(NOHUNGER in H.dna.species.specflags)))
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
if(H.satiety > 0)
H.satiety--
@@ -1337,7 +1336,7 @@
if(200 to 260)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head")
if(!(RESISTHEAT in specflags)) // HEAT DAMAGE
if(!(RESISTTEMP in specflags)) // HEAT DAMAGE
switch(breath.temperature)
if(360 to 400)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head")
@@ -1372,7 +1371,7 @@
H.bodytemperature += min((1-thermal_protection) * ((loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTHEAT in specflags))
if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTTEMP in specflags))
//Body temperature is too hot.
switch(H.bodytemperature)
if(360 to 400)
@@ -1411,7 +1410,7 @@
var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
switch(adjusted_pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY)
if(!(RESISTHEAT in specflags))
if(!(RESISTTEMP in specflags))
H.adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
H.throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else
@@ -1423,7 +1422,7 @@
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
if(H.dna.check_mutation(COLDRES) || (RESISTCOLD in specflags))
if(H.dna.check_mutation(COLDRES) || (RESISTTEMP in specflags))
H.clear_alert("pressure")
else
H.adjustBruteLoss( LOW_PRESSURE_DAMAGE )
@@ -1434,11 +1433,11 @@
//////////
/datum/species/proc/handle_fire(mob/living/carbon/human/H)
if((RESISTHEAT in specflags) || (NOFIRE in specflags))
if((RESISTTEMP in specflags) || (NOFIRE in specflags))
return 1
/datum/species/proc/IgniteMob(mob/living/carbon/human/H)
if((RESISTHEAT in specflags) || (NOFIRE in specflags))
if((RESISTTEMP in specflags) || (NOFIRE in specflags))
return 1
/datum/species/proc/ExtinguishMob(mob/living/carbon/human/H)
@@ -179,10 +179,9 @@
default_color = "00FF90"
say_mod = "chirps"
eyes = "jelleyes"
specflags = list(MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE)
specflags = list(MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,NODISMEMBER)
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime
exotic_blood = "slimejelly"
has_dismemberment = 0
/datum/species/jelly/spec_life(mob/living/carbon/human/H)
if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely
@@ -320,7 +319,7 @@
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "golem"
specflags = list(NOBREATH,RESISTHEAT,RESISTCOLD,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE)
specflags = list(NOBREATH,RESISTTEMP,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER)
speedmod = 2
armor = 55
siemens_coeff = 0
@@ -331,7 +330,6 @@
nojumpsuit = 1
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem
has_dismemberment = 0
/datum/species/golem/adamantine
name = "Adamantine Golem"
@@ -408,12 +406,11 @@
name = "Spooky Scary Skeleton"
id = "skeleton"
say_mod = "rattles"
need_nutrition = 0
blacklisted = 1
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER)
mutant_organs = list(/obj/item/organ/tongue/bone)
specflags = list(NOBREATH,RESISTHEAT,RESISTCOLD,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE)
/*
ZOMBIES
@@ -427,7 +424,7 @@
sexes = 0
blacklisted = 1
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
specflags = list(NOBREATH,RESISTHEAT,RESISTCOLD,NOBLOOD,RADIMMUNE)
specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,RADIMMUNE)
mutant_organs = list(/obj/item/organ/tongue/zombie)
/datum/species/cosmetic_zombie
@@ -457,13 +454,12 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
say_mod = "rattles"
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
specflags = list(NOBLOOD,RADIMMUNE,NOTRANSSTING,VIRUSIMMUNE)
specflags = list(NOBLOOD,RADIMMUNE,NOTRANSSTING,VIRUSIMMUNE,NOHUNGER)
safe_oxygen_min = 0 //We don't breath this
safe_toxins_min = 16 //We breath THIS!
safe_toxins_max = 0
dangerous_existence = 1 //So so much
blacklisted = 1 //See above
need_nutrition = 0 //Hard to eat through a helmet
burnmod = 2
heatmod = 2
speedmod = 1
@@ -511,7 +507,7 @@ var/global/list/synth_flesh_disguises = list()
id = "synth"
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE) //all of these + whatever we inherit from the real species
specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species
safe_oxygen_min = 0
safe_toxins_min = 0
safe_toxins_max = 0
@@ -520,13 +516,11 @@ var/global/list/synth_flesh_disguises = list()
SA_sleep_min = 0
dangerous_existence = 1
blacklisted = 1
need_nutrition = 0 //beep boop robots do not need sustinance
meat = null
var/list/initial_specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE) //for getting these values back for assume_disguise()
var/list/initial_specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NOHUNGER) //for getting these values back for assume_disguise()
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/image/damaged_synth_flesh = null //an image to display when we're below disguise_fail_health
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
has_dismemberment = 0
/datum/species/synth/military
name = "Military Synth"
@@ -645,7 +639,7 @@ var/global/list/synth_flesh_disguises = list()
H.updatehealth()
if(H.health > disguise_fail_health)
if(fake_species)
if(fake_species.has_dismemberment)
if(!(NODISMEMBER in fake_species.specflags))
return fake_species.handle_body(H)
else
return fake_species.update_base_icon_state(H)
@@ -657,7 +651,7 @@ var/global/list/synth_flesh_disguises = list()
/datum/species/synth/update_color(mob/living/carbon/human/H, forced_colour)
H.updatehealth()
if(H.health > disguise_fail_health)
if(fake_species && fake_species.has_dismemberment)
if(fake_species && !(NODISMEMBER in fake_species.specflags))
fake_species.update_color(H, forced_colour)
@@ -708,7 +702,6 @@ SYNDICATE BLACK OPS
name = "Corporate Agent"
id = "agent"
hair_alpha = 0
need_nutrition = 0//They don't need to eat
say_mod = "declares"
speedmod = -2//Fast
brutemod = 0.7//Tough against firearms
@@ -722,6 +715,5 @@ SYNDICATE BLACK OPS
attack_sound = "sound/weapons/resonator_blast.ogg"
blacklisted = 1
use_skintones = 0
specflags = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR)
specflags = list(RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER)
sexes = 0
has_dismemberment = 0
@@ -94,7 +94,7 @@ Please contact me on #coderbus IRC. ~Carnie x
..("Standing")
/mob/living/carbon/human/proc/update_body_parts()
if(!dna.species.has_dismemberment) //Species don't have no dismemberment going for 'em!
if(NODISMEMBER in dna.species.specflags) //Species don't have no dismemberment going for 'em!
remove_overlay(BODYPARTS_LAYER)
return
@@ -555,7 +555,10 @@
if(emagged || (connected_ai && lawupdate)) //Can't be sure which, metagamers
emote("buzz-[user.name]")
return
MOD.install(src, user) //Proc includes a success mesage so we don't need another one
if(!mind) //A player mind is required for law procs to run antag checks.
user << "<span class='warning'>[src] is entirely unresponsive!</span>"
return
MOD.install(laws, user) //Proc includes a success mesage so we don't need another one
return
else if(istype(W, /obj/item/device/encryptionkey/) && opened)
@@ -148,6 +148,7 @@
/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target)
if(stat)
return
swoop_cooldown = world.time + 200
var/swoop_target
if(manual_target)
swoop_target = manual_target
@@ -194,10 +195,6 @@
stop_automated_movement = FALSE
swooping = 0
density = 1
swoop_cooldown = world.time + 200
/mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A)
if(!istype(A))
@@ -54,8 +54,7 @@
newdart.update_icon()
/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
if(pen)
qdel(pen)
pen = null
return ..()
/obj/item/projectile/bullet/reusable/foam_dart/riot
@@ -737,7 +737,7 @@
M.adjustToxLoss(rand(5,10))
/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(method == TOUCH || VAPOR)
if(method == TOUCH || method == VAPOR)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(istype(M,/mob/living/carbon/human))
@@ -5,7 +5,7 @@
//Dismember a limb
/obj/item/bodypart/proc/dismember(dam_type = BRUTE)
var/mob/living/carbon/human/H = owner
if(!istype(H) || !H.dna.species.has_dismemberment) // species don't allow dismemberment
if(!istype(H) || (NODISMEMBER in H.dna.species.specflags)) // species don't allow dismemberment
return 0
var/obj/item/bodypart/affecting = H.get_bodypart("chest")
@@ -35,7 +35,7 @@
/obj/item/bodypart/chest/dismember()
var/mob/living/carbon/human/H = owner
if(!istype(H) || !H.dna.species.has_dismemberment) //human's species don't allow dismemberment
if(!istype(H) || (NODISMEMBER in H.dna.species.specflags)) //human's species don't allow dismemberment
return 0
var/organ_spilled = 0
+2 -2
View File
@@ -70,7 +70,7 @@
.++
/mob/living/proc/get_missing_limbs()
return
return list()
/mob/living/carbon/human/get_missing_limbs()
var/list/full = list("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg")
@@ -153,4 +153,4 @@
if("african2")
. = "471c18"
if("albino")
. = "fff4e6"
. = "fff4e6"
+14 -2
View File
@@ -178,6 +178,14 @@ var/last_irc_status = 0
if(ticker.delay_end)
world << "<span class='boldannounce'>Reboot was cancelled by an admin.</span>"
return
if(mapchanging)
world << "<span class='boldannounce'>Map change operation detected, delaying reboot.</span>"
rebootingpendingmapchange = 1
spawn(1200)
if(mapchanging)
mapchanging = 0 //map rotation can in some cases be finished but never exit, this is a failsafe
Reboot("Map change timed out", time = 10)
return
feedback_set_details("[feedback_c]","[feedback_r]")
log_game("<span class='boldannounce'>Rebooting World. [reason]</span>")
kick_clients_in_lobby("<span class='boldannounce'>The round came to an end with you in the lobby.</span>", 1) //second parameter ensures only afk clients are kicked
@@ -386,17 +394,19 @@ var/failed_db_connections = 0
world << "<span class='boldannounce'>Map rotation has chosen [VM.friendlyname] for next round!</span>"
var/datum/votablemap/nextmap
var/mapchanging = 0
var/rebootingpendingmapchange = 0
/proc/changemap(var/datum/votablemap/VM)
if (!SERVERTOOLS)
return
if (!istype(VM))
return
mapchanging = 1
log_game("Changing map to [VM.name]([VM.friendlyname])")
var/file = file("setnewmap.bat")
file << "\nset MAPROTATE=[VM.name]\n"
. = shell("..\\bin\\maprotate.bat")
mapchanging = 0
switch (.)
if (null)
message_admins("Failed to change map: Could not run map rotator")
@@ -426,3 +436,5 @@ var/datum/votablemap/nextmap
else
message_admins("Failed to change map: Unknown error: Error code #[.]")
log_game("Failed to change map: Unknown error: Error code #[.]")
if(rebootingpendingmapchange)
world.Reboot("Map change finished", time = 10)
-32
View File
@@ -593,38 +593,6 @@
<li class="rscadd">Admin Detection Multitool: A multitool that shows when administrators are watching you! Now you can grief in safety!</li>
<li class="tweak">Syndicate R&D scientists have significantly increased the range of their "AI detection multitools", making them turn yellow when an AI's tracking is near, but not on you just yet!</li>
</ul>
<h2 class="date">18 April 2016</h2>
<h3 class="author">Joan updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">Crates are now dense even when open.</li>
<li class="rscadd">You can now climb onto crates in the same way as table and sandbags, though climbing onto crates is very fast and does not stun you.</li>
<li class="wip">You can walk on crates, provided both are closed/open or the crate you're on is closed.</li>
<li class="rscdel">You can't close or open a crate if there's a large mob on top of it.</li>
<li class="rscadd">Stuffing items into a closet or crate is now instant and does not close the closet or crate. Stuffing mobs into a closet or crate still takes time and closes the closet/crate in question.</li>
<li class="imageadd">Crowbars and wirecutters have new inhand sprites. Crowbars can now be distinguished from wrenches in-hand.</li>
</ul>
<h3 class="author">RandomMarine updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Cloth items removed from biogenerator. Instead, it can create stacking cloth that crafts those items.</li>
<li class="rscadd">In addition, cloth can be used to create grey jumpsuits, backpacks, dufflebags, bio bags, black shoes, bedsheets, and bandages.</li>
<li class="tweak">Bedsheets now tear into cloth instead of directly into bandages.</li>
</ul>
<h3 class="author">Shadowlight213 updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">AI will be notified when one of their cyborgs is detonated.</li>
</ul>
<h3 class="author">coiax updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed slime grinders not sucking up more than one slime</li>
<li class="rscadd">Drones now start with a spacious dufflebag full of tools, so they will stop stealing the captain's</li>
<li class="bugfix">Fixed issues with drones wearing chameleon headgear.</li>
<li class="rscadd">Added admin-only "snowflake drone" (also known as drone camogear) headgear.</li>
</ul>
<h3 class="author">nullbear updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes air canisters being silent when bashed.</li>
</ul>
</div>
<b>GoonStation 13 Development Team</b>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 92 KiB