From deaf0d1225100dc2f94aed2fb479e84491a32cd4 Mon Sep 17 00:00:00 2001 From: Duck- Date: Sat, 13 Sep 2014 15:16:05 -0400 Subject: [PATCH 01/18] Custom gear stuff Protopistol temporary nerf-- They're meant to be small enough to be concealable, but protorifles aren't implemented for lack of sprites. So they're going to be normal sized and only backpackable. --- code/modules/client/preferences_gear.dm | 32 ++++++++++++++----- code/modules/mob/hear_say.dm | 4 ++- .../projectiles/guns/energy/modular.dm | 4 +-- data/investigate/gravity.html | 4 +-- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index cbea8c1f..b6e56186 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -25,7 +25,7 @@ proc/populate_gear_list() path = /obj/item/weapon/dice/d20 cost = 1 -/datum/gear/dice +/datum/gear/wallet display_name = "wallet" path = /obj/item/weapon/storage/wallet cost = 2 @@ -41,6 +41,22 @@ proc/populate_gear_list() path = /obj/item/weapon/cane cost = 2 +/datum/gear/recorder + display_name = "universal recorder" + path = /obj/item/device/taperecorder + cost = 1 + +/datum/gear/camera + display_name = "camera" + path = /obj/item/device/camera + cost = 1 + +/datum/gear/clipboard + display_name = "clipboard" + path = /obj/item/weapon/clipboard + cost = 1 + + /datum/gear/tie_horrible display_name = "horrible tie" path = /obj/item/clothing/tie/horrible @@ -395,12 +411,6 @@ proc/populate_gear_list() // slot = slot_w_uniform cost = 3 -/datum/gear/exec_suit - display_name = "executive suit" - path = /obj/item/clothing/under/suit_jacket/really_black -// slot = slot_w_uniform - cost = 3 - /datum/gear/oldmansuit display_name = "old man suit" path = /obj/item/clothing/under/lawyer/oldman @@ -423,10 +433,16 @@ proc/populate_gear_list() /datum/gear/armpit display_name = "shoulder holster" -// path = /obj/item/clothing/tie/holster/armpit + path = /obj/item/clothing/tie/holster/armpit cost = 3 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security") + +/datum/gear/normal_beret + display_name = "beret" + path = /obj/item/clothing/head/beret + cost = 3 + /datum/gear/sec_beret display_name = "security beret" path = /obj/item/clothing/head/beret/sec diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 80a01ba5..49554154 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -76,7 +76,9 @@ if(hard_to_hear) message = stars(message) - var/speaker_name = speaker.name + var/speaker_name + if(speaker) + speaker_name = speaker.name if(vname) speaker_name = vname diff --git a/code/modules/projectiles/guns/energy/modular.dm b/code/modules/projectiles/guns/energy/modular.dm index 6807b113..bc4b5b14 100644 --- a/code/modules/projectiles/guns/energy/modular.dm +++ b/code/modules/projectiles/guns/energy/modular.dm @@ -58,8 +58,8 @@ desc = "A basic, modular laser pistol." icon_state = "modpistolopen" open = 1 - w_class = 2 - upgradepointtotal = 16 + w_class = 3 // leave it at three until protorifle is implemented. then severely nerf pistol points. + upgradepointtotal = 16 //current protopistol is at protorifle point totals. /obj/item/weapon/gun/energy/laser/modular/pistol/advanced //better version of the pistol name = "advanced protopistol" diff --git a/data/investigate/gravity.html b/data/investigate/gravity.html index 510be218..5c7ddcdb 100644 --- a/data/investigate/gravity.html +++ b/data/investigate/gravity.html @@ -1,2 +1,2 @@ -20:24 [0x20077ee] (92,152,1) || the gravitational generator has regained power.
-20:24 [0x20077ee] (92,152,1) || the gravitational generator is now charging.
+01:55 [0x20077bc] (92,152,1) || the gravitational generator has regained power.
+01:55 [0x20077bc] (92,152,1) || the gravitational generator is now charging.
From 0aeab2dca9196eec5230dc14412c156cf7d6eca0 Mon Sep 17 00:00:00 2001 From: Duck- Date: Sat, 13 Sep 2014 16:24:04 -0400 Subject: [PATCH 02/18] Botany changes Poisonous plants you'll now eat in a single bite. Because poisoning. Poisoned cyanide death apples enabled in mutations. They look just like normal apples! Be careful. Death nettles buffed significantly, considering it's a tri-department effort to even get them, and that's excluding potency growth. --- code/game/machinery/hydroponics.dm | 6 +++++- code/game/objects/items/weapons/hydroponics.dm | 2 +- .../reagents/reagent_containers/food/snacks/grown.dm | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index ecd16e68..188af968 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -341,7 +341,11 @@ obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! else if ( istype(myseed, /obj/item/seeds/appleseed )) del(myseed) - myseed = new /obj/item/seeds/goldappleseed + switch(rand(1,100)) + if(1 to 50) + myseed = new /obj/item/seeds/goldappleseed + if(51 to 100) + myseed = new /obj/item/seeds/poisonedappleseed else if ( istype(myseed, /obj/item/seeds/berryseed )) del(myseed) diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 91f8e0ca..85872fd6 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -203,7 +203,7 @@ /obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan potency = newValue - force = round((5+potency/2.5), 1) + force = round((5+potency), 1) ///2.5. deadly nettles because you have earned it. /* diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm index acbb5810..6a04ea7f 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm @@ -382,7 +382,7 @@ reagents.add_reagent("nutriment", 1) reagents.add_reagent("toxin", 3+round(potency / 3, 1)) reagents.add_reagent("lexorin", 1+round(potency / 5, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + bitesize = reagents.total_volume /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris seed = "/obj/item/seeds/ambrosiavulgaris" @@ -833,7 +833,7 @@ reagents.add_reagent("nutriment", 1) reagents.add_reagent("amatoxin", 3+round(potency / 3, 1)) reagents.add_reagent("psilocybin", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + bitesize = reagents.total_volume /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() @@ -854,7 +854,7 @@ reagents.add_reagent("nutriment", 1+round((potency / 50), 1)) reagents.add_reagent("amatoxin", 13+round(potency / 3, 1)) reagents.add_reagent("psilocybin", 1+round(potency / 25, 1)) - bitesize = 1+round(reagents.total_volume / 2, 1) + bitesize = reagents.total_volume /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/angel/attackby(var/obj/item/O as obj, var/mob/user as mob) . = ..() From b7e84139a7719af1647e84ae6569c0ac4e55b04f Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Sun, 14 Sep 2014 03:07:42 +0100 Subject: [PATCH 03/18] Scopes updates - Admin Access - Attack Log - Prays - Centcomm - Singluo tells Mods/Admins when stage 4 - PA tells Mods/Admins when it is altered at all - All stagg get a notification if any of the chat channels are muted at login --- Scopes Files/gravitygenerator.dm | 6 ++-- code/controllers/voting.dm | 18 +++++++----- code/datums/datumvars.dm | 2 +- code/game/gamemodes/changeling/changeling.dm | 11 ++++--- code/game/gamemodes/cult/cult.dm | 1 + code/game/gamemodes/events/power_failure.dm | 2 ++ code/game/gamemodes/game_mode.dm | 6 ++++ code/game/gamemodes/gameticker.dm | 3 ++ code/game/gamemodes/vampire/vampire.dm | 16 ++++++---- code/modules/admin/admin.dm | 20 ++++++++++--- code/modules/admin/admin_verbs.dm | 29 ++++++++++++------- code/modules/admin/player_panel.dm | 17 ++++++----- code/modules/admin/verbs/adminhelp.dm | 6 ++-- code/modules/admin/verbs/debug.dm | 7 +++-- code/modules/admin/verbs/mapping.dm | 2 +- code/modules/admin/verbs/modifyvariables.dm | 6 +++- code/modules/admin/verbs/pray.dm | 10 +++++-- code/modules/client/client procs.dm | 10 +++++-- code/modules/events/event_manager.dm | 3 +- code/modules/mob/login.dm | 4 ++- .../power/singularity/field_generator.dm | 1 + .../particle_accelerator/particle_control.dm | 7 +++-- code/modules/power/singularity/singularity.dm | 8 ++++- html/changelog.html | 17 +++++++++++ 24 files changed, 149 insertions(+), 63 deletions(-) diff --git a/Scopes Files/gravitygenerator.dm b/Scopes Files/gravitygenerator.dm index affa4f5a..245449aa 100644 --- a/Scopes Files/gravitygenerator.dm +++ b/Scopes Files/gravitygenerator.dm @@ -21,7 +21,7 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi /client/proc/cmd_dev_reset_gravity() set category = "Debug" set name = "Restore Default Gravity" - set desc = "Resets all gravity on the entire server(This spams Scopes like mad.)" + set desc = "Resets all gravity on the entire server." if(!check_rights(R_DEBUG|R_DEV)) return @@ -36,7 +36,7 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi src << "\red The game hasn't started yet!" return - if(alert(usr, "Be sure to warn Scopes, Chris, and Skull. This could be very spammy for their logs", "Restore gravity", "No", "Yes") == "No") + if(alert(usr, "Make people fall on their face?", "Restore gravity", "No", "Yes") == "No") return 0 world << "\red \b Resetting Gravity Simulation." @@ -47,12 +47,10 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi continue A.has_gravity = 1 - msg_scopes("Gravity reset in: [A.name]") for(var/area/SubA in A.related) SubA.has_gravity = 1 for(var/mob/living/carbon/human/M in SubA) M:float(0) - msg_scopes("Did you enjoy that insane amount of things") world << "\red Gravity Simulation reset." feedback_add_details("admin_verb","RSG") diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 207d51f2..2eea0aa0 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -181,7 +181,7 @@ datum/controller/vote log_game("Rebooting due to restart vote") world.Reboot() - last_vote_time = world.time + last_vote_time = time_stamp() return . proc/submit_vote(var/ckey, var/vote) @@ -236,14 +236,16 @@ datum/controller/vote mode = vote_type initiator = initiator_key started_time = world.time - var/timedifference = round((world.time - last_vote_time)) - var/timedifference_text - timedifference_text = time2text(timedifference, "hh:mm:ss") - msg_scopes("timedifference_text debug: [timedifference]") - timedifference_text = time2text(timedifference,"mm:ss") - msg_scopes("timedifference: [timedifference] timedifference_text: [timedifference_text] started_time: [started_time]") +// var/timedifference = round((world.time - last_vote_time)) +// var/timedifference_text +// timedifference_text = time2text(timedifference, "hh:mm:ss") +// msg_scopes("timedifference_text debug: [timedifference]") +// timedifference_text = time2text(timedifference,"mm:ss") +// msg_scopes("timedifference: [timedifference] timedifference_text: [timedifference_text] started_time: [started_time]") for(var/client/C in admins) - C << "Time since last vote: [timedifference_text]" + if((C.holder.rights & R_ADMIN) || (C.holder.rights & R_MOD)) + C << "Time last vote: [last_vote_time]" + C << "Time: [time_stamp()]" var/text = "[capitalize(mode)] vote started by [initiator]." if(mode == "custom") text += "\n[question]" diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 02f09088..c8391ce3 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -465,7 +465,7 @@ client cmd_mass_modify_object_variables(A, href_list["varnamemass"]) else if(href_list["mob_player_panel"]) - if(!check_rights(0)) return + if(!check_rights(R_ADMIN|R_MOD)) return var/mob/M = locate(href_list["mob_player_panel"]) if(!istype(M)) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 5891b812..f0f14e73 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -51,13 +51,16 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING) for(var/datum/mind/player in possible_changelings) +//This could be the fuckup with game start + if(player.current.client.prefs.species == "Machine") //Removing ipc's + possible_changelings -= player + msg_scopes("[player.key] has an invalid mob for this role.") + continue for(var/job in restricted_jobs)//Removing robots from the list if(player.assigned_role == job) possible_changelings -= player - continue -//This could be the fuckup with game start -// if(player.current.isipc()) //Removing ipc's -// possible_changelings -= player + msg_scopes("[player.key] has an invalid job for this role.") + break changeling_amount = 1 + round(num_players() / 10) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 9515b665..ee19a0ca 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -68,6 +68,7 @@ for(var/datum/mind/player in cultists_possible) for(var/job in restricted_jobs)//Removing heads and such from the list if(player.assigned_role == job) + msg_scopes("[player.key] has an invalid job for this role.") cultists_possible -= player for(var/cultists_number = 1 to max_cultists_to_start) diff --git a/code/game/gamemodes/events/power_failure.dm b/code/game/gamemodes/events/power_failure.dm index dbebc649..815c3a6b 100644 --- a/code/game/gamemodes/events/power_failure.dm +++ b/code/game/gamemodes/events/power_failure.dm @@ -86,6 +86,8 @@ continue S.charge = S.capacity S.output = 200000 + spawn(600) + S.output = S.last_output S.online = 1 S.updateicon() S.power_change() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 20b0ff79..577bb9b1 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -92,12 +92,16 @@ Implants; if((player.client)&&(player.ready)) playerC++ + msg_scopes("playerC: [playerC]") if(master_mode=="secret") + msg_scopes("req [required_players_secret]") if(playerC >= required_players_secret) return 1 else + msg_scopes("req [required_players]") if(playerC >= required_players) return 1 + msg_scopes("Nope, players not here or something") return 0 @@ -282,6 +286,7 @@ Implants; if(BE_CULTIST) roletext="cultist" if(BE_NINJA) roletext="ninja" if(BE_RAIDER) roletext="raider" + if(BE_VAMPIRE) roletext="vampire" // Assemble a list of active players without jobbans. for(var/mob/new_player/player in player_list) @@ -311,6 +316,7 @@ Implants; // Remove candidates who want to be antagonist but have a job that precludes it if(restricted_jobs) + msg_scopes("going through restricted jobs") for(var/datum/mind/player in candidates) for(var/job in restricted_jobs) if(player.assigned_role == job) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 071f2442..4bea30a5 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -76,6 +76,7 @@ var/global/datum/controller/gameticker/ticker if((master_mode=="random") || (master_mode=="secret")) runnable_modes = config.get_runnable_modes() if (runnable_modes.len==0) + msg_scopes("Well we can't continue runnable_modes.0") current_state = GAME_STATE_PREGAME world << "Unable to choose playable game mode. Reverting to pre-game lobby." return 0 @@ -92,6 +93,7 @@ var/global/datum/controller/gameticker/ticker else src.mode = config.pick_mode(master_mode) if (!src.mode.can_start()) + msg_scopes("Well we can't continue can_start") world << "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby." del(mode) current_state = GAME_STATE_PREGAME @@ -104,6 +106,7 @@ var/global/datum/controller/gameticker/ticker if(!can_continue) del(mode) current_state = GAME_STATE_PREGAME + msg_scopes("Well we can't continue pre_setup") world << "Error setting up [master_mode]. Reverting to pre-game lobby." job_master.ResetOccupations() return 0 diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 188108cf..6d0db3d7 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -52,16 +52,19 @@ var/list/datum/mind/possible_vampires = get_players_for_role(BE_VAMPIRE) for(var/datum/mind/player in possible_vampires) - for(var/job in restricted_jobs)//Removing robots from the list +//This could be the fuckup with game start + if(player.current.client.prefs.species == "Machine") + possible_vampires -= player + msg_scopes("[player.key] has an invalid mob for this role.") + continue + for(var/job in restricted_jobs) if(player.assigned_role == job) possible_vampires -= player - continue -//This could be the fuckup with game start -// if(player.current.isipc()) -// possible_vampires -= player + msg_scopes("[player.key] has an invalid job for this role.") + break vampire_amount = max(1,round(num_players() / 10)) //1 + round(num_players() / 10) - + msg_scopes("vampire_amount: [vampire_amount]") if(possible_vampires.len>0) for(var/i = 0, i < vampire_amount, i++) if(!possible_vampires.len) break @@ -71,6 +74,7 @@ modePlayer += vampires return 1 else + msg_scopes("possible_vampires went poof") return 0 /datum/game_mode/vampire/post_setup() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7e566fc6..c0619058 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -11,11 +11,17 @@ var/global/floorIsLava = 0 if(R_ADMIN & C.holder.rights) C << msg +/proc/message_mods(var/msg) + msg = "MOD LOG: [msg]" + for(var/client/C in admins) + if(R_MOD & C.holder.rights) + C << msg + /proc/msg_admin_attack(var/text) //Toggleable Attack Messages log_attack(text) var/rendered = "ATTACK: [text]" for(var/client/C in admins) - if(R_MOD || R_ADMIN & C.holder.rights) + if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights)) if(C.prefs.toggles & CHAT_ATTACKLOGS) var/msg = rendered C << msg @@ -28,14 +34,18 @@ var/global/floorIsLava = 0 set name = "Show Player Panel" set desc="Edit player (respawn, ban, heal, etc)" + if(!check_rights(R_ADMIN|R_MOD)) return + if(!M) usr << "You seem to be selecting a mob that doesn't exist anymore." return +/* if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return +*/ var/body = "Options for [M.key]" body += "Options panel for [M]" @@ -192,11 +202,14 @@ var/global/floorIsLava = 0 /datum/admins/proc/PlayerNotes() set category = "Admin" set name = "Player Notes" - if (!istype(src,/datum/admins)) +/* if (!istype(src,/datum/admins)) src = usr.client.holder if (!istype(src,/datum/admins)) usr << "Error: you are not an admin!" return +*/ + if(!check_rights(R_ADMIN|R_MOD)) + return PlayerNotesPage(1) /datum/admins/proc/PlayerNotesPage(page) @@ -246,7 +259,6 @@ var/global/floorIsLava = 0 if(!infos || !infos.len) return 0 else return 1 - /datum/admins/proc/show_player_info(var/key as text) set category = "Admin" set name = "Show Player Info" @@ -855,7 +867,7 @@ var/global/floorIsLava = 0 set desc="Delay the game start/end" set name="Delay" - if(!check_rights(R_SERVER|R_DEV)) return + if(!check_rights(R_SERVER|R_DEBUG)) return if (!ticker || ticker.current_state != GAME_STATE_PREGAME) ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6ff00af9..7cbe3a61 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,17 +1,17 @@ //admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless var/list/admin_verbs_default = list( - /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ /client/proc/player_panel, /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/ /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/ /client/proc/hide_verbs, /*hides all our adminverbs*/ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/ - /client/proc/check_antagonists, /*shows all antags*/ /client/proc/cmd_mentor_check_new_players // /client/proc/deadchat /*toggles deadchat on/off*/ ) var/list/admin_verbs_admin = list( + /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ + /client/proc/check_antagonists, /*shows all antags*/ /client/proc/alertlevels, /client/proc/cmd_admin_wind, /client/proc/cmd_admin_unwind, @@ -53,11 +53,11 @@ var/list/admin_verbs_admin = list( /client/proc/check_antagonists, /client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ - /client/proc/toggleprayers, /*toggles prayers on/off*/ // /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/ /client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/secrets, + /client/proc/toggleprayers, /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ /datum/admins/proc/togglelooc, /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ @@ -96,7 +96,7 @@ var/list/admin_verbs_fun = list( /client/proc/cmd_admin_dress, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, - /client/proc/everyone_random, + /client/proc/everyone_random, /client/proc/cinematic, /client/proc/one_click_antag, /datum/admins/proc/toggle_aliens, @@ -112,8 +112,6 @@ var/list/admin_verbs_fun = list( var/list/admin_verbs_dev = list( /client/proc/dsay, /client/proc/togglebuildmodeself, - /datum/admins/proc/restart, - /datum/admins/proc/delay, /client/proc/giveruntimelog, /client/proc/getruntimelog, /client/proc/cmd_admin_list_open_jobs, @@ -128,12 +126,11 @@ var/list/admin_verbs_dev = list( /client/proc/cmd_admin_delete, /client/proc/cmd_debug_del_all, /client/proc/cmd_debug_tog_aliens, + /datum/admins/proc/restart, /client/proc/air_report, /client/proc/reload_admins, /client/proc/restart_controller, /client/proc/enable_debug_verbs, - /client/proc/callproc, - /client/proc/toggleattacklogs, /client/proc/toggledebuglogs, /client/proc/SDQL_query, /client/proc/SDQL2_query, @@ -168,8 +165,10 @@ var/list/admin_verbs_server = list( /client/proc/check_customitem_activity ) var/list/admin_verbs_debug = list( - /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/ + /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/ /client/proc/cmd_admin_list_open_jobs, + /datum/admins/proc/restart, + /datum/admins/proc/delay, /client/proc/Debug2, /client/proc/kill_air, /client/proc/ZASSettings, @@ -188,7 +187,6 @@ var/list/admin_verbs_debug = list( /client/proc/toggledebuglogs, /client/proc/SDQL_query, /client/proc/SDQL2_query, - /client/proc/cmd_dev_bst, /client/proc/cmd_dev_reset_gravity ) var/list/admin_verbs_possess = list( @@ -274,6 +272,8 @@ var/list/admin_verbs_hideable = list( /proc/release ) var/list/admin_verbs_mod = list( + /client/proc/check_antagonists, /*shows all antags*/ + /client/proc/cmd_admin_check_contents, /client/proc/cmd_admin_wind, /client/proc/cmd_admin_unwind, /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ @@ -281,15 +281,19 @@ var/list/admin_verbs_mod = list( /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/ /client/proc/toggleattacklogs, /client/proc/toggledebuglogs, + /client/proc/toggleprayers, /datum/admins/proc/PlayerNotes, /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/cmd_mod_say, + /client/proc/check_ai_laws, + /client/proc/jumptomob, /datum/admins/proc/show_player_info, /client/proc/player_panel_new, /client/proc/dsay, /datum/admins/proc/show_skills, /datum/admins/proc/show_player_panel, /client/proc/check_antagonists, + /datum/admins/proc/adjump, /client/proc/jobbans, /client/proc/cmd_admin_subtle_message /*send an message to somebody as a 'voice in their head'*/ ) @@ -520,7 +524,7 @@ var/list/admin_verbs_mod = list( #define AUTOBANTIME 10 /client/proc/warn(warned_ckey) - if(!check_rights(R_ADMIN)) return + if(!check_rights(R_ADMIN|R_MOD)) return if(!warned_ckey || !istext(warned_ckey)) return if(warned_ckey in admin_datums) @@ -797,6 +801,9 @@ var/list/admin_verbs_mod = list( /client/proc/playernotes() set name = "Show Player Info" set category = "Admin" + if(!check_rights(R_ADMIN|R_MOD)) + return + if(holder) holder.PlayerNotes() return diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 33d99f4f..4eaec1e5 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -364,13 +364,16 @@ X PM "} - switch(is_special_character(M)) - if(0) - dat += {"Traitor?"} - if(1) - dat += {"Traitor?"} - if(2) - dat += {"Traitor?"} + if(!check_rights(R_ADMIN|R_MOD)) + dat += {"Traitor?"} + else + switch(is_special_character(M)) + if(0) + dat += {"Traitor?"} + if(1) + dat += {"Traitor?"} + if(2) + dat += {"Traitor?"} dat += "" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 2f6d1f81..c5a17f72 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -33,7 +33,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(!msg) return var/original_msg = msg - + //explode the input msg into a list var/list/msglist = text2list(msg, " ") @@ -94,9 +94,11 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," msg = "\blue HELP: [get_options_bar(mob, 2, 1, 1)][ai_found ? " (CL)" : ""]: [msg]" //send this msg to all admins + var/admin_number_present = 0 var/admin_number_afk = 0 for(var/client/X in admins) if((R_ADMIN|R_MOD) & X.holder.rights) + admin_number_present++ if(X.is_afk()) admin_number_afk++ if(X.prefs.toggles & SOUND_ADMINHELP) @@ -106,7 +108,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," //show it to the person adminhelping too src << "PM to-Admins: [original_msg]" - var/admin_number_present = admins.len - admin_number_afk + admin_number_present = (admin_number_present - admin_number_afk) log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") if(admin_number_present <= 0) if(!admin_number_afk) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 64c2a887..c37fa1dc 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -31,7 +31,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that set category = "Debug" set name = "Advanced ProcCall" - if(!check_rights(R_DEBUG|R_DEV)) return + if(!check_rights(R_DEBUG)) return spawn(0) var/target = null @@ -436,7 +436,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that GLOBAL_RADIO_TYPE = !GLOBAL_RADIO_TYPE // toggle log_admin("[key_name(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].") message_admins("[key_name_admin(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].", 0) - msg_scopes("[key_name_admin(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].", 0) + msg_scopes("[key_name_admin(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].", 1) feedback_add_details("admin_verb","SRM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_areatest() @@ -1103,11 +1103,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return /client/proc/startSinglo() - set category = "Debug" set name = "Start Singularity" set desc = "Sets up the singularity and all machines to get power flowing through the station" + if(!check_rights(R_DEBUG)) return + if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes") return diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index ca58c10d..093d0bd5 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -144,7 +144,7 @@ var/list/debug_verbs = list ( ,/client/proc/splash ,/client/proc/cmd_admin_areatest ,/client/proc/cmd_admin_rejuvenate - ,/datum/admins/proc/show_traitor_panel +// ,/datum/admins/proc/show_traitor_panel //What has this got to do with mapping ,/client/proc/print_jobban_old ,/client/proc/print_jobban_old_filter ,/client/proc/forceEvent diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 2bf70822..ac356eae 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -264,6 +264,10 @@ var/list/forbidden_varedit_object_types = list( if("marked datum") L[L.Find(variable)] = holder.marked_datum + world.log << "### VarEdit by [src]: [variable]=[html_encode("[L[L.Find(variable)]]")]" + log_admin("[key_name(src)] modified [variable] to [L[L.Find(variable)]]") + message_admins("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1) + msg_scopes("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1) // Tell dev's to but not log twice /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) if(!check_rights(R_VAREDIT|R_DEV)) return @@ -498,4 +502,4 @@ var/list/forbidden_varedit_object_types = list( world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]" log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]") message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1) - msg_scopes("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1) // Tell dev's to but look at the logs + msg_scopes("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1) // Tell dev's to but not log twice diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index e2fa58f5..c183b4d6 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -20,7 +20,7 @@ msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" for(var/client/C in admins) - if(C.prefs.toggles & CHAT_PRAYER) + if(((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights)) && (C.prefs.toggles & CHAT_PRAYER)) C << msg usr << "Your prayers have been received by the gods." @@ -30,9 +30,13 @@ /proc/Centcomm_announce(var/text , var/mob/Sender , var/iamessage) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" - admins << msg + for(var/client/C in admins) + if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights)) + C << msg /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) msg = "\blue SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" - admins << msg + for(var/client/C in admins) + if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights)) + C << msg \ No newline at end of file diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index b3cdba60..378aed54 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -54,7 +54,7 @@ return cmd_admin_irc_pm() return - + //Logs all hrefs @@ -155,6 +155,12 @@ if(holder) add_admin_verbs() admin_memo_show() + if(!ooc_allowed) + src << "OOC is Disabled" + if(!looc_allowed) + src << "LOOC is Disabled" + if(!dsay_allowed) + src << "Deadchat is Disabled" log_client_to_db() @@ -255,7 +261,7 @@ //send resources to the client. It's here in its own proc so we can move it around easiliy if need be /client/proc/send_resources() // preload_vox() //Causes long delays with initial start window and subsequent windows when first logged in. - + getFiles( 'html/search.js', 'html/panels.css', diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 9d88a467..4f101779 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -59,10 +59,11 @@ var/scheduledEvent = null set name = "Trigger Event (Debug Only)" set category = "Debug" + if(!check_rights(R_DEBUG)) return + if(!holder) return if(ispath(type)) new type message_admins("[key_name_admin(usr)] has triggered an event. ([type])", 1) - msg_scopes("[key_name_admin(usr)] has triggered an event. ([type])", 0) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 342dde47..385885bd 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -18,9 +18,11 @@ if(matches) if(M.client) message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_mods("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].") log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_mods("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ") log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() @@ -56,4 +58,4 @@ if(H.species && H.species.abilities) client.verbs |= H.species.abilities - nanomanager.send_resources(client) + nanomanager.send_resources(client) \ No newline at end of file diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 31f32143..b4289730 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -350,6 +350,7 @@ field_generator power level display if(O.last_warning && temp) if((world.time - O.last_warning) > 50) //to stop message-spam temp = 0 + message_mods("A singulo exists and a containment field has failed.") message_admins("A singulo exists and a containment field has failed.",1) investigate_log("has failed whilst a singulo exists.","singulo") O.last_warning = world.time diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 85cd68cd..599d0af3 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -87,9 +87,8 @@ if(href_list["togglep"]) src.toggle_power() investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo") - if (active) - message_admins("PA Control Computer turned ON by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])") + message_admins("PA Control Computer turned [active?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + log_game("PA Control Computer turned [active?"ON":"OFF"] by [usr.ckey]([usr]) in ([x],[y],[z])") else if(href_list["scan"]) src.part_scan() else if(href_list["strengthup"]) @@ -109,6 +108,8 @@ if(strength < 0) strength = 0 else + message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + log_game("PA Control Computer decreased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") investigate_log("decreased to [strength] by [usr.key]","singulo") for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = strength diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index ba7bc25d..010bcd61 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -102,7 +102,9 @@ var/global/list/uneatable = list( /obj/machinery/singularity/proc/admin_investigate_setup() last_warning = world.time var/count = locate(/obj/machinery/containment_field) in orange(30, src) - if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) + if(!count) + message_mods("A singulo has been created without containment fields active ([x],[y],[z])") + message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) investigate_log("was created. [count?"":"No containment fields were active"]","singulo") /obj/machinery/singularity/proc/dissipate() @@ -166,6 +168,10 @@ var/global/list/uneatable = list( dissipate_delay = 10 dissipate_track = 0 dissipate_strength = 10 + investigate_log("turned to a stage 4","singulo") + message_mods("Singluo is at stage 4 ([x],[y],[z] - JMP)") + message_admins("Singluo is at stage 4 ([x],[y],[z] - JMP)",0,1) + log_game("Singluo turned to a stage 4 ([x],[y],[z])") if(9)//this one also lacks a check for gens because it eats everything current_size = 9 icon = 'icons/effects/288x288.dmi' diff --git a/html/changelog.html b/html/changelog.html index 1eb93bb8..f9e4209e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,23 @@ should be listed in the changelog upon commit though. Thanks. --> +
+

