diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index d08679bbc1..0309eccee0 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -3,7 +3,9 @@
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
+
verbs += /datum/changeling/proc/EvolutionMenu
+ add_language("Changeling")
var/lesser_form = !ishuman(src)
@@ -30,8 +32,7 @@
mind.changeling.absorbed_species += H.species.name
for(var/language in languages)
- if(!(language in mind.changeling.absorbed_languages))
- mind.changeling.absorbed_languages += language
+ mind.changeling.absorbed_languages |= language
return 1
@@ -80,6 +81,9 @@
for(var/language in updated_languages)
languages += language
+ //This isn't strictly necessary but just to be safe...
+ add_language("Changeling")
+
return
//Used to switch species based on the changeling datum.
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 484cf4052c..77a48f2693 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -393,7 +393,12 @@ var/global/datum/controller/gameticker/ticker
else
Player << "You missed the crew transfer after the events on [station_name()] as [Player.real_name]."
else
- Player << "You did not survive the events on [station_name()]..."
+ if(istype(Player,/mob/dead/observer))
+ var/mob/dead/observer/O = Player
+ if(!O.started_as_observer)
+ Player << "You did not survive the events on [station_name()]..."
+ else
+ Player << "You did not survive the events on [station_name()]..."
world << "
"
for (var/mob/living/silicon/ai/aiPlayer in mob_list)
@@ -427,7 +432,7 @@ var/global/datum/controller/gameticker/ticker
robo.laws.show_laws(world)
if(dronecount)
- world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round."
+ world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round."
mode.declare_completion()//To declare normal completion.
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 5f2a5880cb..6c52dd9329 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -635,17 +635,17 @@ var/global/list/gear_datums = list()
/datum/gear/blipstick
display_name = "lipstick, black"
- path = /obj/item/weapon/lipstick
+ path = /obj/item/weapon/lipstick/black
cost = 1
/datum/gear/jlipstick
display_name = "lipstick, jade"
- path = /obj/item/weapon/lipstick
+ path = /obj/item/weapon/lipstick/jade
cost = 1
/datum/gear/plipstick
display_name = "lipstick, purple"
- path = /obj/item/weapon/lipstick
+ path = /obj/item/weapon/lipstick/purple
cost = 1
/datum/gear/rlipstick
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 820bcbe7e9..c94ab17b1a 100755
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -47,6 +47,8 @@
name = "Sinta'unathi"
desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi."
speech_verb = "hisses"
+ ask_verb = "hisses"
+ exclaim_verb = "roars"
colour = "soghun"
key = "o"
flags = WHITELISTED
@@ -55,6 +57,8 @@
name = "Siik'tajr"
desc = "The traditionally employed tongue of Ahdomai, composed of expressive yowls and chirps. Native to the Tajaran."
speech_verb = "mrowls"
+ ask_verb = "mrowls"
+ exclaim_verb = "yowls"
colour = "tajaran"
key = "j"
flags = WHITELISTED
@@ -63,6 +67,8 @@
name = "Skrellian"
desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans."
speech_verb = "warbles"
+ ask_verb = "warbles"
+ exclaim_verb = "warbles"
colour = "skrell"
key = "k"
flags = WHITELISTED
@@ -71,6 +77,8 @@
name = "Vox-pidgin"
desc = "The common tongue of the various Vox ships making up the Shoal. It sounds like chaotic shrieking to everyone else."
speech_verb = "shrieks"
+ ask_verb = "creels"
+ exclaim_verb = "SHRIEKS"
colour = "vox"
key = "v"
flags = RESTRICTED
@@ -79,6 +87,8 @@
name = "Rootspeak"
desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootspeak can be a combination of anywhere from one to twelve individual voices and notes."
speech_verb = "creaks and rustles"
+ ask_verb = "creaks"
+ exclaim_verb = "rustles"
colour = "soghun"
key = "q"
flags = RESTRICTED
@@ -90,6 +100,14 @@
key = "0"
flags = RESTRICTED
+/datum/language/common/get_spoken_verb(var/msg_end)
+ switch(msg_end)
+ if("!")
+ return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
+ if("?")
+ return ask_verb
+ return speech_verb
+
/datum/language/human
name = "Sol Common"
desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system."
@@ -117,6 +135,8 @@
colour = "alien"
desc = "The common tongue of the xenomorphs."
speech_verb = "hisses"
+ ask_verb = "hisses"
+ exclaim_verb = "hisses"
key = "4"
flags = RESTRICTED
@@ -124,6 +144,8 @@
name = "Hivemind"
desc = "Xenomorphs have the strange ability to commune over a psychic hivemind."
speech_verb = "hisses"
+ ask_verb = "hisses"
+ exclaim_verb = "hisses"
colour = "alien"
key = "a"
flags = RESTRICTED | HIVEMIND
@@ -157,6 +179,8 @@
name = "Cortical Link"
desc = "Cortical borers possess a strange link between their tiny minds."
speech_verb = "sings"
+ ask_verb = "sings"
+ exclaim_verb = "sings"
colour = "alien"
key = "x"
flags = RESTRICTED | HIVEMIND
@@ -178,8 +202,10 @@
/datum/language/binary
name = "Robot Talk"
desc = "Most human stations support free-use communications protocols and routing hubs for synthetic use."
- speech_verb = "transmits"
colour = "say_quote"
+ speech_verb = "states"
+ ask_verb = "queries"
+ exclaim_verb = "declares"
key = "b"
flags = RESTRICTED | HIVEMIND
var/drone_only
@@ -222,6 +248,8 @@
name = "Drone Talk"
desc = "A heavily encoded damage control coordination stream."
speech_verb = "transmits"
+ ask_verb = "transmits"
+ exclaim_verb = "transmits"
colour = "say_quote"
key = "d"
flags = RESTRICTED | HIVEMIND
diff --git a/code/modules/mob/living/carbon/human/alien/alien_powers.dm b/code/modules/mob/living/carbon/human/alien/alien_powers.dm
index 4b522c3552..e23bdfbd8f 100644
--- a/code/modules/mob/living/carbon/human/alien/alien_powers.dm
+++ b/code/modules/mob/living/carbon/human/alien/alien_powers.dm
@@ -172,9 +172,14 @@
if(!check_alien_ability(50,0,"acid gland"))
return
+ if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
+ src << "You cannot spit neurotoxin in your current state."
+ return
+
src << "\green You spit neurotoxin at [target]."
+
for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
+ if ((O.client && !(O.blinded )))
O << "\red [src] spits neurotoxin at [target]!"
//I'm not motivated enough to revise this. Prjectile code in general needs update.
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 1837380855..30ac38248f 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -14,8 +14,8 @@
return
var/list/choices = list()
- for(var/mob/living/M in view(6,src))
- if(!istype(M,/mob/living/silicon))
+ for(var/mob/living/M in view(1,src))
+ if(!istype(M,/mob/living/silicon) && Adjacent(M))
choices += M
choices -= src
@@ -23,13 +23,13 @@
if(!T || !src || src.stat) return
- if(get_dist(get_turf(T), get_turf(src)) > 6) return
+ if(!Adjacent(T)) return
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
- src << "You cannot leap in your current state."
+ src << "You cannot tackle in your current state."
return
last_special = world.time + 50
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index c871ff4453..18ccba8c0a 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -283,7 +283,7 @@
if (radiation)
var/datum/organ/internal/diona/nutrients/rad_organ = locate() in internal_organs
- if(!rad_organ || rad_organ.is_broken())
+ if(rad_organ && !rad_organ.is_broken())
var/rads = radiation/25
radiation -= rads
nutrition += rads
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 6a252b1c9c..d0c9e4dadd 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -37,14 +37,20 @@
else if(species.default_language)
speaking = all_languages[species.default_language]
+ var/ending = copytext(message, length(message))
if (speaking)
- verb = speaking.speech_verb
-
// This is broadcast to all mobs with the language,
// irrespective of distance or anything else.
if(speaking.flags & HIVEMIND)
speaking.broadcast(src,trim(message))
return
+ //If we've gotten this far, keep going!
+ verb = speaking.get_spoken_verb(ending)
+ else
+ if(ending=="!")
+ verb=pick("exclaims","shouts","yells")
+ if(ending=="?")
+ verb="asks"
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
return
@@ -60,13 +66,6 @@
if(!message || stat)
return
- if (!speaking)
- var/ending = copytext(message, length(message))
- if(ending=="!")
- verb=pick("exclaims","shouts","yells")
- if(ending=="?")
- verb="asks"
-
var/list/obj/item/used_radios = new
switch (message_mode)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index cdca3b18ef..2aaa75fae1 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -28,13 +28,12 @@
var/mail_destination = ""
holder_type = /obj/item/weapon/holder/drone
+
/mob/living/silicon/robot/drone/New()
..()
- verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
-
remove_language("Robot Talk")
add_language("Robot Talk", 0)
add_language("Drone Talk", 1)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 8d69a1d0a2..f3cc857b17 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -172,6 +172,7 @@
/mob/living/silicon/add_language(var/language, var/can_speak=1)
if (..(language) && can_speak)
speech_synthesizer_langs.Add(all_languages[language])
+ return 1
/mob/living/silicon/remove_language(var/rem_language)
..(rem_language)
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 9af498eea3..8d4144a550 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -232,7 +232,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if (!injected || !our)
return
- if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) )
+ if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"],injected.data["species"],our.data["species"]) )
reagents.add_reagent("toxin",amount * 0.5)
reagents.update_total()
else
@@ -250,13 +250,18 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
return D
return res
-proc/blood_incompatible(donor,receiver)
+proc/blood_incompatible(donor,receiver,donor_species,receiver_species)
if(!donor || !receiver) return 0
- var
- donor_antigen = copytext(donor,1,lentext(donor))
- receiver_antigen = copytext(receiver,1,lentext(receiver))
- donor_rh = (findtext(donor,"+")>0)
- receiver_rh = (findtext(receiver,"+")>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")
diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm
index 907d5fa122..183197dfbb 100644
--- a/code/modules/organs/organ_internal.dm
+++ b/code/modules/organs/organ_internal.dm
@@ -73,11 +73,8 @@
// Process unsuitable transplants. TODO: consider some kind of
// immunosuppressant that changes transplant data to make it match.
if(transplant_data)
- if(!rejecting) //Should this transplant reject?
- if(owner.species != transplant_data["species"]) //Nope.
- rejecting = 1
- else if(prob(20) && owner.dna && blood_incompatible(transplant_data["blood_type"],owner.dna.b_type))
- rejecting = 1
+ if(!rejecting && prob(20) && owner.dna && blood_incompatible(transplant_data["blood_type"],owner.dna.b_type,owner.species,transplant_data["species"]))
+ rejecting = 1
else
rejecting++ //Rejection severity increases over time.
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
diff --git a/icons/mob/human_races/xenos/r_xenos_hunter.dmi b/icons/mob/human_races/xenos/r_xenos_hunter.dmi
index ef1b3a6f4d..a6ce545f3a 100644
Binary files a/icons/mob/human_races/xenos/r_xenos_hunter.dmi and b/icons/mob/human_races/xenos/r_xenos_hunter.dmi differ