diff --git a/baystation12.dme b/baystation12.dme index d84c4a3cc51..5c1b234bbb2 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -325,6 +325,7 @@ #include "code\game\dna\dna_modifier.dm" #include "code\game\dna\genes\disabilities.dm" #include "code\game\dna\genes\gene.dm" +#include "code\game\dna\genes\monkey.dm" #include "code\game\dna\genes\powers.dm" #include "code\game\gamemodes\antagspawner.dm" #include "code\game\gamemodes\events.dm" diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 73cdc5f6884..f4e373d0ed0 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -51,7 +51,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/weapon/storage/box/swabs, /obj/item/weapon/storage/box/swabs, /obj/item/weapon/storage/box/slides, - /obj/item/weapon/reagent_containers/spray/luminol) + /obj/item/weapon/reagent_containers/spray/luminol, + /obj/item/device/uv_light) cost = 30 containertype = /obj/structure/closet/crate containername = "Auxiliary forensic tools" @@ -138,6 +139,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/weapon/reagent_containers/food/drinks/flask/barflask, /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, + /obj/item/weapon/reagent_containers/food/drinks/bottle/sarezhiwine, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/lipstick/random, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale, @@ -206,6 +208,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee group = "Atmospherics" + + /datum/supply_packs/inflatable name = "Inflatable barriers" contains = list(/obj/item/weapon/storage/briefcase/inflatable, @@ -1092,6 +1096,22 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee containername = "Sterile equipment crate" group = "Medical" +/datum/supply_packs/beer + contains = list(/obj/structure/reagent_dispensers/beerkeg) + name = "Beer Keg" + cost = 10 + containertype = /obj/structure/largecrate + containername = "Beer Crate" + group = "Hospitality" + +/datum/supply_packs/xuizi + contains = list(/obj/structure/reagent_dispensers/xuizikeg) + name = "Xuizi Juice Keg" + cost = 20 + containertype = /obj/structure/largecrate + containername = "Xuizi Juice Crate" + group = "Hospitality" + /datum/supply_packs/randomised/pizza num_contained = 5 contains = list(/obj/item/pizzabox/margherita, diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index c93a19d5673..2c0b456833b 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -1,175 +1,33 @@ /datum/dna/gene/monkey - name="Monkey" + name = "Monkey" /datum/dna/gene/monkey/New() - block=MONKEYBLOCK + block = MONKEYBLOCK /datum/dna/gene/monkey/can_activate(var/mob/M,var/flags) - return istype(M, /mob/living/carbon/human) || istype(M,/mob/living/carbon/monkey) + return ishuman(M) -/datum/dna/gene/monkey/activate(var/mob/living/M, var/connected, var/flags) - if(!istype(M,/mob/living/carbon/human)) - //testing("Cannot monkey-ify [M], type is [M.type].") - return - var/mob/living/carbon/human/H = M - H.transforming = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null - - if(!connected) - for(var/obj/item/W in (H.contents-implants)) - if (W==H.w_uniform) // will be teared - continue - H.drop_from_inventory(W) - M.transforming = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - qdel(animation) - - - var/mob/living/carbon/monkey/O = null - if(H.species.primitive) - O = new H.species.primitive(src) +/datum/dna/gene/monkey/activate(var/mob/living/carbon/C) + var/mob/living/carbon/human/H + if(ishuman(C)) + H = C + else + return + if(!islesserform(H)) + H = H.monkeyize(1) + H.name = H.species.get_random_name() // keep the realname + +/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/C) + var/mob/living/carbon/human/H + if(ishuman(C)) + H = C else - H.gib() //Trying to change the species of a creature with no primitive var set is messy. return - if(M) - if (M.dna) - O.dna = M.dna.Clone() - M.dna = null + if(islesserform(H)) + H = H.humanize(1) // woo transform procs! - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - - for(var/obj/T in (M.contents-implants)) - qdel(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the cute little monkey - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) - O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss() + 20) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - O.a_intent = I_HURT - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - qdel(M) - return - -/datum/dna/gene/monkey/deactivate(var/mob/living/M, var/connected, var/flags) - if(!istype(M,/mob/living/carbon/monkey)) - //testing("Cannot humanize [M], type is [M.type].") - return - var/mob/living/carbon/monkey/Mo = M - Mo.transforming = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) - Mo.drop_from_inventory(W) - M.transforming = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(48) - qdel(animation) - - var/mob/living/carbon/human/O - if(Mo.greaterform) - O = new(src, Mo.greaterform) - else - O = new(src) - - if (M.dna.GetUIState(DNA_UI_GENDER)) - O.gender = FEMALE - else - O.gender = MALE - - if (M) - if (M.dna) - O.dna = M.dna.Clone() - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - //for(var/obj/T in M) - // qdel(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the human - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - - var/i - while (!i) - var/randomname - if (O.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) - continue - else - O.real_name = randomname - O.dna.real_name = randomname - i++ - O.UpdateAppearance() - O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss()) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - qdel(M) - return + if(!H.dna.real_name) + var/randomname = H.species.get_random_name() + H.real_name = randomname + H.dna.real_name = randomname \ No newline at end of file diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm index 046da249b1d..6f3b6119776 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm @@ -92,32 +92,89 @@ if(!ability_prechecks(user, price)) return - var/title = input("Select message title: ") - var/text = input("Select message text: ") - if(!title || !text || !ability_pay(user, price)) - user << "Hack Aborted" - return + var/reporttitle + var/reportbody + var/reporttype = input(usr, "Choose whether to use a template or custom report.", "Create Command Report") in list("Template", "Custom", "Cancel") + switch(reporttype) + if("Template") + establish_db_connection(dbcon) + if (!dbcon.IsConnected()) + src << "Unable to connect to the database." + return + var/DBQuery/query = dbcon.NewQuery("SELECT title, message FROM ss13_ccia_general_notice_list WHERE deleted_at IS NULL") + query.Execute() - log_ability_use(user, "advanced encryption hack") + var/list/template_names = list() + var/list/templates = list() - if(prob(50) && user.hack_can_fail) - user << "Hack Failed." - if(prob(5)) - user.hack_fails ++ - announce_hack_failure(user, "quantum message relay") - log_ability_use(user, "elite encryption hack (CRITFAIL - title: [title])") + while (query.NextRow()) + template_names += query.item[1] + templates[query.item[1]] = query.item[2] + + // Catch empty list + if (!templates.len) + src << "There are no templates in the database." + return + + reporttitle = input(usr, "Please select a command report template.", "Create Command Report") in template_names + reportbody = templates[reporttitle] + + if("Custom") + reporttitle = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null) + if(!reporttitle) + reporttitle = "NanoTrasen Update" + reportbody = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "Body", "") as message|null, extra = 0) + if(!reportbody) + return + else return - log_ability_use(user, "elite encryption hack (FAIL - title: [title])") - return - log_ability_use(user, "elite encryption hack (SUCCESS - title: [title])") - command_announcement.Announce(text, title) - for (var/obj/machinery/computer/communications/C in machines) - if(! (C.stat & (BROKEN|NOPOWER) ) ) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "[command_name()] Update" - P.info = replacetext(text, "\n", "
") - P.update_space(P.info) - P.update_icon() + + if (reporttype == "Template") + sanitizeSafe(alert(usr, "Would you like it to appear as if CCIAMS made the report?",,"Yes","No")) + if ("Yes") + reportbody += "\n\n- CCIAMS, [commstation_name()]" + else + + switch(alert("Should this be announced to the general population?",,"Yes","No")) + if("Yes") + if(!reporttitle || !reportbody || !ability_pay(user, price)) + user << "Hack Aborted due to no title, no body message, or you do not have enough CPU for this action." + return + + log_ability_use(user, "advanced encryption hack") + + if(prob(50) && user.hack_can_fail) + user << "Hack Failed." + if(prob(5)) + user.hack_fails ++ + announce_hack_failure(user, "quantum message relay") + log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])") + return + log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])") + return + log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])") + command_announcement.Announce("[reportbody]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); + + if("No") + if(!reporttitle || !reportbody || !ability_pay(user, price)) + user << "Hack Aborted due to no title, no body message, or you do not have enough CPU for this action." + return + + log_ability_use(user, "advanced encryption hack") + + if(prob(50) && user.hack_can_fail) + user << "Hack Failed." + if(prob(5)) + user.hack_fails ++ + announce_hack_failure(user, "quantum message relay") + log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])") + return + log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])") + return + log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])") + world << "\red New [company_name] Update available at all communication consoles." + world << sound('sound/AI/commandreport.ogg') + post_comm_message(reporttitle, reportbody) /datum/game_mode/malfunction/verb/elite_encryption_hack() set category = "Software" @@ -219,4 +276,4 @@ user.verbs += new/datum/game_mode/malfunction/verb/ai_destroy_station() -// END ABILITY VERBS \ No newline at end of file +// END ABILITY VERBS diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 341d2ba8e1d..387520d100d 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -680,7 +680,7 @@ T.mind.vampire.master = src vampire.thralls += T T << "You have been forced into a blood bond by [T.mind.vampire.master], and are thus their thrall. While a thrall may feel a myriad of emotions towards their master, ranging from fear, to hate, to love; the supernatural bond between them still forces the thrall to obey their master, and to listen to the master's commands.

