Merge branch 'master' into SILENCEDMP5A5_FLUFF

This commit is contained in:
Cameron653
2018-04-11 00:37:26 -04:00
committed by GitHub
98 changed files with 1252 additions and 570 deletions
+4
View File
@@ -6,6 +6,10 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
var/previous_rights = 0
//Clear profile access
for(var/A in world.GetConfig("admin"))
world.SetConfig("APP/admin", A, null)
//load text from file
var/list/Lines = file2list("config/admin_ranks.txt")
+2
View File
@@ -23,6 +23,8 @@ var/list/admin_datums = list()
rank = initial_rank
rights = initial_rights
admin_datums[ckey] = src
if(rights & R_DEBUG) //grant profile access
world.SetConfig("APP/admin", ckey, "role=admin")
/datum/admins/proc/associate(client/C)
if(istype(C))
+10
View File
@@ -425,6 +425,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
//For logging later
var/admin = key_name_admin(src)
var/player_key = picked_client.key
//VOREStation Add - Needed for persistence
var/picked_ckey = picked_client.ckey
var/picked_slot = picked_client.prefs.default_slot
//VOREStation Add End
var/mob/living/carbon/human/new_character
var/spawnloc
@@ -471,6 +475,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
antag_data.add_antagonist(new_character.mind)
antag_data.place_mob(new_character)
//VOREStation Add - Required for persistence
if(new_character.mind)
new_character.mind.loaded_from_ckey = picked_ckey
new_character.mind.loaded_from_slot = picked_slot
//VOREStation Add End
//If desired, apply equipment.
if(equipment)
if(charjob)
@@ -1,10 +1,10 @@
/datum/gear/gloves/goldring
display_name = "wedding ring, gold"
path = /obj/item/clothing/gloves/weddingring
path = /obj/item/clothing/gloves/ring/wedding
/datum/gear/gloves/silverring
display_name = "wedding ring, silver"
path = /obj/item/clothing/gloves/weddingring/silver
path = /obj/item/clothing/gloves/ring/wedding/silver
/datum/gear/gloves/colored
display_name = "gloves, colorable"
@@ -1,20 +1,3 @@
/obj/item/clothing/gloves/weddingring
name = "golden wedding ring"
desc = "For showing your devotion to another person. It has a golden glimmer to it."
icon = 'icons/obj/clothing/gloves_vr.dmi'
icon_state = "wedring_g"
item_state = "wedring_g"
var/partnername = ""
/obj/item/clothing/gloves/weddingring/attack_self(mob/user)
partnername = copytext(sanitize(input(user, "Would you like to change the holoengraving on the ring?", "Name your betrothed", "Bae") as null|text),1,MAX_NAME_LEN)
name = "[initial(name)] - [partnername]"
/obj/item/clothing/gloves/weddingring/silver
name = "silver wedding ring"
icon_state = "wedring_s"
item_state = "wedring_s"
/obj/item/clothing/gloves/color
desc = "A pair of gloves, they don't look special in any way."
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
+17
View File
@@ -0,0 +1,17 @@
/obj/item/clothing/gloves/ring/wedding
name = "golden wedding ring"
desc = "For showing your devotion to another person. It has a golden glimmer to it."
icon = 'icons/obj/clothing/gloves_vr.dmi'
icon_state = "wedring_g"
item_state = "wedring_g"
var/partnername = ""
/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user)
partnername = copytext(sanitize(input(user, "Would you like to change the holoengraving on the ring?", "Name your spouse", "Bae") as null|text),1,MAX_NAME_LEN)
name = "[initial(name)] - [partnername]"
/obj/item/clothing/gloves/ring/wedding/silver
name = "silver wedding ring"
desc = "For showing your devotion to another person. It has a silver glimmer to it."
icon_state = "wedring_s"
item_state = "wedring_s"
@@ -26,7 +26,9 @@
if(icon_override)
if("[tmp_icon_state]_tie" in icon_states(icon_override))
tmp_icon_state = "[tmp_icon_state]_tie"
inv_overlay = image(icon = INV_ACCESSORIES_DEF_ICON, icon_state = tmp_icon_state, dir = SOUTH)
inv_overlay = image(icon = icon_override, icon_state = tmp_icon_state, dir = SOUTH)
else
inv_overlay = image(icon = INV_ACCESSORIES_DEF_ICON, icon_state = tmp_icon_state, dir = SOUTH)
return inv_overlay
/obj/item/clothing/accessory/proc/get_mob_overlay()
@@ -387,4 +389,4 @@
/obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc)
..(newloc, "glass")
..()
..()
+18 -1
View File
@@ -13,6 +13,7 @@ var/list/global/map_templates = list()
/datum/map_template
var/name = "Default Template Name"
var/desc = "Some text should go here. Maybe."
var/template_group = null // If this is set, no more than one template in the same group will be spawned, per submap seeding.
var/width = 0
var/height = 0
var/mappath = null
@@ -67,7 +68,7 @@ var/list/global/map_templates = list()
admin_notice("<span class='danger'>Initializing newly created atom(s) in submap.</span>", R_DEBUG)
SSatoms.InitializeAtoms(atoms)
admin_notice("<span class='danger'>Initializing atmos pipenets and machinery in submap.</span>", R_DEBUG)
SSmachines.setup_atmos_machinery(atmos_machines)
@@ -190,6 +191,7 @@ var/list/global/map_templates = list()
CHECK_TICK
var/list/loaded_submap_names = list()
var/list/template_groups_used = list() // Used to avoid spawning three seperate versions of the same PoI.
// Now lets start choosing some.
while(budget > 0 && overall_sanity > 0)
@@ -210,6 +212,14 @@ var/list/global/map_templates = list()
// Can we afford it?
if(chosen_template.cost > budget)
priority_submaps -= chosen_template
potential_submaps -= chosen_template
continue
// Did we already place down a very similar submap?
if(chosen_template.template_group && chosen_template.template_group in template_groups_used)
priority_submaps -= chosen_template
potential_submaps -= chosen_template
continue
// If so, try to place it.
@@ -242,14 +252,21 @@ var/list/global/map_templates = list()
CHECK_TICK
// For pretty maploading statistics.
if(loaded_submap_names[chosen_template.name])
loaded_submap_names[chosen_template.name] += 1
else
loaded_submap_names[chosen_template.name] = 1
// To avoid two 'related' similar submaps existing at the same time.
if(chosen_template.template_group)
template_groups_used += chosen_template.template_group
// To deduct the cost.
if(chosen_template.cost >= 0)
budget -= chosen_template.cost
// Remove the submap from our options.
if(chosen_template in priority_submaps) // Always remove priority submaps.
priority_submaps -= chosen_template
else if(!chosen_template.allow_duplicates)
+35 -62
View File
@@ -399,12 +399,9 @@
var/modified = 0
var/perpname = "wot"
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else
perpname = name
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = name
@@ -438,14 +435,11 @@
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = src.name
perpname = name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
@@ -468,14 +462,11 @@
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = src.name
perpname = name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
@@ -496,14 +487,11 @@
if (href_list["secrecordadd"])
if(hasHUD(usr,"security"))
var/perpname = "wot"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = src.name
perpname = name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
@@ -527,14 +515,11 @@
var/perpname = "wot"
var/modified = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = src.name
perpname = name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
@@ -566,14 +551,11 @@
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = src.name
perpname = name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
@@ -597,14 +579,11 @@
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = src.name
perpname = name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
@@ -625,14 +604,11 @@
if (href_list["medrecordadd"])
if(hasHUD(usr,"medical"))
var/perpname = "wot"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = src.name
perpname = name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
@@ -1184,7 +1160,7 @@
if(!(gender in species.genders))
gender = species.genders[1]
icon_state = lowertext(species.name)
//icon_state = lowertext(species.name) //Necessary?
species.create_organs(src)
@@ -1615,12 +1591,9 @@
if(hasHUD(user,"security"))
//Try to find their name
var/perpname
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else
perpname = name
var/obj/item/weapon/card/id/I = GetIdCard()
if(I)
perpname = I.registered_name
else
perpname = name
//Try to find their record
@@ -54,7 +54,6 @@
humanform = H
updatehealth()
refactory = locate() in humanform.internal_organs
verbs |= /mob/living/proc/nano_set_size
verbs |= /mob/living/proc/ventcrawl
verbs |= /mob/living/proc/hide
else
@@ -196,10 +196,14 @@
var/substance = matstack.material.name
var/actually_added = refactory.add_stored_material(substance,howmuch*matstack.perunit)
matstack.use(Ceiling(actually_added/matstack.perunit))
if(actually_added < howmuch)
if(actually_added && actually_added < howmuch)
to_chat(src,"<span class='warning'>Your refactory module is now full, so only [actually_added] units were stored.</span>")
else
visible_message(src,"<span class='notice'>[src] nibbles some of the [substance] right off the stack!</span>")
else if(actually_added)
to_chat(src,"<span class='notice'>You store [actually_added] units of [substance].</span>")
visible_message(src,"<span class='notice'>[src] devours some of the [substance] right off the stack!</span>")
else
to_chat(src,"<span class='notice'>You're completely capped out on [substance]!</span>")
////
// Blob Form
@@ -247,26 +251,28 @@
////
// Change size
////
/mob/living/proc/nano_set_size()
/mob/living/carbon/human/proc/nano_set_size()
set name = "Adjust Volume"
set category = "Abilities"
set hidden = TRUE
var/mob/living/user = temporary_form || src
var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory()
//Missing the organ that does this
if(!istype(refactory))
to_chat(src,"<span class='warning'>You don't have a working refactory module!</span>")
to_chat(user,"<span class='warning'>You don't have a working refactory module!</span>")
return
var/nagmessage = "Adjust your mass to be a size between 25 to 200%. Up-sizing consumes metal, downsizing returns metal."
var/new_size = input(src, nagmessage, "Pick a Size", size_multiplier*100) as num|null
var/new_size = input(user, nagmessage, "Pick a Size", user.size_multiplier*100) as num|null
if(!new_size || !IsInRange(new_size,25,200))
return
var/size_factor = new_size/100
//Will be: -1.75 for 200->25, and 1.75 for 25->200
var/sizediff = size_factor - size_multiplier
var/sizediff = size_factor - user.size_multiplier
//Negative if shrinking, positive if growing
//Will be (PLSC*2)*-1.75 to 1.75
@@ -276,17 +282,19 @@
//Sizing up
if(cost > 0)
if(refactory.use_stored_material("steel",cost))
resize(size_factor)
user.resize(size_factor)
else
to_chat(src,"<span class='warning'>That size change would cost [cost] steel, which you don't have.</span>")
to_chat(user,"<span class='warning'>That size change would cost [cost] steel, which you don't have.</span>")
return
//Sizing down (or not at all)
if(cost <= 0)
cost = abs(cost)
var/actually_added = refactory.add_stored_material("steel",cost)
resize(size_factor)
user.resize(size_factor)
if(actually_added != cost)
to_chat(src,"<span class='warning'>Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.</span>")
to_chat(user,"<span class='warning'>Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.</span>")
user.visible_message("<span class='notice'>Black mist swirls around [user] as they change size.</span>")
/// /// /// A helper to reuse
/mob/living/proc/nano_get_refactory(obj/item/organ/internal/nano/refactory/R)
@@ -350,7 +358,7 @@
ability_name = "Change Volume"
desc = "Alter your size by consuming steel to produce additional nanites, or regain steel by reducing your size and reclaiming them."
icon_state = "volume"
to_call = /mob/living/proc/nano_set_size
to_call = /mob/living/carbon/human/proc/nano_set_size
/obj/effect/protean_ability/reform_limb
ability_name = "Ref - Single Limb"
@@ -86,12 +86,13 @@
/mob/living/carbon/human/proc/nano_partswap,
/mob/living/carbon/human/proc/nano_metalnom,
/mob/living/carbon/human/proc/nano_blobform,
/mob/living/proc/nano_set_size,
/mob/living/carbon/human/proc/nano_set_size,
/mob/living/carbon/human/proc/nano_change_fitting, //These verbs are displayed normally,
/mob/living/carbon/human/proc/shapeshifter_select_hair,
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
/mob/living/carbon/human/proc/shapeshifter_select_colour,
/mob/living/carbon/human/proc/shapeshifter_select_eye_colour
/mob/living/carbon/human/proc/shapeshifter_select_eye_colour,
/mob/living/carbon/human/proc/shapeshifter_select_gender
)
var/global/list/abilities = list()
@@ -204,7 +205,7 @@
// Various modifiers
/datum/modifier/protean
stacks = MODIFIER_STACK_FORBID
var/material_use = 100
var/material_use = 150
var/material_name = DEFAULT_WALL_MATERIAL
/datum/modifier/protean/on_applied()
@@ -217,7 +218,7 @@
if(holder.temporary_form)
to_chat(holder.temporary_form,on_expired_text)
/datum/modifier/protean/tick()
/datum/modifier/protean/check_if_valid()
//No origin set
if(!istype(origin))
expire()
@@ -238,7 +239,6 @@
on_created_text = "<span class='notice'>You feel yourself accelerate, the metallic hydrogen increasing your speed temporarily.</span>"
on_expired_text = "<span class='notice'>Your refactory finishes consuming the metallic hydrogen, and you return to normal speed.</span>"
material_use = 100
material_name = "mhydrogen"
slowdown = -1
@@ -250,7 +250,6 @@
on_created_text = "<span class='notice'>You feel yourself become nearly impervious to physical attacks as plasteel nanites are made.</span>"
on_expired_text = "<span class='notice'>Your refactory finishes consuming the plasteel, and you return to your normal nanites.</span>"
material_use = 100
material_name = "plasteel"
incoming_brute_damage_percent = 0.5
@@ -262,7 +261,6 @@
on_created_text = "<span class='notice'>You feel yourself become more reflective, able to resist heat and fire better for a time.</span>"
on_expired_text = "<span class='notice'>Your refactory finishes consuming the diamond, and you return to your normal nanites.</span>"
material_use = 100
material_name = "diamond"
incoming_fire_damage_percent = 0.2
@@ -274,7 +272,6 @@
on_created_text = "<span class='notice'>You feel new nanites being produced from your stockpile of steel, healing you slowly.</span>"
on_expired_text = "<span class='notice'>Your steel supply has either run out, or is no longer needed, and your healing stops.</span>"
material_use = 100
material_name = "steel"
/datum/modifier/protean/steel/tick()
@@ -303,4 +300,4 @@
src.name += " ([new_name])"
desc += "\nVALID THROUGH END OF: [time2text(world.timeofday, "Month") +" "+ num2text(text2num(time2text(world.timeofday, "YYYY"))+544)]\nREGISTRANT: [new_name]"
#undef DAM_SCALE_FACTOR
#undef DAM_SCALE_FACTOR
+2 -1
View File
@@ -6,11 +6,12 @@
if (transforming)
return
handle_modifiers() //VOREStation Edit - Needs to be done even if in nullspace.
if(!loc)
return
var/datum/gas_mixture/environment = loc.return_air()
handle_modifiers() // Do this early since it might affect other things later.
//handle_modifiers() // Do this early since it might affect other things later. //VOREStation Edit
handle_light()
+5 -5
View File
@@ -1060,7 +1060,7 @@ default behaviour is:
if(lying != lying_prev)
lying_prev = lying
update_transform()
return canmove
// Adds overlays for specific modifiers.
@@ -1088,10 +1088,10 @@ default behaviour is:
/mob/living/proc/is_sentient()
return TRUE
/* //VOREStation Edit. We have a better system in place.
/mob/living/update_transform()
// First, get the correct size.
var/desired_scale = icon_scale
var/desired_scale = size_multiplier //VOREStation edit
for(var/datum/modifier/M in modifiers)
if(!isnull(M.icon_scale_percent))
desired_scale *= M.icon_scale_percent
@@ -1101,8 +1101,8 @@ default behaviour is:
M.Scale(desired_scale)
M.Translate(0, 16*(desired_scale-1))
src.transform = M
animate(src, transform = M, time = 10)
*/ //VOREStation Edit
//animate(src, transform = M, time = 10) //VOREStation edit
// This handles setting the client's color variable, which makes everything look a specific color.
// This proc is here so it can be called without needing to check if the client exists, or if the client relogs.
@@ -314,6 +314,12 @@
else
ma.icon_state = initial(icon_state)
//VOREStation edit start
var/vore_icon_state = update_vore_icon()
if(vore_icon_state)
ma.icon_state = vore_icon_state
//VOREStation edit end
if(has_hands)
if(r_hand_sprite)
ma.overlays += r_hand_sprite
@@ -44,21 +44,21 @@
var/obj/belly/B = belly
for(var/mob/living/M in B)
new_fullness += M.size_multiplier
new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry.
new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry.
vore_fullness = min(vore_capacity, new_fullness)
/mob/living/simple_animal/update_icon()
. = ..() // Call sideways "parent" to decide state
if(vore_active)
update_fullness()
if(!vore_fullness)
return
else if(icon_state == icon_living && (vore_icons & SA_ICON_LIVING))
icon_state = "[icon_state]-[vore_fullness]"
else if(icon_state == icon_dead && (vore_icons & SA_ICON_DEAD))
icon_state = "[icon_state]-[vore_fullness]"
else if(icon_state == icon_rest && (vore_icons & SA_ICON_REST))
icon_state = "[icon_state]-[vore_fullness]"
/mob/living/simple_animal/proc/update_vore_icon()
if(!vore_active)
return 0
update_fullness()
if(!vore_fullness)
return 0
else if((stat == CONSCIOUS) && (!icon_rest || !resting || !incapacitated(INCAPACITATION_DISABLED)) && (vore_icons & SA_ICON_LIVING))
return "[icon_living]-[vore_fullness]"
else if(stat >= DEAD && (vore_icons & SA_ICON_DEAD))
return "[icon_dead]-[vore_fullness]"
else if(((stat == UNCONSCIOUS) || resting || incapacitated(INCAPACITATION_DISABLED) ) && icon_rest && (vore_icons & SA_ICON_REST))
return "[icon_rest]-[vore_fullness]"
/mob/living/simple_animal/proc/will_eat(var/mob/living/M)
if(client) //You do this yourself, dick!
@@ -5,9 +5,46 @@
return
..()
/mob/living/simple_animal/slime/Found(mob/living/L)
if(isliving(L))
if(SA_attackable(L))
if(L.faction == faction && !attack_same)
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return H // Monkeys are always food.
else
return
if(L in friends)
return
if(istype(L, /mob/living/simple_animal/slime))
var/mob/living/simple_animal/slime/buddy = L
if(buddy.slime_color == src.slime_color || discipline || unity || buddy.unity)
return // Don't hurt same colored slimes.
else
return buddy //do hurt others
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return H // Monkeys are always food.
if(issilicon(L) || isbot(L))
if(discipline && !rabid)
return // We're a good slime. For now at least.
return
return
/mob/living/simple_animal/slime/special_target_check(mob/living/L)
if(L.faction == faction && !attack_same)
return FALSE
if(L.faction == faction && !attack_same && !istype(L, /mob/living/simple_animal/slime))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return TRUE // Monkeys are always food.
else
return FALSE
if(L in friends)
return FALSE
@@ -112,6 +112,11 @@
if(!speaker.client)
return
//Are all slimes being referred to?
var/mass_order = 0
if(findtext(message, "slimes"))
mass_order = 1
// Say hello back.
if(findtext(message, "hello") || findtext(message, "hi") || findtext(message, "greetings"))
delayed_say(pick("Hello...", "Hi..."), speaker)
@@ -165,13 +170,14 @@
var/list/valid_names = splittext(L.name, " ") // Should output list("John", "Doe") as an example.
for(var/line in valid_names) // Check each part of someone's name.
if(findtext(message, lowertext(line))) // If part of someone's name is in the command, the slime targets them if allowed to.
if(special_target_check(L))
delayed_say("Okay... I attack \the [L]...", speaker)
LoseFollow()
set_target(L)
return
else
delayed_say("No... I won't attack \the [L].", speaker)
return
// If we're here, it couldn't find anyone with that name.
delayed_say("No... I don't know who to attack...", speaker)
if(!(mass_order && line == "slime")) //don't think random other slimes are target
if(special_target_check(L))
delayed_say("Okay... I attack \the [L]...", speaker)
LoseFollow()
set_target(L, 1)
return
else
delayed_say("No... I won't attack \the [L].", speaker)
return
// If we're here, it couldn't find anyone with that name.
delayed_say("No... I don't know who to attack...", speaker)
@@ -356,10 +356,13 @@
baby.mutation_chance = mutation_chance
baby.power_charge = round(power_charge / 4)
baby.resentment = max(resentment - 1, 0)
baby.discipline = max(discipline - 1, 0)
baby.obedience = max(obedience - 1, 0)
baby.unity = unity
if(!istype(baby, /mob/living/simple_animal/slime/light_pink))
baby.discipline = max(discipline - 1, 0)
baby.obedience = max(obedience - 1, 0)
if(!istype(baby, /mob/living/simple_animal/slime/rainbow))
baby.unity = unity
baby.faction = faction
baby.attack_same = attack_same
baby.friends = friends.Copy()
if(rabid)
baby.enrage()
@@ -120,7 +120,7 @@
/mob/living/simple_animal/slime/dark_purple
desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it."
color = "#CC23FF"
color = "#660088"
slime_color = "dark purple"
coretype = /obj/item/slime_extract/dark_purple
reagent_injected = "phoron"
@@ -51,7 +51,7 @@
vore_active = TRUE
vore_capacity = 1
vore_pounce_chance = 30
vore_icons = SA_ICON_LIVING
vore_icons = SA_ICON_LIVING | SA_ICON_REST
vore_stomach_name = "fuel processor"
vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..."
@@ -56,7 +56,7 @@
vore_active = 1
vore_capacity = 1
vore_pounce_chance = 20
vore_icons = SA_ICON_LIVING
vore_icons = SA_ICON_LIVING | SA_ICON_REST
/mob/living/simple_animal/otie/feral //gets the pet2tame feature. starts out hostile tho so get gamblin'
name = "mutated feral otie"
@@ -32,4 +32,4 @@
vore_active = 1
vore_capacity = 2
vore_pounce_chance = 10
vore_icons = SA_ICON_LIVING
vore_icons = SA_ICON_LIVING | SA_ICON_REST
@@ -65,7 +65,7 @@
icon_state = "queen_s"
icon_living = "queen_s"
icon_dead = "queen_dead"
vore_icons = SA_ICON_LIVING
vore_icons = SA_ICON_LIVING | SA_ICON_REST
old_x = -16
old_y = 0
default_pixel_x = -16
@@ -77,6 +77,7 @@
/mob/living/simple_animal/hostile/alien/sentinel/praetorian
icon = 'icons/mob/vore64x64.dmi'
vore_icons = SA_ICON_LIVING | SA_ICON_REST
/mob/living/simple_animal/hostile/alien/queen/empress/mother
vore_icons = 0 // NO VORE SPRITES
@@ -226,11 +227,20 @@
/mob/living/simple_animal/hostile/carp/holodeck
vore_icons = 0 // NO VORE SPRITES
vore_digest_chance = 0
vore_absorb_chance = 0
// Override stuff for holodeck carp to make them not digest when set to safe!
/mob/living/simple_animal/hostile/carp/holodeck/init_vore()
. = ..()
var/safe = (faction == "neutral")
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.digest_mode = safe ? DM_HOLD : vore_default_mode
/mob/living/simple_animal/hostile/carp/holodeck/set_safety(var/safe)
. = ..()
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.digest_mode = safe ? DM_HOLD : vore_default_mode
B.digestchance = safe ? 0 : vore_digest_chance
B.absorbchance = safe ? 0 : vore_absorb_chance
+4 -4
View File
@@ -201,7 +201,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/scrubbers
desc = "A scrubbers pipe segment to connect upwards."
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -211,7 +211,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/supply
desc = "A supply pipe segment to connect upwards."
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -221,7 +221,7 @@ obj/machinery/atmospherics/pipe/zpipe/down/scrubbers
desc = "A scrubbers pipe segment to connect downwards."
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -231,6 +231,6 @@ obj/machinery/atmospherics/pipe/zpipe/down/supply
desc = "A supply pipe segment to connect downwards."
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
+1 -1
View File
@@ -102,7 +102,7 @@
a_drain = 0.1
access = access_engine
tick_flags = NIF_ACTIVETICK
planes_enabled = list(VIS_FULLBRIGHT)
planes_enabled = list(VIS_FULLBRIGHT, VIS_MESONS)
vision_flags = (NIF_V_MESONS)
incompatible_with = list(NIF_MATERIAL,NIF_THERMALS,NIF_NIGHTVIS)
+20 -14
View File
@@ -50,7 +50,7 @@
/obj/item/organ/external/diona/arm
name = "left upper tendril"
organ_tag = "l_arm"
organ_tag = BP_L_ARM
icon_name = "l_arm"
max_damage = 30
min_broken_damage = 20
@@ -61,13 +61,13 @@
/obj/item/organ/external/diona/arm/right
name = "right upper tendril"
organ_tag = "r_arm"
organ_tag = BP_R_ARM
icon_name = "r_arm"
body_part = ARM_RIGHT
/obj/item/organ/external/diona/leg
name = "left lower tendril"
organ_tag = "l_leg"
organ_tag = BP_L_LEG
icon_name = "l_leg"
max_damage = 30
min_broken_damage = 20
@@ -79,50 +79,50 @@
/obj/item/organ/external/diona/leg/right
name = "right lower tendril"
organ_tag = "r_leg"
organ_tag = BP_R_LEG
icon_name = "r_leg"
body_part = LEG_RIGHT
icon_position = RIGHT
/obj/item/organ/external/diona/foot
name = "left foot"
organ_tag = "l_foot"
organ_tag = BP_L_FOOT
icon_name = "l_foot"
max_damage = 25
min_broken_damage = 10
w_class = ITEMSIZE_SMALL
body_part = FOOT_LEFT
icon_position = LEFT
parent_organ = "l_leg"
parent_organ = BP_R_LEG
can_stand = 1
/obj/item/organ/external/diona/foot/right
name = "right foot"
organ_tag = "r_foot"
organ_tag = BP_R_FOOT
icon_name = "r_foot"
body_part = FOOT_RIGHT
icon_position = RIGHT
parent_organ = "r_leg"
parent_organ = BP_R_LEG
joint = "right ankle"
amputation_point = "right ankle"
/obj/item/organ/external/diona/hand
name = "left grasper"
organ_tag = "l_hand"
organ_tag = BP_L_HAND
icon_name = "l_hand"
max_damage = 25
min_broken_damage = 15
w_class = ITEMSIZE_SMALL
body_part = HAND_LEFT
parent_organ = "l_arm"
parent_organ = BP_L_ARM
can_grasp = 1
/obj/item/organ/external/diona/hand/right
name = "right grasper"
organ_tag = "r_hand"
organ_tag = BP_R_HAND
icon_name = "r_hand"
body_part = HAND_RIGHT
parent_organ = "r_arm"
parent_organ = BP_R_ARM
//DIONA ORGANS.
/obj/item/organ/external/diona/removed()
@@ -157,26 +157,32 @@
/obj/item/organ/internal/diona/strata
name = "neural strata"
parent_organ = BP_TORSO
organ_tag = O_STRATA
/obj/item/organ/internal/diona/bladder
name = "gas bladder"
parent_organ = BP_HEAD
organ_tag = O_GBLADDER
/obj/item/organ/internal/diona/polyp
name = "polyp segment"
parent_organ = BP_GROIN
organ_tag = O_POLYP
/obj/item/organ/internal/diona/ligament
name = "anchoring ligament"
parent_organ = BP_GROIN
organ_tag = O_ANCHOR
/obj/item/organ/internal/diona/node
name = "receptor node"
parent_organ = BP_HEAD
organ_tag = O_RESPONSE
/obj/item/organ/internal/diona/nutrients
name = O_NUTRIENT
parent_organ = BP_TORSO
organ_tag = O_NUTRIENT
// These are different to the standard diona organs as they have a purpose in other
// species (absorbing radiation and light respectively)
@@ -191,8 +197,8 @@
/obj/item/organ/internal/diona/node
name = "response node"
parent_organ = "head"
organ_tag = "receptor node"
parent_organ = BP_HEAD
organ_tag = O_RESPONSE
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
+16 -16
View File
@@ -72,7 +72,7 @@
owner.custom_pain("A jolt of pain surges through your [name]!",1)
/obj/item/organ/external/arm
organ_tag = "l_arm"
organ_tag = BP_L_ARM
name = "left arm"
icon_name = "l_arm"
max_damage = 80
@@ -98,13 +98,13 @@
if (. >= 2)
if(prob(.))
owner.custom_pain("A jolt of pain surges through your [name]!",1)
if(organ_tag == "l_arm") //Specific level 2 'feature
if(organ_tag == BP_L_ARM) //Specific level 2 'feature
owner.drop_l_hand()
else if(organ_tag == "r_arm")
else if(organ_tag == BP_R_ARM)
owner.drop_r_hand()
/obj/item/organ/external/arm/right
organ_tag = "r_arm"
organ_tag = BP_R_ARM
name = "right arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
@@ -112,7 +112,7 @@
amputation_point = "right shoulder"
/obj/item/organ/external/leg
organ_tag = "l_leg"
organ_tag = BP_L_LEG
name = "left leg"
icon_name = "l_leg"
max_damage = 80
@@ -142,7 +142,7 @@
owner.Weaken(5)
/obj/item/organ/external/leg/right
organ_tag = "r_leg"
organ_tag = BP_R_LEG
name = "right leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
@@ -151,7 +151,7 @@
amputation_point = "right hip"
/obj/item/organ/external/foot
organ_tag = "l_foot"
organ_tag = BP_L_FOOT
name = "left foot"
icon_name = "l_foot"
max_damage = 50
@@ -159,7 +159,7 @@
w_class = ITEMSIZE_SMALL
body_part = FOOT_LEFT
icon_position = LEFT
parent_organ = "l_leg"
parent_organ = BP_L_LEG
joint = "left ankle"
amputation_point = "left ankle"
can_stand = 1
@@ -186,24 +186,24 @@
owner.Weaken(5)
/obj/item/organ/external/foot/right
organ_tag = "r_foot"
organ_tag = BP_R_FOOT
name = "right foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
icon_position = RIGHT
parent_organ = "r_leg"
parent_organ = BP_R_LEG
joint = "right ankle"
amputation_point = "right ankle"
/obj/item/organ/external/hand
organ_tag = "l_hand"
organ_tag = BP_L_HAND
name = "left hand"
icon_name = "l_hand"
max_damage = 50
min_broken_damage = 15
w_class = ITEMSIZE_SMALL
body_part = HAND_LEFT
parent_organ = "l_arm"
parent_organ = BP_L_ARM
joint = "left wrist"
amputation_point = "left wrist"
can_grasp = 1
@@ -229,17 +229,17 @@
if (. >= 2)
if(prob(.))
owner.custom_pain("A jolt of pain surges through your [name]!",1)
if(organ_tag == "l_hand") //Specific level 2 'feature
if(organ_tag == BP_L_HAND) //Specific level 2 'feature
owner.drop_l_hand()
else if(organ_tag == "r_hand")
else if(organ_tag == BP_R_HAND)
owner.drop_r_hand()
/obj/item/organ/external/hand/right
organ_tag = "r_hand"
organ_tag = BP_R_HAND
name = "right hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
parent_organ = "r_arm"
parent_organ = BP_R_ARM
joint = "right wrist"
amputation_point = "right wrist"
+2 -1
View File
@@ -53,7 +53,8 @@ var/list/possible_cable_coil_colours = list(
icon_state = "0-1"
var/d1 = 0
var/d2 = 1
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
plane = PLATING_PLANE
layer = WIRES_LAYER
color = COLOR_RED
var/obj/machinery/power/breakerbox/breaker_box
+2 -1
View File
@@ -8,7 +8,8 @@
icon = 'icons/obj/power_cond_heavy.dmi'
name = "large power cable"
desc = "This cable is tough. It cannot be cut with simple hand tools."
layer = 2.39 //Just below pipes, which are at 2.4
plane = PLATING_PLANE
layer = PIPES_LAYER - 0.05 //Just below pipes
color = null
unacidable = 1
var/id = null
+2 -1
View File
@@ -7,7 +7,8 @@
icon = 'icons/obj/power_cond_heavy.dmi'
name = "large power cable"
desc = "This cable is tough. It cannot be cut with simple hand tools."
layer = 2.39 //Just below pipes, which are at 2.4
plane = PLATING_PLANE
layer = PIPES_LAYER - 0.05 //Just below pipes
color = null
/obj/structure/cable/heavyduty/attackby(obj/item/W, mob/user)
@@ -50,6 +50,7 @@
/obj/item/ammo_magazine/s38/rubber
name = "speedloader (.38 rubber)"
icon_state = "T38"
ammo_type = /obj/item/ammo_casing/a38r
/obj/item/ammo_magazine/s38/emp
@@ -493,6 +494,23 @@
max_ammo = 9
multiple_sprites = 1
/obj/item/ammo_magazine/s44
name = "speedloader (.44)"
icon_state = "44"
ammo_type = /obj/item/ammo_casing/a44
matter = list(DEFAULT_WALL_MATERIAL = 1260) //metal costs are very roughly based around 1 .45 casing = 75 metal
caliber = ".44"
max_ammo = 6
multiple_sprites = 1
/obj/item/ammo_magazine/s44/empty
initial_ammo = 0
/obj/item/ammo_magazine/s44/rubber
name = "speedloader (.44 rubber)"
icon_state = "R44"
ammo_type = /obj/item/ammo_casing/a44r
///////// 7.62mm /////////
/obj/item/ammo_magazine/m762
@@ -59,6 +59,12 @@
caliber = ".44"
projectile_type = /obj/item/projectile/bullet/pistol/strong
/obj/item/ammo_casing/a44r
icon_state = "r-casing"
desc = "A .44 rubber bullet casing."
caliber = ".44"
projectile_type = /obj/item/projectile/bullet/pistol/rubber/strong
/*
* .75 (aka Gyrojet Rockets, aka admin abuse)
*/
+5 -1
View File
@@ -58,6 +58,7 @@
var/move_delay = 1
var/fire_sound = 'sound/weapons/Gunshot.ogg'
var/fire_sound_text = "gunshot"
var/fire_anim = null
var/recoil = 0 //screen shake
var/silenced = 0
var/muzzle_flash = 3
@@ -492,7 +493,7 @@
if(!(target && target.loc))
target = targloc
//pointblank = 0
var/target_for_log
if(ismob(target))
target_for_log = target
@@ -533,6 +534,9 @@
//called after successfully firing
/obj/item/weapon/gun/proc/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0)
if(fire_anim)
flick(fire_anim, src)
if(silenced)
if(reflex)
user.visible_message(
@@ -118,7 +118,6 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
return 1
// Blade Runner pistol.
/obj/item/weapon/gun/projectile/revolver/deckard
name = "\improper Deckard .38"
@@ -259,3 +258,24 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
to_chat(user, "\The [src] has a secondary barrel loaded with \a [to_print]")
else
to_chat(user, "\The [src] has a secondary barrel that is empty.")
//Ported from Bay
/obj/item/weapon/gun/projectile/revolver/webley
name = "service revolver"
desc = "A rugged top break revolver based on the Webley Mk. VI model, with modern improvements. Uses .44 magnum rounds."
icon_state = "webley2"
item_state = "webley2"
caliber = ".44"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
handle_casings = CYCLE_CASINGS
max_shells = 6
ammo_type = /obj/item/ammo_casing/a44
/obj/item/weapon/gun/projectile/revolver/webley/auto
name = "autorevolver"
icon_state = "mosley"
desc = "A shiny Mosley Autococker automatic revolver, with black accents. Marketed as the 'Revolver for the Modern Era'. Uses .44 magnum rounds."
fire_delay = 5.7 //Autorevolver. Also synced with the animation
fire_anim = "mosley_fire"
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
@@ -147,6 +147,14 @@
fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg'
damage = 60
/obj/item/projectile/bullet/pistol/rubber/strong //"rubber" bullets for revolvers and matebas
fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg'
damage = 10
agony = 60
embed_chance = 0
sharp = 0
check_armour = "melee"
/obj/item/projectile/bullet/pistol/rubber //"rubber" bullets
name = "rubber bullet"
damage = 5
+1
View File
@@ -663,6 +663,7 @@
var/dpdir = 0 // bitmask of pipe directions
dir = 0 // dir will contain dominant direction for junction pipes
var/health = 10 // health points 0-10
plane = PLATING_PLANE
layer = DISPOSAL_LAYER // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
var/sortType = ""
-8
View File
@@ -1,11 +1,3 @@
/datum/design/excavationdrill
name = "Excavation Drill"
desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The silver tip is adjustable from 1 to 30 cm."
id = "excavationdrill"
req_tech = list(TECH_MATERIAL = 4, TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) //They were never used before. Now they'll be used. Hopefully.
build_type = PROTOLATHE
materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 1000, "silver" = 1000)
build_path = /obj/item/weapon/pickaxe/excavationdrill
/* Make language great again
/datum/design/item/implant/language
name = "Language implant"
@@ -976,7 +976,8 @@
/datum/sprite_accessory/tail/special/seromitailfeathered
name = "seromi tail w/ feathers"
desc = ""
icon_state = "seromitail_feathers_s"
icon_state = "seromitail_s"
extra_overlay = "seromitail_feathers_s"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
@@ -1448,24 +1448,27 @@
//Destination beacon vore checking
var/atom/real_dest = dT
var/televored = FALSE //UR GONNA GET VORED
var/atom/real_loc = destination.loc
if(isbelly(real_loc))
real_dest = real_loc
televored = TRUE
if(isliving(real_loc))
var/mob/living/L = real_loc
if(L.vore_selected)
real_dest = L.vore_selected
televored = TRUE
else if(L.vore_organs.len)
real_dest = pick(L.vore_organs)
televored = TRUE
//Televore fluff stuff
if(televored)
to_chat(target,"<span class='warning'>\The [src] teleports you right into \a [lowertext(real_dest.name)]!</span>")
//Confirm televore
var/televored = FALSE
if(isbelly(real_dest))
var/obj/belly/B = real_dest
if(!target.can_be_drop_prey && B.owner != user)
to_chat(target,"<span class='warning'>\The [src] narrowly avoids teleporting you right into \a [lowertext(real_dest.name)]!</span>")
real_dest = dT //Nevermind!
else
televored = TRUE
to_chat(target,"<span class='warning'>\The [src] teleports you right into \a [lowertext(real_dest.name)]!</span>")
//Phase-out effect
phase_out(target,get_turf(target))
@@ -1496,7 +1499,7 @@
ready = 1
update_icon()
logged_events["[world.time]"] = "[user] teleported [target] to [real_dest] [televored ? "(Belly: [lowertext(real_loc.name)])" : null]"
logged_events["[world.time]"] = "[user] teleported [target] to [real_dest] [televored ? "(Belly: [lowertext(real_dest.name)])" : null]"
/obj/item/device/perfect_tele/proc/phase_out(var/mob/M,var/turf/T)
+1 -1
View File
@@ -64,7 +64,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
/mob/living/proc/resize(var/new_size, var/animate = TRUE)
if(size_multiplier == new_size)
return 1
size_multiplier = new_size //Change size_multiplier so that other items can interact with them
if(animate)
var/change = new_size - size_multiplier
@@ -21,47 +21,3 @@
/obj/item/weapon/pickaxe/hand
icon = 'icons/obj/xenoarchaeology_vr.dmi'
/obj/item/weapon/pickaxe/excavationdrill
name = "excavation drill"
icon = 'icons/obj/xenoarchaeology_vr.dmi'
icon_state = "excavationdrill0"
item_state = "syringe_0"
excavation_amount = 15
digspeed = 30
desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The diamond tip is adjustable from 1 to 30 cms."
drill_sound = 'sound/weapons/thudswoosh.ogg'
drill_verb = "drilling"
force = 15.0
w_class = ITEMSIZE_SMALL
attack_verb = list("drilled")
hitsound = 'sound/weapons/circsawhit.ogg'
/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob)
var/depth = input("Put the desired depth (1-30 centimeters).", "Set Depth", 30) as num
if(depth>30 || depth<1)
user << "<span class='notice'>Invalid depth.</span>"
return
excavation_amount = depth
user << "<span class='notice'>You set the depth to [depth]cm.</span>"
if (depth<4)
icon_state = "excavationdrill0"
else if (depth >=4 && depth <8)
icon_state = "excavationdrill1"
else if (depth >=8 && depth <12)
icon_state = "excavationdrill2"
else if (depth >=12 && depth <16)
icon_state = "excavationdrill3"
else if (depth >=16 && depth <20)
icon_state = "excavationdrill4"
else if (depth >=20 && depth <24)
icon_state = "excavationdrill5"
else if (depth >=24 && depth <28)
icon_state = "excavationdrill6"
else
icon_state = "excavationdrill7"
/obj/item/weapon/pickaxe/excavationdrill/examine(mob/user)
..()
var/depth = excavation_amount
user << "<span class='info'>It is currently set at [depth]cms.</span>"