13 September 2014

+

SoundScopes updated:

+
    +
  • Forensics
  • +
  • Custom Loadout - Berets
  • +
  • Custom Loadout - Universal Recorder
  • +
  • Custom Loadout - Camera
  • +
  • Custom Loadout - Clipboard
  • +
  • Poisonous plants you'll now eat in a single bite
  • +
  • Death nettles buffed significantly
  • +
  • Tcomms runtime fix. NOTE: Rest of Tcomms does not actually work
  • +
  • New hairstyles
  • +
+
+ +

6 September 2014

SoundScopes updated:

From 2666aef655b8af491b87b0e8856a7c61e49e1c5e Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Sun, 14 Sep 2014 23:01:54 +0100 Subject: [PATCH 04/18] Hardsuit Fix Medical Helmets work on Tajaran and Unathi --- code/modules/clothing/spacesuits/alien.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 381259b8..9af5880e 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -390,14 +390,14 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding." icon_state = "rig0-medical" item_state = "medical_helm" - species_restricted = list("tajara") + species_restricted = list("Tajaran") /obj/item/clothing/head/helmet/space/rig/medical/unathi name = "medical hardsuit helmet" desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding." icon_state = "rig0-medical" item_state = "medical_helm" - species_restricted = list("unathi") + species_restricted = list("Unathi") /obj/item/clothing/head/helmet/space/rig/medical/skrell name = "medical hardsuit helmet" From bb5de59a6e82217253e28b09383c7b45e7180461 Mon Sep 17 00:00:00 2001 From: Duck- Date: Sun, 14 Sep 2014 22:38:22 -0400 Subject: [PATCH 05/18] Vamp buffs, isocubes (needs sprite), other stuff Vamps: Hypnotize now a free power, cooldown increased. Space bats nerfed, but ability now summons two as before since they don't kill each other anymore. Vampjaunt brought back down to thirty. Holy water ignites and burns vamps. Laserpointer permablinding severely nerfed. Bad idea in retrospect. Added things to custom gear prefs. All energy weapons made more accurate, to compare with bulletweapons being generally way more deadly. Snipers/modulasers accuracy buffed, to account for aiming at a distance being broken. Isocubes. They're done but need a sprite. Pocket dimension that you suck highly dangerous criminals into. Spell edits were mostly to contain wizards and vamps from poofing out, which would cause them to be permastunned since only getting ejected removes the permastun. --- aurora.dme | 1 + code/datums/spell.dm | 2 +- code/datums/spells/area_teleport.dm | 6 +- code/game/gamemodes/vampire/vampire.dm | 2 +- code/game/gamemodes/vampire/vampire_powers.dm | 20 +-- code/game/objects/items/devices/isocube.dm | 133 ++++++++++++++++++ .../objects/items/devices/laserpointer.dm | 8 +- code/game/objects/items/weapons/scrolls.dm | 6 +- code/modules/client/preferences_gear.dm | 29 ++++ .../living/carbon/human/human_attackhand.dm | 2 + .../mob/living/simple_animal/hostile/bat.dm | 6 +- code/modules/projectiles/guns/energy.dm | 1 + .../projectiles/guns/energy/erifles.dm | 2 +- .../projectiles/guns/energy/modular.dm | 6 +- code/modules/projectiles/projectile.dm | 2 +- code/modules/reagents/Chemistry-Reagents.dm | 10 +- data/investigate/gravity.html | 4 +- 17 files changed, 207 insertions(+), 33 deletions(-) create mode 100644 code/game/objects/items/devices/isocube.dm diff --git a/aurora.dme b/aurora.dme index 558067c9..f9a8cc50 100644 --- a/aurora.dme +++ b/aurora.dme @@ -552,6 +552,7 @@ #include "code\game\objects\items\devices\debugger.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\isocube.dm" #include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 64371dfe..7dafef5d 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -46,7 +46,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin usr << "\red You shouldn't have this spell! Something's wrong." return 0 - if(usr.z == 2 && !centcomm_cancast) //Certain spells are not allowed on the centcomm zlevel + if(usr.z == 2 && !centcomm_cancast || usr.weakened > 100) //Certain spells are not allowed on the centcomm zlevel return 0 if(!skipcharge) diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 7f7e6613..58a2be60 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -60,9 +60,10 @@ else break - if(!success) + if(target.weakened > 100)//if you are megastunned by the isocube, there is no escape + target <<"An outside force prevents you from teleporting." + else if(!success) target.loc = pick(L) - return /obj/effect/proc_holder/spell/targeted/area_teleport/invocation(area/chosenarea = null) @@ -78,5 +79,4 @@ playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) if("whisper") usr.whisper("[invocation] [uppertext(chosenarea.name)]") - return \ No newline at end of file diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 188108cf..cecbd0fa 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -289,7 +289,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha blood = min(10, H.vessel.get_reagent_amount("blood"))// if they have less than 10 blood, give them the remnant else they get 10 blood src.mind.vampire.bloodtotal += blood src.mind.vampire.bloodusable += blood - H.adjustCloneLoss(10) // beep boop 10 damage +// H.adjustCloneLoss(10) // beep boop 10 damage //probably not necessary actually honestly okay else blood = min(5, H.vessel.get_reagent_amount("blood"))// The dead only give 5 bloods src.mind.vampire.bloodtotal += blood diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 4ad1c547..1d682eab 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -98,12 +98,12 @@ /client/vampire/proc/vampire_hypnotise() set category = "Abilities" - set name = "Hypnotise (20)" + set name = "Hypnotise" // (20) set desc= "A piercing stare that incapacitates your victim for a good length of time." var/datum/mind/M = usr.mind if(!M) return - var/mob/living/carbon/C = M.current.vampire_active(20, 0, 1) + var/mob/living/carbon/C = M.current.vampire_active(0, 0, 1) //(20, 0, 1) if(!C) return if(C==usr) @@ -111,9 +111,9 @@ return M.current.visible_message("[M]'s eyes flash briefly as he stares into [C.name]'s eyes") // M.current.remove_vampire_blood(20) Moved to remove if it works only. - if(M.current.vampire_power(20, 0)) + if(M.current.vampire_power(0, 0)) //if(M.current.vampire_power(20, 0)) M.current.verbs -= /client/vampire/proc/vampire_hypnotise - spawn(900) + spawn(1200) M.current.verbs += /client/vampire/proc/vampire_hypnotise if(do_mob(M.current, C, 50)) if(C.mind && C.mind.vampire) @@ -126,7 +126,7 @@ C.Weaken(20) C.Stun(20) C.stuttering = 20 - M.current.remove_vampire_blood(20) +// M.current.remove_vampire_blood(20) else M.current << "\red You broke your gaze." return @@ -379,7 +379,7 @@ new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current) else // we had no good locations so make two on top of us new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current) -// new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current) + new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current) M.current.remove_vampire_blood(60) M.current.verbs -= /client/vampire/proc/vampire_bats spawn(1200) M.current.verbs += /client/vampire/proc/vampire_bats @@ -387,13 +387,13 @@ /client/vampire/proc/vampire_jaunt() //AHOY COPY PASTE INCOMING set category = "Abilities" - set name = "Mist Form (45)" + set name = "Mist Form (30)" set desc = "You take on the form of mist for a short period of time." var/jaunt_duration = 50 //in deciseconds var/datum/mind/M = usr.mind if(!M) return - if(M.current.vampire_power(45, 0)) + if(M.current.vampire_power(30, 0)) if(M.current.buckled) M.current.buckled.unbuckle() spawn(0) var/originalloc = get_turf(M.current.loc) @@ -407,6 +407,8 @@ animation.layer = 5 animation.master = holder M.current.ExtinguishMob() + M.current.weakened = 0 + M.current.stunned = 0 if(M.current.buckled) M.current.buckled.unbuckle() flick("liquify",animation) @@ -437,7 +439,7 @@ M.current.client.eye = M.current del(animation) del(holder) - M.current.remove_vampire_blood(45) + M.current.remove_vampire_blood(30) M.current.verbs -= /client/vampire/proc/vampire_jaunt spawn(600) M.current.verbs += /client/vampire/proc/vampire_jaunt diff --git a/code/game/objects/items/devices/isocube.dm b/code/game/objects/items/devices/isocube.dm new file mode 100644 index 00000000..e7305d87 --- /dev/null +++ b/code/game/objects/items/devices/isocube.dm @@ -0,0 +1,133 @@ +/obj/item/device/isocube + name = "Isocube" + icon = 'icons/obj/wizard.dmi' + icon_state = "soulstone" + item_state = "electronic" + desc = "two weeks in the isocubes." + w_class = 3 + unacidable = 1 + flags = FPRINT | TABLEPASS + slot_flags = SLOT_BELT + origin_tech = "bluespace=4;materials=4" + + + +//////////////////////////////Capturing//////////////////////////////////////////////////////// + + 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..() + + if(M.has_brain_worms()) //Borer stuff - RR + user << "The isocube spits out an error message: multiple lifeforms detected." + return..() + + M.attack_log += text("\[[time_stamp()]\] Has been imprisoned with [src.name] by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to imprison [M.name] ([M.ckey])") + msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to imprison [M.name] ([M.ckey]) (JMP)") + + isolate("VICTIM", M, user) + return + + attack_self(mob/user) + if (!in_range(src, user)) + return + user.set_machine(src) + var/dat = "Isocube
" + for(var/mob/living/carbon/human/A in src) + dat += "Prisoner: [A.name]
" + dat += {"Release Prisoner"} + dat += "
" + dat += {"Disable Prisoner"} + dat += "
" + dat += {"Enable Prisoner"} + dat += "
" + dat += {" Close"} + user << browse(dat, "window=aicard") + onclose(user, "aicard") + return + + + + + Topic(href, href_list) + var/mob/U = usr + if (!in_range(src, U)||U.machine!=src) + U << browse(null, "window=aicard") + U.unset_machine() + return + + add_fingerprint(U) + U.set_machine(src) + + switch(href_list["choice"])//Now we switch based on choice. + if ("Close") + U << browse(null, "window=aicard") + U.unset_machine() + return + + if ("Release") + for(var/mob/living/carbon/human/A in src) + A.status_flags &= ~GODMODE + A.canmove = 1 + A << "You feel a sickening lurch as the isocube dumps you out, weak and disoriented." + for(var/mob/O in viewers(U, null)) + O.show_message(text("[U] fiddles with the isocube, releasing [A]!"), 1) + A.loc = U.loc + A.weakened = 10 + A.paralysis = 0 + A.cancel_camera() + src.icon_state = "soulstone" + if ("Disable") + for(var/mob/living/carbon/human/A in src) + if (A.paralysis < 100) + A << "You feel a sudden, crippling agony, then darkness creeps over you." + for(var/mob/O in viewers(U, null)) + O.show_message(text("You hear an ominous crunch."), 1) + A.paralysis = 9000000 + if ("Enable") + for(var/mob/living/carbon/human/A in src) + if (A.paralysis > 10) + A << "You feel a jolt of consciousness." + for(var/mob/O in viewers(U, null)) + O.show_message(text("Something whirrs."), 1) + A.paralysis = 0 + attack_self(U) + + +/obj/item/proc/isolate(var/choice as text, var/target, var/mob/U as mob). + if("VICTIM") + var/mob/living/carbon/human/T = target + var/obj/item/device/isocube/C = src + + if(C.contents.len) + U << "\red The isocube is full!" + else if (U == T) + U << "\red The isocube's safeties prevent you from capturing yourself." + return + else + for(var/mob/O in viewers(U, null)) + O.show_message("\red [U] is trying to pull [T] into an isocube!", 1) + var/turf/p_loc = U.loc + var/turf/p_loc_m = T.loc + spawn(30) + if(!T) return + if(p_loc == U.loc && p_loc_m == T.loc) +/* var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = T + flick("dust-h", animation) + del(animation)*/ + T.loc = C //put dummy in isocube + T.status_flags |= GODMODE //So they won't die inside the stone somehow + T.canmove = 0//Can't move out of the soul stone + if (T.client) + T.cancel_camera() + C.icon_state = "soulstone2" + T << "You feel a heavy weightlessness and find yourself barely able to move. The outside world seems larger." + U << "\blue [T.real_name] has been successfully captured within the isocube. " + T.Weaken(9000000) + return \ No newline at end of file diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index e175ff46..916307de 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -120,26 +120,26 @@ C << "A small, bright dot appears in your vision." if(1) //industrial grade eye protection - E.damage += rand(0, 2) + //E.damage += rand(0, 2) C << "Something bright flashes in the corner of your vision!" if(2) //basic eye protection (sunglasses) flick("flash", C.flash) - E.damage += rand(2, 4) + //E.damage += rand(2, 4) C << "Your eyes were blinded!" if(3) //no eye protection if(prob(10)) C.Weaken(1) flick("e_flash", C.flash) - E.damage += rand(3, 5) + E.damage += 1 C << "Your eyes were blinded!" if(4) //the effect has been worsened by something if(prob(5)) C.Weaken(1) flick("e_flash", C.flash) - E.damage += rand(5, 10) + E.damage += 2 C << "Your eyes were blinded!" else outmsg = "You fail to blind [C] by shining [src] at their eyes." diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index cca97f3e..9599e097 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -83,8 +83,10 @@ else break - if(!success) - user.loc = pick(L) + if(user.weakened > 100)//if you are megastunned by the isocube, there is no escape + user <<"An outside force prevents you from teleporting." + else if(!success) + user.loc = pick(L) smoke.start() src.uses -= 1 \ No newline at end of file diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index b6e56186..5d85566f 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -41,6 +41,21 @@ proc/populate_gear_list() path = /obj/item/weapon/cane cost = 2 +/datum/gear/briefcase + display_name = "briefcase" + path = /obj/item/weapon/storage/briefcase + cost = 2 + +/datum/gear/securebriefcase + display_name = "secure briefcase" + path = /obj/item/weapon/storage/secure/briefcase + cost = 3 + +/datum/gear/zippolighter + display_name = "zippo lighter" + path = /obj/item/weapon/lighter/zippo + cost = 1 + /datum/gear/recorder display_name = "universal recorder" path = /obj/item/device/taperecorder @@ -56,6 +71,20 @@ proc/populate_gear_list() path = /obj/item/weapon/clipboard cost = 1 +/datum/gear/redpen + display_name = "red pen" + path = /obj/item/weapon/pen/red + cost = 1 + +/datum/gear/bluepen + display_name = "blue pen" + path = /obj/item/weapon/pen/blue + cost = 1 + +/datum/gear/flask + display_name = "flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask + cost = 2 /datum/gear/tie_horrible display_name = "horrible tie" diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 9d9f1145..37e56896 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -133,6 +133,8 @@ src.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [M.name] ([M.ckey])") msg_admin_attack("[M.name] ([M.ckey]) bit [src.name] ([src.ckey]) in the neck") M.handle_bloodsucking(src) +// var/datum/organ/external/affecting = get_organ(src.zone_sel.selecting) +// affecting.take_damage(10,0,1,0,"dual puncture marks") //this does not work and causes runtimes. return //end vampire codes M.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [src.name] ([src.ckey])") diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index 32e38ce9..5487e317 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -13,11 +13,11 @@ response_disarm = "gently pushes aside the" response_harm = "hits the" speed = 4 - maxHealth = 70 - health = 70 + maxHealth = 45 + health = 45 harm_intent_damage = 8 - melee_damage_lower = 15 + melee_damage_lower = 10 melee_damage_upper = 15 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index bda822eb..ebac699d 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -9,6 +9,7 @@ var/cell_type = "/obj/item/weapon/cell" var/projectile_type = "/obj/item/projectile/beam/practice" var/modifystate + rangedrop = -5 // energy weapons more accurate than bulletweapons. isHandgun() return 0 diff --git a/code/modules/projectiles/guns/energy/erifles.dm b/code/modules/projectiles/guns/energy/erifles.dm index 9fda55e1..1c147a72 100644 --- a/code/modules/projectiles/guns/energy/erifles.dm +++ b/code/modules/projectiles/guns/energy/erifles.dm @@ -135,7 +135,7 @@ Commenting out right now, due to a lack of sprites existing. I hate on-mob weapo fire_delay_unwielded = 105 //3x difference, let's be an arse about this, and push the issue var/zoom = 0 - accuracy = -90 + accuracy = -110 rangedrop = -5 // fully accurate up to first 10 tiles. the last 4 zoomed tiles you are on your /obj/item/weapon/gun/energy/rifle/sniperrifle/dropped(mob/user) diff --git a/code/modules/projectiles/guns/energy/modular.dm b/code/modules/projectiles/guns/energy/modular.dm index bc4b5b14..7b218704 100644 --- a/code/modules/projectiles/guns/energy/modular.dm +++ b/code/modules/projectiles/guns/energy/modular.dm @@ -310,16 +310,16 @@ accuracy = 30 //positive. subtracts to 0 accuracy base, 30 if aimed. fully accurate up to two tiles *if aimed*, -15% per tile after canzoom = 0 else if(targetmod.rating == 1) - rangedrop = 5 + rangedrop = 0 accuracy = -30 //standard accuracy. standard gun. canzoom = 0 else if(targetmod.rating == 2) - rangedrop = 5 + rangedrop = 0 accuracy = -60 //Fully accurate up to 6 tiles aimed. 15% drop per tile after that for ~-120% accuracy at 14 tiles. If you want to snipe things, get phasic. canzoom = 1 //advanced and up scanning modules let you zoom in. good luck hitting without phasic though pal. good luck. else if(targetmod.rating == 3) rangedrop = -5 //Accurate aimed up to 12 tiles. 20% miss at 14. 9 tiles and 50% miss at 14 without aiming. - accuracy = -90 //If you're paying a premium for accuracy, you can have accuracy. + accuracy = -110 //If you're paying a premium for accuracy, you can have accuracy. canzoom = 1 if(!powermod) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ca3e127d..e57d13e6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -94,7 +94,7 @@ if (daddy.target && original in daddy.target) //As opposed to no-delay pew pew miss_modifier += -30 def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 15*distance + daddy.accuracy + daddy.rangedrop) // add +daddy.missmod vars to gun and this. snowflake accuracy -//moving def_zone to be a child of the daddyblock because i need the daddy +//moving def_zone to be a child of the daddyblock because i need the daddy. all projectiles should be fired from guns anyway if(!def_zone) visible_message("\blue \The [src] misses [M] narrowly!") forcedodge = -1 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index ae505252..4cfa1d3c 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -278,7 +278,7 @@ datum description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." color = "#E0E8EF" // rgb: 224, 232, 239 - on_mob_life(var/mob/living/M as mob) + on_mob_life(var/mob/living/carbon/human/M as mob) if(ishuman(M)) if((M.mind in ticker.mode.cult) && prob(10)) M << "\blue A cooling sensation from inside you brings you an untold calmness." @@ -288,8 +288,10 @@ datum if((M.mind in ticker.mode.vampires) && (M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers))) if(!M) M = holder.my_atom M.adjustFireLoss(6) + M.adjust_fire_stacks(1) + M.IgniteMob() //M.take_organ_damage(0, 1*REM) - if(prob(50)) + if(prob(20)) for(var/mob/O in viewers(M, null)) O.show_message(text("\red []'s skin sizzles and burns.", M), 1) holder.remove_reagent(src.id, 10 * REAGENTS_METABOLISM) //high metabolism to prevent extended uncult rolls. @@ -1468,8 +1470,10 @@ datum if((M.mind in ticker.mode.vampires) && (M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers))) if(!M) M = holder.my_atom M.adjustFireLoss(6) + M.adjust_fire_stacks(1) + M.IgniteMob() //M.take_organ_damage(0, 1*REM) - if(prob(50)) + if(prob(20)) for(var/mob/O in viewers(M, null)) O.show_message(text("\red []'s skin sizzles and burns.", M), 1) holder.remove_reagent(src.id, 10 * REAGENTS_METABOLISM) //high metabolism to prevent extended uncult rolls. diff --git a/data/investigate/gravity.html b/data/investigate/gravity.html index 5c7ddcdb..6e9bdfb9 100644 --- a/data/investigate/gravity.html +++ b/data/investigate/gravity.html @@ -1,2 +1,2 @@ -01:55 [0x20077bc] (92,152,1) || the gravitational generator has regained power.
-01:55 [0x20077bc] (92,152,1) || the gravitational generator is now charging.
+21:57 [0x20077ba] (92,152,1) || the gravitational generator has regained power.
+21:57 [0x20077ba] (92,152,1) || the gravitational generator is now charging.
From 9edb8355de4d41197d4ded269350d8b649184856 Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Mon, 15 Sep 2014 10:11:31 +0100 Subject: [PATCH 06/18] Area RP Sounds Just like the make sound option on objects, except this one if for area. Just right click on a turf, select it to make a sound or narrate to that room/area. --- code/modules/admin/admin_verbs.dm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7cbe3a61..25ad7724 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -105,6 +105,7 @@ var/list/admin_verbs_fun = list( /client/proc/cmd_admin_add_freeform_ai_law, /client/proc/cmd_admin_add_random_ai_law, /client/proc/make_sound, + /client/proc/make_area_sound, /client/proc/toggle_random_events, /client/proc/set_ooc, /client/proc/editappear @@ -238,6 +239,7 @@ var/list/admin_verbs_hideable = list( /client/proc/cmd_admin_add_random_ai_law, /client/proc/cmd_admin_create_centcom_report, /client/proc/make_sound, + /client/proc/make_area_sound, /client/proc/toggle_random_events, /client/proc/cmd_admin_add_random_ai_law, /client/proc/Set_Holiday, @@ -662,6 +664,23 @@ var/list/admin_verbs_mod = list( message_admins("\blue [key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound", 1) feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/make_area_sound(var/turf/T in world) // -- TLE + set category = "Special Verbs" + set name = "Make Area Sound" + set desc = "Display a message to everyone in the area (Experimental)" + if(T) + var/message = input("What do you want the message to be?", "Make Area Sound (Experimental)") as text|null + if(!message) + return + var/area/A = get_area(T) + if(!A == A.master) + A = A.master + for(var/area/SubA in A.related) + for (var/mob/V in SubA) + V.show_message(message, 2) + log_admin("[key_name(usr)] made [A.name] make a sound") + message_admins("\blue [key_name_admin(usr)] made [A.name] make a sound", 1) + feedback_add_details("admin_verb","MAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" From 16974b0c7b897c7aee83736a04591be0453405a2 Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Tue, 16 Sep 2014 16:42:30 +0100 Subject: [PATCH 07/18] Cencomm Message - 10 minute cooldown - Admins can now reply - AI's send their message through Alice. --- code/modules/admin/topic.dm | 14 ++++++++++++++ code/modules/admin/verbs/pray.dm | 8 ++++++-- code/modules/mob/living/silicon/ai/ai.dm | 6 +++--- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 5779bc7f..0962598b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1470,6 +1470,20 @@ log_admin("[src.owner] replied to [key_name(H)]'s Syndicate message with the message [input].") H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. \"[input]\" Message ends.\"" + else if(href_list["CentcommAIReply"]) + var/mob/living/silicon/ai/H = locate(href_list["CentcommAIReply"]) + if(!istype(H)) + usr << "This can only be used on instances of type /mob/living/silicon" + return + + var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via encripted.","Outgoing message from Central Command", "") + if(!input) return + + src.owner << "You sent [input] to [H] via a secure channel." + log_admin("[src.owner] replied to [key_name(H)]'s Centcomm message with the message [input].") + message_admins("[src.owner] replied to [key_name(H)]'s Centcom message with: \"[input]\"") + H << "An encripted connection was made and a file was uploaded to your systems. \"Please stand by for a message from Central Command. Message as follows. \"[input]\" Message ends.\"" + else if(href_list["CentcommFaxView"]) var/info = locate(href_list["CentcommFaxView"]) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index c183b4d6..7b214020 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -27,9 +27,13 @@ feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") -/proc/Centcomm_announce(var/text , var/mob/Sender , var/iamessage) +//Stealing the second var because why not) +/proc/Centcomm_announce(var/text , var/mob/Sender , var/silicon = 0 , var/iamessage) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + if(silicon) + msg = "\blue CENTCOMM(A.L.I.C.E.):[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + else + msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if((R_ADMIN & C.holder.rights) || (R_MOD & C.holder.rights)) C << msg diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 4b684828..00c72af6 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -747,12 +747,12 @@ var/list/ai_list = list() if(centcomm_message_cooldown) usr << "\red Arrays recycling. Please stand by." return - var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") + var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 10 minute delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") if(!input || !(usr in view(1,src))) return - Centcomm_announce(input, usr) + Centcomm_announce(input, usr, 1) usr << "\blue Message transmitted." log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]") centcomm_message_cooldown = 1 - spawn(300)//10 minute cooldown + spawn(6000)//10 minute cooldown centcomm_message_cooldown = 0 From b2582274436aa1a2005505fe712ab24278d2b734 Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Wed, 17 Sep 2014 14:34:00 +0100 Subject: [PATCH 08/18] Mod messages Messages for Mods --- Scopes Files/gravitygenerator.dm | 2 ++ code/datums/datumvars.dm | 1 - .../game/gamemodes/revolution/rp-revolution.dm | 1 + .../game/gamemodes/revolution/rp_revolution.dm | 1 + .../game/machinery/computer/HolodeckControl.dm | 4 +++- code/game/machinery/computer/arcade.dm | 1 + code/game/machinery/computer/communications.dm | 1 + code/game/machinery/computer/robot.dm | 3 +++ code/game/machinery/cryopod.dm | 1 + code/game/objects/effects/chemsmoke.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 2 ++ .../objects/items/devices/transfer_valve.dm | 8 +++++--- .../game/objects/items/weapons/dna_injector.dm | 4 ++++ .../objects/items/weapons/implants/implant.dm | 1 + code/game/objects/items/weapons/syndie.dm | 1 + code/game/objects/items/weapons/tanks/tanks.dm | 7 ++++--- code/game/objects/items/weapons/tools.dm | 1 + code/modules/admin/admin.dm | 5 ++++- code/modules/admin/admin_verbs.dm | 4 ++++ code/modules/admin/topic.dm | 2 ++ code/modules/assembly/bomb.dm | 1 + code/modules/aurora/weldbackpack.dm | 1 + code/modules/mob/living/silicon/ai/death.dm | 1 + .../silicon/robot/drone/drone_console.dm | 1 + code/modules/mob/living/silicon/robot/robot.dm | 1 + code/modules/mob/logout.dm | 1 + code/modules/power/cell.dm | 6 ++++-- code/modules/power/lighting.dm | 9 ++++++--- code/modules/power/singularity/emitter.dm | 3 +++ .../particle_accelerator/particle_control.dm | 3 +++ .../projectiles/guns/projectile/rocket.dm | 1 + code/modules/reagents/grenade_launcher.dm | 1 + code/modules/reagents/reagent_dispenser.dm | 4 ++++ html/changelog.html | 18 +++++++++++++++++- 34 files changed, 87 insertions(+), 16 deletions(-) diff --git a/Scopes Files/gravitygenerator.dm b/Scopes Files/gravitygenerator.dm index 245449aa..18d1e09b 100644 --- a/Scopes Files/gravitygenerator.dm +++ b/Scopes Files/gravitygenerator.dm @@ -346,6 +346,8 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi gravity_is_on = 0 investigate_log("was brought offline and there is now no gravity for this level.", "gravity") message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") + message_mods("The gravity generator was brought offline with no backup generator. ([area.name])") + update_icon() update_list() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index c8391ce3..6d65fcec 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -933,7 +933,6 @@ client if(amount != 0) log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - msg_scopes("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ", 1) href_list["datumrefresh"] = href_list["mobToDamage"] if(href_list["datumrefresh"]) diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm index 2fdf8af2..25858c30 100644 --- a/code/game/gamemodes/revolution/rp-revolution.dm +++ b/code/game/gamemodes/revolution/rp-revolution.dm @@ -296,6 +296,7 @@ mob/living/carbon/human/proc src << "\red Attempting to convert [M]..." log_admin("[src]([src.ckey]) attempted to convert [M].") message_admins("\red [src]([src.ckey]) attempted to convert [M].") + message_mods("\red [src]([src.ckey]) attempted to convert [M].") var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") if(choice == "Yes!") ticker.mode:add_revolutionary(M.mind) diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index fa64d90b..88ca9af0 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -186,6 +186,7 @@ src << "\red Attempting to convert [M]..." log_admin("[src]([src.ckey]) attempted to convert [M].") message_admins("\red [src]([src.ckey]) attempted to convert [M].") + message_mods("\red [src]([src.ckey]) attempted to convert [M].") var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") if(choice == "Yes!") ticker.mode:add_revolutionary(M.mind) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index f4a80c0a..9647d427 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -148,9 +148,11 @@ emagged = !emagged if(emagged) message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") + message_mods("[key_name_admin(usr)] overrode the holodeck's safeties") log_game("[key_name(usr)] overrided the holodeck's safeties") else message_admins("[key_name_admin(usr)] restored the holodeck's safeties") + message_mods("[key_name_admin(usr)] restored the holodeck's safeties") log_game("[key_name(usr)] restored the holodeck's safeties") src.add_fingerprint(usr) @@ -447,7 +449,7 @@ if(isrobot(user)) return - + ..() /obj/structure/table/holotable/wood diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 4cc773c5..ac066bf5 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -158,6 +158,7 @@ new /obj/effect/spawner/newbomb/timer/syndicate(src.loc) new /obj/item/clothing/head/collectable/petehat(src.loc) message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") + message_mods("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") src.New() emagged = 0 diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 157e9622..4ddb45ad 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -552,6 +552,7 @@ emergency_shuttle.incall(2) log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.") message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1) + message_mods("All the AIs, comm consoles and boards are destroyed. Shuttle called.") captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.") world << sound('sound/AI/shuttlecalled.ogg') diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index cdce6fdf..ed7c05d4 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -122,6 +122,7 @@ if(src.check_access(I)) if (!status) message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!") + message_mods("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!") log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!") src.status = 1 src.start_sequence() @@ -167,6 +168,7 @@ else message_admins("\blue [key_name_admin(usr)] detonated [R.name]!") + message_mods("\blue [key_name_admin(usr)] detonated [R.name]!") log_game("\blue [key_name_admin(usr)] detonated [R.name]!") R.self_destruct() else @@ -180,6 +182,7 @@ if(choice == "Confirm") if(R && istype(R)) message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") + message_mods("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") R.canmove = !R.canmove if (R.lockcharge) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 2f85c5f2..88649b08 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -324,6 +324,7 @@ obj/machinery/computer/cryopod/Topic(href, href_list) // Book keeping! log_admin("[key_name_admin(M)] has entered a stasis pod.") message_admins("\blue [key_name_admin(M)] has entered a stasis pod.") + message_mods("\blue [key_name_admin(M)] has entered a stasis pod.") //Despawning occurs when process() is called with an occupant without a client. src.add_fingerprint(M) diff --git a/code/game/objects/effects/chemsmoke.dm b/code/game/objects/effects/chemsmoke.dm index 4c245b78..9e107ebb 100644 --- a/code/game/objects/effects/chemsmoke.dm +++ b/code/game/objects/effects/chemsmoke.dm @@ -86,7 +86,7 @@ message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1) log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") else - message_admins("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", 0, 1) + message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. No associated key.", 0, 1) log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 6b6c45ab..9538cd81 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -760,10 +760,12 @@ var/global/list/obj/item/device/pda/PDAs = list() detonate_act(src) log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up") message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed.", 1) + message_mods("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed.") else U.show_message("\blue Success!", 1) log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded") message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded.", 1) + message_mods("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded.") detonate_act(P) else U << "No charges left." diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 7baa2e98..7c7a7153 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -52,6 +52,7 @@ bombers += "[key_name(user)] attached a [item] to a transfer valve." message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") + message_mods("[key_name_admin(user)] attached a [item] to a transfer valve.") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") attacher = user nanomanager.update_uis(src) // update all UIs attached to src @@ -66,7 +67,7 @@ /obj/item/device/transfer_valve/attack_self(mob/user as mob) ui_interact(user) - + /obj/item/device/transfer_valve/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) // this is the data which will be sent to the ui @@ -77,13 +78,13 @@ data["valveOpen"] = valve_open ? 1 : 0 // update the ui if it exists, returns null if no ui is passed/found - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm ui = new(user, src, ui_key, "transfer_valve.tmpl", "Tank Transfer Valve", 460, 280) // when the ui is first opened this is the data it will use - ui.set_initial_data(data) + ui.set_initial_data(data) // open the new ui window ui.open() // auto update every Master Controller tick @@ -191,6 +192,7 @@ log_str += " Last touched by: [src.fingerprintslast][last_touch_info]" bombers += log_str message_admins(log_str, 0, 1) + message_mods(log_str) log_game(log_str) merge_gases() spawn(20) // In case one tank bursts diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 39598e61..e65abf26 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -128,6 +128,7 @@ testing("Isolated block [block] injector with contents: [GetValue()]") if (GetState() && block == MONKEYBLOCK && istype(M, /mob/living/carbon/human) ) message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)") + message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)") log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)") log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)") else @@ -136,6 +137,7 @@ testing("DNA injector with contents: [english_list(buf.dna.SE)]") if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human) ) message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)") + message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)") log_attack("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)") log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)") else @@ -163,6 +165,7 @@ testing("Isolated block [block] injector with contents: [GetValue()]") if (GetState() && block == MONKEYBLOCK && istype(M, /mob/living/carbon/human) ) message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)") + message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)") log_attack("[key_name(user)] injected [key_name(M)] with the Isolated [name] (MONKEY)") log_game("[key_name_admin(user)] injected [key_name_admin(M)] with the Isolated [name] \red(MONKEY)") else @@ -171,6 +174,7 @@ testing("DNA injector with contents: [english_list(buf.dna.SE)]") if (GetState(MONKEYBLOCK) && istype(M, /mob/living/carbon/human)) message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)") + message_mods("[key_name_admin(user)] injected [key_name_admin(M)] with the [name] \red(MONKEY)") log_game("[key_name(user)] injected [key_name(M)] with the [name] (MONKEY)") else // message_admins("[key_name_admin(user)] injected [key_name_admin(M)] with the [name]") diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 0a7e2a51..eb98d587 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -163,6 +163,7 @@ Implant Specifics:
"} if(istype(imp_in, /mob/)) var/mob/T = imp_in message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") + message_mods("Explosive implant triggered in [T] ([T.key]). (JMP) ") log_game("Explosive implant triggered in [T] ([T.key]).") need_gib = 1 diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 4593bf93..a4da7142 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -77,6 +77,7 @@ src.bomb.detonate() log_admin("[user.real_name]([user.ckey]) has triggered [src.bomb] with [src].") message_admins("\red [user.real_name]([user.ckey]) has triggered [src.bomb] with [src].") + message_mods("\red [user.real_name]([user.ckey]) has triggered [src.bomb] with [src].") if("Close the lighter.") src.icon_state = "c-4detonator_0" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index d1e94df9..9c8dd739 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -27,7 +27,7 @@ src.air_contents.volume = volume //liters src.air_contents.temperature = T20C - processing_objects.Add(src) + processing_objects.Add(src) return /obj/item/weapon/tank/Del() @@ -141,8 +141,8 @@ data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE) data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE) data["valveOpen"] = using_internal ? 1 : 0 - - data["maskConnected"] = 0 + + data["maskConnected"] = 0 if(istype(loc,/mob/living/carbon)) var/mob/living/carbon/location = loc if(location.internal == src || (location.wear_mask && (location.wear_mask.flags & MASKINTERNALS))) @@ -239,6 +239,7 @@ if(pressure > TANK_FRAGMENT_PRESSURE) if(!istype(src.loc,/obj/item/device/transfer_valve)) message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") + message_mods("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") //world << "\blue[x],[y] tank is exploding: [pressure] kPa" //Give the gas a chance to build up more pressure through reacting diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index eb922967..974655df 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -260,6 +260,7 @@ tank.armed = 1 user.visible_message("[user] begins heating the [O].", "You start to heat the [O].") message_admins("[key_name_admin(user)] is attempting a welder bomb at ([loc.x],[loc.y],[loc.z]) - JMP") + message_mods("[key_name_admin(user)] is attempting a welder bomb at ([loc.x],[loc.y],[loc.z]) - JMP") if(do_after(user,100)) // var/obj/structure/reagent_dispensers/fueltank/tank = O if(tank.defuse) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c0619058..3380fd58 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -14,7 +14,7 @@ var/global/floorIsLava = 0 /proc/message_mods(var/msg) msg = "MOD LOG: [msg]" for(var/client/C in admins) - if(R_MOD & C.holder.rights) + if(R_MOD & C.holder.rights && !(R_ADMIN & C.holder.rights)) C << msg /proc/msg_admin_attack(var/text) //Toggleable Attack Messages @@ -872,6 +872,7 @@ var/global/floorIsLava = 0 ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_mods("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) return //alert("Round end delayed", null, null, null, null, null) going = !( going ) if (!( going )) @@ -1249,6 +1250,7 @@ proc/move_alien_ship() log_admin("[key_name(usr)] winded [key_name(M)]!") message_admins("[key_name_admin(usr)] winded [key_name_admin(M)]!", 1) + message_mods("[key_name_admin(usr)] winded [key_name_admin(M)]!") // feedback_add_details("admin_verb","WIND") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! // Chop chop. return @@ -1261,4 +1263,5 @@ proc/move_alien_ship() log_admin("[key_name(usr)] unwinded [key_name(M)]!") message_admins("[key_name_admin(usr)] unwinded [key_name_admin(M)]!", 1) + message_mods("[key_name_admin(usr)] unwinded [key_name_admin(M)]!", 1) return \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 25ad7724..a36c1aa6 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -546,18 +546,22 @@ var/list/admin_verbs_mod = list( ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.") if(C) message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban.") + message_mods("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban.") C << "You have been autobanned due to a warning by [ckey].
This is a temporary ban, it will be removed in [AUTOBANTIME] minutes." del(C) else message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.") + message_mods("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.") AddBan(warned_ckey, D.last_id, "Autobanning due to too many formal warnings", ckey, 1, AUTOBANTIME) feedback_inc("ban_warn",1) else if(C) C << "You have been formally warned by an administrator.
Further warnings will result in an autoban.
" message_admins("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") + message_mods("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") else message_admins("[key_name_admin(src)] has warned [warned_ckey] (DC). They have [MAX_WARNS-D.warns] strikes remaining.") + message_mods("[key_name_admin(src)] has warned [warned_ckey] (DC). They have [MAX_WARNS-D.warns] strikes remaining.") 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/topic.dm b/code/modules/admin/topic.dm index 0962598b..17dd1f06 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -248,6 +248,7 @@ ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_mods("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") href_list["secretsadmin"] = "check_antagonist" else if(href_list["simplemake"]) @@ -1524,6 +1525,7 @@ src.owner << "Message reply to transmitted successfully." log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]") message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]", 1) + message_mods("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]") else if(href_list["jumpto"]) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 303b1140..7d4e05f9 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -46,6 +46,7 @@ status = 1 bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]" message_admins("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]") + message_mods("[key_name_admin(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]") user << "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited." else status = 0 diff --git a/code/modules/aurora/weldbackpack.dm b/code/modules/aurora/weldbackpack.dm index 1bbedce2..7d7c9d61 100644 --- a/code/modules/aurora/weldbackpack.dm +++ b/code/modules/aurora/weldbackpack.dm @@ -18,6 +18,7 @@ var/obj/item/weapon/weldingtool/T = W if(T.welding & prob(50)) message_admins("[key_name_admin(user)] triggered a welderpack explosion at ([loc.x],[loc.y],[loc.z]) - JMP") + message_mods("[key_name_admin(user)] triggered a welderpack explosion at ([loc.x],[loc.y],[loc.z]) - JMP") log_game("[key_name(user)] triggered a fueltank explosion.") user << "\red That was stupid of you." explosion(get_turf(src),-1,0,2) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 52b59873..d95f9c19 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -42,6 +42,7 @@ emergency_shuttle.incall(2) log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.") message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1) + message_mods("All the AIs, comm consoles and boards are destroyed. Shuttle called.") captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.") world << sound('sound/AI/shuttlecalled.ogg') diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 82ee8c50..73727f8e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -90,6 +90,7 @@ if(D.stat != 2) usr << "\red You issue a kill command for the unfortunate drone." message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.") + message_mods("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.") log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.") D.shut_down() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 407ef126..16a3b62a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -731,6 +731,7 @@ connected_ai = null user << "You emag [src]'s interface." message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") + message_mods("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") clear_supplied_laws() clear_inherent_laws() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index 2460285a..77cfef8b 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -7,6 +7,7 @@ var/admins_number = admins.len message_admins("Admin logout: [key_name(src)]") + message_mods("Staff logout: [key_name(src)]") if(admins_number == 0) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. send2adminirc("[key_name(src)] logged out - no more admins online.") ..() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 03fddfb8..1d374f73 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -82,7 +82,8 @@ rigged = 1 log_admin("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") - message_admins("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") + message_admins("[user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") + message_mods("[user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") S.reagents.clear_reagents() @@ -108,7 +109,8 @@ //explosion(T, 0, 1, 2, 2) log_admin("LOG: Rigged power cell explosion, last touched by [fingerprintslast]") - message_admins("LOG: Rigged power cell explosion, last touched by [fingerprintslast]") + message_admins("Rigged power cell explosion, last touched by [fingerprintslast]") + message_mods("Rigged power cell explosion, last touched by [fingerprintslast]") explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 357f3587..2197fc5c 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -287,7 +287,8 @@ if(status == LIGHT_OK && trigger) log_admin("LOG: Rigged light explosion, last touched by [fingerprintslast]") - message_admins("LOG: Rigged light explosion, last touched by [fingerprintslast]") + message_admins("Rigged light explosion, last touched by [fingerprintslast]") + message_mods("Rigged light explosion, last touched by [fingerprintslast]") explode() else if( prob( min(60, switchcount*switchcount*0.01) ) ) @@ -365,7 +366,8 @@ if(on && rigged) log_admin("LOG: Rigged light explosion, last touched by [fingerprintslast]") - message_admins("LOG: Rigged light explosion, last touched by [fingerprintslast]") + message_admins("Rigged light explosion, last touched by [fingerprintslast]") + message_mods("Rigged light explosion, last touched by [fingerprintslast]") explode() else @@ -723,7 +725,8 @@ if(S.reagents.has_reagent("plasma", 5)) log_admin("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.") - message_admins("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.") + message_admins("[user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.") + message_mods("[user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.") rigged = 1 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index cbacdd7b..0a22877d 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -41,6 +41,7 @@ /obj/machinery/power/emitter/Del() message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) + message_mods("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("Emitter deleted at ([x],[y],[z])") investigate_log("deleted at ([x],[y],[z])","singulo") ..() @@ -63,6 +64,7 @@ src.active = 0 user << "You turn off the [src]." message_admins("Emitter turned off by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_mods("Emitter turned off by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])") investigate_log("turned off by [user.key]","singulo") else @@ -71,6 +73,7 @@ src.shot_number = 0 src.fire_delay = 100 message_admins("Emitter turned on by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_mods("Emitter turned on by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("Emitter turned on by [user.ckey]([user]) in ([x],[y],[z])") investigate_log("turned on by [user.key]","singulo") update_icon() diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 599d0af3..cdc4013d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -88,6 +88,7 @@ src.toggle_power() investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo") message_admins("PA Control Computer turned [active?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_mods("PA Control Computer turned [active?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)") log_game("PA Control Computer turned [active?"ON":"OFF"] by [usr.ckey]([usr]) in ([x],[y],[z])") else if(href_list["scan"]) src.part_scan() @@ -97,6 +98,7 @@ strength = 2 else message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_mods("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)") log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") investigate_log("increased to [strength] by [usr.key]","singulo") for(var/obj/structure/particle_accelerator/part in connected_parts) @@ -109,6 +111,7 @@ strength = 0 else message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_mods("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)") log_game("PA Control Computer decreased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") investigate_log("decreased to [strength] by [usr.key]","singulo") for(var/obj/structure/particle_accelerator/part in connected_parts) diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index a1575b93..bcf183cf 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -45,6 +45,7 @@ M.primed = 1 M.throw_at(target, missile_range, missile_speed) message_admins("[key_name_admin(user)] fired a rocket from a rocket launcher ([src.name]).") + message_mods("[key_name_admin(user)] fired a rocket from a rocket launcher ([src.name]).") log_game("[key_name_admin(user)] used a rocket launcher ([src.name]).") rockets -= I del(I) diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index 0ea66d79..ce8c7f2e 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -58,6 +58,7 @@ F.loc = user.loc F.throw_at(target, 30, 2) message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + message_mods("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") log_game("[key_name_admin(user)] used a grenade ([src.name]).") F.active = 1 F.icon_state = initial(icon_state) + "_active" diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index fe6e1dd0..70908cfe 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -122,6 +122,7 @@ modded = modded ? 0 : 1 if (modded) message_admins("[key_name_admin(user)] opened fueltank at ([loc.x],[loc.y],[loc.z]) - JMP.") + message_mods("[key_name_admin(user)] opened fueltank at ([loc.x],[loc.y],[loc.z]) - JMP.") leak_fuel(amount_per_transfer_from_this) if (istype(W,/obj/item/device/assembly_holder)) if (rig) @@ -134,6 +135,7 @@ var/obj/item/device/assembly_holder/H = W if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter)) message_admins("[key_name_admin(user)] rigged fueltank at ([loc.x],[loc.y],[loc.z]) for explosion - JMP.") + message_mods("[key_name_admin(user)] rigged fueltank at ([loc.x],[loc.y],[loc.z]) for explosion - JMP.") log_game("[key_name(user)] rigged fueltank at ([loc.x],[loc.y],[loc.z]) for explosion.") rig = W @@ -153,10 +155,12 @@ if(!src.defuse && user.client.holder) src.defuse = 1 message_admins("[key_name_admin(user)] defused fueltank at ([loc.x],[loc.y],[loc.z]).") + message_mods("[key_name_admin(user)] defused fueltank at ([loc.x],[loc.y],[loc.z]).") else if(!src.armed && user.client.holder) src.defuse = 0 message_admins("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).") + message_mods("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).") /obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) diff --git a/html/changelog.html b/html/changelog.html index f9e4209e..7684c358 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,16 +57,32 @@ should be listed in the changelog upon commit though. Thanks. -->
-

