diff --git a/baystation12.dme b/baystation12.dme index 28a9fa0df4..e3380e2620 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 d43c88dabb..7e4c565b70 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 59c5c6543d..ca79489d25 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 3cc9f01be6..da1b4800e9 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 f64557c03f..4644c924cf 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 e2b975d4d5..e1facd0a59 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 3f5eebc7eb..01e41a3b76 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 456ceddb6e..3c18374fc6 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 1fa6ff8665..a8001bc51b 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 68746bfc60..b0db726be4 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 648886f8f2..789705e561 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 0803841d5e..5719f6a6d7 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 bcccc00b9a..9cc3f146e4 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 dc2fe2e28c..82ff91696c 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 3669561f82..9869f29ff7 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 ca568f6bf9..c744d9fd1e 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 75e608b8d7..95fabebab6 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 5bd77a7fde..47ac7dbdca 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 eb313f5649..a26ea8a691 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 8e2e98b362..ac97147c4c 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 c3ee3118ef..bb0aa82c65 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 8db9eabe4a..10e78b95e5 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 904e24861d..4f4b77ef4f 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 dd9176d047..cc9f98ef65 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 175bbc62aa..8d59a0f3d0 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 901fbecbcf..104274ab24 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 401b5ad03e..1cbde9ffce 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 c9b74bd6d4..a9e65abf4e 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 b233fc7f6c..527b13f4ca 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 997ca128d7..ba6fd25771 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 0498b7aafe..e68dc18c11 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 5993bfc8d9..cbd0d465a6 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 10f84c2b0b..6edbbf8049 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 39660bbbe6..395e7cd4ec 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 a4bd5323e4..197548d64d 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 564f174fd2..7932512bda 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 b231dc08c1..baf82a53d4 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 38e63dea1b..17ea9b0516 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 0000000000..d7b572e284 --- /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 05a6c03c3f..2350b07f84 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 5f4fbdac35..2c85cc34a5 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 9f6fddd832..8e37060611 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 3562372a94..75aa27e081 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 b295e72b43..3407f714bb 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 e97a5720a9..f89c92f4f2 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 0a1ca725a3..3969992c4e 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 cbcb149464..37ec382bc7 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 cfe29e2b5e..e51b8b48de 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 0a2a2f226f..f575d5ffbb 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 aa8b28715b..281e451624 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 4d4b9e923c..236d21b6fc 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 40e4bf9f86..f1d7316695 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 c3c692643e..d0596badac 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 64bad12d89..266bd3fc60 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 3ab582828e..b1260a98b7 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 0e563e2cf4..2db6674a9a 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 691b0a9806..8c1f6a5f3d 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 d07b212196..36f7acde4c 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 fe8d77dd7c..60ffc30f5a 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 346a318d3e..90f333f4bf 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 6df982d16d..3f2d074e31 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 00b4c61cbf..9ad6a241b2 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 bf621d52ca..a8802a7f1a 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 d01356ccf7..a7dccbcf28 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 817d23d96a..9fc41c86ce 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 9f09417a9c..21f8eeefff 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 eb6746cbc2..7b5b9056a2 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 ebfd27c485..3738a40921 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 7821b66cd7..1b9a7cfa2f 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 383a2806c2..e182d1f9a3 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 c5c4c3fc14..0fc6f68b5e 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 e5d6c79322..0000000000 --- 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 df3646f6f3..e8b4007cb1 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 aca76b630a..ab2916710a 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 7636523d57..e4bd4cdfed 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 017702505c..a13fe588bd 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 fc526d2ed4..d07000d5f9 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 6405a1e47d..f85cf5cc39 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 8eeca228a7..7d7134a0aa 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 ca977fddff..27458a2ee8 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 e8d9ae4daf..cd535fc282 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 8650435b56..c80e7c981c 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 7eae947005..83f460caac 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 0000000000..3cf23dfabe --- /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 4cc3f89132..1fc01b3ed1 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 0185e6c3bb..3682a2461d 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)