Merge branch 'master' of https://github.com/PolarisSS13/Polaris into tracking_implant

This commit is contained in:
Anewbe
2017-10-01 21:52:36 -05:00
67 changed files with 995 additions and 271 deletions

View File

@@ -1,28 +0,0 @@
//Unathi clothing.
/obj/item/clothing/suit/unathi/robe
name = "roughspun robes"
desc = "A traditional Unathi garment."
icon_state = "robe-unathi"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
flags_inv = HIDETIE|HIDEHOLSTER
/obj/item/clothing/suit/unathi/mantle
name = "hide mantle"
desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle."
icon_state = "mantle-unathi"
body_parts_covered = UPPER_TORSO
//Taj clothing.
/obj/item/clothing/suit/tajaran/furs
name = "heavy furs"
desc = "A traditional Zhan-Khazan garment."
icon_state = "zhan_furs"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
/obj/item/clothing/head/tajaran/scarf
name = "headscarf"
desc = "A scarf of coarse fabric. Seems to have ear-holes."
icon_state = "zhan_scarf"
item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
body_parts_covered = HEAD|FACE

View File

@@ -0,0 +1,13 @@
/obj/item/clothing/suit/tajaran/furs
name = "heavy furs"
desc = "A traditional Zhan-Khazan garment."
icon_state = "zhan_furs"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
/obj/item/clothing/head/tajaran/scarf //This stays in /suits because it goes with the furs above
name = "headscarf"
desc = "A scarf of coarse fabric. Seems to have ear-holes."
icon_state = "zhan_scarf"
item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
body_parts_covered = HEAD|FACE

View File

@@ -0,0 +1,13 @@
//Unathi clothing.
/obj/item/clothing/suit/unathi/robe
name = "roughspun robes"
desc = "A traditional Unathi garment."
icon_state = "robe-unathi"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
flags_inv = HIDETIE|HIDEHOLSTER
/obj/item/clothing/suit/unathi/mantle
name = "hide mantle"
desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle."
icon_state = "mantle-unathi"
body_parts_covered = UPPER_TORSO

View File

@@ -0,0 +1,10 @@
/obj/item/clothing/suit/armor/vox_scrap
name = "rusted metal armor"
desc = "A hodgepodge of various pieces of metal scrapped together into a rudimentary vox-shaped piece of armor."
allowed = list(/obj/item/weapon/gun, /obj/item/weapon/tank)
armor = list(melee = 70, bullet = 30, laser = 20,energy = 5, bomb = 40, bio = 0, rad = 0) //Higher melee armor versus lower everything else.
icon_state = "vox-scrap"
icon_state = "vox-scrap"
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS
species_restricted = list("Vox")
siemens_coefficient = 1 //Its literally metal

View File

@@ -134,6 +134,6 @@
/obj/item/clothing/accessory/holster/leg
name = "leg holster"
desc = "A tacticool handgun holster. Worn on the upper leg."
icon_state = "holster_hip"
icon_state = "holster_leg"
overlay_state = "holster_leg"
concealed_holster = 0
concealed_holster = 0

View File

@@ -157,7 +157,8 @@
//Meters
/obj/machinery/meter
description_info = "Measures the volume and temperature of the pipe under the meter."
description_info = "Measures the volume and temperature of the pipe under the meter.\
Using a multitool on this will cycle through any other pipes on the same tile."
//Pipe dispensers
/obj/machinery/pipedispenser

View File

