From 70c6c46657f3751d382836d35d653347b6b8d927 Mon Sep 17 00:00:00 2001 From: "morikou@gmail.com" Date: Sat, 15 Jan 2011 02:10:24 +0000 Subject: [PATCH] The Not-As-Big-As-It-Seems Update: Changelings Overhauled. - Instead of working on a cooldown system like wizards, changlings now have a "Chemical Storage" that fills up over time (similar to alium plasma). Different abilities use different amounts of chemicals. Changlings start with 20 chem. - Neurotoxic Venom and Hallucinogenic Venom both removed entirely. - Regenerative Stasis now shows the person as being dead. - Absorb DNA costs 5 chem, Transform costs 5 chem, Lesser (monkey) transform costs 1, and Regenerative Stasis costs 20. - Five new "Dart" abilities. They each have a quick cooldown (to prevent spamming on accident), cost different amounts of chemicals, and hit adjecent enemies (targeting similar to old venoms). - Silence Dart (10 chem): Makes the target unable to speak for a while. Target knows when they are hit. - Blind Dart (20 chem): Makes the target blind for a while. Target knows when they're hit (even ignoring the obvious blindness). - Deaf Dart (5 chem): Makes the target deaf for a while. Target does NOT instantly know they were hit (not hearing their own speach might be a clue, though). - Paralysis Dart (30 chem): Paralyzes the target for a bit. They can't speak or move and health scanners register them as being dead. However, they are fully aware of their surroundings. It's also obvious to them they were pricked. - Transformation Dart (30 chem): Transforms a dead, non-husk person into one of your stored DNA types. (NOTE) A lot of playtesting needed to balance the above, just FYI. Most likely, chem costs will need to be adjusted (both up and down). - Changelog Updated. - Napalm Nerfed/Adjusted: Instead of creating (Created_Volume * 2) * 9 squares, it creates (Created Volume^2) * 1 square. This works out to about a 30% reduction for a max volume grenade. Also, it won't accidentally freeze areas now (if activated in an area with no oxygen). - Reagent bottles can, once again, be added to grenades instead of just beakers. You can't add other (potentially larger) containers, though. - Carp are now poisonous to eat. Anti-toxin must be injected into any carp-based food item before eating to eat it safely. - New Reagent: Zombie Powder: Requires 5 carpotoxin, 5 copper, and 5 sleep toxin. Puts subject into a deathlike state (they're still aware though). - New Recipes: Clown Burger, 5 Flour + 1 CLown Wig/mask; Mime Burger, 5 Flour + 1 Beret; Cuban Carp, 1 carp fillet + 1 flour + 1 chili. - New Circuit Imprinter Icon by Veyveyr. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@854 316c924e-a436-60f5-8080-3fe189b3f50e --- code/WorkInProgress/Chemistry-Reagents.dm | 37 +- code/WorkInProgress/Chemistry-Recipes.dm | 14 +- code/WorkInProgress/Chemistry-Tools.dm | 35 +- code/defines/mob/mob.dm | 5 +- code/defines/obj/hydro.dm | 10 + code/defines/obj/machinery.dm | 1 + code/defines/obj/weapon.dm | 8 + code/game/gamemodes/changeling/changeling.dm | 373 +- .../gamemodes/changeling/changeling_powers.dm | 272 +- code/game/machinery/bots/secbot.dm | 4 +- code/game/machinery/microwave.dm | 35 +- code/game/master_controller.dm | 4 +- code/game/objects/devices/scanners.dm | 14 +- code/modules/mob/living/carbon/human/human.dm | 2 + code/modules/mob/living/carbon/human/life.dm | 4 +- .../mob/living/carbon/monkey/monkey.dm | 3 + code/modules/mob/living/say.dm | 2 +- icons/changelog.html | 23 + icons/obj/food.dmi | Bin 26067 -> 27513 bytes icons/obj/harvest.dmi | Bin 5815 -> 7054 bytes icons/obj/hydroponics.dmi | Bin 74474 -> 74507 bytes icons/obj/stationobjs.dmi | Bin 61730 -> 62121 bytes maps/tgstation.2.0.0.dmm | 14121 ++++++++-------- 23 files changed, 7658 insertions(+), 7309 deletions(-) diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm index 7f358d9b0a3..91be062683a 100644 --- a/code/WorkInProgress/Chemistry-Reagents.dm +++ b/code/WorkInProgress/Chemistry-Reagents.dm @@ -251,6 +251,8 @@ datum holder.remove_reagent("amatoxin", 2) if(holder.has_reagent("chloralhydrate")) holder.remove_reagent("chloralhydrate", 5) + if(holder.has_reagent("carpotoxin")) + holder.remove_reagent("carpotoxin", 1) M:toxloss = max(M:toxloss-2,0) ..() return @@ -559,12 +561,6 @@ datum description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." reagent_state = LIQUID - napalm - name = "Napalm RG-218" - id = "napalm" - description = "A plasma based variant of napalm that burns violently upon exposure to oxygen." - reagent_state = LIQUID - radium name = "Radium" id = "radium" @@ -807,6 +803,7 @@ datum if(!M.confused) M.confused = 1 M.confused = max(M.confused, 20) holder.remove_reagent(src.id, 0.2) + ..() return lexorin @@ -818,6 +815,7 @@ datum if(!M) M = holder.my_atom if(prob(33)) M.bruteloss++ holder.remove_reagent(src.id, 0.3) + ..() return kelotane @@ -963,6 +961,7 @@ datum if(!M) M = holder.my_atom if(prob(5)) M:emote(pick("twitch","blink_r","shiver")) holder.remove_reagent(src.id, 0.2) + ..() return cryoxadone @@ -988,6 +987,32 @@ datum on_mob_life(var/mob/M)//no more mr. panacea holder.remove_reagent(src.id, 0.2) + ..() + return + + carpotoxin + name = "Carpotoxin" + id = "carpotoxin" + description = "A deadly neurotoxin produced by the dreaded spess carp." + reagent_state = LIQUID + + on_mob_life(var/mob/M) + if(!M) M = holder.my_atom + M:toxloss += 2 + ..() + return + + zombiepowder + name = "Zombie Powder" + id = "zombiepowder" + description = "A strong neurotoxin that puts the subject into a death-like state." + on_mob_life(var/mob/M) + if(!M) M = holder.my_atom + M:oxyloss += 0.5 + M:toxloss += 0.5 + M:weakened = max(M:weakened, 10) + M:silent = max(M:silent, 10) + ..() return diff --git a/code/WorkInProgress/Chemistry-Recipes.dm b/code/WorkInProgress/Chemistry-Recipes.dm index d7ad6f58998..6c5f2b7cb97 100644 --- a/code/WorkInProgress/Chemistry-Recipes.dm +++ b/code/WorkInProgress/Chemistry-Recipes.dm @@ -285,18 +285,19 @@ datum napalm name = "Napalm" id = "napalm" - result = "napalm" + result = null required_reagents = list("aluminium" = 1, "plasma" = 1, "acid" = 1 ) result_amount = 1 on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom.loc) - for(var/turf/simulated/floor/target_tile in range(1,location)) + for(var/turf/simulated/floor/target_tile in range(0,location)) if(target_tile.parent && target_tile.parent.group_processing) target_tile.parent.suspend_group_processing() var/datum/gas_mixture/napalm = new - napalm.toxins = 2 * created_volume + napalm.toxins = created_volume * created_volume + napalm.temperature = 400+T0C target_tile.assume_air(napalm) spawn (0) target_tile.hotspot_expose(700, 400) @@ -334,6 +335,13 @@ datum required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) result_amount = 1 + zombiepowder + name = "Zombie Powder" + id = "zombiepowder" + result = "zombiepowder" + required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) + result_amount = 2 + /////////////////////////////////////////////////////////////////////////////////// // foam and foam precursor diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm index 430ba42c6cc..ba00e361dc4 100644 --- a/code/WorkInProgress/Chemistry-Tools.dm +++ b/code/WorkInProgress/Chemistry-Tools.dm @@ -43,7 +43,7 @@ stage = 2 else user << "\red You need to add at least one beaker before locking the assembly." - else if (istype(W,/obj/item/weapon/reagent_containers/glass/beaker) && stage == 1) + else if ((istype(W,/obj/item/weapon/reagent_containers/glass/beaker) || istype(W, /obj/item/weapon/reagent_containers/glass/dispenser)) && stage == 1) if(beakers.len == 2) user << "\red The grenade can not hold more containers." return @@ -1607,6 +1607,7 @@ New() ..() reagents.add_reagent("nutriment", 3) + reagents.add_reagent("carpotoxin", 3) /obj/item/weapon/reagent_containers/food/snacks/xenomeat name = "meat" @@ -1858,6 +1859,38 @@ reagents.add_reagent("nutriment", 6) bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/clownburger + name = "Clown Burger" + desc = "This tastes funny..." + icon_state = "clownburger" + New() + ..() + reagents.add_reagent("nutriment", 4) + var/datum/disease/F = new /datum/disease/pierrot_throat(0) + var/list/data = list("virus"= F) + reagents.add_reagent("blood", 4, data) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/mimeburger + name = "Mime Burger" + desc = "It's taste defies language." + icon_state = "mimeburger" + New() + ..() + reagents.add_reagent("nutriment", 8) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cubancarp + name = "Cuban Carp" + desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" + icon_state = "cubancarp" + New() + ..() + reagents.add_reagent("nutriment", 3) + reagents.add_reagent("carpotoxin", 3) + reagents.add_reagent("capsaicin", 3) + bitesize = 2 + /////////////////////////////////////////////////Sliceable//////////////////////////////////////// // All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm index 616c1bb20a6..f5efc53439a 100644 --- a/code/defines/mob/mob.dm +++ b/code/defines/mob/mob.dm @@ -88,7 +88,6 @@ var/weakened = 0.0 var/losebreath = 0.0 var/metabslow = 0 // Metabolism slowed - var/muted = null var/intent = null var/shakecamera = 0 var/a_intent = "help" @@ -109,6 +108,8 @@ var/r_Tourette = 0 var/miming = null //checks if the guy is a mime + var/silent = null //Can't talk. Value goes down every life proc. + var/muted = null //Can't talk in any way shape or form (Even OOC or emote). An admin punishment var/obj/hud/hud_used = null @@ -168,6 +169,8 @@ var/changeling_level = 0 var/list/absorbed_dna = list() var/changeling_fakedeath = 0 + var/chem_charges = 20.0 + var/sting_range = 1 var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index a069e57edcd..bc9823e99da 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -537,6 +537,16 @@ ..() reagents.add_reagent("nutriment", max(round((potency / 5), 1), 2)) + /*attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/cable_coil)) + if(W:amount >= 5) + W:amount -= 5 + if(!W:amount) del(W) + user << "\blue You add cable to the potato." + new /obj/item/weapon/cell/potato(src.loc) + del(src)*/ + + /obj/item/weapon/reagent_containers/food/snacks/grown/berries seed = "/obj/item/seeds/berryseed" name = "Berries" diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm index c29fbc25917..b23300aad02 100644 --- a/code/defines/obj/machinery.dm +++ b/code/defines/obj/machinery.dm @@ -540,6 +540,7 @@ var/ketchup_amount = 0 var/tofu_amount = 0 var/berryjuice_amount = 0 + var/carpmeat_amount = 0 var/humanmeat_name = "" var/humanmeat_job = "" var/operating = 0 // Is it on? diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 9e28714f2c7..b85cf244f18 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -1188,6 +1188,14 @@ Total SMES charging rate should not exceed total power generation rate, or an ov /obj/item/weapon/cell/robotcrate maxcharge = 10000 +/*/obj/item/weapon/cell/potato + name = "Potato Battery" + desc = "A rechargable starch based power cell." + icon = 'harvest.dmi' + icon_state = "potato_battery" + maxcharge = 100 + m_amt = 0 + g_amt = 0*/ /obj/item/weapon/camera_bug/attack_self(mob/usr as mob) var/list/cameras = new/list() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 6ed1ec699ac..e1166784171 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -3,246 +3,249 @@ config_tag = "changeling" /var/datum/mind/changeling - var/list/datum/mind/changelings = list() + var + list/datum/mind/changelings = list() - var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time - var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target - var/const/prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target + const + prob_int_murder_target = 50 // intercept names the assassination target half the time + prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target + prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target - var/const/prob_int_item = 50 // intercept names the theft target half the time - var/const/prob_right_item_l = 25 // lower bound on probability of naming right theft target - var/const/prob_right_item_h = 50 // upper bound on probability of naming the right theft target + prob_int_item = 50 // intercept names the theft target half the time + prob_right_item_l = 25 // lower bound on probability of naming right theft target + prob_right_item_h = 50 // upper bound on probability of naming the right theft target - var/const/prob_int_sab_target = 50 // intercept names the sabotage target half the time - var/const/prob_right_sab_target_l = 25 // lower bound on probability of naming right sabotage target - var/const/prob_right_sab_target_h = 50 // upper bound on probability of naming right sabotage target + prob_int_sab_target = 50 // intercept names the sabotage target half the time + prob_right_sab_target_l = 25 // lower bound on probability of naming right sabotage target + prob_right_sab_target_h = 50 // upper bound on probability of naming right sabotage target - var/const/prob_right_killer_l = 25 //lower bound on probability of naming the right operative - var/const/prob_right_killer_h = 50 //upper bound on probability of naming the right operative - var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly - var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly + prob_right_killer_l = 25 //lower bound on probability of naming the right operative + prob_right_killer_h = 50 //upper bound on probability of naming the right operative + prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly + prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - var/const/laser = 1 - var/const/hand_tele = 2 - var/const/plasma_bomb = 3 - var/const/jetpack = 4 - var/const/captain_card = 5 - var/const/captain_suit = 6 + laser = 1 + hand_tele = 2 + plasma_bomb = 3 + jetpack = 4 + captain_card = 5 + captain_suit = 6 - var/const/destroy_plasma = 1 - var/const/destroy_ai = 2 - var/const/kill_monkeys = 3 - var/const/cut_power = 4 + destroy_plasma = 1 + destroy_ai = 2 + kill_monkeys = 3 + cut_power = 4 - var/const/percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy - var/const/percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut - var/const/percentage_station_evacuate = 80 // what percentage of people gotta leave - you also gotta change the objective in the traitor menu + percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy + percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut + percentage_station_evacuate = 80 // what percentage of people gotta leave - you also gotta change the objective in the traitor menu - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) + waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/changelingdeathticker = 0 + changelingdeathticker = 0 -/datum/game_mode/changeling/announce() - world << "The current game mode is - Changeling!" - world << "There is an alien changeling on the station. Do not let the changeling succeed!" +/datum/game_mode/changeling + announce() + world << "The current game mode is - Changeling!" + world << "There is an alien changeling on the station. Do not let the changeling succeed!" -/datum/game_mode/changeling/pre_setup() - // Can't pick a changeling here, as we don't want him to then become the AI. - return 1 + pre_setup() + // Can't pick a changeling here, as we don't want him to then become the AI. + return 1 -/datum/game_mode/changeling/post_setup() + post_setup() - var/list/possible_changelings = get_possible_changelings() + var/list/possible_changelings = get_possible_changelings() - if(possible_changelings.len>0) - changeling = pick(possible_changelings) + if(possible_changelings.len>0) + changeling = pick(possible_changelings) - grant_changeling_powers(changeling.current) - changeling.special_role = "Changeling" - changelings += changeling + grant_changeling_powers(changeling.current) + changeling.special_role = "Changeling" + changelings += changeling - //OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives. - //If they have two objectives as well as absorb, they must survive rather than escape - //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting - //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone + //OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives. + //If they have two objectives as well as absorb, they must survive rather than escape + //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting + //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone - switch(rand(1,100)) - if(1 to 45) + switch(rand(1,100)) + if(1 to 45) - var/datum/objective/absorb/absorb_objective = new - absorb_objective.owner = changeling - absorb_objective.gen_num_to_eat() - changeling.objectives += absorb_objective + var/datum/objective/absorb/absorb_objective = new + absorb_objective.owner = changeling + absorb_objective.gen_num_to_eat() + changeling.objectives += absorb_objective - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = changeling - kill_objective.find_target() - changeling.objectives += kill_objective + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = changeling + kill_objective.find_target() + changeling.objectives += kill_objective - var/datum/objective/escape/escape_objective = new - escape_objective.owner = changeling - changeling.objectives += escape_objective + var/datum/objective/escape/escape_objective = new + escape_objective.owner = changeling + changeling.objectives += escape_objective - if(46 to 90) + if(46 to 90) - var/datum/objective/absorb/absorb_objective = new - absorb_objective.owner = changeling - absorb_objective.gen_num_to_eat() - changeling.objectives += absorb_objective + var/datum/objective/absorb/absorb_objective = new + absorb_objective.owner = changeling + absorb_objective.gen_num_to_eat() + changeling.objectives += absorb_objective - var/datum/objective/steal/steal_objective = new - steal_objective.owner = changeling - steal_objective.find_target() - changeling.objectives += steal_objective + var/datum/objective/steal/steal_objective = new + steal_objective.owner = changeling + steal_objective.find_target() + changeling.objectives += steal_objective - var/datum/objective/escape/escape_objective = new - escape_objective.owner = changeling - changeling.objectives += escape_objective + var/datum/objective/escape/escape_objective = new + escape_objective.owner = changeling + changeling.objectives += escape_objective - else + else - var/datum/objective/absorb/absorb_objective = new - absorb_objective.owner = changeling - absorb_objective.gen_num_to_eat() - changeling.objectives += absorb_objective + var/datum/objective/absorb/absorb_objective = new + absorb_objective.owner = changeling + absorb_objective.gen_num_to_eat() + changeling.objectives += absorb_objective - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = changeling - kill_objective.find_target() - changeling.objectives += kill_objective + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = changeling + kill_objective.find_target() + changeling.objectives += kill_objective - var/datum/objective/steal/steal_objective = new - steal_objective.owner = changeling - steal_objective.find_target() - changeling.objectives += steal_objective + var/datum/objective/steal/steal_objective = new + steal_objective.owner = changeling + steal_objective.find_target() + changeling.objectives += steal_objective - var/datum/objective/survive/survive_objective = new - survive_objective.owner = changeling - changeling.objectives += survive_objective + var/datum/objective/survive/survive_objective = new + survive_objective.owner = changeling + changeling.objectives += survive_objective - changeling.current << "\red You are a changeling!" - changeling.current << "You must complete the following tasks:" + changeling.current << "\red You are a changeling!" + changeling.current << "You must complete the following tasks:" - var/obj_count = 1 - for(var/datum/objective/objective in changeling.objectives) - changeling.current << "Objective #[obj_count]: [objective.explanation_text]" - obj_count++ + var/obj_count = 1 + for(var/datum/objective/objective in changeling.objectives) + changeling.current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ - spawn (rand(waittime_l, waittime_h)) - send_intercept() + spawn (rand(waittime_l, waittime_h)) + send_intercept() -/datum/game_mode/changeling/proc/get_possible_changelings() - var/list/candidates = list() - for(var/mob/living/carbon/player in world) - if (player.client) - if(player.be_syndicate) - candidates += player.mind - - if(candidates.len < 1) + proc/get_possible_changelings() + var/list/candidates = list() for(var/mob/living/carbon/player in world) if (player.client) - candidates += player.mind + if(player.be_syndicate) + candidates += player.mind - return candidates + if(candidates.len < 1) + for(var/mob/living/carbon/player in world) + if (player.client) + candidates += player.mind + + return candidates //Centcom Update - in testing, copied mostly from Wizard. -/datum/game_mode/changeling/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" + send_intercept() + var/intercepttext = "Cent. Com. Update Requested staus information:
" + intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf", "changeling", "cult") - possible_modes -= "[ticker.mode]" - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]") + var/list/possible_modes = list() + possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf", "changeling", "cult") + possible_modes -= "[ticker.mode]" + var/number = pick(2, 3) + var/i = 0 + for(i = 0, i < number, i++) + possible_modes.Remove(pick(possible_modes)) + possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]") - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, changeling) + var/datum/intercept_text/i_text = new /datum/intercept_text + for(var/A in possible_modes) + intercepttext += i_text.build(A, changeling) - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- 'Cent. Com. Status Summary'" - intercept.info = intercepttext + for (var/obj/machinery/computer/communications/comm in world) + if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) + var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) + intercept.name = "paper- 'Cent. Com. Status Summary'" + intercept.info = intercepttext - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) + comm.messagetitle.Add("Cent. Com. Status Summary") + comm.messagetext.Add(intercepttext) - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - world << sound('intercept.ogg') + command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") + world << sound('intercept.ogg') -/datum/game_mode/changeling/check_finished() - if(!changeling.current) - return 1 - - if(changeling.current.stat==2) - if(changelingdeathticker>=600) + check_finished() + if(!changeling.current) return 1 - changelingdeathticker++ - if(changeling.current.stat!=2) - if(changelingdeathticker) - changelingdeathticker = 0 + if(changeling.current.stat==2) + if(changelingdeathticker>=600) + return 1 + changelingdeathticker++ - return ..() + if(changeling.current.stat!=2) + if(changelingdeathticker) + changelingdeathticker = 0 -/datum/game_mode/changeling/declare_completion() - for(var/datum/mind/changeling in changelings) - var/changelingwin = 1 - var/changeling_name - var/totalabsorbed = 0 - if (changeling.current) - totalabsorbed = changeling.current.absorbed_dna.len - 1 + return ..() - if(changeling.current) - changeling_name = "[changeling.current.real_name] (played by [changeling.key])" - else - changeling_name = "[changeling.key] (character destroyed)" + declare_completion() + for(var/datum/mind/changeling in changelings) + var/changelingwin = 1 + var/changeling_name + var/totalabsorbed = 0 + if (changeling.current) + totalabsorbed = changeling.current.absorbed_dna.len - 1 - world << "The changeling was [changeling_name]" - world << "Genomes absorbed: [totalabsorbed]" - - var/count = 1 - for(var/datum/objective/objective in changeling.objectives) - if(objective.check_completion()) - world << "Objective #[count]: [objective.explanation_text] \green Success" + if(changeling.current) + changeling_name = "[changeling.current.real_name] (played by [changeling.key])" else - world << "Objective #[count]: [objective.explanation_text] \red Failed" - changelingwin = 0 - count++ + changeling_name = "[changeling.key] (character destroyed)" - if(changelingwin) - world << "The changeling was successful!" - else - world << "The changeling has failed!" - return 1 -// . = ..() + world << "The changeling was [changeling_name]" + world << "Genomes absorbed: [totalabsorbed]" -/datum/game_mode/changeling/proc/get_mob_list() - var/list/mobs = list() - for(var/mob/living/player in world) - if (player.client) - mobs += player - return mobs + var/count = 1 + for(var/datum/objective/objective in changeling.objectives) + if(objective.check_completion()) + world << "Objective #[count]: [objective.explanation_text] \green Success" + else + world << "Objective #[count]: [objective.explanation_text] \red Failed" + changelingwin = 0 + count++ -/datum/game_mode/changeling/proc/pick_human_name_except(excluded_name) - var/list/names = list() - for(var/mob/living/player in world) - if (player.client && (player.real_name != excluded_name)) - names += player.real_name - if(!names.len) - return null - return pick(names) + if(changelingwin) + world << "The changeling was successful!" + else + world << "The changeling has failed!" + return 1 + // . = ..() -/datum/game_mode/changeling/proc/grant_changeling_powers(mob/living/carbon/human/changeling_mob) - if (!istype(changeling_mob)) - return - changeling_mob.make_changeling() \ No newline at end of file + proc/get_mob_list() + var/list/mobs = list() + for(var/mob/living/player in world) + if (player.client) + mobs += player + return mobs + + proc/pick_human_name_except(excluded_name) + var/list/names = list() + for(var/mob/living/player in world) + if (player.client && (player.real_name != excluded_name)) + names += player.real_name + if(!names.len) + return null + return pick(names) + + proc/grant_changeling_powers(mob/living/carbon/human/changeling_mob) + if (!istype(changeling_mob)) + return + changeling_mob.make_changeling() \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index ddb21a4c169..4a70f411246 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -2,9 +2,9 @@ src.verbs += /client/proc/changeling_lesser_transform src.verbs += /client/proc/changeling_fakedeath - spawn(600) - src.verbs += /client/proc/changeling_neurotoxic_sting - src.verbs += /client/proc/changeling_hallucinogenic_sting + src.verbs += /client/proc/changeling_blind_dart + src.verbs += /client/proc/changeling_deaf_dart + src.verbs += /client/proc/changeling_silence_dart src.changeling_level = 1 return @@ -15,9 +15,12 @@ src.verbs += /client/proc/changeling_lesser_form src.verbs += /client/proc/changeling_fakedeath - spawn(600) - src.verbs += /client/proc/changeling_neurotoxic_sting - src.verbs += /client/proc/changeling_hallucinogenic_sting + src.verbs += /client/proc/changeling_deaf_dart + src.verbs += /client/proc/changeling_blind_dart + src.verbs += /client/proc/changeling_paralysis_dart + src.verbs += /client/proc/changeling_silence_dart + src.verbs += /client/proc/changeling_transformation_dart + src.verbs += /client/proc/changeling_boost_range src.changeling_level = 2 if (src.absorbed_dna.len <= 0) @@ -35,12 +38,15 @@ src.verbs -= /client/proc/changeling_lesser_form src.verbs -= /client/proc/changeling_lesser_transform src.verbs -= /client/proc/changeling_fakedeath - src.verbs -= /client/proc/changeling_neurotoxic_sting - src.verbs -= /client/proc/changeling_hallucinogenic_sting + src.verbs += /client/proc/changeling_deaf_dart + src.verbs += /client/proc/changeling_blind_dart + src.verbs += /client/proc/changeling_paralysis_dart + src.verbs += /client/proc/changeling_silence_dart + src.verbs += /client/proc/changeling_boost_range /client/proc/changeling_absorb_dna() set category = "Changeling" - set name = "Absorb DNA" + set name = "Absorb DNA (5)" if(usr.stat) usr << "\red Not when we are incapacitated." @@ -50,6 +56,10 @@ usr << "\red We must be grabbing a creature in our active hand to absorb them." return + if(usr.chem_charges < 5) + usr << "\red We don't have enough stored chemicals to do that!" + return + var/obj/item/weapon/grab/G = usr.equipped() var/mob/M = G.affecting @@ -61,18 +71,20 @@ usr << "\red We must have a tighter grip to absorb this creature." return + usr.chem_charges -= 5 + var/mob/living/carbon/human/T = M usr << "\blue This creature is compatible. We must hold still..." - if (!do_mob(usr, T, 200)) + if (!do_mob(usr, T, 150)) usr << "\red Our absorption of [T] has been interrupted!" return usr << "\blue We extend a proboscis." usr.visible_message(text("\red [usr] extends a proboscis!")) - if (!do_mob(usr, T, 200)) + if (!do_mob(usr, T, 150)) usr << "\red Our absorption of [T] has been interrupted!" return @@ -81,7 +93,7 @@ T << "\red You feel a sharp stabbing pain!" T.bruteloss += 40 - if (!do_mob(usr, T, 200)) + if (!do_mob(usr, T, 150)) usr << "\red Our absorption of [T] has been interrupted!" return @@ -100,7 +112,7 @@ /client/proc/changeling_transform() set category = "Changeling" - set name = "Transform" + set name = "Transform (5)" if(usr.stat) usr << "\red Not when we are incapacitated." return @@ -109,27 +121,45 @@ usr << "\red We have not yet absorbed any compatible DNA." return + if(usr.chem_charges < 5) + usr << "\red We don't have enough stored chemicals to do that!" + return + var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna if (S == null) return + usr.chem_charges -= 5 + usr.visible_message(text("\red [usr] transforms!")) usr.dna = usr.absorbed_dna[S] usr.real_name = S updateappearance(usr, usr.dna.uni_identity) domutcheck(usr, null) + + usr.verbs -= /client/proc/changeling_transform + + spawn(10) + usr.verbs += /client/proc/changeling_transform + return /client/proc/changeling_lesser_form() set category = "Changeling" - set name = "Lesser Form" + set name = "Lesser Form (1)" if(usr.stat) usr << "\red Not when we are incapacitated." return + if(usr.chem_charges < 1) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges-- + usr.remove_changeling_powers() usr.visible_message(text("\red [usr] transforms!")) @@ -195,7 +225,7 @@ /client/proc/changeling_lesser_transform() set category = "Changeling" - set name = "Transform" + set name = "Transform (1)" if(usr.stat) usr << "\red Not when we are incapacitated." @@ -205,11 +235,17 @@ usr << "\red We have not yet absorbed any compatible DNA." return + if(usr.chem_charges < 1) + usr << "\red We don't have enough stored chemicals to do that!" + return + var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna if (S == null) return + usr.chem_charges -= 1 + usr.remove_changeling_powers() usr.visible_message(text("\red [usr] transforms!")) @@ -279,12 +315,18 @@ /client/proc/changeling_fakedeath() set category = "Changeling" - set name = "Regenerative Stasis" + set name = "Regenerative Stasis (20)" if(usr.stat == 2) usr << "\red We are dead." return + if(usr.chem_charges < 20) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 20 + usr << "\blue We will regenerate our form." usr.lying = 1 @@ -294,7 +336,7 @@ usr.emote("gasp") - spawn(600) + spawn(550) if (usr.stat != 2) if(istype(usr, /mob/living/carbon/human)) var/mob/living/carbon/human/H = usr @@ -329,61 +371,201 @@ return -/client/proc/changeling_neurotoxic_sting(mob/T as mob in oview(1)) +/client/proc/changeling_boost_range() set category = "Changeling" - set name = "Neurotoxic Venom" + set name = "Boost Dart Range (10)" + set desc="Boosts dart range by 1." + + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 10) + usr << "\red We don't have enough stored chemicals to do that!" + return + + if(usr.sting_range >= 3) + usr << "\red We can't boost the range anymore!" + return + + usr.chem_charges -= 10 + + usr << "\blue Your throat adjusts to launch the dart." + usr.sting_range++ + + usr.verbs -= /client/proc/changeling_boost_range + + spawn(10) + usr.verbs += /client/proc/changeling_boost_range + + return + +/client/proc/changeling_silence_dart(mob/T as mob in oview(usr.sting_range)) + set category = "Changeling" + set name = "Silence Dart (10)" set desc="Sting target:" if(usr.stat) usr << "\red Not when we are incapacitated." return + if(usr.chem_charges < 10) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 10 + usr.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + T << "You feel a small prick and a burning sensation in your throat." + + T.silent += 30 + + usr.verbs -= /client/proc/changeling_silence_dart + + spawn(10) + usr.verbs += /client/proc/changeling_silence_dart + + return + +/client/proc/changeling_blind_dart(mob/T as mob in oview(usr.sting_range)) + set category = "Changeling" + set name = "Blind Dart (20)" + set desc="Sting target:" + + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 20) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 20 + usr.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + + var/obj/overlay/B = new /obj/overlay( T.loc ) + B.icon_state = "blspell" + B.icon = 'wizard.dmi' + B.name = "spell" + B.anchored = 1 + B.density = 0 + B.layer = 4 + T.canmove = 0 + spawn(5) + del(B) + T.canmove = 1 + T << text("\blue Your eyes cry out in pain!") + T.disabilities |= 1 + spawn(300) + T.disabilities &= ~1 + T.eye_blind = 10 + T.eye_blurry = 20 + + usr.verbs -= /client/proc/changeling_blind_dart + + spawn(10) + usr.verbs += /client/proc/changeling_blind_dart + + return + +/client/proc/changeling_deaf_dart(mob/T as mob in oview(usr.sting_range)) + set category = "Changeling" + set name = "Deaf Dart (5)" + set desc="Sting target:" + + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 5) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 5 + usr.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + + T.sdisabilities |= 4 + spawn(300) + T.sdisabilities &= ~4 + + usr.verbs -= /client/proc/changeling_deaf_dart + + spawn(10) + usr.verbs += /client/proc/changeling_deaf_dart + + return + +/client/proc/changeling_paralysis_dart(mob/T as mob in oview(usr.sting_range)) + set category = "Changeling" + set name = "Paralysis Dart (30)" + set desc="Sting target:" + + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 30) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 30 + usr.sting_range = 1 + usr << "\blue We stealthily sting [T]." T << "You feel a small prick and a burning sensation." - /* These are the normal sting, commented out for testing upgraded sting - - T.reagents.add_reagent("toxin", 10) - T.reagents.add_reagent("stoxin", 20) - - */ - - // These reagents are copied from the sleepy-pen, testing for the changeling super-sting bio upgrade if (T.reagents) - T.reagents.add_reagent("stoxin", 100) - T.reagents.add_reagent("impedrezene", 100) - T.reagents.add_reagent("cryptobiolin", 100) - else - usr << "This is a debug message you are getting because you have attempted to sting something that lacks a reagent container. Bug the guy that did the changeling code until he fixes it." + T.reagents.add_reagent("zombiepowder", 20) - usr.verbs -= /client/proc/changeling_neurotoxic_sting + usr.verbs -= /client/proc/changeling_paralysis_dart - spawn(600) - usr.verbs += /client/proc/changeling_neurotoxic_sting + spawn(10) + usr.verbs += /client/proc/changeling_paralysis_dart return -/client/proc/changeling_hallucinogenic_sting(mob/T as mob in oview(1)) +/client/proc/changeling_transformation_dart(mob/T as mob in oview(usr.sting_range)) set category = "Changeling" - set name = "Hallucinogenic Venom" + set name = "Transformation Dart (30)" set desc="Sting target:" if(usr.stat) usr << "\red Not when we are incapacitated." return + if(usr.chem_charges < 30) + usr << "\red We don't have enough stored chemicals to do that!" + return + + if(T.stat != 2 || (T.mutations & 64) || (!ishuman(T) && !ismonkey(T))) + usr << "\red We can't transform that target!" + return + + var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna + + if (S == null) + return + + usr.chem_charges -= 30 + usr.sting_range = 1 + usr << "\blue We stealthily sting [T]." - spawn(50) //Give the changeling a chance to calmly walk away before the target FREAKS THE FUCK OUT - if (T.reagents) - T.reagents.add_reagent("space_drugs", 5) - else - usr << "This is a debug message you are getting because you have attempted to sting something that lacks a reagent container. Bug the guy that did the changeling code until he fixes it." + T.visible_message(text("\red [usr] transforms!")) + T.dna = usr.absorbed_dna[S] + T.real_name = S + updateappearance(T, T.dna.uni_identity) + domutcheck(T, null) - usr.verbs -= /client/proc/changeling_hallucinogenic_sting + usr.verbs -= /client/proc/changeling_transformation_dart - spawn(600) - usr.verbs += /client/proc/changeling_hallucinogenic_sting + spawn(10) + usr.verbs += /client/proc/changeling_transformation_dart return \ No newline at end of file diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index d9bff0bd01d..f34c6bcc208 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -53,8 +53,8 @@ /obj/machinery/bot/secbot/beepsky - name = "Officer Beepsky" - desc = "It's Officer Beepsky! He's a loose cannon but he gets the job done." + name = "Officer Beep O'sky" + desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." idcheck = 0 auto_patrol = 1 diff --git a/code/game/machinery/microwave.dm b/code/game/machinery/microwave.dm index 93b8497ab33..748a864f8b5 100644 --- a/code/game/machinery/microwave.dm +++ b/code/game/machinery/microwave.dm @@ -6,6 +6,7 @@ var/monkeymeat_amount = 0 var/xenomeat_amount = 0 var/humanmeat_amount = 0 + var/carpmeat_amount = 0 var/donkpocket_amount = 0 var/milk_amount = 0 var/hotsauce_amount = 0 @@ -196,6 +197,22 @@ cheese_amount = 1 creates = "/obj/item/weapon/reagent_containers/food/snacks/cheesyfries" +/datum/recipe/clownburger + extra_item = /obj/item/clothing/mask/gas/clown_hat + flour_amount = 1 + creates = "obj/item/weapon/reagent_containers/food/snacks/clownburger" + +/datum/recipe/mimeburger + extra_item = /obj/item/clothing/head/beret + flour_amount = 1 + creates = "obj/item/weapon/reagent_containers/food/snacks/mimeburger" + +/datum/recipe/cubancarp + extra_item = /obj/item/weapon/reagent_containers/food/snacks/grown/chili + flour_amount = 1 + carpmeat_amount = 1 + creates = "obj/item/weapon/reagent_containers/food/snacks/cubancarp" + // *** After making the recipe above, add it in here! *** @@ -204,6 +221,9 @@ // at the wrong recipe. It's a hack job but it works until I clean up the microwave code. /obj/machinery/microwave/New() ..() + src.available_recipes += new /datum/recipe/clownburger(src) + src.available_recipes += new /datum/recipe/mimeburger(src) + src.available_recipes += new /datum/recipe/cubancarp(src) src.available_recipes += new /datum/recipe/humankabob(src) src.available_recipes += new /datum/recipe/monkeykabob(src) src.available_recipes += new /datum/recipe/jellydonut(src) @@ -328,6 +348,13 @@ obj/machinery/microwave/attackby(var/obj/item/O as obj, var/mob/user as mob) src.humanmeat_amount++ del(O) + else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/carpmeat)) + if(src.carpmeat_amount < 5) + for(var/mob/V in viewers(src, null)) + V.show_message(text("\blue [user] adds some meat to the microwave.")) + src.carpmeat_amount++ + del(O) + else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donkpocket)) if(src.donkpocket_amount < 2) for(var/mob/V in viewers(src, null)) @@ -418,7 +445,8 @@ Please clean it before use!
Turnovers:[src.donkpocket_amount] turnovers
Milk:[src.milk_amount] cups of milk.
[sauces] -Other Meat:[src.humanmeat_amount] slabs of meat
+Human Meat:[src.humanmeat_amount] slabs of meat
+Carp Meat:[src.carpmeat_amount] fillets of meat
[xenodisplay]

@@ -454,7 +482,7 @@ Please clean it before use!
for(var/mob/V in viewers(src, null)) V.show_message(text("\blue The microwave turns on.")) for(var/datum/recipe/R in src.available_recipes) //Look through the recipe list we made above - if(src.berryjuice_amount >= R.berryjuice_amount && src.cheese_amount == R.cheese_amount && src.tofu_amount == R.tofu_amount && src.egg_amount == R.egg_amount && src.flour_amount == R.flour_amount && src.monkeymeat_amount == R.monkeymeat_amount && src.humanmeat_amount == R.humanmeat_amount && src.donkpocket_amount == R.donkpocket_amount && src.xenomeat_amount == R.xenomeat_amount && src.hotsauce_amount >= R.hotsauce_amount && src.coldsauce_amount >= R.coldsauce_amount && src.soysauce_amount >= R.soysauce_amount && src.ketchup_amount >= R.ketchup_amount && src.milk_amount >= R.milk_amount) // Check if it's an accepted recipe + if(src.carpmeat_amount == R.carpmeat_amount && src.berryjuice_amount >= R.berryjuice_amount && src.cheese_amount == R.cheese_amount && src.tofu_amount == R.tofu_amount && src.egg_amount == R.egg_amount && src.flour_amount == R.flour_amount && src.monkeymeat_amount == R.monkeymeat_amount && src.humanmeat_amount == R.humanmeat_amount && src.donkpocket_amount == R.donkpocket_amount && src.xenomeat_amount == R.xenomeat_amount && src.hotsauce_amount >= R.hotsauce_amount && src.coldsauce_amount >= R.coldsauce_amount && src.soysauce_amount >= R.soysauce_amount && src.ketchup_amount >= R.ketchup_amount && src.milk_amount >= R.milk_amount) // Check if it's an accepted recipe var/thing if(src.extra_item) if (src.extra_item.type == R.extra_item) thing = 1 @@ -464,7 +492,7 @@ Please clean it before use!
cooked_item = R.creates // Store the item that will be created if(cooked_item == null) //Oops that wasn't a recipe dummy!!! - if(src.egg_amount > 0 || src.tofu_amount > 0 || src.flour_amount > 0 || src.water_amount > 0 || src.monkeymeat_amount > 0 || src.humanmeat_amount > 0 || src.donkpocket_amount > 0 || src.hotsauce_amount > 0 ||src.coldsauce_amount > 0 || src.soysauce_amount > 0 || src.ketchup_amount > 0 || src.milk_amount > 0 && src.extra_item == null) //Make sure there's something inside though to dirty it + if(src.carpmeat_amount > 0 || src.egg_amount > 0 || src.tofu_amount > 0 || src.flour_amount > 0 || src.water_amount > 0 || src.monkeymeat_amount > 0 || src.humanmeat_amount > 0 || src.donkpocket_amount > 0 || src.hotsauce_amount > 0 ||src.coldsauce_amount > 0 || src.soysauce_amount > 0 || src.ketchup_amount > 0 || src.milk_amount > 0 && src.extra_item == null) //Make sure there's something inside though to dirty it src.operating = 1 // Turn it on src.icon_state = "mw1" src.updateUsrDialog() @@ -568,6 +596,7 @@ Please clean it before use!
src.tofu_amount = 0 src.ketchup_amount = 0 src.berryjuice_amount = 0 + src.carpmeat_amount = 0 src.updateUsrDialog() //src.temp.reagents.clear_reagents() return \ No newline at end of file diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index 2b628aa85f6..0e219b1c301 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -76,7 +76,9 @@ datum/controller/game_controller M.Life() else M.Life() - + if (M.mind) + if (M.mind.special_role == "Changeling") + M.chem_charges = max(min((M.chem_charges+0.5), 50), 0) sleep(-1) for(var/datum/disease/D in active_diseases) diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm index 428c6b64444..ea145670ac4 100644 --- a/code/game/objects/devices/scanners.dm +++ b/code/game/objects/devices/scanners.dm @@ -156,11 +156,19 @@ PLANT ANALYZER for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] has analyzed []'s vitals!", user, M), 1) //Foreach goto(67) - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health))), 1) - user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.oxyloss > 50 ? "\red [M.oxyloss]" : M.oxyloss, M.toxloss > 50 ? "\red [M.toxloss]" : M.toxloss, M.fireloss > 50 ? "\red[M.fireloss]" : M.fireloss, M.bruteloss > 50 ? "\red[M.bruteloss]" : M.bruteloss), 1) + var/fake_oxy = max(rand(1,40), M.oxyloss, (300 - (M.toxloss + M.fireloss + M.bruteloss))) + if(M.changeling_fakedeath || M.reagents.has_reagent("zombiepowder")) + user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1) + user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.toxloss > 50 ? "\red [M.toxloss]" : M.toxloss, M.fireloss > 50 ? "\red[M.fireloss]" : M.fireloss, M.bruteloss > 50 ? "\red[M.bruteloss]" : M.bruteloss), 1) + else + user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health))), 1) + user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.oxyloss > 50 ? "\red [M.oxyloss]" : M.oxyloss, M.toxloss > 50 ? "\red [M.toxloss]" : M.toxloss, M.fireloss > 50 ? "\red[M.fireloss]" : M.fireloss, M.bruteloss > 50 ? "\red[M.bruteloss]" : M.bruteloss), 1) user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - user.show_message(text("\blue [] | [] | [] | []", M.oxyloss > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.toxloss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.fireloss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.bruteloss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) + if(M.changeling_fakedeath || M.reagents.has_reagent("zombiepowder")) + user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.toxloss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.fireloss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.bruteloss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) + else + user.show_message(text("\blue [] | [] | [] | []", M.oxyloss > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.toxloss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.fireloss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.bruteloss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) if (M.virus) user.show_message(text("\red Warning: Virus Detected.\nName: [M.virus.name].\nType: [M.virus.spread].\nStage: [M.virus.stage]/[M.virus.max_stages].\nPossible Cure: [M.virus.cure]")) if (M.reagents:get_reagent_amount("inaprovaline")) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 944d2a4c66f..4fc70337ae6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -177,6 +177,8 @@ stat("Internal Atmosphere Info", src.internal.name) stat("Tank Pressure", src.internal.air_contents.return_pressure()) stat("Distribution Pressure", src.internal.distribute_pressure) + if (src.mind.special_role == "Changeling") + stat("Chemical Storage", src.chem_charges) /mob/living/carbon/human/bullet_act(flag, A as obj) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index e307b82e8e6..04f648c8528 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -93,7 +93,6 @@ handle_disabilities() - if (src.disabilities & 2) if ((prob(1) && src.paralysis < 1 && src.r_epil < 1)) src << "\red You have a seizure!" @@ -618,6 +617,8 @@ src.paralysis = max(src.paralysis, 5) if (src.stat != 2) //Alive. + if (src.silent) + src.silent-- if (src.paralysis || src.stunned || src.weakened || changeling_fakedeath) //Stunned etc. if (src.stunned > 0) @@ -647,6 +648,7 @@ src.lying = 1 src.blinded = 1 src.stat = 2 + src.silent = 0 if (src.stuttering) src.stuttering-- diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 60e38830f86..2adb9e077b7 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -351,6 +351,9 @@ statpanel("Status") stat(null, text("Intent: []", src.a_intent)) stat(null, text("Move Mode: []", src.m_intent)) + if (src.client.statpanel == "Status") + if (src.mind.special_role == "Changeling") + stat("Chemical Storage", src.chem_charges) return /mob/living/carbon/monkey/update_clothing() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index ccb635d4036..fadd3de054f 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -8,7 +8,7 @@ if (length(message) >= 1) if (copytext(message, 1, 2) != "*") - if (src.miming) + if (src.miming || src.silent) return if (src.muted) diff --git a/icons/changelog.html b/icons/changelog.html index ed1a50831a7..d4521909896 100644 --- a/icons/changelog.html +++ b/icons/changelog.html @@ -44,6 +44,29 @@ Thanks to: CDK Station devs, GoonStation devs, the original SpaceStation developers and Erikat for the new title image