13 September 2014

+

17 September 2014

SoundScopes updated:

  • Forensics
  • +
  • Admin - Area make sound
  • +
  • Admin - Mod Logs similar to admin logs for better modding abillitys
  • +
  • All staff get a message if a chat channel is muted when they login
  • Custom Loadout - Berets
  • Custom Loadout - Universal Recorder
  • Custom Loadout - Camera
  • Custom Loadout - Clipboard
  • +
  • Custom Loadout - Briefcase
  • +
  • Custom Loadout - Zippo lighter
  • +
  • Custom Loadout - Flask
  • +
  • Custom Loadout - Red and Blue pens
  • Poisonous plants you'll now eat in a single bite
  • Death nettles buffed significantly
  • +
  • Vampire - Hypnotize now a free power with increased cooldown time
  • +
  • Vampire - Vampjaunt brought back down to thirty
  • +
  • Vampire - Holy water ignites and burns vamps
  • +
  • Vampire - Health and Damage lowered on bats
  • +
  • All energy weapons made more accurate.
  • +
  • AI's can only message centcom every 10 minutes.
  • +
  • Tajaran & Unathi Medical Hardsuit Helmet actually go on their head
  • +
  • IPC's can't be vamps or changelings (Actual fix)
  • +
  • medical hardsuit helmet
  • Tcomms runtime fix. NOTE: Rest of Tcomms does not actually work
  • New hairstyles
