diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index 4f47bda014c..57ca886d6e1 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -13,6 +13,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 var/emergencyCallTime = 6000 //time taken for emergency shuttle to reach the station when called (in deciseconds) var/emergencyDockTime = 1800 //time taken for emergency shuttle to leave again once it has docked (in deciseconds) var/emergencyEscapeTime = 1200 //time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds) + var/emergency_sec_level_time = 0 // time sec level was last raised to red or higher var/area/emergencyLastCallLoc var/emergencyNoEscape @@ -134,7 +135,11 @@ DECLARE_GLOBAL_CONTROLLER(shuttle, shuttle_master) var/area/signal_origin = get_area(user) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. - emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) + var/extra_minutes = 0 + var/priority_time = emergencyCallTime * 0.5 + if(world.time - emergency_sec_level_time < priority_time) + extra_minutes = 5 + emergency.request(null, 0.5 + extra_minutes / (emergencyCallTime / 600), signal_origin, html_decode(emergency_reason), 1) else emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0) diff --git a/code/datums/diseases/kingstons.dm b/code/datums/diseases/kingstons.dm new file mode 100644 index 00000000000..abad7dcf720 --- /dev/null +++ b/code/datums/diseases/kingstons.dm @@ -0,0 +1,95 @@ +/datum/disease/kingstons + name = "Kingstons Syndrome" + max_stages = 4 + spread_text = "Airborne" + cure_text = "Milk" + cures = list("milk") + cure_chance = 50 + agent = "Nya Virus" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 0.75 + desc = "If left untreated the subject will turn into a feline. In felines it has... OTHER... effects." + severity = DANGEROUS + +/datum/disease/kingstons/stage_act() + ..() + switch(stage) + if(1) + if(prob(10)) + if(affected_mob.get_species() == "Tajaran") + to_chat(affected_mob, "You feel good.") + else + to_chat(affected_mob, "You feel like playing with string.") + if(2) + if(prob(10)) + if(affected_mob.get_species() == "Tajaran") + to_chat(affected_mob, "Something in your throat itches.") + else + to_chat(affected_mob, "You NEED to find a mouse.") + if(3) + if(prob(10)) + if(affected_mob.get_species() == "Tajaran") + to_chat(affected_mob, "You feel something in your throat!") + affected_mob.emote("cough") + else + affected_mob.say(pick(list("Mew", "Meow!", "Nya!~"))) + if(4) + if(prob(5)) + if(affected_mob.get_species() == "Tajaran") + affected_mob.visible_message("[affected_mob] coughs up a hairball!", \ + "You cough up a hairball!") + affected_mob.Stun(5) + else + affected_mob.visible_message("[affected_mob]'s form contorts into something more feline!", \ + "YOU TURN INTO A TAJARAN!") + var/mob/living/carbon/human/catface = affected_mob + catface.set_species("Tajaran") + + +/datum/disease/kingstons/advanced + name = "Advanced Kingstons Syndrome" + spread_text = "Airborne" + cure_text = "Plasma" + cures = list("plasma") + cure_chance = 50 + agent = "AMB45DR Bacteria" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 0.75 + desc = "If left untreated the subject will mutate to a different species." + severity = BIOHAZARD + var/list/virspecies = list("Human", "Tajaran", "Unathi", "Skrell", "Vulpkanin")//no karma races sorrys. + var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay") + var/chosentype + var/chosensuff + +/datum/disease/kingstons/advanced/New() + chosentype = pick(virspecies) + chosensuff = pick(virsuffix) + + name = "[chosentype] [chosensuff]" + +/datum/disease/kingstons/advanced/stage_act() + ..() + switch(stage) + if(1) + if(prob(10)) + to_chat(affected_mob, "You feel awkward.") + if(2) + if(prob(10)) + to_chat(affected_mob, "You itch.") + if(3) + if(prob(10)) + to_chat(affected_mob, "Your skin starts to flake!") + + if(4) + if(prob(5)) + if(affected_mob.get_species() != chosentype) + affected_mob.visible_message("[affected_mob]'s skin splits and form contorts!", \ + "Your body mutates into a [chosentype]!") + var/mob/living/carbon/human/twisted = affected_mob + twisted.set_species(chosentype) + else + affected_mob.visible_message("[affected_mob] scratches at thier skin!", \ + "You scratch your skin to try not to itch!") + affected_mob.adjustBruteLoss(-5) + affected_mob.adjustStaminaLoss(5) \ No newline at end of file diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm new file mode 100644 index 00000000000..2c5a8752cbb --- /dev/null +++ b/code/datums/diseases/lycancoughy.dm @@ -0,0 +1,45 @@ +/datum/disease/lycan + name = "Lycancoughy" + form = "Infection" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Ethanol" + cures = list("ethanol") + agent = "Excess Snuggles" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "If left untreated subject will regurgitate... puppies." + severity = MEDIUM + +/datum/disease/lycan/stage_act() + ..() + switch(stage) + if(2) //also changes say, see say.dm + if(prob(5)) + to_chat(affected_mob, "You itch.") + affected_mob.emote("cough") + if(3) + if(prob(10)) + to_chat(affected_mob, "You hear faint barking.") + if(prob(5)) + to_chat(affected_mob, "You crave meat.") + affected_mob.emote("cough") + if(prob(2)) + to_chat(affected_mob, "Your stomach growls!") + if(4) + if(prob(10)) + to_chat(affected_mob, "Your stomach barks?!") + if(prob(5)) + affected_mob.visible_message("[affected_mob] howls!", \ + "You howl!") + affected_mob.AdjustConfused(rand(6, 8)) + if(prob(3)) + var/list/puppytype = list(/mob/living/simple_animal/pet/corgi/puppy, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/pet/fox) + var/mob/living/puppypicked = pick(puppytype) + affected_mob.visible_message("[affected_mob] coughs up [initial(puppypicked.name)]!", \ + "You cough up [initial(puppypicked.name)]?!") + affected_mob.emote("cough") + affected_mob.adjustBruteLoss(5) + new puppypicked(affected_mob.loc) + new puppypicked(affected_mob.loc) + return diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 2bf0ca308a8..f2f9e1371b1 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -26,3 +26,38 @@ if(4) if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) + + +/datum/disease/pierrot_throat/advanced + name = "Advanced Pierrot's Throat" + spread_text = "Airborne" + cure_text = "Banana products, especially banana bread." + cures = list("banana") + cure_chance = 75 + agent = "H0NI<42.B4n4 Virus" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 0.75 + desc = "If left untreated the subject will probably drive others to insanity and go insane themselves." + severity = DANGEROUS + +/datum/disease/pierrot_throat/advanced/stage_act() + ..() + switch(stage) + if(1) + if(prob(10)) + to_chat(affected_mob, "You feel very silly.") + if(prob(5)) + to_chat(affected_mob, "You feel like making a joke.") + if(2) + if(prob(10)) + to_chat(affected_mob, "You don't just start seeing rainbows... YOU ARE RAINBOWS!") + if(3) + if(prob(10)) + to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!") + affected_mob << 'sound/items/AirHorn.ogg' + if(4) + if(prob(5)) + affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) + + if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/virusclown_hat)) + affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/virusclown_hat(src), slot_wear_mask) \ No newline at end of file diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 15d78f37276..1feea397ac0 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -388,6 +388,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/closet/crate/secure/plasma containername = "energy gun crate" +/datum/supply_packs/security/armory/epistol // costs 3/5ths of the normal e-guns for 3/4ths the total ammo, making it cheaper to arm more people, but less convient for any one person + name = "Energy Pistol Crate" + contains = list(/obj/item/weapon/gun/energy/gun/mini, + /obj/item/weapon/gun/energy/gun/mini, + /obj/item/weapon/gun/energy/gun/mini) + cost = 15 + containertype = /obj/structure/closet/crate/secure/plasma + containername = "energy gun crate" + /datum/supply_packs/security/armory/eweapons name = "Incendiary Weapons Crate" contains = list(/obj/item/weapon/flamethrower/full, diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b473b830e39..83880039a73 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -53,15 +53,15 @@ return cameras -/area/proc/atmosalert(danger_level, var/alarm_source) +/area/proc/atmosalert(danger_level, var/alarm_source, var/force = FALSE) if(danger_level == ATMOS_ALARM_NONE) atmosphere_alarm.clearAlarm(src, alarm_source) else atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level) - //Check all the alarms before lowering atmosalm. Raising is perfectly fine. + //Check all the alarms before lowering atmosalm. Raising is perfectly fine. If force = 1 we don't care. for(var/obj/machinery/alarm/AA in src) - if(!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.report_danger_level) + if(!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.report_danger_level && !force) danger_level = max(danger_level, AA.danger_level) if(danger_level != atmosalm) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 71c702537e6..b58f3f3878b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -281,10 +281,11 @@ // Get a list of all the people who want to be the antagonist for this round, except those with incompatible species for(var/mob/new_player/player in players) - if((role in player.client.prefs.be_special) && !(player.client.prefs.species in protected_species)) - player_draft_log += "[player.key] had [roletext] enabled, so we are drafting them." - candidates += player.mind - players -= player + if(!player.skip_antag) + if((role in player.client.prefs.be_special) && !(player.client.prefs.species in protected_species)) + player_draft_log += "[player.key] had [roletext] enabled, so we are drafting them." + candidates += player.mind + players -= player // If we don't have enough antags, draft people who voted for the round. if(candidates.len < recommended_enemies) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 74e2928b262..d0f75dbe9e1 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -922,7 +922,7 @@ return 1 if(href_list["atmos_reset"]) - if(alarm_area.atmosalert(ATMOS_ALARM_NONE, src)) + if(alarm_area.atmosalert(ATMOS_ALARM_NONE, src, TRUE)) apply_danger_level(ATMOS_ALARM_NONE) alarmActivated = 0 update_icon() diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm index 068004dd2f9..661a814c6fb 100644 --- a/code/game/machinery/poolcontroller.dm +++ b/code/game/machinery/poolcontroller.dm @@ -100,7 +100,10 @@ if(drownee.losebreath > 20) //You've probably got bigger problems than drowning at this point, so we won't add to it until you get that under control. return - add_logs(src, drownee, "drowned", null, null, 0) //log it to their VV, but don't spam the admins' chats with the logs + if(isLivingSSD(drownee)) + add_logs(src, drownee, "drowned", null, null, 0, 1) // Notify admins, since the person is SSD + else + add_logs(src, drownee, "drowned", null, null, 0, 0) // Do not notify admins. if(drownee.stat) //Mob is in critical. drownee.AdjustLoseBreath(3, bound_lower = 0, bound_upper = 20) drownee.visible_message("\The [drownee] appears to be drowning!","You're quickly drowning!") //inform them that they are fucked. diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 1a3cb1754ac..087ced385fb 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -187,16 +187,16 @@ RCD if(!proximity) return if(istype(A,/area/shuttle)||istype(A,/turf/space/transit)) return 0 - if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window))) + if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window) || istype(A, /obj/structure/lattice))) return 0 switch(mode) if(1) - if(istype(A, /turf/space)) + if(istype(A, /turf/space) || istype(A, /obj/structure/lattice)) if(useResource(1, user)) to_chat(user, "Building Floor...") activate() - var/turf/AT = A + var/turf/AT = get_turf(A) AT.ChangeTurf(/turf/simulated/floor/plating) return 1 return 0 diff --git a/code/game/objects/items/weapons/grenades/custom_grenades.dm b/code/game/objects/items/weapons/grenades/custom_grenades.dm index 82252c3a340..e9b78bbe90d 100644 --- a/code/game/objects/items/weapons/grenades/custom_grenades.dm +++ b/code/game/objects/items/weapons/grenades/custom_grenades.dm @@ -111,23 +111,23 @@ payload_name = "lubricant" stage = 2 - New() - ..() - var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) - B1.reagents.add_reagent("lube",50) - beakers += B1 -/obj/item/weapon/grenade/chem_grenade/lube/remote - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/signaler) -/obj/item/weapon/grenade/chem_grenade/lube/prox - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) -/obj/item/weapon/grenade/chem_grenade/lube/tripwire - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/infra) +/obj/item/weapon/grenade/chem_grenade/lube/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) + B1.reagents.add_reagent("lube",50) + beakers += B1 + +/obj/item/weapon/grenade/chem_grenade/lube/remote/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/signaler) + +/obj/item/weapon/grenade/chem_grenade/lube/prox/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) + +/obj/item/weapon/grenade/chem_grenade/lube/tripwire/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra) // Basic explosion grenade @@ -135,32 +135,68 @@ payload_name = "conventional" stage = 2 - New() - ..() - var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("glycerol",30) // todo: someone says NG is overpowered, test. - B1.reagents.add_reagent("sacid",15) - B2.reagents.add_reagent("sacid",15) - B2.reagents.add_reagent("facid",30) - beakers += B1 - beakers += B2 +/obj/item/weapon/grenade/chem_grenade/explosion/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) + B1.reagents.add_reagent("glycerol",30) // todo: someone says NG is overpowered, test. + B1.reagents.add_reagent("sacid",15) + B2.reagents.add_reagent("sacid",15) + B2.reagents.add_reagent("facid",30) + beakers += B1 + beakers += B2 // Assembly Variants -/obj/item/weapon/grenade/chem_grenade/explosion/remote - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/signaler) +/obj/item/weapon/grenade/chem_grenade/explosion/remote/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/signaler) + +/obj/item/weapon/grenade/chem_grenade/explosion/prox/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) + +/obj/item/weapon/grenade/chem_grenade/explosion/mine/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/mousetrap) + + +// Water + Potassium = Boom + +/obj/item/weapon/grenade/chem_grenade/waterpotassium + payload_name = "chem explosive" + stage = 2 + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src) + B1.reagents.add_reagent("water",100) + B2.reagents.add_reagent("potassium",100) + beakers += B1 + beakers += B2 + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/remote/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/signaler) + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/prox/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) + + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra) + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire_armed/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra/armed) + +/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire_armed_stealth/New() + ..() + CreateDefaultTrigger(/obj/item/device/assembly/infra/armed/stealth) -/obj/item/weapon/grenade/chem_grenade/explosion/prox - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor) -/obj/item/weapon/grenade/chem_grenade/explosion/mine - New() - ..() - CreateDefaultTrigger(/obj/item/device/assembly/mousetrap) // Basic EMP grenade /obj/item/weapon/grenade/chem_grenade/emp diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index a9a302dae82..19833a9933c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -53,7 +53,7 @@ new /obj/item/weapon/storage/box/ids(src) new /obj/item/weapon/storage/box/PDAs(src) new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/weapon/gun/energy/gun/mini(src) new /obj/item/device/flash(src) new /obj/item/clothing/accessory/petcollar(src) new /obj/item/weapon/door_remote/civillian(src) diff --git a/code/hub.dm b/code/hub.dm index 0dfc4359ca3..d54b49e1011 100644 --- a/code/hub.dm +++ b/code/hub.dm @@ -3,6 +3,7 @@ hub = "Exadv1.spacestation13" hub_password = "kMZy3U5jJHSiBQjr" name = "Space Station 13" + /var/hub_password_base = "kMZy3U5jJHSiBQjr" /* This is for any host that would like their server to appear on the main SS13 hub. To use it, simply replace the password above, with the password found below, and it should work. If not, let us know on the main tgstation IRC channel of irc.rizon.net #tgstation13 we can help you there. diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 16b047ab1f0..6a2dbf02c18 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -7,12 +7,16 @@ bomb_name = "tripwire mine" + secured = 0 // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise + dir = EAST var/on = 0 - var/visible = 0 + var/visible = 1 var/obj/effect/beam/i_beam/first = null var/obj/effect/beam/i_beam/last = null var/max_nesting_level = 10 var/turf/fire_location + var/emission_cycles = 0 + var/emission_cap = 20 /obj/item/device/assembly/infra/Destroy() if(first) @@ -22,7 +26,11 @@ return ..() /obj/item/device/assembly/infra/describe() - return "The infrared trigger is [on?"on":"off"]." + return "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]." + +/obj/item/device/assembly/infra/examine(mob/user) + ..() + to_chat(user, describe()) /obj/item/device/assembly/infra/activate() if(!..()) return 0//Cooldown check @@ -36,11 +44,22 @@ processing_objects.Add(src) else on = 0 - if(first) qdel(first) + if(first) + qdel(first) processing_objects.Remove(src) update_icon() return secured +/obj/item/device/assembly/infra/New() + ..() + if(!secured) + toggle_secure() + +/obj/item/device/assembly/infra/proc/arm() // Forces the device to arm no matter its current state. + if(!secured) // Checked because arm() might be called sometime after the object is spawned. + toggle_secure() + on = 1 + /obj/item/device/assembly/infra/update_icon() overlays.Cut() attached_overlays = list() @@ -51,38 +70,22 @@ if(holder) holder.update_icon() -/obj/item/device/assembly/infra/proc/get_valid_loc(atom/A, atom/prev, level = 0) - if(!A) - A = loc - if(!prev) - prev = src - if(level > max_nesting_level) - return null - else if(isturf(A)) - return A - else if(isobj(A)) - var/obj/O = A - if(isassembly(A) || O.IsAssemblyHolder() || istype(A, /obj/item/device/onetankbomb)) - return .(A.loc, A, level + 1) - else if(ismob(A)) - var/mob/user = A - if(user.get_active_hand() == prev || user.get_inactive_hand() == prev) - return .(A.loc, A, level + 1) - return null - /obj/item/device/assembly/infra/process() - if(!on || fire_location != get_turf(loc)) - if(first) - qdel(first) - return + var/turf/T = get_turf(src) + if(first && (!on || !fire_location || fire_location != T || emission_cycles >= emission_cap)) + qdel(first) + return + if(!on) + return if(!secured) return if(first && last) last.process() + emission_cycles++ return - var/turf/T = get_valid_loc() if(T) fire_location = T + emission_cycles = 0 var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T) I.master = src I.density = 1 @@ -124,6 +127,8 @@ return 0 pulse(0) audible_message("[bicon(src)] *beep* *beep*", null, 3) + if(first) + qdel(first) cooldown = 2 spawn(10) process_cooldown() @@ -177,6 +182,21 @@ if(usr.machine == src) interact(usr) + if(first) + qdel(first) + + + +/obj/item/device/assembly/infra/armed/New() + ..() + spawn(3) + if(holder) + if(holder.master) + dir = holder.master.dir + arm() + +/obj/item/device/assembly/infra/armed/stealth + visible = 0 /***************************IBeam*********************************/ @@ -191,6 +211,8 @@ var/limit = null var/visible = 0.0 var/left = null + var/life_cycles = 0 + var/life_cap = 20 anchored = 1.0 pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -209,7 +231,8 @@ transform = turn(matrix(), dir2angle(dir)) /obj/effect/beam/i_beam/process() - if((loc.density || !(master))) + life_cycles++ + if(loc.density || !master || life_cycles >= life_cap) qdel(src) return if(left > 0) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 80350b3f3fe..645d0cdf633 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -131,6 +131,7 @@ desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." icon_state = "clown" item_state = "clown_hat" + flags = NODROP /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index c96855a07e8..6d6558463e1 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -562,7 +562,7 @@ log_robot("[key_name(speaker)] : [message]") var/message_start = "[name], [speaker.name]" - var/message_body = " \"[message]\"" + var/message_body = "" for(var/mob/M in dead_mob_list) if(!isnewplayer(M) && !isbrain(M)) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index bf7f413708f..72df46e226f 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -166,6 +166,9 @@ set category = "Robot Commands" set name = "Power Warning" + if(handle_emote_CD(50)) + return + if(!is_component_functioning("power cell") || !cell || !cell.charge) visible_message("The power warning light on [src] flashes urgently.",\ "You announce you are operating in low power mode.") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4c1053995e0..fc88e75bd2d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -49,6 +49,8 @@ var/list/robot_verbs_default = list( var/datum/wires/robot/wires = null var/opened = 0 + var/custom_panel = null + var/list/custom_panel_names = list("Cricket") var/emagged = 0 var/list/force_modules = list() @@ -314,6 +316,7 @@ var/list/robot_verbs_default = list( module_sprites["Default"] = "Service2" module_sprites["Standard"] = "robotServ" module_sprites["Noble-SRV"] = "Noble-SRV" + module_sprites["Cricket"] = "Cricket-SERV" if("Miner") module = new /obj/item/weapon/robot_module/miner(src) @@ -325,6 +328,7 @@ var/list/robot_verbs_default = list( module_sprites["Treadhead"] = "Miner" module_sprites["Standard"] = "robotMine" module_sprites["Noble-DIG"] = "Noble-DIG" + module_sprites["Cricket"] = "Cricket-MINE" if("Medical") module = new /obj/item/weapon/robot_module/medical(src) @@ -337,6 +341,7 @@ var/list/robot_verbs_default = list( module_sprites["Needles"] = "medicalrobot" module_sprites["Standard"] = "robotMedi" module_sprites["Noble-MED"] = "Noble-MED" + module_sprites["Cricket"] = "Cricket-MEDI" status_flags &= ~CANPUSH if("Security") @@ -348,6 +353,7 @@ var/list/robot_verbs_default = list( module_sprites["Bloodhound"] = "bloodhound" module_sprites["Standard"] = "robotSecy" module_sprites["Noble-SEC"] = "Noble-SEC" + module_sprites["Cricket"] = "Cricket-SEC" status_flags &= ~CANPUSH if("Engineering") @@ -360,6 +366,7 @@ var/list/robot_verbs_default = list( module_sprites["Landmate"] = "landmate" module_sprites["Standard"] = "robotEngi" module_sprites["Noble-ENG"] = "Noble-ENG" + module_sprites["Cricket"] = "Cricket-ENGI" magpulse = 1 if("Janitor") @@ -370,6 +377,7 @@ var/list/robot_verbs_default = list( module_sprites["Mop Gear Rex"] = "mopgearrex" module_sprites["Standard"] = "robotJani" module_sprites["Noble-CLN"] = "Noble-CLN" + module_sprites["Cricket"] = "Cricket-JANI" if("Combat") module = new /obj/item/weapon/robot_module/combat(src) @@ -968,6 +976,9 @@ var/list/robot_verbs_default = list( if(custom_sprite) //Custom borgs also have custom panels, heh panelprefix = "[ckey]" + if(custom_panel in custom_panel_names) //For default borgs with different panels + panelprefix = custom_panel + if(wiresexposed) overlays += "[panelprefix]-openpanel +w" else if(cell) @@ -1289,6 +1300,8 @@ var/list/robot_verbs_default = list( module.module_type = "Brobot" update_module_icon() lockcharge = null + var/list/names = splittext(icontype, "-") + custom_panel = trim(names[1]) else to_chat(src, "Something is badly wrong with the sprite selection. Harass a coder.") icon_state = module_sprites[1] diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 501bfd1e798..5dfce5d7b72 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -175,3 +175,5 @@ eats_mice = 0 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 + melee_damage_lower = 5 + melee_damage_upper = 15 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 6edfc6f42c9..26db6dae955 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -37,4 +37,6 @@ faction = list("syndicate") gold_core_spawnable = CHEM_MOB_SPAWN_INVALID atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 \ No newline at end of file + minbodytemp = 0 + melee_damage_lower = 10 + melee_damage_upper = 20 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index bf12b07de2e..7f80683a46d 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -17,8 +17,8 @@ response_disarm = "gently pushes aside" response_harm = "kicks" gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY - melee_damage_lower = 18 - melee_damage_upper = 18 + melee_damage_lower = 0 + melee_damage_upper = 0 health = 50 maxHealth = 50 speed = 2 @@ -28,4 +28,4 @@ /mob/living/simple_animal/pet/sloth/paperwork name = "Paperwork" desc = "Cargo's pet sloth. About as useful as the rest of the techs." - gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 91eb0970f50..e6dacc81a67 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -687,7 +687,15 @@ "STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!", "Wire the solars, you lazy bums!", "WHO TOOK THE DAMN HARDSUITS?", - "OH GOD ITS FREE CALL THE SHUTTLE") + "OH GOD ITS FREE CALL THE SHUTTLE", + "Why are there so many atmos alerts?", + "OH GOD WHY WOULD YOU TURN ON THE PA BEFORE CONTAINMENT IS UP?", + "Remember to lock the emitters!", + "Stop goofing off and repair the goddam station!", + "The singularity is not your friend!", + "What were the wires again?", + "Goddam emaggers!" + ) gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /mob/living/simple_animal/parrot/Poly/New() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 569730aefd3..d28a34f1bc3 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -1,6 +1,7 @@ /mob/new_player var/ready = 0 - var/spawning = 0//Referenced when you want to delete the new_player later on in the code. + var/skip_antag = 0 //For declining an antag roll this round. + var/spawning = 0 //Referenced when you want to delete the new_player later on in the code. var/totalPlayers = 0 //Player counts for the Lobby tab var/totalPlayersReady = 0 universal_speak = 1 @@ -31,6 +32,11 @@ if(!ready) output += "
" else output += "You are ready (Cancel)
" + var/list/antags = client.prefs.be_special + if(antags && antags.len) + if(!skip_antag) output += "Global Antag Candidancy" + else output += "
Global Antag Candidancy"
+ output += "
You are [skip_antag ? "ineligable" : "eligable"] for all antag roles.