@@ -1,28 +1,28 @@
/obj/item/weapon/storage/fancy/cigarettes
description_fluff = "The Trans-Stellar Duty-Free cigarette company was created as a sub-company of NanoTrasen. They are the most boring, tasteless, dry cigarettes on the market, but due to how generic they are, they are still the most well-known and widespread cigarettes in the universe."
description_fluff = "The Trans-Stellar Duty-Free Cigarette Company was created as an imprint of NanoTrasen. They are the most boring, tasteless, dry cigarettes on the market, but due to how generic they are, they are still the most well-known and widespread cigarettes in the universe."
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco
description_fluff = "DromedaryCo is one of the oldest companies that produces cigarettes. Being a company that has changed hands and names several times through the years, their cigarettes are now very different from the original, and old-timers tend to complain about the quality of their current product. While they have been dwindling when it comes to profits in the past years due to marketing schemes deemed 'unethical', they still remain on the forefront of the smokeable industry."
description_fluff = "DromedaryCo is one of the oldest companies that produces cigarettes. Being a company that has changed hands and names several times through the years, their cigarettes are now very different from the original, and old-timers tend to complain about the quality of their current product. While their profits have been dwindling over the past few years due to marketing schemes deemed 'unethical', they still remain on the forefront of the smokeable industry."
/obj/item/weapon/storage/fancy/cigarettes/killthroat
description_fluff = "AcmeCo is known for their signature high-tar cigarettes. Being a sub-company Xion, some accuse the cigarettes of having other harmful things in them besides tar. Xion officials refuse to comment on the issue."
description_fluff = "AcmeCo, a subsidiary of Xion Manufacturing Group, is known for their signature high-tar cigarettes. Some accuse the cigarettes of having harmful things in them beyond tar, but Xion officials refuse to comment on the issue."
/obj/item/weapon/storage/fancy/cigarettes/luckystars
description_fluff = "Lucky Stars were created on Venus by a researcher seeking to make a good quality cigarette from pod-based tobacco plants. The researcher only managed to make these, but made quite a profit off of them when she started her company."
description_fluff = "Lucky Stars were created on Venus by a researcher seeking to make a good quality cigarette from pod-based tobacco plants. The researcher only managed to make these, but made quite a profit off of them nonetheless."
/obj/item/weapon/storage/fancy/cigarettes/jerichos
description_fluff = "Hephaestus Industries ex-military employees once decided to make a cigarette that was easy to light and had a waterproof case, specifically tailored for soldiers. They created Jerichos. Jerichos are known for their Hickory smoke and warm feeling in your lungs. They are loved by soldiers and people employed in para-military outfits."
description_fluff = "Stealth Assault Enterprises ex-contractors once decided to make a cigarette that was easy to light and had a waterproof case, specifically tailored for soldiers. They created Jerichos. Jerichos are known for their hickory smoke and warm feeling in your lungs. They are loved by soldiers and people employed in para-military outfits."
/obj/item/weapon/storage/fancy/cigarettes/menthols
description_fluff = "The Temperamento Menthol Company is a large cigarette company based in Mars. They have been around since the very dawn of Human colonization and have remained a favorite for those seeking a more.. numbing cigarette.<br>\
description_fluff = "The Temperamento Menthol Company is a large cigarette company based in Mars. They have been around since the very dawn of human colonization and have remained a favorite for those seeking a more numbing cigarette.<br>\
<br>\
This is a pack of Temperamento Menthols, the main product of the company. They taste like menthol, surprisingly enough."
/obj/item/weapon/storage/fancy/cigarettes/carcinomas
description_fluff = "The CarcinoCo was originally destined to fail, as the company blatantly advertized themselves as creating the 'most cancerous cigarette'. Somehow, after endorsement from a reporter, the cigarettes took off."
description_fluff = "The CarcinoCo was originally destined to fail, as the company blatantly advertized themselves as creating the 'most cancerous cigarette'. The cigarettes became a hit among those rich enough to afford regular lung replacements."
/obj/item/weapon/storage/fancy/cigarettes/professionals
description_fluff = "Decades ago, probably before you were born, Gilthari Exports created the Professional 120s. They wanted to make a fancy cigarette that would be considered a luxury. Nowadays, people who use them are generally laughed at for being wannabe rich people or old. They are, however, very high-quality and made from the very best tobacco."
description_fluff = "Decades ago, probably before you were born, Gilthari Exports created the Professional 120s. They wanted to make a fancy cigarette that would be considered a luxury. Nowadays, they are generally concidered an emblem of the nouveau riche and the elderly. They are, however, very high-quality and made from the very best Solar tobacco."
/obj/item/clothing/mask/smokable/cigarette/cigar
description_fluff = "While the label does say that this is a 'premium cigar', it really cannot match other types of cigars on the market. Is it a quality cigarette? Perhaps. Was it hand-made with care? No. This is what differentiates between quality products that Gilthari puts out and NanoTrasen 'premium' cigars like this one."
@@ -31,9 +31,9 @@
description_fluff = "Cohiba has been a popular cigar company for centuries. They are still based out of Cuba and refuse to expand and therefore have a very limited quantity, making their cigars coveted all through known space. Robusto is one of their most popular shapes of cigars."
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers. While the way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars."
description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers. While this way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars."
/obj/item/clothing/mask/smokable/pipe
description_fluff = "ClassiCo Men's Accessories and Haberdashers is a widespread company originating out of Mars. They seek to create quality goods to give men a more 'classy' look. Most of their items are high-end and expensive, but they do back that up with quality.<br>\
description_fluff = "ClassiCo Accessories and Haberdashers is a widespread company originating out of Mars. They seek to create quality goods to give men a more 'classy' look. Most of their items are high-end and expensive, but they plege to back their prices up with quality.<br>\
<br>\
This pipe is a ClassiCo pipe. It is made out of fine, stained cherry wood."
This pipe is a ClassiCo pipe. It is made out of fine, stained cherry wood."

View File