You must obey your master's orders, you must protect them, you cannot harm them.
" - + src << "You have completed the thralling process. They are now your slave and will obey your commands." admin_attack_log(src, T, "enthralled [key_name(T)]", "was enthralled by [key_name(src)]", "successfully enthralled") vampire.use_blood(150) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 77c6dc7ec8d..576dd761297 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -62,7 +62,7 @@ economic_modifier = 5 access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks) - minimal_player_age = 5 + minimal_player_age = 7 equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -106,7 +106,7 @@ economic_modifier = 5 access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) - minimal_player_age = 3 + minimal_player_age = 7 equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) @@ -153,7 +153,7 @@ economic_modifier = 4 access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks) - minimal_player_age = 3 + minimal_player_age = 7 equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 938c6af08b2..c417345636c 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -63,7 +63,7 @@ target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." target.ResetSecurityCodes() else - message_admins("[key_name_admin(usr)] detonated [target.name]!") + message_admins("[key_name_admin(usr)] detonated [target.name]!") log_game("[key_name(usr)] detonated [target.name]!",ckey=key_name(usr)) target << "Self-destruct command received." spawn(10) @@ -92,15 +92,10 @@ if(!target || !istype(target)) return - message_admins("[key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [target.name]!") - log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [target.name]!",ckey=key_name(usr)) - target.canmove = !target.canmove - if (target.lockcharge) - target.lockcharge = !target.lockcharge - target << "Your lockdown has been lifted!" - else - target.lockcharge = !target.lockcharge - target << "You have been locked down!" + target.SetLockdown(!target.lockcharge) // Toggle. + message_admins("[key_name_admin(usr)] [target.lockcharge ? "locked down" : "released"] [target.name]!") + log_game("[key_name(usr)] [target.lockcharge ? "locked down" : "released"] [target.name]!",ckey=key_name(usr)) + target << (target.lockcharge ? "You have been locked down!" : "Your lockdown has been lifted!") // Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs. else if (href_list["hack"]) @@ -124,7 +119,7 @@ if(!target || !istype(target)) return - message_admins("[key_name_admin(usr)] emagged [target.name] using robotic console!") + message_admins("[key_name_admin(usr)] emagged [target.name] using robotic console!") log_game("[key_name(usr)] emagged [target.name] using robotic console!",ckey=key_name(usr)) target.emagged = 1 target << "Failsafe protocols overriden. New tools available." @@ -147,7 +142,7 @@ user << "Self-destruct aborted - safety active" return - message_admins("[key_name_admin(usr)] detonated all cyborgs!") + message_admins("[key_name_admin(usr)] detonated all cyborgs!") log_game("[key_name(usr)] detonated all cyborgs!",ckey=key_name(usr)) for(var/mob/living/silicon/robot/R in mob_list) @@ -179,7 +174,7 @@ robot["name"] = R.name if(R.stat) robot["status"] = "Not Responding" - else if (!R.canmove) + else if (R.lockcharge) // changed this from !R.canmove to R.lockcharge because of issues with lockdown and chairs robot["status"] = "Lockdown" else robot["status"] = "Operational" diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index b1372d569d6..04ef89c45b6 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -715,7 +715,8 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/chartreusegreen = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/chartreuseyellow =5, /obj/item/weapon/reagent_containers/food/drinks/bottle/cremewhite = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/brandy = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/guinnes = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/drambuie = 4, - /obj/item/weapon/reagent_containers/food/drinks/bottle/cremeyvette = 4) + /obj/item/weapon/reagent_containers/food/drinks/bottle/cremeyvette = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/xuizijuice = 8, + /obj/item/weapon/reagent_containers/food/drinks/bottle/sarezhiwine = 2, /obj/item/weapon/reagent_containers/food/drinks/bottle/victorygin = 2) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10) vend_delay = 15 idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. diff --git a/code/modules/admin/verbs/bluespacetech.dm b/code/modules/admin/verbs/bluespacetech.dm index f25a668b327..7ee71ad63ea 100644 --- a/code/modules/admin/verbs/bluespacetech.dm +++ b/code/modules/admin/verbs/bluespacetech.dm @@ -329,6 +329,14 @@ C.holder.original_mob = null suicide() +/mob/living/carbon/human/bst/verb/tgm() + set name = "Toggle Godmode" + set desc = "Enable or disable god mode. For testing things that require you to be vulnerable." + set category = "BST" + + status_flags ^= GODMODE + src << span("notice", "God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]") + //Equipment. All should have canremove set to 0 //All items with a /bst need the attack_hand() proc overrided to stop people getting overpowered items. diff --git a/code/modules/cargo/randomstock.dm b/code/modules/cargo/randomstock.dm index 73d1eb4e04a..35c879741cb 100644 --- a/code/modules/cargo/randomstock.dm +++ b/code/modules/cargo/randomstock.dm @@ -115,7 +115,7 @@ var/list/global/random_stock_common = list( "cosmetic" = 2.2, "suitcooler" = 1.2, "officechair" = 1.2, - "booze" = 3.5, + "booze" = 3.7, "plant" = 3.5, "bag" = 2, "extinguish" = 2.2, @@ -795,7 +795,7 @@ var/list/global/random_stock_large = list( break new /obj/structure/bed/chair/office/dark(T) if ("booze") - if (prob(8))//Spare keg of beer + if (prob(8))//Spare keg of beer or xuizi juice var/turf/T = get_turf(L) if (!turf_clear(T)) for (var/turf/U in range(T,1)) @@ -803,7 +803,10 @@ var/list/global/random_stock_large = list( T = U break - new /obj/structure/reagent_dispensers/beerkeg(T) + if (prob(80)) + new /obj/structure/reagent_dispensers/beerkeg(T) + else + new /obj/structure/reagent_dispensers/xuizikeg(T) else var/list/drinks = typesof(/obj/item/weapon/reagent_containers/food/drinks/bottle) drinks -= /obj/item/weapon/reagent_containers/food/drinks/bottle @@ -1657,7 +1660,7 @@ var/list/global/random_stock_large = list( if ("bike") new /obj/vehicle/bike(L) - + if ("sol") if (prob(50)) new /obj/structure/closet/sol/navy(L) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 5d15df1d997..bd2560047be 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -241,8 +241,12 @@ if(target_mob != H) H << "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name]." - target_mob << "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected." - target_mob.reagents.add_reagent(charge.display_name, chems_to_use) + + if(target_mob.is_physically_disabled()) + target_mob.reagents.add_reagent(charge.display_name, chems_to_use) + else + target_mob << "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected." + target_mob.reagents.add_reagent(charge.display_name, chems_to_use) charge.charges -= chems_to_use if(charge.charges < 0) charge.charges = 0 diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm index 91b435a0c8c..a64b2eed527 100644 --- a/code/modules/events/viral_infection.dm +++ b/code/modules/events/viral_infection.dm @@ -21,16 +21,9 @@ datum/event/viral_infection/setup() viruses += D datum/event/viral_infection/announce() - var/level - if (severity == EVENT_LEVEL_MUNDANE) - return - else if (severity == EVENT_LEVEL_MODERATE) - level = pick("one", "two", "three", "four") - else - level = "five" if (severity == EVENT_LEVEL_MAJOR || prob(60)) - command_announcement.Announce("Confirmed outbreak of level [level] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') + command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') datum/event/viral_infection/start() if(!viruses.len) return diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 3e0bc2582a0..8ddcb1e883b 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -569,6 +569,7 @@ I said no! items = list() result = /obj/item/weapon/reagent_containers/food/snacks/slimesoup + /datum/recipe/boiledslimeextract reagents = list("water" = 5) items = list( diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5d0ee11a225..07dfd95a69a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1128,7 +1128,7 @@ else usr << "You failed to check the pulse. Try again." -/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour) +/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/kpg=0) if(!dna) if(!new_species) @@ -1180,7 +1180,7 @@ species.create_organs(src) - species.handle_post_spawn(src) + species.handle_post_spawn(src,kpg) // should be zero by default maxHealth = species.total_health diff --git a/code/modules/mob/living/carbon/human/intoxication.dm b/code/modules/mob/living/carbon/human/intoxication.dm index 24fae1d543d..4b838894c46 100644 --- a/code/modules/mob/living/carbon/human/intoxication.dm +++ b/code/modules/mob/living/carbon/human/intoxication.dm @@ -12,7 +12,7 @@ #define BASE_DIZZY 100 -#define ALCOHOL_FILTRATION_RATE 0.02//The base rate at which intoxication decreases per proc. this is actually multiplied by 3 most of the time if the liver is healthy +#define ALCOHOL_FILTRATION_RATE 0.015//The base rate at which intoxication decreases per proc. this is actually multiplied by 3 most of the time if the liver is healthy #define BASE_VOMIT_CHANCE 2 #define VOMIT_CHANCE_SCALE 0.2//An extra 1% for every 5 units over the vomiting threshold @@ -26,6 +26,17 @@ var/mob/living/carbon/human/alcohol_clumsy = 0 intoxication = 0 return + //Godmode messes some things up, so no more BSTs getting drunk unless they toggle it off + if (status_flags & GODMODE) + intoxication = 0 //Zero out intoxication but don't return, let the rest of this function run to remove any residual effects + slurring = 0 + confused = 0 + eye_blurry = 0 + drowsyness = 0 + paralysis = 0 + sleeping = 0 + //Many of these parameters normally tick down in life code, but some parts of that code don't run in godmode, so this prevents a BST being stuck with blurred vision + if(intoxication > AE_DIZZY*SR) // Early warning if (dizziness == 0) src << "The room starts spinning!" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 674304f1e33..c2df63f5463 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -182,6 +182,8 @@ if(!(sdisabilities & BLIND)) if(equipment_tint_total >= TINT_BLIND) // Covered eyes, heal faster eye_blurry = max(eye_blurry-2, 0) + else + eye_blurry = max(eye_blurry-1, 0) if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 1)) @@ -916,9 +918,6 @@ if (intoxication) handle_intoxication() - else if (alcohol_clumsy)//This var is defined in intoxication.dm, its set true when alcohol has caused clumsiness - mutations.Remove(CLUMSY) - alcohol_clumsy = 0 if(status_flags & GODMODE) return 0 //godmode diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 7a04d4e972e..6b79ea72b4e 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -317,13 +317,18 @@ H.verbs |= verb_path return -/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. +/datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H,var/kpg = 0) //Handles anything not already covered by basic species assignment. Keepgene value should only be used by genetics. add_inherent_verbs(H) H.mob_bump_flag = bump_flag H.mob_swap_flags = swap_flags H.mob_push_flags = push_flags H.pass_flags = pass_flags H.mob_size = mob_size + if(!kpg) + if(islesserform(H)) + H.dna.SetSEState(MONKEYBLOCK,1) + else + H.dna.SetSEState(MONKEYBLOCK,0) /datum/species/proc/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) //Handles any species-specific death events (such as dionaea nymph spawns). return diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index 2368fa0ecbb..bc0f66ecc19 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -60,13 +60,24 @@ icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi' deform = 'icons/mob/human_races/monkeys/r_farwa.dmi' - greater_form = "Tajaran" + greater_form = "Tajara" default_language = "Farwa" flesh_color = "#AFA59E" base_color = "#333333" tail = "farwatail" holder_type = /obj/item/weapon/holder/monkey/farwa +/datum/species/monkey/tajaran/get_random_name() + return "farwa ([rand(100,999)])" // HACK HACK HACK, oh lords of coding please forgive me! + +/datum/species/monkey/tajaran/m_sai + name = "M'sai Farwa" + greater_form = "M'sai Tajara" + +/datum/species/monkey/tajaran/zhan_khazan + name = "Zhan-Khazan Farwa" + greater_form = "Zhan-Khazan Tajara" + /datum/species/monkey/skrell name = "Neaera" short_name = "nea" diff --git a/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm index 7bb33ad54b6..cd807a59cf5 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajaran_subspecies.dm @@ -23,6 +23,8 @@ heat_level_2 = 360 //RaceDefault 380 Default 400 heat_level_3 = 700 //RaceDefault 800 Default 1000 + primitive_form = "Zhan-Khazan Farwa" + num_alternate_languages = 1 // Only one Extra Language /datum/species/tajaran/m_sai @@ -48,4 +50,6 @@ heat_level_2 = 390 //RaceDefault 380 Default 400 heat_level_3 = 900 //RaceDefault 800 Default 1000 + primitive_form = "M'sai Farwa" + secondary_langs = list(LANGUAGE_SIIK_MAAS, LANGUAGE_SIIK_TAJR, LANGUAGE_SIGN_TAJARA) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c0330bb3ca5..bb01772a235 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -954,6 +954,12 @@ gib() return +/mob/living/silicon/robot/update_canmove() // to fix lockdown issues w/ chairs + . = ..() + if (lockcharge) + canmove = 0 + . = 0 + /mob/living/silicon/robot/proc/UnlinkSelf() disconnect_from_ai() lawupdate = 0 diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 7e88e115a3a..4f3b35dac37 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/proc/monkeyize() +/mob/living/carbon/human/proc/monkeyize(var/kpg=0) if (transforming) return for(var/obj/item/W in src) @@ -11,8 +11,6 @@ stunned = 1 icon = null invisibility = 101 - for(var/t in organs) - qdel(t) var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' @@ -33,14 +31,55 @@ for(var/obj/item/W in src) drop_from_inventory(W) set_species(species.primitive_form) - dna.SetSEState(MONKEYBLOCK,1) - dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) + if(!kpg) + dna.SetSEState(MONKEYBLOCK,1) src << "You are now [species.name]. " qdel(animation) return src +/mob/living/carbon/human/proc/humanize(var/kpg=0) // we needed this a lot to be honest, why wasn't it made before? + if (transforming) + return + for(var/obj/item/W in src) + drop_from_inventory(W) + regenerate_icons() + transforming = 1 + canmove = 0 + stunned = 1 + icon = null + invisibility = 101 + var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = src + flick("monkey2h", animation) + sleep(48) + + transforming = 0 + stunned = 0 + update_canmove() + invisibility = initial(invisibility) + + if(!species.greater_form) //If the creature in question has no greater form set, this is going to be messy. + gib() + return + + for(var/obj/item/W in src) + drop_from_inventory(W) + set_species(species.greater_form) + if(!kpg) + dna.SetSEState(MONKEYBLOCK,0) + + src << "You are now [species.name]. " + qdel(animation) + + return src + + + + /mob/new_player/AIize() spawning = 1 return ..() diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 50ffd360d96..ec3c5b8756e 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -141,10 +141,13 @@ if(is_broken()) filter_effect -= 2 - if (owner.intoxication) + if (owner.intoxication > 0) //ALCOHOL_FILTRATION_RATE is defined in intoxication.dm owner.intoxication -= ALCOHOL_FILTRATION_RATE*filter_effect*PROCESS_ACCURACY//A weakened liver filters out alcohol more slowly owner.intoxication = max(owner.intoxication, 0) + if (!owner.intoxication) + //If intoxication has just been reduced to zero, this will handle removing any effects + owner.handle_intoxication() // Do some reagent processing. if(owner.chem_effects[CE_ALCOHOL_TOXIC]) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 032c7470ee6..74039079960 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -117,9 +117,9 @@ if(alien == IS_DIONA) return //Diona can gain nutrients, but don't get drunk or suffer other effects - + if(isunathi(M))//unathi are poisoned by alcohol as well - M.adjustToxLoss(2.5 * removed * (strength / 100)) + M.adjustToxLoss(1.5 * removed * (strength / 100)) var/quantity = (strength / 100) * removed M.intoxication += quantity @@ -158,6 +158,50 @@ usr << "The solution dissolves the ink on the book." return + +//Butanol is a common alcohol that is fairly ineffective for humans and most other species, but highly intoxicating to unathi +//Butanol duplicates a lot of code from ethanol. This is by design, it does not inherit. +//Possible future todo: Add "alcohol" as a parent class to both ethanol and butanol +/datum/reagent/butanol + name = "Butanol" //Parent class for all alcoholic reagents. + id = "butanol" + description = "A fairly harmless alcohol that has intoxicating effects on certain species." + reagent_state = LIQUID + color = "#404030" + ingest_met = 0.17 //Extremely slow metabolic rate means the liver will generally purge it faster than it can intoxicate you + var/nutriment_factor = 0.5 + var/strength = 100 // This is the ABV of the drink + + glass_icon_state = "glass_clear" + glass_name = "glass of butanol" + glass_desc = "A fairly harmless alcohol that has intoxicating effects on certain species." + +/datum/reagent/butanol/touch_mob(var/mob/living/L, var/amount) + if(istype(L) && strength > 40) + L.adjust_fire_stacks((amount / 7) * (strength / 100)) //Butanol is a bit less flammable than ethanol + +/datum/reagent/butanol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.adjustToxLoss(removed) + return + +/datum/reagent/butanol/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(isvaurca(M))//Vaurca are damaged instead of getting nutrients, but they can still get drunk + M.adjustToxLoss(removed * (strength / 100)) + else + M.nutrition += nutriment_factor * removed + + if(alien == IS_DIONA) + return //Diona can gain nutrients, but don't get drunk or suffer other effects + + if(isunathi(M)) + ingest_met = initial(ingest_met)*3 //Unathi digest butanol much faster + + var/quantity = (strength / 100) * removed + M.intoxication += quantity + + + + /datum/reagent/hydrazine name = "Hydrazine" id = "hydrazine" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 5f63e9b02d4..6e32a024fc7 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -787,6 +787,7 @@ glass_desc = "No relation to a certain rap artist/ actor." glass_center_of_mass = list("x"=15, "y"=10) + /datum/reagent/drink/coffee name = "Coffee" id = "coffee" @@ -1262,6 +1263,18 @@ glass_desc = "A crystal clear glass of Griffeater gin." glass_center_of_mass = list("x"=16, "y"=12) +/datum/reagent/ethanol/victorygin + name = "Victory Gin" + id = "victorygin" + description = "An oily Adhomai-based gin." + color = "#664300" + strength = 32 + + glass_icon_state = "ginvodkaglass" + glass_name = "glass of gin" + glass_desc = "It has an oily smell and doesn't taste like typical gin." + glass_center_of_mass = list("x"=16, "y"=12) + //Base type for alchoholic drinks containing coffee /datum/reagent/ethanol/coffee overdose = 45 @@ -2529,3 +2542,31 @@ glass_icon_state = "tallblackrussian" glass_name = "glass of Tall Black Russian" glass_desc = "Just like black russian but taller." + + +// Butanol-based alcoholic drinks +//===================================== +//These are mainly for unathi, and have very little (but still some) effect on other species + +/datum/reagent/butanol/xuizijuice + name = "Xuizi Juice" + id = "xuizijuice" + description = "Blended flower buds from a Moghean Xuizi cactus. Has a mild butanol content and is a staple recreational beverage in Unathi culture." + color = "#91de47" + strength = 5 + + glass_icon_state = "xuiziglass" + glass_name = "glass of Xuizi Juice" + glass_desc = "The clear green liquid smells like vanilla, tastes like water. Unathi swear it has a rich taste and texture." + +/datum/reagent/butanol/sarezhiwine + name = "Sarezhi Wine" + id = "sarezhiwine" + description = "An alcoholic beverage made from lightly fermented Sareszhi berries, considered an upper class delicacy on Moghes. Significant butanol content indicates intoxicating effects on Unathi." + color = "#bf8fbc" + strength = 20 + + glass_icon_state = "sarezhiglass" + glass_name = "glass of Sarezhi Wine" + glass_desc = "It tastes like flat grape soda. Is this supposed to be alcoholic?" + diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 6fdff178b1f..4683a953b1f 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1560,6 +1560,8 @@ required_reagents = list("ice" = 1, "tea" = 2) result_amount = 3 + + /datum/chemical_reaction/icecoffee name = "Iced Coffee" id = "icecoffee" @@ -1582,6 +1584,14 @@ catalysts = list("enzyme" = 5) result_amount = 10 +/datum/chemical_reaction/butanol + name = "Butanol" + id = "butanol" + result = "butanol" + required_reagents = list("cornoil" = 10, "sugar" = 10) + catalysts = list("enzyme" = 5) + result_amount = 5 + /datum/chemical_reaction/grenadine name = "Grenadine Syrup" id = "grenadine" diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 0e7321089c8..7d3efa66406 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -27,6 +27,7 @@ mercury spawn_reagent = "mercury" radium spawn_reagent = "radium" ethanol spawn_reagent = "ethanol" + butanol spawn_reagent = "butanol" sacid spawn_reagent = "sacid" tungsten spawn_reagent = "tungsten" diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index 350cb0deea9..ab1b158d21e 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -18,6 +18,7 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/radium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/water, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/butanol, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index b3a44f0a5e9..5e918ceea31 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -179,6 +179,15 @@ ..() reagents.add_reagent("gin", 100) +/obj/item/weapon/reagent_containers/food/drinks/bottle/victorygin + name = "Victory gin" + desc = "Pour one out for Al'mari. His gun was on stun, bless his heart." + icon_state = "victorygin" + center_of_mass = list("x"=16, "y"=4) + New() + ..() + reagents.add_reagent("victorygin", 100) + /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey name = "Uncle Git's Special Reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." @@ -499,3 +508,25 @@ New() ..() reagents.add_reagent("sbiten", 100) + + +// Butanol-based alcoholic drinks +//===================================== +//These are mainly for unathi, and have very little (but still some) effect on other species + +/obj/item/weapon/reagent_containers/food/drinks/bottle/small/xuizijuice + name = "Xuizi Juice" + desc = "Blended flower buds from the Xuizi cactus. It smells faintly of vanilla. Bottled by the Arizi Guild for over 200 years." + icon_state = "xuizibottle" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("xuizijuice", 30) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/sarezhiwine + name = "Sarezhi Wine" + desc = "A premium Moghean wine made from Sareszhi berries. Bottled by the Arizi Guild for over 200 years." + icon_state = "sarezhibottle" + New() + ..() + reagents.add_reagent("sarezhiwine", 100) \ No newline at end of file diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 843627ef6d0..823855d1ca3 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -245,6 +245,16 @@ ..() reagents.add_reagent("beer",capacity) +/obj/structure/reagent_dispensers/xuizikeg + name = "xuizi juice keg" + desc = "A keg full of Xuizi juice, blended flower buds from the Moghean Xuizi cactus. The export stamp of the Arizi Guild is imprinted on the side." + icon = 'icons/obj/objects.dmi' + icon_state = "keg_xuizi" + amount_per_transfer_from_this = 10 + New() + ..() + reagents.add_reagent("xuizijuice",capacity) + /obj/structure/reagent_dispensers/virusfood name = "Virus Food Dispenser" desc = "A dispenser of virus food." diff --git a/html/changelog.html b/html/changelog.html index aaee5e4b43f..1663eced64a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,6 +57,26 @@

08 April 2017

+

MoondancerPony updated:

+ +

Nanako updated:

+ +

Printer16 updated:

+

inselc updated: