mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into tracking_implant
This commit is contained in:
@@ -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
|
||||
13
code/modules/clothing/suits/aliens/tajara.dm
Normal file
13
code/modules/clothing/suits/aliens/tajara.dm
Normal 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
|
||||
13
code/modules/clothing/suits/aliens/unathi.dm
Normal file
13
code/modules/clothing/suits/aliens/unathi.dm
Normal 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
|
||||
10
code/modules/clothing/suits/aliens/vox.dm
Normal file
10
code/modules/clothing/suits/aliens/vox.dm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
37
code/modules/mob/_modifiers/cloning.dm
Normal file
37
code/modules/mob/_modifiers/cloning.dm
Normal 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
|
||||
10
code/modules/mob/_modifiers/traits.dm
Normal file
10
code/modules/mob/_modifiers/traits.dm
Normal 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
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
)
|
||||
|
||||
)
|
||||
@@ -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)
|
||||
|
||||
347
code/modules/shieldgen/directional_shield.dm
Normal file
347
code/modules/shieldgen/directional_shield.dm
Normal 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
|
||||
@@ -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 *
|
||||
|
||||
Reference in New Issue
Block a user