Applies what my mom taught me about conflict resolution

This commit is contained in:
Dave
2019-03-01 16:16:29 -05:00
committed by Unknown
140 changed files with 2769 additions and 833 deletions
+1
View File
@@ -72,6 +72,7 @@
H.mind_initialize()
H.mind.assigned_role = "Event Character"
H.mind.special_role = "Event Character"
H.mind.offstation_role = TRUE
H.key = thisplayer.key
+1
View File
@@ -93,6 +93,7 @@ var/global/sent_honksquad = 0
new_honksquad.mind_initialize()
new_honksquad.mind.assigned_role = SPECIAL_ROLE_HONKSQUAD
new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD
new_honksquad.mind.offstation_role = TRUE
new_honksquad.add_language("Clownish")
ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
new_honksquad.equip_honksquad(honk_leader_selected)
@@ -131,6 +131,7 @@ var/global/sent_syndicate_infiltration_team = 0
new_syndicate_infiltrator.mind_initialize()
new_syndicate_infiltrator.mind.assigned_role = "Syndicate Infiltrator"
new_syndicate_infiltrator.mind.special_role = "Syndicate Infiltrator"
new_syndicate_infiltrator.mind.offstation_role = TRUE //they can flee to z2 so make them inelligible as antag targets
ticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list
new_syndicate_infiltrator.equip_syndicate_infiltrator(syndicate_leader_selected, uplink_tc, is_mgmt)
return new_syndicate_infiltrator
+1 -1
View File
@@ -415,7 +415,7 @@ client/proc/one_click_antag()
new_syndicate_commando.mind_initialize()
new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
new_syndicate_commando.mind.offstation_role = TRUE
//Adds them to current traitor list. Which is really the extra antagonist list.
ticker.mode.traitors += new_syndicate_commando.mind
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
+2 -1
View File
@@ -85,6 +85,7 @@ var/global/sent_strike_team = 0
R.mind.original = R
R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
R.mind.offstation_role = TRUE
if(!(R.mind in ticker.minds))
ticker.minds += R.mind
ticker.mode.traitors += R.mind
@@ -178,7 +179,7 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
if(is_leader)
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/disk/nuclear/unrestricted(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
@@ -116,6 +116,7 @@ var/global/sent_syndicate_strike_team = 0
new_syndicate_commando.mind_initialize()
new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
new_syndicate_commando.mind.offstation_role = TRUE
ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list.
new_syndicate_commando.equip_syndicate_commando(is_leader)
qdel(spawn_location)
@@ -139,7 +140,7 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
if(is_leader)
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/disk/nuclear/unrestricted(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_r_store)
@@ -19,6 +19,7 @@
var/checking = FALSE
var/TC_cost = 0
var/borg_to_spawn
var/upload_mind
var/list/possible_types = list("Assault", "Medical", "Saboteur")
/obj/item/antag_spawner/borg_tele/attack_self(mob/user)
@@ -34,20 +35,42 @@
borg_to_spawn = input("What type of borg would you like to teleport?", "Cyborg Type", type) as null|anything in possible_types
if(!borg_to_spawn || checking || used)
return
checking = TRUE
to_chat(user, "<span class='notice'>The device is now checking for possible borgs.</span>")
var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1)
if(borg_candidates.len > 0 && !used)
checking = FALSE
used = TRUE
var/mob/M = pick(borg_candidates)
var/client/C = M.client
spawn_antag(C, get_turf(src.loc), "syndieborg")
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
upload_mind = input("Would you like to continue playing as an operative or take over the cyborg? (Another player will control your old self)", "Play as") as null|anything in list("Nuclear Operative", "Syndicate Cyborg")
if(!upload_mind || checking || used)
return
if(upload_mind == "Nuclear Operative")
checking = TRUE
to_chat(user, "<span class='notice'>The device is now checking for possible borgs.</span>")
var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1)
if(borg_candidates.len > 0 && !used)
checking = FALSE
used = TRUE
var/mob/M = pick(borg_candidates)
var/client/C = M.client
spawn_antag(C, get_turf(loc), "syndieborg")
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
return
else if(upload_mind == "Syndicate Cyborg")
checking = TRUE
to_chat(user, "<span class='notice'>You attempt to upload your consciousness into a new syndicate cyborg.</span>")
var/list/nuclear_candidates = pollCandidates("Do you want to play as the Syndicate Nuclear Operative [user.real_name]?", ROLE_OPERATIVE, 1)
if(nuclear_candidates.len > 0 && !used)
checking = FALSE
used = TRUE
var/mob/M = pick(nuclear_candidates)
var/client/nukeop_client = M.client
var/client/borg_client = user.client
spawn_antag(borg_client, get_turf(loc), "syndieborg")
user.key = nukeop_client.key
ticker.mode.greet_syndicate(user.mind)
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
return
/obj/item/antag_spawner/borg_tele/spawn_antag(client/C, turf/T, type = "")
if(!borg_to_spawn) //If there's no type at all, let it still be used but don't do anything
@@ -85,6 +85,8 @@
var/datum/species/golem/X = mob_species
to_chat(new_spawn, "[initial(X.info_text)]")
if(!owner)
to_chat(new_spawn, "<span class='notice'>It is common in free golem societies to respect Adamantine golems as elders, however you do not have to obey them. \
Adamantine golems are the only golems that can resonate to all golems.</span>")
to_chat(new_spawn, "Build golem shells in the autolathe, and feed refined mineral sheets to the shells to bring them to life! You are generally a peaceful group unless provoked.")
to_chat(new_spawn, "<span class='warning'>You are not an antagonist, but you are not a crewmember either. \
You may interact or trade with crew you come across, aswell as defend yourself and your ship \
+13
View File
@@ -81,6 +81,19 @@
time = 60
category = CAT_ROBOT
/datum/crafting_recipe/griefsky
name = "General Griefsky"
result = /mob/living/simple_animal/bot/secbot/griefsky
reqs = list(/obj/item/assembly/signaler = 1,
/obj/item/clothing/head/helmet = 1,
/obj/item/melee/energy/sword = 4,
/obj/item/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 2,
/obj/item/robot_parts/l_arm = 2)
tools = list(/obj/item/weldingtool)
time = 120
category = CAT_ROBOT
/datum/crafting_recipe/cleanbot
name = "Cleanbot"
result = /mob/living/simple_animal/bot/cleanbot
+1 -1
View File
@@ -17,7 +17,7 @@
while(db_discord_id.NextRow())
stored_id = db_discord_id.item[1]
if(!stored_id) // Not linked
var/know_how = alert("Do you know how to get a discord user ID?","Question","Yes","No")
var/know_how = alert("Do you know how to get a discord user ID? This ID is NOT your discord username and numbers!","Question","Yes","No")
if(know_how == "No") // Opens discord support on how to collect IDs
src << link("https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID")
var/entered_id = input("Please enter your Discord ID.", "Enter Discord ID", null, null) as text|null
+1 -1
View File
@@ -40,7 +40,7 @@ We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/
event_announcement.Announce("The Aurora Caelus event is now ending. Starlight conditions will slowly return to normal. \
When this has concluded, please return to your workplace and continue work as normal. \
Have a pleasant shift, [station_name()], and thank you for watching with us.",
"Harmless ions approaching", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division")
"Harmless ions dissipating", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division")
/datum/event/aurora_caelus/proc/fade_to_black(turf/space/S)
set waitfor = FALSE
+3 -1
View File
@@ -33,7 +33,9 @@
SA.key = SG.key
SA.universal_speak = 1
SA.sentience_act()
SA.maxHealth = max(SA.maxHealth, 200)
SA.maxHealth = max(SA.maxHealth + 200)
SA.melee_damage_lower = max(SA.melee_damage_lower + 15)
SA.melee_damage_upper = max(SA.melee_damage_upper + 15)
SA.health = SA.maxHealth
SA.del_on_death = FALSE
greet_sentient(SA)
+2 -2
View File
@@ -33,8 +33,8 @@
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen
spawncount = 1
if(5)
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/mother
spawncount = 1
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/princess
spawncount = 2
while(spawncount >= 1 && vents.len)
var/obj/machinery/atmospherics/unary/vent_pump/vent = pick(vents)
+1
View File
@@ -47,6 +47,7 @@ var/global/list/unused_trade_stations = list("sol")
M.equipOutfit(/datum/outfit/admin/sol_trader)
M.dna.species.after_equip_job(null, M)
M.mind.objectives += trader_objectives
M.mind.offstation_role = TRUE
greet_trader(M)
success_spawn = 1
if(success_spawn)
@@ -201,7 +201,7 @@
icon_state = "COOKIE!!!"
bitesize = 1
filling_color = "#DBC94F"
list_reagents = list("nutriment" = 1)
list_reagents = list("nutriment" = 1, "sugar" = 3, "hot_coco" = 5 )
/obj/item/reagent_containers/food/snacks/fortunecookie
name = "fortune cookie"
@@ -215,7 +215,7 @@
name = "sugar cookie"
desc = "Just like your little sister used to make."
icon_state = "sugarcookie"
list_reagents = list("nutriment" = 3, "sugar" = 3)
list_reagents = list("nutriment" = 1, "sugar" = 3)
//////////////////////
@@ -129,6 +129,71 @@
list_reagents = list("nutriment" = 1)
///cookies by Ume
/obj/item/reagent_containers/food/snacks/cookiedough
var/flat = FALSE
name = "pastry dough"
icon = 'icons/obj/food/food_ingredients.dmi'
desc = "The base for tasty cookies."
icon_state = "cookiedough"
list_reagents = list("nutriment" = 5, "sugar" = 5)
/obj/item/reagent_containers/food/snacks/cookiedough/update_icon()
if(flat)
icon_state = "cookiedough_flat"
name = "flat pastry dough"
else
icon_state = "cookiedough"
// Dough + rolling pin = flat cookie dough // Flat dough + circular cutter = unbaked cookies
/obj/item/reagent_containers/food/snacks/cookiedough/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/kitchen/rollingpin) && !flat)
if(isturf(loc))
to_chat(user, "<span class='notice'>You flatten [src].</span>")
flat = TRUE
update_icon()
else
to_chat(user, "<span class='notice'>You need to put [src] on a surface to roll it out!</span>")
else if(istype(I, /obj/item/kitchen/cutter) && flat)
if(isturf(loc))
new /obj/item/reagent_containers/food/snacks/rawcookies(loc)
to_chat(user, "<span class='notice'>You cut [src] into cookies.</span>")
qdel(src)
else
to_chat(user, "<span class='notice'>You need to put [src] on a surface to cut it out!</span>")
else
return ..()
/obj/item/reagent_containers/food/snacks/rawcookies
name = "raw cookies"
desc = "Ready for oven!"
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "unbaked_cookies"
list_reagents = list("nutriment" = 5, "sugar" = 5)
/obj/item/reagent_containers/food/snacks/rawcookies/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers/food/snacks/choc_pile))
if(isturf(loc))
new /obj/item/reagent_containers/food/snacks/rawcookies/chocochips(loc)
to_chat(user, "<span class='notice'>You sprinkle [I] all over the cookies.</span>")
qdel(src)
qdel(I)
else
to_chat(user, "<span class='notice'>You need to put [src] on a surface to add this</span>")
else
return ..()
/obj/item/reagent_containers/food/snacks/rawcookies/chocochips
name = "raw cookies"
desc = "Ready for oven! They have little pieces of chocolate all over them"
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "unbaked_cookies_choco"
list_reagents = list("nutriment" = 5, "sugar" = 5, "chocolate" = 5)
//////////////////////
// Chocolate //
//////////////////////
@@ -140,6 +205,19 @@
filling_color = "#7D5F46"
list_reagents = list("nutriment" = 2, "sugar" = 2, "cocoa" = 2)
///Chocolate crumbles/pile
/obj/item/reagent_containers/food/snacks/chocolatebar/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/kitchen/knife))
if(isturf(loc))
new /obj/item/reagent_containers/food/snacks/choc_pile(loc)
to_chat(user, "<span class='notice'>You cut [src] into little crumbles.</span>")
qdel(src)
else
to_chat(user, "<span class='notice'>You need to put [src] on a surface to cut it out!</span>")
else
return ..()
/obj/item/reagent_containers/food/snacks/choc_pile //for reagent chocolate being spilled on turfs
name = "pile of chocolate"
desc = "A pile of pure chocolate pieces."
@@ -163,13 +163,22 @@
)
result = /obj/item/reagent_containers/food/snacks/loadedbakedpotato
/datum/recipe/oven/cookie
reagents = list("milk" = 5, "sugar" = 5)
////cookies by Ume
/datum/recipe/oven/cookies
items = list(
/obj/item/reagent_containers/food/snacks/dough,
/obj/item/reagent_containers/food/snacks/chocolatebar,
/obj/item/reagent_containers/food/snacks/rawcookies/chocochips,
)
result = /obj/item/reagent_containers/food/snacks/cookie
result = /obj/item/storage/bag/tray/cookies_tray
/datum/recipe/oven/sugarcookies
items = list(
/obj/item/reagent_containers/food/snacks/rawcookies,
)
result = /obj/item/storage/bag/tray/cookies_tray/sugarcookie
////
/datum/recipe/oven/fortunecookie
reagents = list("sugar" = 5)
@@ -437,14 +446,6 @@
)
result = /obj/item/reagent_containers/food/snacks/cracker
/datum/recipe/oven/sugarcookie
reagents = list("sugar" = 5)
items = list(
/obj/item/reagent_containers/food/snacks/dough,
/obj/item/reagent_containers/food/snacks/egg,
)
result = /obj/item/reagent_containers/food/snacks/sugarcookie
/datum/recipe/oven/sugarcookie/make_food(obj/container)
var/obj/item/reagent_containers/food/snacks/sugarcookie/being_cooked = ..()
being_cooked.reagents.del_reagent("egg")
+2 -2
View File
@@ -460,12 +460,12 @@
prize_list += list(
new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/golem, 250),
new /datum/data/mining_equipment("Science Backpack", /obj/item/storage/backpack/science, 250),
new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250),
new /datum/data/mining_equipment("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250),
new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250),
new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000),
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 1500)
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
)
/datum/data/mining_equipment/
+8 -1
View File
@@ -19,10 +19,17 @@
var/obj/item/radio/radio = null // For use with the radio MMI upgrade
var/datum/action/generic/configure_mmi_radio/radio_action = null
// Used for cases when mmi or one of it's children commits suicide.
// Needed to fix a rather insane bug when a posibrain/robotic brain commits suicide
var/dead_icon = "mmi_dead"
/obj/item/mmi/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/organ/internal/brain/crystal ))
if(istype(O, /obj/item/organ/internal/brain/crystal))
to_chat(user, "<span class='warning'> This brain is too malformed to be able to use with the [src].</span>")
return
if(istype(O, /obj/item/organ/internal/brain/golem))
to_chat(user, "<span class='warning'>You can't find a way to plug [O] into [src].</span>")
return
if(istype(O,/obj/item/organ/internal/brain) && !brainmob) //Time to stick a brain in it --NEO
var/obj/item/organ/internal/brain/B = O
if(!B.brainmob)
@@ -4,8 +4,9 @@
if(!.)
return FALSE
if(!gibbed && container && istype(container, /obj/item/mmi))//If not gibbed but in a container.
var/obj/item/mmi/mmi = container
visible_message("<span class='danger'>[src]'s MMI flatlines!</span>", "<span class='warning'>You hear something flatline.</span>")
container.icon_state = "mmi_dead"
mmi.icon_state = mmi.dead_icon
/mob/living/carbon/brain/gib()
// can we muster a parent call here?
@@ -21,11 +21,16 @@
var/mob/living/carbon/human/imprinted_master = null
var/ejected_flavor_text = "circuit"
dead_icon = "boris_blank"
/obj/item/mmi/robotic_brain/Destroy()
imprinted_master = null
return ..()
/obj/item/mmi/robotic_brain/attack_self(mob/user)
if(isgolem(user))
to_chat(user, "<span class='warning'>Your golem fingers are too large to press the switch on [src].</span>")
return
if(requires_master && !imprinted_master)
to_chat(user, "<span class='notice'>You press your thumb on [src] and imprint your user information.</span>")
imprinted_master = user
@@ -228,4 +233,5 @@
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
silenced = TRUE
requires_master = FALSE
ejected_flavor_text = "metal cube"
ejected_flavor_text = "metal cube"
dead_icon = "posibrain"
+5
View File
@@ -147,6 +147,7 @@
if(reagents.has_reagent("teslium"))
shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging!
take_overall_damage(0,shock_damage, TRUE, used_weapon = "Electrocution")
shock_internal_organs(shock_damage)
visible_message(
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
@@ -1116,3 +1117,7 @@ so that different stomachs can handle things in different ways VB*/
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
/mob/living/carbon/proc/shock_internal_organs(intensity)
for(var/obj/item/organ/O in internal_organs)
O.shock_organ(intensity)
@@ -37,6 +37,9 @@ var/global/list/empty_playable_ai_cores = list()
var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode
current_mode.possible_traitors.Remove(src)
// Ghost the current player and disallow them to return to the body
ghostize(FALSE)
// Delete the old AI shell
qdel(src)
// TODO: Move away from the insane name-based landmark system
@@ -63,6 +63,7 @@
var/new_destination // pending new destination (waiting for beacon response)
var/destination // destination description tag
var/next_destination // the next destination in the patrol route
var/robot_arm = /obj/item/robot_parts/r_arm
var/blockcount = 0 //number of times retried a blocked path
var/awaiting_beacon = 0 // count of pticks awaiting a beacon response
@@ -1106,3 +1107,6 @@ Pass a positive integer as an argument to override a bot's default speed.
if(I)
I.icon = null
path.Cut(1, 2)
/mob/living/simple_animal/bot/proc/drop_part(obj/item/drop_item, dropzone)
new drop_item(dropzone)
@@ -179,14 +179,10 @@
on = 0
visible_message("<span class='userdanger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
new /obj/item/reagent_containers/glass/bucket(Tsec)
new /obj/item/assembly/prox_sensor(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
drop_part(robot_arm, Tsec)
do_sparks(3, 1, src)
..()
@@ -1,4 +1,5 @@
//Bot Construction
var/robot_arm = /obj/item/robot_parts/l_arm
//Cleanbot assembly
/obj/item/bucket_sensor
@@ -22,6 +23,7 @@
var/turf/T = get_turf(loc)
var/mob/living/simple_animal/bot/cleanbot/A = new /mob/living/simple_animal/bot/cleanbot(T)
A.name = created_name
A.robot_arm = W.type
to_chat(user, "<span class='notice'>You add the robot arm to the bucket and sensor assembly. Beep boop!</span>")
user.unEquip(src, 1)
qdel(src)
@@ -268,6 +270,7 @@
var/turf/T = get_turf(user.loc)
var/mob/living/simple_animal/bot/floorbot/A = new /mob/living/simple_animal/bot/floorbot(T)
A.name = created_name
A.robot_arm = W.type
to_chat(user, "<span class='notice'>You add the robot arm to the odd looking toolbox assembly. Boop beep!</span>")
user.unEquip(src, 1)
qdel(src)
@@ -284,7 +287,10 @@
//Medbot Assembly
/obj/item/storage/firstaid/attackby(obj/item/I, mob/user, params)
if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm))
return ..()
return ..()
else
robot_arm = I.type
//Making a medibot!
if(contents.len)
@@ -292,7 +298,7 @@
return
var/obj/item/firstaid_arm_assembly/A = new /obj/item/firstaid_arm_assembly(loc, med_bot_skin)
A.req_one_access = req_one_access
A.syndicate_aligned = syndicate_aligned
A.treatment_oxy = treatment_oxy
@@ -377,6 +383,7 @@
S.treatment_fire = treatment_fire
S.treatment_tox = treatment_tox
S.treatment_virus = treatment_virus
S.robot_arm = robot_arm
else
new /mob/living/simple_animal/bot/medbot/syndicate(T) //Syndicate medibots are a special case that have so many unique vars on them, it's not worth passing them through construction phases
user.unEquip(src, 1)
@@ -389,8 +396,8 @@
icon = 'icons/obj/aibots.dmi'
icon_state = "helmet_signaler"
item_state = "helmet"
var/build_step = 0
var/created_name = "Securitron" //To preserve the name if it's a unique securitron I guess
var/build_step = 0
/obj/item/clothing/head/helmet/attackby(obj/item/assembly/signaler/S, mob/user, params)
..()
@@ -440,6 +447,7 @@
to_chat(user, "<span class='notice'>You add the robot arm to [src]!</span>")
name = "helmet/signaler/prox sensor/robot arm assembly"
overlays += "hs_arm"
robot_arm = I.type
qdel(I)
else if((istype(I, /obj/item/melee/baton)) && (build_step >= 3))
@@ -450,6 +458,7 @@
var/mob/living/simple_animal/bot/secbot/S = new /mob/living/simple_animal/bot/secbot
S.forceMove(get_turf(src))
S.name = created_name
S.robot_arm = robot_arm
qdel(I)
qdel(src)
@@ -481,10 +490,74 @@
to_chat(user, "<span class='notice'>You remove the robot arm from [src].</span>")
build_step--
//General Griefsky
else if((istype(I, /obj/item/wrench)) && (build_step == 3))
var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly
user.put_in_hands(A)
to_chat(user, "<span class='notice'>You adjust the arm slots for extra weapons!.</span>")
user.unEquip(src, 1)
qdel(src)
/obj/item/griefsky_assembly
name = "\improper Griefsky assembly"
desc = "Some sort of bizarre assembly."
icon = 'icons/obj/aibots.dmi'
icon_state = "griefsky_assembly"
item_state = "griefsky_assembly"
var/build_step = 0
var/toy_step = 0
/obj/item/griefsky_assembly/attackby(obj/item/I, mob/user, params)
..()
if((istype(I, /obj/item/melee/energy/sword)) && (build_step < 3 ))
if(!user.unEquip(I))
return
build_step++
to_chat(user, "<span class='notice'>You add an energy sword to [src]!.</span>")
qdel(I)
else if((istype(I, /obj/item/melee/energy/sword)) && (build_step == 3))
if(!user.unEquip(I))
return
to_chat(user, "<span class='notice'>You complete General Griefsky!.</span>")
var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky
S.forceMove(get_turf(src))
qdel(I)
qdel(src)
else if((istype(I, /obj/item/toy/sword)) && (toy_step < 3 ))
if(!user.unEquip(I))
return
toy_step++
to_chat(user, "<span class='notice'>You add a toy sword to [src]!.</span>")
qdel(I)
else if((istype(I, /obj/item/toy/sword)) && (toy_step == 3))
if(!user.unEquip(I))
return
to_chat(user, "<span class='notice'>You complete Genewul Giftskee!.</span>")
var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy
S.forceMove(get_turf(src))
qdel(I)
qdel(src)
else if(istype(I, /obj/item/screwdriver))
if((build_step == 1) || (build_step == 2) || (build_step == 3) || (build_step == 4))
new /obj/item/melee/energy/sword(get_turf(src))
to_chat(user, "<span class='notice'>You detach the energy sword from [src].</span>")
build_step--
else if((toy_step == 1) || (toy_step == 2) || (toy_step == 3) || (toy_step == 4))
new /obj/item/toy/sword(get_turf(src))
to_chat(user, "<span class='notice'>You detach the toy sword from [src].</span>")
toy_step--
//Honkbot Assembly
/obj/item/storage/box/clown/attackby(obj/item/W, mob/user, params)
if(!istype(W, /obj/item/robot_parts/l_arm) && !istype(W, /obj/item/robot_parts/r_arm))
return ..()
else
robot_arm = W.type
if(contents.len)
to_chat(user, "<span class='warning'>You need to empty [src] out first!</span>")
@@ -531,5 +604,6 @@
return
to_chat(user, "<span class='notice'>You add the trombone to [src]! Heeeenk! </span>")
qdel(W)
new /mob/living/simple_animal/bot/honkbot(get_turf(loc))
var/mob/living/simple_animal/bot/honkbot/A = new /mob/living/simple_animal/bot/honkbot(T)
A.robot_arm = robot_arm
qdel(src)
@@ -388,14 +388,11 @@
on = 0
visible_message("<span class='userdanger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/obj/item/storage/toolbox/mechanical/N = new /obj/item/storage/toolbox/mechanical(Tsec)
N.contents = list()
new /obj/item/assembly/prox_sensor(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
drop_part(robot_arm, Tsec)
while(amount)//Dumps the tiles into the appropriate sized stacks
if(amount >= 16)
@@ -0,0 +1,231 @@
/mob/living/simple_animal/bot/secbot/griefsky //This bot is powerful. If you managed to get 4 eswords somehow, you deserve this horror. Emag him for best results.
name = "\improper General Griefsky"
desc = "Is that a secbot with four eswords in its arms...?"
icon_state = "griefsky0"
health = 100
maxHealth = 100
base_icon = "griefsky"
window_name = "Automatic Security Unit v3.0"
var/spin_icon = "griefsky-c" // griefsky and griefsky junior have dif icons
var/weapon = /obj/item/melee/energy/sword
var/block_chance = 50 //block attacks
var/reflect_chance = 80 // chance to reflect projectiles
var/dmg = 30 //esword dmg
var/block_chance_melee = 50
var/block_chance_ranged = 90
var/stun_chance = 50
var/spam_flag = 0
/mob/living/simple_animal/bot/secbot/griefsky/toy //A toy version of general griefsky!
name = "Genewul Giftskee"
desc = "An adorable looking secbot with four toy swords taped to its arms"
spin_icon = "griefskyj-c"
health = 50
maxHealth = 50
radio_channel = "Service" //we dont report sec anymore!
dmg = 0
block_chance_melee = 1
block_chance_ranged = 1
stun_chance = 0
bot_core_type = /obj/machinery/bot_core/toy
weapon = /obj/item/toy/sword
/obj/machinery/bot_core/toy
req_access = list(access_maint_tunnels, access_theatre, access_robotics)
/mob/living/simple_animal/bot/secbot/griefsky/proc/spam_flag_false() //used for addtimer to not spam comms
spam_flag = 0
/mob/living/simple_animal/bot/secbot/griefsky/back_to_idle()
..()
playsound(loc, 'sound/weapons/saberoff.ogg', 50, 1, -1)
/mob/living/simple_animal/bot/secbot/griefsky/emag_act(mob/user)
..()
light_color = LIGHT_COLOR_PURE_RED //if you see a red one. RUN!!
/mob/living/simple_animal/bot/secbot/griefsky/Crossed(atom/movable/AM)
..()
if(ismob(AM) && AM == target)
var/mob/living/carbon/C = AM
visible_message("[src] flails his swords and pushes [C] out of it's way!" )
C.Weaken(2)
/mob/living/simple_animal/bot/secbot/griefsky/New()
..()
/mob/living/simple_animal/bot/secbot/griefsky/Destroy()
QDEL_NULL(weapon)
return ..()
/mob/living/simple_animal/bot/secbot/griefsky/UnarmedAttack(atom/A) //like secbots its only possible with admin intervention
if(!on)
return
if(iscarbon(A))
var/mob/living/carbon/C = A
sword_attack(C)
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized
retaliate(P.firer)
if((icon_state == spin_icon) && (prob(block_chance_ranged))) //only when the eswords are on
visible_message("[src] deflects [P] with its energy swords!")
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, 0)
else
..()
/mob/living/simple_animal/bot/secbot/griefsky/proc/sword_attack(mob/living/carbon/C) // esword attack
src.do_attack_animation(C)
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, -1)
spawn(2)
icon_state = spin_icon
var/threat = C.assess_threat(src)
if(ishuman(C))
C.apply_damage(dmg, BRUTE)
if(prob(stun_chance))
C.Weaken(5)
add_attack_logs(src, C, "sliced")
if(declare_arrests)
var/area/location = get_area(src)
if(!spam_flag)
speak("Back away! I will deal with this level [threat] swine <b>[C]</b> in [location] myself!.", radio_channel)
spam_flag = 1
addtimer(CALLBACK(src, .proc/spam_flag_false), 100) //to avoid spamming comms of sec for each hit
visible_message("[src] flails his swords and cuts [C]!")
/mob/living/simple_animal/bot/secbot/griefsky/handle_automated_action()
if(!on)
return
switch(mode)
if(BOT_IDLE) // idle
icon_state = "griefsky1"
walk_to(src,0)
look_for_perp() // see if any criminals are in range
if(!mode && auto_patrol) // still idle, and set to patrol
mode = BOT_START_PATROL // switch to patrol mode
if(BOT_HUNT) // hunting for perp
icon_state = spin_icon
playsound(loc,'sound/effects/spinsabre.ogg',100,1,-1)
if(frustration >= 15) // general beepsky doesn't give up so easily, jedi scum
walk_to(src,0)
back_to_idle()
return
if(target) // make sure target exists
if(target.stat == !DEAD)
if(Adjacent(target) && isturf(target.loc)) // if right next to perp
target_lastloc = target.loc
sword_attack(target)
anchored = TRUE
frustration++
return
else // not next to perp
var/turf/olddist = get_dist(src, target)
walk_to(src, target,1,3) //he's a fast fucker
if((get_dist(src, target)) >= (olddist))
frustration++
else
frustration = 0
else
back_to_idle()
speak("You fool")
else
back_to_idle()
if(BOT_START_PATROL)
look_for_perp()
start_patrol()
if(BOT_PATROL)
icon_state = "griefsky1"
look_for_perp()
bot_patrol()
return
/mob/living/simple_animal/bot/secbot/griefsky/look_for_perp()
anchored = 0
for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
if((C.stat) || (C.handcuffed))
continue
if((C.name == oldtarget_name) && (world.time < last_found + 100))
continue
threatlevel = C.assess_threat(src)
if(!threatlevel)
continue
else if(threatlevel >= 4)
target = C
oldtarget_name = C.name
speak("You are a bold one")
playsound(src,'sound/weapons/saberon.ogg',50,TRUE,-1)
visible_message("[src] ignites his energy swords!")
icon_state = "griefsky-c"
visible_message("<b>[src]</b> points at [C.name]!")
mode = BOT_HUNT
INVOKE_ASYNC(src, .proc/handle_automated_action)
break
else
continue
/mob/living/simple_animal/bot/secbot/griefsky/explode()
walk_to(src,0)
visible_message("<span class='boldannounce'>[src] lets out a huge cough as it blows apart!</span>")
var/turf/Tsec = get_turf(src)
new /obj/item/assembly/prox_sensor(Tsec)
if(prob(50))
new /obj/item/robot_parts/r_arm(Tsec)
if(prob(50)) //most of the time weapon will be destroyed
new weapon(Tsec)
if(prob(25))
new weapon(Tsec)
if(prob(10))
new weapon(Tsec)
if(prob(5))
new weapon(Tsec)
do_sparks(3, 1, src)
new /obj/effect/decal/cleanable/blood/oil(loc)
..()
//this section is blocking attack
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized
retaliate(P.firer)
if((icon_state == spin_icon) && (prob(block_chance_ranged))) //only when the eswords are on
visible_message("[src] deflects [P] with its energy swords!")
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, 0)
else
..()
/mob/living/simple_animal/bot/secbot/griefsky/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked.
return
/mob/living/simple_animal/bot/secbot/griefsky/special_retaliate_after_attack(mob/user)
if(icon_state != spin_icon)
return
if(prob(block_chance_melee))
visible_message("[src] deflects [user]'s attack with his energy swords!")
playsound(loc, 'sound/weapons/blade1.ogg', 50, TRUE, -1)
return TRUE
/mob/living/simple_animal/bot/secbot/griefsky/attack_hand(mob/living/carbon/human/H)
if((H.a_intent == INTENT_HARM) || (H.a_intent == INTENT_DISARM))
retaliate(H)
if(special_retaliate_after_attack(H))
return
return ..()
/mob/living/simple_animal/bot/secbot/griefsky/attackby(obj/item/W, mob/user, params) //cant touch or attack him while spinning
if(src.icon_state == spin_icon)
if(prob(block_chance_melee))
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
visible_message("[src] deflects [user]'s move with his energy swords!")
playsound(loc, 'sound/weapons/blade1.ogg', 50, TRUE, -1)
else
return ..()
else
return ..()
@@ -278,16 +278,15 @@
else
continue
/mob/living/simple_animal/bot/honkbot/explode()
/mob/living/simple_animal/bot/honkbot/explode() //doesn't drop cardboard nor its assembly, since its a very frail material.
walk_to(src, 0)
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
//doesn't drop cardboard nor its assembly, since its a very frail material.
new /obj/item/bikehorn(Tsec)
new /obj/item/assembly/prox_sensor(Tsec)
if(prob(50))
new /obj/item/robot_parts/r_arm(Tsec)
new /obj/item/bikehorn(Tsec)
new /obj/item/assembly/prox_sensor(Tsec)
drop_part(robot_arm, Tsec)
new /obj/effect/decal/cleanable/blood/oil(loc)
var/datum/effect_system/spark_spread/s = new
s.set_up(3, 1, src)
s.start()
@@ -591,7 +591,7 @@
new /obj/item/healthanalyzer(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
drop_part(robot_arm, Tsec)
if(reagent_glass)
reagent_glass.forceMove(Tsec)
@@ -121,7 +121,7 @@
dat += hack(user)
dat += showpai(user)
dat += text({"
<TT><B>Securitron v1.6 controls</B></TT><BR><BR>
<TT><B>[window_name]</B></TT><BR><BR>
Status: []<BR>
Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
Maintenance panel panel is [open ? "opened" : "closed"]"},
@@ -231,9 +231,10 @@ Auto Patrol: []"},
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
C.visible_message("<span class='danger'>[src] is trying to put zipties on [C]!</span>",\
"<span class='userdanger'>[src] is trying to put zipties on you!</span>")
spawn(60)
if( !Adjacent(C) || !isturf(C.loc) ) //if he's in a closet or not adjacent, we cancel cuffing.
return
INVOKE_ASYNC(src, .proc/cuff_callback, C)
/mob/living/simple_animal/bot/secbot/proc/cuff_callback(mob/living/carbon/C)
if(do_after(src, 60, target = C))
if(!C.handcuffed)
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
C.update_handcuffed()
@@ -417,23 +418,18 @@ Auto Patrol: []"},
return 0
/mob/living/simple_animal/bot/secbot/explode()
walk_to(src,0)
visible_message("<span class='userdanger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/obj/item/secbot_assembly/Sa = new /obj/item/secbot_assembly(Tsec)
Sa.build_step = 1
Sa.overlays += "hs_hole"
Sa.created_name = name
new /obj/item/assembly/prox_sensor(Tsec)
new /obj/item/melee/baton(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
drop_part(robot_arm, Tsec)
do_sparks(3, 1, src)
new /obj/effect/decal/cleanable/blood/oil(loc)
..()
@@ -161,6 +161,7 @@
//The objects that corgis can wear on their backs.
var/list/allowed_types = list(
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/armor/vest/blueshield,
/obj/item/clothing/suit/space/deathsquad,
/obj/item/clothing/suit/space/hardsuit/engineering,
/obj/item/radio,
@@ -365,6 +366,12 @@
name = "Definitely Not [real_name]"
desc = "That's Definitely Not [real_name]"
valid = 1
if(/obj/item/clothing/head/beret/centcom/officer, /obj/item/clothing/head/beret/centcom/officer/navy)
name = "Blueshield [real_name]"
desc = "Will stand by you until the bitter end."
emote_see = list("stands with pride.", "growls heroically.")
valid = 1
if(valid)
if(user && !user.drop_item())
@@ -2,7 +2,7 @@
// Terror Spider, Black, Deadly Venom
/datum/reagent/terror_black_toxin
name = "Black Widow venom"
name = "Black Terror venom"
id = "terror_black_toxin"
description = "An incredibly toxic venom injected by the Black Widow spider."
color = "#CF3600"
@@ -38,7 +38,10 @@
evolvequeen_action.Grant(src)
/mob/living/simple_animal/hostile/poison/terror_spider/princess/proc/evolve_to_queen()
change_mob_type(/mob/living/simple_animal/hostile/poison/terror_spider/queen, null, null, 1, 1)
var/mob/living/simple_animal/hostile/poison/terror_spider/queen/Q = new /mob/living/simple_animal/hostile/poison/terror_spider/queen(loc)
if(mind)
mind.transfer_to(Q)
qdel(src)
/mob/living/simple_animal/hostile/poison/terror_spider/princess/DoWrap()
. = ..()
@@ -349,6 +349,7 @@
if(!user.unEquip(A))
return
A.loc = FD
FD.log_override = FALSE
FD.pen = A
FD.damage = 5
FD.nodamage = 0
@@ -370,6 +371,32 @@
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
icon_state = "foamdart_riot"
/obj/item/ammo_casing/caseless/foam_dart/sniper
name = "foam sniper dart"
desc = "For the big nerf! Ages 8 and up."
caliber = "foam_force_sniper"
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/sniper
icon_state = "foamdartsniper"
/obj/item/ammo_casing/caseless/foam_dart/sniper/update_icon()
..()
if(modified)
icon_state = "foamdartsniper_empty"
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
if(BB)
BB.icon_state = "foamdartsniper_empty"
else
icon_state = initial(icon_state)
if(BB)
BB.icon_state = initial(BB.icon_state)
/obj/item/ammo_casing/caseless/foam_dart/sniper/riot
name = "riot foam sniper dart"
desc = "For the bigger brother of the crowd control toy. Ages 18 and up."
caliber = "foam_force_sniper"
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/sniper/riot
icon_state = "foamdartsniper_riot"
/obj/item/ammo_casing/shotgun/assassination
name = "assassination shell"
desc = "A specialist shrapnel shell that has been laced with a silencing toxin."
@@ -125,6 +125,21 @@
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
materials = list(MAT_METAL = 50000)
/obj/item/ammo_box/foambox/sniper
name = "ammo box (Foam Sniper Darts)"
icon = 'icons/obj/guns/toy.dmi'
icon_state = "foambox_sniper"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/sniper
max_ammo = 40
materials = list(MAT_METAL = 900)
/obj/item/ammo_box/foambox/sniper/riot
icon_state = "foambox_sniper_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/sniper/riot
materials = list(MAT_METAL = 90000)
/obj/item/ammo_box/caps
name = "speed loader (caps)"
icon_state = "357"
@@ -490,3 +490,12 @@
/obj/item/ammo_box/magazine/laser/update_icon()
..()
icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/20)*20]"
/obj/item/ammo_box/magazine/toy/smgm45
name = "donksoft SMG magazine"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
max_ammo = 20
/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
..()
icon_state = "c20r45-[round(ammo_count(),2)]"
@@ -39,6 +39,17 @@
can_unsuppress = 0
can_suppress = 0
/obj/item/gun/projectile/automatic/sniper_rifle/compact //holds very little ammo, lacks zooming, and bullets are primarily damage dealers, but the gun lacks the downsides of the full size rifle
name = "compact sniper rifle"
desc = "a compact, unscoped version of the standard issue syndicate sniper rifle. Still capable of sending people crying."
recoil = 0
weapon_weight = WEAPON_LIGHT
fire_delay = 0
mag_type = /obj/item/ammo_box/magazine/sniper_rounds/compact
can_unsuppress = FALSE
can_suppress = FALSE
zoomable = FALSE
//Normal Boolets
/obj/item/ammo_box/magazine/sniper_rounds
name = "sniper rounds (.50)"
@@ -159,3 +170,39 @@
dismemberment = 0
weaken = 0
breakthings = FALSE
//compact ammo
/obj/item/ammo_box/magazine/sniper_rounds/compact
name = "sniper rounds (compact)"
desc = "An extremely powerful round capable of inflicting massive damage on a target."
ammo_type = /obj/item/ammo_casing/compact
max_ammo = 4
/obj/item/ammo_casing/compact
desc = "A .50 caliber compact round casing."
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/sniper/compact
icon_state = ".50"
/obj/item/projectile/bullet/sniper/compact //Can't dismember, and can't break things; just deals massive damage.
dismemberment = 0
breakthings = FALSE
//toy magazine
/obj/item/ammo_box/magazine/toy/sniper_rounds
name = "donksoft Sniper magazine"
icon_state = ".50mag"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/sniper/riot
max_ammo = 6
caliber = "foam_force_sniper"
/obj/item/ammo_box/magazine/toy/sniper_rounds/update_icon()
overlays.Cut()
var/ammo = ammo_count()
if(ammo && istype(contents[contents.len], /obj/item/ammo_casing/caseless/foam_dart/sniper/riot))
overlays += image('icons/obj/ammo.dmi', icon_state = ".50mag-r")
else if(ammo)
overlays += image('icons/obj/ammo.dmi', icon_state = ".50mag-f")
else
icon_state = "[initial(icon_state)]"
@@ -116,3 +116,15 @@
item_state = "shotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/tommygun
w_class = WEIGHT_CLASS_SMALL
/obj/item/gun/projectile/automatic/sniper_rifle/toy
name = "donksoft sniper rifle"
desc = "A recoil-operated, semi-automatic donksoft sniper rifle. Perfect to annoy/kill the neighbours cat! Ages 8 and up."
icon = 'icons/obj/guns/toy.dmi'
can_suppress = FALSE
needs_permit = FALSE
zoomable = FALSE
mag_type = /obj/item/ammo_box/magazine/toy/sniper_rounds
/obj/item/gun/projectile/automatic/sniper_rifle/toy/process_chamber(eject_casing = 0, empty_chamber = 1)
..()
@@ -64,3 +64,16 @@
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
stamina = 25
log_override = FALSE
/obj/item/projectile/bullet/reusable/foam_dart/sniper
name = "foam sniper dart"
icon_state = "foamdartsniper"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/sniper
range = 30
/obj/item/projectile/bullet/reusable/foam_dart/sniper/riot
name = "riot sniper foam dart"
icon_state = "foamdartsniper_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/sniper/riot
stamina = 100
log_override = FALSE
@@ -264,10 +264,76 @@
dispensable_reagents = list("water", "ice", "milk", "soymilk", "coffee", "tea", "hot_coco", "cola", "spacemountainwind", "dr_gibb", "space_up",
"tonic", "sodawater", "lemon_lime", "grapejuice", "sugar", "orangejuice", "lemonjuice", "limejuice", "tomatojuice", "banana",
"watermelonjuice", "carrotjuice", "potato", "berryjuice")
var/list/special_reagents2 = list(list(""),
list("bananahonk", "milkshake", "cafe_latte", "cafe_mocha"),
list("triple_citrus", "icecoffe","icetea"))
hack_message = "You change the mode from 'McNano' to 'Pizza King'."
unhack_message = "You change the mode from 'Pizza King' to 'McNano'."
hacked_reagents = list("thirteenloko")
/obj/machinery/chem_dispenser/soda/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/soda(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/capacitor(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stock_parts/cell/super(null)
RefreshParts()
/obj/machinery/chem_dispenser/soda/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/soda(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stock_parts/capacitor/super(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stock_parts/cell/hyper(null)
RefreshParts()
/obj/machinery/chem_dispenser/soda/RefreshParts()
for(var/obj/item/stock_parts/manipulator/M in component_parts)
for(var/i in 1 to M.rating)
dispensable_reagents = sortList(dispensable_reagents | special_reagents2[i])
/obj/machinery/chem_dispenser/soda/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers/glass))
if(panel_open)
to_chat(user, "<span class='notice'>Close the maintenance panel first.</span>")
return
return ..()
else
..()
if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I))
return
if(exchange_parts(user, I))
return
if(iswrench(I))
playsound(src, I.usesound, 50, 1)
if(anchored)
anchored = FALSE
to_chat(user, "<span class='caution'>[src] can now be moved.</span>")
else if(!anchored)
anchored = TRUE
to_chat(user, "<span class='caution'>[src] is now secured.</span>")
if(panel_open)
if(iscrowbar(I))
if(beaker)
var/obj/item/reagent_containers/glass/B = beaker
B.forceMove(loc)
beaker = null
default_deconstruction_crowbar(I)
return TRUE
/obj/machinery/chem_dispenser/beer
icon_state = "booze_dispenser"
name = "booze dispenser"
@@ -276,10 +342,75 @@
max_energy = 100
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol")
var/list/special_reagents3 = list(list("iced_beer"),
list("irishcream", "manhattan",),
list("antihol", "synthignon", "bravebull"))
hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes."
hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing", "sake")
/obj/machinery/chem_dispenser/beer/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/beer(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/capacitor(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stock_parts/cell/super(null)
RefreshParts()
/obj/machinery/chem_dispenser/beer/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/beer(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stock_parts/capacitor/super(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stock_parts/cell/hyper(null)
RefreshParts()
/obj/machinery/chem_dispenser/beer/RefreshParts()
for(var/obj/item/stock_parts/manipulator/M in component_parts)
for(var/i in 1 to M.rating)
dispensable_reagents = sortList(dispensable_reagents | special_reagents3[i])
/obj/machinery/chem_dispenser/beer/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers/glass))
if(panel_open)
to_chat(user, "<span class='notice'>Close the maintenance panel first.</span>")
return
return ..()
else
..()
if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I))
return
if(exchange_parts(user, I))
return
if(iswrench(I))
playsound(src, I.usesound, 50, 1)
if(anchored)
anchored = FALSE
to_chat(user, "<span class='caution'>[src] can now be moved.</span>")
else if(!anchored)
anchored = TRUE
to_chat(user, "<span class='caution'>[src] is now secured.</span>")
if(panel_open)
if(iscrowbar(I))
if(beaker)
var/obj/item/reagent_containers/glass/B = beaker
B.forceMove(loc)
beaker = null
default_deconstruction_crowbar(I)
return TRUE
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -70,6 +70,7 @@
drink_icon = "whiskeyglass"
drink_name = "Glass of whiskey"
drink_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
taste_message = "whiskey"
/datum/reagent/consumable/ethanol/specialwhiskey
name = "Special Blend Whiskey"
@@ -89,6 +90,7 @@
drink_icon = "ginvodkaglass"
drink_name = "Glass of gin"
drink_desc = "A crystal clear glass of Griffeater gin."
taste_message = "gin"
/datum/reagent/consumable/ethanol/absinthe
name = "Absinthe"
@@ -124,6 +126,7 @@
drink_icon = "rumglass"
drink_name = "Glass of Rum"
drink_desc = "Now you want to Pray for a pirate suit, don't you?"
taste_message = "rum"
/datum/reagent/consumable/ethanol/rum/overdose_process(mob/living/M, severity)
var/update_flags = STATUS_UPDATE_NONE
@@ -150,6 +153,7 @@
drink_icon = "ginvodkaglass"
drink_name = "Glass of vodka"
drink_desc = "The glass contain wodka. Xynta."
taste_message = "vodka"
/datum/reagent/consumable/ethanol/sake
name = "Sake"
@@ -171,6 +175,7 @@
drink_icon = "tequilaglass"
drink_name = "Glass of Tequila"
drink_desc = "Now all that's missing is the weird colored shades!"
taste_message = "tequila"
/datum/reagent/consumable/ethanol/vermouth
name = "Vermouth"
@@ -205,6 +210,7 @@
drink_icon = "cognacglass"
drink_name = "Glass of cognac"
drink_desc = "Damn, you feel like some kind of French aristocrat just by holding this."
taste_message = "cognac"
/datum/reagent/consumable/ethanol/suicider //otherwise known as "I want to get so smashed my liver gives out and I die from alcohol poisoning".
name = "Suicider"
@@ -278,7 +284,7 @@
drink_icon = "atomicbombglass"
drink_name = "Atomic Bomb"
drink_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
taste_message = "fruity alcohol"
taste_message = "a long, fiery burn"
/datum/reagent/consumable/ethanol/threemileisland
name = "THree Mile Island Iced Tea"
@@ -290,7 +296,7 @@
drink_icon = "threemileislandglass"
drink_name = "Three Mile Island Ice Tea"
drink_desc = "A glass of this is sure to prevent a meltdown."
taste_message = "fruity alcohol"
taste_message = "a creeping heat"
/datum/reagent/consumable/ethanol/goldschlager
name = "Goldschlager"
@@ -302,6 +308,7 @@
drink_icon = "ginvodkaglass"
drink_name = "Glass of goldschlager"
drink_desc = "100 proof that teen girls will drink anything with gold in it."
taste_message = "a deep, spicy warmth"
/datum/reagent/consumable/ethanol/patron
name = "Patron"
@@ -313,6 +320,7 @@
drink_icon = "patronglass"
drink_name = "Glass of Patron"
drink_desc = "Drinking patron in the bar, with all the subpar ladies."
taste_message = "a gift"
/datum/reagent/consumable/ethanol/gintonic
name = "Gin and Tonic"
@@ -324,6 +332,7 @@
drink_icon = "gintonicglass"
drink_name = "Gin and Tonic"
drink_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
taste_message = "bitter medicine"
/datum/reagent/consumable/ethanol/cuba_libre
name = "Cuba Libre"
@@ -336,6 +345,7 @@
drink_name = "Cuba Libre"
drink_desc = "A classic mix of rum and cola."
taste_message = "fruity alcohol"
taste_message = "liberation"
/datum/reagent/consumable/ethanol/whiskey_cola
name = "Whiskey Cola"
@@ -359,7 +369,7 @@
drink_icon = "martiniglass"
drink_name = "Classic Martini"
drink_desc = "Damn, the bartender even stirred it, not shook it."
taste_message = "martini"
taste_message = "class"
/datum/reagent/consumable/ethanol/vodkamartini
name = "Vodka Martini"
@@ -371,6 +381,7 @@
drink_icon = "martiniglass"
drink_name = "Vodka martini"
drink_desc ="A bastardisation of the classic martini. Still great."
taste_message = "class and potatoes"
/datum/reagent/consumable/ethanol/white_russian
name = "White Russian"
@@ -382,7 +393,7 @@
drink_icon = "whiterussianglass"
drink_name = "White Russian"
drink_desc = "A very nice looking drink. But that's just, like, your opinion, man."
taste_message = "creamy alcohol"
taste_message = "very creamy alcohol"
/datum/reagent/consumable/ethanol/screwdrivercocktail
name = "Screwdriver"
@@ -394,7 +405,7 @@
drink_icon = "screwdriverglass"
drink_name = "Screwdriver"
drink_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
taste_message = "fruity alcohol"
taste_message = "a naughty secret"
/datum/reagent/consumable/ethanol/booger
name = "Booger"
@@ -406,7 +417,7 @@
drink_icon = "booger"
drink_name = "Booger"
drink_desc = "Eww..."
taste_message = "sweet alcohol"
taste_message = "a fruity mess"
/datum/reagent/consumable/ethanol/bloody_mary
name = "Bloody Mary"
@@ -560,7 +571,7 @@
drink_icon = "b52glass"
drink_name = "B-52"
drink_desc = "Kahlua, Irish Cream, and congac. You will get bombed."
taste_message = "creamy alcohol"
taste_message = "destruction"
/datum/reagent/consumable/ethanol/irishcoffee
name = "Irish Coffee"
@@ -584,7 +595,7 @@
drink_icon = "margaritaglass"
drink_name = "Margarita"
drink_desc = "On the rocks with salt on the rim. Arriba~!"
taste_message = "fruity alcohol"
taste_message = "daisies"
/datum/reagent/consumable/ethanol/black_russian
name = "Black Russian"
@@ -608,7 +619,7 @@
drink_icon = "manhattanglass"
drink_name = "Manhattan"
drink_desc = "The Detective's undercover drink of choice. He never could stomach gin..."
taste_message = "bitter alcohol"
taste_message = "a bustling city"
/datum/reagent/consumable/ethanol/manhattan_proj
name = "Manhattan Project"
@@ -620,7 +631,7 @@
drink_icon = "proj_manhattanglass"
drink_name = "Manhattan Project"
drink_desc = "A scientist's drink of choice, for thinking how to blow up the station."
taste_message = "bitter alcohol"
taste_message = "the apocalypse"
/datum/reagent/consumable/ethanol/whiskeysoda
name = "Whiskey Soda"
@@ -661,7 +672,7 @@
drink_icon = "b&p"
drink_name = "Barefoot"
drink_desc = "Barefoot and pregnant"
taste_message = "sweet alcohol"
taste_message = "pregnancy"
/datum/reagent/consumable/ethanol/snowwhite
name = "Snow White"
@@ -673,7 +684,7 @@
drink_icon = "snowwhite"
drink_name = "Snow White"
drink_desc = "A cold refreshment."
taste_message = "refreshing alcohol"
taste_message = "a poisoned apple"
/datum/reagent/consumable/ethanol/demonsblood
name = "Demons Blood"
@@ -699,7 +710,7 @@
drink_icon = "vodkatonicglass"
drink_name = "Vodka and Tonic"
drink_desc = "For when a gin and tonic isn't russian enough."
taste_message = "fizzy alcohol"
taste_message = "bitter medicine"
/datum/reagent/consumable/ethanol/ginfizz
name = "Gin Fizz"
@@ -724,7 +735,7 @@
drink_icon = "bahama_mama"
drink_name = "Bahama Mama"
drink_desc = "Tropic cocktail"
taste_message = "fruity alcohol"
taste_message = "HONK"
/datum/reagent/consumable/ethanol/singulo
name = "Singulo"
@@ -749,7 +760,7 @@
drink_icon = "sbitenglass"
drink_name = "Sbiten"
drink_desc = "A spicy mix of Vodka and Spice. Very hot."
taste_message = "spicy alcohol"
taste_message = "comforting warmth"
/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/M)
if(M.bodytemperature < 360)
@@ -766,7 +777,7 @@
drink_icon = "devilskiss"
drink_name = "Devils Kiss"
drink_desc = "Creepy time!"
taste_message = "blood"
taste_message = "naughtiness"
/datum/reagent/consumable/ethanol/red_mead
name = "Red Mead"
@@ -791,7 +802,7 @@
drink_icon = "meadglass"
drink_name = "Mead"
drink_desc = "A Vikings Beverage, though a cheap one."
taste_message = "sweet alcohol"
taste_message = "honey"
/datum/reagent/consumable/ethanol/iced_beer
name = "Iced Beer"
@@ -803,7 +814,7 @@
drink_icon = "iced_beerglass"
drink_name = "Iced Beer"
drink_desc = "A beer so frosty, the air around it freezes."
taste_message = "refreshing alcohol"
taste_message = "cold beer"
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M)
if(M.bodytemperature > 270)
@@ -820,7 +831,7 @@
drink_icon = "grogglass"
drink_name = "Grog"
drink_desc = "A fine and cepa drink for Space."
taste_message = "rum"
taste_message = "strongly diluted rum"
/datum/reagent/consumable/ethanol/aloe
name = "Aloe"
@@ -832,7 +843,7 @@
drink_icon = "aloe"
drink_name = "Aloe"
drink_desc = "Very, very, very good."
taste_message = "sweet alcohol"
taste_message = "healthy skin"
/datum/reagent/consumable/ethanol/andalusia
name = "Andalusia"
@@ -856,7 +867,7 @@
drink_icon = "alliescocktail"
drink_name = "Allies cocktail"
drink_desc = "A drink made from your allies."
taste_message = "bitter alcohol"
taste_message = "victory"
/datum/reagent/consumable/ethanol/acid_spit
name = "Acid Spit"
@@ -916,6 +927,7 @@
drink_icon = "hippiesdelightglass"
drink_name = "Hippie's Delight"
drink_desc = "A drink enjoyed by people during the 1960's."
taste_message = "colors"
/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -966,7 +978,7 @@
drink_icon = "irishcarbomb"
drink_name = "Irish Car Bomb"
drink_desc = "An irish car bomb."
taste_message = "creamy alcohol"
taste_message = "troubles"
/datum/reagent/consumable/ethanol/syndicatebomb
name = "Syndicate Bomb"
@@ -990,7 +1002,7 @@
drink_icon = "erikasurprise"
name = "Erika Surprise"
drink_desc = "The surprise is, it's green!"
taste_message = "sweet alcohol"
taste_message = "disappointment"
/datum/reagent/consumable/ethanol/driestmartini
name = "Driest Martini"
@@ -1003,7 +1015,7 @@
drink_icon = "driestmartiniglass"
drink_name = "Driest Martini"
drink_desc = "Only for the experienced. You think you see sand floating in the glass."
taste_message = "bitter alcohol"
taste_message = "dust and ashes"
/datum/reagent/consumable/ethanol/driestmartini/on_mob_life(mob/living/M)
if(current_cycle >= 55 && current_cycle < 115)
@@ -1019,7 +1031,7 @@
drink_icon = "kahluaglass"
drink_name = "Glass of RR coffee Liquor"
drink_desc = "DAMN, THIS THING LOOKS ROBUST"
taste_message = "sweet alcohol"
taste_message = "coffee and alcohol"
/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1158,7 +1170,7 @@
drink_icon = "synthanolglass"
drink_name = "Glass of Synthanol"
drink_desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too."
taste_message = "motor oil mixed with puke"
taste_message = "motor oil"
/datum/reagent/consumable/ethanol/synthanol/on_mob_life(mob/living/M)
if(!M.isSynthetic())
@@ -1184,6 +1196,7 @@
drink_icon = "robottearsglass"
drink_name = "Glass of Robot Tears"
drink_desc = "No robots were hurt in the making of this drink."
taste_message = "existential angst"
/datum/reagent/consumable/ethanol/synthanol/trinary
name = "Trinary"
@@ -1195,6 +1208,7 @@
drink_icon = "trinaryglass"
drink_name = "Glass of Trinary"
drink_desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well."
taste_message = "modem static"
/datum/reagent/consumable/ethanol/synthanol/servo
name = "Servo"
@@ -1206,6 +1220,7 @@
drink_icon = "servoglass"
drink_name = "Glass of Servo"
drink_desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe."
taste_message = "motor oil and cocoa"
/datum/reagent/consumable/ethanol/synthanol/uplink
name = "Uplink"
@@ -1217,6 +1232,7 @@
drink_icon = "uplinkglass"
drink_name = "Glass of Uplink"
drink_desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics."
taste_message = "a GUI in visual basic"
/datum/reagent/consumable/ethanol/synthanol/synthnsoda
name = "Synth 'n Soda"
@@ -1228,6 +1244,7 @@
drink_icon = "synthnsodaglass"
drink_name = "Glass of Synth 'n Soda"
drink_desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon."
taste_message = "fizzy motor oil"
/datum/reagent/consumable/ethanol/synthanol/synthignon
name = "Synthignon"
@@ -1239,6 +1256,7 @@
drink_icon = "synthignonglass"
drink_name = "Glass of Synthignon"
drink_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
taste_message = "fancy motor oil"
/datum/reagent/consumable/ethanol/fruit_wine
name = "Fruit Wine"
@@ -4,6 +4,7 @@
description = "Uh, some kind of drink."
reagent_state = LIQUID
color = "#E78108" // rgb: 231, 129, 8
taste_message = "something which should not exist"
var/adj_dizzy = 0
var/adj_drowsy = 0
var/adj_sleepy = 0
@@ -14,6 +14,7 @@
drink_icon = "glass_clear"
drink_name = "Glass of Tonic Water"
drink_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
taste_message = "bitterness"
/datum/reagent/consumable/drink/cold/sodawater
name = "Soda Water"
@@ -25,6 +26,7 @@
drink_icon = "glass_clear"
drink_name = "Glass of Soda Water"
drink_desc = "Soda water. Why not make a scotch and soda?"
taste_message = "fizz"
/datum/reagent/consumable/drink/cold/ice
name = "Ice"
@@ -36,6 +38,7 @@
drink_icon = "iceglass"
drink_name = "Glass of ice"
drink_desc = "Generally, you're supposed to put something else in there too..."
taste_message = "cold"
/datum/reagent/consumable/drink/cold/ice/on_mob_life(mob/living/M)
M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
@@ -62,7 +65,7 @@
drink_icon = "nuka_colaglass"
drink_name = "Nuka Cola"
drink_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland"
taste_message = "cola"
taste_message = "radioactive cola"
/datum/reagent/consumable/drink/cold/nuka_cola/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -308,7 +308,7 @@
drink_icon = "icedcoffeeglass"
drink_name = "Iced Coffee"
drink_desc = "A drink to perk you up and refresh you!"
taste_message = "coffee"
taste_message = "refreshingly cold coffee"
/datum/reagent/consumable/drink/coffee/soy_latte
name = "Soy Latte"
@@ -320,6 +320,7 @@
drink_icon = "soy_latte"
drink_name = "Soy Latte"
drink_desc = "A nice and refrshing beverage while you are reading."
taste_message = "fake milky coffee"
/datum/reagent/consumable/drink/coffee/soy_latte/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -338,6 +339,7 @@
drink_icon = "cafe_latte"
drink_name = "Cafe Latte"
drink_desc = "A nice, strong and refreshing beverage while you are reading."
taste_message = "milky coffee"
/datum/reagent/consumable/drink/coffee/cafe_latte/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -353,6 +355,7 @@
color = "#673629"
drink_name = "Cafe Mocha"
drink_desc = "The perfect blend of coffe, milk, and chocolate."
taste_message = "chocolatey coffee"
/datum/reagent/consumable/drink/tea
name = "Tea"
@@ -385,16 +388,17 @@
drink_icon = "icetea"
drink_name = "Iced Tea"
drink_desc = "No relation to a certain rap artist/ actor."
taste_message = "cold tea"
/datum/reagent/consumable/drink/bananahonk
name = "Banana Mama"
name = "Banana Honk"
id = "bananahonk"
description = "A drink from Clown Heaven."
color = "#664300" // rgb: 102, 67, 0
drink_icon = "bananahonkglass"
drink_name = "Banana Honk"
drink_desc = "A drink from Banana Heaven."
taste_message = "honks"
taste_message = "HONK"
/datum/reagent/consumable/drink/bananahonk/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -462,7 +466,7 @@
drink_icon = "bluecherryshake"
drink_name = "Blue Cherry Shake"
drink_desc = "An exotic blue milkshake."
taste_message = "cherry milkshake"
taste_message = "blues"
/datum/reagent/consumable/drink/pumpkin_latte
name = "Pumpkin Latte"
@@ -19,6 +19,7 @@
description = "A chemical element."
reagent_state = SOLID
color = "#808080" // rgb: 128, 128, 128
taste_message = "metal"
/datum/reagent/lithium/on_mob_life(mob/living/M)
if(isturf(M.loc) && !istype(M.loc, /turf/space))
@@ -34,6 +35,7 @@
description = "A highly potent hallucinogenic substance. Far out, maaaan."
reagent_state = LIQUID
color = "#0000D8"
taste_message = "a magical journey"
/datum/reagent/lsd/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -50,6 +52,7 @@
metabolization_rate = 0.2
addiction_chance = 65
heart_rate_decrease = 1
taste_message = "a synthetic high"
/datum/reagent/space_drugs/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -66,6 +69,7 @@
id = "psilocybin"
description = "A strong psycotropic derived from certain species of mushroom."
color = "#E700E7" // rgb: 231, 0, 231
taste_message = "visions"
/datum/reagent/psilocybin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -101,6 +105,7 @@
overdose_threshold = 35
addiction_chance = 70
heart_rate_increase = 1
taste_message = "calm"
/datum/reagent/nicotine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -237,6 +242,7 @@
color = "#0264B4"
overdose_threshold = 20
addiction_chance = 50
taste_message = "very poor life choices"
/datum/reagent/krokodil/on_mob_life(mob/living/M)
@@ -310,6 +316,7 @@
addiction_chance = 60
metabolization_rate = 0.6
heart_rate_increase = 1
taste_message = "speed"
/datum/reagent/methamphetamine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -369,6 +376,7 @@
overdose_threshold = 20
addiction_chance = 80
metabolization_rate = 0.6
taste_message = "WAAAAGH"
/datum/reagent/bath_salts/on_mob_life(mob/living/M)
var/check = rand(0,100)
@@ -23,6 +23,7 @@
reagent_state = SOLID
nutriment_factor = 15 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
taste_message = null
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -57,7 +58,7 @@
description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
reagent_state = SOLID
color = "#664330" // rgb: 102, 67, 48
taste_message = null
taste_message = "nutrition"
/datum/reagent/consumable/vitamin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -272,6 +273,7 @@
reagent_state = SOLID
color = "#B1B0B0"
overdose_threshold = 100
taste_strength = 2
taste_message = "salt"
/datum/reagent/consumable/sodiumchloride/overdose_process(mob/living/M, severity)
@@ -324,7 +326,7 @@
id = "sprinkles"
description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops."
color = "#FF00FF" // rgb: 255, 0, 255
taste_message = "sweetness"
taste_message = "crunchy sweetness"
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -433,7 +435,7 @@
description = "Blue and tastier kind of cherry jelly."
reagent_state = LIQUID
color = "#00F0FF"
taste_message = "cherry jelly"
taste_message = "the blues"
/datum/reagent/consumable/egg
name = "Egg"
@@ -462,7 +464,7 @@
description = "A sweet syrup derived from corn starch that has had its starches converted into maltose and other sugars."
reagent_state = LIQUID
color = "#C8A5DC"
taste_message = "sweetness"
taste_message = "cheap sugar substitute"
/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/M)
M.reagents.add_reagent("sugar", 1.2)
@@ -502,7 +504,7 @@
id = "onionjuice"
description = "A strong tasting substance that can induce partial blindness."
color = "#c0c9a0"
taste_message = "bitterness"
taste_message = "pungency"
/datum/reagent/consumable/onion/reaction_mob(mob/living/M, method = TOUCH, volume)
if(method == TOUCH)
@@ -708,7 +710,7 @@
description = "A paste comprised of highly-processed organic material. Uncomfortably similar to deviled ham spread."
reagent_state = LIQUID
color = "#EBD7D7"
taste_message = "meat"
taste_message = "meat?"
/datum/reagent/consumable/meatslurry/on_mob_life(mob/living/M)
if(prob(4))
@@ -810,6 +812,7 @@
color = "#F5F5F5"
metabolization_rate = 0.2
taste_message = "excellent cuisine"
taste_strength = 4
/datum/reagent/msg/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -14,6 +14,7 @@
color = "#C805DC"
metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units
shock_reduction = 200
taste_message = "numbness"
/datum/reagent/medicine/hydrocodone/on_mob_life(mob/living/M)
if(ishuman(M))
@@ -28,6 +29,7 @@
description = "Sterilizes wounds in preparation for surgery."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
taste_message = "antiseptic"
//makes you squeaky clean
/datum/reagent/medicine/sterilizine/reaction_mob(mob/living/M, method=TOUCH, volume)
@@ -47,6 +49,7 @@
reagent_state = LIQUID
color = "#FA46FA"
overdose_threshold = 40
taste_message = "stimulant"
/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -89,6 +92,7 @@
description = "A specialized drug that stimulates the mitochondria of cells to encourage healing of internal organs."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
taste_message = "nurturing"
/datum/reagent/medicine/mitocholide/on_mob_life(mob/living/M)
if(ishuman(M))
@@ -112,6 +116,7 @@
reagent_state = LIQUID
color = "#0000C8" // rgb: 200, 165, 220
heart_rate_decrease = 1
taste_message = "a safe refuge"
/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -135,6 +140,7 @@
reagent_state = SOLID
color = "#669900" // rgb: 102, 153, 0
overdose_threshold = 30
taste_message = "reformation"
/datum/reagent/medicine/rezadone/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -163,6 +169,7 @@
reagent_state = LIQUID
color = "#0AB478"
metabolization_rate = 0.2
taste_message = "antibiotics"
/datum/reagent/medicine/silver_sulfadiazine
name = "Silver Sulfadiazine"
@@ -171,6 +178,7 @@
reagent_state = LIQUID
color = "#F0C814"
metabolization_rate = 3
taste_message = "burn cream"
/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -196,6 +204,7 @@
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 3
taste_message = "wound cream"
/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -243,6 +252,7 @@
description = "A resorbable microfibrillar collagen and protein mixture that can rapidly heal injuries when applied topically."
reagent_state = LIQUID
color = "#FFEBEB"
taste_message = "blood"
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
if(iscarbon(M))
@@ -264,6 +274,7 @@
description = "Activated charcoal helps to absorb toxins."
reagent_state = LIQUID
color = "#000000"
taste_message = "dust"
/datum/reagent/medicine/charcoal/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -283,6 +294,7 @@
metabolization_rate = 0.2
overdose_threshold = 30
addiction_chance = 5
taste_message = "health"
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -338,6 +350,7 @@
reagent_state = LIQUID
color = "#22AB35"
metabolization_rate = 0.8
taste_message = "a painful cleansing"
/datum/reagent/medicine/calomel/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -356,6 +369,7 @@
description = "Potassium Iodide is a medicinal drug used to counter the effects of radiation poisoning."
reagent_state = LIQUID
color = "#B4DCBE"
taste_message = "cleansing"
/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/M)
if(prob(80))
@@ -368,6 +382,7 @@
description = "Pentetic Acid is an aggressive chelation agent. May cause tissue damage. Use with caution."
reagent_state = LIQUID
color = "#C8A5DC"
taste_message = "a purge"
/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -391,6 +406,7 @@
metabolization_rate = 0.1
shock_reduction = 25
overdose_threshold = 25
taste_message = "relief"
/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -409,6 +425,7 @@
reagent_state = LIQUID
color = "#00FFFF"
metabolization_rate = 0.2
taste_message = "safety"
/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -424,6 +441,7 @@
color = "#C8A5DC"
metabolization_rate = 0.2
addiction_chance = 20
taste_message = "oxygenation"
/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -444,6 +462,7 @@
metabolization_rate = 0.3
overdose_threshold = 35
addiction_chance = 25
taste_message = "stimulation"
/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -492,6 +511,7 @@
reagent_state = LIQUID
color = "#5BCBE1"
addiction_chance = 10
taste_message = "antihistamine"
/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/M)
M.AdjustJitter(-20)
@@ -514,6 +534,7 @@
overdose_threshold = 20
addiction_chance = 50
shock_reduction = 50
taste_message = "a delightful numbing"
/datum/reagent/medicine/morphine/on_mob_life(mob/living/M)
M.AdjustJitter(-25)
@@ -538,6 +559,7 @@
description = "Oculine is a saline eye medication with mydriatic and antibiotic effects."
reagent_state = LIQUID
color = "#C8A5DC"
taste_message = "clarity"
/datum/reagent/medicine/oculine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -569,6 +591,7 @@
color = "#000000"
metabolization_rate = 0.2
overdose_threshold = 25
taste_message = "a moment of respite"
/datum/reagent/medicine/atropine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -596,6 +619,7 @@
color = "#96B1AE"
metabolization_rate = 0.2
overdose_threshold = 20
taste_message = "borrowed time"
/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -651,6 +675,7 @@
reagent_state = LIQUID
color = "#A0E85E"
metabolization_rate = 0.2
taste_message = "life"
/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -716,6 +741,7 @@
id = "mannitol"
description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling."
color = "#D1D1F1"
taste_message = "neurogenisis"
/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -727,6 +753,7 @@
id = "mutadone"
description = "Mutadone is an experimental bromide that can cure genetic abnomalities."
color = "#5096C8"
taste_message = "cleanliness"
/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/human/M)
if(M.mind && M.mind.assigned_role == "Cluwne") // HUNKE
@@ -755,6 +782,7 @@
id = "antihol"
description = "A medicine which quickly eliminates alcohol in the body."
color = "#009CA8"
taste_message = "sobriety"
/datum/reagent/medicine/antihol/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -841,6 +869,7 @@
description = "A hormone generated by the pancreas responsible for metabolizing carbohydrates and fat in the bloodstream."
reagent_state = LIQUID
color = "#C8A5DC"
taste_message = "tiredness"
/datum/reagent/medicine/insulin/on_mob_life(mob/living/M)
M.reagents.remove_reagent("sugar", 5)
@@ -853,6 +882,7 @@
color = "#D782E6"
addiction_chance = 20
overdose_threshold = 50
taste_message = "warmth and stability"
/datum/reagent/medicine/teporone/on_mob_life(mob/living/M)
if(M.bodytemperature > 310)
@@ -867,6 +897,7 @@
description = "Haloperidol is a powerful antipsychotic and sedative. Will help control psychiatric problems, but may cause brain damage."
reagent_state = LIQUID
color = "#FFDCFF"
taste_message = "stability"
/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -898,6 +929,7 @@
reagent_state = LIQUID
color = "#96DEDE"
metabolization_rate = 0.1
taste_message = "sleepiness"
/datum/reagent/medicine/ether/on_mob_life(mob/living/M)
M.AdjustJitter(-25)
@@ -919,6 +951,7 @@
reagent_state = SOLID
color = "#555555"
can_synth = FALSE
taste_message = "bodily perfection"
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -938,6 +971,7 @@
color = "#DCDCDC"
overdose_threshold = 30
metabolization_rate = 0.1
taste_message = "faint hope"
/datum/reagent/medicine/omnizine_diluted/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -955,26 +989,6 @@
update_flags |= M.adjustFireLoss(1.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return list(0, update_flags)
//virus-specific symptom reagents
/datum/reagent/medicine/synaphydramine
name = "Diphen-Synaptizine"
id = "synaphydramine"
description = "Reduces drowsiness and hallucinations while also purging histamine from the body."
color = "#EC536D" // rgb: 236, 83, 109
/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
M.AdjustDrowsy(-5)
if(holder.has_reagent("lsd"))
holder.remove_reagent("lsd", 5)
if(holder.has_reagent("histamine"))
holder.remove_reagent("histamine", 5)
M.AdjustHallucinate(-10)
if(prob(30))
update_flags |= M.adjustToxLoss(1, FALSE)
return ..() | update_flags
//////////////////////////////
// Synth-Meds //
//////////////////////////////
@@ -987,6 +1001,7 @@
reagent_state = LIQUID
color = "#CC7A00"
process_flags = SYNTHETIC
taste_message = "overclocking"
/datum/reagent/medicine/degreaser/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1017,6 +1032,7 @@
reagent_state = LIQUID
color = "#D7B395"
process_flags = SYNTHETIC
taste_message = "heavy metals"
/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1033,6 +1049,7 @@
reagent_state = LIQUID
color = "#C8A5DC"
overdose_threshold = 30
taste_message = "knitting wounds"
/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1051,6 +1068,7 @@
reagent_state = LIQUID
color = "#C8A5DC"
overdose_threshold = 30
taste_message = "soothed burns"
/datum/reagent/medicine/kelotane/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1069,6 +1087,7 @@
description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain."
color = "#FFAF00"
overdose_threshold = 25
taste_message = "a gift from nature"
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -1094,6 +1113,7 @@
id = "corazone"
description = "A medication used to treat pain, fever, and inflammation, along with heart attacks."
color = "#F5F5F5"
taste_message = "a brief respite"
// This reagent's effects are handled in heart attack handling code
@@ -1104,6 +1124,7 @@
color = "#9b3401"
metabolization_rate = 0.5
can_synth = FALSE
taste_message = "wholeness"
/datum/reagent/medicine/nanocalcium/on_mob_life(mob/living/carbon/human/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -128,7 +128,7 @@
description = "A silvery white and ductile member of the boron group of chemical elements."
reagent_state = SOLID
color = "#A8A8A8" // rgb: 168, 168, 168
taste_message = null
taste_message = "metal"
/datum/reagent/silicon
@@ -176,7 +176,7 @@
description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
reagent_state = LIQUID
color = "#9E6B38" // rgb: 158, 107, 56
taste_message = null
taste_message = "extreme discomfort"
// metal foaming agent
// this is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually
@@ -215,7 +215,7 @@
description = "A purple gaseous element."
reagent_state = GAS
color = "#493062"
taste_message = null
taste_message = "chemtrail resistance"
/datum/reagent/carpet
name = "Carpet"
@@ -261,7 +261,7 @@
description = "Pure 100% nail polish remover, also works as an industrial solvent."
reagent_state = LIQUID
color = "#474747"
taste_message = null
taste_message = "nail polish remover"
/datum/reagent/acetone/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -274,7 +274,7 @@
description = "Volatile."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
taste_message = null
taste_message = "one third of an explosion"
/datum/reagent/colorful_reagent
name = "Colorful Reagent"
@@ -534,7 +534,7 @@
description = "Finely ground Coffee beans, used to make coffee."
reagent_state = SOLID
color = "#5B2E0D" // rgb: 91, 46, 13
taste_message = "bitterness"
taste_message = "waste"
/datum/reagent/toxin/teapowder
name = "Ground Tea Leaves"
@@ -542,7 +542,7 @@
description = "Finely shredded Tea leaves, used for making tea."
reagent_state = SOLID
color = "#7F8400" // rgb: 127, 132, 0"
taste_message = "bitterness"
taste_message = "the future"
//////////////////////////////////Hydroponics stuff///////////////////////////////
@@ -566,6 +566,7 @@
description = "Cheap and extremely common type of plant nutriment."
color = "#376400" // RBG: 50, 100, 0
tox_prob = 10
taste_message = "obscurity and toil"
/datum/reagent/plantnutriment/left4zednutriment
name = "Left 4 Zed"
@@ -573,6 +574,7 @@
description = "Unstable nutriment that makes plants mutate more often than usual."
color = "#1A1E4D" // RBG: 26, 30, 77
tox_prob = 25
taste_message = "evolution"
/datum/reagent/plantnutriment/robustharvestnutriment
name = "Robust Harvest"
@@ -580,6 +582,7 @@
description = "Very potent nutriment that prevents plants from mutating."
color = "#9D9D00" // RBG: 157, 157, 0
tox_prob = 15
taste_message = "bountifulness"
///Alchemical Reagents
@@ -176,6 +176,39 @@
return ..()
/datum/reagent/stable_mutagen
name = "Stable mutagen"
id = "stable_mutagen"
description = "Just the regular, boring sort of mutagenic compound. Works in a completely predictable manner."
reagent_state = LIQUID
color = "#7DFF00"
/datum/reagent/stable_mutagen/on_mob_life(mob/living/M)
if(!ishuman(M) || !M.dna)
return
M.apply_effect(2*REAGENTS_EFFECT_MULTIPLIER, IRRADIATE, negate_armor = 1)
if(current_cycle == 10 && islist(data))
if(istype(data["dna"], /datum/dna))
var/mob/living/carbon/human/H = M
var/datum/dna/D = data["dna"]
if(!D.species.is_small)
H.set_species(D.species.type, retain_damage = TRUE)
H.dna = D.Clone()
H.real_name = D.real_name
domutcheck(H, null, MUTCHK_FORCED)
H.dna.UpdateSE()
H.dna.UpdateUI()
H.sync_organ_dna(TRUE)
H.UpdateAppearance()
return ..()
/datum/reagent/stable_mutagen/on_tick()
var/datum/reagent/blood/B = locate() in holder.reagent_list
if(B && islist(B.data) && !data)
data = B.data.Copy()
..()
/datum/reagent/uranium
name ="Uranium"
id = "uranium"
@@ -1037,7 +1070,7 @@
/datum/reagent/capulettium
name = "Capulettium"
id = "capulettium"
description = "A rare drug that causes the user to fall unconscious and appear dead as long as it's in the body."
description = "A rare drug that causes the user to appear dead for some time."
reagent_state = LIQUID
color = "#60A584"
heart_rate_stop = 1
@@ -1046,10 +1079,18 @@
/datum/reagent/capulettium/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
switch(current_cycle)
if(1 to 10)
if(1 to 5)
update_flags |= M.AdjustEyeBlurry(10, FALSE)
if(6 to 10)
M.Drowsy(10)
if(11)
fakedeath(M)
if(61 to 69)
update_flags |= M.AdjustEyeBlurry(10, FALSE)
if(70 to INFINITY)
update_flags |= M.AdjustEyeBlurry(10, FALSE)
if(M.status_flags & FAKEDEATH)
fakerevive(M)
return ..() | update_flags
/datum/reagent/capulettium/on_mob_delete(mob/living/M)
@@ -116,7 +116,7 @@
description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity."
reagent_state = LIQUID
color = "#1BB1AB"
taste_message = "oil"
taste_message = "cherry"
/datum/reagent/lube/reaction_turf(turf/simulated/T, volume)
if(volume >= 1 && istype(T))
@@ -194,7 +194,7 @@
/datum/reagent/blood
data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"="#A10808","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"="#A10808","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null, "dna" = null)
name = "Blood"
id = "blood"
reagent_state = LIQUID
@@ -285,6 +285,7 @@
name = "Vaccine"
id = "vaccine"
color = "#C81040" // rgb: 200, 16, 64
taste_message = "antibodies"
/datum/reagent/vaccine/reaction_mob(mob/living/M, method=TOUCH, volume)
if(islist(data) && (method == INGEST))
@@ -440,7 +441,7 @@
description = "Something that shouldn't exist on this plane of existance."
process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it.
metabolization_rate = 1
taste_message = null
taste_message = "sulfur"
/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -507,6 +508,7 @@
description = "Can be used to dry things."
reagent_state = LIQUID
color = "#A70FFF"
taste_message = "dry mouth"
/datum/reagent/drying_agent/reaction_turf(turf/simulated/T, volume)
if(istype(T) && T.wet)
@@ -99,9 +99,25 @@
/datum/chemical_reaction/dough/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
for(var/i in 1 to created_volume)
new /obj/item/reagent_containers/food/snacks/dough(location)
///Cookies by Ume
/datum/chemical_reaction/cookiedough
name = "Dough"
id = "dough"
result = null
required_reagents = list("milk" = 10, "flour" = 10, "sugar" = 5)
result_amount = 1
mix_message = "The ingredients form a dough. It smells sweet and yummy."
/datum/chemical_reaction/cookiedough/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i in 1 to created_volume)
new /obj/item/reagent_containers/food/snacks/cookiedough(location)
/datum/chemical_reaction/corn_syrup
name = "corn_syrup"
id = "corn_syrup"
@@ -154,6 +154,19 @@
result_amount = 3
mix_message = "The substance turns neon green and bubbles unnervingly."
/datum/chemical_reaction/stable_mustagen
name = "Stable mutagen"
id = "stable_mutagen"
result = "stable_mutagen"
required_reagents = list("mutagen" = 1, "lithium" = 1, "acetone" = 1, "bromine" = 1)
result_amount = 3
mix_message = "The substance turns a drab green and begins to bubble."
/datum/chemical_reaction/stable_mustagen/stable_mustagen2
id = "stable_mutagen2"
required_reagents = list("mutadone" = 3, "lithium" = 1)
result_amount = 4
/datum/chemical_reaction/heparin
name = "Heparin"
id = "Heparin"
+2 -13
View File
@@ -312,22 +312,11 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
to_chat(user,"<span class='notice'>You detach the conveyor switch.</span>")
qdel(src)
else if(ismultitool(I))
update_multitool_menu(user)
one_way = !one_way
to_chat(user, "<span class='notice'>[src] will now go [one_way ? "forwards only" : "both forwards and backwards"].</span>")
else
return ..()
/obj/machinery/conveyor_switch/multitool_topic(var/mob/user,var/list/href_list,var/obj/O)
..()
if("toggle_logic" in href_list)
one_way = !one_way
update_multitool_menu(user)
/obj/machinery/conveyor_switch/multitool_menu(var/mob/user, var/obj/item/multitool/P)
return {"
<ul>
<li><b>One direction only:</b> <a href='?src=[UID()];toggle_logic=1'>[one_way ? "On" : "Off"]</a></li>
</ul>"}
/obj/machinery/conveyor_switch/power_change()
..()
update_icon()
@@ -623,6 +623,14 @@
build_path = /obj/item/ammo_box/foambox
category = list("initial", "Miscellaneous")
/datum/design/foam_dart_sniper
name = "Box of Sniper Foam Darts"
id = "foam_dart_sniper"
build_type = AUTOLATHE
materials = list(MAT_METAL = 900)
build_path = /obj/item/ammo_box/foambox/sniper
category = list("initial", "Miscellaneous")
//hacked autolathe recipes
/datum/design/flamethrower
name = "Flamethrower"
@@ -728,6 +736,14 @@
build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
category = list("hacked", "Security")
/datum/design/riot_dart_sniper
name = "Foam riot sniper dart"
id = "riot_dart_sniper"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1800) //Discount for making individually - no box = less metal!
build_path = /obj/item/ammo_casing/caseless/foam_dart/sniper/riot
category = list("hacked", "Security")
/datum/design/riot_darts
name = "Foam riot dart box"
id = "riot_darts"
@@ -736,6 +752,14 @@
build_path = /obj/item/ammo_box/foambox/riot
category = list("hacked", "Security")
/datum/design/riot_darts_sniper
name = "Foam riot sniper dart box"
id = "riot_darts_sniper"
build_type = AUTOLATHE
materials = list(MAT_METAL = 90000) //Comes with 40 darts
build_path = /obj/item/ammo_box/foambox/sniper/riot
category = list("hacked", "Security")
/datum/design/a357
name = "Ammo Box (.357)"
id = "a357"
@@ -531,6 +531,16 @@
build_path = /obj/item/organ/internal/heart/cybernetic
category = list("Medical")
/datum/design/cybernetic_heart_u
name = "Upgraded Cybernetic Heart"
desc = "An upgraded cybernetic heart."
id = "cybernetic_heart_u"
req_tech = list("biotech" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/organ/internal/heart/cybernetic/upgraded
category = list("Medical")
/datum/design/cybernetic_lungs
name = "Cybernetic Lungs"
desc = "A pair of cybernetic lungs."
+21
View File
@@ -0,0 +1,21 @@
/obj/machinery/computer/shuttle/ert
name = "specops shuttle console"
req_access = list(access_cent_general)
shuttleId = "specops"
possible_destinations = "specops_home;specops_away;specops_custom"
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/camera_advanced/shuttle_docker/ert
name = "specops navigation computer"
desc = "Used to designate a precise transit location for the specops shuttle."
icon_screen = "navigation"
icon_keyboard = "med_key"
shuttleId = "specops"
shuttlePortId = "specops_custom"
view_range = 13
x_offset = 0
y_offset = 0
resistance_flags = INDESTRUCTIBLE
access_tcomms = FALSE
access_construction = FALSE
access_mining = FALSE
+355
View File
@@ -0,0 +1,355 @@
/obj/machinery/computer/camera_advanced/shuttle_docker
name = "navigation computer"
desc = "Used to designate a precise transit location for a spacecraft."
icon_screen = "navigation"
icon_keyboard = "med_key"
jump_action = null
var/datum/action/innate/shuttledocker_rotate/rotate_action = new
var/datum/action/innate/shuttledocker_place/place_action = new
var/shuttleId = ""
var/shuttlePortId = ""
var/shuttlePortName = "custom location"
var/list/jumpto_ports = list() //list of ports to jump to
var/access_station = TRUE //can we park near X?
var/access_tcomms = TRUE
var/access_construction = TRUE
var/access_mining = TRUE
var/access_derelict = FALSE
var/obj/docking_port/stationary/my_port //the custom docking port placed by this console
var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle
var/view_range = 7
var/x_offset = 0
var/y_offset = 0
var/space_turfs_only = TRUE
var/see_hidden = FALSE
var/designate_time = 0
var/turf/designating_target_loc
/obj/machinery/computer/camera_advanced/shuttle_docker/Initialize()
. = ..()
GLOB.navigation_computers += src
if(access_station)
jumpto_ports += list("nav_z1" = 1)
if(access_tcomms)
jumpto_ports += list("nav_z3" = 1)
if(access_construction)
jumpto_ports += list("nav_z4" = 1)
if(access_mining)
jumpto_ports += list("nav_z5" = 1)
if(access_derelict)
jumpto_ports += list("nav_z6" = 1)
/obj/machinery/computer/camera_advanced/shuttle_docker/Destroy()
. = ..()
GLOB.navigation_computers -= src
/obj/machinery/computer/camera_advanced/shuttle_docker/attack_hand(mob/user)
if(!shuttle_port && !SSshuttle.getShuttle(shuttleId))
to_chat(user,"<span class='warning'>Warning: Shuttle connection severed!</span>")
return
return ..()
/obj/machinery/computer/camera_advanced/shuttle_docker/GrantActions(mob/living/user)
if(jumpto_ports.len)
jump_action = new /datum/action/innate/camera_jump/shuttle_docker
..()
/* //technically working but some icons are buggy as shit and either don't rotate or rotate wrong :
//namely shuttle walls, shuttle windows, shuttle engines and buckled mobs
if(rotate_action)
rotate_action.target = user
rotate_action.Grant(user)
actions += rotate_action
*/
if(place_action)
place_action.target = user
place_action.Grant(user)
actions += place_action
/obj/machinery/computer/camera_advanced/shuttle_docker/CreateEye()
shuttle_port = SSshuttle.getShuttle(shuttleId)
if(QDELETED(shuttle_port))
shuttle_port = null
return
eyeobj = new /mob/camera/aiEye/remote/shuttle_docker(null, src)
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
the_eye.setDir(shuttle_port.dir)
var/turf/origin = locate(shuttle_port.x + x_offset, shuttle_port.y + y_offset, shuttle_port.z)
for(var/V in shuttle_port.shuttle_areas)
var/area/A = V
for(var/turf/T in A)
if(T.z != origin.z)
continue
var/image/I = image('icons/effects/alphacolors.dmi', origin, "red")
var/x_off = T.x - origin.x
var/y_off = T.y - origin.y
I.loc = locate(origin.x + x_off, origin.y + y_off, origin.z) //we have to set this after creating the image because it might be null, and images created in nullspace are immutable.
I.layer = ABOVE_NORMAL_TURF_LAYER
I.plane = 0
I.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
the_eye.placement_images[I] = list(x_off, y_off)
/obj/machinery/computer/camera_advanced/shuttle_docker/give_eye_control(mob/user)
..()
if(!QDELETED(user) && user.client)
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
var/list/to_add = list()
to_add += the_eye.placement_images
to_add += the_eye.placed_images
if(!see_hidden)
to_add += SSshuttle.hidden_shuttle_turf_images
user.client.images += to_add
user.client.SetView(view_range)
/obj/machinery/computer/camera_advanced/shuttle_docker/remove_eye_control(mob/living/user)
..()
if(!QDELETED(user) && user.client)
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
var/list/to_remove = list()
to_remove += the_eye.placement_images
to_remove += the_eye.placed_images
if(!see_hidden)
to_remove += SSshuttle.hidden_shuttle_turf_images
user.client.images -= to_remove
user.client.SetView(7)
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/placeLandingSpot()
if(designating_target_loc || !current_user)
return
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
var/landing_clear = checkLandingSpot()
if(designate_time && (landing_clear != SHUTTLE_DOCKER_BLOCKED))
to_chat(current_user, "<span class='warning'>Targeting transit location, please wait [DisplayTimeText(designate_time)]...</span>")
designating_target_loc = the_eye.loc
var/wait_completed = do_after(current_user, designate_time, FALSE, designating_target_loc, TRUE, CALLBACK(src, /obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget))
designating_target_loc = null
if(!current_user)
return
if(!wait_completed)
to_chat(current_user, "<span class='warning'>Operation aborted.</span>")
return
landing_clear = checkLandingSpot()
if(landing_clear != SHUTTLE_DOCKER_LANDING_CLEAR)
switch(landing_clear)
if(SHUTTLE_DOCKER_BLOCKED)
to_chat(current_user, "<span class='warning'>Invalid transit location</span>")
if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT)
to_chat(current_user, "<span class='warning'>Unknown object detected in landing zone. Please designate another location.</span>")
return
if(!my_port)
my_port = new()
my_port.name = shuttlePortName
my_port.id = shuttlePortId
my_port.height = shuttle_port.height
my_port.width = shuttle_port.width
my_port.dheight = shuttle_port.dheight
my_port.dwidth = shuttle_port.dwidth
my_port.hidden = shuttle_port.hidden
my_port.register()
my_port.setDir(the_eye.dir)
my_port.forceMove(locate(eyeobj.x - x_offset, eyeobj.y - y_offset, eyeobj.z))
if(current_user.client)
current_user.client.images -= the_eye.placed_images
QDEL_LIST(the_eye.placed_images)
for(var/V in the_eye.placement_images)
var/image/I = V
var/image/newI = image('icons/effects/alphacolors.dmi', the_eye.loc, "blue")
newI.loc = I.loc //It is highly unlikely that any landing spot including a null tile will get this far, but better safe than sorry.
newI.layer = ABOVE_OPEN_TURF_LAYER
newI.plane = 0
newI.mouse_opacity = 0
the_eye.placed_images += newI
if(current_user.client)
current_user.client.images += the_eye.placed_images
to_chat(current_user, "<span class='notice'>Transit location designated</span>")
return
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/canDesignateTarget()
if(!designating_target_loc || !current_user || (eyeobj.loc != designating_target_loc) || (stat & (NOPOWER|BROKEN)) )
return FALSE
return TRUE
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/rotateLandingSpot()
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
var/list/image_cache = the_eye.placement_images
the_eye.setDir(turn(the_eye.dir, -90))
for(var/i in 1 to image_cache.len)
var/image/pic = image_cache[i]
var/list/coords = image_cache[pic]
var/Tmp = coords[1]
coords[1] = coords[2]
coords[2] = -Tmp
pic.loc = locate(the_eye.x + coords[1], the_eye.y + coords[2], the_eye.z)
var/Tmp = x_offset
x_offset = y_offset
y_offset = -Tmp
checkLandingSpot()
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/checkLandingSpot()
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
var/turf/eyeturf = get_turf(the_eye)
if(!eyeturf)
return SHUTTLE_DOCKER_BLOCKED
. = SHUTTLE_DOCKER_LANDING_CLEAR
var/list/bounds = shuttle_port.return_coords(the_eye.x - x_offset, the_eye.y - y_offset, the_eye.dir)
var/list/overlappers = SSshuttle.get_dock_overlap(bounds[1], bounds[2], bounds[3], bounds[4], the_eye.z)
var/list/image_cache = the_eye.placement_images
for(var/i in 1 to image_cache.len)
var/image/I = image_cache[i]
var/list/coords = image_cache[I]
var/turf/T = locate(eyeturf.x + coords[1], eyeturf.y + coords[2], eyeturf.z)
I.loc = T
switch(checkLandingTurf(T, overlappers))
if(SHUTTLE_DOCKER_LANDING_CLEAR)
I.icon_state = "green"
if(SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT)
I.icon_state = "green"
if(. == SHUTTLE_DOCKER_LANDING_CLEAR)
. = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT
else
I.icon_state = "red"
. = SHUTTLE_DOCKER_BLOCKED
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/checkLandingTurf(turf/T, list/overlappers)
// Too close to the map edge is never allowed
if(!T || T.x <= 10 || T.y <= 10 || T.x >= world.maxx - 10 || T.y >= world.maxy - 10)
return SHUTTLE_DOCKER_BLOCKED
// If it's one of our shuttle areas assume it's ok to be there
if(shuttle_port.shuttle_areas[T.loc])
return SHUTTLE_DOCKER_LANDING_CLEAR
. = SHUTTLE_DOCKER_LANDING_CLEAR
// See if the turf is hidden from us
var/list/hidden_turf_info
if(!see_hidden)
hidden_turf_info = SSshuttle.hidden_shuttle_turfs[T]
if(hidden_turf_info)
. = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT
if(space_turfs_only)
var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type
if(!ispath(turf_type, /turf/space))
return SHUTTLE_DOCKER_BLOCKED
if(istype(T.loc.type, /area/syndicate_depot))
return SHUTTLE_DOCKER_BLOCKED
// Checking for overlapping dock boundaries
for(var/i in 1 to overlappers.len)
var/obj/docking_port/port = overlappers[i]
if(port == my_port || locate(port) in jumpto_ports)
continue
var/port_hidden = !see_hidden && port.hidden
var/list/overlap = overlappers[port]
var/list/xs = overlap[1]
var/list/ys = overlap[2]
if(xs["[T.x]"] && ys["[T.y]"])
if(port_hidden)
. = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT
else
return SHUTTLE_DOCKER_BLOCKED
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/update_hidden_docking_ports(list/remove_images, list/add_images)
if(!see_hidden && current_user && current_user.client)
current_user.client.images -= remove_images
current_user.client.images += add_images
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
shuttleId = port.id
shuttlePortId = "[port.id]_custom"
if(dock)
jumpto_ports[dock.id] = TRUE
/mob/camera/aiEye/remote/shuttle_docker
visible_icon = FALSE
use_static = FALSE
simulated = FALSE
var/list/placement_images = list()
var/list/placed_images = list()
/mob/camera/aiEye/remote/shuttle_docker/Initialize(mapload, obj/machinery/computer/camera_advanced/origin)
src.origin = origin
return ..()
/mob/camera/aiEye/remote/shuttle_docker/setLoc(T)
if(istype(get_turf(T), /turf/space) || istype(get_area(T), /area/space) || istype(get_area(T), /area/shuttle))
..()
var/obj/machinery/computer/camera_advanced/shuttle_docker/console = origin
console.checkLandingSpot()
return
else
return
/mob/camera/aiEye/remote/shuttle_docker/update_remote_sight(mob/living/user)
user.sight = SEE_TURFS
return TRUE
/datum/action/innate/shuttledocker_rotate
name = "Rotate"
icon_icon = 'icons/mob/actions/actions_mecha.dmi'
button_icon_state = "mech_cycle_equip_off"
/datum/action/innate/shuttledocker_rotate/Activate()
if(QDELETED(target) || !isliving(target))
return
var/mob/living/C = target
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/shuttle_docker/origin = remote_eye.origin
origin.rotateLandingSpot()
/datum/action/innate/shuttledocker_place
name = "Place"
icon_icon = 'icons/mob/actions/actions_mecha.dmi'
button_icon_state = "mech_zoom_off"
/datum/action/innate/shuttledocker_place/Activate()
if(QDELETED(target) || !isliving(target))
return
var/mob/living/C = target
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/shuttle_docker/origin = remote_eye.origin
origin.placeLandingSpot(target)
/datum/action/innate/camera_jump/shuttle_docker
name = "Jump to Location"
button_icon_state = "camera_jump"
/datum/action/innate/camera_jump/shuttle_docker/Activate()
if(QDELETED(target) || !isliving(target))
return
var/mob/living/C = target
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/shuttle_docker/console = remote_eye.origin
playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
var/list/L = list()
for(var/V in SSshuttle.stationary)
if(!V)
continue
var/obj/docking_port/stationary/S = V
if(console.jumpto_ports[S.id])
L[S.name] = S
playsound(console, 'sound/machines/terminal_prompt.ogg', 25, 0)
var/selected = input("Choose location to jump to", "Locations", null) as null|anything in L
if(QDELETED(src) || QDELETED(target) || !isliving(target))
return
playsound(src, "terminal_type", 25, 0)
if(selected)
var/turf/T = get_turf(L[selected])
if(T)
playsound(console, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0)
remote_eye.setLoc(T)
to_chat(target, "<span class='notice'>Jumped to [selected]</span>")
else
playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
+1 -16
View File
@@ -57,19 +57,4 @@
/obj/machinery/door/airlock/postDock(obj/docking_port/stationary/S1)
. = ..()
if(!S1.lock_shuttle_doors && id_tag == "s_docking_airlock")
INVOKE_ASYNC(src, .proc/unlock)
// Shuttle Rotation //
/atom/proc/shuttleRotate(rotation)
//rotate our direction
dir = angle2dir(rotation+dir2angle(dir))
//rotate the pixel offsets too.
if(pixel_x || pixel_y)
if(rotation < 0)
rotation += 360
for(var/turntimes=rotation/90;turntimes>0;turntimes--)
var/oldPX = pixel_x
var/oldPY = pixel_y
pixel_x = oldPY
pixel_y = (oldPX*(-1))
INVOKE_ASYNC(src, .proc/unlock)
+19 -35
View File
@@ -24,6 +24,7 @@
var/timid = FALSE
var/list/ripples = list()
var/hidden = FALSE //are we invisible to shuttle navigation computers?
//these objects are indestructable
/obj/docking_port/Destroy(force)
@@ -76,6 +77,12 @@
_y + (-dwidth+width-1)*sin + (-dheight+height-1)*cos
)
//returns turfs within our projected rectangle in no particular order
/obj/docking_port/proc/return_turfs()
var/list/L = return_coords()
var/turf/T0 = locate(L[1], L[2], z)
var/turf/T1 = locate(L[3], L[4], z)
return block(T0, T1)
//returns turfs within our projected rectangle in a specific order.
//this ensures that turfs are copied over in the same order, regardless of any rotation
@@ -200,6 +207,7 @@
icon_state = "pinonclose"
var/area/shuttle/areaInstance
var/list/shuttle_areas
var/timer //used as a timer (if you want time left to complete move, use timeLeft proc)
var/mode = SHUTTLE_IDLE //current shuttle mode (see global defines)
@@ -227,12 +235,16 @@
highlight("#0f0")
#endif
/obj/docking_port/mobile/Initialize()
if(!timid)
register()
shuttle_areas = list()
var/list/all_turfs = return_ordered_turfs(x, y, z, dir)
for(var/i in 1 to all_turfs.len)
var/turf/curT = all_turfs[i]
var/area/cur_area = curT.loc
if(istype(cur_area, areaInstance))
shuttle_areas[cur_area] = TRUE
..()
/obj/docking_port/mobile/register()
@@ -255,6 +267,7 @@
areaInstance = null
destination = null
previous = null
shuttle_areas = null
return ..()
//this is a hook for custom behaviour. Maybe at some point we could add checks to see if engines are intact
@@ -819,13 +832,6 @@
spawn(600) //One minute cooldown
cooldown = 0
/obj/machinery/computer/shuttle/ert
name = "specops shuttle console"
//circuit = /obj/item/circuitboard/ert
req_access = list(access_cent_general)
shuttleId = "specops"
possible_destinations = "specops_home;specops_away"
/obj/machinery/computer/shuttle/white_ship
name = "White Ship Console"
desc = "Used to control the White Ship."
@@ -839,6 +845,7 @@
circuit = /obj/item/circuitboard/golem_ship
shuttleId = "freegolem"
possible_destinations = "freegolem_z3;freegolem_z5;freegolem_z1;freegolem_z6"
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/shuttle/golem_ship/attack_hand(mob/user)
if(!isgolem(user))
@@ -846,12 +853,6 @@
return
..()
/obj/machinery/computer/shuttle/vox
name = "skipjack control console"
req_access = list(access_vox)
shuttleId = "skipjack"
possible_destinations = "skipjack_away;skipjack_ne;skipjack_nw;skipjack_se;skipjack_sw;skipjack_z5"
/obj/machinery/computer/shuttle/engineering
name = "Engineering Shuttle Console"
desc = "Used to call and send the engineering shuttle."
@@ -869,28 +870,11 @@
desc = "Used to call and send the administration shuttle."
shuttleId = "admin"
possible_destinations = "admin_home;admin_away"
/obj/machinery/computer/shuttle/sst
name = "Syndicate Strike Time Shuttle Console"
desc = "Used to call and send the SST shuttle."
icon_keyboard = "syndie_key"
icon_screen = "syndishuttle"
req_access = list(access_syndicate)
shuttleId = "sst"
possible_destinations = "sst_home;sst_away"
/obj/machinery/computer/shuttle/sit
name = "Syndicate Infiltration Team Shuttle Console"
desc = "Used to call and send the SIT shuttle."
icon_keyboard = "syndie_key"
icon_screen = "syndishuttle"
req_access = list(access_syndicate)
shuttleId = "sit"
possible_destinations = "sit_arrivals;sit_engshuttle;sit_away"
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/shuttle/trade
name = "Freighter Console"
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/shuttle/trade/sol
req_access = list(access_trade_sol)
+91
View File
@@ -0,0 +1,91 @@
/*
All shuttleRotate procs go here
If ever any of these procs are useful for non-shuttles, rename it to proc/rotate and move it to be a generic atom proc
*/
/************************************Base proc************************************/
/atom/proc/shuttleRotate(rotation, params=ROTATE_DIR|ROTATE_SMOOTH|ROTATE_OFFSET)
if(params & ROTATE_DIR)
//rotate our direction
setDir(angle2dir(rotation+dir2angle(dir)))
//resmooth if need be.
if(smooth && (params & ROTATE_SMOOTH))
queue_smooth(src)
//rotate the pixel offsets too.
if((pixel_x || pixel_y) && (params & ROTATE_OFFSET))
if(rotation < 0)
rotation += 360
for(var/turntimes=rotation/90;turntimes>0;turntimes--)
var/oldPX = pixel_x
var/oldPY = pixel_y
pixel_x = oldPY
pixel_y = (oldPX*(-1))
/************************************Turf rotate procs************************************/
/************************************Mob rotate procs************************************/
//override to avoid rotating pixel_xy on mobs
/mob/shuttleRotate(rotation, params)
params = NONE
. = ..()
if(!buckled)
setDir(angle2dir(rotation+dir2angle(dir)))
/mob/dead/observer/shuttleRotate(rotation, params)
. = ..()
update_icons()
/************************************Structure rotate procs************************************/
/obj/structure/cable/shuttleRotate(rotation, params)
params &= ~ROTATE_DIR
. = ..()
if(d1)
d1 = angle2dir(rotation+dir2angle(d1))
if(d2)
d2 = angle2dir(rotation+dir2angle(d2))
//d1 should be less than d2 for cable icons to work
if(d1 > d2)
var/temp = d1
d1 = d2
d2 = temp
update_icon()
//Fixes dpdir on shuttle rotation
/obj/structure/disposalpipe/shuttleRotate(rotation, params)
. = ..()
var/new_dpdir = 0
for(var/D in list(NORTH, SOUTH, EAST, WEST))
if(dpdir & D)
new_dpdir = new_dpdir | angle2dir(rotation+dir2angle(D))
dpdir = new_dpdir
/obj/structure/alien/weeds/shuttleRotate(rotation, params)
params &= ~ROTATE_OFFSET
return ..()
//prevents shuttles attempting to rotate this since it messes up sprites
/obj/structure/table/shuttleRotate(rotation, params)
params = NONE
return ..()
/obj/structure/table_frame/shuttleRotate(rotation, params)
params = NONE
return ..()
/************************************Machine rotate procs************************************/
//prevents shuttles attempting to rotate this since it messes up sprites
/obj/machinery/gateway/shuttleRotate(rotation, params)
params = NONE
return ..()
//prevents shuttles attempting to rotate this since it messes up sprites
/obj/machinery/gravity_generator/shuttleRotate(rotation, params)
params = NONE
return ..()
+54 -2
View File
@@ -7,7 +7,8 @@
req_access = list(access_syndicate)
circuit = /obj/item/circuitboard/shuttle/syndicate
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s;syndicate_custom"
resistance_flags = INDESTRUCTIBLE
var/challenge = FALSE
var/moved = FALSE
@@ -40,4 +41,55 @@
return 0
..()
#undef SYNDICATE_CHALLENGE_TIMER
/obj/machinery/computer/shuttle/sst
name = "Syndicate Strike Time Shuttle Console"
desc = "Used to call and send the SST shuttle."
icon_keyboard = "syndie_key"
icon_screen = "syndishuttle"
req_access = list(access_syndicate)
shuttleId = "sst"
possible_destinations = "sst_home;sst_away;sst_custom"
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/shuttle/sit
name = "Syndicate Infiltration Team Shuttle Console"
desc = "Used to call and send the SIT shuttle."
icon_keyboard = "syndie_key"
icon_screen = "syndishuttle"
req_access = list(access_syndicate)
shuttleId = "sit"
possible_destinations = "sit_arrivals;sit_engshuttle;sit_away;sit_custom"
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate
name = "syndicate shuttle navigation computer"
desc = "Used to designate a precise transit location for the syndicate shuttle."
icon_screen = "syndinavigation"
icon_keyboard = "syndie_key"
shuttleId = "syndicate"
shuttlePortId = "syndicate_custom"
view_range = 13
x_offset = -5
y_offset = -1
see_hidden = TRUE
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/sst
name = "SST shuttle navigation computer"
desc = "Used to designate a precise transit location for the SST shuttle."
shuttleId = "sst"
shuttlePortId = "sst_custom"
view_range = 13
x_offset = 0
y_offset = 0
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/sit
name = "SIT shuttle navigation computer"
desc = "Used to designate a precise transit location for the SIT shuttle."
shuttleId = "sit"
shuttlePortId = "sit_custom"
view_range = 13
x_offset = 0
y_offset = 0
#undef SYNDICATE_CHALLENGE_TIMER
+19
View File
@@ -0,0 +1,19 @@
/obj/machinery/computer/shuttle/vox
name = "skipjack control console"
req_access = list(access_vox)
shuttleId = "skipjack"
possible_destinations = "skipjack_away;skipjack_ne;skipjack_nw;skipjack_se;skipjack_sw;skipjack_z5;skipjack_custom"
resistance_flags = INDESTRUCTIBLE
/obj/machinery/computer/camera_advanced/shuttle_docker/vox
name = "skipjack navigation computer"
desc = "Used to designate a precise transit location for the skipjack."
icon_screen = "navigation"
icon_keyboard = "med_key"
shuttleId = "skipjack"
shuttlePortId = "skipjack_custom"
view_range = 13
x_offset = -10
y_offset = -10
resistance_flags = INDESTRUCTIBLE
access_derelict = TRUE
@@ -27,6 +27,7 @@
flags = traits
build_space_destination_arrays()
set_linkage(transition_type)
set_navbeacon()
/datum/space_level/Destroy()
if(linkage == CROSSLINKED)
@@ -134,6 +135,14 @@
if(SELFLOOPING)
link_to_self() // `link_to_self` is defined in space_transitions.dm
//create docking ports for navigation consoles to jump to
/datum/space_level/proc/set_navbeacon()
var/obj/docking_port/stationary/D = new /obj/docking_port/stationary(src)
D.name = name
D.id = "nav_z[zpos]"
D.register()
D.forceMove(locate(200, 200, zpos))
var/list/atmos_machine_typecache = typecacheof(/obj/machinery/atmospherics)
var/list/cable_typecache = typecacheof(/obj/structure/cable)
var/list/maploader_typecache = typecacheof(/obj/effect/landmark/map_loader)
+9 -10
View File
@@ -33,9 +33,8 @@
..()
to_chat(user, "<span class='info'>[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.</span>")
/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/W, mob/user, params)
..()
if(isscrewdriver(W))
/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/I, mob/user, params)
if(isscrewdriver(I))
if(parent_organ == "r_arm")
parent_organ = "l_arm"
else
@@ -43,8 +42,8 @@
slot = parent_organ + "_device"
to_chat(user, "<span class='notice'>You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.</span>")
update_icon()
else if(istype(W, /obj/item/card/emag))
emag_act()
else
return ..()
/obj/item/organ/internal/cyberimp/arm/remove(mob/living/carbon/M, special = 0)
Retract()
@@ -126,7 +125,7 @@
// You can emag the arm-mounted implant by activating it while holding emag in it's hand.
var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand)
if(istype(owner.get_item_by_slot(arm_slot), /obj/item/card/emag) && emag_act())
if(istype(owner.get_item_by_slot(arm_slot), /obj/item/card/emag) && emag_act(owner))
return
if(!holder || (holder in src))
@@ -205,12 +204,12 @@
/obj/item/organ/internal/cyberimp/arm/toolset/l
parent_organ = "l_arm"
/obj/item/organ/internal/cyberimp/arm/toolset/emag_act()
/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user)
if(!(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list))
to_chat(usr, "<span class='notice'>You unlock [src]'s integrated knife!</span>")
to_chat(user, "<span class='notice'>You unlock [src]'s integrated knife!</span>")
items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
return 1
return 0
return TRUE
return FALSE
/obj/item/organ/internal/cyberimp/arm/esword
name = "arm-mounted energy blade"
+1
View File
@@ -210,6 +210,7 @@
blood_data["real_name"] = real_name
blood_data["blood_color"] = dna.species.blood_color
blood_data["factions"] = faction
blood_data["dna"] = dna.Clone()
return blood_data
//get the id of the substance this mob use as blood.
+101 -2
View File
@@ -146,5 +146,104 @@
icon_state = "heart-c-on"
icon_base = "heart-c"
dead_icon = "heart-c-off"
origin_tech = "biotech=5"
status = ORGAN_ROBOT
status = ORGAN_ROBOT
/obj/item/organ/internal/heart/cybernetic/upgraded
name = "upgraded cybernetic heart"
desc = "A more advanced version of a cybernetic heart. Grants the user additional stamina and heart stability, but the electronics are vulnerable to shock."
icon_state = "heart-c-u-on"
icon_base = "heart-c-u"
dead_icon = "heart-c-u-off"
var/emagged = FALSE
var/attempted_restart = FALSE
/obj/item/organ/internal/heart/cybernetic/upgraded/on_life()
if(!ishuman(owner))
return
if(!(status & ORGAN_DEAD) && !attempted_restart && !beating)
to_chat(owner, "<span class='warning'>Your [name] detects a cardiac event and attempts to return to its normal rhythm!</span>")
if(prob(20) && emagged)
attempted_restart = TRUE
Restart()
addtimer(CALLBACK(src, .proc/message_to_owner, owner, "<span class='warning'>Your [name] returns to its normal rhythm!</span>"), 30)
addtimer(CALLBACK(src, .proc/recharge), 200)
else if(prob(10))
attempted_restart = TRUE
Restart()
addtimer(CALLBACK(src, .proc/message_to_owner, owner, "<span class='warning'>Your [name] returns to its normal rhythm!</span>"), 30)
addtimer(CALLBACK(src, .proc/recharge), 300)
else
attempted_restart = TRUE
if(emagged)
addtimer(CALLBACK(src, .proc/recharge), 200)
else
addtimer(CALLBACK(src, .proc/recharge), 300)
addtimer(CALLBACK(src, .proc/message_to_owner, owner, "<span class='warning'>Your [name] fails to return to its normal rhythm!</span>"), 30)
if(!(status & ORGAN_DEAD))
var/boost = emagged ? 2 : 1
owner.AdjustDrowsy(-4 * boost)
owner.AdjustParalysis(-1 * boost)
owner.AdjustStunned(-1 * boost)
owner.AdjustWeakened(-1 * boost)
owner.SetSleeping(0)
owner.adjustStaminaLoss(-1 * boost)
/obj/item/organ/internal/heart/cybernetic/upgraded/proc/message_to_owner(mob/M, message)
to_chat(M, message)
/obj/item/organ/internal/heart/cybernetic/upgraded/proc/recharge()
attempted_restart = FALSE
/obj/item/organ/internal/heart/cybernetic/upgraded/emag_act(mob/user)
if(!emagged)
to_chat(user, "<span class='warning'>You disable the safeties on [src]</span>")
emagged = TRUE
else
to_chat(user, "<span class='warning'>You re-enable the safeties on [src]</span>")
emagged = FALSE
/obj/item/organ/internal/heart/cybernetic/upgraded/emp_act(severity)
..()
if(emp_proof)
return
necrotize()
/obj/item/organ/internal/heart/cybernetic/upgraded/shock_organ(intensity)
if(!ishuman(owner))
return
intensity = min(intensity, 100)
var/numHigh = round(intensity / 5)
var/numMid = round(intensity / 10)
var/numLow = round(intensity / 20)
if(emagged && !(status & ORGAN_DEAD))
if(prob(numHigh))
to_chat(owner, "<span class='warning'>Your [name] spasms violently!</span>")
owner.adjustBruteLoss(numHigh)
if(prob(numHigh))
to_chat(owner, "<span class='warning'>Your [name] shocks you painfully!</span>")
owner.adjustFireLoss(numHigh)
if(prob(numMid))
to_chat(owner, "<span class='warning'>Your [name] lurches awkwardly!</span>")
Stop()
if(prob(numMid))
to_chat(owner, "<span class='danger'>Your [name] stops beating!</span>")
Stop()
if(prob(numLow))
to_chat(owner, "<span class='danger'>Your [name] shuts down!</span>")
necrotize()
else if(!emagged && !(status & ORGAN_DEAD))
if(prob(numMid))
to_chat(owner, "<span class='warning'>Your [name] spasms violently!</span>")
owner.adjustBruteLoss(numMid)
if(prob(numMid))
to_chat(owner, "<span class='warning'>Your [name] shocks you painfully!</span>")
owner.adjustFireLoss(numMid)
if(prob(numLow))
to_chat(owner, "<span class='warning'>Your [name] lurches awkwardly!</span>")
Stop()
+17 -1
View File
@@ -63,6 +63,15 @@
if(species_override)
dna.species = new species_override
/obj/item/organ/attackby(obj/item/I, mob/user, params)
if(is_robotic() && istype(I, /obj/item/stack/nanopaste))
var/obj/item/stack/nanopaste/nano = I
nano.use(1)
rejuvenate()
to_chat(user, "<span class='notice'>You repair the damage on [src].</span>")
return
return ..()
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
dna = new_dna.Clone()
@@ -138,7 +147,10 @@
/obj/item/organ/examine(mob/user)
..(user)
if(status & ORGAN_DEAD)
to_chat(user, "<span class='notice'>The decay has set in.</span>")
if(!is_robotic())
to_chat(user, "<span class='notice'>The decay has set in.</span>")
else
to_chat(user, "<span class='notice'>It looks in need of repairs.</span>")
/obj/item/organ/proc/handle_germ_effects()
//** Handle the effects of infections
@@ -171,6 +183,7 @@
/obj/item/organ/proc/rejuvenate()
damage = 0
germ_level = 0
surgeryize()
if(is_robotic()) //Robotic organs stay robotic.
status = ORGAN_ROBOT
else
@@ -269,6 +282,9 @@
if(2)
receive_damage(7, 1)
/obj/item/organ/proc/shock_organ(intensity)
return
/obj/item/organ/proc/remove(var/mob/living/user,special = 0)
if(!istype(owner))
return
@@ -262,6 +262,7 @@ This function completely restores a damaged organ to perfect condition.
*/
/obj/item/organ/external/rejuvenate()
damage_state = "00"
surgeryize()
if(is_robotic()) //Robotic organs stay robotic.
status = ORGAN_ROBOT
else
+62 -52
View File
@@ -47,65 +47,75 @@
name = "terror eggs"
icon = 'icons/effects/effects.dmi'
icon_state = "eggs"
var/current_cycle = 0
var/awaymission_infection = 0
var/alternate_ending = 0
var/cycle_num = 0 // # of on_life() cycles completed, never reset
var/egg_progress = 0 // # of on_life() cycles completed, unlike cycle_num this is reset on each hatch event
var/egg_progress_per_hatch = 90 // if egg_progress > this, chance to hatch and reset egg_progress
var/eggs_hatched = 0 // num of hatch events completed
var/eggs_max = 3 // max possible spiderlings you can get from a single infection if its left to run for a very long time
var/awaymission_checked = FALSE
var/awaymission_infection = FALSE // TRUE if infection occurred inside gateway
var/list/types_basic = list(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /mob/living/simple_animal/hostile/poison/terror_spider/green)
/obj/item/organ/internal/body_egg/terror_eggs/on_life()
current_cycle += 1
// Safety first.
if(!owner)
return
// Parasite growth
cycle_num += 1
egg_progress += pick(0, 1, 2)
egg_progress += calc_variable_progress()
// Detect & stop people attempting to bring a gateway white spider infection back to the main station.
if(!awaymission_checked)
awaymission_checked = TRUE
if(is_away_level(owner.z))
awaymission_infection = TRUE
if(awaymission_infection)
if(!is_away_level(owner.z))
owner.gib()
qdel(src)
return
// Detect dying hosts, and try to keep them alive (so spiderlings can hatch) at the cost of some growth progress.
if(owner.health < -25)
to_chat(owner,"<span class='notice'>You feel a strange, blissful senstation.</span>")
owner.adjustBruteLoss(-5)
owner.adjustFireLoss(-5)
owner.adjustToxLoss(-5)
// the spider eggs secrete stimulants to keep their host alive until they hatch
switch(current_cycle)
if(1) // immediately
to_chat(owner,"<span class='danger'>Your wound hurts horribly! </span>")
if(is_away_level(owner.z))
awaymission_infection = 1
if(15) // 30s... enough time for the nerve agent to kick in, the pain to be blocked, and healing to begin
to_chat(owner,"<span class='notice'>The pain has faded, and stopped bleeding, though the skin around it has turned black.</span>")
owner.adjustBruteLoss(-10)
if(30) // 1m... the point where the venom uses and accellerates the healing process, to feed the eggs
to_chat(owner,"<span class='notice'>Your wound has completely sealed up, though the skin is still black. You feel significantly better.</span>")
owner.adjustBruteLoss(-20)
if(90) // 3m... where the eggs are developing, and the wound is turning into a hatching site, but invisibly
to_chat(owner,"<span class='notice'>The black flesh around your old spider bite wound has started to peel off.</span>")
if(100) // 3m20s... where the victim realizes something is wrong - this is not a normal wound
to_chat(owner,"<span class='danger'>The black flesh around your spider bite wound has cracked, and started to split open!</span>")
if(110) // 3m40s...
to_chat(owner,"<span class='danger'>The black flesh splits open completely, revealing a cluster of small black oval shapes inside you, shapes that seem to be moving!</span>")
if(120) // 4m...
if(awaymission_infection && !is_away_level(owner.z))
// we started in the awaymission, we ended on the station.
// To prevent someone bringing an infection back, we're going to trigger an alternate, equally-bad result here.
// Actually, let's make it slightly worse... just to discourage people from bringing back infections.
alternate_ending = 1
to_chat(owner,"<span class='danger'>The shapes extend tendrils out of your wound... no... those are legs! SPIDER LEGS! You have spiderlings growing inside you! You scratch at the wound, but it just aggrivates them - they swarm out of the wound, biting you all over!</span>")
owner.visible_message("<span class='danger'>[owner] flails around on the floor as spiderlings erupt from [owner.p_their()] skin and swarm all over them! </span>")
owner.Stun(20)
owner.Weaken(20)
// yes, this is a long stun - that's intentional. Gotta give the spiderlings time to escape.
if(alternate_ending)
owner.gib()
else
owner.adjustToxLoss(rand(100,180)) // normal case, range: 100-180, average 140, almost crit (150).
if(prob(50))
var/obj/structure/spider/spiderling/terror_spiderling/S1 = new(get_turf(owner))
S1.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/red
S1.name = "red spiderling"
if(prob(50))
var/obj/structure/spider/spiderling/terror_spiderling/S2 = new(get_turf(owner))
S2.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/gray
S2.name = "gray spiderling"
if(prob(50))
var/obj/structure/spider/spiderling/terror_spiderling/S3 = new(get_turf(owner))
S3.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/green
S3.name = "green spiderling"
if(130) // 4m 20s
to_chat(owner,"<span class='danger'>The spiderlings are gone. Your wound, though, looks worse than ever. Remnants of tiny spider eggs, and dead spiders, inside your flesh. Disgusting.</span>")
qdel(src)
egg_progress += 10
// Once at least one egg has hatched from you, you'll need help to reach medbay.
if(eggs_hatched >= 1)
owner.Confused(2)
if(egg_progress > egg_progress_per_hatch && eggs_hatched < eggs_max)
egg_progress -= egg_progress_per_hatch
hatch_egg()
/obj/item/organ/internal/body_egg/terror_eggs/proc/calc_variable_progress()
var/extra_progress = 0
if(owner.nutrition > NUTRITION_LEVEL_FULL)
extra_progress += 1
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
if(antibiotics > 50)
extra_progress -= 0.5
var/boosters = owner.reagents.get_reagent_amount("salglu_solution")
if(boosters > 1)
extra_progress += 1
return extra_progress
/obj/item/organ/internal/body_egg/terror_eggs/proc/hatch_egg()
var/obj/structure/spider/spiderling/terror_spiderling/S = new(get_turf(owner))
if(eggs_hatched >= 2) // on the third egg...
S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/princess
else
S.grow_as = pick(types_basic)
S.immediate_ventcrawl = TRUE
eggs_hatched++
to_chat(owner, "<span class='warning'>A strange prickling sensation moves across your skin... then suddenly the whole world seems to spin around you!</span>")
owner.Paralyse(10)
/obj/item/organ/internal/body_egg/terror_eggs/remove(var/mob/living/carbon/M, var/special = 0)
..()
+3
View File
@@ -86,6 +86,9 @@
src.attack_hand(user)
/obj/machinery/computer/telescience/attack_hand(mob/user)
if(isgolem(user)) //this is why we can't have nice things free golems
to_chat(user, "<span class='warning'>You can't make sense of the console or how to use it.</span>")
return
if(..())
return
interact(user)