@@ -2,101 +2,101 @@
/obj/fiftyspawner/iron
name = "stack of iron"
material = "material/iron"
type_to_spawn = /obj/item/stack/material/iron
/obj/fiftyspawner/sandstone
name = "stack of sandstone"
material = "material/sandstone"
type_to_spawn = /obj/item/stack/material/sandstone
/obj/fiftyspawner/marble
name = "stack of marble"
material = "material/marble"
type_to_spawn = /obj/item/stack/material/marble
/obj/fiftyspawner/diamond
name = "stack of diamond"
material = "material/diamond"
type_to_spawn = /obj/item/stack/material/diamond
/obj/fiftyspawner/uranium
name = "stack of uranium"
material = "material/uranium"
type_to_spawn = /obj/item/stack/material/uranium
/obj/fiftyspawner/phoron
name = "stack of phoron"
material = "material/phoron"
type_to_spawn = /obj/item/stack/material/phoron
/obj/fiftyspawner/plastic
name = "stack of plastic"
material = "material/plastic"
type_to_spawn = /obj/item/stack/material/plastic
/obj/fiftyspawner/gold
name = "stack of gold"
material = "material/gold"
type_to_spawn = /obj/item/stack/material/gold
/obj/fiftyspawner/silver
name = "stack of silver"
material = "material/silver"
type_to_spawn = /obj/item/stack/material/silver
/obj/fiftyspawner/platinum
name = "stack of platinum"
material = "material/platinum"
type_to_spawn = /obj/item/stack/material/platinum
/obj/fiftyspawner/mhydrogen
name = "stack of mhydrogen"
material = "material/mhydrogen"
type_to_spawn = /obj/item/stack/material/mhydrogen
/obj/fiftyspawner/tritium
name = "stack of tritium"
material = "material/tritium"
type_to_spawn = /obj/item/stack/material/tritium
/obj/fiftyspawner/osmium
name = "stack of osmium"
material = "material/osmium"
type_to_spawn = /obj/item/stack/material/osmium
/obj/fiftyspawner/steel
name = "stack of steel"
material = "material/steel"
type_to_spawn = /obj/item/stack/material/steel
/obj/fiftyspawner/plasteel
name = "stack of plasteel"
material = "material/plasteel"
type_to_spawn = /obj/item/stack/material/plasteel
/obj/fiftyspawner/durasteel
name = "stack of durasteel"
material = "material/durasteel"
type_to_spawn = /obj/item/stack/material/durasteel
/obj/fiftyspawner/wood
name = "stack of wood"
material = "material/wood"
type_to_spawn = /obj/item/stack/material/wood
/obj/fiftyspawner/cloth
name = "stack of cloth"
material = "material/cloth"
type_to_spawn = /obj/item/stack/material/cloth
/obj/fiftyspawner/cardboard
name = "stack of cardboard"
material = "material/cardboard"
type_to_spawn = /obj/item/stack/material/cardboard
/obj/fiftyspawner/leather
name = "stack of leather"
material = "material/leather"
type_to_spawn = /obj/item/stack/material/leather
/obj/fiftyspawner/glass
name = "stack of glass"
material = "material/glass"
type_to_spawn = /obj/item/stack/material/glass
/obj/fiftyspawner/rglass
name = "stack of reinforced glass"
material = "material/glass/reinforced"
type_to_spawn = /obj/item/stack/material/glass/reinforced
/obj/fiftyspawner/phoronglass
name = "stack of borosilicate glass"
material = "material/glass/phoronglass"
type_to_spawn = /obj/item/stack/material/glass/phoronglass
/obj/fiftyspawner/phoronrglass
name = "stack of reinforced borosilicate glass"
material = "material/glass/phoronrglass"
type_to_spawn = /obj/item/stack/material/glass/phoronrglass
//R-UST port
/obj/fiftyspawner/deuterium
name = "stack of deuterium"
material = "material/deuterium"
type_to_spawn = /obj/item/stack/material/deuterium

View File

