diff --git a/baystation12.dme b/baystation12.dme index 28a9fa0df46..e3380e26203 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -795,6 +795,7 @@ #include "code\modules\admin\verbs\adminsay.dm" #include "code\modules\admin\verbs\atmosdebug.dm" #include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\cinematic.dm" #include "code\modules\admin\verbs\custom_event.dm" #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" @@ -1182,6 +1183,7 @@ #include "code\WorkInProgress\virus2\monkeydispensor.dm" #include "code\WorkInProgress\virus2\Prob.dm" #include "code\WorkInProgress\Wrongnumber\weldbackpack.dm" +#include "interface\interface.dm" #include "interface\skin.dmf" #include "maps\tgstation.2.0.8.dmm" // END_INCLUDE diff --git a/code/FEA/FEA_gas_mixture.dm b/code/FEA/FEA_gas_mixture.dm index d43c88dabbc..7e4c565b708 100644 --- a/code/FEA/FEA_gas_mixture.dm +++ b/code/FEA/FEA_gas_mixture.dm @@ -475,6 +475,7 @@ datum return share(sharer)*/ check_gas_mixture(datum/gas_mixture/sharer) + if(!sharer) return 0 var/delta_oxygen = (oxygen_archived - sharer.oxygen_archived)/5 var/delta_carbon_dioxide = (carbon_dioxide_archived - sharer.carbon_dioxide_archived)/5 var/delta_nitrogen = (nitrogen_archived - sharer.nitrogen_archived)/5 diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm index 59c5c6543d9..ca79489d257 100644 --- a/code/datums/configuration.dm +++ b/code/datums/configuration.dm @@ -2,7 +2,7 @@ var/server_name = null // server name (for world name / status) var/server_suffix = 0 // generate numeric suffix based on server port - var/log_ooc = 0 // log OOC channek + var/log_ooc = 0 // log OOC channel var/log_access = 0 // log login/logout var/log_say = 0 // log client say var/log_admin = 0 // log admin actions @@ -32,6 +32,7 @@ var/Tensioner_Active = 0 // If the tensioner is running. var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. + var/Ticklag = 0.9 var/list/mode_names = list() var/list/modes = list() // allowed modes @@ -48,6 +49,8 @@ var/server var/banappeals + var/wikiurl + var/forumurl //Alert level description var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." @@ -217,6 +220,12 @@ if ("banappeals") config.banappeals = value + if ("wikiurl") + config.wikiurl = value + + if ("forumurl") + config.forumurl = value + if ("guest_jobban") config.guest_jobban = 1 @@ -288,6 +297,9 @@ if("useircbot") useircbot = 1 + if("ticklag") + Ticklag = text2num(value) + if("require_heads_alive") config.require_heads_alive = value diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 3cc9f01be64..da1b4800e91 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -498,7 +498,7 @@ client togglebuildmode(MOB) href_list["datumrefresh"] = href_list["build_mode"] -/* else if (href_list["direct_control"]) + else if (href_list["direct_control"]) if(!href_list["direct_control"]) return var/mob/MOB = locate(href_list["direct_control"]) @@ -510,7 +510,7 @@ client return if(usr.client) - usr.client.cmd_assume_direct_control(MOB)*/ + usr.client.cmd_assume_direct_control(MOB) else if (href_list["delall"]) if(!href_list["delall"]) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f64557c03f3..4644c924cfc 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -454,8 +454,8 @@ datum/mind // copy targets var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries if (valid_head) - for (var/datum/objective/assassinate/O in valid_head.objectives) - var/datum/objective/assassinate/rev_obj = new + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new rev_obj.owner = src rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." @@ -1011,8 +1011,8 @@ datum/mind // copy targets var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries if (valid_head) - for (var/datum/objective/assassinate/O in valid_head.objectives) - var/datum/objective/assassinate/rev_obj = new + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new rev_obj.owner = src rev_obj.target = O.target rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." diff --git a/code/defines/obj.dm b/code/defines/obj.dm index e2b975d4d50..e1facd0a59a 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -383,7 +383,6 @@ opacity = 0 density = 0 - /obj/hud name = "hud" unacidable = 1 @@ -400,9 +399,8 @@ var/obj/screen/g_dither = null var/obj/screen/blurry = null var/list/darkMask = null - var/obj/screen/station_explosion = null - var/h_type = /obj/screen + var/h_type = /obj/screen //this is like...the most pointless thing ever. Use a god damn define! /obj/item name = "item" diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm index 3f5eebc7ebc..01e41a3b764 100644 --- a/code/defines/obj/decal.dm +++ b/code/defines/obj/decal.dm @@ -63,10 +63,19 @@ var/datum/disease2/disease/virus2 = null var/OriginalMob = null - Del() - for(var/datum/disease/D in viruses) - D.cure(0) - ..() +/obj/effect/decal/cleanable/blood/Del() + for(var/datum/disease/D in viruses) + D.cure(0) + ..() + +/obj/effect/decal/cleanable/blood/New() + ..() + if(istype(src, /obj/effect/decal/cleanable/blood/gibs)) + return + if(src.loc && isturf(src.loc)) + for(var/obj/effect/decal/cleanable/blood/B in src.loc) + if(B != src) + del(B) /obj/effect/decal/cleanable/blood/drip name = "drips of blood" diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index 456ceddb6ec..3c18374fc61 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -278,6 +278,23 @@ plant_type = 0 growthstages = 6 +/obj/item/seeds/bluespacetomatoseed + name = "pack of blue-space tomato seeds" + desc = "These seeds grow into blue-space tomato plants." + icon_state = "seed-bluespacetomato" + mypath = "/obj/item/seeds/bluespacetomatoseed" + species = "bluespacetomato" + plantname = "Blue-Space Tomato Plants" + productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato" + lifespan = 25 + endurance = 15 + maturation = 8 + production = 6 + yield = 2 + potency = 10 + plant_type = 0 + growthstages = 6 + /obj/item/seeds/cornseed name = "pack of corn seeds" desc = "I don't mean to sound corny..." @@ -400,7 +417,7 @@ potency = 10 oneharvest = 1 plant_type = 0 - growthstages = 5 + growthstages = 3 /obj/item/seeds/amanitamycelium name = "pack of fly amanita mycelium" @@ -1143,46 +1160,6 @@ reagents.add_reagent("coco", 4+round((potency / 5), 1)) bitesize = 1+round(reagents.total_volume / 2, 1) -//This object is just a transition object. All it does is make a grass tile and delete itself. -/obj/item/weapon/reagent_containers/food/snacks/grown/grass - seed = "/obj/item/seeds/grassseed" - name = "grass" - desc = "Green and lush." - icon_state = "spawner" - potency = 20 - New() - new/obj/item/stack/tile/grass(src.loc) - spawn(5) //Workaround to keep harvesting from working weirdly. - del(src) - -//This object is just a transition object. All it does is make dosh and delete itself. -Cheridan -/obj/item/weapon/reagent_containers/food/snacks/grown/money - seed = "/obj/item/seeds/cashseed" - name = "dosh" - desc = "Green and lush." - icon_state = "spawner" - potency = 10 - New() - switch(rand(1,100))//(potency) //It wants to use the default potency instead of the new, so it was always 10. Will try to come back to this later - Cheridan - if(0 to 10) - new/obj/item/weapon/spacecash/(src.loc) - if(11 to 20) - new/obj/item/weapon/spacecash/c10(src.loc) - if(21 to 30) - new/obj/item/weapon/spacecash/c20(src.loc) - if(31 to 40) - new/obj/item/weapon/spacecash/c50(src.loc) - if(41 to 50) - new/obj/item/weapon/spacecash/c100(src.loc) - if(51 to 60) - new/obj/item/weapon/spacecash/c200(src.loc) - if(61 to 80) - new/obj/item/weapon/spacecash/c500(src.loc) - else - new/obj/item/weapon/spacecash/c1000(src.loc) - spawn(5) //Workaround to keep harvesting from working weirdly. - del(src) - /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane seed = "/obj/item/seeds/sugarcaneseed" name = "sugarcane" @@ -1985,3 +1962,99 @@ New() src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) + + +// ************************************* +// Complex Grown Object Defines - +// Putting these at the bottom so they don't clutter the list up. -Cheridan +// ************************************* + +//This object is just a transition object. All it does is make a grass tile and delete itself. +/obj/item/weapon/reagent_containers/food/snacks/grown/grass + seed = "/obj/item/seeds/grassseed" + name = "grass" + desc = "Green and lush." + icon_state = "spawner" + potency = 20 + New() + new/obj/item/stack/tile/grass(src.loc) + spawn(5) //Workaround to keep harvesting from working weirdly. + del(src) + +//This object is just a transition object. All it does is make dosh and delete itself. -Cheridan +/obj/item/weapon/reagent_containers/food/snacks/grown/money + seed = "/obj/item/seeds/cashseed" + name = "dosh" + desc = "Green and lush." + icon_state = "spawner" + potency = 10 + New() + switch(rand(1,100))//(potency) //It wants to use the default potency instead of the new, so it was always 10. Will try to come back to this later - Cheridan + if(0 to 10) + new/obj/item/weapon/spacecash/(src.loc) + if(11 to 20) + new/obj/item/weapon/spacecash/c10(src.loc) + if(21 to 30) + new/obj/item/weapon/spacecash/c20(src.loc) + if(31 to 40) + new/obj/item/weapon/spacecash/c50(src.loc) + if(41 to 50) + new/obj/item/weapon/spacecash/c100(src.loc) + if(51 to 60) + new/obj/item/weapon/spacecash/c200(src.loc) + if(61 to 80) + new/obj/item/weapon/spacecash/c500(src.loc) + else + new/obj/item/weapon/spacecash/c1000(src.loc) + spawn(5) //Workaround to keep harvesting from working weirdly. + del(src) + +/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato + seed = "/obj/item/seeds/bluespacetomatoseed" + name = "blue-space tomato" + desc = "So lubricated, you might slip through space-time." + icon_state = "bluespacetomato" + potency = 10 + origin_tech = "bluespace=3" + New() + ..() + reagents.add_reagent("nutriment", 1+round((potency / 20), 1)) + reagents.add_reagent("singulo", 1+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) + + throw_impact(atom/hit_atom) + ..() + var/mob/M = usr + var/outer_teleport_radius = potency/10 //Plant potency determines radius of teleport. + var/inner_teleport_radius = potency/15 + var/list/turfs = new/list() + for(var/turf/T in orange(M,outer_teleport_radius)) + if(T in orange(M,inner_teleport_radius)) continue + if(istype(T,/turf/space)) continue + if(T.density) continue + if(T.x>world.maxx-outer_teleport_radius || T.xworld.maxy-outer_teleport_radius || T.yThe [src.name] has been squashed, causing a distortion in space-time.","You hear a smack.") + del(src) + return diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm index 1fa6ff86658..a8001bc51b1 100755 --- a/code/defines/obj/supplypacks.dm +++ b/code/defines/obj/supplypacks.dm @@ -390,7 +390,8 @@ "/obj/item/seeds/carrotseed", "/obj/item/seeds/sunflowerseed", "/obj/item/seeds/chantermycelium", - "/obj/item/seeds/potatoseed") + "/obj/item/seeds/potatoseed", + "/obj/item/seeds/sugarcaneseed") cost = 10 containertype = /obj/structure/closet/crate/hydroponics containername = "Seeds crate" @@ -712,8 +713,8 @@ name = "Ballistic gear crate" contains = list("/obj/item/clothing/suit/armor/bulletproof", "/obj/item/clothing/suit/armor/bulletproof", - "/obj/item/weapon/gun/projectile/shotgun/combat2", - "/obj/item/weapon/gun/projectile/shotgun/combat2") + "/obj/item/weapon/gun/projectile/shotgun/pump/combat", + "/obj/item/weapon/gun/projectile/shotgun/pump/combat") cost = 50 containertype = "/obj/structure/closet/crate/secure" containername = "Ballistic gear crate" diff --git a/code/defines/obj/toy.dm b/code/defines/obj/toy.dm index 68746bfc60d..b0db726be4e 100644 --- a/code/defines/obj/toy.dm +++ b/code/defines/obj/toy.dm @@ -4,6 +4,68 @@ throw_range = 20 force = 0 + +/////////Toy Mechs///////// + +/obj/item/toy/prize + icon = 'toy.dmi' + icon_state = "ripleytoy" + +/obj/item/toy/prize/ripley + name = "toy ripley" + desc = "Mini-Mecha action figure! Collect them all! 1/11" + +/obj/item/toy/prize/fireripley + name = "toy firefighting ripley" + desc = "Mini-Mecha action figure! Collect them all! 2/11" + icon_state = "fireripleytoy" + +/obj/item/toy/prize/deathripley + name = "toy deathsquad ripley" + desc = "Mini-Mecha action figure! Collect them all! 3/11" + icon_state = "deathripleytoy" + +/obj/item/toy/prize/gygax + name = "toy gygax" + desc = "Mini-Mecha action figure! Collect them all! 4/11" + icon_state = "gygaxtoy" + +/obj/item/toy/prize/durand + name = "toy gygax" + desc = "Mini-Mecha action figure! Collect them all! 5/11" + icon_state = "durandprize" + +/obj/item/toy/prize/honk + name = "toy H.O.N.K." + desc = "Mini-Mecha action figure! Collect them all! 6/11" + icon_state = "honkprize" + +/obj/item/toy/prize/marauder + name = "toy marauder" + desc = "Mini-Mecha action figure! Collect them all! 7/11" + icon_state = "marauderprize" + +/obj/item/toy/prize/seraph + name = "toy seraph" + desc = "Mini-Mecha action figure! Collect them all! 8/11" + icon_state = "seraphprize" + +/obj/item/toy/prize/mauler + name = "toy mauler" + desc = "Mini-Mecha action figure! Collect them all! 9/11" + icon_state = "maulerprize" + +/obj/item/toy/prize/odysseus + name = "toy odysseus" + desc = "Mini-Mecha action figure! Collect them all! 10/11" + icon_state = "odysseusprize" + +/obj/item/toy/prize/phazon + name = "toy phazon" + desc = "Mini-Mecha action figure! Collect them all! 11/11" + icon_state = "phazonprize" + + /obj/item/toy/syndicateballoon name = "syndicate balloon" desc = "There is a tag on the back that reads \"FUK NT!11!\"." diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm index 648886f8f23..789705e5615 100755 --- a/code/defines/obj/vending.dm +++ b/code/defines/obj/vending.dm @@ -92,6 +92,7 @@ hidden_prices = "2;5" points = 15 product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" + charge_type = "engineering" /obj/machinery/vending/coffee name = "Hot Drinks machine" @@ -306,9 +307,26 @@ product_hidden = "/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola" // product_hideamt = "20" hidden_prices = "1" - product_ads = "What the fuck is this shit?;Why would you buy this;holy shit help;i'm stuck;in;a;universe;factory;AAAAAARGH!;HEIL... Stalin?;CAPITALIST PIGS;FUCK THE WEST" + product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." charge_type = "soda" +/obj/machinery/vending/tool + name = "YouTool" + desc = "Tools for tools." + icon_state = "tool" + icon_deny = "tool-deny" + req_access_txt = "12" //Maintenance access + product_paths = "/obj/item/weapon/cable_coil/random;/obj/item/weapon/crowbar;/obj/item/weapon/weldingtool;/obj/item/weapon/wirecutters;/obj/item/weapon/wrench;/obj/item/device/analyzer;/obj/item/device/t_scanner" +// product_amounts = "10;5;3;5;5;5;5" + product_prices = "1;2;3;2;2;2;2" + product_prices = "1" + product_hidden = "/obj/item/weapon/weldingtool/largetank;/obj/item/device/multitool" +// product_hideamt = "2;2" + hidden_prices = "4;4" + product_coin = "/obj/item/clothing/gloves/yellow" + product_coin_amt = "1" + charge_type = "engineering" + /obj/machinery/vending/genetics name = "Genetics Dispenser" desc = "Medical drug dispenser." diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 0803841d5ef..5719f6a6d76 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -639,7 +639,7 @@ w_class = 2.0 throw_speed = 3 throw_range = 10 - flags = ONBELT + flags = FPRINT | TABLEPASS | ONBELT /obj/item/weapon/clipboard/notebook name = "notebook" diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index bcccc00b9ad..9cc3f146e42 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -199,13 +199,11 @@ world << "\blue[i].." sleep(10) enter_allowed = 0 - for(var/mob/M in world) - if(M.client) - spawn(0) - M.client.station_explosion_cinematic() - sleep(110) - ticker.mode:station_was_nuked = 1 - ticker.mode:explosion_in_progress = 0 + if(ticker) + ticker.station_explosion_cinematic(0,null) + if(ticker.mode) + ticker.mode:station_was_nuked = 1 + ticker.mode:explosion_in_progress = 0 return diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index dc2fe2e28cd..82ff91696cc 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -138,6 +138,107 @@ var/datum/roundinfo/roundinfo = new() return 1 /datum/controller/gameticker + //station_explosion used to be a variable for every mob's hud. Which was a waste! + //Now we have a general cinematic centrally held within the gameticker....far more efficient! + var/obj/screen/cinematic = null + + //Plus it provides an easy way to make cinematics for other events. Just use this as a template :) + proc/station_explosion_cinematic(var/station_missed=0, var/override = null) + if( cinematic ) return //already a cinematic in progress! + + //initialise our cinematic screen object + cinematic = new(src) + cinematic.icon = 'station_explosion.dmi' + cinematic.icon_state = "start" + cinematic.layer = 20 + cinematic.mouse_opacity = 0 + cinematic.screen_loc = "1,3" //TODO resize them + + var/obj/structure/stool/bed/temp_buckle = new(src) + //Incredibly hackish. It creates a bed within the gameticker (lol) to stop mobs running around + if(station_missed) + for(var/mob/M in world) + M.buckled = temp_buckle //buckles the mob so it can't do anything + if(M.client) + M.client.screen += cinematic //show every client the cinematic + else //nuke kills everyone on z-level 1 to prevent "hurr-durr I survived" + for(var/mob/M in world) + M.buckled = temp_buckle + if(M.client) + M.client.screen += cinematic + switch(M.z) + if(0) //inside a crate or something + var/turf/T = get_turf(M) + if(T && T.z==1) //we don't use M.death(0) because it calls a for(/mob) loop and + M.health = 0 + M.stat = DEAD + if(1) //on a z-level 1 turf. + M.health = 0 + M.stat = DEAD + + //Now animate the cinematic + switch(station_missed) + if(2) //nuke was nowhere nearby //TODO: a really distant explosion animation + sleep(50) + world << sound('explosionfar.ogg') + + if(1) //nuke was nearby but (mostly) missed + if( mode && !override ) + override = mode.name + switch( override ) + if("nuclear emergency") + flick("start_nuke",cinematic) + sleep(50) + world << sound('explosionfar.ogg') + flick("explode2",cinematic) + cinematic.icon_state = "loss_nuke2" + else + sleep(50) + world << sound('explosionfar.ogg') + flick("explode2",cinematic) + + else //station was destroyed + if( mode && !override ) + override = mode.name + switch( override ) + if("nuclear emergency") + flick("start_nuke",cinematic) + sleep(50) + world << sound('explosionfar.ogg') + cinematic.icon_state = "end" + flick("explode",cinematic) + cinematic.icon_state = "loss_nuke" + + if("AI malfunction") + flick("start_malf",cinematic) + sleep(50) + world << sound('explosionfar.ogg') + cinematic.icon_state = "end" + flick("explode",cinematic) + cinematic.icon_state = "loss_malf" + + if("blob") + flick("start_blob",cinematic) //TODO: make a blob one + sleep(50) + world << sound('explosionfar.ogg') + cinematic.icon_state = "end" + flick("explode",cinematic) + cinematic.icon_state = "loss_blob" //TODO: make a blob one + + else + //default station-destroyed ending + sleep(50) + world << sound('explosionfar.ogg') + cinematic.icon_state = "end" + flick("explode",cinematic) + cinematic.icon_state = "loss_general" + sleep(100) + + //Tidy-up time! + if(cinematic) del(cinematic) //end the cinematic + if(temp_buckle) del(temp_buckle) //release everybody + return + proc/create_characters() for(var/mob/new_player/player in world) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 3669561f82c..9869f29ff7e 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -188,14 +188,11 @@ world << i sleep(10) enter_allowed = 0 - for(var/mob/M in world) - if(M.client) - spawn(0) - M.client.station_explosion_cinematic() - sleep(110) - ticker.mode:station_was_nuked = 1 - ticker.mode:explosion_in_progress = 0 - //world << "Everyone was killed by the self-destruct!" + if(ticker) + ticker.station_explosion_cinematic(0,null) + if(ticker.mode) + ticker.mode:station_was_nuked = 1 + ticker.mode:explosion_in_progress = 0 return diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index ca568f6bf9d..c744d9fd1e3 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -159,6 +159,7 @@ return +#define NUKERANGE 80 /obj/machinery/nuclearbomb/proc/explode() if (src.safety) src.timing = 0 @@ -176,47 +177,40 @@ enter_allowed = 0 var/off_station = 0 - var/area/A = get_area(src.loc) - if(A && (istype(A,/area/syndicate_station) || A.type == "/area")) - off_station = 1 - if (ticker && ticker.mode && ticker.mode.name == "nuclear emergency") - ticker.mode:herp = syndicate_station_at_station - ticker.mode:nuke_off_station = off_station + var/turf/bomb_location = get_turf(src) + if( bomb_location && (bomb_location.z == 1) ) + if( (bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE)) ) + off_station = 1 + else + off_station = 2 - for(var/mob/M in world) - if(M.client) - spawn(0) - M.client.station_explosion_cinematic(off_station) - sleep(110) + if (ticker) + if(ticker.mode && ticker.mode.name == "nuclear emergency") + ticker.mode:herp = syndicate_station_at_station + ticker.mode:nuke_off_station = off_station + ticker.station_explosion_cinematic(off_station,null) + if(ticker.mode) + ticker.mode.explosion_in_progress = 0 + if(ticker.mode.name == "nuclear emergency") + ticker.mode:nukes_left -- + else + world << "The station was destoyed by the nuclear blast!" - if (ticker && ticker.mode) - ticker.mode.explosion_in_progress = 0 - if(ticker.mode.name == "nuclear emergency") - ticker.mode:nukes_left -- - ticker.mode.station_was_nuked = (off_station==0) + ticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. + //kinda shit but I couldn't get permission to do what I wanted to do. - else - world << "The station was destoyed by the nuclear blast!" - ticker.mode.station_was_nuked = 1 - /* - TODO: derped blast should partially damage nearest objects - and do not reboot the game. Also make it work properly on other z-levels --rastaf0 - Further TODO: make nuke detonation work with objectives. Right now, you can't track player - location because they are viewing the cinematic (can't get_turf on them to determine z_level - as it will return null). Leaving this for you since you apparently plan to work this further. /N - */ + if(!ticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is + world << "Resetting in 30 seconds!" - if(!ticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is - world << "Resetting in 30 seconds!" - - //feedback_set_details("end_error","nuke - unhandled ending") - if(blackbox) - blackbox.save_all_data_to_sql() - sleep(300) - log_game("Rebooting due to nuclear detonation") - world.Reboot() - return + feedback_set_details("end_error","nuke - unhandled ending") + if(blackbox) + blackbox.save_all_data_to_sql() + sleep(300) + log_game("Rebooting due to nuclear detonation") + world.Reboot() + return + return /obj/item/weapon/disk/nuclear/Del() if(blobstart.len > 0) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 75e608b8d76..95fabebab6e 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -75,7 +75,7 @@ for(var/datum/mind/rev_mind in head_revolutionaries) for(var/datum/mind/head_mind in heads) - var/datum/objective/assassinate/rev_obj = new + var/datum/objective/mutiny/rev_obj = new rev_obj.owner = rev_mind rev_obj.target = head_mind rev_obj.explanation_text = "Assassinate [head_mind.current.real_name], the [head_mind.role_alt_title ? head_mind.role_alt_title : head_mind.assigned_role]." @@ -95,7 +95,7 @@ /datum/game_mode/revolution/process() checkwin_counter++ - if(checkwin_counter >= 20) + if(checkwin_counter >= 5) if(!finished) ticker.mode.check_win() checkwin_counter = 0 @@ -370,7 +370,7 @@ var/list/heads = get_all_heads() var/list/targets = new for (var/datum/mind/i in head_revolutionaries) - for (var/datum/objective/assassinate/o in i.objectives) + for (var/datum/objective/mutiny/o in i.objectives) targets |= o.target if (head_revolutionaries.len!=0 || \ revolutionaries.len!=0 || \ diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 5bd77a7fdeb..47ac7dbdca6 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -44,7 +44,7 @@ if("cannon") new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) if("shotgun") - new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H)) + new /obj/item/weapon/gun/projectile/shotgun/pump/combat(get_turf(H)) if("freeze") new /obj/item/weapon/gun/energy/temperature(get_turf(H)) if("uzi") diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index eb313f56493..a26ea8a6910 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -15,6 +15,8 @@ attack(mob/living/carbon/human/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/human))//If target is not a human. return ..() + if(istype(M, /mob/living/carbon/human/dummy)) + return..() M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 8e2e98b362b..ac97147c4c9 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -79,6 +79,7 @@ H.equip_if_possible(new /obj/item/clothing/gloves/botanic_leather(H), H.slot_gloves) H.equip_if_possible(new /obj/item/clothing/suit/storage/apron(H), H.slot_wear_suit) H.equip_if_possible(new /obj/item/device/analyzer/plant_analyzer(H), H.slot_s_store) + H.equip_if_possible(new /obj/item/device/pda/botanist(H), H.slot_belt) return 1 @@ -266,6 +267,7 @@ equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_if_possible(new /obj/item/clothing/under/suit_jacket/red(H), H.slot_w_uniform) + H.equip_if_possible(new /obj/item/device/pda/librarian(H), H.slot_belt) H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes) H.equip_if_possible(new /obj/item/weapon/barcodescanner(H), H.slot_l_store) return 1 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c3ee3118ef2..bb0aa82c654 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -66,11 +66,12 @@ dat += text("[]\t-Toxin Content %: []
", (occupant.getToxLoss() < 60 ? "" : ""), occupant.getToxLoss()) dat += text("[]\t-Burn Severity %: []
", (occupant.getFireLoss() < 60 ? "" : ""), occupant.getFireLoss()) dat += text("
Paralysis Summary %: [] ([] seconds left!)
", occupant.paralysis, round(occupant.paralysis / 4)) - dat += text("Inaprovaline units: [] units
", occupant.reagents.get_reagent_amount("inaprovaline")) - dat += text("Soporific (Sleep Toxin): [] units
", occupant.reagents.get_reagent_amount("stoxin")) - dat += text("[]\tDermaline: [] units

", (occupant.reagents.get_reagent_amount("dermaline") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("dermaline")) - dat += text("[]\tBicaridine: [] units
", (occupant.reagents.get_reagent_amount("bicaridine") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("bicaridine")) - dat += text("[]\tDexalin: [] units
", (occupant.reagents.get_reagent_amount("dexalin") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("dexalin")) + if(occupant.reagents) + dat += text("Inaprovaline units: [] units
", occupant.reagents.get_reagent_amount("inaprovaline")) + dat += text("Soporific (Sleep Toxin): [] units
", occupant.reagents.get_reagent_amount("stoxin")) + dat += text("[]\tDermaline: [] units

", (occupant.reagents.get_reagent_amount("dermaline") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("dermaline")) + dat += text("[]\tBicaridine: [] units
", (occupant.reagents.get_reagent_amount("bicaridine") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("bicaridine")) + dat += text("[]\tDexalin: [] units
", (occupant.reagents.get_reagent_amount("dexalin") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("dexalin")) dat += text("
Refresh meter readings each second
Inject Inaprovaline
Inject Soporific
Inject Dermaline
Inject Bicaridine
Inject Dexalin", src, src, src, src, src, src) else dat += "The sleeper is empty." diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 8db9eabe4a1..10e78b95e57 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -924,7 +924,7 @@ var/list/kv = list( "type" = "mulebot", "name" = suffix, - "loca" = loc.loc, // area + "loca" = (loc ? loc.loc : "Unknown"), // somehow loc can be null and cause a runtime - Quarxink "mode" = mode, "powr" = (cell ? cell.percent() : 0), "dest" = destination, diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index 904e24861d6..4f4b77ef4f1 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -20,8 +20,15 @@ var/planted = 0 // Is it occupied? var/harvest = 0 //Ready to harvest? var/obj/item/seeds/myseed = null // The currently planted seed - - + New() + ..() + bullet_act(var/obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables. + if(istype(Proj ,/obj/item/projectile/energy/floramut)) + if(src.planted) + src.mutate() + else if(istype(Proj ,/obj/item/projectile/energy/florayield)) + if(src.planted && src.myseed.yield < 2) + src.myseed.yield += 1 obj/machinery/hydroponics/process() @@ -96,10 +103,12 @@ obj/machinery/hydroponics/process() if(src.age > src.myseed.production && (src.age - src.lastproduce) > src.myseed.production && (!src.harvest && !src.dead)) var/m_count = 0 while(m_count < src.mutmod) - if(prob(90)) + if(prob(85)) src.mutate() else if(prob(30)) src.hardmutate() + else if(prob(5)) + src.mutatespecie() m_count++; if(src.yieldmod > 0 && src.myseed.yield != -1) // Unharvestable shouldn't be harvested src.harvest = 1 @@ -301,6 +310,14 @@ obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! del(src.myseed) src.myseed = new /obj/item/seeds/angelmycelium + else if ( istype(src.myseed, /obj/item/seeds/lemonseed )) + del(src.myseed) + src.myseed = new /obj/item/seeds/cashseed + + else if ( istype(src.myseed, /obj/item/seeds/ambrosiavulgarisseed )) + del(src.myseed) + src.myseed = new /obj/item/seeds/ambrosiadeusseed + else if ( istype(src.myseed, /obj/item/seeds/plumpmycelium )) del(src.myseed) src.myseed = new /obj/item/seeds/walkingmushroommycelium @@ -331,6 +348,10 @@ obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! if(71 to 100) src.myseed = new /obj/item/seeds/killertomatoseed + else if ( istype(src.myseed, /obj/item/seeds/bluetomatoseed )) + del(src.myseed) + src.myseed = new /obj/item/seeds/bluespacetomatoseed + else if ( istype(src.myseed, /obj/item/seeds/grapeseed )) del(src.myseed) src.myseed = new /obj/item/seeds/greengrapeseed @@ -382,6 +403,8 @@ obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent in spawn(5) // Wait a while src.updateicon() src.visible_message("\red The mutated weeds in [src] spawned a \blue [src.myseed.plantname]!") + else + usr << "The few weeds in the tray seem to react, but only for a moment..." return @@ -397,12 +420,12 @@ obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one obj/machinery/hydroponics/proc/mutatepest() // Until someone makes a spaceworm, this is commented out -// if ( src.pestlevel > 5 ) -// user << "The worms seem to behave oddly..." + if ( src.pestlevel > 5 ) + src.visible_message("The pests seem to behave oddly...") // spawn(10) // new /obj/effect/alien/spaceworm(src.loc) -// else - //user << "Nothing happens..." + else + usr << "The pests seem to behave oddly, but quickly settle down..." //Modified to give a better idea of what's happening when you inject mutagen. There's still nothing proper to spawn here though. -Cheridan return @@ -458,7 +481,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if (81 to 90) src.mutatespecie() if (66 to 80) src.hardmutate() if (41 to 65) src.mutate() - if (21 to 41) user << "Nothing happens..." + if (21 to 41) user << "The plants don't seem to react..." if (11 to 20) src.mutateweed() if (1 to 10) src.mutatepest() else user << "Nothing happens..." @@ -583,11 +606,26 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if (81 to 90) src.mutatespecie() if (66 to 80) src.hardmutate() if (41 to 65) src.mutate() - if (21 to 41) user << "Nothing happens..." + if (21 to 41) user << "The plants don't seem to react..." if (11 to 20) src.mutateweed() if (1 to 10) src.mutatepest() else user << "Nothing happens..." + // The best stuff there is. For testing/debugging. + + if(S.reagents.has_reagent("adminordrazine", 1)) + src.waterlevel += round(S.reagents.get_reagent_amount("adminordrazine")*1) + src.health += round(S.reagents.get_reagent_amount("adminordrazine")*1) + src.nutrilevel += round(S.reagents.get_reagent_amount("adminordrazine")*1) + src.pestlevel -= rand(1,5) + src.weedlevel -= rand(1,5) + if(S.reagents.has_reagent("adminordrazine", 5)) + switch(rand(100)) + if (66 to 100) src.mutatespecie() + if (33 to 65) src.mutateweed() + if (1 to 32) src.mutatepest() + else user << "Nothing happens..." + S.reagents.clear_reagents() if (src.weedlevel < 0 ) // Make sure it won't go overoboard src.weedlevel = 0 @@ -839,6 +877,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if (realName) podman.real_name = realName + podman.original_name = realName //don't want a random ghost name if we die again else podman.real_name = "pod person" //No null names!! @@ -946,3 +985,39 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) planted = 0 dead = 0 updateicon() + +/////////////////////////////////////////////////////////////////////////////// + +/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! + name = "soil" + icon = 'hydroponics.dmi' + icon_state = "soil" + density = 0 + New() + ..() + updateicon() // Same as normal but with the overlays removed - Cheridan. + overlays = null + if(src.planted) + if(dead) + overlays += image('hydroponics.dmi', icon_state="[src.myseed.species]-dead") + else if(src.harvest) + if(src.myseed.plant_type == 2) // Shrooms don't have a -harvest graphic + overlays += image('hydroponics.dmi', icon_state="[src.myseed.species]-grow[src.myseed.growthstages]") + else + overlays += image('hydroponics.dmi', icon_state="[src.myseed.species]-harvest") + else if(src.age < src.myseed.maturation) + var/t_growthstate = ((src.age / src.myseed.maturation) * src.myseed.growthstages ) + overlays += image('hydroponics.dmi', icon_state="[src.myseed.species]-grow[round(t_growthstate)]") + src.lastproduce = src.age + else + overlays += image('hydroponics.dmi', icon_state="[src.myseed.species]-grow[src.myseed.growthstages]") + + if(myseed) + if(luminosity && !istype(myseed,/obj/item/seeds/glowshroom)) + sd_SetLuminosity(0) + else if(!luminosity && istype(myseed,/obj/item/seeds/glowshroom)) + sd_SetLuminosity(myseed.potency/10) + else + if(luminosity) + sd_SetLuminosity(0) + return \ No newline at end of file diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index dd9176d0476..cc9f98ef659 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -615,11 +615,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r if( istype(I, /obj/item/device/pda) ) var/obj/item/device/pda/P = I if(P.id) - src.scanned_user = "[P.id.registered] ([P.id.assignment])" + src.scanned_user = "[P.id.registered_name] ([P.id.assignment])" src.screen=2 else var/obj/item/weapon/card/id/T = I - src.scanned_user = text("[T.registered] ([T.assignment])") + src.scanned_user = text("[T.registered_name] ([T.assignment])") src.screen=2*/ //Obsolete after autorecognition if (src.isbroken) diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index 175bbc62aa0..8d59a0f3d0e 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -45,7 +45,7 @@ datum/controller/game_controller if(!tension_master) tension_master = new /datum/tension() - world.tick_lag = 0.9 + world.tick_lag = config.Ticklag setup_objects() diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm index 901fbecbcf5..104274ab246 100755 --- a/code/game/objects/devices/PDA/PDA.dm +++ b/code/game/objects/devices/PDA/PDA.dm @@ -125,6 +125,16 @@ icon_state = "pda-lawyer" ttone = "objection" +/obj/item/device/pda/botanist + //default_cartridge = /obj/item/weapon/cartridge/botanist + icon_state = "pda-hydro" + +/obj/item/device/pda/librarian + icon_state = "pda-libb" + desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a WGW-11 series e-reader." + note = "Congratulations, your station has chosen the Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant!" + silent = 1 //Quiet in the library! + /* * The Actual PDA */ diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm index 401b5ad03e8..1cbde9ffcef 100644 --- a/code/game/objects/devices/PDA/cart.dm +++ b/code/game/objects/devices/PDA/cart.dm @@ -13,6 +13,7 @@ var/access_clown = 0 var/access_mime = 0 var/access_janitor = 0 +// var/access_flora = 0 var/access_reagent_scanner = 0 var/access_remote_door = 0 //Control some blast doors remotely!! var/remote_door_id = "" @@ -73,6 +74,12 @@ icon_state = "cart-mi" access_mime = 1 var/mime_charges = 5 +/* + botanist + name = "Green Thumb v4.20" + icon_state = "cart-b" + access_flora = 1 +*/ signal name = "generic signaler cartridge" diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index c9b74bd6d40..a9e65abf4e6 100755 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -297,39 +297,46 @@ mob/proc/flash_weak_pain() Metroid.SStun = 0 spawn(0) - Metroid.canmove = 0 - step_away(Metroid, user) - if(prob(25 + power*2)) - sleep(2) + if(Metroid) + Metroid.canmove = 0 step_away(Metroid, user) - Metroid.canmove = 1 + if(prob(25 + power)) + sleep(2) + if(Metroid && user) + step_away(Metroid, user) + Metroid.canmove = 1 else if(prob(10 + power*2)) + if(Metroid) + if(Metroid.Victim) + if(prob(80) && !Metroid.client) + Metroid.Discipline++ - if(Metroid.Victim) - if(prob(80) && !Metroid.client) - Metroid.Discipline++ + if(Metroid.Discipline == 1) + Metroid.attacked = 0 - if(Metroid.Discipline == 1) - Metroid.attacked = 0 + spawn() + if(Metroid) + Metroid.SStun = 1 + sleep(rand(5,20)) + if(Metroid) + Metroid.SStun = 0 - spawn() - Metroid.SStun = 1 - sleep(rand(5,20)) - Metroid.SStun = 0 - - Metroid.Victim = null - Metroid.anchored = 0 + Metroid.Victim = null + Metroid.anchored = 0 spawn(0) - step_away(Metroid, user) - Metroid.canmove = 0 - if(prob(25 + power*4)) - sleep(2) + if(Metroid && user) step_away(Metroid, user) - Metroid.canmove = 1 + Metroid.canmove = 0 + if(prob(25 + power*4)) + sleep(2) + if(Metroid && user) + step_away(Metroid, user) + Metroid.canmove = 1 + var/showname = "." if(user) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index b233fc7f6c1..527b13f4caf 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -1548,6 +1548,10 @@ CIRCULAR SAW return if(3.0) + if(M.changeling && M.changeling.changeling_fakedeath) + user << "\red The neural tissue regrows before your eyes as you cut it." + return + if(M != user) for(var/mob/O in (viewers(M) - user - M)) O.show_message("\red [M] has \his spine's connection to the brain severed with [src] by [user].", 1) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 997ca128d7f..ba6fd257718 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -13,7 +13,7 @@ WELDINGTOOOL desc = "A wrench with common uses. Can be found in your hand." icon = 'items.dmi' icon_state = "wrench" - flags = FPRINT | TABLEPASS| CONDUCT + flags = FPRINT | TABLEPASS| CONDUCT | ONBELT force = 5.0 throwforce = 7.0 w_class = 2.0 @@ -44,7 +44,7 @@ WELDINGTOOOL name = "Welding Tool" icon = 'items.dmi' icon_state = "welder" - flags = FPRINT | TABLEPASS| CONDUCT + flags = FPRINT | TABLEPASS| CONDUCT | ONBELT force = 3.0 throwforce = 5.0 throw_speed = 1 @@ -310,7 +310,7 @@ WELDINGTOOOL desc = "This cuts wires." icon = 'items.dmi' icon_state = "cutters" - flags = FPRINT | TABLEPASS| CONDUCT + flags = FPRINT | TABLEPASS| CONDUCT | ONBELT force = 6.0 throw_speed = 2 throw_range = 9 diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm index 0498b7aafee..e68dc18c11a 100644 --- a/code/game/objects/radio/radio.dm +++ b/code/game/objects/radio/radio.dm @@ -441,6 +441,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet. // Send a mundane broadcast with limited targets: + //THIS IS TEMPORARY. + if(!connection) return //~Carn + Broadcast_Message(connection, M, voicemask, M.voice_message, src, message, displayname, jobname, real_name, M.voice_name, filter_type, signal.data["compression"]) diff --git a/code/game/objects/stacks/minerals.dm b/code/game/objects/stacks/minerals.dm index 5993bfc8d9a..cbd0d465a6d 100644 --- a/code/game/objects/stacks/minerals.dm +++ b/code/game/objects/stacks/minerals.dm @@ -10,6 +10,7 @@ SILVER //Sandstone var/global/list/datum/stack_recipe/sandstone_recipes = list ( \ + new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \ /* new/datum/stack_recipe("sandstone wall", ???), \ new/datum/stack_recipe("sandstone floor", ???),\*/ diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 10f84c2b0b5..6edbbf80491 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -160,6 +160,58 @@ obj/structure /obj/structure/girder/reinforced icon_state = "reinforced" state = 2 + +/obj/structure/cultgirder + icon= 'cult.dmi' + icon_state= "cultgirder" + anchored = 1 + density = 1 + layer = 2 + + attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/wrench)) + playsound(src.loc, 'Ratchet.ogg', 100, 1) + user << "\blue Now disassembling the girder" + if(do_after(user,40)) + user << "\blue You dissasembled the girder!" + new /obj/effect/decal/remains/human(get_turf(src)) + del(src) + + else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) + user << "\blue Now slicing apart the girder" + if(do_after(user,30)) + user << "\blue You slice apart the girder!" + new /obj/effect/decal/remains/human(get_turf(src)) + del(src) + + else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) + user << "\blue You drill through the girder!" + new /obj/effect/decal/remains/human(get_turf(src)) + del(src) + + blob_act() + if(prob(40)) + del(src) + + + ex_act(severity) + switch(severity) + if(1.0) + del(src) + return + if(2.0) + if (prob(30)) + new /obj/effect/decal/remains/human(loc) + del(src) + return + if(3.0) + if (prob(5)) + new /obj/effect/decal/remains/human(loc) + del(src) + return + else + return + // LATTICE diff --git a/code/game/objects/transfer_valve.dm b/code/game/objects/transfer_valve.dm index 39660bbbe6f..395e7cd4ecf 100644 --- a/code/game/objects/transfer_valve.dm +++ b/code/game/objects/transfer_valve.dm @@ -75,7 +75,6 @@ onclose(user, "trans_valve") return - //CARN: MARKER Topic(href, href_list) ..() if ( usr.stat || usr.restrained() ) diff --git a/code/game/throwing.dm b/code/game/throwing.dm index a4bd5323e4f..197548d64d3 100644 --- a/code/game/throwing.dm +++ b/code/game/throwing.dm @@ -128,7 +128,7 @@ ..() /atom/movable/proc/throw_at(atom/target, range, speed) - if(!target) return 0 + if(!target || !src) return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target src.throwing = 1 @@ -155,7 +155,7 @@ - while(((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf)) + while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf)) // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up if(error < 0) var/atom/step = get_step(src, dy) @@ -181,7 +181,6 @@ if(dist_since_sleep >= speed) dist_since_sleep = 0 sleep(1) - a = get_area(src.loc) else var/error = dist_y/2 - dist_x diff --git a/code/game/turf.dm b/code/game/turf.dm index 564f174fd22..7932512bdab 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -308,6 +308,7 @@ if(!devastated) playsound(src.loc, 'Welder.ogg', 100, 1) new /obj/effect/decal/cleanable/blood(src) + new /obj/structure/cultgirder(src) else new /obj/effect/decal/cleanable/blood(src) new /obj/effect/decal/remains/human(src) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index b231dc08c1e..baf82a53d4c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -522,8 +522,8 @@ var/global/BSACooldown = 0 for(var/job in notbannedlist) ban_unban_log_save("[key_name(usr)] jobbanned [key_name(M)] from [job]. reason: [reason]") log_admin("[key_name(usr)] banned [key_name(M)] from [job]") - feedback_inc("ban_job",1) - feedback_add_details("ban_job","- [job]") + //feedback_inc("ban_job",1) + //feedback_add_details("ban_job","- [job]") jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") if(!msg) msg = job else msg += ", [job]" @@ -547,8 +547,8 @@ var/global/BSACooldown = 0 if("Yes") ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]") log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]") - feedback_inc("ban_job_unban",1) - feedback_add_details("ban_job_unban","- [job]") + //feedback_inc("ban_job_unban",1) + //feedback_add_details("ban_job_unban","- [job]") jobban_unban(M, job) if(!msg) msg = job else msg += ", [job]" @@ -1615,8 +1615,8 @@ var/global/BSACooldown = 0 ok = 1*/ if("toxic") /* - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","T") + //feedback_inc("admin_secrets_fun_used",1) + //feedback_add_details("admin_secrets_fun_used","T") for(var/obj/machinery/atmoalter/siphs/fullairsiphon/O in world) O.t_status = 3 for(var/obj/machinery/atmoalter/siphs/scrubbers/O in world) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 38e63dea1b0..17ea9b05167 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -285,11 +285,13 @@ verbs += /client/proc/get_admin_state verbs += /client/proc/reload_admins verbs += /client/proc/cmd_debug_make_powernets + verbs += /client/proc/enable_debug_verbs verbs += /client/proc/everyone_random verbs += /client/proc/only_one verbs += /client/proc/deadmin_self - verbs += /client/proc/getruntimelog //used by coders to retrieve runtime logs - verbs += /client/proc/enable_mapping_debug +// verbs += /client/proc/giveruntimelog //used by coders to retrieve runtime logs + verbs += /client/proc/cinematic //used by coders to retrieve runtime logs + verbs += /client/proc/enable_debug_verbs verbs += /client/proc/kill_air verbs += /client/proc/callprocgen verbs += /client/proc/callprocobj @@ -403,6 +405,7 @@ verbs -= /client/proc/cmd_admin_gib_self verbs -= /client/proc/restartcontroller verbs -= /client/proc/play_local_sound + verbs -= /client/proc/enable_debug_verbs verbs -= /client/proc/toggleprayers verbs -= /client/proc/Blobize verbs -= /client/proc/toggle_clickproc //TODO ERRORAGE (Temporary proc while the enw clickproc is being tested) @@ -416,6 +419,9 @@ verbs -= /client/proc/deadmin_self verbs -= /client/proc/jumptocoord verbs -= /client/proc/everyone_random +// verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs +// verbs -= /client/proc/getserverlog + verbs -= /client/proc/cinematic verbs -= /client/proc/cmd_admin_change_custom_event verbs -= /client/proc/admin_invis verbs -= /client/proc/callprocgen @@ -452,7 +458,7 @@ verbs -= /client/proc/jump_to_dead_group verbs -= /client/proc/playernotes verbs -= /obj/admins/proc/show_skills - verbs -= /client/proc/enable_mapping_debug + verbs -= /client/proc/enable_debug_verbs return @@ -623,7 +629,7 @@ log_admin("[ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.") ban_unban_log_save("[ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.") message_admins("\blue [ckey] warned [M.ckey], resulting in a [AUTOBANTIME] minute autoban.") - feedback_inc("ban_warn",1) + //feedback_inc("ban_warn",1) del(M.client) // feedback_add_details("admin_verb","WARN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm new file mode 100644 index 00000000000..d7b572e2849 --- /dev/null +++ b/code/modules/admin/verbs/cinematic.dm @@ -0,0 +1,17 @@ +/client/proc/cinematic(var/cinematic as anything in list("explosion",null)) + set name = "cinematic" + set category = "Fun" + set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. + set hidden = 1 + if(!ticker) return + switch(cinematic) + if("explosion") + var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num + var/override + switch(parameter) + if(1) + override = input(src,"mode = ?","Enter Parameter",null) as anything in list("nuclear emergency","no override") + if(0) + override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","nuclear emergency","AI malfunction","no override") + ticker.station_explosion_cinematic(parameter,override) + return \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 05a6c03c3f3..2350b07f84d 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -506,6 +506,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that else alert("Invalid mob") //feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(src)] has granted [M.key] full access.") + message_admins("\blue [key_name_admin(usr)] has granted [M.key] full access.", 1) /client/proc/cmd_assume_direct_control(var/mob/M in world) set category = "Admin" @@ -523,6 +525,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if( isobserver(adminmob) ) del(adminmob) //feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] assumed direct control of [M].") + message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1) + /client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in world) @@ -559,6 +564,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks if (isnull(dresscode)) return + //feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! for (var/obj/item/I in M) if (istype(I, /obj/item/weapon/implant)) continue @@ -879,4 +885,54 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_if_possible(W, M.slot_wear_id) M.update_clothing() - return \ No newline at end of file + + log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") + message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1) + return + +/client/proc/startSinglo() + + if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes") + return + + for(var/obj/machinery/emitter/E in world) + if(E.anchored) + E.active = 1 + + for(var/obj/machinery/field_generator/F in world) + if(F.anchored) + F.Varedit_start = 1 + spawn(30) + for(var/obj/machinery/the_singularitygen/G in world) + if(G.anchored) + var/obj/machinery/singularity/S = new /obj/machinery/singularity(get_turf(G), 50) + spawn(0) + del(G) + S.energy = 1750 + S.current_size = 7 + S.icon = '224x224.dmi' + S.icon_state = "singularity_s7" + S.pixel_x = -96 + S.pixel_y = -96 + S.grav_pull = 0 + //S.consume_range = 3 + S.dissipate = 0 + //S.dissipate_delay = 10 + //S.dissipate_track = 0 + //S.dissipate_strength = 10 + + for(var/obj/machinery/power/rad_collector/Rad in world) + if(Rad.anchored) + if(!Rad.P) + var/obj/item/weapon/tank/plasma/Plasma = new/obj/item/weapon/tank/plasma(Rad) + Plasma.air_contents.toxins = 70 + Rad.drainratio = 0 + Rad.P = Plasma + Plasma.loc = Rad + + if(!Rad.active) + Rad.toggle_power() + + for(var/obj/machinery/power/smes/SMES in world) + if(SMES.anchored) + SMES.chargemode = 1 \ No newline at end of file diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 5f4fbdac351..2c85cc34a5f 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -59,6 +59,7 @@ var/intercom_range_display_status = 0 if(camera_range_display_status) for(var/obj/machinery/camera/C in world) new/obj/effect/debugging/camera_range(C.loc) + //feedback_add_details("admin_verb","mCRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -100,6 +101,7 @@ var/intercom_range_display_status = 0 output += "" usr << browse(output,"window=airreport;size=1000x500") + //feedback_add_details("admin_verb","mCRP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! intercom_view() set category = "Mapping" @@ -119,10 +121,11 @@ var/intercom_range_display_status = 0 var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) if (!(F in view(7,I.loc))) del(F) + //feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - enable_mapping_debug() + enable_debug_verbs() set category = "Debug" - set name = "Mapping debug" + set name = "Debug verbs" src.verbs += /client/proc/do_not_use_these //-errorage src.verbs += /client/proc/camera_view //-errorage src.verbs += /client/proc/sec_camera_report //-errorage @@ -132,6 +135,10 @@ var/intercom_range_display_status = 0 src.verbs += /client/proc/atmosscan //check plumbing src.verbs += /client/proc/count_objects_on_z_level src.verbs += /client/proc/count_objects_all + src.verbs += /client/proc/cmd_assume_direct_control //-errorage + src.verbs += /client/proc/jump_to_dead_group + src.verbs += /client/proc/startSinglo + //feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! count_objects_on_z_level() set category = "Mapping" @@ -174,6 +181,7 @@ var/intercom_range_display_status = 0 world << line*/ world << "There are [count] objects of type [type_path] on z-level [num_level]" + //feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! count_objects_all() set category = "Mapping" @@ -199,4 +207,5 @@ var/intercom_range_display_status = 0 line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; " world << line*/ - world << "There are [count] objects of type [type_path] in the game world" \ No newline at end of file + world << "There are [count] objects of type [type_path] in the game world" + //feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index 9f6fddd8328..8e370606110 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -17,6 +17,8 @@ world.tick_lag = newtick //feedback_add_details("admin_verb","TICKLAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return + + src << "\red Error: ticklag(): Invalid world.ticklag value. No changes made." return diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 3562372a94a..75aa27e081d 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -2288,6 +2288,25 @@ var/list/data = list("viruses"= list(F)) reagents.add_reagent("blood", 20, data) +/obj/item/weapon/reagent_containers/glass/bottle/pacid + name = "Polytrinic Acid Bottle" + desc = "A small bottle. Contains a small amount of Polytronic Acid" + icon = 'chemical.dmi' + icon_state = "bottle17" + New() + ..() + reagents.add_reagent("pacid", 30) + +/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine + name = "Adminordrazine Bottle" + desc = "A small bottle. Contains the liquid essence of the gods." + icon = 'drinks.dmi' + icon_state = "holyflask" + New() + ..() + reagents.add_reagent("adminordrazine", 30) + + /obj/item/weapon/reagent_containers/glass/bottle/ert name = "emergency medicine bottle" desc = "A large bottle." diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm index b295e72b435..3407f714bb5 100644 --- a/code/modules/food/food.dm +++ b/code/modules/food/food.dm @@ -1393,6 +1393,7 @@ name = "Metroid Sandwich" desc = "A sandwich is green stuff." icon_state = "metroidsandwich" + trash = "plate" New() ..() reagents.add_reagent("nutriment", 2) @@ -1441,6 +1442,40 @@ else reagents.add_reagent("nutriment", 5) bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chawanmushi + name = "chawanmushi" + desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." + icon_state = "chawanmushi" + trash = "snack_bowl" + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/beetsoup + name = "beet soup" + desc = "Wait, how do you spell it, again..?" + icon_state = "beetsoup" + trash = "snack_bowl" + New() + ..() + switch(rand(1,6)) + if(1) + name = "borsch" + if(2) + name = "bortsch" + if(3) + name = "borstch" + if(4) + name = "borsh" + if(5) + name = "borshch" + if(6) + name = "borscht" + reagents.add_reagent("nutriment", 8) + bitesize = 2 + /////////////////////////////////////////////////Sliceable//////////////////////////////////////// // All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index e97a5720a93..f89c92f4f2b 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -1019,6 +1019,23 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup +/datum/recipe/chawanmushi + reagents = list("water" = 5, "soysauce" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi + +/datum/recipe/beetsoup + reagents = list("water" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/beetsoup + ////////////////////////////////////////// // bs12 food port stuff ////////////////////////////////////////// diff --git a/code/modules/mob/dead/observer/hud.dm b/code/modules/mob/dead/observer/hud.dm index 0a1ca725a36..3969992c4ed 100644 --- a/code/modules/mob/dead/observer/hud.dm +++ b/code/modules/mob/dead/observer/hud.dm @@ -1,8 +1,3 @@ + /obj/hud/proc/ghost_hud() - station_explosion = new h_type( src ) - station_explosion.icon = 'station_explosion.dmi' - station_explosion.icon_state = "start" - station_explosion.layer = 20 - station_explosion.mouse_opacity = 0 - station_explosion.screen_loc = "1,3" return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/hud.dm b/code/modules/mob/living/carbon/alien/humanoid/hud.dm index cbcb149464e..37ec382bc7e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/hud.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/hud.dm @@ -37,14 +37,6 @@ src.druggy.layer = 17 src.druggy.mouse_opacity = 0 - // station explosion cinematic - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - var/obj/screen/using using = new src.h_type( src ) diff --git a/code/modules/mob/living/carbon/alien/larva/hud.dm b/code/modules/mob/living/carbon/alien/larva/hud.dm index cfe29e2b5e7..e51b8b48de5 100644 --- a/code/modules/mob/living/carbon/alien/larva/hud.dm +++ b/code/modules/mob/living/carbon/alien/larva/hud.dm @@ -39,14 +39,6 @@ src.druggy.layer = 17 src.druggy.mouse_opacity = 0 - // station explosion cinematic - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - var/obj/screen/using using = new src.h_type( src ) diff --git a/code/modules/mob/living/carbon/brain/hud.dm b/code/modules/mob/living/carbon/brain/hud.dm index 0a2a2f226fb..f575d5ffbb2 100644 --- a/code/modules/mob/living/carbon/brain/hud.dm +++ b/code/modules/mob/living/carbon/brain/hud.dm @@ -1,10 +1,4 @@ /obj/hud/proc/brain_hud(var/ui_style='screen1_old.dmi') - station_explosion = new h_type( src ) - station_explosion.icon = 'station_explosion.dmi' - station_explosion.icon_state = "start" - station_explosion.layer = 20 - station_explosion.mouse_opacity = 0 - station_explosion.screen_loc = "1,3" blurry = new h_type( src ) blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm index aa8b28715bb..281e451624f 100644 --- a/code/modules/mob/living/carbon/human/hud.dm +++ b/code/modules/mob/living/carbon/human/hud.dm @@ -41,14 +41,6 @@ src.druggy.layer = 17 src.druggy.mouse_opacity = 0 - // station explosion cinematic - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - var/obj/screen/using using = new src.h_type( src ) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4d4b9e923c0..236d21b6fcc 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1242,7 +1242,7 @@ if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]" - if(resting || lying || sleeping) rest.icon_state = "rest[(resting || lying || sleeping) ? 1 : 0]" + if(rest) rest.icon_state = "rest[(resting || lying || sleeping) ? 1 : 0]" if (toxin || hal_screwyhud == 4) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" @@ -1251,26 +1251,26 @@ //NOTE: the alerts dont reset when youre out of danger. dont blame me, //blame the person who coded them. Temporary fix added. - switch(bodytemperature) //310.055 optimal body temp - - if(370 to INFINITY) - bodytemp.icon_state = "temp4" - if(350 to 370) - bodytemp.icon_state = "temp3" - if(335 to 350) - bodytemp.icon_state = "temp2" - if(320 to 335) - bodytemp.icon_state = "temp1" - if(300 to 320) - bodytemp.icon_state = "temp0" - if(295 to 300) - bodytemp.icon_state = "temp-1" - if(280 to 295) - bodytemp.icon_state = "temp-2" - if(260 to 280) - bodytemp.icon_state = "temp-3" - else - bodytemp.icon_state = "temp-4" + if(bodytemp) + switch(bodytemperature) //310.055 optimal body temp + if(370 to INFINITY) + bodytemp.icon_state = "temp4" + if(350 to 370) + bodytemp.icon_state = "temp3" + if(335 to 350) + bodytemp.icon_state = "temp2" + if(320 to 335) + bodytemp.icon_state = "temp1" + if(300 to 320) + bodytemp.icon_state = "temp0" + if(295 to 300) + bodytemp.icon_state = "temp-1" + if(280 to 295) + bodytemp.icon_state = "temp-2" + if(260 to 280) + bodytemp.icon_state = "temp-3" + else + bodytemp.icon_state = "temp-4" if(!client) return 0 //Wish we did not need these client.screen -= hud_used.blurry diff --git a/code/modules/mob/living/carbon/metroid/hud.dm b/code/modules/mob/living/carbon/metroid/hud.dm index 40e4bf9f868..f1d73166958 100644 --- a/code/modules/mob/living/carbon/metroid/hud.dm +++ b/code/modules/mob/living/carbon/metroid/hud.dm @@ -44,12 +44,4 @@ src.druggy.layer = 17 src.druggy.mouse_opacity = 0 - // station explosion cinematic - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - */ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/hud.dm b/code/modules/mob/living/carbon/monkey/hud.dm index c3c692643e3..d0596badac5 100644 --- a/code/modules/mob/living/carbon/monkey/hud.dm +++ b/code/modules/mob/living/carbon/monkey/hud.dm @@ -43,14 +43,6 @@ src.druggy.layer = 17 src.druggy.mouse_opacity = 0 - // station explosion cinematic - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - var/obj/screen/using using = new src.h_type( src ) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 64bad12d893..266bd3fc601 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -591,26 +591,26 @@ //NOTE: the alerts dont reset when youre out of danger. dont blame me, //blame the person who coded them. Temporary fix added. - switch(src.bodytemperature) //310.055 optimal body temp - - if(345 to INFINITY) - src.bodytemp.icon_state = "temp4" - if(335 to 345) - src.bodytemp.icon_state = "temp3" - if(327 to 335) - src.bodytemp.icon_state = "temp2" - if(316 to 327) - src.bodytemp.icon_state = "temp1" - if(300 to 316) - src.bodytemp.icon_state = "temp0" - if(295 to 300) - src.bodytemp.icon_state = "temp-1" - if(280 to 295) - src.bodytemp.icon_state = "temp-2" - if(260 to 280) - src.bodytemp.icon_state = "temp-3" - else - src.bodytemp.icon_state = "temp-4" + if(bodytemp) + switch(src.bodytemperature) //310.055 optimal body temp + if(345 to INFINITY) + src.bodytemp.icon_state = "temp4" + if(335 to 345) + src.bodytemp.icon_state = "temp3" + if(327 to 335) + src.bodytemp.icon_state = "temp2" + if(316 to 327) + src.bodytemp.icon_state = "temp1" + if(300 to 316) + src.bodytemp.icon_state = "temp0" + if(295 to 300) + src.bodytemp.icon_state = "temp-1" + if(280 to 295) + src.bodytemp.icon_state = "temp-2" + if(260 to 280) + src.bodytemp.icon_state = "temp-3" + else + src.bodytemp.icon_state = "temp-4" src.client.screen -= src.hud_used.blurry src.client.screen -= src.hud_used.druggy diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3ab582828e1..b1260a98b7e 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -565,7 +565,7 @@ malf_picker.use(src) -//I am the icon meister. Bow fefore me. +//I am the icon meister. Bow fefore me. //>fefore /mob/living/silicon/ai/proc/ai_hologram_change() set name = "Change Hologram" set desc = "Change the default hologram available to AI to something else." diff --git a/code/modules/mob/living/silicon/ai/hud.dm b/code/modules/mob/living/silicon/ai/hud.dm index 0e563e2cf44..2db6674a9a3 100644 --- a/code/modules/mob/living/silicon/ai/hud.dm +++ b/code/modules/mob/living/silicon/ai/hud.dm @@ -1,10 +1,2 @@ /obj/hud/proc/ai_hud() - - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/hud.dm b/code/modules/mob/living/silicon/robot/hud.dm index 691b0a98065..8c1f6a5f3dc 100644 --- a/code/modules/mob/living/silicon/robot/hud.dm +++ b/code/modules/mob/living/silicon/robot/hud.dm @@ -38,14 +38,6 @@ src.druggy.layer = 17 src.druggy.mouse_opacity = 0 - // station explosion cinematic - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" - var/obj/screen/using diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index d07b212196f..36f7acde4cd 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -242,18 +242,18 @@ else src.cells.icon_state = "charge-empty" - switch(src.bodytemperature) //310.055 optimal body temp - - if(335 to INFINITY) - src.bodytemp.icon_state = "temp2" - if(320 to 335) - src.bodytemp.icon_state = "temp1" - if(300 to 320) - src.bodytemp.icon_state = "temp0" - if(260 to 300) - src.bodytemp.icon_state = "temp-1" - else - src.bodytemp.icon_state = "temp-2" + if(bodytemp) + switch(src.bodytemperature) //310.055 optimal body temp + if(335 to INFINITY) + src.bodytemp.icon_state = "temp2" + if(320 to 335) + src.bodytemp.icon_state = "temp1" + if(300 to 320) + src.bodytemp.icon_state = "temp0" + if(260 to 300) + src.bodytemp.icon_state = "temp-1" + else + src.bodytemp.icon_state = "temp-2" if(src.pullin) src.pullin.icon_state = "pull[src.pulling ? 1 : 0]" diff --git a/code/modules/mob/living/silicon/robot/robot_upgrades.dm b/code/modules/mob/living/silicon/robot/robot_upgrades.dm index fe8d77dd7c8..60ffc30f5a4 100644 --- a/code/modules/mob/living/silicon/robot/robot_upgrades.dm +++ b/code/modules/mob/living/silicon/robot/robot_upgrades.dm @@ -95,19 +95,26 @@ /obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R) - if(R.module != /obj/item/weapon/robot_module/security) + if(!istype(R.module, /obj/item/weapon/robot_module/security)) R << "Upgrade mounting error! No suitable hardpoint detected!" + usr << "There's no mounting point for the module!" return 0 - var/obj/item/weapon/gun/energy/taser/cyborg/T = locate() in R + var/obj/item/weapon/gun/energy/taser/cyborg/T = locate() in R.module if(!T) + T = locate() in R.module.contents + if(!T) + T = locate() in R.module.modules + if(!T) + usr << "This cyborg has had its taser removed!" return 0 if(T.recharge_time <= 2) R << "Maximum cooling achieved for this hardpoint!" + usr << "There's no room for another cooling unit!" return 0 else - T.recharge_time = min(2 , T.recharge_time - 4) + T.recharge_time = max(2 , T.recharge_time - 4) return 1 \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 346a318d3e2..90f333f4bf3 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -638,10 +638,11 @@ for (var/mob/living/silicon/decoy/D in world) if (eye) eye = D - if (eye) - client.eye = eye - else - client.eye = client.mob + if (client) + if (eye) + client.eye = eye + else + client.eye = client.mob /mob/verb/cancel_camera() set name = "Cancel Camera View" @@ -1037,42 +1038,6 @@ note dizziness decrements automatically in the mob's Life() proc. statpanel("Spells","[S.holder_var_type] [S.holder_var_amount]",S) -/client/proc/station_explosion_cinematic(var/station_missed) - if(!mob || !ticker) return - if(!mob.client || !mob.hud_used || !ticker.mode) return -// M.loc = null this might make it act weird but fuck putting them in nullspace, it causes issues. - var/obj/screen/boom = mob.hud_used.station_explosion - if(!istype(boom)) return - - mob.client.screen += boom - - switch(ticker.mode.name) - if("nuclear emergency") - flick("start_nuke", boom) - if("AI malfunction") - flick("start_malf", boom) - else - boom.icon_state = "start" - - sleep(40) - mob << sound('explosionfar.ogg') - boom.icon_state = "end" - if(!station_missed) flick("explode", boom) - else flick("explode2", boom) - sleep(40) - - switch(ticker.mode.name) - if("nuclear emergency") - if(!station_missed) boom.icon_state = "loss_nuke" - else boom.icon_state = "loss_nuke2" - if("malfunction") - boom.icon_state = "loss_malf" - if("blob") - return//Nothin here yet and the general one does not fit. - else - boom.icon_state = "loss_general" - return - // facing verbs /mob/proc/canface() diff --git a/code/modules/mob/new_player/hud.dm b/code/modules/mob/new_player/hud.dm index 6df982d16dd..3f2d074e31a 100644 --- a/code/modules/mob/new_player/hud.dm +++ b/code/modules/mob/new_player/hud.dm @@ -1,8 +1,3 @@ + /obj/hud/proc/unplayer_hud() - src.station_explosion = new src.h_type( src ) - src.station_explosion.icon = 'station_explosion.dmi' - src.station_explosion.icon_state = "start" - src.station_explosion.layer = 20 - src.station_explosion.mouse_opacity = 0 - src.station_explosion.screen_loc = "1,3" return \ No newline at end of file diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 00b4c61cbf4..9ad6a241b26 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -1,10 +1,10 @@ -//THIS IS OBVIOUSLY WIP, SORRY -PETE /obj/item/weapon/folder name = "folder" desc = "A folder." icon = 'bureaucracy.dmi' icon_state = "folder" w_class = 2 + pressure_resistance = 2 /obj/item/weapon/folder/blue desc = "A blue folder." diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index bf621d52ca0..a8802a7f1a3 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -50,5 +50,5 @@ update_icon() if(multiple_sprites) - icon_state = text("[initial(icon_state)]-[]", stored_ammo.len) - desc = text("There are [] shell\s left!", stored_ammo.len) + icon_state = "[initial(icon_state)]-[stored_ammo.len]" + desc = "There are [stored_ammo.len] shell\s left!" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index d01356ccf7e..a7dccbcf285 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -19,6 +19,7 @@ caliber = "" silenced = 0 recoil = 0 + ejectshell = 1 tmp/list/mob/living/target //List of who yer targeting. tmp/lock_time = -100 tmp/mouthshoot = 0 ///To stop people from suiciding twice... >.> diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 817d23d96ab..9fc41c86cee 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -1,5 +1,5 @@ /obj/item/weapon/gun/energy/ionrifle - name = "\improper Ion Rifle" + name = "ion rifle" desc = "A man portable anti-armor weapon designed to disable mechanical threats" icon_state = "ionrifle" fire_sound = 'Laser.ogg' @@ -12,7 +12,7 @@ /obj/item/weapon/gun/energy/decloner - name = "\improper Biological Demolecularisor" + name = "biological demolecularisor" desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." icon_state = "decloner" fire_sound = 'pulse3.ogg' @@ -21,7 +21,7 @@ projectile_type = "/obj/item/projectile/energy/declone" obj/item/weapon/gun/energy/staff - name = "\improper Staff of Change" + name = "staff of change" desc = "an artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself" icon = 'gun.dmi' icon_state = "staffofchange" @@ -52,4 +52,53 @@ obj/item/weapon/gun/energy/staff if(!power_supply) return 0 power_supply.give(200) update_icon() - return 1 \ No newline at end of file + return 1 + +/obj/item/weapon/gun/energy/floragun + name = "floral somatoray" + desc = "A tool that discharges controlled radiation which induces mutation in plant cells." + icon_state = "floramut100" + item_state = "gun" + fire_sound = 'stealthoff.ogg' + charge_cost = 100 + projectile_type = "/obj/item/projectile/energy/floramut" + origin_tech = "materials=2;biotech=3;powerstorage=3" + modifystate = "floramut" + var/charge_tick = 0 + var/mode = 0 //0 = mutate, 1 = yield boost + + New() + ..() + processing_objects.Add(src) + + + Del() + processing_objects.Remove(src) + ..() + + + process() + charge_tick++ + if(charge_tick < 4) return 0 + charge_tick = 0 + if(!power_supply) return 0 + power_supply.give(100) + update_icon() + return 1 + + attack_self(mob/living/user as mob) + switch(mode) + if(0) + mode = 1 + charge_cost = 100 + user << "\red The [src.name] is now set to increase yield." + projectile_type = "/obj/item/projectile/energy/florayield" + modifystate = "florayield" + if(1) + mode = 0 + charge_cost = 100 + user << "\red The [src.name] is now set to induce mutations." + projectile_type = "/obj/item/projectile/energy/floramut" + modifystate = "floramut" + update_icon() + return \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 9f09417a9cb..21f8eeefff7 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -25,12 +25,16 @@ load_into_chamber() - if(in_chamber) return 1 - if(!loaded.len) return 0 + if(in_chamber) + return 1 + + if(!loaded.len) + return 0 var/obj/item/ammo_casing/AC = loaded[1] //load next casing. loaded -= AC //Remove casing from loaded list. AC.loc = get_turf(src) //Eject casing onto ground. + AC.desc += " This one is spent." //descriptions are magic if(AC.BB) in_chamber = AC.BB //Load projectile into chamber. @@ -40,6 +44,7 @@ attackby(var/obj/item/A as obj, mob/user as mob) + var/num_loaded = 0 if(istype(A, /obj/item/ammo_magazine)) if((load_method == 2) && loaded.len) return @@ -64,13 +69,18 @@ loaded += AC num_loaded++ if(num_loaded) - user << text("\blue You load [] shell\s into the gun!", num_loaded) + user << "\blue You load [num_loaded] shell\s into the gun!" A.update_icon() update_icon() return - update_icon() - desc = initial(desc) + text(" Has [] rounds remaining.", loaded.len) + examine() + ..() + usr << "Has [loaded.len] round\s remaining." + if(in_chamber && !loaded.len) + usr << "However, it has a chambered round." + if(in_chamber && loaded.len) + usr << "It also has a chambered round." return diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index eb6746cbc29..7b5b9056a26 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -1,13 +1,14 @@ -/obj/item/weapon/gun/projectile/shotgun - name = "\improper Shotgun" +/obj/item/weapon/gun/projectile/shotgun/pump + name = "shotgun" desc = "Useful for sweeping alleys." icon_state = "shotgun" - max_shells = 2 + item_state = "shotgun" + max_shells = 4 w_class = 4.0 force = 10 flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK caliber = "shotgun" - origin_tech = "combat=3;materials=1" + origin_tech = "combat=4;materials=2" ammo_type = "/obj/item/ammo_casing/shotgun/beanbag" var recentpump = 0 // to prevent spammage @@ -16,7 +17,8 @@ load_into_chamber() - if(in_chamber) return 1 + if(in_chamber) + return 1 return 0 @@ -30,7 +32,7 @@ return - proc/pump(mob/M) + proc/pump(mob/M as mob) playsound(M, 'shotgunpump.ogg', 60, 1) pumped = 0 if(current_shell)//We have a shell in the chamber @@ -44,20 +46,82 @@ current_shell = AC if(AC.BB) in_chamber = AC.BB //Load projectile into chamber. + update_icon() //I.E. fix the desc return 1 - - -/obj/item/weapon/gun/projectile/shotgun/combat - name = "\improper Combat Shotgun" +/obj/item/weapon/gun/projectile/shotgun/pump/combat + name = "combat shotgun" icon_state = "cshotgun" max_shells = 8 + origin_tech = "combat=5;materials=2" ammo_type = "/obj/item/ammo_casing/shotgun" +//this is largely hacky and bad :( -Pete +/obj/item/weapon/gun/projectile/shotgun/doublebarrel + name = "double-barreled shotgun" + desc = "A true classic." + icon_state = "dshotgun" + item_state = "shotgun" + max_shells = 2 + w_class = 4.0 + force = 10 + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK + caliber = "shotgun" + origin_tech = "combat=3;materials=1" + ammo_type = "/obj/item/ammo_casing/shotgun/beanbag" + load_into_chamber() + if(in_chamber) + return 1 + if(!loaded.len) + return 0 -/obj/item/weapon/gun/projectile/shotgun/combat2 - name = "\improper Security Combat Shotgun" - icon_state = "cshotgun" - max_shells = 4 + var/obj/item/ammo_casing/AC = loaded[1] //load next casing. + loaded -= AC //Remove casing from loaded list. + AC.desc += " This one is spent." + if(AC.BB) + in_chamber = AC.BB //Load projectile into chamber. + AC.BB.loc = src //Set projectile loc to gun. + return 1 + return 0 + + attack_self(mob/living/user as mob) + if(!(locate(/obj/item/ammo_casing/shotgun) in src) && !loaded.len) + user << "\The [src] is empty." + return + + for(var/obj/item/ammo_casing/shotgun/shell in src) //This feels like a hack. //don't code at 3:30am kids!! + if(shell in loaded) + loaded -= shell + shell.loc = get_turf(src.loc) + + user << "You break \the [src]." + update_icon() + + attackby(var/obj/item/A as obj, mob/user as mob) + if(istype(A, /obj/item/ammo_casing) && !load_method) + var/obj/item/ammo_casing/AC = A + if(AC.caliber == caliber && (loaded.len < max_shells) && (contents.len < max_shells)) //forgive me father, for i have sinned + user.drop_item() + AC.loc = src + loaded += AC + user << "You load a shell into \the [src]!" + A.update_icon() + update_icon() + if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter)) + user << "You begin to shorten the barrel of \the [src]." + if(loaded.len) + afterattack(user, user) //will this work? + playsound(user, fire_sound, 50, 1) + user.visible_message("The shotgun goes off!", "The shotgun goes off in your face!") + return + if(do_after(user, 30)) //SHIT IS STEALTHY EYYYYY + icon_state = "sawnshotgun" + w_class = 3.0 + item_state = "gun" + flags &= ~ONBACK //you can't sling it on your back + flags |= ONBELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) + name = "sawn-off shotgun" + desc = "Omar's coming!" + user << "You shorten the barrel of \the [src]!" \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ebfd27c4858..3738a409210 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -10,7 +10,7 @@ */ /obj/item/projectile - name = "\improper Projectile" + name = "projectile" icon = 'projectiles.dmi' icon_state = "bullet" density = 1 @@ -84,18 +84,18 @@ return // nope.avi if(!silenced) - visible_message("\red [A] is hit by the [src]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter + visible_message("\red [A.name] is hit by the [src.name] in the [def_zone]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter else - M << "\red You've been shot!" + M << "\red You've been shot in the [def_zone] by the [src.name]!" if(istype(firer, /mob)) - M.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src) - firer.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src) + M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" + firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" log_admin("ATTACK: [firer] ([firer.ckey]) shot [M] ([M.ckey]) with [src].") message_admins("ATTACK: [firer] ([firer.ckey]) shot [M] ([M.ckey]) with [src].") log_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") else - M.attack_log += text("\[[]\] UNKNOWN SUBJECT (No longer exists) shot []/[] with a []", time_stamp(), M, M.ckey, src) + M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]" log_admin("ATTACK: UNKNOWN (no longer exists) shot [M] ([M.ckey]) with [src].") message_admins("ATTACK: UNKNOWN (no longer exists) shot [M] ([M.ckey]) with [src].") log_attack("UNKNOWN shot [M] ([M.ckey]) with a [src]") diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 7821b66cd77..1b9a7cfa2fb 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -37,4 +37,59 @@ if(istype(target, /mob/living)) var/mob/M = target M.bodytemperature = temperature - return 1 \ No newline at end of file + return 1 + +/obj/item/projectile/energy/floramut + name = "alpha somatoray" + icon_state = "energy" + damage = 0 + damage_type = TOX + nodamage = 1 + flag = "energy" + + on_hit(var/atom/target, var/blocked = 0) + var/mob/M = target + if(istype(target, /mob/living/carbon/human) && M:mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays. + if(prob(15)) + M.radiation += rand(10,30) + M.Weaken(5) + for (var/mob/V in viewers(src)) + V.show_message("\red [M] writhes in pain as \his vacuoles boil.", 3, "\red You hear the crunching of leaves.", 2) + if(prob(35)) + // for (var/mob/V in viewers(src)) //Public messages commented out to prevent possible metaish genetics experimentation and stuff. - Cheridan + // V.show_message("\red [M] is mutated by the radiation beam.", 3, "\red You hear the snapping of twigs.", 2) + if(prob(80)) + randmutb(M) + domutcheck(M,null) + else + randmutg(M) + domutcheck(M,null) + else + M.adjustFireLoss(rand(5,15)) + M.show_message("\red The radiation beam singes you!") + // for (var/mob/V in viewers(src)) + // V.show_message("\red [M] is singed by the radiation beam.", 3, "\red You hear the crackle of burning leaves.", 2) + else if(istype(target, /mob/living/carbon/)) + // for (var/mob/V in viewers(src)) + // V.show_message("The radiation beam dissipates harmlessly through [M]", 3) + M.show_message("\blue The radiation beam dissipates harmlessly through your body.") + else + return 1 + +/obj/item/projectile/energy/florayield + name = "beta somatoray" + icon_state = "energy2" + damage = 0 + damage_type = TOX + nodamage = 1 + flag = "energy" + + on_hit(var/atom/target, var/blocked = 0) + var/mob/M = target + if(istype(target, /mob/living/carbon/human) && M:mutantrace == "plant") //These rays make plantmen fat. + if(M.nutrition < 500) //sanity check + M.nutrition += 30 + else if (istype(target, /mob/living/carbon/)) + M.show_message("\blue The radiation beam dissipates harmlessly through your body.") + else + return 1 \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 383a2806c23..e182d1f9a3c 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1354,6 +1354,15 @@ datum build_path = "/obj/item/weapon/gun/energy/temperature" locked = 1 + flora_gun + name = "Floral Somatoray" + desc = "A tool that discharges controlled radiation which induces mutation in plant cells. Harmless to other organic life." + id = "flora_gun" + req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 2000, "$glass" = 500, "$uranium" = 500) + build_path = "/obj/item/weapon/gun/energy/floragun" + large_grenade name = "Large Grenade" desc = "A grenade that affects a larger area and use larger containers." diff --git a/config/config.txt b/config/config.txt index c5c4c3fc147..0fc6f68b5e2 100644 --- a/config/config.txt +++ b/config/config.txt @@ -126,6 +126,12 @@ GUEST_JOBBAN 1 ## set a server location for world reboot. Don't include the byond://, just give the address and port. # SERVER ss13.example.com:2506 +## forum address +# FORUMURL http://baystation12.net/forums/ + +## Wiki address +# WIKIURL http://baystation12.net/wiki/index.php + ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. # BANAPPEALS http://justanotherday.example.com @@ -144,4 +150,6 @@ GUEST_JOBBAN 1 #POPUP_ADMIN_PM ##What address should banned people appeal ther ban at? Remember to escape the characters, if needed! -# APPEAL_ADDRESS -->APPEAL ADDRESS HERE<-- \ No newline at end of file +# APPEAL_ADDRESS -->APPEAL ADDRESS HERE<-- +##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. +TICKLAG 0.9 \ No newline at end of file diff --git a/config/motd-auth.txt b/config/motd-auth.txt deleted file mode 100644 index e5d6c79322e..00000000000 --- a/config/motd-auth.txt +++ /dev/null @@ -1 +0,0 @@ -Boom boom tap, a-Boom boomboom tap \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index df3646f6f31..e8b4007cb1c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -47,6 +47,28 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +
+

06 May 2012

+

TG updated:

+
    +
  • Artificers can now create cult floors.
  • +
  • Added soil to plant seeds in. Make it by crushing up sandstone. Soil does not have indicators like trays do! Watch your plants carefully!
  • +
  • Added money trees. When life gives you lemons, mutate them into cash.
  • +
  • RnD can create a new tool for botanists: The floral somatoray. Has two modes. Use it on your plants to induce mutations or boost yield.
  • +
  • Added chawanmushi recipe and beet soup recipes.
  • +
  • Added 1% chance for a species mutation whenever a plant's stats mutate.
  • +
  • New PDAs for the botanists and librarian. Sprites for cartridges for both too.
  • +
  • You can now only have ONE decal of blood per tile. This is to fix the millions of blood effect items that spawned to lag anyone who right clicked them. The most recently created blood item will be the one that remains. This does not effect gibs.
  • +
  • Hand tools now fit on your belt slot.
  • +
  • Changelings faking death can no longer have their brains cut out.
  • +
  • Updated the barman's shotgun, it acts like a double-barrel now, and he can saw it off.
  • +
  • New sprites for lots of medical computers!
  • +
  • New carrot in-tray sprites.
  • +
  • Soulstones can no longer capture the manifested ghosts. No more infinite constructs.
  • +
  • Changes rev objectives to use the proper objective so heads being off station actually works.
  • +
+
+

05 May 2012

Erthilo updated:

diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi index aca76b630a1..ab2916710ac 100644 Binary files a/icons/effects/genetics.dmi and b/icons/effects/genetics.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 7636523d57c..e4bd4cdfed3 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi index 017702505ce..a13fe588bdf 100644 Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index fc526d2ed4c..d07000d5f9f 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi index 6405a1e47dd..f85cf5cc396 100644 Binary files a/icons/obj/harvest.dmi and b/icons/obj/harvest.dmi differ diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi index 8eeca228a77..7d7134a0aa2 100644 Binary files a/icons/obj/hydroponics.dmi and b/icons/obj/hydroponics.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index ca977fddff0..27458a2ee8e 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi index e8d9ae4daf9..cd535fc282a 100644 Binary files a/icons/obj/seeds.dmi and b/icons/obj/seeds.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 8650435b56e..c80e7c981c5 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 7eae947005e..83f460caac1 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm new file mode 100644 index 00000000000..3cf23dfabeb --- /dev/null +++ b/interface/interface.dm @@ -0,0 +1,15 @@ +/client/verb/wiki() + set name = "wiki" + set desc = "Visit the wiki." + set hidden = 1 + if( config.wikiurl ) + src << link(config.wikiurl) + return + +/client/verb/forum() + set name = "forum" + set desc = "Visit the forum." + set hidden = 1 + if( config.forumurl ) + src << link(config.forumurl) + return \ No newline at end of file diff --git a/interface/skin.dmf b/interface/skin.dmf index 4cc3f89132e..1fc01b3ed12 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1340,10 +1340,66 @@ window "rpane" splitter = 50 show-splitter = true lock = none + elem "forumb" + type = BUTTON + pos = 260,0 + size = 60x16 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Forum" + image = "" + command = "forum" + is-flat = false + stretch = false + is-checked = false + group = "rpanemode" + button-type = pushbutton + elem "wikib" + type = BUTTON + pos = 195,0 + size = 60x16 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Wiki" + image = "" + command = "wiki" + is-flat = false + stretch = false + is-checked = false + group = "rpanemode" + button-type = pushbutton elem "textb" type = BUTTON pos = 0,0 - size = 60x20 + size = 60x16 anchor1 = none anchor2 = none font-family = "" @@ -1371,7 +1427,7 @@ window "rpane" elem "browseb" type = BUTTON pos = 65,0 - size = 60x20 + size = 60x16 anchor1 = none anchor2 = none font-family = "" @@ -1379,7 +1435,7 @@ window "rpane" font-style = "" text-color = #000000 background-color = none - is-visible = false + is-visible = true is-disabled = false is-transparent = false is-default = false @@ -1399,7 +1455,7 @@ window "rpane" elem "infob" type = BUTTON pos = 130,0 - size = 60x20 + size = 60x16 anchor1 = none anchor2 = none font-family = "" diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index 0185e6c3bb2..3682a2461de 100755 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -17,7 +17,7 @@ "aaq" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/light{dir = 1},/obj/structure/window/basic,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden{name = "Armory"}) "aar" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/basic,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden{name = "Armory"}) "aas" = (/turf/simulated/floor,/area/security/warden{name = "Armory"}) -"aat" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/combat2,/obj/item/weapon/gun/projectile/shotgun/combat2,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/basic,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden{name = "Armory"}) +"aat" = (/obj/structure/rack,/obj/item/ammo_casing/shotgun,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/basic,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden{name = "Armory"}) "aau" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/security/warden{name = "Armory"}) "aav" = (/obj/structure/rack,/obj/item/weapon/gun/energy/laser,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/basic,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden{name = "Armory"}) "aaw" = (/turf/simulated/floor/plating/airless,/area)