diff --git a/baystation12.dme b/baystation12.dme index 4d995fb572..c82f08c0d5 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 7a249386de..1991e1c3bf 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 391effd779..cda3510df6 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 73dd0acc6b..0f3e553662 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 fcf45c668e..be87e6bb1b 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 89c5a1773d..9054cbe597 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 0dcbdf15d4..632fdca82f 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 479eff1931..d7cb81bf73 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 60e68e43d1..e1fa773119 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 769ee4ec8d..c7945cda4f 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 f18aa2323f..f249ada8cb 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 0000000000..73adecbabd --- /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 4fa1630dd5..eb4135f410 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 dd496bbfb3..eabfdd003a 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 b2e1f3f557..c6c2eac929 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 8098200a4e..3ae6770cea 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 0ec248edc4..81c0dd07d5 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 80ea9a50cc..01dd2e422e 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 bbb8d7c027..b4c6af06d2 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 730d2dc6c9..6ae193e14d 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 085910a451..103d7c2a99 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 6c89401cdc..23a05cf7be 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 9b77697bb5..f75bfc718e 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 23fb752b31..c1f5cfc987 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 b634e20692..bb00b0e1f2 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 b4cda59a16..1cbb6f7903 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 512a8cd478..209fbea8b5 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 c651e28117..e2d53d0c6a 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 53e58c3c4f..d4e838e9f9 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 0afdb11a16..7b0d232457 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 e4c40b1e78..3fe2c278f9 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 9361b68907..a250adb992 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 6c9bee0fe0..696fa42ce6 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 8ec84a262a..d340576c8e 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 96f23bfdf4..2c2de53577 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 5639690fc1..756309a9bb 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 05f5c5cf26..4cb984c2a1 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 e4ace4ad73..e9a65d7775 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 ca4fc6b3ef..64f43fa243 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 b9a7dd4b71..b50b0eb84e 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 a6ea957ea8..3ad26fe053 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 8fdaf7a69f..969042828e 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 42e8cc1022..398cb8687a 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 c2925685f6..b0741d3f6a 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 292b88406f..1cbdc85643 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 50d542d507..6bf0477312 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 cb8f388b9a..3a6ee96ea1 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 6579ac6f4c..46adc70108 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 6449958d06..ddc364ead3 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 e70762f980..a4eda36f22 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 6f2da6e2f4..3a0c0715d3 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 d8d6cdcad0..81bd8126b5 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 befe78c926..26d6dc44b5 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 27b05fd606..6e7efe921c 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 2a4d79e720..fdaaa51039 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 693139d592..efe04808b5 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 27fe71a8ae..295b4d6da7 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 7b81912e45..55ac7472be 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 73ba7d9fed..cd4855d2e0 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 051c466ff6..a142b57ea9 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 0000000000..4e407a573d Binary files /dev/null and b/sound/machines/copier.ogg differ