diff --git a/baystation12.dme b/baystation12.dme index 4d995fb5723..c82f08c0d55 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -447,7 +447,7 @@ #include "code\game\jobs\jobs.dm" #include "code\game\jobs\whitelist.dm" #include "code\game\jobs\job\assistant.dm" -#include "code\game\jobs\job\captian.dm" +#include "code\game\jobs\job\captain.dm" #include "code\game\jobs\job\civilian.dm" #include "code\game\jobs\job\civilian_chaplain.dm" #include "code\game\jobs\job\engineering.dm" @@ -462,6 +462,7 @@ #include "code\game\machinery\alarm.dm" #include "code\game\machinery\atmo_control.dm" #include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\Beacon.dm" #include "code\game\machinery\biogenerator.dm" #include "code\game\machinery\camera.dm" #include "code\game\machinery\camera_circuit.dm" @@ -995,6 +996,7 @@ #include "code\modules\mob\organ\organ_internal.dm" #include "code\modules\mob\organ\pain.dm" #include "code\modules\mob\simple_animal\cat.dm" +#include "code\modules\mob\simple_animal\constructs.dm" #include "code\modules\mob\simple_animal\corgi.dm" #include "code\modules\mob\simple_animal\crab.dm" #include "code\modules\mob\simple_animal\life.dm" diff --git a/code/defines/atom.dm b/code/defines/atom.dm index 7a249386de6..1991e1c3bf3 100644 --- a/code/defines/atom.dm +++ b/code/defines/atom.dm @@ -169,7 +169,6 @@ obj src.m_flag = 1 if ((A != src.loc && A && A.z == src.z)) src.last_move = get_dir(A, src.loc) - src.moved_recently = 1 return /* diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm index 391effd7799..cda3510df6a 100755 --- a/code/defines/obj/vending.dm +++ b/code/defines/obj/vending.dm @@ -40,6 +40,33 @@ var/wires = 15 var/obj/item/weapon/coin/coin var/charge_type +/* + +/obj/machinery/vending/[vendors name here] // --vending machine template :) + name = "" + desc = "" + icon = '' + icon_state = "" + product_paths = "" + product_amounts = "" + vend_delay = 15 + product_hidden = "" + product_hideamt = "" + product_slogans = "" + product_ads = "" + +*/ + +/* +/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink + name = "Tank Vendor" + desc = "A vendor with a wide variety of masks and gas tanks." + icon = 'objects.dmi' + icon_state = "dispenser" + product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/plasma;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath" + product_amounts = "10;10;10;5;25" + vend_delay = 0 +*/ /obj/machinery/vending/boozeomat name = "Booze-O-Mat" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 73dd0acc6bc..0f3e5536624 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -936,6 +936,16 @@ var/text_underline = 0 var/text_break = 0 +/obj/item/weapon/pen/blue + desc = "It's a normal blue ink pen." + icon_state = "pen_blue" + text_color = "#00000F" + +/obj/item/weapon/pen/red + desc = "It's a normal red ink pen." + icon_state = "pen_red" + text_color = "#FF0000" + /obj/item/weapon/pen/multi desc = "It's a cool looking pen. Lots of colors!" name = "multicolor pen" @@ -1591,6 +1601,7 @@ sides = 12 icon_state = "d20" item_state = "dice" + /obj/item/weapon/pai_cable desc = "A flexible coated cable with a universal jack on one end." desc = "Some spacey cable." diff --git a/code/game/communications.dm b/code/game/communications.dm index fcf45c668eb..be87e6bb1b2 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -291,4 +291,4 @@ datum/signal else . = "signal = {source = '[source]' ()\n" for (var/i in data) - . += "data\[\"[i]\"\] = \"[data[i]]\"\n" \ No newline at end of file + . += "data\[\"[i]\"\] = \"[data[i]]\"\n" diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 89c5a1773d4..9054cbe5975 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -170,7 +170,6 @@ return 1 if(special_action()) return 1 - return 0 proc/consume_air() @@ -184,6 +183,7 @@ if(temperature > T0C+200) health -= 0.01 * temperature update() + proc/expand(var/turf/T = null) if(!prob(health)) return//TODO: Change this to prob(health + o2 mols or such) if(!T) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 0dcbdf15d47..632fdca82f7 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -237,7 +237,7 @@ datum/objective/block datum/objective/escape - explanation_text = "Escape on the shuttle alive." + explanation_text = "Escape on the shuttle or an escape pod alive." check_completion() diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 479eff19316..d7cb81bf739 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -50,7 +50,7 @@ if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf)))) usr.machine = src if(href_list["spell_choice"]) - if(src.uses >= 1 && href_list["spell_choice"] != 14) + if(src.uses >= 1 && href_list["spell_choice"] != 16) src.uses-- if(spell_type == "verb") switch(href_list["spell_choice"]) @@ -125,49 +125,64 @@ if(!already_knows) switch(href_list["spell_choice"]) if ("1") + feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(usr) src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage." if ("2") + feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/fireball(usr) src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you." // if ("3") // usr.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(usr) // src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." + src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." if ("4") + feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(usr) src.temp = "This spell disables all weapons, cameras and most other technology in range." if ("5") + feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/smoke(usr) src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." if ("6") + feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/trigger/blind(usr) src.temp = "This spell temporarly blinds a single person and does not require wizard garb." if ("7") + feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(usr) src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." if ("8") + feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(usr) src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." if ("9") + feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(usr) src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." if ("10") + feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(usr) src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable." if ("11") + feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/genetic/mutate(usr) src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while." if ("12") + feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(usr) src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." if ("13") + feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(usr) src.temp = "This spell opens nearby doors and does not require wizard garb." if ("14") + feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/weapon/gun/energy/staff(get_turf(usr)) src.temp = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself" src.max_uses-- if ("15") + feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/weapon/storage/belt/soulstone/full(get_turf(usr)) src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying" src.max_uses-- @@ -177,6 +192,7 @@ src.uses = src.max_uses usr.spellremove(usr,spell_type) src.temp = "All spells have been removed. You may now memorize a new set of spells." + feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells else src.temp = "You may only re-memorize spells whilst located inside the wizard sanctuary." else @@ -362,4 +378,4 @@ del(src.master) del(src) - return \ No newline at end of file + return diff --git a/code/game/jobs/job/captian.dm b/code/game/jobs/job/captain.dm similarity index 97% rename from code/game/jobs/job/captian.dm rename to code/game/jobs/job/captain.dm index 60e68e43d17..e1fa773119e 100644 --- a/code/game/jobs/job/captian.dm +++ b/code/game/jobs/job/captain.dm @@ -1,52 +1,52 @@ -/datum/job/captain - title = "Captain" - flag = CAPTAIN - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "Nanotrasen officials and Space law" - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(H), H.slot_ears) - H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back) - H.equip_if_possible(new /obj/item/clothing/under/rank/captain(H), H.slot_w_uniform) - H.equip_if_possible(new /obj/item/device/pda/captain(H), H.slot_belt) - H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes) - H.equip_if_possible(new /obj/item/clothing/head/caphat(H), H.slot_head) - H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses) - H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack) - var/datum/organ/external/O = H.organs[pick(H.organs)] - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) - O.implant += L - L.imp_in = H - L.implanted = 1 - world << "[H.real_name] is the captain!" - return 1 - - - -/datum/job/hop - title = "Head of Personnel" - flag = HOP - department_flag = CIVILIAN - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_if_possible(new /obj/item/device/radio/headset/heads/hop(H), H.slot_ears) - H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back) - H.equip_if_possible(new /obj/item/clothing/under/rank/head_of_personnel(H), H.slot_w_uniform) - H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes) - H.equip_if_possible(new /obj/item/device/pda/heads/hop(H), H.slot_belt) - H.equip_if_possible(new /obj/item/clothing/suit/armor/vest(H), H.slot_wear_suit) - H.equip_if_possible(new /obj/item/clothing/head/helmet(H), H.slot_head) - H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack) - H.equip_if_possible(new /obj/item/clothing/gloves/blue(H), H.slot_gloves) - return 1 +/datum/job/captain + title = "Captain" + flag = CAPTAIN + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "Nanotrasen officials and Space law" + + + equip(var/mob/living/carbon/human/H) + if(!H) return 0 + H.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(H), H.slot_ears) + H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back) + H.equip_if_possible(new /obj/item/clothing/under/rank/captain(H), H.slot_w_uniform) + H.equip_if_possible(new /obj/item/device/pda/captain(H), H.slot_belt) + H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes) + H.equip_if_possible(new /obj/item/clothing/head/caphat(H), H.slot_head) + H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses) + H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack) + var/datum/organ/external/O = H.organs[pick(H.organs)] + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) + O.implant += L + L.imp_in = H + L.implanted = 1 + world << "[H.real_name] is the captain!" + return 1 + + + +/datum/job/hop + title = "Head of Personnel" + flag = HOP + department_flag = CIVILIAN + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + + + equip(var/mob/living/carbon/human/H) + if(!H) return 0 + H.equip_if_possible(new /obj/item/device/radio/headset/heads/hop(H), H.slot_ears) + H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back) + H.equip_if_possible(new /obj/item/clothing/under/rank/head_of_personnel(H), H.slot_w_uniform) + H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes) + H.equip_if_possible(new /obj/item/device/pda/heads/hop(H), H.slot_belt) + H.equip_if_possible(new /obj/item/clothing/suit/armor/vest(H), H.slot_wear_suit) + H.equip_if_possible(new /obj/item/clothing/head/helmet(H), H.slot_head) + H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack) + H.equip_if_possible(new /obj/item/clothing/gloves/blue(H), H.slot_gloves) + return 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 769ee4ec8db..c7945cda4f7 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -49,7 +49,7 @@ H.equip_if_possible(new /obj/item/clothing/under/rank/warden(H), H.slot_w_uniform) H.equip_if_possible(new /obj/item/clothing/shoes/jackboots(H), H.slot_shoes) H.equip_if_possible(new /obj/item/device/pda/security(H), H.slot_belt) - H.equip_if_possible(new /obj/item/clothing/suit/armor/vest(H), H.slot_wear_suit) + H.equip_if_possible(new /obj/item/clothing/suit/armor/vest/warden(H), H.slot_wear_suit) H.equip_if_possible(new /obj/item/clothing/head/helmet/warden(H), H.slot_head) H.equip_if_possible(new /obj/item/clothing/gloves/red(H), H.slot_gloves) H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses) diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index f18aa2323f9..f249ada8cbc 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -20,7 +20,7 @@ faction = "Station" total_positions = 0 spawn_positions = 1 - + supervisors = "your laws and the AI" //Nodrak equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm new file mode 100644 index 00000000000..73adecbabdc --- /dev/null +++ b/code/game/machinery/Beacon.dm @@ -0,0 +1,55 @@ +/obj/machinery/bluespace_beacon + + icon = 'objects.dmi' + icon_state = "floor_beaconf" + name = "Bluespace Gigabeacon" + desc = "A device that draws power from bluespace and creates a permanent tracking beacon." + level = 1 // underfloor + layer = 2.5 + anchored = 1 + use_power = 1 + idle_power_usage = 0 + var/obj/item/device/radio/beacon/Beacon + + New() + ..() + var/turf/T = loc + Beacon = new /obj/item/device/radio/beacon + Beacon.invisibility = 100 + Beacon.loc = T + + hide(T.intact) + + Del() + if(Beacon) + del(Beacon) + ..() + + // update the invisibility and icon + hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() + + // update the icon_state + proc/updateicon() + var/state="floor_beacon" + + if(invisibility) + icon_state = "[state]f" + + else + icon_state = "[state]" + + process() + if(!Beacon) + var/turf/T = loc + Beacon = new /obj/item/device/radio/beacon + Beacon.invisibility = 100 + Beacon.loc = T + if(Beacon) + if(Beacon.loc != loc) + Beacon.loc = loc + + updateicon() + + diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 4fa1630dd50..eb4135f4104 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -565,13 +565,13 @@ process_bot() sleep(2) process_bot() + sleep(2) + process_bot() + sleep(2) + process_bot() if(2) process_bot() - spawn(2) - process_bot() - sleep(2) - process_bot() - sleep(2) + spawn(4) process_bot() if(3) process_bot() diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index dd496bbfb35..eabfdd003ab 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -51,7 +51,7 @@ if(!charging || (stat & (BROKEN|NOPOWER)) ) return - var/added = charging.give(50) + var/added = charging.give(500) use_power(added / CELLRATE) updateicon() \ No newline at end of file diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index b2e1f3f5578..c6c2eac9296 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -7,10 +7,10 @@ var/name_part1 var/name_part2 - name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Rape ", "Pwn ", "Own ") + name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ") - name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Faggot ", "Duke ", "General ") - name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "Metroid", "Griefer", "ERPer", "Homosexual", "Lizard Man", "Unicorn") + name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ") + name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "Metroid", "Griefer", "ERPer", "Lizard Man", "Unicorn") src.enemy_name = dd_replacetext((name_part1 + name_part2), "the ", "") src.name = (name_action + name_part1 + name_part2) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 8098200a4ee..3ae6770ceaa 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -163,7 +163,7 @@ to destroy them and players will be able to make replacements. build_path = "/obj/machinery/r_n_d/destructive_analyzer" board_type = "machine" origin_tech = "magnets=2;engineering=2;programming=2" - frame_desc = "Requires 2 Scanning Modules, 1 Manipulator, and 1 Micro-Laser." + frame_desc = "Requires 1 Scanning Module, 1 Manipulator, and 1 Micro-Laser." req_components = list( "/obj/item/weapon/stock_parts/scanning_module" = 1, "/obj/item/weapon/stock_parts/manipulator" = 1, diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 0ec248edc49..81c0dd07d50 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -70,6 +70,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. var aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + hackProof = 0 // if 1, this door can't be hacked by the AI synDoorHacked = 0 // Has it been hacked? bool 1 = yes / 0 = no synHacking = 0 // Is hack in process y/n? secondsMainPowerLost = 0 //The number of seconds until power is restored. @@ -812,7 +813,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. canAIHack() - return ((src.aiControlDisabled==1) && (!src.isAllPowerCut())); + return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerCut())); canSynControl() diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 80ea9a50cca..01dd2e422e1 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -113,6 +113,10 @@ "Misc"=list(/obj/item/mecha_parts/mecha_tracking) ) + + + + New() ..() component_parts = list() @@ -408,6 +412,12 @@ proc/sync(silent=null) + if(queue.len) + if(!silent) + temp = "Error. Please clear processing queue before updating!" + src.updateUsrDialog() + return + if(!silent) temp = "Updating local R&D database..." src.updateUsrDialog() diff --git a/code/game/objects/closets.dm b/code/game/objects/closets.dm index bbb8d7c027b..b4c6af06d29 100644 --- a/code/game/objects/closets.dm +++ b/code/game/objects/closets.dm @@ -20,6 +20,9 @@ for(var/obj/item/I in src) I.loc = src.loc + for(var/obj/mecha/working/ripley/deathripley/I in src) + I.loc = src.loc + for(var/mob/M in src) M.loc = src.loc if(M.client) @@ -54,6 +57,9 @@ if(!I.anchored) I.loc = src + for(var/obj/mecha/working/ripley/deathripley/I in src.loc) + I.loc = src + for(var/mob/M in src.loc) if(istype (M, /mob/dead/observer)) continue diff --git a/code/game/objects/closets/secure/cargo.dm b/code/game/objects/closets/secure/cargo.dm index 730d2dc6c9c..6ae193e14d7 100644 --- a/code/game/objects/closets/secure/cargo.dm +++ b/code/game/objects/closets/secure/cargo.dm @@ -1,3 +1,24 @@ +/obj/structure/closet/secure_closet/cargotech + name = "Cargo Technician's Locker" + req_access = list(access_cargo) + //icon_state = "secureeng1" + //icon_closed = "secureeng" + //icon_locked = "secureeng1" + //icon_opened = "toolclosetopen" + //icon_broken = "secureengbroken" + //icon_off = "secureengoff" + + //Needs proper sprites + + New() + ..() + sleep(2) + new /obj/item/clothing/under/rank/cargo(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/device/radio/headset/headset_cargo(src) + new /obj/item/clothing/gloves/black(src) + new /obj/item/weapon/cartridge/quartermaster(src) + return /obj/structure/closet/secure_closet/qm_personal name = "Quartermaster's Locker" diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm index 085910a4517..103d7c2a990 100644 --- a/code/game/objects/devices/scanners.dm +++ b/code/game/objects/devices/scanners.dm @@ -278,6 +278,7 @@ MASS SPECTROMETER throw_range = 10 m_amt = 200 origin_tech = "magnets=1;biotech=1" + var/mode = 1; proc/analyze_health_less_info(mob/living/carbon/M as mob, mob/user as mob) var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) @@ -285,10 +286,19 @@ proc/analyze_health_less_info(mob/living/carbon/M as mob, mob/user as mob) user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1) user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) else - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health))), 1) + user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health - M.halloss))), 1) user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/list/damaged = H.get_damaged_organs(1,1) + user.show_message("\blue Localized Damage, Brute/Burn:",1) + if(length(damaged)>0) + for(var/datum/organ/external/org in damaged) + user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1) + else + user.show_message("\blue \t Limbs are OK.",1) if((M.changeling && M.changeling.changeling_fakedeath) || (M.reagents && M.reagents.has_reagent("zombiepowder"))) user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) else @@ -348,6 +358,17 @@ proc/analyze_health_less_info(mob/living/carbon/M as mob, mob/user as mob) src.add_fingerprint(user) return +/obj/item/device/healthanalyzer/verb/toggle_mode() + set name = "Switch Verbosity" + set category = "Object" + + mode = !mode + switch (mode) + if(1) + usr << "The scanner now shows specific limb damage." + if(0) + usr << "The scanner no longer shows limb damage." + /obj/item/device/analyzer desc = "A hand-held environmental scanner which reports current gas levels." diff --git a/code/game/objects/grille.dm b/code/game/objects/grille.dm index 6c89401cdcc..23a05cf7be3 100644 --- a/code/game/objects/grille.dm +++ b/code/game/objects/grille.dm @@ -81,6 +81,15 @@ healthcheck() return + attack_animal(var/mob/living/simple_animal/M as mob) + if(M.melee_damage_upper == 0) return + playsound(src.loc, 'grillehit.ogg', 80, 1) + M.visible_message("[M.name] smashes against the [src.name].", \ + "You smash against the [src.name].", \ + "You hear a noise") + src.health -= rand(4) + healthcheck() + return CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group || (height==0)) return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9b77697bb57..f75bfc718e8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -405,6 +405,7 @@ else if(temp_sides == 20 && result == 1) comment = "Ouch, bad luck." user << text("\red You throw a [src]. It lands on a [result]. [comment]") + icon_state = "[name][result]" for(var/mob/O in viewers(user, null)) if(O == (user)) continue diff --git a/code/game/objects/items/robot_items.dm b/code/game/objects/items/robot_items.dm index 23fb752b312..c1f5cfc9870 100644 --- a/code/game/objects/items/robot_items.dm +++ b/code/game/objects/items/robot_items.dm @@ -181,21 +181,22 @@ force = 5.0 w_class = 3.0 var - datum/effect/effect/system/spark_spread/spark_system + // datum/effect/effect/system/spark_spread/spark_system working = 0 mode = 1 + disabled = 0 - +/* New() src.spark_system = new /datum/effect/effect/system/spark_spread spark_system.set_up(5, 0, src) spark_system.attach(src) return - +*/ proc/activate() - spark_system.set_up(5, 0, src) - src.spark_system.start() +// spark_system.set_up(5, 0, src) +// src.spark_system.start() playsound(src.loc, 'Deconstruct.ogg', 50, 1) @@ -205,22 +206,26 @@ if(mode == 1) mode = 2 user << "Changed mode to 'Airlock'" - src.spark_system.start() +// src.spark_system.start() return if(mode == 2) mode = 3 user << "Changed mode to 'Deconstruct'" - src.spark_system.start() +// src.spark_system.start() return if(mode == 3) mode = 1 user << "Changed mode to 'Floor & Walls'" - src.spark_system.start() +// src.spark_system.start() return afterattack(atom/A, mob/user as mob) - if(!isrobot(user)) return + if(istype(A,/area/shuttle))//||istype(A,/turf/space/transit))//No RCDs on the shuttles -Sieve + disabled = 1 + else + disabled = 0 + if(!isrobot(user)|| disabled == 1) return if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock))) return var/mob/living/silicon/robot/R = user @@ -268,13 +273,7 @@ A:ReplaceWithPlating() return - if(istype(A, /turf/simulated/wall/r_wall)) - if(!cell.use(300)) return - user << "Deconstructing RWall..." - playsound(src.loc, 'click.ogg', 50, 1) - if(do_after(user, 60)) - activate() - A:ReplaceWithWall() + if(istype(A, /turf/simulated/wall/r_wall)) //by order of muskets -pete return if(istype(A, /turf/simulated/floor)) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index b634e20692f..bb00b0e1f2a 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -306,6 +306,14 @@ It is caused by the unexpected circumstances after awakening in cryo (if cloned
  • Install the external reinforced armor plating (Not included due to NanoTrasen regulations. Can be made using 5 reinforced metal sheets.)
  • Secure the external reinforced armor plating with a wrench
  • Weld the external reinforced armor plating to the chassis
  • +
  • +
  • Additional Information:
  • +
  • The firefighting variation is made in a similar fashion.
  • +
  • A firesuit must be connected to the Firefighter chassis for heat shielding.
  • +
  • Internal armor is plasteel for additional strength.
  • +
  • External armor must be installed in 2 parts, totaling 10 sheets.
  • +
  • Completed mech is more resiliant against fire, and is a bit more durable overall
  • +
  • Nanotrasen is determined to the safety of its investments employees.
  • @@ -343,7 +351,7 @@ It is caused by the unexpected circumstances after awakening in cryo (if cloned Those are the basic steps to furthing science. What do you do science with, however? Well, you have four major tools: R&D Console, the Destructive Analyzer, the Protolathe, and the Circuit Imprinter.

    The R&D Console

    - The R&D console is the cornerstone of any research lab. It is the central system from which the Destructive Analyzer, Protolathe, and Circuit Imprinter (your R&D systems) are controled. More on those systems in their own sections. On it's own, the R&D console acts as a database for all your technological gains and new devices you discover. So long as the R&D console remains intact, you'll retain all that SCIENCE you've discovered. Protect it though, because if it gets damaged, you'll lose your data! In addition to this important purpose, the R&D console has a disk menu that lets you transfer data from the database onto disk or from the disk into the database. It also has a settings menu that lets you re-sync with nearby R&D devices (if they've become disconnected), lock the console from the unworthy, upload the data to all other R&D consoles in the network (all R&D consoles are networked by default), connect/disconnect from the network, and purge all data from the database. + The R&D console is the cornerstone of any research lab. It is the central system from which the Destructive Analyzer, Protolathe, and Circuit Imprinter (your R&D systems) are controled. More on those systems in their own sections. On its own, the R&D console acts as a database for all your technological gains and new devices you discover. So long as the R&D console remains intact, you'll retain all that SCIENCE you've discovered. Protect it though, because if it gets damaged, you'll lose your data! In addition to this important purpose, the R&D console has a disk menu that lets you transfer data from the database onto disk or from the disk into the database. It also has a settings menu that lets you re-sync with nearby R&D devices (if they've become disconnected), lock the console from the unworthy, upload the data to all other R&D consoles in the network (all R&D consoles are networked by default), connect/disconnect from the network, and purge all data from the database. NOTE: The technology list screen, circuit imprinter, and protolathe menus are accessible by non-scientists. This is intended to allow 'public' systems for the plebians to utilize some new devices.

    Destructive Analyzer

    @@ -359,7 +367,7 @@ It is caused by the unexpected circumstances after awakening in cryo (if cloned As it has been stated, many devices when they're first discovered do not have a 100% reliablity when you first discover them. Instead, the reliablity of the device is dependent upon a base reliability value, whatever improvements to the design you've discovered through the Destructive Analyzer, and any advancements you've made with the device's source technologies. To be able to improve the reliability of a device, you have to use the device until it breaks beyond repair. Once that happens, you can analyze it in a Destructive Analyzer. Once the device reachs a certain minimum reliability, you'll gain tech advancements from it.

    Building a Better Machine

    - Many machines produces from circuit boards and inserted into a machine frame require a variety of parts to construct. These are parts like capacitors, batteries, matter bins, and so forth. As your knowledge of science improves, more advanced versions are unlocked. If you use these parts when constructing something, it's attributes may be improved. For example, if you use an advanced matter bin when constructing an autolathe (rather then a regular one), it'll hold more materials. Experiment around with stock parts of various qualities to see how they affect the end results! Be warned, however: Tier 3 and higher stock parts don't have 100% reliability and their low reliability may affect the reliability of the end machine. + Many machines produces from circuit boards and inserted into a machine frame require a variety of parts to construct. These are parts like capacitors, batteries, matter bins, and so forth. As your knowledge of science improves, more advanced versions are unlocked. If you use these parts when constructing something, its attributes may be improved. For example, if you use an advanced matter bin when constructing an autolathe (rather then a regular one), it'll hold more materials. Experiment around with stock parts of various qualities to see how they affect the end results! Be warned, however: Tier 3 and higher stock parts don't have 100% reliability and their low reliability may affect the reliability of the end machine. "} @@ -410,7 +418,7 @@ It is caused by the unexpected circumstances after awakening in cryo (if cloned

    Cyborg Modules

    - When a cyborg is created it picks out of an array of modules to designate it's purpose. There are 6 different cyborg modules. + When a cyborg is created it picks out of an array of modules to designate its purpose. There are 6 different cyborg modules.

    Standard Cyborg

    The standard cyborg module is a multi-purpose cyborg. It is equipped with various modules, allowing it to do basic tasks.
    A Standard Cyborg comes with: @@ -584,7 +592,7 @@ It is caused by the unexpected circumstances after awakening in cryo (if cloned - "} + "} /obj/item/weapon/book/manual/engineering_guide name = "Engineering Textbook" @@ -680,37 +688,37 @@ It is caused by the unexpected circumstances after awakening in cryo (if cloned author = "NanoTrasen" dat = {" - - - - -

    Detective Work

    + + + + +

    Detective Work

    -Between your bouts of self-narration, and drinking whiskey on the rocks, you might get a case or two to solve.
    -To have the best chance to solve your case, follow these directions: -

    -

      -
    1. Go to the crime scene.
    2. -
    3. Take your scanner and scan EVERYTHING (Yes, the doors, the tables, even the dog.)
    4. -
    5. Once you are reasonably certain you have every scrap of evidence you can use, find all possible entry points and scan them, too.
    6. -
    7. Return to your office.
    8. -
    9. Using your forensic scanning computer, scan your Scanner to upload all of your evidence into the database.
    10. -
    11. Browse through the resulting dossiers, looking for the one that either has the most complete set of prints, or the most suspicious items handled.
    12. -
    13. If you have 80% or more of the print (The print is displayed) go to step 10, otherwise continue to step 8.
    14. -
    15. Look for clues from the suit fibres you found on your perp, and go about looking for more evidence with this new information, scanning as you go.
    16. -
    17. Try to get a fingerprint card of your perp, as if used in the computer, the prints will be completed on their dossier.
    18. -
    19. Assuming you have enough of a print to see it, grab the biggest complete piece of the print and search the security records for it.
    20. -
    21. Since you now have both your dossier and the name of the person, print both out as evidence, and get security to nab your baddie.
    22. -
    23. Give yourself a pat on the back and a bottle of the ships finest vodka, you did it!.
    24. -
    -

    -It really is that easy! Good luck! + Between your bouts of self-narration, and drinking whiskey on the rocks, you might get a case or two to solve.
    + To have the best chance to solve your case, follow these directions: +

    +

      +
    1. Go to the crime scene.
    2. +
    3. Take your scanner and scan EVERYTHING (Yes, the doors, the tables, even the dog.)
    4. +
    5. Once you are reasonably certain you have every scrap of evidence you can use, find all possible entry points and scan them, too.
    6. +
    7. Return to your office.
    8. +
    9. Using your forensic scanning computer, scan your Scanner to upload all of your evidence into the database.
    10. +
    11. Browse through the resulting dossiers, looking for the one that either has the most complete set of prints, or the most suspicious items handled.
    12. +
    13. If you have 80% or more of the print (The print is displayed) go to step 10, otherwise continue to step 8.
    14. +
    15. Look for clues from the suit fibres you found on your perp, and go about looking for more evidence with this new information, scanning as you go.
    16. +
    17. Try to get a fingerprint card of your perp, as if used in the computer, the prints will be completed on their dossier.
    18. +
    19. Assuming you have enough of a print to see it, grab the biggest complete piece of the print and search the security records for it.
    20. +
    21. Since you now have both your dossier and the name of the person, print both out as evidence, and get security to nab your baddie.
    22. +
    23. Give yourself a pat on the back and a bottle of the ships finest vodka, you did it!.
    24. +
    +

    + It really is that easy! Good luck! - -"} \ No newline at end of file + + "} \ No newline at end of file diff --git a/code/game/objects/items/weapons/plant_bag.dm b/code/game/objects/items/weapons/plant_bag.dm index b4cda59a166..1cbb6f7903c 100644 --- a/code/game/objects/items/weapons/plant_bag.dm +++ b/code/game/objects/items/weapons/plant_bag.dm @@ -6,7 +6,7 @@ icon_state = "plantbag" name = "Plant Bag" var/mode = 1; //0 = pick one at a time, 1 = pick all on tile - var/capacity = 10; //the number of plant pieces it can carry. + var/capacity = 50; //the number of plant pieces it can carry. flags = FPRINT | TABLEPASS | ONBELT w_class = 1 diff --git a/code/game/objects/radio/electropack.dm b/code/game/objects/radio/electropack.dm index 512a8cd4788..209fbea8b53 100644 --- a/code/game/objects/radio/electropack.dm +++ b/code/game/objects/radio/electropack.dm @@ -130,8 +130,12 @@ var/mob/M = src.loc var/turf/T = M.loc if ((istype(T, /turf))) - if (M.moved_recently && M.last_move) + if (!M.moved_recently && M.last_move) + M.moved_recently = 1 step(M, M.last_move) + sleep 50 + if(M) + M.moved_recently = 0 M.show_message("\red You feel a sharp shock!") var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, M) diff --git a/code/game/objects/window.dm b/code/game/objects/window.dm index c651e28117c..e2d53d0c6ae 100644 --- a/code/game/objects/window.dm +++ b/code/game/objects/window.dm @@ -138,6 +138,30 @@ return return + +/obj/structure/window/attack_animal(mob/living/simple_animal/M as mob) + if (M.melee_damage_upper == 0) + return + M << text("\green You smash against the window.") + for(var/mob/O in viewers(src, null)) + if ((O.client && !( O.blinded ))) + O << text("\red [] smashes against the window.", M) + playsound(src.loc, 'Glasshit.ogg', 100, 1) + src.health -= M.melee_damage_upper + if(src.health <= 0) + M << text("\green You smash through the window.") + for(var/mob/O in viewers(src, null)) + if ((O.client && !( O.blinded ))) + O << text("\red [] smashes through the window!", M) + src.health = 0 + new /obj/item/weapon/shard(src.loc) + if(reinf) + new /obj/item/stack/rods(src.loc) + src.density = 0 + del(src) + return + return + /obj/structure/window/attack_metroid() if(!istype(usr, /mob/living/carbon/metroid/adult)) return diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 53e58c3c4ff..d4e838e9f91 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -65,6 +65,23 @@ var/list/supply_groups = new() if (prob(5)) del(src) +/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates + name = "\improper Airtight plastic flaps" + desc = "Heavy duty, airtight, plastic flaps." + + New() //set the turf below the flaps to block air + var/turf/T = get_turf(src.loc) + if(T) + T.blocks_air = 1 + ..() + + Del() //lazy hack to set the turf to allow air to pass if it's a simulated floor + var/turf/T = get_turf(src.loc) + if(T) + if(istype(T, /turf/simulated/floor)) + T.blocks_air = 0 + ..() + /area/supplyshuttle name = "Supply Shuttle" icon_state = "supply" diff --git a/code/game/turf.dm b/code/game/turf.dm index 0afdb11a163..7b0d2324573 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -136,6 +136,12 @@ if(O.level == 1) O.hide(0) +// Removes all signs of lattice on the pos of the turf -Donkieyo +/turf/proc/RemoveLattice() + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + del L + /turf/proc/ReplaceWithFloor(explode=0) var/prior_icon = icon_old var/old_dir = dir @@ -144,6 +150,7 @@ del(L) var/turf/simulated/floor/W = new /turf/simulated/floor( locate(src.x, src.y, src.z) ) + W.RemoveLattice() W.dir = old_dir if(prior_icon) W.icon_state = prior_icon else W.icon_state = "floor" @@ -164,6 +171,7 @@ del(L) var/turf/simulated/floor/plating/W = new /turf/simulated/floor/plating( locate(src.x, src.y, src.z) ) + W.RemoveLattice() W.dir = old_dir if(prior_icon) W.icon_state = prior_icon else W.icon_state = "plating" @@ -347,6 +355,24 @@ return src.attack_hand(user) + +/turf/simulated/wall/attack_animal(mob/living/simple_animal/M as mob) + if(M.wall_smash) + if (istype(src, /turf/simulated/wall/r_wall)) + M << text("\blue This wall is far too strong for you to destroy.") + return + else + if (prob(40)) + M << text("\blue You smash through the wall.") + dismantle_wall(1) + return + else + M << text("\blue You smash against the wall.") + return + + M << "\blue You push the wall but nothing happens!" + return + /turf/simulated/wall/attack_hand(mob/user as mob) if ((user.mutations & HULK)) if (prob(40)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e4c40b1e788..3fe2c278f9d 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -562,6 +562,20 @@ var/global/BSACooldown = 0 alert("The AI can't be monkeyized!", null, null, null, null, null) return + if (href_list["corgione"]) + if ((src.rank in list( "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) + var/mob/M = locate(href_list["corgione"]) + if(!ismob(M)) + return + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/N = M + log_admin("[key_name(usr)] attempting to corgize [key_name(M)]") + message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(M)]", 1) + N.corgize() + if(istype(M, /mob/living/silicon)) + alert("The AI can't be corgized!", null, null, null, null, null) + return + if (href_list["forcespeech"]) if ((src.rank in list( "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) var/mob/M = locate(href_list["forcespeech"]) @@ -1287,6 +1301,13 @@ var/global/BSACooldown = 0 spawn(0) H.monkeyize() ok = 1 + if("corgi") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","M") + for(var/mob/living/carbon/human/H in world) + spawn(0) + H.corgize() + ok = 1 if("power") log_admin("[key_name(usr)] made all areas powered", 1) message_admins("\blue [key_name_admin(usr)] made all areas powered", 1) @@ -1927,6 +1948,10 @@ var/global/BSACooldown = 0 foo += text("Monkeyize | ") else foo += text("Monkeyized | ") + if(!iscorgi(M)) + foo += text("Corgize | ") + else + foo += text("Corgized | ") if(isAI(M)) foo += text("Is an AI | ") else if(ishuman(M)) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9361b689074..a250adb9926 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -80,7 +80,7 @@ verbs += /client/proc/jumptokey verbs += /client/proc/jumptomob verbs += /client/proc/jumptoturf - + verbs += /client/proc/jumptocoord verbs += /client/proc/cmd_admin_add_freeform_ai_law verbs += /client/proc/cmd_admin_rejuvenate verbs += /client/proc/cmd_admin_drop_everything @@ -213,6 +213,7 @@ verbs += /client/proc/togglebuildmodeself verbs += /client/proc/hide_most_verbs verbs += /client/proc/tension_report + verbs += /client/proc/jumptocoord if (holder.level >= 3)//Trial Admin******************************************************************** verbs += /obj/admins/proc/toggleaban //abandon mob @@ -921,4 +922,4 @@ C.CarbonCopy2(NewObj) else NewObj.vars[V] = vars[V] - return NewObj + return NewObj diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 6c9bee0fe0f..696fa42ce66 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -51,6 +51,24 @@ message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1) else A << "This mob is not located in the game world." + +/client/proc/jumptocoord(tx as num, ty as num, tz as num) + set category = "Admin" + set name = "Jump to Coordinate" + + if (!holder) + src << "Only administrators may use this command." + return + + if (config.allow_admin_jump) + if(src.mob) + var/mob/A = src.mob + A.x = tx + A.y = ty + A.z = tz + feedback_add_details("admin_verb","JC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]") + else alert("Admin jumping disabled") diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm index 8ec84a262ad..d340576c8ea 100644 --- a/code/modules/chemical/Chemistry-Recipes.dm +++ b/code/modules/chemical/Chemistry-Recipes.dm @@ -42,6 +42,13 @@ datum required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) result_amount = 3 + stoxin + name = "Sleep Toxin" + id = "stoxin" + result = "stoxin" + required_reagents = list("chloralhydrate" = 1, "sugar" = 4) + result_amount = 5 + sterilizine name = "Sterilizine" id = "sterilizine" diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 96f23bfdf44..2c2de535776 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -3003,13 +3003,13 @@ ..() reagents.add_reagent("dexalin", 15) -/obj/item/weapon/reagent_containers/pill/bicardine - name = "Bicardine pill" +/obj/item/weapon/reagent_containers/pill/bicaridine + name = "Bicaridine pill" desc = "Used to treat physical injuries." icon_state = "pill18" New() ..() - reagents.add_reagent("bicardine", 15) + reagents.add_reagent("bicaridine", 15) //Dispensers /obj/structure/reagent_dispensers/watertank diff --git a/code/modules/clothing/gimmick.dm b/code/modules/clothing/gimmick.dm index 5639690fc1d..756309a9bbb 100644 --- a/code/modules/clothing/gimmick.dm +++ b/code/modules/clothing/gimmick.dm @@ -548,6 +548,21 @@ obj/item/clothing/suit/justice item_state = "justice" flags = FPRINT | TABLEPASS +/obj/item/clothing/under/gladiator + name = "gladiator uniform" + desc = "Are you not entertained? Is that not why you are here?" + icon_state = "gladiator" + item_state = "gladiator" + color = "gladiator" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + +/obj/item/clothing/head/helmet/gladiator + name = "gladiator helmet" + desc = "Ave, Imperator, morituri te salutant." + icon_state = "gladiator" + flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + item_state="gladiator" + //stylish new hats /obj/item/clothing/head/bowlerhat diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 05f5c5cf26c..4cb984c2a17 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -13,6 +13,11 @@ flags = FPRINT | TABLEPASS | ONESIZEFITSALL armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) +/obj/item/clothing/suit/armor/vest/warden + name = "Warden's jacket" + desc = "An armoured jacket with silver rank pips and livery." + icon_state = "warden_jacket" + item_state = "armor" /obj/item/clothing/suit/armor/riot name = "Riot Suit" diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm index e4ace4ad73f..e9a65d77750 100644 --- a/code/modules/food/food.dm +++ b/code/modules/food/food.dm @@ -415,6 +415,19 @@ name = "brainburger" desc = "A strange looking burger. It looks almost sentient." icon_state = "brainburger" + New() + ..() + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/ghostburger + name = "Ghost Burger" + desc = "Spooky! It doesn't look very filling." + icon_state = "ghostburger" + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/human var/hname = "" diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index ca4fc6b3efb..64f43fa2434 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -109,6 +109,12 @@ /obj/item/weapon/reagent_containers/food/snacks/tofu ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/tofu +/datum/recipe/ghostburger + items = list( + /obj/item/weapon/reagent_containers/food/snacks/flour, + /obj/item/weapon/ectoplasm + ) + result = /obj/item/weapon/reagent_containers/food/snacks/ghostburger /datum/recipe/clownburger items = list( diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b9a7dd4b71c..b50b0eb84ee 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -181,25 +181,62 @@ /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) if (src.health > 0) - var/t_him = "it" - if (src.gender == MALE) - t_him = "him" - else if (src.gender == FEMALE) - t_him = "her" - if (istype(src,/mob/living/carbon/human) && src:w_uniform) - var/mob/living/carbon/human/H = src - H.w_uniform.add_fingerprint(M) - if(!src.sleeping_willingly) - src.sleeping = 0 - src.resting = 0 - AdjustParalysis(-3) - AdjustStunned(-3) - AdjustWeakened(-3) - playsound(src.loc, 'thudswoosh.ogg', 50, 1, -1) - M.visible_message( \ - "\blue [M] shakes [src] trying to wake [t_him] up!", \ - "\blue You shake [src] trying to wake [t_him] up!", \ - ) + if(src == M && istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/list/damaged = H.get_damaged_organs(1,1) + src.visible_message( \ + text("\blue [src] examines [].",src.gender==MALE?"himself":"herself"), \ + "\blue You check yourself for injuries." \ + ) + + for(var/datum/organ/external/org in damaged) + var/status = "" + var/brutedamage = org.brute_dam + var/burndamage = org.burn_dam + if(halloss > 0) + if(prob(30)) + brutedamage += halloss + if(prob(30)) + burndamage += halloss + if(brutedamage > 0) + status = "bruised" + if(brutedamage > 20) + status = "bleeding" + if(brutedamage > 40) + status = "mangled" + if(brutedamage > 0 && burndamage > 0) + status += " and " + if(burndamage > 40) + status += "peeling away" + else if(burndamage > 10) + status += "blistered" + else if(burndamage > 0) + status += "numb" + if(status == "") + status = "OK" + src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.getDisplayName(),status),1) + src.show_message(text("\blue You finish checking yourself."),1) + else + var/t_him = "it" + if (src.gender == MALE) + t_him = "him" + else if (src.gender == FEMALE) + t_him = "her" + if (istype(src,/mob/living/carbon/human) && src:w_uniform) + var/mob/living/carbon/human/H = src + H.w_uniform.add_fingerprint(M) + src.sleeping = max(0,src.sleeping-5) + if(!src.sleeping_willingly) + src.sleeping = 0 + src.resting = 0 + AdjustParalysis(-3) + AdjustStunned(-3) + AdjustWeakened(-3) + playsound(src.loc, 'thudswoosh.ogg', 50, 1, -1) + M.visible_message( \ + "\blue [M] shakes [src] trying to wake [t_him] up!", \ + "\blue You shake [src] trying to wake [t_him] up!", \ + ) /mob/living/carbon/proc/eyecheck() return 0 diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index a6ea957ea82..3ad26fe0530 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -142,15 +142,40 @@ visible_message("\red [M] has pushed [src]!") return + var/talked = 0 // BubbleWrap + if(randn <= 60) - drop_item() + //BubbleWrap: Disarming breaks a pull + if(pulling) + visible_message("\red [M] has broken [src]'s grip on [pulling]!") + talked = 1 + pulling = null + + //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? + if(istype(l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/lgrab = l_hand + if(lgrab.affecting) + visible_message("\red [M] has broken [src]'s grip on [lgrab.affecting]!") + talked = 1 + spawn(1) + del(lgrab) + if(istype(r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/rgrab = r_hand + if(rgrab.affecting) + visible_message("\red [M] has broken [src]'s grip on [rgrab.affecting]!") + talked = 1 + spawn(1) + del(rgrab) + //End BubbleWrap + + if(!talked) //BubbleWrap + drop_item() + visible_message("\red [M] has disarmed [src]!") playsound(loc, 'thudswoosh.ogg', 50, 1, -1) - visible_message("\red [M] has disarmed [src]!") return + playsound(loc, 'punchmiss.ogg', 25, 1, -1) visible_message("\red [M] attempted to disarm [src]!") update_clothing() - return - - + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 8fdaf7a69f5..969042828e4 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -69,7 +69,7 @@ src.modules += new /obj/item/weapon/reagent_containers/pill/dexalin(src) src.modules += new /obj/item/weapon/reagent_containers/pill/antitox(src) src.modules += new /obj/item/weapon/reagent_containers/pill/kelotane(src) - src.modules += new /obj/item/weapon/reagent_containers/pill/bicardine(src) + src.modules += new /obj/item/weapon/reagent_containers/pill/bicaridine(src) return @@ -78,7 +78,7 @@ /obj/item/weapon/reagent_containers/pill/dexalin, /obj/item/weapon/reagent_containers/pill/antitox, /obj/item/weapon/reagent_containers/pill/kelotane, - /obj/item/weapon/reagent_containers/pill/bicardine + /obj/item/weapon/reagent_containers/pill/bicaridine ) for (var/T in what) if (!(locate(T) in src.modules)) diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 42e8cc10227..398cb8687a4 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -440,6 +440,27 @@ else droplimb(1) + proc/getDisplayName() + switch(src.name) + if("l_leg") + return "left leg" + if("r_leg") + return "right leg" + if("l_arm") + return "left arm" + if("r_arm") + return "right arm" + if("l_foot") + return "left foot" + if("r_foot") + return "right foot" + if("l_hand") + return "left hand" + if("r_hand") + return "right hand" + else + return src.name + /datum/organ/wound name = "wound" var/wound_type = 0 //0 = cut, 1 = bruise, 2 = burn @@ -564,6 +585,8 @@ parent.owner.updatehealth() + + /**************************************************** INTERNAL ORGANS ****************************************************/ diff --git a/code/modules/mob/simple_animal/corgi.dm b/code/modules/mob/simple_animal/corgi.dm index c2925685f6f..b0741d3f6a3 100644 --- a/code/modules/mob/simple_animal/corgi.dm +++ b/code/modules/mob/simple_animal/corgi.dm @@ -367,6 +367,13 @@ now_pushing = null return return +//PC stuff-Sieve + +/mob/living/simple_animal/corgi/proc/mind_initialize(mob/G) + mind = new + mind.current = src + mind.assigned_role = "Corgi" + mind.key = G.key /obj/item/weapon/reagent_containers/food/snacks/sliceable/meat/corgi name = "Corgi meat" diff --git a/code/modules/mob/simple_animal/life.dm b/code/modules/mob/simple_animal/life.dm index 292b88406f3..1cbdc856432 100644 --- a/code/modules/mob/simple_animal/life.dm +++ b/code/modules/mob/simple_animal/life.dm @@ -47,7 +47,9 @@ var/attacktext = "attacks" var/attack_sound = null var/friendly = "nuzzles" //If the mob does no damage with it's attack + var/wall_smash = 0 //if they can smash walls + var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster /mob/living/simple_animal/New() ..() verbs -= /mob/verb/observe @@ -286,4 +288,10 @@ usr << "\red This weapon is ineffective, it does no damage." for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") \ No newline at end of file + M.show_message("\red [user] gently taps [src] with the [O]. ") +/mob/living/simple_animal/movement_delay() + var/tally = 0 //Incase I need to add stuff other than "speed" later + + tally = speed + + return tally \ No newline at end of file diff --git a/code/modules/mob/simple_animal/shade.dm b/code/modules/mob/simple_animal/shade.dm index 50d542d5077..6bf0477312d 100644 --- a/code/modules/mob/simple_animal/shade.dm +++ b/code/modules/mob/simple_animal/shade.dm @@ -20,6 +20,7 @@ min_oxy = 0 max_co2 = 0 max_tox = 0 + speed = -1 Life() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index cb8f388b9a4..3a6ee96ea11 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -308,6 +308,30 @@ new_metroid.a_intent = "hurt" new_metroid << "You are now a baby Metroid." + spawn(0)//To prevent the proc from returning null. + del(src) + return + +/mob/living/carbon/human/proc/corgize() + if (monkeyizing) + return + for(var/obj/item/W in src) + drop_from_slot(W) + update_clothing() + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + for(var/t in organs) + del(t) + + var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) + + new_corgi.mind_initialize(src) + new_corgi.key = key + + new_corgi.a_intent = "hurt" + new_corgi << "You are now a Corgi!." spawn(0)//To prevent the proc from returning null. del(src) return \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 6579ac6f4c9..46adc70108f 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -690,6 +690,7 @@ datum materials = list("$glass" = 2000, "acid" = 20) build_path = "/obj/item/weapon/circuitboard/mecha/durand/targeting" + honker_main name = "Circuit Design (\"H.O.N.K\" Central Control module)" desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." @@ -849,6 +850,7 @@ datum req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3) build_path = "/obj/item/mecha_parts/mecha_equipment/generator/nuclear" + //////////////////////////////////////// //////////Disk Construction Disks/////// //////////////////////////////////////// @@ -1014,6 +1016,8 @@ datum reliability_base = 75 build_path = "/obj/item/weapon/stock_parts/matter_bin/super" + + subspace_ansible name = "Subspace Ansible" desc = "A compact module capable of sensing extradimensional activity." @@ -1113,7 +1117,7 @@ datum name = "Hyper-Capacity Power Cell" desc = "A power cell that holds 30000 units of energy" id = "hyper_cell" - req_tech = list("powerstorage" = 6, "materials" = 4) + req_tech = list("powerstorage" = 5, "materials" = 4) reliability_base = 85 build_type = PROTOLATHE materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70) diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 6449958d060..ddc364ead3f 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index e70762f9803..a4eda36f22d 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 6f2da6e2f46..3a0c0715d39 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index d8d6cdcad04..81bd8126b52 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index befe78c9263..26d6dc44b50 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 27b05fd606a..6e7efe921c0 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 2a4d79e7205..fdaaa510399 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 693139d5921..efe04808b5e 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 27fe71a8ae4..295b4d6da7b 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/paper.dmi b/icons/obj/paper.dmi index 7b81912e454..55ac7472beb 100644 Binary files a/icons/obj/paper.dmi and b/icons/obj/paper.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 73ba7d9fed8..cd4855d2e01 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 051c466ff67..a142b57ea99 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/sound/machines/copier.ogg b/sound/machines/copier.ogg new file mode 100644 index 00000000000..4e407a573d4 Binary files /dev/null and b/sound/machines/copier.ogg differ