mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-15 00:53:23 +01:00
Applies what my mom taught me about conflict resolution
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 neighbour’s 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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user