From 2fa09d97320b17a31191ab78d23d52e88a2dcd75 Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Wed, 17 Sep 2014 15:19:22 +0100 Subject: [PATCH 09/18] JMP links on attack logs Added JMP links to all attack logs --- code/game/gamemodes/changeling/changeling_powers.dm | 2 +- code/game/gamemodes/vampire/vampire_powers.dm | 4 ++-- code/game/machinery/kitchen/gibber.dm | 2 +- code/game/objects/items/weapons/cigs_lighters.dm | 2 +- code/game/objects/items/weapons/defib.dm | 2 +- code/game/objects/items/weapons/gift_wrappaper.dm | 2 +- code/game/objects/items/weapons/handcuffs.dm | 2 +- code/game/objects/items/weapons/stunbaton.dm | 8 ++++---- code/game/objects/items/weapons/swords_axes_etc.dm | 2 +- code/game/objects/structures/tables_racks.dm | 2 +- code/game/objects/structures/window.dm | 6 +++--- code/game/turfs/simulated/walls.dm | 2 +- code/game/turfs/simulated/walls_reinforced.dm | 2 +- code/modules/mob/living/carbon/human/human_attackhand.dm | 6 +++--- code/modules/mob/mob_grab.dm | 4 ++-- 15 files changed, 24 insertions(+), 24 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index f405ae7b..d98853dd 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -839,7 +839,7 @@ var/list/datum/dna/hivemind_bank = list() if(T.reagents) T.reagents.add_reagent("lexorin", 40) //Becase a deadly powerful attack should be logged - msg_admin_attack("[usr.name] ([usr.ckey]) Death Stung [T.name] ([T.ckey])") + msg_admin_attack("[usr.name] ([usr.ckey]) Death Stung [T.name] ([T.ckey]) - JMP") usr.attack_log += text("\[[time_stamp()]\] Death stung [T.name] ([T.ckey])") T.attack_log += text("\[[time_stamp()]\] Was death stung by [usr.name] ([usr.ckey])") feedback_add_details("changeling_powers","DTHS") diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 4ad1c547..6e278e7f 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -175,7 +175,7 @@ shutdown.speed = 1 shutdown.stage = 2 shutdown.clicks = 185 - msg_admin_attack("[usr.name] ([usr.ckey]) gave [C.name] ([C.ckey]) the shutdown disease") + msg_admin_attack("[usr.name] ([usr.ckey]) gave [C.name] ([C.ckey]) the shutdown disease - JMP") usr.attack_log += text("\[[time_stamp()]\] Gave [C.name] ([C.ckey]) the shutdown disease") C.attack_log += text("\[[time_stamp()]\] Has been given the shutdown disease by [usr.name] ([usr.ckey])") infect_virus2(C,shutdown,0) @@ -354,7 +354,7 @@ src << "\red You have successfully Enthralled [H.name]. If they refuse to do as you say just adminhelp." ticker.mode.update_vampire_icons_added(H.mind) ticker.mode.update_vampire_icons_added(src.mind) - msg_admin_attack("[name]([ckey]) has mind-slaved [H.name]([H.ckey]).") + msg_admin_attack("[name]([ckey]) has mind-slaved [H.name]([H.ckey]) - JMP.") /client/vampire/proc/vampire_bats() set category = "Abilities" diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 7d2ffc5a..895f82dd 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -212,7 +212,7 @@ if(src.occupant.client) // Gibbed a cow with a client in it? log that shit src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [user]/[user.ckey]" user.attack_log += "\[[time_stamp()]\] Gibbed [src.occupant]/[src.occupant.ckey]" - msg_admin_attack("\[[time_stamp()]\] [key_name(user)] gibbed [key_name(src.occupant)]") + msg_admin_attack("\[[time_stamp()]\] [key_name(user)] gibbed [key_name(src.occupant)] - JMP") src.occupant.death(1) src.occupant.ghostize() diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index c0fdee0c..a35a956a 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -196,7 +196,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM M.attack_log += text("\[[time_stamp()]\] Has been burnt with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to burn [M.name] ([M.ckey])") - msg_admin_attack("[key_name(user)] burnt [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("[key_name(user)] burnt [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)]) - JMP") /obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob, proximity) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index dc969588..12eb57f7 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -109,7 +109,7 @@ playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1) user.attack_log += "\[[time_stamp()]\] Defibrillated [H.name] ([H.ckey]) with [src.name]" H.attack_log += "\[[time_stamp()]\] Defibrillated by [user.name] ([user.ckey]) with [src.name]" - msg_admin_attack("[user.name] ([user.ckey]) defibrillated [H.name] ([H.ckey]) with [src.name]" ) + msg_admin_attack("[user.name] ([user.ckey]) defibrillated [H.name] ([H.ckey]) with [src.name] - JMP" ) if(!iscarbon(user)) M.LAssailant = null else diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 9e876154..2dabc2cf 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -185,7 +185,7 @@ H.attack_log += text("\[[time_stamp()]\] Has been wrapped with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to wrap [H.name] ([H.ckey])") - msg_admin_attack("[key_name(user)] used [src] to wrap [key_name(H)]") + msg_admin_attack("[key_name(user)] used [src] to wrap [key_name(H)] - JMP") else user << "\blue You need more paper." diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 7bd91a4f..6aed134a 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -54,7 +54,7 @@ C.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [C.name] ([C.ckey])") - msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(C)]") + msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(C)] - JMP") var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( ) O.source = user diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 7dbc5f31..bddfda17 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -88,7 +88,7 @@ user.attack_log += "\[[time_stamp()]\] Stunned [H.name] ([H.ckey]) with [src.name]" H.attack_log += "\[[time_stamp()]\] Stunned by [user.name] ([user.ckey]) with [src.name]" - msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name]") + msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name] - JMP") playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) if(charges < 1) @@ -115,7 +115,7 @@ H.visible_message("[src], thrown by [foundmob.name], strikes [H] and stuns them!") H.attack_log += "\[[time_stamp()]\] Stunned by thrown [src.name] last touched by ([src.fingerprintslast])" - msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)]" ) + msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)] - JMP" ) /obj/item/weapon/melee/baton/emp_act(severity) switch(severity) @@ -228,7 +228,7 @@ user.attack_log += "\[[time_stamp()]\] Stunned [H.name] ([H.ckey]) with [src.name]" H.attack_log += "\[[time_stamp()]\] Stunned by [user.name] ([user.ckey]) with [src.name]" - msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name]") + msg_admin_attack("[key_name(user)] stunned [key_name(H)] with [src.name] - JMP") playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) if(charges < 1) @@ -256,7 +256,7 @@ H.visible_message("[src], thrown by [foundmob.name], strikes [H] and stuns them!") H.attack_log += "\[[time_stamp()]\] Stunned by thrown [src.name] last touched by ([src.fingerprintslast])" - msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)]" ) + msg_admin_attack("Flying [src.name], last touched by ([src.fingerprintslast]) stunned [key_name(H)] - JMP" ) /obj/item/weapon/melee/baton/stunrod/emp_act(severity) switch(severity) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index a5c01637..180a89ea 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -104,7 +104,7 @@ M.Weaken(5) M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[key_name(user)] attacked [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)])") + msg_admin_attack("[key_name(user)] attacked [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)]) - JMP") src.add_fingerprint(user) for(var/mob/O in viewers(M)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index c778ddd3..a06702f0 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -364,7 +364,7 @@ if (prob(15)) M.Weaken(5) M.apply_damage(8,def_zone = "head") visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!") - msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]!") + msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]! - JMP") playsound(src.loc, 'sound/weapons/tablehit1.ogg', 50, 1) else user << "\red You need a better grip to do that!" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0b5c9178..755641f4 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -180,20 +180,20 @@ M.apply_damage(7) hit(10) visible_message("\red [user] slams [M] against \the [src]!") - msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) against \the [src]!") + msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) against \the [src]! - JMP") if(2) if (prob(50)) M.Weaken(1) M.apply_damage(10) hit(25) visible_message("\red [user] bashes [M] against \the [src]!") - msg_admin_attack("[user.name]([user.ckey]) bashes [M.name]'s([M.ckey]) against \the [src]!") + msg_admin_attack("[user.name]([user.ckey]) bashes [M.name]'s([M.ckey]) against \the [src]! - JMP") if(3) M.Weaken(5) M.apply_damage(20) hit(50) visible_message("\red [user] crushes [M] against \the [src]!") - msg_admin_attack("[user.name]([user.ckey]) crushes [M.name]'s([M.ckey]) against \the [src]!") + msg_admin_attack("[user.name]([user.ckey]) crushes [M.name]'s([M.ckey]) against \the [src]! - JMP") return if(istype(W, /obj/item/weapon/screwdriver)) if(reinf && state >= 1) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 77268870..b798f636 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -160,7 +160,7 @@ if (prob(15)) M.Weaken(5) M.apply_damage(8,def_zone = "head") visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!") - msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]!") + msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]! - JMP") // switch(rand(1,3)) // if(1) // playsound(src.loc, 'sound/weapons/genhit1.ogg', 50, 1) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index e234df64..b8da744a 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -48,7 +48,7 @@ if (prob(15)) M.Weaken(5) M.apply_damage(16,def_zone = "head") visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!") - msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]!") + msg_admin_attack("[user.name]([user.ckey]) slams [M.name]'s([M.ckey]) face against \the [src]! - JMP") // switch(rand(1,3)) // if(1) // playsound(src.loc, 'sound/weapons/genhit1.ogg', 50, 1) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 9d9f1145..bdca13ab 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -131,13 +131,13 @@ //and leave an attack log M.attack_log += text("\[[time_stamp()]\] Bit [src.name] ([src.ckey]) in the neck and draining their blood") src.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [M.name] ([M.ckey])") - msg_admin_attack("[M.name] ([M.ckey]) bit [src.name] ([src.ckey]) in the neck") + msg_admin_attack("[M.name] ([M.ckey]) bit [src.name] ([src.ckey]) in the neck - JMP") M.handle_bloodsucking(src) return //end vampire codes M.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] Has been [pick(attack.attack_verb)]ed by [M.name] ([M.ckey])") - msg_admin_attack("[key_name(M)] [pick(attack.attack_verb)]ed [key_name(src)]") + msg_admin_attack("[key_name(M)] [pick(attack.attack_verb)]ed [key_name(src)] - JMP") var/damage = rand(0, 5)//BS12 EDIT if(!damage) @@ -168,7 +168,7 @@ M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] Has been disarmed by [M.name] ([M.ckey])") - msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey])") + msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey]) - JMP") if(w_uniform) w_uniform.add_fingerprint(M) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index fcaf9888..9c9656d6 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -137,7 +137,7 @@ affecting.loc = assailant.loc affecting.attack_log += "\[[time_stamp()]\] Has had their neck grabbed by [assailant.name] ([assailant.ckey])" assailant.attack_log += "\[[time_stamp()]\] Grabbed the neck of [affecting.name] ([affecting.ckey])" - msg_admin_attack("[key_name(assailant)] grabbed the neck of [key_name(affecting)]") + msg_admin_attack("[key_name(assailant)] grabbed the neck of [key_name(affecting)] - JMP") hud.icon_state = "disarm/kill" hud.name = "disarm/kill" else @@ -158,7 +158,7 @@ assailant.visible_message("[assailant] has tightened \his grip on [affecting]'s neck!") affecting.attack_log += "\[[time_stamp()]\] Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])" assailant.attack_log += "\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])" - msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]") + msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)] - JMP") assailant.next_move = world.time + 10 affecting.losebreath += 1 From 9a5117aea2e5634956625c58566a68b38adc90be Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Thu, 18 Sep 2014 17:07:23 +0100 Subject: [PATCH 10/18] Vampires in one-click-antag Vampires in one-click-antag --- code/datums/mind.dm | 13 +++++++ code/modules/admin/topic.dm | 4 ++ code/modules/admin/verbs/one_click_antag.dm | 41 +++++++++++++++++++-- html/changelog.html | 3 +- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 1c12d54d..934cb1b9 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -69,6 +69,7 @@ datum/mind proc/transfer_to(mob/living/new_character) if(!istype(new_character)) + msg_scopes("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob.") world.log << "## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn" if(current) //remove ourself from our old body's mind variable if(changeling) @@ -1229,6 +1230,18 @@ datum/mind // fail |= !ticker.mode.equip_traitor(current, 1) fail |= !ticker.mode.equip_revolutionary(current) +//Look here again to make sure it works right -- SoundScopes + proc/make_Vampire() + if(!(src in ticker.mode.vampires)) + ticker.mode.vampires += src + ticker.mode.grant_vampire_powers(current) + special_role = "Vampire" + current << "Your powers are awoken. Your lust for blood grows... You are a Vampire!" + log_admin("[key_name_admin(usr)] has vampired [current].") + if (!config.objectives_disabled) + ticker.mode.forge_vampire_objectives(src) + ticker.mode.greet_vampire(src) + // check whether this mind's mob has been brigged for the given duration // have to call this periodically for the duration to work properly diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 17dd1f06..a4879a4d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -48,6 +48,10 @@ log_admin("[key_name(usr)] has spawned vox raiders.") if(!src.makeVoxRaiders()) usr << "\red Unfortunately there weren't enough candidates available." + if("12") + log_admin("[key_name(usr)] has spawned a vampire.") + if(!src.makeVampire()) + usr << "\red Unfortunately there weren't enough candidates available." else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"]) var/adminckey = href_list["dbsearchadmin"] var/playerckey = href_list["dbsearchckey"] diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 1bd128a8..65de9a41 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -18,6 +18,7 @@ client/proc/one_click_antag() Make Malf AI
Make Wizard (Requires Ghosts)
Make Vox Raiders (Requires Ghosts)
+ Make Vampire
"} /* These dont work just yet Ninja, aliens and deathsquad I have not looked into yet @@ -100,9 +101,10 @@ client/proc/one_click_antag() if(!applicant.stat) if(applicant.mind) if (!applicant.mind.special_role) - if(!jobban_isbanned(applicant, "changeling") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(applicant.species.name != "Machine") + if(!jobban_isbanned(applicant, "changeling") && !jobban_isbanned(applicant, "Syndicate")) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numChanglings = min(candidates.len, 3) @@ -520,4 +522,35 @@ client/proc/one_click_antag() ticker.mode.traitors += new_vox.mind new_vox.equip_vox_raider() - return new_vox \ No newline at end of file + return new_vox + +/datum/admins/proc/makeVampire() + + var/datum/game_mode/vampire/temp = new + if(config.protect_roles_from_antagonist) + temp.restricted_jobs += temp.protected_jobs + + var/list/mob/living/carbon/human/candidates = list() + var/mob/living/carbon/human/H = null + + for(var/mob/living/carbon/human/applicant in player_list) + if(applicant.client.prefs.be_special & BE_VAMPIRE) + if(!applicant.stat) + if(applicant.mind) + if (!applicant.mind.special_role) + if(applicant.species.name != "Machine") + if(!jobban_isbanned(applicant, "vampire") && !jobban_isbanned(applicant, "Syndicate")) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant + + if(candidates.len) + var/numVampires = min(candidates.len, 3) + + for(var/i = 0, i
  • Admin - Area make sound
  • Admin - Mod Logs similar to admin logs for better modding abillitys
  • All staff get a message if a chat channel is muted when they login
  • +
  • New Medicines
  • Custom Loadout - Berets
  • Custom Loadout - Universal Recorder
  • Custom Loadout - Camera
  • @@ -82,7 +83,7 @@ should be listed in the changelog upon commit though. Thanks. -->
  • AI's can only message centcom every 10 minutes.
  • Tajaran & Unathi Medical Hardsuit Helmet actually go on their head
  • IPC's can't be vamps or changelings (Actual fix)
  • -
  • medical hardsuit helmet
  • +
  • Vampires added to one click antags
  • Tcomms runtime fix. NOTE: Rest of Tcomms does not actually work
  • New hairstyles
  • From d272c77fb3a7a1df9f1ee5ab865f11e3dd8cb086 Mon Sep 17 00:00:00 2001 From: Duck- Date: Thu, 18 Sep 2014 23:13:03 -0400 Subject: [PATCH 11/18] wheelchairs wheelchairs. fixes lasereyes for wizard mutate. might need nerfs. uncertain. too tired. --- aurora.dme | 1 + code/_onclick/other_mobs.dm | 2 +- code/game/jobs/job_controller.dm | 4 + code/game/machinery/doors/door.dm | 8 + .../effects/decals/Cleanable/humans.dm | 13 +- .../objects/items/weapons/extinguisher.dm | 16 +- .../structures/stool_bed_chair_nest/bed.dm | 1 + .../structures/stool_bed_chair_nest/chairs.dm | 38 +++- .../stool_bed_chair_nest/wheelchair.dm | 187 ++++++++++++++++++ code/modules/client/preferences.dm | 11 ++ .../mob/living/carbon/human/human_movement.dm | 32 ++- code/modules/mob/mob_movement.dm | 26 ++- code/modules/mob/new_player/new_player.dm | 4 + data/investigate/gravity.html | 4 +- icons/obj/objects.dmi | Bin 117195 -> 120329 bytes 15 files changed, 314 insertions(+), 33 deletions(-) create mode 100644 code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm diff --git a/aurora.dme b/aurora.dme index f9a8cc50..3c46778f 100644 --- a/aurora.dme +++ b/aurora.dme @@ -724,6 +724,7 @@ #include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" #include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" #include "code\game\turfs\simulated.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\unsimulated.dm" diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 04612128..b84b9f46 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -23,7 +23,7 @@ /mob/living/carbon/human/RangedAttack(var/atom/A) if(!gloves && !mutations.len) return var/obj/item/clothing/gloves/G = gloves - if((LASER in mutations) && a_intent == "harm") + if((LASER in mutations) && a_intent == "hurt") LaserEyes(A) // moved into a proc below else if(istype(G) && G.Touch(A,0)) // for magic gloves diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index a9904ac8..8a92dcd5 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -407,6 +407,10 @@ var/global/datum/controller/occupations/job_master S = locate("start*[rank]") // use old stype if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf)) H.loc = S.loc + // Moving wheelchair if they have one + if(H.buckled && istype(H.buckled, /obj/structure/stool/bed/chair/wheelchair)) + H.buckled.loc = H.loc + H.buckled.dir = H.dir //give them an account in the station database var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 3b59dca4..e8f8eace 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -81,6 +81,14 @@ else flick("door_deny", src) return + if(istype(AM, /obj/structure/stool/bed/chair/wheelchair)) + var/obj/structure/stool/bed/chair/wheelchair/wheel = AM + if(density) + if(wheel.pulling && (src.allowed(wheel.pulling))) + open() + else + flick("door_deny", src) + return return diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 9d1b0c94..448b0ec7 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -51,7 +51,12 @@ var/global/list/image/splatter_cache=list() if(amount < 1) return - if(perp.shoes)//Adding blood to shoes + var/datum/organ/external/l_foot = perp.get_organ("l_foot") + var/datum/organ/external/r_foot = perp.get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + if(perp.shoes && !perp.buckled)//Adding blood to shoes perp.shoes.blood_color = basecolor perp.shoes:track_blood = max(amount,perp.shoes:track_blood) if(!perp.shoes.blood_overlay) @@ -62,16 +67,20 @@ var/global/list/image/splatter_cache=list() perp.shoes.overlays += perp.shoes.blood_overlay perp.shoes.blood_DNA |= blood_DNA.Copy() - else//Or feet + else if (hasfeet)//Or feet perp.feet_blood_color = basecolor perp.track_blood = max(amount,perp.track_blood) if(!perp.feet_blood_DNA) perp.feet_blood_DNA = list() perp.feet_blood_DNA |= blood_DNA.Copy() + else if (perp.buckled && istype(perp.buckled, /obj/structure/stool/bed/chair/wheelchair)) + var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled + W.bloodiness = 4 perp.update_inv_shoes(1) amount-- + /obj/effect/decal/cleanable/blood/proc/dry() name = "dried [src.name]" desc = "It's dry and crusty. Someone is not doing their job." diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 53466e96..2a6f5d4c 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -5,12 +5,12 @@ icon_state = "fire_extinguisher0" item_state = "fire_extinguisher" hitsound = 'sound/weapons/smash.ogg' - flags = FPRINT | USEDELAY | TABLEPASS | CONDUCT + flags = FPRINT | TABLEPASS | CONDUCT throwforce = 10 w_class = 3.0 throw_speed = 2 throw_range = 10 - force = 10 + force = 10.0 m_amt = 90 attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") var/max_water = 50 @@ -24,7 +24,7 @@ icon_state = "miniFE0" item_state = "miniFE" hitsound = null //it is much lighter, after all. - flags = FPRINT | USEDELAY | TABLEPASS + flags = FPRINT | TABLEPASS throwforce = 2 w_class = 2.0 force = 3.0 @@ -78,8 +78,12 @@ if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored ) spawn(0) + var/obj/structure/stool/bed/chair/C = null + if(istype(usr.buckled, /obj/structure/stool/bed/chair)) + C = usr.buckled var/obj/B = usr.buckled var/movementdirection = turn(direction,180) + if(C) C.propelled = 1 B.Move(get_step(usr,movementdirection), movementdirection) sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) @@ -91,6 +95,7 @@ B.Move(get_step(usr,movementdirection), movementdirection) sleep(2) B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 0 sleep(3) B.Move(get_step(usr,movementdirection), movementdirection) sleep(3) @@ -117,17 +122,12 @@ for(var/b=0, b<5, b++) step_towards(W,my_target) if(!W) return - if(!W.reagents) return W.reagents.reaction(get_turf(W)) for(var/atom/atm in get_turf(W)) if(!W) return W.reagents.reaction(atm) - if(isliving(atm)) //For extinguishing mobs on fire - var/mob/living/M = atm - M.ExtinguishMob() if(W.loc == my_target) break sleep(2) - W.delete() if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0)) user.inertia_dir = get_dir(target, user) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 3160e681..0d831cb7 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -12,6 +12,7 @@ desc = "This is used to lie in, sleep in or strap on." icon_state = "bed" var/mob/living/buckled_mob + var/movable = 0 /obj/structure/stool/bed/psych name = "psych bed" diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index deb3a1e0..5b152839 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -3,6 +3,8 @@ desc = "You sit in this. Either by will or force." icon_state = "chair" + var/propelled = 0 // Check for fire-extinguisher-driven chairs + /obj/structure/stool/MouseDrop(atom/over_object) return @@ -115,13 +117,39 @@ /obj/structure/stool/bed/chair/office/Move() ..() if(buckled_mob) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - var/moved = buckled_mob.Move(src.loc) - buckled_mob.buckled = src - if(!moved) - unbuckle() + var/mob/living/occupant = buckled_mob + occupant.buckled = null + occupant.Move(src.loc) + occupant.buckled = src + if (occupant && (src.loc != occupant.loc)) + if (propelled) + for (var/mob/O in src.loc) + if (O != occupant) + Bump(O) + else + unbuckle() handle_rotation() +/obj/structure/stool/bed/chair/office/Bump(atom/A) + ..() + if(!buckled_mob) return + + if(propelled) + var/mob/living/occupant = buckled_mob + unbuckle() + occupant.throw_at(A, 3, 2) + occupant.apply_effect(6, STUN, 0) + occupant.apply_effect(6, WEAKEN, 0) + occupant.apply_effect(6, STUTTER, 0) + playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + if(istype(A, /mob/living)) + var/mob/living/victim = A + victim.apply_effect(6, STUN, 0) + victim.apply_effect(6, WEAKEN, 0) + victim.apply_effect(6, STUTTER, 0) + victim.take_organ_damage(10) + occupant.visible_message("[occupant] clashed into \the [A]!") + /obj/structure/stool/bed/chair/office/light icon_state = "officechair_white" diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm new file mode 100644 index 00000000..9c00ee38 --- /dev/null +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -0,0 +1,187 @@ +/obj/structure/stool/bed/chair/wheelchair + name = "wheelchair" + desc = "You sit in this. Either by will or force." + icon_state = "wheelchair" + anchored = 0 + movable = 1 + + var/driving = 0 + var/mob/living/pulling = null + var/bloodiness + + +/obj/structure/stool/bed/chair/wheelchair/handle_rotation() + overlays = null + var/image/O = image(icon = 'icons/obj/objects.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir) + overlays += O + if(buckled_mob) + buckled_mob.dir = dir + +/obj/structure/stool/bed/chair/wheelchair/relaymove(mob/user, direction) + // Redundant check? + if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained()) + if(user==pulling) + pulling = null + user.pulledby = null + user << "\red You lost your grip!" + return + if(buckled_mob && pulling && user == buckled_mob) + if(pulling.stat || pulling.stunned || pulling.weakened || pulling.paralysis || pulling.lying || pulling.restrained()) + pulling.pulledby = null + pulling = null + if(user.pulling && (user == pulling)) + pulling = null + user.pulledby = null + return + if(propelled) + return + if(pulling && (get_dist(src, pulling) > 1)) + pulling = null + user.pulledby = null + if(user==pulling) + return + if(pulling && (get_dir(src.loc, pulling.loc) == direction)) + user << "\red You cannot go there." + return + if(pulling && buckled_mob && (buckled_mob == user)) + user << "\red You cannot drive while being pushed." + return + + // Let's roll + driving = 1 + var/turf/T = null + //--1---Move occupant---1--// + if(buckled_mob) + buckled_mob.buckled = null + step(buckled_mob, direction) + buckled_mob.buckled = src + //--2----Move driver----2--// + if(pulling) + T = pulling.loc + if(get_dist(src, pulling) >= 1) + step(pulling, get_dir(pulling.loc, src.loc)) + //--3--Move wheelchair--3--// + step(src, direction) + if(buckled_mob) // Make sure it stays beneath the occupant + Move(buckled_mob.loc) + dir = direction + handle_rotation() + if(pulling) // Driver + if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert! + pulling.loc = T + else + spawn(0) + if(get_dist(src, pulling) > 1) // We are too far away? Losing control. + pulling = null + user.pulledby = null + pulling.dir = get_dir(pulling, src) // When everything is right, face the wheelchair + if(bloodiness) + create_track() + driving = 0 + +/obj/structure/stool/bed/chair/wheelchair/Move() + ..() + if(buckled_mob) + var/mob/living/occupant = buckled_mob + if(!driving) + occupant.buckled = null + occupant.Move(src.loc) + occupant.buckled = src + if (occupant && (src.loc != occupant.loc)) + if (propelled) + for (var/mob/O in src.loc) + if (O != occupant) + Bump(O) + else + unbuckle() + if (pulling && (get_dist(src, pulling) > 1)) + pulling.pulledby = null + pulling << "\red You lost your grip!" + pulling = null + else + if (occupant && (src.loc != occupant.loc)) + src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving + handle_rotation() + +/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob) + if (pulling) + MouseDrop(usr) + else + manual_unbuckle(user) + return + +/obj/structure/stool/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) + ..() + if(over_object == usr && in_range(src, usr)) + if(!ishuman(usr)) return + if(usr == buckled_mob) + usr << "\red You realize you are unable to push the wheelchair you sit in." + return + if(!pulling) + pulling = usr + usr.pulledby = src + if(usr.pulling) + usr.stop_pulling() + usr.dir = get_dir(usr, src) + usr << "You grip \the [name]'s handles." + else + if(usr != pulling) + for(var/mob/O in viewers(pulling, null)) + O.show_message("\red [usr] breaks [pulling]'s grip on the wheelchair.", 1) + else + usr << "You let go of \the [name]'s handles." + pulling.pulledby = null + pulling = null + return + +/obj/structure/stool/bed/chair/wheelchair/Bump(atom/A) + ..() + if(!buckled_mob) return + + if(propelled || (pulling && (pulling.a_intent == "hurt"))) + var/mob/living/occupant = buckled_mob + unbuckle() + + if (pulling && (pulling.a_intent == "hurt")) + occupant.throw_at(A, 3, 3, pulling) + else if (propelled) + occupant.throw_at(A, 3, propelled) + + occupant.apply_effect(6, STUN, 0) + occupant.apply_effect(6, WEAKEN, 0) + occupant.apply_effect(6, STUTTER, 0) + playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + if(istype(A, /mob/living)) + var/mob/living/victim = A + victim.apply_effect(6, STUN, 0) + victim.apply_effect(6, WEAKEN, 0) + victim.apply_effect(6, STUTTER, 0) + victim.take_organ_damage(10) + if(pulling) + occupant.visible_message("[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!") + + pulling.attack_log += "\[[time_stamp()]\] Crashed [occupant.name]'s ([occupant.ckey]) [name] into \a [A]" + occupant.attack_log += "\[[time_stamp()]\] Thrusted into \a [A] by [pulling.name] ([pulling.ckey]) with \the [name]" + msg_admin_attack("[pulling.name] ([pulling.ckey]) has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (JMP)") + else + occupant.visible_message("[occupant] crashed into \the [A]!") + +/obj/structure/stool/bed/chair/wheelchair/proc/create_track() + var/obj/effect/decal/cleanable/blood/tracks/B = new(loc) + var/newdir = get_dir(get_step(loc, dir), loc) + if(newdir == dir) + B.dir = newdir + else + newdir = newdir | dir + if(newdir == 3) + newdir = 1 + else if(newdir == 12) + newdir = 4 + B.dir = newdir + bloodiness-- + +/obj/structure/stool/bed/chair/wheelchair/buckle_mob(mob/M as mob, mob/user as mob) + if(M == pulling) + pulling = null + usr.pulledby = null + ..() \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a5375661..f2a67218 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1401,6 +1401,17 @@ datum/preferences else continue + // Wheelchair necessary? + var/datum/organ/external/l_foot = character.get_organ("l_foot") + var/datum/organ/external/r_foot = character.get_organ("r_foot") + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc) + character.buckled = W + character.update_canmove() + W.dir = character.dir + W.buckled_mob = character + W.add_fingerprint(character) + if(underwear > underwear_m.len || underwear < 1) underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES character.underwear = underwear diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 60c44fe3..5bf36827 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -22,17 +22,29 @@ if(wear_suit) tally += wear_suit.slowdown - if(shoes) - tally += shoes.slowdown - for(var/organ_name in list("l_foot","r_foot","l_leg","r_leg")) - var/datum/organ/external/E = get_organ(organ_name) - if(!E || (E.status & ORGAN_DESTROYED)) - tally += 4 - if(E.status & ORGAN_SPLINTED) - tally += 0.5 - else if(E.status & ORGAN_BROKEN) - tally += 1.5 + if(!buckled || (buckled && !istype(buckled, /obj/structure/stool/bed/chair/wheelchair))) + if(shoes) + tally += shoes.slowdown + + for(var/organ_name in list("l_foot","r_foot","l_leg","r_leg")) + var/datum/organ/external/E = get_organ(organ_name) + if(!E || (E.status & ORGAN_DESTROYED)) + tally += 4 + if(E.status & ORGAN_SPLINTED) + tally += 0.5 + else if(E.status & ORGAN_BROKEN) + tally += 1.5 + + if(buckled && istype(buckled, /obj/structure/stool/bed/chair/wheelchair)) + for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm")) + var/datum/organ/external/E = get_organ(organ_name) + if(!E || (E.status & ORGAN_DESTROYED)) + tally += 4 + if(E.status & ORGAN_SPLINTED) + tally += 0.5 + else if(E.status & ORGAN_BROKEN) + tally += 1.5 if(shock_stage >= 10) tally += 3 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 82dead6f..c3537785 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -200,10 +200,14 @@ if(Process_Grab()) return - if(mob.buckled) //if we're buckled to something, tell it we moved. - return mob.buckled.relaymove(mob, direct) +// if(mob.buckled) //if we're buckled to something, tell it we moved. +// return mob.buckled.relaymove(mob, direct) - if(!mob.canmove) return +// if(!mob.canmove) return + + if(!mob.canmove) + if (mob.buckled && (istype(mob.buckled, /obj/structure/stool/bed/chair/wheelchair))) // Exception for wheelchairs + else return //if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV)) // if(!mob.Process_Spacemove(0)) return 0 @@ -254,8 +258,20 @@ var/tickcomp = ((1/(world.tick_lag))*1.3) move_delay = move_delay + tickcomp - - + if(mob.pulledby || mob.buckled) // Wheelchair driving! + if(istype(mob.loc, /turf/space)) + return // No wheelchair driving in space + if(istype(mob.pulledby, /obj/structure/stool/bed/chair/wheelchair)) + return mob.pulledby.relaymove(mob, direct) + else if(istype(mob.buckled, /obj/structure/stool/bed/chair/wheelchair)) + if(ishuman(mob.buckled)) + var/mob/living/carbon/human/driver = mob.buckled + var/datum/organ/external/l_hand = driver.get_organ("l_hand") + var/datum/organ/external/r_hand = driver.get_organ("r_hand") + if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) + return // No hands to drive your chair? Tough luck! + move_delay += 2 + return mob.buckled.relaymove(mob,direct) //We are now going to move moving = 1 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 29ea9173..45a1ee4f 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -293,6 +293,10 @@ EquipCustomItems(character) character.loc = pick(latejoin) character.lastarea = get_area(loc) + // Moving wheelchair if they have one + if(character.buckled && istype(character.buckled, /obj/structure/stool/bed/chair/wheelchair)) + character.buckled.loc = character.loc + character.buckled.dir = character.dir ticker.mode.latespawn(character) diff --git a/data/investigate/gravity.html b/data/investigate/gravity.html index 6e9bdfb9..8db4a474 100644 --- a/data/investigate/gravity.html +++ b/data/investigate/gravity.html @@ -1,2 +1,2 @@ -21:57 [0x20077ba] (92,152,1) || the gravitational generator has regained power.
    -21:57 [0x20077ba] (92,152,1) || the gravitational generator is now charging.
    +23:08 [0x2007796] (92,152,1) || the gravitational generator has regained power.
    +23:08 [0x2007796] (92,152,1) || the gravitational generator is now charging.
    diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 0d8fba2462d5fa796efc5e2c69d4fe886fd335c1..fd6938899f5d5a2d6b4c183d24be6e29bb2cb97f 100644 GIT binary patch delta 25526 zcma(21yo!?(=Lqe!6gZULvZ(CApwF1hhV|oJ!p^+U=J4DJsI5Hf(8%4H9#N`T!T9d z`cK~XJO4T7u65VFYt78sd%CKny1T0Ssp_Fb%%jeDzE)Sdouc z%>8uE*Pw^#@yzJdk8K=fq}I~4FpZf6!>Z?R0}J|I@ZaC`9sMw6tzv>J(wS+&K*BG5e&Kue7AZue8gpg%#;^bXP^(Xr+k za#LUB2Btaxn5PHoyIJYP8&VG>H-+l%|5PY9Nj2MXr4*d090?$0~<)3B_x zh2W6>Ub9@K8+TwT)l40Q+Cp>j`CH7=II$fHss%VB)D(^$sq3N?OL%C3%S@k!ogb7g zA)JOCg@ti_KOU(#^?prw)z!k)w20=7qk!j#_x5!1W{xox4=~-$grV<2dYt^DEBFyX z_~QBY?-;+4lbdqg_bUOrSa^sR^Kg}vH+egDVdVKIXYE@gfd;~fsJXz~-VrzVCdwo` zDm&p?or@8HFxNH5!(RPf<+s**J}p>3ya`Ai8!2F7XEP*fu2Pq8T7ylq1P({17yP(l~+w!Ey(+{GVOd=chF0r?grP>?CZ+t&xhJJi_9c<$<~rY*MjA z9U6wtjHJ^MV%4m<9$@{#v87_R84x4ivlQv3CV_KW^Fh{*M|h3t$jJJ6K4JTtcD9Pt za(-#3DYsYPdRO04z*REs@lZUsFkP_YRZs2d=V0gIC3@j}IOpltarY5?$BD9x4q#}% zmWY5HY)S}OP$o#z4L$l(ombe-PDhs?23lJW2rV zC_X4+6LtbP1n4U!uJbF_)zRW`0IjG~jZxir`yd?)0ugG3T?+1as}GqoyKI#Rw*)DX=1p>WSR2eq1Dhnz3r~^UfVq0o-WN3q%X$Lhh;TSm4f13yjEqfm1{Ko8Cd ziWG$O(kc)EpqAhoEdk{6SaI|N08Hat`(l`e@oJZEG`^G&sCWg@baR1y$ELN`0js*UMBPR?}-=~7`!)Bm$fXLx%QHnZz-?c1J4DS0pTmo~Wc z-c_g)4eM>&BWXxfBp_CikIOYbjQvJSsQb$P2;W~oR0^PplC{*BxsuGw%vFtQ#qj-Yp){SI^| zsl;sCkU8V(qJJ$PenFW-tXzsVUZwZ3^y_B``Rllj`0euuiJT(Lmnn@LBs_U;jufm_vQ=?;c@Kq$2LKdJVy6xzJNgns zCk|jK9P*lpFA}M!V=>tS`V%uT0jgt-=(OfyJgC;lq~_J%p(zLX$6KvZN>uM{***#Y z*~z3BTOvEh-cnIDeCl`HDox>vVeP_M7dmK)961<&9|OLIZx%oXt2qw=_$f|(5kQxZ zvOIUCkp6kKs)0#CgO`rgoU>~>F7BqvzqhX{!(F1DOnKX!dGM=^F@u7J%&qY`!oiiu z>e`jJw^T?@L8=XPlz@}xx;Z~-8zhYsejE(!@7LOX!;p}v%^ug}VemGCurlHh2itN0 zb!59@zbgTl7pRAy`RvPwk8kGFsP{ft=py_Uz5}p@nZ1GCr5~*yPM6;ctLy9I6itTL z)bLUYzsF+w@gq!-vbe15`?#7mZpqg$X?mCYd!o;VXc;u^kt;{6KJ-Y7=f^63O#)w0 zhf_r^Kh+Odxs1)_6p5e{`*gzXj}IKN?9QO7(d4mr@ctGbAN_GHH{L}ZcAkcAc ze%>NDHR={Ucp7%vWcL}Wp)Bt!qlm?&WrW(Qm?AWRMFNCbhajbu^rHe}t^2Gh)q?Ta z!ueCdY;D4FfJYX~3V;;kC%HfARv?Bj5djRfn}aM`%YYy^I!jzSr{WFCUnLqPf{d@% z+I?l9zSxx9Kv(nA5><(7EcF7{Q6)A;=qGk5tYav*WqlHNz*9?XVD6L!_W7^c6Iw|p z_C=Dd=S=y!9}BzP-j<3Mv18Flk;u!Ph3Ma*+Cy_Ex=m%Expt$EpKb~tYAXtUGb%&S}X_%|1svpd=tFPVdW09CBoDEc2qxzGv^J+DWYE4avG$@s?H>0IS z5R#-$A3&fl_4Qp$j?=~4Tz2ctK~-?DsEQ4shY^J75e%{xj7k>_P^vcEN$a)yvRz-J zV6#^VY8SV6CL^(oL-WcXqq#Mv4X3BFxDdK)B{ccnL>JLqsG346G%dMH&^29=k;E!{cI zfq5!Lgf?XkN5emye7p3bV*BWeb(^3MMFw{Zyd+(Qv6!J^50v?{0gLiP^(I#+a1|C= zIk^?jZ^yrFvglAcMZKH`-}f-vRR~j$W@~>_ANuXq4T<5E>Su)s0jpn@8PO+(C%d0N z!7O03R)Efg)ph~W=#sWfpjVfWS8<^eMsFGlts)zj%H{C$570Z!H7M4UlqjtH`Uxcv zFzjdlk&;&A-cfTmSaIFBN{5vgXY2YZXbO#!6MgPdh_aQ4GB1k1UmqiAcvbr`-g!if zs>_kNR0)bp=$uhfX+X3z)O+}G!jsPl8u`{xwGdvKum%}^I!pRH&`{+``pcq)A+h#u1$sPq`7>zhz^dM-F~lgz32WI{Qx5 zuEVMN>wa!7ee1=XgG-CU(ML=fKO?HqOwmZ>pVE1W4rReobpI3wE(vF62rlW-Ufme` zm;+^~oqAxS@rb zAvg-PhWJX5&JxZ3R#G~_Rsnw0k2b~SH7Ru#3+)8A5+$+10ZV1HP1n(o3U9QzPcn15 zy+Sq?@I=1eD>N7Z{KA5(=Ihy1G3oTldk5DoK27bIQ#BrYy30d42(_gHd{3~r` z#kB71%M_p%8A&L#Gt+S|VC;{u;?)0&<t9~B&=>U+@PWrkN@d&O=RR^ar!fD)L4S;n&EK1wt0KNd2{(%x zqBPu;?8YiGBzWT@C9lS>8vB>w_YZrmyUg44c<=lUr+Vd25alp`$%Ps`AaEQc({lL2 z-y5{!;iychQ$Zg#K>9b<2lo@c{fppyJo>3G2Yp}DKBf7R^9hIX&^GY#5W0lCqnc1Z4{cb^w>r?@2#loI_5PPJa!a^z`#8PH}TU| z<^?5@KC$&h#vF>L5wubm&?sAJ62LnxVb=bIGTUPS=@rQe>TG}x`7iLDUm5S3#CnfY zN{X1`;Y;)H7BTTLsV5&PV8Myy zaZ2qn8rtI;EzR87wbljW^n4Av`Z$eEReWFlZps z$$jHSstfUp>3Hp6QvOK;9b%u)+ar|9R`96QSzil9g0>|81+79-+1&tH67mz!f~iMq5ml; zX^1@`)|buBrtUX_>Oo!he6!3~Lk9OoUJGDIP7Ym^9DUkb{RrFV z5%>50n%dgA`T1yVZEXN-Zf?9E$c-A%f}av(sm9>fSpSL*Jf$mSC$xaO z%arG0GvUxNW`prom;h393Zpogv!v5dQbiqq5!`}2IY0?`&2NA?EsCwixURu2d3eGs z?V(kSYbGYasy_AS1BPA-aqk9@%qlU>MOa)Y^2ck*k7a&-er;`Qof(QIxJ(}`_&m#3 zGes|+R@)Ckn?WxAi}Z~d_8=dwJx<~(T_!B`MF8P1I&i4gWa_1@laqhdzmWu9Gtqmv z9DN~66ZWqxgu0CqOF=i`go-7R8XA_5cAmLaDmp= zkYOT_uocH4Z}}a99SI=tdL8_km6f2!QdK9qy7Ql!np(a^oFY#cx=k)-!=z(m9P%5_ zMIp)CFF1dKsvcEiTf67pA~vEub!cc#C}-DAhAgh^f6#E~$g(w`uEKTPM~BEQm}-Y1 z_3KV#owQ%KJ%PYmNeLfpmNl`>Q&d6R?3Z8wj}>;*kufamyyk*wC&oLURD!BN(=6(- zJV6HFO>EQJvvn%8ivM7l1i%UTihogM6V|kTc;@hp=)}0f#J_h|kKC<_bEpaL@-NM6 z?yXx+h!Kj)A4)fFy8IX@Ul$o3YH^YupNO&Q@B$!V79~@!9D+S<)XgB4N{>2@u_R4H zzemUmiXt;Y(22HH9>z;;6(uCNWzq7!!x)9{fR4H&_C|%j_gVv;ulK=7xq8-f zD?CUy*8-;#ak|w-_8s|~!@48hC(lU0!FV=n5lg4_)U;jjY>*?3mAxBze5tk`d73nq z5m~o2C1PJk1^~#FCHCRl)~__JJ4I7)M6al=N_(cO%Bj(-MaVAGWDj>&_ZI@$uE4`A~xxY{OuRlyH#?pU!zLp zs5xG?TwnVPgX#R3PeM^^IoG)FSGjTSozIR8oPRWMWu~P`=;`TcoPZWv6mPtqFS#ZJ z!rltgexH%VDp`huDwI@_q#S)}h7!{tbP%^M9IGq1o!!)nvHrtW@$~Z6S}vjrH`H_gKAxTy?=~P3k13rf4G&i(!1A9$gk8~6K_J862j7a z@s7*UdHTCT$#oxp&ABYt$=1Q?iKJ}UGezt5ERe2b!eT!1#kto zbWoc{`}}f2`WQk9CUq}j&W)XR^d|tm;@`ABhG;d#P^7bEK`Hj@peV_|U+8e0h+_NA zgY|5)yGbxZf}+Ww4U!n!st<$wxG?qCrslRm<-_bOPwGb{=!^$Ck^jfe<1 z{-?;M%Gr&8+;3io_pHgjqM432;Ti@8iR!0&4tE_~IY_ zxQ_`Se8s$%OE9|V$xrx35sJNJ(_77DxznnJvQ3e;-Wb_Iyq?;T4rH(%*CoG8E5-+L z(DOc2XLERBRAqDn&P^9=__%XOsETBU@s|{|1f2PEa5^zAjT5>sJ|AjjljQZ z1aBIde~osLm0cWP$RsdwHyaLz!R}o|m86^3X43%E^`SWKF8ATE;0s?<$ zv!9^Pg(m=%lBEub^zb9`94H!F0YoY+3rbI@atqH(b*G*#xUmYpIrw(CPVs8V*4z}8 z<@bQ3V#(6lF+ABy?*!rN1PIh}>PYS_WAe$eV%tN!{Ob#WOXRU`abDCU7SxD)Z+(e& z>v~GlShnVTNgx%N^wVh+p{JKZ0rd2$vJq>;@QXiOL-bPa;O=_4N2vKTyXVr*ZRfwr zdml0meOWGUyLhoW@s>I1r0Hp$q|{zxm8`;3?T<+}_YcwIseN=Etvy*nqH_Y`D^YbnxQK12n;Pd&Bj(4l@n;e2U zMntfhnqn_DlVS8H8%gz%@wMaSS0f;t@Yrt6d8ygGh*Sb^Y6_I0+46k`kZL*Ly{cdC za2*x0i3-VKM|u47&vmznBO@bk4E-+rM-ete#q_kqaQAK@FMAK{-keX8 zy_p@=vVUe0(x(~7^RGkVzHzG{+TJoPc|vCY1->wBkzt*msbA2i_8qaO-n>I&E%PJ_e!_v=YoAb?D^%&)5NO#^|V>2MgcYklR@=MG1@Ui62k4H}$b% z@Zv1{BKy~`U!SWht^{CG0t{~DPqTUMB5Qj9K2NXw@89vn%Yn`qs#mpqYg;}`nnR8M z-A>hJYdAgSi@2SikP#ur+3I)-NA&+bgR@O2W*or3Kh3`P5@Y=*TKA8tQX*d&)wgz^ z1)I3-q{L1nnN_;OS^`fhCa$7 zlgok~Nj;mnaVswTDpQM{tWU(CS2N7tc`;cmiW=wg3$%#eQE9S`~6Y z{uk^Dczl%Qh~RC#-}O_R^x&v%w`qV{vp+X#MA29f0Xoa7Ms9iAkcERY9Ss-&?d93p zI;PEu(`iWCm*n~Zr6!iP|1gvr;ZBvMYt@-6BfD4bd!usxvGEb5sJ-Nu`Ij6HyLBD^ zp#sY*Fn8*yoNT_Q8PB%sAuim`KYEb~&SijKzFh9VbvYf;TjHlk0=_}jK0z66*9L=W zB`I{6cQ}5USgi4Vn$NiZtQQtV1XE+BtV0t?+`>3Q;6yWM;Hs9Sp65CdocfOxS?Z&ZyK+WO=i@j`WEN6M$z4iy%^Njz^Mwb|? zRr+wp`yA0BZdrzH`}BX9N(j{6@*`&dH1BLJBf0KxjmF+Wz>Me=HtN%CM@ z17J9ZO>)8$KtI(L53O@H1q0C z4JGH8HVT%%TO{`Tv-g87fzS%9+%NX6*K;+2Uk&sM2wLO!iUMzoIIt!nXj@8pBQbF& zovca}k7R4XES!_9N?K`-!0p1P+@2)GE6wg&fiDy8G~>X4K_cUAVXsbi5goVLoMjjuLdly!?Sx@W6+s zNcj~v`V3%I~yta{8wvp0kd;H!?je!JwyO&!q%*s7K?YyN^~m^0MsqzU^S9z!ZT-$ zoR{lbBHIHES**`eaT7FCwNpR|n=K(1F`U$)r;#D7oTobueame=3Uj*(AJ|m`Mwsf41z~p>8-t35_962O!t@f&;SLhsZm>eSTKF*%gDdQx`tsaidD76!!Vpr1Y zKs2Uq9frP4$l|@HP3NO+kG!b}L&tJCe@pZmf13=@*8cJ!_A_IN-`niQTBa0ms#N7x zTK=I@U!|?b`QmWC2wWb06%d3O(EG?3aNjB|JAZXJ{Ecipzf;`eR+7(3;^x_b>U3z7 zp2nLp+yGv!Vl^zRbi!B6F+*;6Sm~%zo3unYR_xtGxqfu2+_-AVk6bg_tF$}Gd|Bjq zm@rmNzEm2-^Fwwx=EAdI_(601LmXu9CE(>1#mhQNYN(*9IOr?pVaJv!JmhWUFvitJ%iG_uymdxP-r>lKE#|(1QYXYYyjnZKkAtG&@v7@?wQe-(D|@f$4%T%M}#;aygyLYlJWi8Sv?6y=$XdTIoCuQ!DY{M?hlWPJ$?5nIW{fzfRa%GC#@c zwY7GBPI|!-6Ry;Ac69BF*Zlx9<}}ksX6OlvJ^Oh+4k9|y z6|!(uRnK1HBHcF9T-rCa)9-R}&lBs}dYLoB7tPJ;3CxkSCU|B4|C544M09sJz6XDL zmdrigJ#UM2m%^@oIuM9IavhIBZU6-1`IkCCkRiNashsllPf{zvX+W7NBlR6`okImZ zXaUV7Z~kip>=%u#?V1=^lpsv5mWx_QU>!v?_nG(Q>z-cd%1SS{a2bxnEUeKinGh5~ z(2@Q(hbUKPNj|a3n;^Inl(nM|)Rx~{G0bf7b1%TTqk0%(((&Vx*PS0pJ!g2?hPylo z`w#7ZN!@hshGZ+bZH-%moUu-35?kiqW#&2mw`OgG4{2w~+Z|Ez{;^qgYMc;eD|w}c<+5)Z;`?V^xocBTDeB|{qRFzD?fsM{ePvV%!DJWr$R+=JSwwimb(UvzDH(|up=w~$luZW+tqdH=bj*cg)e_v z#WjDDNz%^xk|V-E&cp;jhQOzO{puOM&QTNW>fu&CUQMi#R5AjtFQRIDKD6!4%{>kC z-+CJ=QON_qV_+9~)AG&jfyOjRoQLQ6z*5yiMI(+b-2;b7+t7snwaA=mRw#J6 z!^B(HUOt2Y?Ksa8%W^Eil~~GDPZ6w2-EZ^3mhLzWZ-a6uh^D9ML58*GR>iWob^a!9 zP)yGEl$uC56IV;!FI?_<`uZp`9cx7&W8FFl@jf+)GV%3%uN?Dh4D)~WPAl3zOI$SB z1SeltVP~Lc7{|2XC&?w^1ax^#_J7wFd*JE&R87HG>x~FX$16BlGrm(F69&05vH-h4f+BN--+6{&5ZwF_YZ?gBSe2nBV_z=BxEH z@fBvMqC7KO;_v?HB2*l5pO8LM<@Z{;D0Ni8NWXCv5m^PQfI#y%l;Qtix?>ry(vK$l z$6Q{Sl1k-34WH>mnI_^_+&2-Iz+{`#`$;Z!lOtG74W~a>xK-#Q{+%L(q(M4L(I_@> z0A&FU|N7(g=`*zT$}gBm!}w2??lUv!-??%S;pP2Nwv7B(zL@a4sZ;=$ua5m{|KOwN zD``4PiyI#h9Fen^*{y9LC3607zy#4ZVj-eNw z5Br;DQv%4#7uMQX{oe1MqNw2J5z|8Dm+%^2`DYP(0MgX$SmpdmHIp=iOBJlWZ#6U$ zs=t}MIH>@uf$jfbTgm3kqth>^V0f{5Ql0s&MAOB}R~e;`s;51G9)5WNe+w(AG7SQS z4|d%L{=fShSAXyRzib~wc8ZA693P!1A<;0p9U#mm&i=M{Fj%{QQCpko;2<^Hmm{;S z9ixMGT9eHh8Ru2J`x*#~mh>;VKm%E&set208qrI->EoqIJ%c}c7Vc`}ox@M^s=B!4 z1+*&L1RLL%T-(Vo!+86-r!xV)Ul4h6v@{$aH`R*;d*x7NhT*`Y9$tnOVqq2&?)fMe z+~%OH8k*Fy|0&?l&BQ^#gjPu0FvTszpXsD0UYimGvmiD6xn@5mIE>vG_v(uL#W2b6 zu!#rpxLbHfkvKOZ7Y|8@>ZfP9RvFxDLp$z&?Yp=}$_9pAdyW`V$;!|z+28>(KN?rI zCmLCjfnRbtyKlyNwXP-}xm`^Tq;514#*h;SYIeESmN&#Z)5K8wQC!#d_ZneGk4Y>~ zzC{dhv$sFa%GAi}XgA{52~}4Y^qC5*;r{kmZmeAt**`HHBWIr%mEEzPW$)G*OvD`0 zz#yqOc2H2|$rg*r*~<3s#vJZQ$3MyASC7!d9Y3{Z>2rZsm(}Z;W!pF=O-PY>frKe!Iox z!Gaxy4-z%Oft5$>thl_8sEY#tnG#cn@5g{yMX$ zLETm6_rul>yfgW5ll5-+k>Tj6xCin3e@$7WnCGuC{^CxlcC5#=QN8L64P9pa9G2nS zT91uspiEIJ^coqJ*x? zodL6Te~`V1@{7TILg@m8*^4J5`#*cYg**NW{6+HRfyPF*_zAwsv^7{Mn)bsRz~Wu(K27b0{fNH@wRl3YW8INBHw+y;ZB`Nuw1w0nkav6 zRxR{g$^Pi)2ZxAAVw~O7spV*sJ#`h2bD&yM1QvLY$(|ENIG$cU;PG2)!t*ht!OyTP3-{%|Uu zj+C*7Z(D(6;KOCp#x?hH#wCacG_@2F1hhwDwfgXS z{!ySPCm;`6M9Ub(yE~u5{@QSxVO~H`?XU0{hKbNQo{ouE0U>YE3N;}3>m9xz!VQ4+tqpuDmdQcl?Et`` zT@JuV(JM3;{1AlpR-$Xz#w z$;&=-WBnrn(#o_g>KyOSq1*_EjvLgzQRKQbp!Vx_HJ@RKpbe4Ax%z2v)hiH9c7U5* z+Jg@=tf9ZhO4YU6d&O}K_+{y{fBbEaCnk7JPBKnc&aF@;D@sGCVxVJ0>0GU#VAz0jOzef=QR|$dSHfEzqqo4`D-~hEaVx?xpxQq_6e$ zY}yGm>JZ+bX`C?H2VxHGw3rXfQfKZzB8a8*Y7FrW+Rm~2mUFV$U{8MXENP zh8MB%mH44qWC20>ccm@V*=ukC_9+uk$vRp|iHL{K3DxZ47vvRV_`Uv~Xo&TD7@TkD zOP(8aE04mc_Sq%;aA&|d^-mJ*<1(_-ir=o_y*0jx zeYlEEVW&0!Q}0|xJ5tPTJ*a#Qd&m|$LSy9?tq`nIs5Gz{134Q zG9MjA$fBYXlxjsu{BgJ9Qs1r*{^%$ z_J?Y6=?AMCGAvihe#iUy2GPoL6OABK>8|>vk=WaS?h(*>lQ%N#y&^Bg4IC}-c6Vn- zV#?(D~hi=<;`FFux67Bj~FP1a2h5vVR8$dAQyn`0RYzxq)L2_t==m3y>NCebAAJ?)l+zm*I`r zxu7@CqBHJ_YK|t-Szz+<@qs=GwdnZ1!sFuu`V>lEBtPlZRoN;J7JYadyDYz|?Y{cs zaF={++ehgds?Iao@^6Y`9u~hsCH|nbIR#Ms>nE9w5jyr1g^iJJ%}jKi9-!4}#;h$gp@ZgC-3sFq*b#W!&m#}9jlRL#Q=DSh{g zuKQkK+@x>$;&rfv7ID`#lYoK|RAL7~`YcRKi*chPa@Y{)^^36)KKuCG05&>0ny(0p zzpXfX_+rMc14Et`&3r?s4Jx)aTjUY($MgN2~1pWm&ylrDscX8c0ft6ddZNxaDm)l%XBD(OVPl<;P`m0j|GR| zYq6lZu|d#3D{nx(Z~*1jIwr?Hhp6G!lpC1(4J)&g_SBOjPnYno5Y(+_`g7KFye=w_ zBVNzuMupj>f%s}y-9=((a=ipeu>UTJ??!jJGdy@;Sz|-~t@xJ@R7m(068?X}uLEV? zmNR)KCUEi^0Jkdl+DN;jS9U@^AP~Xr%viGCO>^nxNJnG)xzmP4; z;J9Fiv*7XHzwOA?$IegAtHa!-sV&-}_B zG)Ev+Y-y@7>cug-(mWSYY3j3{*;zT5z_Ayv^7*aF%>s>JWk{*6<*SEuZHZw+h;EB! zbot@78i*T`UC8XOOeyXr4T>7SO$48}+nV%G4xy|D_zSe45G$o_vhbsBV`n!v>-|PX zyd{$XTW&$X8+lWTaMT36JMVQk{S-%6PR;Le&Yj(ef;5<{{|al6u2x|GmqEk~2L#a2 z2g>O|y4Sj*);l{$r~)0@SMC;FUS9QsgC;XPUF&rYdz0ZY$m)Ll&CD3NVf`>Tb{)9l z%lh88&;lM>3-cZje$mI(jk{7Blirn0@GWt7bcwV{)eJ?E%&6rGoTo!F#t?IoGp(!2 zj(Z=tn4j>45x8id`@Brbd$*#I*>LjLFYP${U{Y@5s0v|RnSAZlmmP@cToWn^ok4_z zY9~^s^NNG5v`bQ25F}HR!%Stc!$I>_W}p@W(W$snwqX<0q(EQbfoj3ewtXZ>-sthR zEg9@7t~zfK%E|G@ z`2vlg%Pp$ZVFg(N6G#TQw-95>ka0qLi@a-4RL{SOcC|~=V>+{ne%Z6E>?56c@}DkA zEwgGttfS5VRK-$uUz9*tg$BwKO2KTAi&+co=BqNDsuzAW%?nP*9N%)JDfjQ7nQwSk zS59N@;lL@wIf%BK6Pwttb02_;nPmICl!%!4O@h_)QxalgHe?pUGbbmfXUxIMX^274 zUBX-4v+VtSEI*T0Oc$o z5HUEj&SqUpB%=^^9ohnk+c;f9I>R!pw@N-JN1e_HLd=>%fT4K zD;P!zSaj0@E{bPR#fH{Vf#@r!6fyGb0F7e3>OFZn9)_no+3vQ3SJY_kAv8<5Qg z=_GihOZT*ML-Zm2A1u6Ro5212*8iNFqIqkSsTXZMTzQ}as&#tn5B}QMPp>mkSC1z| z7{q__y1)GZ3}lsM5-}=BDJdzbBmG*dzH1aqtjHS;b-wrLa3&Q%!d0C&sThUSRWcy3reAljX&TD0^y$N6 z?^N^}*b_(&JK7BjH1@{^4t;SltN`C+Ppk|}kf^k~mLU1)=F=w&X-7sgt4jUA8{}*s zZD)WmaG&HX=iU6;V4l}K*duVUc`_hGp7dx z%P{6N>%-UJr7CN{^3+C#F0;3HZ$rNcf7~KgH09hcR`f!5F5`x;3wcJQMDB_2|J>lc zSzcs5>!i;Sa-aBjhj2SaEE4UVq=uG83z!o#P@uF5*D%M@n9MZ8@Xa$bib>!jEc zpA<%>xmJXAA8v0;n3$OKx(S4IwIF7OI~Hh6B#`=o*qvQXyEMV*UGmdyP)lKo)Y;CJ zjeTfJbnTmXJ8W}a#BStQdOs!)TQMh@x|-JNxcn1SChBCeY=V#`F%txe+_jv`3yr7) zmE^1BW*y1&kHmv;tHN~3-oO$3|b1?Z-iMxd9F`G>3M=;N=iR-8%Myt_HM#iHY{5mH}SEO)KKPwAiKiNUE>q_Z@fB`%(q+|+IxlPu`I2|m&;*Ny*bgoHUKmwIk> zG&OtXh{qVn&(PyfG^HZQEeNUR9_}Znn>9yc2~x7 zjBnT9#wSF<7^J+fE=ScC{Qy`MCv_ig)`jWsgwJUNJlJhJ$5u@2W=m~@;iO^$+{s_K z4vaT?E`prR{P+-U;eE(swe87is$cUMc!7i%6*GD7RGYAamqbnD5kJzLic@ngkF#E- zZkJYL4Pa@pqFzsz#D|r4zCzv!oGeo93*43FfrI`Yg;f&X*JpNUD3GDti*rSZ7s}pSHpAH^Dmx2M+6~HAbx z@cJ}9v0$U{{QBeF|I@{Fhf^8~RpXL-snhV{eXi-ml;LyWT%u*G13qT$iiw`h4%t{kcE4$5!o%=GG3i1Y6HRVgBzs zAL*g*_aMu9%F&`>aU5&lf`c4MU6K&Ic)l#(0QsQXVBzY$K`SrL0xSVbd z5kSky*J&~vd{`jTQtGjISIfhrl(&yc%<_YI+)8=<>9Z&rf*|O7xAssGVURafjWQ5s zwv}(sR|CAURNABXP*PkR1DNJynjc+r&Kb9zo%8Lr(Y*M{sJ~q%vomtSky~$YdM_z$ zSATpsCs=e=PLOEqH4>MkLbzEhCPQ`VuUotG&8nc$b#bZj7gr~5&X=m6Wr%noMuqeP zDlcFD72~p3ij$&-tR2112uY!GXhBftqC9bNHGp}%K=rf0} zFGX(JRS}edqMri3UmA~pc26OF@Qp}(W?tE|SmBQU4m%xO0$fI;OwUTcv&`i*;YR*bCGR4{2>vWASNC^H@2g+*E97xx`Pr7=zlrw2t>9M9}Gxs zvaP<{Z{OamwG57qEALK%nfFi#on$1HZ=(k1d2+3OltZ^pVafa=KYY{SNO#Z^+{?76aHFBQkuc$XoL>0}HXVPydglz@ zZZguU9`7pQvN7P8VN@t;yxE6Sw!Gw?^Dt2KwD`gPi}sB5MJ0yq>k$a=!-cdGwbiO5 zBF;M8LXF|fSHm)84GoRra3kfi13OdFl2LV^roV4v3vMZ; z32v9JY4O;>dO0W9z_ZZz8G}UD|KW8(;Nwh_c1<_Iy=UzDFW39Dlj^^s$l+plBHo?b zsB^*IwPu-@%SN4xQ^Uh%#X?~wHd6Z|Es5dZFGBay|F)Cr2|v=nTl%ft$gZ!4``oqP z(NGZEGK|P9GIN?Zt0g5RT~6RQmQGy#~g{B0&R+ zt(2MbQ@d}F$iuY;5-p`B0=ZXvmu`fv8+M!3XAz5<(g6CU@Sz{W+t^<-#1m6~Xf*ze z6upP;r-pjuzns-g`(hd#Q6#9KSVh&n8}N`dz+23Md()4P;pWu5yeg{M*;&&lBFxf? zo{)3>XOqG{xIB&v?7MGKv6rW8C$KMOHm92mhrcu`yKduqV*?45Cj$KdKYe&k?qS!= zSyzWkkbtrVP7!RU~1)I&#BHa3nhYAzFrd%vl;6y@_^{>3z-d+{{ ztb5}X(N?^kA|kW!&7N)QVD~)KyQtu|Z|&_Zvo@8k;77M!daX3h1mS(z{B=H)>CA2@ z4?Dc)1)+?M&)L0ewgTSg3|W4j(Tw8R@`l?H+(=UhC`hlyk+gAJ1d3Yu#(}c{J{H2T ztZgV@=zrHEmp8Vy+yOYLXkWBx@CR2Q_)(bkvHiDG{paz-&C};ileK;fr;A3)pb;}l zmbShb*FgrRAHqDZbkLwcf7MOHJkP~XYD|eSB_t)~oR(gzertpn9^1FoAcWvLKhZbJ zQyQJF`Uen~qlMwW+D@J$$@)jv2m+Y4)+@OoU~mN1q!iX(`NOq==m@H~1EH^?^7zLy z11CRQEFT=x%2`F<;bQvYbSTGNO!`A)Q6_JM-0NjF_F&|K!gM`uA?>zWfC6ajU|n9> zT1ayh3N;}ubD6jRZF0!O85XF=U+KlINwOtKvbiU>Kp%$p-u#G=%5<`1v6SON%d7x4lC!wD z>e`UbgH!Tz@@|$x_tE{5zL4u2ije*JL1}ms47S-lSOV+i<0A_&S@A&_`6eigut08# z{+t1(lrxJ;UNie+u3E}u+$Ui>ZfEFdU?L>rwa%{SO7Q=De}ZqRQ_@_-Yk#E|dpZRq z&=axiqQmTgCssD<(gVoBfH?ytC1og$?6WIkVy%7IcMuS`Z~Mp7 zI(f>j6z1nwe>Z79N^tn(7NJ*5XKlNWHbR)47YD*EVy}qmF#vY>yrL7koK4=KSSLPk z+CesOhlzkgQ4*e70Ed8ypw8Ol_8oq@pr&bbLkP+A3poS?9A%hUSQ>B@peT?5j2*#47g+iTIXLAfX6btd`u&%BWXZ7ar{mzK5f%h?|<4 zt_TXMh%>($TRZQB7qzH*)!TdT+*1IMpiN<1fuyRWdHMMzPe&vG=tEdo&MSeoJAY~nkhFWBeE&?`X{n$K9xe4 zkA7#Y`RPZ35GLCcri3=(W2M#{>QiX=`1-|m0`B1B_KuEwrlv_Wrhwt3^~0@?{vsEv zJN%sZIfntT$qNMM>p$HT#sGOAPKOyD4ZBuh1?CU8X5V)<=t@syWyN38IXw@%mBOMq z%nae>8?i zJZF-FZ-@0(t&kjA73h7bo#kC-CBH1q!6<4j^A#VkHPhVpbc}`()zILc=}_k@{x|;c z{&lX9kXfQ~2+9i|St6kMI^01UeDZ7HClZR`QaX2icmS{@NKjs%?bIEwm+s=oHD&;( zXc+Ya^m20gZ>ofu&AX2N)E)s_4g?q2A#seCp1B}h)7(WgRv5uDfG|@I)34o4y+2RD z%yvxr=bA~$_wPEC&_9C{2#0<4kR6kj1-9P}LfrS%fEy8vQlbds<;j{D!&*>mM zTMR*TZs*1XmlKr5VpjdBrKMYoWPj`^7=2vR4X~mbuJ$V0E^rMXzpR)38|)d|{9rgmiUvy>ak-5_w_NMYWHHU;`={u z8QVE($hP-!3lVB}uHdq}a10l=d!3~wa5KY3G`wgWhZi{26ZunL*bv`0vC-v^nhMm5-bN6s$MsHDtW{;3Ay= zq4aStFJPz4t6n@2VU2dkBCME*-27*V|NQ--7oYEGASO3s#&41Yvq!MDw$ZRsitENXf@JTFL!u$8ZG{Nbv z`3pti;bcZeMwrAw&V+<-vEl>EmQ$W`$px4K`SfsJ?oJ$UEPgKppOq|#@ZAOw5+h#s z!=Ki2vt-GlaBh64t#y> zO6-%Bs>Z31w~*9u(C;T2j^Cb0lO%lOymL{Ig^J?h5bQKZ_%)pShBM#GZ)BqezZ?t) z8SX!cr<8limnoG0Taxz%R^r`*aBh0tw^tv3xfFMg=Fg27Eo}+pLJs}SEX#`Hrtwz4 z7GgHGv8-c$yQ$;JfW=|?`i*gqZUv^~>uyUrQ&!BVl~4(0ir?1a7yuo~9tMg$SA4H} zMV3d>j-d!9ZHH(sd}J<`LAXl=ZpCwb0-bhrF5K#)%4WAME#DJX&l$W(2@|(wQTJp< zY>bTDx0H{pMq)r4?4AAHim|oVz!OJRHP}jxJK+Kr>x`e;*NTMt8J1R zPRNQ6opi!6EBbUC6M!$}I)f~vpC*4u*Zg$!*c`?~!72_5*T2(p(_NbGl7_pzhmLQ8 zXK<~(!|nF#Y1jLZKKDULT+bjIgEBL-2q4DDP+chn_Zh-581T9}ckedZlx(&rTqXLp zVLrToel22JVCi&X- z_V#9Sf1R-}R z#|#MK^r@NmG<>(9hE(76SFeQ$DY^c=vpSj6vi^$i+Q+qb`QN32JT#%V(QTnj7YIN= zxG$HX;P+nM|Bxn@OUcqLiWRz35Fh<>EMttiGakMoUUnLOF)vm^vZW`K-|){nMQ9gR z2#!u6*bPu%_t?J7FA*u!-X4)c&Qutun^u#a-QIrt^?OKENXX{#qf8ilT9}Q+YYrCb z1`YVK+1ocif<3DUU;6r{ddqV@mShFyC~tFf1^=?{T(l`+cKVgtyRv5o-nz9GIk?e7 zFXcF1$Z;4L8jchzXO@}dYXB%~rukNxTiM2j7r1nt&n3Ui15B&c*qWzW{=oLkd_HYR zNC-b49};zN1|w?yl?H7=Jv zF3hFC)(UdA>$TKlX7Ngxf({5eSnn#boUWs0c=CkTGOatxKYrD}Cz6num>9S^y#hg& zKDHH^)Da3m*?!Ob^M=_iYmhx><>rzhkx1Gh9!7nk#3+;e(6P0JON4!L$NywDpBcI$ zVDv%es|#}PyO*(@>C2e0ubC|UgZbk3osFnE%6&A=! zSHAHhUZBxsuNy5$o5P>I`G*Ut>V(yX%XMSuGuZgP&V~0xpMMbDq0wVZ?72a)Itb5p z!}MDN>Pu{hP$VpUG+N0r90@puceBSWL6L)@aNN=c+d8Vjg0KAQv7kkjrQI zN1EAE+T{=el4Ko$*{+jNRi5Mf6E4yKk5N@maF&svUCL(xLajNJPSlEqQgnzv>64~) z5kuceY<|J-l!#8(0T3HzPx$bGeQs{9IG>%Lj_fg4mr8Da{%o|BsEjNFqF&2aBz0O; zNSL{{@tX3NpiEUL+km=zKblwiX8a8TM)dSrkHzezRU}SZW{k;urBC0DTZ!zlqO^@G zH;yXM3V+%wi=(CGy7+h-v%4#a@;Se~Du-8XU>?+|n7T_>eSM%yhW&GQzRZ=^lzs^h zxAc^%4;4z?6+EBCKkCD3;)nQdb(w`lISwHpiFAuFGI`>!NUNKv$sa%JvT}0nAMPVa zaV;Xk!VVR78|RM7LATy2HG|ANE;;!YP=hJFX||C%+o)#w3%uQ&Q4aR@D%>>6MMH2r zFyK@cP13skFCado{cy!PDH)s(z_N5HmhgH~eOaKY-b`qOn~GppOo!#|%G+BiDqEP~GB8s!Qjp}nl^t3|NyMD|&NwQK< zQmTCE6$j1ZjDlCMg2Fo+E6m20(vc+grOLO?H^(5?Zr4`x;=qviyw+ABm1!Y$^3HHn=ALr6kLP+ zg?dbrd~mYG!(SXB{hz91_uZ=gtSy>N8rWJ2_FUj#Wxd_r z(-RwIUlr^o_Yq!gdfknB!jqYrno6`dG%%nd!nl(+PevG=yrD#^4XOzAAj3{hNqMwU z(9(iC6#-0M3J?wvK)$u<$vOgHTZ5mU^{=S%+Qzr3g9}GzQYalUe~%9X3PXGjr7082 zPk-40M_;P2@(P9mwYa1tEkGOq@2DS`lMoV^npaFLmYITh|I9;%otcB98Pttc-*3b| z?&#>~?eA}@JJ67PGx(n=T^x`BffTOvr8gcc$L!YoF8azNENj1wind}&;+UT>gvP87c1X@3beW6-k{pd^qIxCwk5!M~uLn$j9Ii%7s%uVAz zyFFco^%6_Gtx)bdwZJh}_0oAfUa5I_xCW7LB$NUKs3CvsBs_I}wX{gU#<7Pmb8Ydz z9ZG}Bu-*@d+;23^Zh@mr4|!v=lOQNNI~zjpdw|M>%dKn!GZDtDoE)(Z(&us?SA__2 zjUqt$v9p_*>Ff4#C#N5FBBZ?3yWbXn8JXUppxOFL%^%p&8001lX_?+9^nKsbj#O6J zqYqcFQFOZ1%oi*H<(0XrEL!;ebv`bV%;5EJq@pf)&qX01ARvD8X5?bJ9~HWh6;WDR zitvD_*q!ap&W@e7OQ*aYnec~dH*nY@zG_3RgVax!Q$vY*+6wUB{0*N53=mw}l?O(v z9|N^lC$Kzd1K$WBDv+Q+s*tt}p^N6Cgv= zUma6Suq5HY;GpJHDYlCjh&?Ob04 z#aIYBPo0qJv5x~N>8)x(4&~#E&RdJHA9Xmx9+6%PrMRzvO5&rIj>|A zZ#wB>_ilEn-lcpjzR?$uIbUMKwow}1Yl*}U3lV7fSQltzd9q7{4YJqHlSXM4fpir|onBH#L1I(;#;f(||0~%{O>ZV6xpvE+!7Zmtn3E{8S~+O;z8} z&~P>HJ*Y~T9@O08pGmX=3L%F!sZmbo_L+IDJSTM##jn=c@Rg}Y`bL`>ad?Pyjq@NT zoWka+602Df<`Uj?GDaR}ShHO=L~6#QMc)KU4R-eSC2Jtn-Hs_zKR!D>c6WsUGapjv zvm@Y2oS2##(dG-7atFDrkI?V4_AUy+|zUfw!5UKlm+66G&BK@$6~R?BTvce zdUE2Hn2?kzxdTp8<&7@oJ9YGt%>hi`$E06`0&YkXp9Fy+XgIep8=gRc!z=~*VCQ?lFt%b31GiWBKiEX9d zlY=;89kpvwhn5J45Q{jRcYWEJLkV-UG-CFB&zxrNskccFZhr~-Y*iqSYgHXISXx^P z;6hj9aJUK>ulO>lmg~{AjfiF&ut1;Sq9STwwYSk)O@d}>VBEdG77FtM+ifBMlhV3g zTOS}ZACdx{44vG5^@YL}xncY6@tww(0fu5|_VA;RKa;y0fXmXi?jOcN3?A#_vQ;Aq zR<(~UZ^`$Z1<^c*S~x4N?V~9N=oSn9^;Mg7;FU~>!Rf3&2BZ2rG<2~3#N0HijSHI0 zNKN%kVr4pi_YlD%907os#snTEZPL|6dswK(O(WvR$kjcZgQ(;AW?id2zQao!JX-A~ rhJ?V8=xTVw&|pvro(8T?hG)#cA+i2xIcIb85cty8xT{{MY90JPJ1_RF delta 22368 zcmagF1yq&Mw=eo_audP^0SSRkNlLd!Z0V5Pgmi;+hrmZmhk$eoNQZ=UcL|D=2uMqV zl+@k+&pqee@y59CF&KHT38aJ;)EI484CRHO(Y zhzxq`C!s8}PI%Q0lV zD=sHf26uiSGoZE{i=V_)UiUsDzc;RFE6}T|J$>P2OD}oMfcpMSpV@BFm4Sm*qw%B3 z{-EG)-o&)Paw-Os+BH+tqbOT5lZ01UPH#>$W-S82KZ;vwV$8K}9w6nQ1oEP@tbPtCk~-*;P9!b(wIEabosMn6 zd~}23M`dns*~WAQeY4m*_9LKnAe}n0D z07h$b9vl8H#*pc3rwP|fZNa--8<6LAk9xxG%<7ry#0aa}6AcLtc<=Ev)4YC8FI-u( z;RnBocCK3FWd0Z8u(|uprOw7H?8Z;gzL^_(IZJ=dvs3o{r%e4=Ebc3d%i8ues5wdkD7Nzp9WL0&yQ}B@30CqUl65)QxS*EqczQ= zL7;A6f40P53I&GLpO*0)4IGP{T=WockIxgvfl>sUzY0ad$C~$7WwZ8(hnFX@3v9Z0o+xu`-JY3=j{8!h6Kz47} zRN>_h>8Fm(8)O&~WPNGN@k^P4bd<5b#_ITl!N2^)FX+VnZWq>eL`6rdYiJO^VI57D z#M3G*E8`wu0fd;_a38C&c<>CAQ>@8kou=tg!9*^Ir@wStW&!4EB)EaEvp^SESm3n} z>6REY@HeLa1RA+%4C(IGek`omLnx4qfWY}Pq^|-OaKG;yx_`v$Ge(~mUkjB)Z63Gl z!`S@R3Nq#s91=Nf9TU5K5X^>%D43;i9<@hLobT!;7YofJ?olyS^Zu21Q9Fk|kzW>b z+4i%a&AjZ-;tS~`Yzp&aP@@cnK>b%+2M34uCpZz_cUd|(M31%TR(N^w{Gm^P|2z;_rVF57ObEU z5O!XHv+}F-e)~pJTwDwQx!wmtHe6l|FsP(DiA_d$s*x{_*D~nev*vGyzK%cV!FEzso7HnfKiAI|Y`2a*B-EdkFF`Cst$ zL?KA@kJx~sZ3?6FfDey#o3wNW`-*{dnbN1u(3r6jlD{Gbgwy6S0nb%nfV&y>H%nxB znP@@TYn(tzR$5RJ8Kd0YE1o;Ke{pT@%6O$z6ar(rS$l1OlThqS8iAJf9^&WAx+K+J zW+D(s#MP#juk9A+n?F-Se#OVBeHK-qCvkR&xD5_hw(QS3mA~=R=og{I zP*Y{C)JA$pcQ$6Y8BLOhjLfhN=v7DrCUX~SQ{{ege-4sA<#M&hA)`Pj{@H@In`n>* zN-ZsDR?gxNk-xhcmv+*^z%9ZcVS`So1CNEB6G%2w?{;%rXmsM@&7Eza{{H?EvW00` zS@mt6zP_S%K5J`hEUc_jEF=hj|L2sHl+MS$WRzdNH0zHd)ou3`5WieOhaqabkIgEK z+9{WomcZ>DqItuS?z6PCG)X-qMOj(dk)k0r(6#SbSXak8e~XlqZAJI3f)hP)C~j#p z;=%~}$d`i+pdV{wr!`j)!bmr5*>3+>{(AgtHA`o^G=%fH@b>tpIXQD{`{mCU34 zr2M`gM@SuqM|`*@XH#wZp(q z7F}R)rVbcFm2PTlUO^LlJpsT3`s+tUr zceWQ(k3FDyV`*@0zH|WruB&`Gs=-G}?>T}N_hoHuS${YRp&0n+=5(^~!)J2SR6Gw4 z4|0m(*K{dltIp&H5;>A?Oj5JhPUe30#Qv)++ddK_@oiWabBr%l!(2!!yDs0zsR;^3 z5{ZYM#DkB4qZ0ilG}zRAmRsA!-8Bf9*h0QY0b08q*BT0f)YQ~GJxa27#M7_4e17n& zKv|zKcF;40zQ>&fs7^p}vA@e~T zLIIbSU&~6>V1eV$gu;F?iGM6e<_dz=VF0&R4<#)`lhNf9GNYO{cnon^zvq_L|49Bl zSxPzmHUV>*$Uk5EJ`jrF*C*eDBI@z&U23?GuHz+EepBNVuGJ6O=y_d&n<>@%T}C(i zhgG>rSKDmOn08{{%TMg{LEBe|`p#n8&sUq7F5C88G$KnOKYtqOuam25YlqkUqW_^$ z3mp$#X{?ix z@mR@8u{Wok#x!LNC^VSolo+4Y@2&+noZWvONf=~@AG(Q>WApqw;Mt7tMwly=dZ{Yd zw1dr>7j&J%H{VvKSOPToQ%)Y6!&W+P7dvee!U2URBjKDk9&Y0P*=2dX|XOI4S8G=@d6GD^97KX1O`CR$ZdfH0gMI|>=C7l__1}W zP=r|fK@KKl1Qr!Z-giWVqz0S6bHPGRnyBghC|fNO7de7rb3I9Z4R}Sa7HDAz5-Y6m z2+50XD=H=q!Sg8117QBqRtR~s===QERw~u!XUU!yOJ2;kO>9b#hlry9L+YQA zptRbnSGWkMxV=r+TYx?h%BHC3T%S*O-cv5fLWQ~{8Al;Sh)p<8N^0t4LP^p(zveIr z_J|~GHEZ;uKo(=|Y1H*Wr*TS$yYmFY-`~DbFy04!+ACi}6L2CfLuv}X zyc1qcg!a8}wWS-BgRWeZ!$U(MyiDlesqogcwiv{}m;TnMSj1X0D~Wf&8$&V@f14qc zq=?}*eUknF3$k+J+kSL?>-v>O(*6hEgY8CKL@`7hlRl>tdSf0~Ln9q@N&bP?OaS{B zKX#7iQBktHySwuCn%FZ3M9*Tea{@u*imr_;iSbD@KQnv78d3kU611jekq)vWwGlh6AA?i0- z!@#AV6x9_nxz(E?U{_-g&ex@#s2du_78KAYCnv)xV}p}ZiVSwHe6WQ#vee1U)VjM% z{`mf-_svQ$MdaBL)!{pt(Yp4tGaNJF@C_8yy_DE`oMjqS{@7rHt_NCTkZ9vL#6A)zMksN^eb9bkBzAYX2E__dsJ3H|G)3iA{kB1@u z!v~E1{(c@_6>aQ5H*s0k2W4fiCi~xaY)HmDE|j*vD!*VTJ04Ccru+T;d#?Wy8^XGan zjnN)4L{7&zL|(p?rRw~0=rMn&PZ*l`erepqK*d>dorE)`;LO!2XK~)c*ReGhBPk92z69hk+4u%(BHnrUU;) z42CgDSLZ=xh>({bHV|GCfojCXq0(LEQKJ!1&OcafMo#hvVF0{Ogm8N#`r`u_SoKwT zY&e;&5#C7piH030O&Gq`A;G*OkbufZ`iTP;EsB9K-U=2)ZPV*_H>k+Ktj|bK529$N zrl&`AowVvy` zuD--;i3;C14RL|Xnd*QrlrDw9%J-+H)Rk3K@@s2}Uc7h#4>dt~w|qY^J-gD@4yUhE z%k#CQ0!3|OoF|ZqtRY7#cuW9B6uf~>Cf^{3>va5#Uu4JtRJ2Wo_2AHf=*jQ$3=((E z$<;|LU#XMGvLaDO8pCsm+6(z=R(Td5mTYnNko;KIc7F(oCV;h#`JDi%>qI-br#d93@FHNi{aK z@D_Am{U4YJ)<_LSgfhq_r~H{SSEHCEiY>R6W`#Vd8fKXRuL|AH)r2W3e$zdbw12^I zugh_yuKs5v5(AF$Ra)0j7EpeO2q%%*$xkMrG$Ve8KwcBO9&L>Lls~Uq^2?^i4bgMS-UN|}Yyhacc6JsL!c%WcfLmDhp$0r~tK&e+ICZ_Gf zLu>%0NC&F)>g8E1!iG}ccZc-$_U6sZ)TWvtkx0cyl6H2xwT+F9RuevfuxSNo^G~HV zsh4WQ6mB@>66xzP##$s{yv5pX6G}G$0idj2~lhU@aglO0hQUHWBi;jTnP-$)1|{4RN0QNRd|1)P_ogGcqEKo0dM=hTbbj z3Wy+b0^YFgCRwrMT{_LQ57#MtB@xyuLTmiV`!En0>_4V~_i{HP4-<74%an(gdF3<3le@HxH4gCjn z#JEi06xF}e(6AubO&E!X_O0h7OH-_wKPCsfLxZu-GSI0*6HbBp>}OuZKN!v2-SJ%? z!fj1?UqND)$0LkWTZv8HPhPF#r-l*@-0P%|Oe#Urc3Irz?rz4=(zu>@L*5jwP+y^; z6e{?!v^3HIgE8cYUj^m)1P-osH@j`2lt-=K)kzvx4v%)ih^;Id8;`xN#ZAudSDnkt zhiAU3Zz7v;FwQWxFWeelu4=X5@FTdTOL==ljK@T{tWkI+8@BZD5)aV(rEn1P<2Mf|LeXYV3^R*BfxL6Ul{a;}+gZ)N2^$x~VRkn>`nIrJM5 zf08k>bsh`Yfi4}8TzYXp`N`{E>_lb zo(}huQ&-4X1I|LCM5iGThZ6vSeuy7CqSSjx{H22T4=x!MBd)rlNCuB_~Twoz;d2nhSjuB+?!1AwHG(rB%I zn{f=W?4+imgjzGDdb21#d>aKXSosx4X^AS@b{4QaA_+6nBC(VN)syLD)Wcbdz8*ga z0XP-Wutm0dS0cP457D`fvrCd?FAkQdmc!!QE*+0$^H;=*{-C1{;HsvqOlqlu#xjOa zamWXu&{V+kJnNKZU=Fjmjs|Io9?%KCLe4}i9}d=BJV?II^cBmX|WM9V!e z;WklteZC((>|_VpJ^QYlSs0plO8vW*@TP*Hhn#9N3;XO11-wf*(Dr#z)$;C{(TC(5 z%oWs4TgMn$#9#u%f7pJy5;IZrrh;KO1rfQ1xan*caj)g*P#h+ zK*7_ePfMF3>H+g!oB*$Z@P~I6nben=hTtwGIW+imIP@>NcJuwFE&$Z-q5>sWFRU?r z(p_#gGfv&>~ zp)6c|}sRKd!h84mBg3NR4A7rj^`W?IT*1H3i5$ zuyW>`&w>j*9`KT}c>MT_u=TC7wS~k5?Xmi@0vn+%pEwM@Sgdxtz3m?KuKwDvuxVW&l{rS!v-&azf@YmtSQy{#(@7V;!1?b#Uo|d!5 zg+^psF%Vc$R}$|O3P{0}U#uU~sw2-BWYm2%mhSVj-)2Di*55>W;RTu!h);Bheeq&T zK8dG(hNZ|#BIDSL2Rt^h2z8^`Gok(pV?Sg7#L>R2o%y=#8a7R+N#aKgm*nXK_#q}) z5f75f$j#x&lKBN4l5%oc;ON>J@eq`WUp`NnkGt?D8aH20Pa#&|lBu+K;Y^jLyrM!< z`0>R2jnlzb^1+PPs)6=ijPCo3OFz$8aDbCtKPb=-5_bXWuk& zxaJYWolBShxZEl`g34cfSrpJg|M+&runC1h`VY2fpx}riEp$*Slt+-sb?zzxk!*{A z3a>(-pWZMB(#WWPnVxeApQ!lGFvu3?&%z>3+v(!#rpeUx+EQ|$^ z3Jn=te<9u4i_*f1JJ@XBUINdPHT+|^9cCq z(on#1R?wCB`w1K&F2g!C%FH*wP!LFz4iAliA&Oa90OD=6c>g?oq%R%626y zws6N#iQ-uGdBZiQH813Yb$iH=T!)xY_Dvfp0Adq77XF-^mszlS=KDxfQAbTtC&ZK* zy^t4(9|eI z@(g_BnKXCJZj^Om6ych`6}LyJh;bY*3iq6@g6+9T^3K_)4_hG-7DfmA8LTp z1rCZBb4)5!guylMEz02LxEG$mEBqu`%%S+DWf|I6iI*4P{e{){?rw7Zy)9~X5*a-e zR>P7qHYNjm5oHqA_`%<3LoVApG1*zCU;kz&V!*j2#Dk^a6^$5BMxis>)<*>yB!ME5 zr{Q#rl2COVX2`_Uq)0sF^eu0Xq1TefUP^m4KVMD0`Q99N5kE?WsFs(NUEbdL0yIcu zIi1%LdOCe_=%2vWz>ln5D0|d-Pj>jIkc2UN{y7AkK4GT*b@$9KGyw({)u*}zpp2C) zPO=CxoBD!PI&7Zw)c_J1^gnlJZ8k2wXlZaDgkPDo+H_r6(7>6=+D z5n5faEx%BgaFnYe*Df;rKJ=_LyVDM3Ea6axa6beK3)9z7V$On9J$Y@uKfdjkuSRp% zrTzZidhIQ>&SK{g(tDszuo|MKAhU1UL~|oFF0vI<3-Ul^OhN@U)sPU0o**i>_h3a) zQBiudHSJ1PZjqz_q;w_g;Y723wG#IOA}oqGchi(EI(Amt@fK>7?_cb2y;4b(U-i_@A{=ptu`5fP*0_$;|{ZN&LpjZsZ_m6es_$r|3PnAlwrl;v0~D))69 zJb^Jw)H_GFhoCWfAb2wfj*Z0R?s|NBy8NFM1!^TBqcA*QF5sVNIj?j{IXaX4@Ae9B z=>I-$bnH~R$EegCi2fe|#82dXaD=ihOj>_NN{Wx|3t(#jS3;`RNW@9w-M2g#Op z=#&3LlWxG@<*xlI&@h&f9^x*^2ok4BTXc(FGS9;;_50Ac#PHq+g;xy2?3 ze)N3!<*`|Qq6B=vzMOdFc+9@Mlqk2imoFak#OwJa)?++L8g62c&9aMN%o2uzrE0># z#7j+9bWan`5EwOHpg>Gtt|CPZx*J94wl46lOa7)b8A7G@5#Cpi8%QnX{wcPqiVt%q zH90jnUUeLPJrBQc#zoXKL^w7c|5B2}n|4Arz`gnAC$X+3k+6dQP#Dv)DR&}^f>*{Z zB&gOUbfh9YF{Z`^1D23^adxjkjPA_g0KuV7NvQ~1(!hmRs`jJ3K|vD#eUlKIJj&98!-bZI-Q*O)i0@aGHE%-^p& zJ@GB1S7Tu^snTAd5<9*Y?cg@L52O0T2=Yx)kp`i$Lc(xS_{R{Y$;^}Lo7xDZ#b))7|2X)Y%l2w-&ai- zS-W6an-FFhu*9T1x}%0_or7S~_C zK*_kOdca@(NFRNAi~Hf6cK2BFul!V$`wXD@ks)`8K2OdkOQi!0n+hA|kcAkjhyl_n z(kpbAx<&^0mt9iru!)z)`aeso71~r9X~pRmo-3U+Ne|r>i4}6d4=8zxZGGFXhLgFm zmlcSWG1o-&DP5T*&1IfZe6zww@K-rk4$(#=HGtHRpr5Zzk=x&voleA`GyZ(CNO%$D zNjSVrOn04n5>prW*{(0Gc&9<(DwD|X(HK0h%X{L1(0T<%9|@r(3+?|-*GSy~@M=|o z@EB6S_N5T^3=_kpU!*bpBOlK}j-li_`=PNoe*W@5trk)dRz+PCF7gzB6~+wHn(31A1Op8 za!>*&-5B`@KFbLLk-rU}Z~~GE?>VHC;z{9}_`I3FPs391 zKlz=e?L*P{iR02QV=SzVTt;Tz(BV!q>MxP8y^_!ab5DM*^YOgmh;f8GGhyoGSQfK- zMncE1nie@J@3~1@V$lAm0IpIu{qai~qhh)@ggG7C0q0hchByV~B~j=>LfH?bFX3d?W& z&c`qejVnR>K7@wyz-9#Ji4A~BgI-yQQ@P% z{kqzp8n^I&Bf&vtr$Z75va_$)@u|K~#{5xzYfM|G3gO;bW@eAJb4;Dxph|eJaMwA5 zyTo}#{CjQ;HUIYG5o6Q2m2`@oT!PMnI`w~}^{+N67dAY~>(<8V!IMgphToHF0qSKT z;HOWN(r~iAHFos`5-S?pdxVhAWdT z<3o1#z!^n-quIrz>wDnSO@4kN#a+OfQz5d8;Ht_0jzDK{*lk{J|n9+U|SS#@f`aQ*XXWP1X;0zBlGLxdYN&L z4Qb7byXgVBSW@Ce@>#1n0 zI`3q8YwOT-E9*Br?!G?@ zthc_5+1&d5_f~(d5Sfe9jPYTfj8P zut@BR0=!I2VgQ-z`MWJ9+{9A#Eu`qd{qgB{&xZb zd^i%ZH~3BHRejsrEGYNF93wNvCU)QR16sz06}`TZxei-Fs1MSvVWh!s zja98QJ@eXgLs4(u#opanoG=oVy}kzPK6u{I){X^yg{TCU-~5|(Wa!N_zYuM5!W1! z6vybK4!E5%nS3HeIZBNAa|xstzq68^uwCi2Y@;TzoBx<O+D)&snk1Ldb*Hz2esQR)#Bye0Rp!6JrMVcD8!q-^p zZ05~3WQ|15M7CaAGAzegJ5_XZDF`5=(#19_$#OkmH6lY?GdV!mM|60uRN1wV&Xam} zrrI)o7q3qHb#SrZhTQH*Nkb*Yjw`5C%8)Rnfvj_^2qr8Uko`%O4DPEXFn` z*oGrvIre-Hjq=@2V(TiQO$pB~(+6EjNBDc$psI~}L}&Ix*cCYc^ErzLD;h2~Zzc2X z6CG{MlOKqK6>FNoA~rXyir^!QOj7m9a6hoC1xpg^giiy|AhItr_aynHFe6vBHiFgs zF50mCNXzl9JMYObz)e5HC+{&9XPra%5W0dmcKGZXGMFx^^UD{*DX$wA4rVJ@KEA#yPVJ_96xR;Emc=nqP_#;F z^&t(|yVWFrJhF7lP$j?M0@Ga2; zFMPSUHiG||%;iQp;3OJFeEjg&71ecvt4A7X7%IyCd@&=mIG3o0_XK3i4DJf zebA}BA#Y=gFTA-8Ts*j)I9weHdYpToE%@X9@#v&AzMIdz=hF3s(`U$ingUM_<1Ec{ zUw5NXuYU-zgWSJzG4uqadbUATx>FrwMW^#`3KjsKTZ8YB#?3}T%j;VUvj#u!4VGK8 z&C~3zn$I`JI{EHBhjMqXz|C}PegM4uJKLG_pTUd&xbQ!S4GJAhC3E#s`-k43+5}`A z|DYOFV>++$?6Cg)IiXGIgzfTa;P>x;y;vtv^?oj;6P;^l|AvQ<*x21Z+g}9#GKrmz zMB7f@TKJH25s(x%?1LNopeMJ4GwbC29`cLJzrmPbROE#DT#H8c?^vU(fI&iWaWoxu zMo+)n*m2?8IO7}gArr!7%!uS9YC+W$4 zf8Jsspb;Z~^M0|(DYt3zc%?gp6Hvb`Y4pGL9Bj8lUszl;Kkc-et@3$xzrVka^RLaR z4{qI$q#&WQKF)usC8`Yc!jhIE5`%8qT#JmVT6+V~{%xkR&badg9^2|h4pTBi8sp6roLi#iCeB{WZ(ZG3#4+4aB%s2x>M3{ z^|JU`ZosSFMu%T=a9};{1*%4!;+3g5_|SsW#=&8x3YDo6yIcuD6Pm1I;=QL(YJb8Bd9ltp2cQTxf}j4#;7tb@leQ7GLjLqlrE&Rfqv z7Z+<=68FvLTj1T+=>ZLRcbePEQZ&_IH(P)z^5JSb3f@1xKTn4hFJCi=`|N{*N1Jaz z48UMsCv2q)6T`R-X6N-)wpDt-gkP%U^aWTe7~J^1^Xr}#TBD#3APvKv1TQ>UDoi~T zFv=aYwK-?5ybJ&eN#c8483~S`8RXfV}I#1uyHr&t>K~A3A)NV zM82Bev4G!B*%>)4w4kMrlwr-%9pjN6a_<@YF&g@yLrS}E;Un;nRwNqrU0-Q>PhH|I z>KdgiEuoL}NUP>uG1UOO{vyHqbXFh;u-a1+TQ(i!REB+MMQsI@^__or1L<4nIF5B% z*`6vC_CCt9Vy4I>g|W|7qSm|I=JRRe`J~*C%fGt=)U>pcFWhXLoMu^ybXz?unXb?y z8XOktL7bA8*@!o9TK`X4W7L5EqOCG))n;RFWH+Na1m^^9ZdCatG5jDAL_N>qZ}Lo( z)~BXk$Gi>Em6hWbeHHtg_z@fX3v%j8S)YC4|Y^c zotH?3k7y6gQY(q~dOvM}!JqH%KNH0IOJ(^D#-qlqf15x9RO{HZ;@ zduw=*d#ekU8)=Y52PN!FTAeO;T+=z&C1K~+gqL@w(_W#6W!{gCnF|u_RG87liQq6^ z&Cbje-Jmwt@ksx6A;?{E(oe?U|2A05;GNVvu;uDsRo#c{Ua}9GzMJeUMU8BnGnSG1 zqr;EHD{BJ$GbWoX@tHVpH(5i5?;9Qf-=tqbu!_L(O+KQCV=zr$RpJdK5kUyTf*miNiAP|KN75_WnBj zl5a35el6_IBJM~P1G zo%epfm3I2P>0V7~BSWzos4(W@g@9xF^b^)|Vw`6O)^%z@~2iU zf~`FIxG%-IiStJ-mle0am1_R0Q8H2aQ&-v9*|`$r>Lzgisc2NS`Y0VP8dC;fYL4F7Pz2RQt~|~uNx%oLL}#q`(Vl* z9mVkP*dSIXO<(Vw!sZPie{b(Xui5{!Z$wp9ak_hWFpb6EIAW8VE2IE?SC2AStljRe zudg2-ICZc=Vrq4tgx@>`I~T)_gVKpM){@kt`Su6>oTUs7()O=%pFWbdk_yE7Kha!C z1Jhb5oP=(7Y(koEymVcN4*+E)F6uP`pV8$2sRx!rIS6*BaU6Fj zElg3nc)=C2gR+1P%E8yTiD)+UY#%c35xQ`4(A@iazv&-=VXLPt$}aXhwV!E!fJ;SZ zP;E5O)F1jtE}nJKr23VPOdf3mfO^EnrsetI*aufBgY53Bs~#099{0`QN`Erq7uM2h zj|c2WBGN*xQXyg3ao0o{X^LuS|HTsl%X|@;RH-Iwx0S5-lU7F9@Q-$qbwgmBv^8^$ zWA@o$@7q&0ntGJ26!sF zMdfep$t%J#hxeT^aVE!Qx8yl7prpIL)X&HZEHOzOM;qy87DAqBYoq%X<%p^k7B?}f zawxjd>+okV8{~_zGjR0t%^}m{&hrJk@vY4VtS??Y-`xF;LLx8$K;`SdPE%A34`!lJ z=Bbkw8t|bWn3K8F2(R}Yo1N(lox+7L?zzTR*nRBBqs@v+N6N{Sqf|ybZ)zu1s+Q^D zZb?m5{&%uwPm;~|8^~XhE1Wo&6SK09OF1fI z1TiCvL0fJ@mm$2@VuhY$eMObJCcF-P#Ay&wDT*ia!Sh#B=WV5x z0d=O%$W@no7m81LB-$945l9G%=5mN3o-yl_IXD;>jATeY?Uc;(@EX)9^&AJS4}n*X zC-eqeknG3ka5FkKGNg&UD}G7}-51;_=WOh!LXbDc7i-at^51y|IU`UekV6lRdjTWn zEZ_g)#e&}=Ode~LhwXb$Vc`t0SBl|{+KUx#V4~V=^`qsajkiklG&E%YkkFvNzO`UW z>WStsH4PbV$hcJCKf%&Kt|ld5*ryUZAFW93cVp8k5A`p9b}8J5uI%WbIXgR>YxChl z3j#b3e>yA*umApT5T*MbN3e&SIkEaC1e@^nl#LcU8(Rk5sQuW{Y9N0)6*Kt z&`8~@5jPo>t$$yJn;Xh#(mK@C4z?S%qD$D+PiMoJJzDw5&sw-{Xx2|WrL`> zGTA^LHE!dp7O`=~_rh~}zU|#$`s&sv{^8;5zm+s9S{VTD*nXx?l=g2;VJb;l^ zFNAvwDY(~h;ePU6==-Yd zvSQoRRIFxp0KZSUL(-dn93T~_ov_Y{Gos5oCyVxy4Ta7^Gm`;^D{BpsEvn_q@JdBV z&M@yiwx8xPf=wE-8g#}?eelU5+YHNBsm1-vI6;zKGvB|H&9{0vx!Bp+^~{|HCEoC{ zMt!pV`b2+NC>0?FdXgUUh`(UBWF$R7BJfXmGr)ng^7i(n^DAuFo2ySeSYDA-UriIk z8$MbPT_)GWeOCHmVvb+0nnif&kVFXZ?+vn))p`^KtLgTpe)pE_4fuTai%aOOKulaq zAli(BSv`)>U+sd%vd4>pSI(Lt@XknEb;qVLYOe=20y=ZAK_(lNcjGy^CD$|53F6+L6gs{@G5S!@?PQih49?KQ^mia#*(N4hP{nlv zpLHkd`2h1t6T^eUAI)ySI|&^IR+gw>lxvG}x*I?KnOqE09`1x8Psz>oF6^vZj8Jbx zUamXIQT_zG0=XTYB-v%%_eVckQ!@Ump^jpZ{Zp=0P8W0_Dmp4(MnLPGqRkg>(wwM< z#RttN4hGW^O?uGLZ7BDv*e{Z>lUgn9aM-j`*L019XSN}R7|IizVG2INmK`vcwtr$; zDVw|!P*_MsXn)OrKF1yYFO>S%CTL#@qVfj|z}X|c#dun^$g0;ZI=fuy;Y3q>`m(u7`UI4WnnMhj(iz!(U5@4xZ_N0&8OF*j$ru?yj~@ z1v@jhB)*CQ|C#P^Z?CVbOLD-~BdojQY8LgbkJf|1U`wjM05>@Wx30XBEXW8c-R7+n zt)z~8avpPd`;qFY5a{zYqmnO?&_q^EkEJ5NrLQRIahGCSFgZK|k&|2P7ug%~P?(xi z)+rSpP`QbV;+ecLLo0m{&;5h?>O@i z5Nd#!5(Ivj-H?O*SO>_1JTBx1JjQ*$>#`CC7_>!iBax^)+d)Gza_ z17-U7CzUTyWr3(5iSJb;RrKau(Yk|ha^g9$=ZN5guj4`((TZ#As!SX(A zbp5C>B1&Zb9nv$Y6dd4LNY9vEUXDkFNmlj5LS*B$4^jO+3k`Nj=XUl@e77nSAc_Sm zjIThkcip-$R#m1CX*^^*-|i1fGC-eu*BF#9HEBYq{Y~iCjogyWWuGDm`q3YzDvswV zG@-j9PN2|H79B5-hZYzq;AUP~7uhiqB!{{m5C0#eQ7SVu5<2XJq(GQTM?) z{(0UfFG`fxdYo%m=o1eC9Q8$F(Fd<lM4|p$SV9Dkn>bT4pC0^J z8OV82ZEDARbsOox?EBaK>T0y(+m^)jf1}(>7}JL|^}{!2FNOF=xc^?Fizm{c!XDS9>fv@0=PRlgU zy^la!OKU3+%9T!H*r426)(vvD zx5t;Fx+f&xlE^e9IBk$baVz@*$_kE=N4K4Q*QYR^ot?Gby@`+0F2r^r_68Y;3(D+B zX0@8lxWH%1U$WcLFIB!7u-pWR+S56_!{&w*0r2Ji9OLj*oM4m-!V-+!_rK@Dq^ zF6?}!8{%Zh7n$3UJAdo9o53cwND48DM>}$DqFVl6Wt@39l~@_*#q$p*1)J#$l8N_2}hU}HmVrwwA5C$`1tTXR5J@0$`e#i0t zGspaK-^YF2*LB|4d0wCE{C;Z^FR8MLJ;$MKjP&TYVBMy0eUz+>s#b~YkfzXdTe1NZ zr}(S3^R(_W_H{05Ri#s0lKmEj>j~*_`tCDt6g;YQ%l7pxV41bjdwFl0^*>KTy9sd9 zBl8F@AUsFGp=8VipD!37~FC+F^yU{z1{cTkQ6*>IY%YL!J3F-pI(xPnb3gP5cBNN9I5|1bxUx(tpQi9(WwyAr7T&*E(a!#M zvJlH_@GMGv<9Ub@u5ORv!`05=%>$T)<%WK}GMK01r)x^%*|m)IO}{r#yK$6^ zOUToUenDwentJQ`^Sg?XUh}BuQQ2`^l^{;_fPy?#3sOGwuywqG|A<+`bn<(ZmH8o~ z+#PYGmtuZuu9*NM{=j>uRC z#+ASru%CFW?Y(S%Fxybiu4Ed*;0(c7( z+L?eD-qM$0GC8B-lpYwd;-*{txGGE=m2tIS8*mEp@)BNTO{N8kVkgQiriAv@Yb|cc zq1%mA(K?rH92^{8ebP>+eU%9ClR0ONeHry!BKdvpF@Y+`QfGOC2()68n+vxV7u+`} zaK83iEi%0R17w(+ySm*zlEdY%cj9c;!nQX3EU*{&MrJ+PHM3cMxG(SB&!Cn*>HYYU zYrS+Kmi#(M`TfnD{w+q>#Qv27Ta8x0K_dXXSJ^&lSD3=u0Mn4Ngwj3qF!mAs9pe}6 z1S%WBC{wWBdx`vdvl`1vNXPeb`UP({c~61-8;0ZsEqHEkO8)Ur{L_qw8S(Na{Z}jB zL+*bmu)JGhd!2;t*iQjk@?!a}>&XkRGd#X-+rHheTr(-oPFxna1B9PkhKTap=^Er4^5vG{i*>& z_;;D4UpF@U%L`KV$z0Ego@*B_}4>lt!mszI@q$l2#Q>UtH8xQ&S@ul5ZIciEy4v38hf0 z9@cH<`)-=_jcf3FL@)QiHjD|X?~95LGhbn|ir0s#0e)(QAhBG?}Y zB0X_c)LV3sXLE{;Pc;j{VIO;D2#EQi}jwL*mU<;K~8wE0Kwm8?i@B2eqM*G}BMWn8@E$ z&~gJ=k+oY}Qj+YESP?NdE=R|(y26C}>n)DyR4I+*c=k+Tao__H5g=f<_OalB!5}z( zw&w?9P}1!s!@Jt0jOsqxZRLPC0O)93rZ3XDwoB-!+R@3sZ42Rh516RATj!medkITp z4taY_Wk5uL@QVPm<)4*YTURF!*2jK!{pHo~c_w_2f&TR!JWj&nd8qL5bXT;QozTU( zG8@eNh?-@t{WHU`ZBuY|>@Pe16q9xTcg1647daAS`Q2P`hg2~-SG~w*MWFd8FVDuw z#auS)?aDpd=#Q6K4R)n48%r~yuI*5aoICjE&kn^Xg~l8c-aGLZD43Gb=)J>T8yaH6J`mws68_emLD z!n2JzZzC+SJX%Sq%pF6qc!)y{3Kka8x{5d2so>KW;yU>a(jR7*%-#mz)(A70Vyj~( zwKCkdRaJcz1S<7!y3oz2D0v`c$& z+*9b33sm_q64}I;Bkz`S@1DRD$EP_!2wD6c;Add^p`n?!(Ij-Tz3iSc0##5H7(}wM z#(fX8QY$Se^(NeTqA$D~s;eF^E*+)s;el|`bbTnsbj0`}mFe!qwjFWioTZi6rM}-m z>Y;8DW|;tf4wj2s`00G=&1AH8X9;1xS$V-hVovZX;o zNXy>wF#~}=#A?8dng>)wPw$3;BO+uMwIm-jHZ~{xj z5=f)#7Y8W}nYupqu0cwuCa!-Y@W<@^q@*`raZh;CwOtdh6xa9G2Mrv8NMIw)<)tB~ zIzn$_JJv2V5by4~RkG&}v*Etng|R95;SHSvTV`HE7blxc!ZL@3g}kOe@%?6A)$DJ%VJvVuYR(5!I|O`pk{_X< z)5mjVq@Y8OD<3t}{85A1LwXTw-KaLVot42G#I&7RD(qvns=Y-8AM_TUHdV#!(^emd*MPYB8>3EA^DnTO z9vN%7fBuXAVP(}94Ol)!c+>Nr?2zGjmMIjm*|wU#ptu@kYTZ`5xJLL;$@+OLXnOTv z@5Wyj1EP_Cu3cZ3%(}L~Nj_nT$r3RDox%T)oxRaI^n=$lS*E>S0;4X`)ZZ_?kF6XB z0G60}H`CF3{(wo|)nP8^@fBMrc7~OYzjnsH`?NC)D0?I1vxY z&R@Q=$R#$TwrhL@4P{yljLi9&OlwA~CmkBkbaXuiuSWHaGKsL9KDAC@mh0JcgnsXE z4xBN;-k=gi@C(Plg76c|!%-6G3W0w0{|B*>F=>rxzP-=umLG&yeW~0Ta_!nUSeeh< zG^oq{qCPV-b1^=6kP8S(qz66%bEI*wG^lH6ym#Pz{}%Gk8-PJ^A6r&|%psZ22DI9j2ab9{G%Wl|-X}hOvl6xbi}DeTf#Wzx0Eu4Fpf>;jeZynHpW6 z!ys9!#K70DFHg^`i%}}!>y4TwoGeoQ=uuhJwQ|`)8{SdT7JpF|ZYbPb`x1ZAr1b^LR1AhO!Zyf#O&CJQ9x)1nhm;^hpOYMC2H870rY*W! zt!FEHQ!!UPLo=V8zN>ACMVua!y~6+yuZ0qp`vG z)|^Ts&UBOmmoQlqIQvD!iT~v_>*l!?9b{h6Uv*H`^yPP2>-XP>dkL;mHhiZO$Ia*& zbD0XXj!!HrEe-7^DRhG%;+NbSbON(o`V8CViY7g@@8%PPOFVt_q;P;vccVX}%MaLT zncF|%9V5TiDl6x1&u5XNCiMtTp3#naSZ-1@b1MO!9ciQncFp{o;DEHFvglcB?0B^E z(1ck?pUZ68`tgmKoo4+v(3o)&JzzGhtogazV1L;3k)ShbL{urw(iX2n-A$J<+a|h0 zRFp?-0&%sVY?o=E6iBoE8A~BO=%88oQv?-=Bo~6ecYtfsr}Jw|)zxnr!U?Tc$1cIp zPn+G|CqL|iNRJbbOE;_NKC4?8uskdq4ouR5(LAZks81kNvQ5Em+;ncobSe?7n!5!L zor8uI-ZfSdvYKtFWUT_0YoEjD0D(U=f_!1@=RBKOza$i(ku<)_yzo(5{@4d}X-yX5 z2x8YQe?*qVs+c!oU!&q|ONMJRZ) zYy}|47@ptnCq54?Ix1si*KKnE!cC<_7~`~w)MA@pDPHf7{)3*k#vDqiwkR{PW;64r zJeZWIvxyrMPKhCpPN&p;{l zE~4?PAta!tw*Trs|43Tp!s1{2C2rL#GRF4BY*L_Ijkn(3i!2W$2T?v9Jdek4V}r@Q zy1I*MK8M~@9bE7CRO4MfR%DAB1gwO+oR`Z!{U(z<^-UlybuvLmTl<%#{r6TqRsJ}G z=KN5|YH(?~!sX!H(+by$_fG_eD(*}7p4bedP@{z}P^g-F-sIUkzJ{BfS}z`y7EY`i zV;^`{Ry*;E6=@s3ZKqjm^(m;tqxwVi>3hoU$0uu|a+aHG!601m_TF1m{Q7l5GhT_G zTSFlRoh_*d+bs{X-hSDeuG61jkKPD$c6GHdR&2}C>pU5sWyn27kLZ<#Hk759D+#xU zu=(;|HVD+lnp^)M39$Y$F0vk;bin#zM$nCMwLM`6_4V((d877uMov!dS<6N5-S_!o z-fO3h8|bz^-mWjsYvypMU#EM}(Z;i+zklaIZQW~YS{srX*ca%B?J$i z)EGJ^0y!7`wFn!-N;v8$=1C+!croz;}l zMB~#-r#!R|R7SrvD6gzUag98=T QFo2+w$In_4%)R3N2W)mLzW@LL From 17c2f2709a3b025b2d2e84c664ee6779da111b21 Mon Sep 17 00:00:00 2001 From: Duck- Date: Fri, 19 Sep 2014 13:29:01 -0400 Subject: [PATCH 12/18] Various tweaks. Buildaturrets made more accessible. They aren't that great anyway. Table laserblocking chance increased significantly. Because if you bother to get cover, you deserve cover that works. Tables soak projectiles a little better, too. Removes hulks always all-capsing. Puts pulse rifle unwielded firedelay in line with other fire delays. --- code/game/machinery/portable_turret.dm | 12 +++++++++--- code/game/objects/structures/tables_racks.dm | 12 ++++++------ code/modules/mob/living/carbon/human/say.dm | 2 +- code/modules/projectiles/guns/energy/erifles.dm | 2 +- data/investigate/gravity.html | 4 ++-- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index becfc69d..cd3972c7 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -27,7 +27,7 @@ var/raised = 0 // if the turret cover is "open" and the turret is raised var/raising= 0 // if the turret is currently opening or closing its cover var/health = 80 // the turret's health - var/locked = 1 // if the turret's behaviour control access is locked + var/locked = 0 // if the turret's behaviour control access is locked var/installation // the type of weapon installed var/gun_charge = 0 // the charge of the gun inserted @@ -169,6 +169,12 @@ iconholder = null reqpower = 500 + if(/obj/item/weapon/gun/energy/laser) //laser rifles are cool and all. + projectile = /obj/item/projectile/beam //but captainlaser and retrolaser still use energy/laser pathing. + eprojectile = projectile + iconholder = null + reqpower = 500 + else // Energy gun shots projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots eprojectile = /obj/item/projectile/beam//If it has, going to kill mode @@ -395,8 +401,8 @@ Status: []
    "}, check_records=pick(0,1) criminals=pick(0,1) auth_weapons=pick(0,1) - stun_all=pick(0,0,0,0,1) // stun_all is a pretty big deal, so it's least likely to get turned on - if(prob(5)) emagged=1 + stun_all=pick(0,1) // stun_all is a pretty big deal, so it's least likely to get turned on //but think of the fun + if(prob(50)) emagged=1 on=0 sleep(rand(60,600)) if(!on) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index c778ddd3..69f4f213 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -21,7 +21,7 @@ throwpass = 1 //You can throw objects over this, despite it's density.") var/parts = /obj/item/weapon/table_parts var/flipped = 0 - var/health = 100 + var/health = 200 /obj/structure/table/proc/update_adjacent() for(var/direction in list(1,2,4,8,5,6,9,10)) @@ -311,14 +311,14 @@ if (get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close return 1 if (get_turf(P.original) == cover) - var/chance = 20 + var/chance = 30 if (ismob(P.original)) var/mob/M = P.original if (M.lying) - chance += 20 //Lying down lets you catch less bullets + chance += 50 //Lying down lets you catch less bullets if(flipped) if(get_dir(loc, from) == dir) //Flipped tables catch mroe bullets - chance += 20 + chance += 50 else return 1 //But only from one side if(prob(chance)) @@ -545,7 +545,7 @@ desc = "Do not apply fire to this. Rumour says it burns easily." icon_state = "wood_table" parts = /obj/item/weapon/table_parts/wood - health = 50 + health = 100 /* * Reinforced tables */ @@ -553,7 +553,7 @@ name = "reinforced table" desc = "A version of the four legged table. It is stronger." icon_state = "reinf_table" - health = 200 + health = 400 var/status = 2 parts = /obj/item/weapon/table_parts/reinforced diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 1f5cce5f..3839ee2e 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -237,7 +237,7 @@ handled = 1 if((HULK in mutations) && health >= 25 && length(message)) - message = "[uppertext(message)]!!!" + //message = "[uppertext(message)]!!!" //this is really irritating. let's not. verb = pick("yells","roars","hollers") handled = 1 if(slurring) diff --git a/code/modules/projectiles/guns/energy/erifles.dm b/code/modules/projectiles/guns/energy/erifles.dm index 1c147a72..e0899974 100644 --- a/code/modules/projectiles/guns/energy/erifles.dm +++ b/code/modules/projectiles/guns/energy/erifles.dm @@ -210,7 +210,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. slot_flags = SLOT_BACK //Just realized... Going to need A LOT more on-back sprites now... FECK... var/mode = 2 fire_delay_wielded = 8 - fire_delay_unwielded = 75 + fire_delay_unwielded = 24 // attack_self(mob/living/user as mob) //Let's do some magical things, make this a verb, yes? diff --git a/data/investigate/gravity.html b/data/investigate/gravity.html index 8db4a474..2f2f7345 100644 --- a/data/investigate/gravity.html +++ b/data/investigate/gravity.html @@ -1,2 +1,2 @@ -23:08 [0x2007796] (92,152,1) || the gravitational generator has regained power.
    -23:08 [0x2007796] (92,152,1) || the gravitational generator is now charging.
    +13:13 [0x20077c6] (92,152,1) || the gravitational generator has regained power.
    +13:13 [0x20077c6] (92,152,1) || the gravitational generator is now charging.
    From cf06d71b1c84908fa62fe19ac49f507e2c8b2bd6 Mon Sep 17 00:00:00 2001 From: Duck- Date: Fri, 19 Sep 2014 14:21:41 -0400 Subject: [PATCH 13/18] Cargo, more turret fixes Re-adds orderable headset chips. It got wiped in the big bay update that ruined everything. Updates turret electrodes to electrode/high, like everything else in the game. yes. --- code/datums/supplypacks.dm | 102 ++++++++++++++++++++++--- code/game/machinery/portable_turret.dm | 8 +- code/game/machinery/turrets.dm | 2 +- 3 files changed, 96 insertions(+), 16 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 7c72634a..9d35920f 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -724,17 +724,15 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/shotgunammo name = "Shotgun shells" - contains = list(/obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun, - /obj/item/ammo_casing/shotgun) - cost = 20 + contains = list(/obj/item/ammo_magazine/shotgun, + /obj/item/ammo_magazine/shotgun, + /obj/item/ammo_magazine/shotgun, + /obj/item/ammo_magazine/shotgun, + /obj/item/ammo_magazine/shotgun/beanbag, + /obj/item/ammo_magazine/shotgun/beanbag, + /obj/item/ammo_magazine/shotgun/incendiary, + /obj/item/ammo_magazine/shotgun/incendiary) + cost = 40 containertype = /obj/structure/closet/crate/secure containername = "Shotgun shells" access = access_armory @@ -1112,6 +1110,88 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee access = access_hydroponics group = "Hydroponics" + +//My foray into encryption key crates. - Duck +/datum/supply_packs/sec_keys + name = "Security Encryption Keys" + contains = list(/obj/item/device/encryptionkey/headset_sec, + /obj/item/device/encryptionkey/headset_sec, + /obj/item/device/encryptionkey/headset_sec, + /obj/item/device/encryptionkey/headset_sec, + /obj/item/device/encryptionkey/headset_sec) + cost = 20 + containertype = /obj/structure/closet/crate/secure + containername = "Security Encryption Keys" + group = "Operations" + access = access_security + +/datum/supply_packs/sci_keys + name = "Science Encryption Keys" + contains = list(/obj/item/device/encryptionkey/headset_sci, + /obj/item/device/encryptionkey/headset_sci, + /obj/item/device/encryptionkey/headset_sci, + /obj/item/device/encryptionkey/headset_sci, + /obj/item/device/encryptionkey/headset_sci) + cost = 20 + containertype = /obj/structure/closet/crate/secure + containername = "Science Encryption Keys" + group = "Operations" + access = access_research + +/datum/supply_packs/eng_keys + name = "Engineering Encryption Keys" + contains = list(/obj/item/device/encryptionkey/headset_eng, + /obj/item/device/encryptionkey/headset_eng, + /obj/item/device/encryptionkey/headset_eng, + /obj/item/device/encryptionkey/headset_eng, + /obj/item/device/encryptionkey/headset_eng) + cost = 20 + containertype = /obj/structure/closet/crate/secure + containername = "Engineering Encryption Keys" + group = "Operations" + access = access_engine + +/datum/supply_packs/med_keys + name = "Medical Encryption Keys" + contains = list(/obj/item/device/encryptionkey/headset_med, + /obj/item/device/encryptionkey/headset_med, + /obj/item/device/encryptionkey/headset_med, + /obj/item/device/encryptionkey/headset_med, + /obj/item/device/encryptionkey/headset_med) + cost = 20 + containertype = /obj/structure/closet/crate/secure + containername = "Medical Encryption Keys" + group = "Operations" + access = access_medical + + +/datum/supply_packs/cargo_keys + name = "Cargo Encryption Keys" + contains = list(/obj/item/device/encryptionkey/headset_cargo, + /obj/item/device/encryptionkey/headset_cargo, + /obj/item/device/encryptionkey/headset_cargo, + /obj/item/device/encryptionkey/headset_cargo, + /obj/item/device/encryptionkey/headset_cargo) + cost = 20 + containertype = /obj/structure/closet/crate/secure + containername = "Cargo Encryption Keys" + group = "Operations" + access = access_cargo + +/datum/supply_packs/head_keys + name = "Head Encryption Keys" + contains = list(/obj/item/device/encryptionkey/heads/captain, + /obj/item/device/encryptionkey/heads/rd, + /obj/item/device/encryptionkey/heads/hos, + /obj/item/device/encryptionkey/heads/ce, + /obj/item/device/encryptionkey/heads/cmo, + /obj/item/device/encryptionkey/heads/hop) + cost = 50 + containertype = /obj/structure/closet/crate/secure + containername = "Head Encryption Keys" + group = "Operations" + access = access_heads + /* *Skull's additions to satisfy the cravings of any atmospheric tech begin here. */ diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index cd3972c7..4f3cd656 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -66,7 +66,7 @@ spark_system.attach(src) sleep(10) if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots - projectile = /obj/item/projectile/energy/electrode//holder for the projectile, here it is being set + projectile = /obj/item/projectile/energy/electrode/high//holder for the projectile, here it is being set eprojectile = /obj/item/projectile/beam//holder for the projectile when emagged, if it is different reqpower = 200 sound = 1 @@ -128,13 +128,13 @@ reqpower = 700 if(/obj/item/weapon/gun/energy/taser) - projectile = /obj/item/projectile/energy/electrode + projectile = /obj/item/projectile/energy/electrode/high eprojectile = projectile iconholder = 1 reqpower = 200 if(/obj/item/weapon/gun/energy/stunrevolver) - projectile = /obj/item/projectile/energy/electrode + projectile = /obj/item/projectile/energy/electrode/high eprojectile = projectile iconholder = 1 reqpower = 200 @@ -176,7 +176,7 @@ reqpower = 500 else // Energy gun shots - projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots + projectile = /obj/item/projectile/energy/electrode/high// if it hasn't been emagged, it uses normal taser shots eprojectile = /obj/item/projectile/beam//If it has, going to kill mode iconholder = 1 egun = 1 diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 6911a571..c9334924 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -233,7 +233,7 @@ A.original = target use_power(500) else - A = new /obj/item/projectile/energy/electrode( loc ) + A = new /obj/item/projectile/energy/electrode/high( loc ) use_power(200) A.current = T A.yo = U.y - T.y From 61db4eeb9f6bef938e69b62628cdb30d5a1ec830 Mon Sep 17 00:00:00 2001 From: Duck- Date: Fri, 19 Sep 2014 17:20:04 -0400 Subject: [PATCH 14/18] changes robotics fab access to general research access this is keeping in line with whoever changed r&d access to be general research access instead of r&d access. --- code/game/mecha/mech_fabricator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 081d997d..97e721d7 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -12,7 +12,7 @@ use_power = 1 idle_power_usage = 20 active_power_usage = 5000 - req_access = list(access_robotics) + req_access = list(access_research) var/time_coeff = 1.5 //can be upgraded with research var/resource_coeff = 1.5 //can be upgraded with research var/list/resources = list( From f8349137304e25a5ca60183dd87d6dec665c487c Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Sun, 21 Sep 2014 20:59:44 +0100 Subject: [PATCH 15/18] Change log Change log --- html/changelog.html | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/html/changelog.html b/html/changelog.html index aae81b71..239854f3 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,14 +57,28 @@ should be listed in the changelog upon commit though. Thanks. -->
    -

    17 September 2014

    +

    23 September 2014

    SoundScopes updated:

    • Forensics
    • +
    • Forensics - Microscope
    • +
    • Forensics - DNA Analyzer
    • +
    • Forensics - Luminol and luminol reactions
    • +
    • Forensics - Crime scene kit
    • +
    • Forensics - Swab kits
    • +
    • Forensics - Detective must now collate case files by himself + run partial prints without the system doing it for them
    • +
    • Forensics - Luminol goggles (fluff item(does nothing))
    • +
    • Forensics - Gunshot Residue
    • Admin - Area make sound
    • Admin - Mod Logs similar to admin logs for better modding abillitys
    • All staff get a message if a chat channel is muted when they login
    • New Medicines
    • +
    • Chemicals - Philodexphil
    • +
    • Chemicals - Ecyeipate
    • +
    • Wheelchairs
    • +
    • Cargo can order encryption keys for headsets (secure access crates)
    • +
    • Cargo can order Swab kits
    • +
    • Blood is now only completely cleanable by a mop
    • Custom Loadout - Berets
    • Custom Loadout - Universal Recorder
    • Custom Loadout - Camera
    • @@ -79,12 +93,21 @@ should be listed in the changelog upon commit though. Thanks. -->
    • Vampire - Vampjaunt brought back down to thirty
    • Vampire - Holy water ignites and burns vamps
    • Vampire - Health and Damage lowered on bats
    • +
    • Table laserblocking chance increased significantly
    • All energy weapons made more accurate.
    • AI's can only message centcom every 10 minutes.
    • +
    • Hulks no longer talk in all capitals
    • +
    • Laserpointer permablinding severely nerfed
    • +
    • Pulse Rifle unwielded firedelay to match other weapons delays
    • +
    • Built turrets start unlocked
    • +
    • Turrets now fire electrode/high like all other tasing implements
    • +
    • Robotics fabricator access changed to general research access
    • +
    • Shotgun shell crate changed-- doubled cost. Contains several shellboxes: slugs, incendiaries, blanks.
    • Tajaran & Unathi Medical Hardsuit Helmet actually go on their head
    • IPC's can't be vamps or changelings (Actual fix)
    • Vampires added to one click antags
    • Tcomms runtime fix. NOTE: Rest of Tcomms does not actually work
    • +
    • Fixes pulse rifle firedelay (Its firedelay used to be 24, so its unwielded firedelay was like a million)
    • New hairstyles
    From 4ac59369faebcd89144d2e0b24594eddf37dd099 Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Mon, 22 Sep 2014 04:39:19 +0100 Subject: [PATCH 16/18] Mod access No Mods shouldn't be able to jump like that --- code/modules/admin/admin_verbs.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a36c1aa6..e43d85ad 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -288,7 +288,6 @@ var/list/admin_verbs_mod = list( /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/cmd_mod_say, /client/proc/check_ai_laws, - /client/proc/jumptomob, /datum/admins/proc/show_player_info, /client/proc/player_panel_new, /client/proc/dsay, From 83ae3baf7ed01d08699a1f7fe8742698f3774b93 Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Mon, 22 Sep 2014 19:48:13 +0100 Subject: [PATCH 17/18] Player Panel Tweak Add's View Var's link for Dev's --- code/modules/admin/player_panel.dm | 12 +++++++++--- code/modules/admin/verbs/modifyvariables.dm | 10 ++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 4eaec1e5..13d06c1a 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -323,7 +323,13 @@ if (!usr.client.holder) return var/dat = "Player Menu" - dat += "" + dat += "
    NameReal NameAssigned JobKeyOptionsPMTraitor?
    " + + if(check_rights(R_ADMIN|R_MOD, 0)) + dat += "" + else + dat += "" + //add to this if wanting to add back in IP checking //add if you want to know their ip to the lists below var/list/mobs = sortmobs() @@ -364,8 +370,8 @@ "} - if(!check_rights(R_ADMIN|R_MOD)) - dat += {""} + if(!check_rights(R_ADMIN|R_MOD, 0)) + dat += {""} else switch(is_special_character(M)) if(0) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index ac356eae..570745e2 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -264,10 +264,12 @@ var/list/forbidden_varedit_object_types = list( if("marked datum") L[L.Find(variable)] = holder.marked_datum - world.log << "### VarEdit by [src]: [variable]=[html_encode("[L[L.Find(variable)]]")]" - log_admin("[key_name(src)] modified [variable] to [L[L.Find(variable)]]") - message_admins("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1) - msg_scopes("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1) // Tell dev's to but not log twice +//Runtimes >_< List's are like organised messes. +//This worked the other day. +// world.log << "### VarEdit by [src]: [variable]=[html_encode("[L[L.Find(variable)]]")]" +// log_admin("[key_name(src)] modified [variable] to [L[L.Find(variable)]]") +// message_admins("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1) +// msg_scopes("[key_name_admin(src)] modified [variable] to [L[L.Find(variable)]]", 1) // Tell dev's to but not log twice /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) if(!check_rights(R_VAREDIT|R_DEV)) return From f998447a5b17002dfcc6c314355d92e392016892 Mon Sep 17 00:00:00 2001 From: SoundScopes Date: Wed, 24 Sep 2014 11:37:19 +0100 Subject: [PATCH 18/18] BugDuck Bug Fixes from ducks merge --- code/game/objects/items/devices/isocube.dm | 5 ++++- code/game/objects/items/devices/laserpointer.dm | 6 +++--- code/game/objects/items/weapons/extinguisher.dm | 2 ++ code/modules/client/preferences_gear.dm | 2 +- html/changelog.html | 2 ++ 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/isocube.dm b/code/game/objects/items/devices/isocube.dm index e7305d87..00eb5d94 100644 --- a/code/game/objects/items/devices/isocube.dm +++ b/code/game/objects/items/devices/isocube.dm @@ -26,7 +26,7 @@ M.attack_log += text("\[[time_stamp()]\] Has been imprisoned with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to imprison [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to imprison [M.name] ([M.ckey]) (JMP)") + msg_admin_attack("[user.name] ([user.ckey]) is attemptin to imprison [M.name] ([M.ckey]) with the [src.name] (JMP)") isolate("VICTIM", M, user) return @@ -80,6 +80,8 @@ A.paralysis = 0 A.cancel_camera() src.icon_state = "soulstone" + for(var/obj/O in src) + O.loc = U.loc if ("Disable") for(var/mob/living/carbon/human/A in src) if (A.paralysis < 100) @@ -130,4 +132,5 @@ T << "You feel a heavy weightlessness and find yourself barely able to move. The outside world seems larger." U << "\blue [T.real_name] has been successfully captured within the isocube. " T.Weaken(9000000) + msg_admin_attack("[U.name] ([U.ckey]) used the [src.name] to imprison [T.name] ([T.ckey]) (JMP)") return \ No newline at end of file diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 916307de..509f0533 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -98,7 +98,7 @@ if(prob(effectchance * diode.rating)) //msg_admin_attack(user, C, "shone in the eyes", object="laser pointer") - msg_admin_attack("\[[time_stamp()]\] [user.name] ([user.ckey]) used a laser pointer to blind [C]") + msg_admin_attack("[user.name] ([user.ckey]) used a laser pointer to blind [C]") //eye target check outmsg = "You blind [C] by shining [src] in their eyes." @@ -155,7 +155,7 @@ S.attack_log += text("\[[time_stamp()]\] Has had a laser pointer shone in their eyes by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Shone a laser pointer in the eyes of [S.name] ([S.ckey])") - log_attack("[user.name] ([user.ckey]) Shone a laser pointer in the eyes of [S.name] ([S.ckey])") + msg_admin_attack("[user.name] ([user.ckey]) Shone a laser pointer in the eyes of [S.name] ([S.ckey])") else outmsg = "You fail to overload [S] by shining [src] at their sensors." @@ -166,7 +166,7 @@ C.emp_act(1) outmsg = "You hit the lens of [C] with [src], temporarily disabling the camera!" - msg_admin_attack("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer") + msg_admin_attack("[user.name] ([user.ckey]) EMPd a camera with a laser pointer") user.attack_log += text("\[[time_stamp()]\] [user.name] ([user.ckey]) EMPd a camera with a laser pointer") else outmsg = "You missed the lens of [C] with [src]." diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 2a6f5d4c..e05cff16 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -128,7 +128,9 @@ W.reagents.reaction(atm) if(W.loc == my_target) break sleep(2) +// spawn(20) + W.Del() if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0)) user.inertia_dir = get_dir(target, user) step(user, user.inertia_dir) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 5d85566f..6ae0ec5c 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -59,7 +59,7 @@ proc/populate_gear_list() /datum/gear/recorder display_name = "universal recorder" path = /obj/item/device/taperecorder - cost = 1 + cost = 2 /datum/gear/camera display_name = "camera" diff --git a/html/changelog.html b/html/changelog.html index 239854f3..c79977ed 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -87,6 +87,7 @@ should be listed in the changelog upon commit though. Thanks. -->
  • Custom Loadout - Zippo lighter
  • Custom Loadout - Flask
  • Custom Loadout - Red and Blue pens
  • +
  • Telescopic baton knockdown adjusted
  • Poisonous plants you'll now eat in a single bite
  • Death nettles buffed significantly
  • Vampire - Hypnotize now a free power with increased cooldown time
  • @@ -103,6 +104,7 @@ should be listed in the changelog upon commit though. Thanks. -->
  • Turrets now fire electrode/high like all other tasing implements
  • Robotics fabricator access changed to general research access
  • Shotgun shell crate changed-- doubled cost. Contains several shellboxes: slugs, incendiaries, blanks.
  • +
  • Turret placement in the AI core won't kill the AI now
  • Tajaran & Unathi Medical Hardsuit Helmet actually go on their head
  • IPC's can't be vamps or changelings (Actual fix)
  • Vampires added to one click antags
  • NameReal NameAssigned JobKeyOptionsPMTraitor?
    View Var's
    IP:(IP: [M.lastKnownIP])X PMTraitor?VV