diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 9b18e243567..358fc2ebc6a 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -121,9 +121,6 @@ datum/controller/game_controller/proc/setup_objects()
//Set up spawn points.
populate_spawn_points()
- //Set up roundstart seed list.
- populate_seed_list()
-
world << "\red \b Initializations complete."
sleep(-1)
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index b4ff1ed7ca8..4ab6742b837 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -9,7 +9,7 @@
if(!holder) return
if(master_controller && master_controller.asteroid_ore_map)
- master_controller.asteroid_ore_map.print_distribution_map()
+ master_controller.asteroid_ore_map.print_distribution_map(usr)
/client/proc/remake_distribution_map()
set category = "Debug"
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index da72abcdd5e..9e76a6af56a 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -164,7 +164,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
preview_icon.Blend(temp, ICON_OVERLAY)
//Tail
- if(H.species.tail && H.species.flags & HAS_TAIL)
+ if(H.species.tail)
temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.species.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 1e6d9790eb2..a51ac42ee25 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -779,12 +779,8 @@ client
usr << "Mob doesn't exist anymore"
return
- // Clear out their species abilities.
- H.species.remove_inherent_verbs(H)
-
if(H.set_species(new_species))
usr << "Set species of [H] to [H.species]."
- H.regenerate_icons()
else
usr << "Failed! Something went wrong."
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 9983eff1ac0..0ee04f0230c 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -109,6 +109,17 @@
O.show_message("\red [usr] destroys the [name]!", 1)
health = 0
else
+
+ // Aliens can get straight through these.
+ if(istype(usr,/mob/living/carbon))
+ var/mob/living/carbon/M = usr
+ if(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs)
+ for(var/mob/O in oviewers(src))
+ O.show_message("\red [usr] strokes the [name] and it melts away!", 1)
+ health = 0
+ healthcheck()
+ return
+
usr << "\blue You claw at the [name]."
for(var/mob/O in oviewers(src))
O.show_message("\red [usr] claws at the [name]!", 1)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 80f1fcb8e51..5b41ba88b7b 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -260,8 +260,11 @@
if(ishuman(M))
//START HUMAN
var/mob/living/carbon/human/H = M
+ var/list/mob_equip = list()
+ if(H.species.hud && H.species.hud.equip_slots)
+ mob_equip = H.species.hud.equip_slots
- if(H.species && !(slot in H.species.hud.equip_slots))
+ if(H.species && !(slot in mob_equip))
return 0
switch(slot)
@@ -306,7 +309,7 @@
if(slot_belt)
if(H.belt)
return 0
- if(!H.w_uniform)
+ if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -354,7 +357,7 @@
if(slot_wear_id)
if(H.wear_id)
return 0
- if(!H.w_uniform)
+ if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -364,7 +367,7 @@
if(slot_l_store)
if(H.l_store)
return 0
- if(!H.w_uniform)
+ if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -375,7 +378,7 @@
if(slot_r_store)
if(H.r_store)
return 0
- if(!H.w_uniform)
+ if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -387,7 +390,7 @@
if(slot_s_store)
if(H.s_store)
return 0
- if(!H.wear_suit)
+ if(!H.wear_suit && (slot_wear_suit in mob_equip))
if(!disable_warning)
H << "\red You need a suit before you can attach this [name]."
return 0
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index d3a907a40a2..69f4922bb96 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -225,7 +225,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if (!c) // if the user hasn't selected a PDA file we can't send a message
return
var/selected = plist[c]
- create_message(usr, selected)
+ create_message(usr, selected, 0)
/obj/item/device/pda/ai/verb/cmd_toggle_pda_receiver()
@@ -879,9 +879,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
id.loc = get_turf(src)
id = null
-/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P)
-
- U.visible_message("[U] taps on \his PDA's screen.")
+/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1)
+ if(tap)
+ U.visible_message("[U] taps on \his PDA's screen.")
U.last_target_click = world.time
var/t = input(U, "Please enter message", name, null) as text
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index cad2907ac77..4fb2c56d77e 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -114,15 +114,15 @@
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
- else if (istype(usr,/mob/living/carbon/human))
-
- var/mob/living/carbon/human/H = usr
-
- if(H.species.can_shred(H))
- attack_generic(H,25)
- return
else if (usr.a_intent == "hurt")
+
+ if (istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = usr
+ if(H.species.can_shred(H))
+ attack_generic(H,25)
+ return
+
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
usr.visible_message("\red [usr.name] bangs against the [src.name]!", \
"\red You bang against the [src.name]!", \
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index f6605059d01..403dfd40498 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -149,6 +149,7 @@ var/list/admin_verbs_debug = list(
/client/proc/restart_controller,
/client/proc/remake_distribution_map,
/client/proc/show_distribution_map,
+ /client/proc/show_plant_genes,
/client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/toggledebuglogs,
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index e2c6ee65fa7..b3911d8d68c 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -35,6 +35,7 @@
/obj/item/clothing/suit/bio_suit/general
icon_state = "bio_general"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL
//Virology biosuit, green stripe
/obj/item/clothing/head/bio_hood/virology
@@ -43,6 +44,7 @@
/obj/item/clothing/suit/bio_suit/virology
icon_state = "bio_virology"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL
//Security biosuit, grey with red stripe across the chest
/obj/item/clothing/head/bio_hood/security
@@ -51,6 +53,7 @@
/obj/item/clothing/suit/bio_suit/security
icon_state = "bio_security"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL
//Janitor's biosuit, grey with purple arms
/obj/item/clothing/head/bio_hood/janitor
@@ -59,6 +62,7 @@
/obj/item/clothing/suit/bio_suit/janitor
icon_state = "bio_janitor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL
//Scientist's biosuit, white with a pink-ish hue
@@ -68,11 +72,13 @@
/obj/item/clothing/suit/bio_suit/scientist
icon_state = "bio_scientist"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL
//CMO's biosuit, blue stripe
/obj/item/clothing/suit/bio_suit/cmo
icon_state = "bio_cmo"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL
/obj/item/clothing/head/bio_hood/cmo
icon_state = "bio_cmo"
@@ -84,3 +90,4 @@
desc = "It protected doctors from the Black Death, back then. You bet your arse it's gonna help you against viruses."
icon_state = "plaguedoctor"
item_state = "bio_suit"
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL
diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm
index 1012543db51..f51420a11b4 100644
--- a/code/modules/hydroponics/hydro_tray.dm
+++ b/code/modules/hydroponics/hydro_tray.dm
@@ -176,7 +176,7 @@
weedlevel += 1 * HYDRO_SPEED_MULTIPLIER
// There's a chance for a weed explosion to happen if the weeds take over.
- // Plants that are themselves weeds (weed_tolernace > 10) are unaffected.
+ // Plants that are themselves weeds (weed_tolerance > 10) are unaffected.
if (weedlevel >= 10 && prob(10))
if(!seed || weedlevel >= seed.weed_tolerance)
weed_invasion()
@@ -184,6 +184,7 @@
// If there is no seed data (and hence nothing planted),
// or the plant is dead, process nothing further.
if(!seed || dead)
+ if(draw_warnings) update_icon() //Harvesting would fail to set alert icons properly.
return
// Advance plant age.
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 7b6710f6c43..50b28c755fd 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -1,6 +1,21 @@
var/global/list/seed_types = list() // A list of all seed data.
var/global/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness.
+// Debug for testing seed genes.
+/client/proc/show_plant_genes()
+ set category = "Debug"
+ set name = "Show Plant Genes"
+ set desc = "Prints the round's plant gene masks."
+
+ if(!holder) return
+
+ if(!gene_tag_masks)
+ usr << "Gene masks not set."
+ return
+
+ for(var/mask in gene_tag_masks)
+ usr << "[mask]: [gene_tag_masks[mask]]"
+
// Predefined/roundstart varieties use a string key to make it
// easier to grab the new variety when mutating. Post-roundstart
// and mutant varieties use their uid converted to a string instead.
@@ -130,49 +145,50 @@ proc/populate_seed_list()
var/additional_chems = rand(0,5)
- var/list/possible_chems = list(
- "bicaridine",
- "hyperzine",
- "cryoxadone",
- "blood",
- "water",
- "potassium",
- "plasticide",
- "slimetoxin",
- "aslimetoxin",
- "inaprovaline",
- "space_drugs",
- "paroxetine",
- "mercury",
- "sugar",
- "radium",
- "ryetalyn",
- "alkysine",
- "thermite",
- "tramadol",
- "cryptobiolin",
- "dermaline",
- "dexalin",
- "phoron",
- "synaptizine",
- "impedrezene",
- "hyronalin",
- "peridaxon",
- "toxin",
- "rezadone",
- "ethylredoxrazine",
- "slimejelly",
- "cyanide",
- "mindbreaker",
- "stoxin"
- )
+ if(additional_chems)
+ var/list/possible_chems = list(
+ "bicaridine",
+ "hyperzine",
+ "cryoxadone",
+ "blood",
+ "water",
+ "potassium",
+ "plasticide",
+ "slimetoxin",
+ "aslimetoxin",
+ "inaprovaline",
+ "space_drugs",
+ "paroxetine",
+ "mercury",
+ "sugar",
+ "radium",
+ "ryetalyn",
+ "alkysine",
+ "thermite",
+ "tramadol",
+ "cryptobiolin",
+ "dermaline",
+ "dexalin",
+ "phoron",
+ "synaptizine",
+ "impedrezene",
+ "hyronalin",
+ "peridaxon",
+ "toxin",
+ "rezadone",
+ "ethylredoxrazine",
+ "slimejelly",
+ "cyanide",
+ "mindbreaker",
+ "stoxin"
+ )
- for(var/x=1;x<=additional_chems;x++)
- if(!possible_chems.len)
- break
- var/new_chem = pick(possible_chems)
- possible_chems -= new_chem
- chems[new_chem] = list(rand(1,10),rand(10,20))
+ for(var/x=1;x<=additional_chems;x++)
+ if(!possible_chems.len)
+ break
+ var/new_chem = pick(possible_chems)
+ possible_chems -= new_chem
+ chems[new_chem] = list(rand(1,10),rand(10,20))
if(prob(90))
requires_nutrients = 1
@@ -291,7 +307,7 @@ proc/populate_seed_list()
source_turf.visible_message("\blue \The [display_name] begins to glow!")
if(prob(degree*2))
biolum_colour = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
- source_turf.visible_message("\blue \The [display_name]'s glow changes colour!")
+ source_turf.visible_message("\blue \The [display_name]'s glow changes colour!")
else
source_turf.visible_message("\blue \The [display_name]'s glow dims...")
if(11)
@@ -332,24 +348,21 @@ proc/populate_seed_list()
var/list/gene_chem = gene_value[rid]
- if(chems[rid])
+ if(!chems[rid])
+ chems[rid] = gene_chem.Copy()
+ continue
- var/list/chem_value = chems[rid]
+ for(var/i=1;i<=gene_chem.len;i++)
- chems[rid][1] = max(1,round((gene_chem[1] + chem_value[1])/2))
+ if(isnull(gene_chem[i])) gene_chem[i] = 0
- if(gene_chem.len > 1)
- if(chem_value > 1)
- chems[rid][2] = max(1,round((gene_chem[2] + chem_value[2])/2))
- else
- chems[rid][2] = gene_chem[2]
-
- else
- var/list/new_chem = gene_chem[rid]
- chems[rid] = new_chem.Copy()
+ if(chems[rid][i])
+ chems[rid][i] = max(1,round((gene_chem[i] + chems[rid][i])/2))
+ else
+ chems[rid][i] = gene_chem[i]
var/list/new_gasses = gene.values[3]
- if(istype(new_gasses))
+ if(islist(new_gasses))
if(!exude_gasses) exude_gasses = list()
exude_gasses |= new_gasses
for(var/gas in exude_gasses)
@@ -485,6 +498,7 @@ proc/populate_seed_list()
//Place the plant products at the feet of the user.
/datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample)
+
if(!user)
return
@@ -522,6 +536,10 @@ proc/populate_seed_list()
for(var/i = 0;iYou fail to push [tmob]'s fat ass out of the way."
+
+ if( istype(tmob, /mob/living/carbon) && prob(10) )
+ src.spread_disease_to(AM, "Contact")
+
+ if(istype(tmob, /mob/living/carbon/human))
+
+ if(HULK in tmob.mutations)
+ if(prob(70))
+ usr << "\red You fail to push [tmob]'s fat ass out of the way."
+ now_pushing = 0
+ return
+ if(!(tmob.status_flags & CANPUSH))
+ now_pushing = 0
+ return
+
+ for(var/mob/M in range(tmob, 1))
+ if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
+ if ( !(world.time % 5) )
+ src << "\red [tmob] is restrained, you cannot push past"
+ now_pushing = 0
+ return
+ if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
+ if ( !(world.time % 5) )
+ src << "\red [tmob] is restraining [M], you cannot push past"
+ now_pushing = 0
+ return
+
+ //Leaping mobs just land on the tile, no pushing, no anything.
+ if(status_flags & LEAPING)
+ loc = tmob.loc
+ status_flags &= ~LEAPING
+ now_pushing = 0
+ return
+
+ // Step over drones.
+ // I have no idea why the hell this isn't already happening. How do mice do it?
+ if(istype(tmob,/mob/living/silicon/robot/drone))
+ loc = tmob.loc
+ now_pushing = 0
+ return
+
+ if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && !tmob.buckled && canmove) // mutual brohugs all around!
+ var/turf/oldloc = loc
+ loc = tmob.loc
+ tmob.loc = oldloc
+ now_pushing = 0
+ for(var/mob/living/carbon/slime/slime in view(1,tmob))
+ if(slime.Victim == tmob)
+ slime.UpdateFeed()
+ return
+
+ if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
+ if(prob(40) && !(FAT in src.mutations))
+ src << "\red You fail to push [tmob]'s fat ass out of the way."
+ now_pushing = 0
+ return
+ if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
+ if(prob(99))
+ now_pushing = 0
+ return
+ if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
+ if(prob(99))
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
@@ -446,6 +505,7 @@
return
tmob.LAssailant = src
+
now_pushing = 0
..()
if (!( istype(AM, /atom/movable) ))
@@ -460,6 +520,9 @@
now_pushing = 0
return
step(AM, t)
- now_pushing = null
+ now_pushing = 0
return
+ return
+
+/mob/living/carbon/can_use_vents()
return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/alien/alien_species.dm b/code/modules/mob/living/carbon/human/alien/alien_species.dm
index b592c6292b7..908abe85e31 100644
--- a/code/modules/mob/living/carbon/human/alien/alien_species.dm
+++ b/code/modules/mob/living/carbon/human/alien/alien_species.dm
@@ -126,6 +126,7 @@
)
inherent_verbs = list(
+ /mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/plant,
/mob/living/carbon/human/proc/transfer_plasma,
@@ -162,6 +163,7 @@
)
inherent_verbs = list(
+ /mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/tackle,
/mob/living/carbon/human/proc/gut,
/mob/living/carbon/human/proc/leap,
@@ -190,6 +192,7 @@
)
inherent_verbs = list(
+ /mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/tackle,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/transfer_plasma,
@@ -222,6 +225,7 @@
)
inherent_verbs = list(
+ /mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/psychic_whisper,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/lay_egg,
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 7194eba0998..275790fe5e6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -43,93 +43,6 @@
prev_gender = gender // Debug for plural genders
make_blood()
-/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
- if ((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if (ismob(AM))
- var/mob/tmob = AM
-
- if( istype(tmob, /mob/living/carbon) && prob(10) )
- src.spread_disease_to(AM, "Contact")
-//BubbleWrap - Should stop you pushing a restrained person out of the way
-
- if(istype(tmob, /mob/living/carbon/human))
-
- for(var/mob/M in range(tmob, 1))
- if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
- if ( !(world.time % 5) )
- src << "\red [tmob] is restrained, you cannot push past"
- now_pushing = 0
- return
- if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
- if ( !(world.time % 5) )
- src << "\red [tmob] is restraining [M], you cannot push past"
- now_pushing = 0
- return
-
- //Leaping mobs just land on the tile, no pushing, no anything.
- if(status_flags & LEAPING)
- loc = tmob.loc
- status_flags &= ~LEAPING
- now_pushing = 0
- return
-
- if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it?
- loc = tmob.loc
- now_pushing = 0
- return
-
- //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
- if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && !tmob.buckled && canmove) // mutual brohugs all around!
- var/turf/oldloc = loc
- loc = tmob.loc
- tmob.loc = oldloc
- now_pushing = 0
- for(var/mob/living/carbon/slime/slime in view(1,tmob))
- if(slime.Victim == tmob)
- slime.UpdateFeed()
- return
-
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(40) && !(FAT in src.mutations))
- src << "\red You fail to push [tmob]'s fat ass out of the way."
- now_pushing = 0
- return
- if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
- if(prob(99))
- now_pushing = 0
- return
- if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
- if(prob(99))
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
-
- tmob.LAssailant = src
-
- now_pushing = 0
- spawn(0)
- ..()
- if (!istype(AM, /atom/movable))
- return
- if (!now_pushing)
- now_pushing = 1
-
- if (!AM.anchored)
- var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window))
- if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = 0
- return
- return
-
/mob/living/carbon/human/Stat()
..()
statpanel("Status")
@@ -1258,6 +1171,7 @@
dna.species = new_species
if(species)
+
if(species.name && species.name == new_species)
return
if(species.language)
@@ -1266,6 +1180,9 @@
if(species.default_language)
remove_language(species.default_language)
+ // Clear out their species abilities.
+ species.remove_inherent_verbs(src)
+
species = all_species[new_species]
species.create_organs(src)
@@ -1289,7 +1206,7 @@
species.handle_post_spawn(src)
spawn(0)
- update_icons()
+ regenerate_icons()
vessel.add_reagent("blood",560-vessel.total_volume)
fixblood()
@@ -1432,4 +1349,4 @@
var/datum/organ/internal/eyes = internal_organs_by_name["eyes"]
if(eyes && istype(eyes) && !eyes.status & ORGAN_CUT_AWAY)
return 1
- return 0
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 3a2e2622535..c871ff44531 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1060,7 +1060,7 @@
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
- if(!light_organ || light_organ.is_broken())
+ if(species.flags & IS_PLANT && (!light_organ || light_organ.is_broken()))
if(nutrition < 200)
take_overall_damage(2,0)
traumatic_shock++
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 0b7d601ca95..766dd94c256 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -232,16 +232,17 @@
/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null)
var/verb = "says"
var/ending = copytext(message, length(message))
- if(ending=="!")
- verb=pick("exclaims","shouts","yells")
- else if(ending=="?")
- verb="asks"
+
+ if(speaking)
+ verb = speaking.get_spoken_verb(ending)
+ else
+ if(ending == "!")
+ verb=pick("exclaims","shouts","yells")
+ else if(ending == "?")
+ verb="asks"
return verb
-
-
-
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
var/list/returns[3]
var/verb = "says"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 963a969658a..0ffe4645a1a 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -234,7 +234,7 @@
heat_level_2 = 480 //Default 400
heat_level_3 = 1100 //Default 1000
- flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | HAS_SKIN_COLOR
+ flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR
flesh_color = "#34AF10"
@@ -261,7 +261,7 @@
primitive = /mob/living/carbon/monkey/tajara
- flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | HAS_SKIN_COLOR
+ flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR
flesh_color = "#AFA59E"
base_color = "#333333"
@@ -353,7 +353,7 @@
breath_type = "nitrogen"
poison_type = "oxygen"
- flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN
+ flags = NO_SCAN | NO_BLOOD | NO_PAIN
blood_color = "#2299FC"
flesh_color = "#808D11"
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index f3a13b60355..e4ce980456f 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -897,7 +897,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
overlays_standing[TAIL_LAYER] = null
- if(species.tail && species.flags & HAS_TAIL)
+ if(species.tail)
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5c5805bfaf3..c1adb74feee 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -806,10 +806,10 @@
var/area/new_area = get_area(loc)
if(new_area)
new_area.Entered(src)
+
/mob/living/proc/can_use_vents()
return "You can't fit into that vent."
-
/mob/living/proc/has_brain()
return 1
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 928ba4130a5..b24e995aecc 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -128,6 +128,8 @@ var/list/ai_verbs_default = list(
add_ai_verbs(src)
//Languages
+ add_language("Robot Talk", 1)
+ add_language("Galactic Common", 0)
add_language("Sol Common", 0)
add_language("Sinta'unathi", 0)
add_language("Siik'tajr", 0)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 692609afb88..8d69a1d0a2e 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -19,6 +19,10 @@
#define SEC_HUD 1 //Security HUD mode
#define MED_HUD 2 //Medical HUD mode
+/mob/living/silicon/New()
+ ..()
+ add_language("Galactic Common")
+
/mob/living/silicon/proc/show_laws()
return
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 4f5eda2af94..f6200a3e7eb 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -114,5 +114,5 @@
response_disarm = "gently pushes aside"
response_harm = "splats"
-/mob/living/carbon/alien/can_use_vents()
+/mob/living/simple_animal/mouse/can_use_vents()
return
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 140e06722ab..9e8a8c65fa3 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -73,7 +73,7 @@
/mob/proc/Life()
// if(organStructure)
// organStructure.ProcessOrgans()
- handle_typing_indicator()
+ //handle_typing_indicator() //You said the typing indicator would be fine. The test determined that was a lie.
return
@@ -1079,4 +1079,4 @@ mob/proc/yank_out_object()
if(istype(I,/mob/living/simple_animal/borer))
return I
- return 0
+ return 0
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 110c505b317..48ba98ac291 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -208,7 +208,7 @@ datum/preferences
preview_icon.Blend(temp, ICON_OVERLAY)
//Tail
- if(current_species && (current_species.flags & HAS_TAIL))
+ if(current_species && (current_species.tail))
var/icon/temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[current_species.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
diff --git a/code/setup.dm b/code/setup.dm
index f0530653527..4b64a0821ef 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -748,11 +748,9 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define HAS_SKIN_COLOR 128
#define HAS_LIPS 256
#define HAS_UNDERWEAR 512
-#define HAS_TAIL 1024
-
-#define IS_PLANT 2048
-#define IS_WHITELISTED 4096
-#define IS_SYNTHETIC 8192
+#define IS_PLANT 1024
+#define IS_WHITELISTED 2048
+#define IS_SYNTHETIC 4096
//Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
diff --git a/code/world.dm b/code/world.dm
index d40ef403caa..6cf0bb4f18f 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -41,6 +41,11 @@
sleep_offline = 1
+ // Set up roundstart seed list. This is here because vendors were
+ // bugging out and not populating with the correct packet names
+ // due to this list not being instantiated.
+ populate_seed_list()
+
master_controller = new /datum/controller/game_controller()
spawn(1)
master_controller.setup()
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index 4c1516b8581..defb526a7f8 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi
index 0a1d6333590..14d1d54ab98 100644
Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