@@ -92,16 +92,19 @@
icon_state = "sheet-silver"
default_type = "iron"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/sandstone
name = "sandstone brick"
icon_state = "sheet-sandstone"
default_type = "sandstone"
no_variants = FALSE
/obj/item/stack/material/marble
name = "marble brick"
icon_state = "sheet-marble"
default_type = "marble"
no_variants = FALSE
/obj/item/stack/material/diamond
name = "diamond"
@@ -112,38 +115,45 @@
name = "uranium"
icon_state = "sheet-uranium"
default_type = "uranium"
no_variants = FALSE
/obj/item/stack/material/phoron
name = "solid phoron"
icon_state = "sheet-phoron"
default_type = "phoron"
no_variants = FALSE
/obj/item/stack/material/plastic
name = "plastic"
icon_state = "sheet-plastic"
default_type = "plastic"
no_variants = FALSE
/obj/item/stack/material/gold
name = "gold"
icon_state = "sheet-gold"
default_type = "gold"
no_variants = FALSE
/obj/item/stack/material/silver
name = "silver"
icon_state = "sheet-silver"
default_type = "silver"
no_variants = FALSE
//Valuable resource, cargo can sell it.
/obj/item/stack/material/platinum
name = "platinum"
icon_state = "sheet-adamantine"
default_type = "platinum"
no_variants = FALSE
//Extremely valuable to Research.
/obj/item/stack/material/mhydrogen
name = "metallic hydrogen"
icon_state = "sheet-mythril"
default_type = "mhydrogen"
no_variants = FALSE
//Fuel for MRSPACMAN generator.
/obj/item/stack/material/tritium
@@ -151,12 +161,14 @@
icon_state = "sheet-silver"
default_type = "tritium"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/osmium
name = "osmium"
icon_state = "sheet-silver"
default_type = "osmium"
apply_colour = 1
no_variants = FALSE
//R-UST port
// Fusion fuel.
@@ -165,22 +177,26 @@
icon_state = "sheet-silver"
default_type = "deuterium"
apply_colour = 1
no_variants = FALSE
/obj/item/stack/material/steel
name = DEFAULT_WALL_MATERIAL
icon_state = "sheet-metal"
default_type = DEFAULT_WALL_MATERIAL
no_variants = FALSE
/obj/item/stack/material/plasteel
name = "plasteel"
icon_state = "sheet-plasteel"
default_type = "plasteel"
no_variants = FALSE
/obj/item/stack/material/durasteel
name = "durasteel"
icon_state = "sheet-durasteel"
item_state = "sheet-metal"
default_type = "durasteel"
no_variants = FALSE
/obj/item/stack/material/wood
name = "wooden plank"
@@ -191,11 +207,13 @@
name = "cloth"
icon_state = "sheet-cloth"
default_type = "cloth"
no_variants = FALSE
/obj/item/stack/material/cardboard
name = "cardboard"
icon_state = "sheet-card"
default_type = "cardboard"
no_variants = FALSE
/obj/item/stack/material/snow
name = "snow"
@@ -208,16 +226,19 @@
desc = "The by-product of mob grinding."
icon_state = "sheet-leather"
default_type = "leather"
no_variants = FALSE
/obj/item/stack/material/glass
name = "glass"
icon_state = "sheet-glass"
default_type = "glass"
no_variants = FALSE
/obj/item/stack/material/glass/reinforced
name = "reinforced glass"
icon_state = "sheet-rglass"
default_type = "rglass"
no_variants = FALSE
/obj/item/stack/material/glass/phoronglass
name = "borosilicate glass"
@@ -225,6 +246,7 @@
singular_name = "borosilicate glass sheet"
icon_state = "sheet-phoronglass"
default_type = "borosilicate glass"
no_variants = FALSE
/obj/item/stack/material/glass/phoronrglass
name = "reinforced borosilicate glass"
@@ -232,3 +254,4 @@
singular_name = "reinforced borosilicate glass sheet"
icon_state = "sheet-phoronrglass"
default_type = "reinforced borosilicate glass"
no_variants = FALSE

View File

@@ -0,0 +1,37 @@
/*
* Modifier applied to newly cloned people.
*/
// Gives rather nasty downsides for awhile, making them less robust.
/datum/modifier/cloning_sickness
name = "cloning sickness"
desc = "You feel rather weak, having been cloned not so long ago."
on_created_text = "<span class='warning'><font size='3'>You feel really weak.</font></span>"
on_expired_text = "<span class='notice'><font size='3'>You feel your strength returning to you.</font></span>"
max_health_percent = 0.6 // -40% max health.
incoming_damage_percent = 1.1 // 10% more incoming damage.
outgoing_melee_damage_percent = 0.7 // 30% less melee damage.
disable_duration_percent = 1.25 // Stuns last 25% longer.
slowdown = 1 // Slower.
evasion = -1 // 15% easier to hit.
// Tracks number of deaths, one modifier added per cloning
/datum/modifier/cloned
name = "cloned"
desc = "You died and were cloned, and you can never forget that."
flags = MODIFIER_GENETIC // So it gets copied if they die and get cloned again.
stacks = MODIFIER_STACK_ALLOWED // Two deaths means two instances of this.
// Prevents cloning, actual effect is on the cloning machine
/datum/modifier/no_clone
name = "Cloning Incompatability"
desc = "For whatever reason, you cannot be cloned."
//WIP, but these may never be seen anyway, so *shrug
on_created_text = "<span class='warning'>Life suddenly feels more precious.</span>"
on_expired_text = "<span class='notice'>Death is cheap again.</span>"
flags = MODIFIER_GENETIC

View File

@@ -0,0 +1,10 @@
/datum/modifier/frail
name = "frail"
desc = "You are more delicate than the average person."
flags = MODIFIER_GENETIC
on_created_text = "<span class='warning'>You feel really weak.</span>"
on_expired_text = "<span class='notice'>You feel your strength returning to you.</span>"
max_health_percent = 0.9

View File