Changelog

+
14.01.2011, r853
+
    +
  • Changlings Overhauled. Now function kinda like alium (using an internal chemical reserve instead of plasma) with each ability requiring a certain amount of chemicals to activate. Both venoms removed. Several "Dart" abiliites added. They allow the changling to deafen, blind, mute, paralyze, or even transform (dead) targets. +
  • Carp meat now contaminated with Carpotoxin. Anti-toxin negates the poison, however. +
  • New Reagent: Zombie Powder: Puts subjects into a deathlike state (they remain aware, though). Each unit of Zombie Powder requires 5 units of Carpotoxin, Sleeping Toxin, and Copper. +
  • Various alium fixes. +
  • Matches now available from smokes machine. +
  • Megabomb bug fixed. Bombs with timers/signalers won't detonate after the timer/ signaler is removed. +
  • New Disease: Rhumba Beat. Functions like GBS with a few exceptions. Not only available by admindickery. +
  • More mining fixes/changes. +
  • Ghost can now teleport to AI sat, Thunderdome, and Derelict. +
  • New gimmick clothes +
  • Constructing Glass Airlocks now use one sheet of R.Glass. +
  • Windows mow always appear above grills and pipes always above lattices. +
  • Added FireFighter mecha and various mecha fixes. +
  • Deconstructed walls now leave proper floor tiles (that can be pried up like normal) and remember what kind of floor they were before the wall was made. +
  • Carded AIs no longer take damage while in unpowered areas. +
  • Chaplains can now name their religion at round start. +
  • New Recipies: Clown Burger (1 Clown wig, 5 flour), Mime Burger (1 beret, 5 flour), Cuban Carp (1 carp fillet, 1 chili, 5 flour). +
  • Napalm nerfed a bit. Produces ~25% less plasma but it's all concentrated in a single tile (will still spread, though). +
  • Reagent bottles can, once again, be put into grenades. +
  • Various minor map changes. +
08.01.2011,8:00PST, r820