@@ -83,7 +83,7 @@
key = "k"
space_chance = 30
flags = WHITELISTED
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!", "'")
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix")
/datum/language/human
name = LANGUAGE_SOL_COMMON
@@ -244,4 +244,4 @@
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
"tod", "ser", "su", "no", "nue", "el")
"tod", "ser", "su", "no", "nue", "el")

View File

@@ -128,7 +128,8 @@
return
var/obj/item/weapon/rig/rig = src.get_rig()
if(rig)
rig.forced_move(direction, user)
if(istype(rig,/obj/item/weapon/rig))
rig.forced_move(direction, user)
/obj/item/device/mmi/Destroy()
if(isrobot(loc))
@@ -260,7 +261,7 @@
src.brainmob.mind.reset()
src.brainmob.ckey = candidate.ckey
src.name = "[name] ([src.brainmob.name])"
src.brainmob << "<b>You are a [src], brought into existence on [station_name()].</b>"
src.brainmob << "<b>You are [src.name], brought into existence on [station_name()].</b>"
src.brainmob << "<b>As a synthetic intelligence, you are designed with organic values in mind.</b>"
src.brainmob << "<b>However, unless placed in a lawed chassis, you are not obligated to obey any individual crew member.</b>" //it's not like they can hurt anyone
// src.brainmob << "<b>Use say #b to speak to other artificial intelligences.</b>"
@@ -283,7 +284,6 @@
..()
src.brainmob.name = "[pick(list("ADA","DOS","GNU","MAC","WIN","NJS","SKS","DRD","IOS","CRM","IBM","TEX","LVM","BSD",))]-[rand(1000, 9999)]"
src.brainmob.real_name = src.brainmob.name
src.name = "robotic intelligence circuit ([src.brainmob.name])"
/obj/item/device/mmi/digital/robot/transfer_identity(var/mob/living/carbon/H)
..()

View File

@@ -5,6 +5,7 @@
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
faction = "crabs"
intelligence_level = SA_ANIMAL
wander = 0
@@ -45,3 +46,37 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
//Sif Crabs
/mob/living/simple_animal/giant_crab
name = "Giant Crab"
desc = "A large, hard-shelled crustacean. This one is mostly grey."
icon_state = "sif_crab"
icon_living = "sif_crab"
icon_dead = "sif_crab_dead"
faction = "crabs"
intelligence_level = SA_ANIMAL
maxHealth = 200
health = 200
mob_size = MOB_LARGE
cooperative = 1
retaliate = 1
turns_per_move = 3
minbodytemp = 175
melee_damage_lower = 15
melee_damage_upper = 35
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
friendly = "pinches"
speak_chance = 1
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")

View File

@@ -533,3 +533,23 @@
/mob/proc/update_gravity()
return
// The real Move() proc is above, but touching that massive block just to put this in isn't worth it.
/mob/Move(var/newloc, var/direct)
. = ..(newloc, direct)
if(.)
post_move(newloc, direct)
// Called when a mob successfully moves.
// Would've been an /atom/movable proc but it caused issues.
/mob/proc/post_move(var/newloc, var/direct)
for(var/obj/O in contents)
O.on_loc_moved(newloc, direct)
// Received from post_move(), useful for items that need to know that their loc just moved.
/obj/proc/on_loc_moved(var/newloc, var/direct)
return
/obj/item/weapon/storage/on_loc_moved(var/newloc, var/direct)
for(var/obj/O in contents)
O.on_loc_moved(newloc, direct)

View File

@@ -133,8 +133,8 @@ var/datum/planet/sif/planet_sif = null
datum/weather/sif
name = "sif base"
temp_high = 243.15 // -20c
temp_low = 233.15 // -30c
temp_high = 283.15 // 10c
temp_low = 263.15 // -10c
/datum/weather/sif/clear
name = "clear"
@@ -158,8 +158,8 @@ datum/weather/sif
/datum/weather/sif/light_snow
name = "light snow"
icon_state = "snowfall_light"
temp_high = 238.15 // -25c
temp_low = 228.15 // -35c
temp_high = T0C // 0c
temp_low = 258.15 // -15c
light_modifier = 0.7
transition_chances = list(
WEATHER_OVERCAST = 20,
@@ -171,8 +171,8 @@ datum/weather/sif
/datum/weather/sif/snow
name = "moderate snow"
icon_state = "snowfall_med"
temp_high = 233.15 // -30c
temp_low = 223.15 // -40c
temp_high = T0C // 0c
temp_low = 243.15 // -30c
light_modifier = 0.5
transition_chances = list(
WEATHER_LIGHT_SNOW = 20,
@@ -194,8 +194,8 @@ datum/weather/sif
/datum/weather/sif/blizzard
name = "blizzard"
icon_state = "snowfall_heavy"
temp_high = 223.15 // -40c
temp_low = 203.15 // -60c
temp_high = 233.15 // -40c
temp_low = 213.15 // -60c
light_modifier = 0.3
transition_chances = list(
WEATHER_SNOW = 45,
@@ -238,8 +238,8 @@ datum/weather/sif
/datum/weather/sif/storm
name = "storm"
icon_state = "storm"
temp_high = 233.15 // -30c
temp_low = 213.15 // -50c
temp_high = 243.15 // -30c
temp_low = 233.15 // -50c
light_modifier = 0.3
transition_chances = list(
WEATHER_RAIN = 45,
@@ -261,8 +261,8 @@ datum/weather/sif
/datum/weather/sif/hail
name = "hail"
icon_state = "hail"
temp_high = 233.15 // -30c
temp_low = 213.15 // -50c
temp_high = T0C // 0c
temp_low = 243.15 // -30c
light_modifier = 0.3
transition_chances = list(
WEATHER_RAIN = 45,
@@ -297,5 +297,4 @@ datum/weather/sif
light_color = "#FF0000"
transition_chances = list(
WEATHER_BLOODMOON = 100
)
)

View File

@@ -1204,7 +1204,7 @@
name = "Syntiflesh"
id = "syntiflesh"
result = null
required_reagents = list("blood" = 5, "clonexadone" = 1)
required_reagents = list("blood" = 5, "clonexadone" = 5)
result_amount = 1
/datum/chemical_reaction/food/syntiflesh/on_reaction(var/datum/reagents/holder, var/created_volume)

View File

@@ -0,0 +1,347 @@
// This is the actual shield. The projector is a different item.
/obj/effect/directional_shield
name = "directional combat shield"
desc = "A wide shield, which has the property to block incoming projectiles but allow outgoing projectiles to pass it. \
Slower moving objects are not blocked, so people can walk in and out of the barrier, and things can be thrown into and out \
of it."
icon = 'icons/effects/effects.dmi'
icon_state = "directional_shield"
density = FALSE // People can move pass these shields.
opacity = FALSE
anchored = TRUE
unacidable = TRUE
layer = MOB_LAYER + 0.1
mouse_opacity = FALSE
var/obj/item/shield_projector/projector = null // The thing creating the shield.
var/x_offset = 0 // Offset from the 'center' of where the projector is, so that if it moves, the shield can recalc its position.
var/y_offset = 0 // Ditto.
/obj/effect/directional_shield/New(var/newloc, var/new_projector)
if(new_projector)
projector = new_projector
var/turf/us = get_turf(src)
var/turf/them = get_turf(projector)
if(them)
x_offset = us.x - them.x
y_offset = us.y - them.y
else
update_color()
..(newloc)
/obj/effect/directional_shield/proc/relocate()
if(!projector)
return // Nothing to follow.
var/turf/T = get_turf(projector)
if(!T)
return
var/turf/new_pos = locate(T.x + x_offset, T.y + y_offset, T.z)
if(new_pos)
forceMove(new_pos)
else
qdel(src)
/obj/effect/directional_shield/proc/update_color(var/new_color)
if(!projector)
color = "#0099FF"
else
animate(src, color = new_color, 5)
// color = new_color
/obj/effect/directional_shield/Destroy()
if(projector)
projector.active_shields -= src
projector = null
return ..()
/obj/effect/directional_shield/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0))
return TRUE
else if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
if(istype(P, /obj/item/projectile/test)) // Turrets need to try to kill the shield and so their test bullet needs to penetrate.
return TRUE
var/bad_arc = reverse_direction(dir) // Arc of directions from which we cannot block.
if(check_shield_arc(src, bad_arc, P)) // This is actually for mobs but it will work for our purposes as well.
return FALSE
else
return TRUE
return TRUE
/obj/effect/directional_shield/bullet_act(var/obj/item/projectile/P)
adjust_health(-P.get_structure_damage())
P.on_hit()
playsound(get_turf(src), 'sound/effects/EMPulse.ogg', 75, 1)
// All the shields tied to their projector are one 'unit', and don't have individualized health values like most other shields.
/obj/effect/directional_shield/proc/adjust_health(amount)
if(projector)
projector.adjust_health(amount) // Projector will kill the shield if needed.
// If the shield lacks a projector, then it was probably spawned in by an admin for bus, so it's indestructable.
// This actually creates the shields. It's an item so that it can be carried, but it could also be placed inside a stationary object if desired.
// It should work inside the contents of any mob.
/obj/item/shield_projector
name = "combat shield projector"
desc = "A miniturized and compact shield projector. This type has been optimized to diffuse lasers or block high velocity projectiles from the outside, \
but allow those projectiles to leave the shield from the inside. Blocking too many damaging projectiles will cause the shield to fail."
icon = 'icons/obj/device.dmi'
icon_state = "signmaker_sec"
var/active = FALSE // If it's on.
var/shield_health = 400 // How much damage the shield blocks before breaking. This is a shared health pool for all shields attached to this projector.
var/max_shield_health = 400 // Ditto. This is fairly high, but shields are really big, you can't miss them, and laser carbines pump out so much hurt.
var/shield_regen_amount = 20 // How much to recharge every process(), after the delay.
var/shield_regen_delay = 5 SECONDS // If the shield takes damage, it won't recharge for this long.
var/last_damaged_time = null // world.time when the shields took damage, used for the delay.
var/list/active_shields = list() // Shields that are active and deployed.
var/always_on = FALSE // If true, will always try to reactivate if disabled for whatever reason, ideal if AI mobs are holding this.
var/high_color = "#0099FF" // Color the shield will be when at max health. A light blue.
var/low_color = "#FF0000" // Color the shield will drift towards as health is lowered. Deep red.
/obj/item/shield_projector/New()
processing_objects += src
if(always_on)
create_shields()
..()
/obj/item/shield_projector/Destroy()
destroy_shields()
processing_objects -= src
return ..()
/obj/item/shield_projector/proc/create_shield(var/newloc, var/new_dir)
var/obj/effect/directional_shield/S = new(newloc, src)
S.dir = new_dir
active_shields += S
/obj/item/shield_projector/proc/create_shields() // Override this for a specific shape. Be sure to call ..() for the checks, however.
if(active) // Already made.
return FALSE
if(shield_health <= 0)
return FALSE
active = TRUE
return TRUE
/obj/item/shield_projector/proc/destroy_shields()
for(var/obj/effect/directional_shield/S in active_shields)
active_shields -= S
qdel(S)
active = FALSE
/obj/item/shield_projector/proc/update_shield_positions()
for(var/obj/effect/directional_shield/S in active_shields)
S.relocate()
/obj/item/shield_projector/proc/adjust_health(amount)
shield_health = between(0, shield_health + amount, max_shield_health)
if(amount < 0)
if(shield_health <= 0)
destroy_shields()
var/turf/T = get_turf(src)
T.visible_message("<span class='danger'>\The [src] overloads and the shield vanishes!</span>")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 75, 0)
else
if(shield_health < max_shield_health / 4) // Play a more urgent sounding beep if it's at 25% health.
playsound(get_turf(src), 'sound/machines/defib_success.ogg', 75, 0)
else
playsound(get_turf(src), 'sound/machines/defib_SafetyOn.ogg', 75, 0)
last_damaged_time = world.time
update_shield_colors()
// Makes shields become gradually more red as the projector's health decreases.
/obj/item/shield_projector/proc/update_shield_colors()
// This is done at the projector instead of the shields themselves to avoid needing to calculate this more than once every update.
var/lerp_weight = shield_health / max_shield_health
var/list/low_color_list = hex2rgb(low_color)
var/low_r = low_color_list[1]
var/low_g = low_color_list[2]
var/low_b = low_color_list[3]
var/list/high_color_list = hex2rgb(high_color)
var/high_r = high_color_list[1]
var/high_g = high_color_list[2]
var/high_b = high_color_list[3]
var/new_r = Interpolate(low_r, high_r, weight = lerp_weight)
var/new_g = Interpolate(low_g, high_g, weight = lerp_weight)
var/new_b = Interpolate(low_b, high_b, weight = lerp_weight)
var/new_color = rgb(new_r, new_g, new_b)
// Now deploy the new color to all the shields.
for(var/obj/effect/directional_shield/S in active_shields)
S.update_color(new_color)
/obj/item/shield_projector/attack_self(var/mob/living/user)
if(active)
if(always_on)
to_chat(user, "<span class='warning'>You can't seem to deactivate \the [src].</span>")
return
destroy_shields()
else
set_dir(user.dir) // Needed for linear shields.
create_shields()
visible_message("<span class='notice'>\The [user] [!active ? "de":""]activates \the [src].</span>")
/obj/item/shield_projector/process()
if(shield_health < max_shield_health && ( (last_damaged_time + shield_regen_delay) < world.time) )
adjust_health(shield_regen_amount)
if(always_on && !active) // Make shields as soon as possible if this is set.
create_shields()
if(shield_health == max_shield_health)
playsound(get_turf(src), 'sound/machines/defib_ready.ogg', 75, 0)
else
playsound(get_turf(src), 'sound/machines/defib_safetyOff.ogg', 75, 0)
/obj/item/shield_projector/examine(var/mob/user)
..()
if(get_dist(src, user) <= 1)
to_chat(user, "\The [src]'s shield matrix is at [round( (shield_health / max_shield_health) * 100, 0.01)]% strength.")
/obj/item/shield_projector/emp_act(var/severity)
adjust_health(-max_shield_health / severity) // A strong EMP will kill the shield instantly, but weaker ones won't on the first hit.
/obj/item/shield_projector/Move(var/newloc, var/direct)
..(newloc, direct)
update_shield_positions()
/obj/item/shield_projector/on_loc_moved(var/newloc, var/direct)
update_shield_positions()
// Subtypes
/obj/item/shield_projector/rectangle
name = "rectangular combat shield projector"
description_info = "This creates a shield in a rectangular shape, which allows projectiles to leave from inside but blocks projectiles from outside. \
Everything else can pass through the shield freely, including other people and thrown objects. The shield also cannot block certain effects which \
take place over an area, such as flashbangs or explosions."
var/size_x = 3 // How big the rectangle will be, in tiles from the center.
var/size_y = 3 // Ditto.
// Weaker and smaller variant.
/obj/item/shield_projector/rectangle/weak
shield_health = 200 // Half as strong as the default.
max_shield_health = 200
size_x = 2
size_y = 2
// A shortcut for admins to spawn in to put into simple animals or other things where it needs to reactivate automatically.
/obj/item/shield_projector/rectangle/automatic
always_on = TRUE
/obj/item/shield_projector/rectangle/automatic/weak
shield_health = 200 // Half as strong as the default.
max_shield_health = 200
size_x = 2
size_y = 2
// Horrible implementation below.
/obj/item/shield_projector/rectangle/create_shields()
if(!..())
return FALSE
// Make a rectangle in a really terrible way.
var/x_dist = size_x
var/y_dist = size_y
var/turf/T = get_turf(src)
if(!T)
return FALSE
// Top left corner.
var/turf/T1 = locate(T.x - x_dist, T.y + y_dist, T.z)
// Bottom right corner.
var/turf/T2 = locate(T.x + x_dist, T.y - y_dist, T.z)
if(!T1 || !T2) // If we're on the edge of the map then don't bother.
return FALSE
// Build half of the corners first, as they are 'anchors' for the rest of the code below.
create_shield(T1, NORTHWEST)
create_shield(T2, SOUTHEAST)
// Build the edges.
// First start with the north side.
var/current_x = T1.x + 1 // Start next to the top left corner.
var/current_y = T1.y
var/length = (x_dist * 2) - 1
for(var/i = 1 to length)
create_shield(locate(current_x, current_y, T.z), NORTH)
current_x++
// Make the top right corner.
create_shield(locate(current_x, current_y, T.z), NORTHEAST)
// Now for the west edge.
current_x = T1.x
current_y = T1.y - 1
length = (y_dist * 2) - 1
for(var/i = 1 to length)
create_shield(locate(current_x, current_y, T.z), WEST)
current_y--
// Make the bottom left corner.
create_shield(locate(current_x, current_y, T.z), SOUTHWEST)
// Switch to the second corner, and make the east edge.
current_x = T2.x
current_y = T2.y + 1
length = (y_dist * 2) - 1
for(var/i = 1 to length)
create_shield(locate(current_x, current_y, T.z), EAST)
current_y++
// There are no more corners to create, so we can just go build the south edge now.
current_x = T2.x - 1
current_y = T2.y
length = (x_dist * 2) - 1
for(var/i = 1 to length)
create_shield(locate(current_x, current_y, T.z), SOUTH)
current_x--
// Finally done.
update_shield_colors()
return TRUE
/obj/item/shield_projector/line
name = "linear combat shield projector"
description_info = "This creates a shield in a straight line perpendicular to the direction where the user was facing when it was activated. \
The shield allows projectiles to leave from inside but blocks projectiles from outside. Everything else can pass through the shield freely, \
including other people and thrown objects. The shield also cannot block certain effects which take place over an area, such as flashbangs or explosions."
var/line_length = 5 // How long the line is. Recommended to be an odd number.
var/offset_from_center = 2 // How far from the projector will the line's center be.
/obj/item/shield_projector/line/create_shields()
if(!..())
return FALSE
var/turf/T = get_turf(src) // This is another 'anchor', or will be once we move away from the projector.
for(var/i = 1 to offset_from_center)
T = get_step(T, dir)
if(!T) // We went off the map or something.
return
// We're at the right spot now. Build the center piece.
create_shield(T, dir)
var/length_to_build = round( (line_length - 1) / 2)
var/turf/temp_T = T
// First loop, we build the left (from a north perspective) side of the line.
for(var/i = 1 to length_to_build)
temp_T = get_step(temp_T, turn(dir, 90) )
if(!temp_T)
break
create_shield(temp_T, i == length_to_build ? turn(dir, 45) : dir)
temp_T = T
// Second loop, we build the right side.
for(var/i = 1 to length_to_build)
temp_T = get_step(temp_T, turn(dir, -90) )
if(!temp_T)
break
create_shield(temp_T, i == length_to_build ? turn(dir, -45) : dir)
// Finished.
update_shield_colors()
return TRUE

View File

@@ -93,6 +93,13 @@
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/grey_slimejelly
name = "Slime Jelly"
id = "m_jelly"
result = "slimejelly"
required_reagents = list("peridaxon" = 5)
result_amount = 15
required = /obj/item/slime_extract/grey
// ****************
// * Metal slimes *