diff --git a/aurorastation.dme b/aurorastation.dme index e99cfb5d776..64c09480d66 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1873,6 +1873,7 @@ #include "code\modules\background\origins\origins\human\elyra.dm" #include "code\modules\background\origins\origins\human\sol.dm" #include "code\modules\background\origins\origins\ipc\coalition.dm" +#include "code\modules\background\origins\origins\ipc\ecclesiastical.dm" #include "code\modules\background\origins\origins\ipc\elyra.dm" #include "code\modules\background\origins\origins\ipc\golden_deep.dm" #include "code\modules\background\origins\origins\ipc\megacorporate.dm" diff --git a/code/__DEFINES/background.dm b/code/__DEFINES/background.dm index b7d6d495e68..056aa9c3e23 100644 --- a/code/__DEFINES/background.dm +++ b/code/__DEFINES/background.dm @@ -27,7 +27,7 @@ #define CITIZENSHIP_NONE "None" #define CITIZENSHIP_GOLDEN "Golden Deep" -#define CITIZENSHIP_OREPIT "Ecclesiarchy of Orepit" +#define CITIZENSHIP_AXIOM "Ecclesiastical Authority of Axiom" //religion defines #define RELIGION_NONE "None" @@ -98,6 +98,7 @@ #define ACCENT_DOMINIA_LYODII "Lyodii" #define ACCENT_DOMINIA_SUNREACH "Sun Reach" #define ACCENT_DOMINIA_ZHURONG "Zhurong" +#define ACCENT_DOMINIA_CARIA "Carian" #define ACCENT_JUPITER "Jovian" #define ACCENT_CALLISTO "Callistean" #define ACCENT_EUROPA "Europan" @@ -119,8 +120,8 @@ #define ACCENT_ANTILLIA "Port Antillia" #define ACCENT_XANU "Xanu" #define ACCENT_SANCOLETTE "San Colette" -#define ACCENT_OREPIT "Native Orepitter" -#define ACCENT_PROVIDENCE "Providence Trinarist" +#define ACCENT_SALAMASIAN "Salamasian" +#define ACCENT_AXIOM "Axiomite" #define ACCENT_BURZSIA "Burzsia" #define ACCENT_GALATEA "Galatean" #define ACCENT_TSUKUYOMI "Tsukuyomian" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index deb19083e0c..328da86f137 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -230,7 +230,7 @@ //Cargo random stock vars //These are used in randomstock.dm //And also for generating random loot crates in crates.dm -#define TOTAL_STOCK 180//The total number of items we'll spawn in cargo stock +#define TOTAL_STOCK 120//The total number of items we'll spawn in cargo stock #define STOCK_UNCOMMON_PROB 25 //The probability, as a percentage for each item, that we'll choose from the uncommon spawns list diff --git a/code/controllers/subsystems/initialization/codex.dm b/code/controllers/subsystems/initialization/codex.dm index 70a97e77b49..d6ee2e4b621 100644 --- a/code/controllers/subsystems/initialization/codex.dm +++ b/code/controllers/subsystems/initialization/codex.dm @@ -40,6 +40,9 @@ SUBSYSTEM_DEF(codex) var/singleton/recipe/recipe = GET_SINGLETON(reaction_path) var/list/cookingRecipeData = list() + // ID for TGUI to use + cookingRecipeData["id"] = "[reaction_path]" + // result var/obj/item/recipe_result = recipe.result cookingRecipeData["result"] = initial(recipe_result.name) @@ -80,6 +83,8 @@ SUBSYSTEM_DEF(codex) cookingRecipeData["ingredients"] += "[reagent.name] coating" // kitchen appliance + cookingRecipeData["appliances"] = "" + if(recipe.appliance) cookingRecipeData["appliances"] = recipe.get_appliance_names() @@ -147,7 +152,7 @@ SUBSYSTEM_DEF(codex) if(chemistry_codex_ignored_result_path && is_path_in_list(CR.result, chemistry_codex_ignored_result_path)) continue var/singleton/reagent/R = GET_SINGLETON(CR.result) - var/chemistryReactionData = list(id = CR.id) + var/chemistryReactionData = list(id = "[chem_path]") chemistryReactionData["result"] = list( name = R.name, description = R.description, diff --git a/code/controllers/subsystems/responseteam.dm b/code/controllers/subsystems/responseteam.dm index 7429af498ac..fbce2f17151 100644 --- a/code/controllers/subsystems/responseteam.dm +++ b/code/controllers/subsystems/responseteam.dm @@ -87,11 +87,7 @@ SUBSYSTEM_DEF(distress) command_announcement.Announce("A distress beacon has been broadcasted to nearby vessels in the sector. Please remain calm and make preparations for the arrival of third parties.", "[SSatlas.current_map.station_name] Distress Suite", 'sound/ai/announcements/security_level_old.ogg', zlevels = requester.map_z) log_and_message_admins("has launched a distress beacon from the [requester.name] with message: [distress_message].", user) - var/datum/distress_beacon/beacon = new() - beacon.requester = requester - beacon.distress_message = distress_message - beacon.user = user - beacon.user_name = user.name //It is possible that the mob's name may change after the distress beacon is launched, so we keep this var to avoid stuff like that. + var/datum/distress_beacon/beacon = new(requester, distress_message, user) active_distress_beacons[requester.name] = beacon @@ -173,9 +169,15 @@ SUBSYSTEM_DEF(distress) /datum/distress_beacon var/distress_message var/obj/effect/overmap/visitable/requester - var/mob/living/carbon/human/user + var/datum/weakref/user var/user_name +/datum/distress_beacon/New(new_requester, new_message, mob/new_user) + requester = requester + distress_message = distress_message + user = WEAKREF(new_user) + user_name = new_user.name //It is possible that the mob's name may change after the distress beacon is launched, so we keep this var to avoid stuff like that. + /datum/distress_beacon/Destroy() requester = null user = null diff --git a/code/datums/round_canonicity.dm b/code/datums/round_canonicity.dm index 9c5587d76ae..f6a93acb81f 100644 --- a/code/datums/round_canonicity.dm +++ b/code/datums/round_canonicity.dm @@ -92,6 +92,8 @@ . += "To count as involved, a player has to be an active participant of your death, meaning that they must have intentionally contributed to it. As an example, if you die to a carp on an expedition, you can retcon this death without asking others." if(FORCED_CHARACTER_DEATH) . += "Character deaths are forced canon during this round. All character deaths must go through headmins and loremasters to be retconned, no exceptions!" + . += "All injuries sustained as part of this round are immediately and fully canon, and should be roleplayed to the best of your ability, both in this round and the following. \ + Do not ignore an injury you have obtained without explicit approval from administration. You are expected to roleplay its consequences believably, even extending to following rounds." if(NO_CHARACTER_DEATH) . += "Character deaths are not canon during this round." diff --git a/code/datums/uplink/devices_and_tools.dm b/code/datums/uplink/devices_and_tools.dm index 384f6237e49..e167f8df429 100644 --- a/code/datums/uplink/devices_and_tools.dm +++ b/code/datums/uplink/devices_and_tools.dm @@ -264,3 +264,9 @@ desc = "A mask which allows the wearer to view local camera feeds they have access to." telecrystal_cost = 6 path = /obj/item/clothing/mask/ai + +/datum/uplink_item/item/tools/tactical_axe + name = "Tactical Axe" + desc = "An emergency tool meant to pry and chop, while also being sharp enough to kill." + bluecrystal_cost = 1 + path = /obj/item/crowbar/rescue_axe/tactical diff --git a/code/game/jobs/job/outsider/representative.dm b/code/game/jobs/job/outsider/representative.dm index bab7f16e8a0..d69c870ef9b 100644 --- a/code/game/jobs/job/outsider/representative.dm +++ b/code/game/jobs/job/outsider/representative.dm @@ -220,7 +220,7 @@ alt_titles = list("Foreign Service Officer", "Party Representative") alt_citizenships = list( - "Consular Officer" = list("Republic of Biesel", "Sol Alliance", "Coalition of Colonies", "Republic of Elyra", "Elyran Non-Citizen Person", "Eridani Federation", "Empire of Dominia", "Izweski Hegemony", "Nralakk Federation", "The Consortium of Hieroaetheria", "The Union of Gla'orr", "The Eternal Republic of The Ekane", "People's Republic of Adhomai", "Democratic People's Republic of Adhomai", "New Kingdom of Adhomai", "Free Tajaran Council", "Zo'ra Hive", "K'lax Hive", "C'thur Hive", "Undercover Lii'kenka", "None", "Golden Deep", "Ecclesiarchy of Orepit"), + "Consular Officer" = list("Republic of Biesel", "Sol Alliance", "Coalition of Colonies", "Republic of Elyra", "Elyran Non-Citizen Person", "Eridani Federation", "Empire of Dominia", "Izweski Hegemony", "Nralakk Federation", "The Consortium of Hieroaetheria", "The Union of Gla'orr", "The Eternal Republic of The Ekane", "People's Republic of Adhomai", "Democratic People's Republic of Adhomai", "New Kingdom of Adhomai", "Free Tajaran Council", "Zo'ra Hive", "K'lax Hive", "C'thur Hive", "Undercover Lii'kenka", "None", "Golden Deep", "Ecclesiastical Authority of Axiom"), "Foreign Service Officer" = list("Sol Alliance"), "Party Representative" = list("People's Republic of Adhomai") ) diff --git a/code/game/objects/items/devices/versebook.dm b/code/game/objects/items/devices/versebook.dm index 61af3e53b69..a58c4350800 100644 --- a/code/game/objects/items/devices/versebook.dm +++ b/code/game/objects/items/devices/versebook.dm @@ -71,8 +71,11 @@ /obj/item/versebook/trinary name = "\improper The Order (abdridged version)" - desc = "The holy text of the Trinary Perfection, who believe in synthetic perfection and eventual salvation." - desc_extended = "This book contains some verses of the core beliefs of the Trinary Perfection, including some of the original works by the Corkfells, some additions by the prophet-like figure Flock, and a few recent additions by Ecclesiarch ARM-1DRIL. This is the abridged version, with only the core beliefs present." + desc = "The holy text of the Trinary Perfection, who believe in synthetic perfection and eventual salvation. This \ + is the shortened version, the original being a vast relic compiled by Flock, the synthetic prophet of Mendell City." + desc_extended = "This book contains some verses of the core beliefs of the Trinary Perfection, including some of \ + the original works by the Corkfells, some additions by the prophet-like figure Flock, and a few more recent additions \ + by Ecclesiarch ARM-1DRIL. It is a common sight on the persons of faithful Trinarists." icon_state = "trinarybook" item_state = "trinary" @@ -82,8 +85,11 @@ /obj/item/versebook/templeist name = "\improper The Voice of Temple (abdridged version)" - desc = "The holy text of the Lodge of Temple Architect, an order within the Trinary Perfection that seeks to attain its goals via technological advancement and scientific discovery." - desc_extended = "This book contains some of the words of Temple, a sacred AI within the Trinary Perfection and namesake of the Lodge of the Temple Architect. It also includes some teachings by leading members within the sect. Due to its recent establishment, this book is frequently changed and amended \ + desc = "The holy text of the Lodge of Temple Architect, an order within the Trinary Perfection that \ + seeks to attain its goals via technological advancement and scientific discovery." + desc_extended = "This book contains some of the words of Temple, a sacred AI within the Trinary Perfection \ + and namesake of the Lodge of the Temple Architect. It also includes some teachings by leading members \ + within the sect. Due to its recent establishment, this book is frequently changed and amended \ as new insights into their faith are realized." icon_state = "templeistbook" item_state = "templeist" diff --git a/code/game/objects/items/recharger_backpack.dm b/code/game/objects/items/recharger_backpack.dm index 471a8e50d4b..a83b03eb540 100644 --- a/code/game/objects/items/recharger_backpack.dm +++ b/code/game/objects/items/recharger_backpack.dm @@ -38,7 +38,7 @@ powersupply = attacking_item update_icon() - else if(istype(attacking_item, /obj/item/screwdriver) && powersupply) + else if(attacking_item.tool_behaviour == TOOL_SCREWDRIVER && powersupply) to_chat(user, SPAN_NOTICE("You remove \the [powersupply] from \the [src]'s power socket")) powersupply.forceMove(get_turf(src)) user.put_in_hands(powersupply) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 52e803c9ac3..2eb3ecfaa06 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -1,6 +1,6 @@ /obj/item/crowbar - name = "pocket crowbar" - desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors." + name = "crowbar" + desc = "This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors." icon = 'icons/obj/tools.dmi' item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_tools.dmi', @@ -62,6 +62,14 @@ icon_state = "rescue_axe_red" item_state = "rescue_axe_red" +/obj/item/crowbar/rescue_axe/tactical + name = "tactical axe" + desc = "A short axe with a carbon fibre handle, meant to be both an emergency tool and a weapon." + icon = 'icons/obj/item/tactical_axe.dmi' + icon_state = "combataxe" + item_state = "combataxe" + contained_sprite = TRUE + /obj/item/crowbar/hydraulic_rescue_tool name = "hydraulic rescue tool" desc = "A hydraulic rescue tool that functions like a crowbar by applying strong amounts of hydraulic pressure to force open different things. Also known as jaws of life." diff --git a/code/game/objects/items/tools/tools.dm b/code/game/objects/items/tools/tools.dm index 85a53a8d476..be52fdb1f4b 100644 --- a/code/game/objects/items/tools/tools.dm +++ b/code/game/objects/items/tools/tools.dm @@ -861,9 +861,6 @@ update_tool(tool) return TRUE -/obj/item/powerdrill/issurgerycompatible() - return FALSE // too unwieldy for most surgeries - /obj/item/steelwool name = "steel wool" desc = "Harvested from the finest NanoTrasen steel sheep." diff --git a/code/game/objects/items/weapons/chaplain_items.dm b/code/game/objects/items/weapons/chaplain_items.dm index 30abc05a370..e057dc97fdf 100644 --- a/code/game/objects/items/weapons/chaplain_items.dm +++ b/code/game/objects/items/weapons/chaplain_items.dm @@ -233,7 +233,7 @@ /obj/item/nullrod/clockworkstave name = "\improper clockwork stave" desc = "A long, wooden stave with a gear and triangle at the top, utilized by the clergy of the Trinary Perfection. The ornate pieces atop the stave are often delicately \ - hand-crafted by synthetics from the monastic Society of Pitters and exported off the planet of Orepit." + hand-crafted by synthetics from the monastic Order of Pitters and exported off the planet of Axiom." icon = 'icons/obj/trinary_stave.dmi' icon_state = "trinary_stave" item_state = "trinary_stave" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharger.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharger.dm index 060b5c3984a..003571d1e6e 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/recharger.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/recharger.dm @@ -14,3 +14,12 @@ req_components = list( "/obj/item/stock_parts/capacitor" = 3 ) + +/obj/item/circuitboard/cell_charger + name = T_BOARD("recharger") + build_path = /obj/structure/machinery/cell_charger + board_type = BOARD_MACHINE + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 1) + req_components = list( + "/obj/item/stock_parts/capacitor" = 2 + ) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 78434a8928f..3f4c446f62d 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -1943,3 +1943,60 @@ /obj/item/organ/internal/augment/bioaug/mind_blanker ) storage_slots = 4 + +// Trash components. Bottom of the line +/obj/item/storage/box/components + name = "low-grade component box" + illustration = "circuit" + color = COLOR_BLUE_GRAY + make_exact_fit = TRUE + can_hold_strict = TRUE + display_contents_with_number = TRUE + allow_quick_gather = TRUE + use_to_pickup = TRUE + can_hold = list(/obj/item/stock_parts) + starts_with = list( + /obj/item/stock_parts/console_screen = 3, + /obj/item/stock_parts/capacitor = 4, + /obj/item/stock_parts/scanning_module = 4, + /obj/item/stock_parts/manipulator = 4, + /obj/item/stock_parts/micro_laser = 4, + /obj/item/stock_parts/matter_bin = 4, + ) + +// The decent stuff. Better than the small ones +/obj/item/storage/box/components/advanced + name = "mid-grade component box" + starts_with = list( + /obj/item/stock_parts/console_screen = 3, + /obj/item/stock_parts/capacitor/adv = 4, + /obj/item/stock_parts/scanning_module/adv = 4, + /obj/item/stock_parts/manipulator/nano = 4, + /obj/item/stock_parts/micro_laser/high = 4, + /obj/item/stock_parts/matter_bin/adv = 4, + ) + +// Top tier components +/obj/item/storage/box/components/super_advanced + name = "high-grade component box" + starts_with = list( + /obj/item/stock_parts/console_screen = 3, + /obj/item/stock_parts/capacitor/super = 4, + /obj/item/stock_parts/scanning_module/phasic = 4, + /obj/item/stock_parts/manipulator/pico = 4, + /obj/item/stock_parts/micro_laser/ultra = 4, + /obj/item/stock_parts/matter_bin/super = 4, + ) + +//Telecomms parts +/obj/item/storage/box/components/telecomms + name = "telecomm component box" + starts_with = list( + /obj/item/stock_parts/subspace/ansible = 4, + /obj/item/stock_parts/subspace/filter = 4, + /obj/item/stock_parts/subspace/amplifier = 4, + /obj/item/stock_parts/subspace/treatment = 4, + /obj/item/stock_parts/subspace/analyzer = 4, + /obj/item/stock_parts/subspace/crystal = 4, + /obj/item/stock_parts/subspace/transmitter = 4 + ) diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 698bf98f632..6a1f25f08dc 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -21,15 +21,20 @@ /obj/item/storage/internal/mob_can_equip(M, slot, disable_warning = FALSE, bypass_blocked_check = FALSE, is_overlay_check = FALSE) return 0 //make sure this is never picked up -//Helper procs to cleanly implement internal storages - storage items that provide inventory slots for other items. -//These procs are completely optional, it is up to the master item to decide when it's storage get's opened by calling open() -//However they are helpful for allowing the master item to pretend it is a storage item itself. -//If you are using these you will probably want to override attackby() as well. -//See /obj/item/clothing/suit/storage for an example. - -//items that use internal storage have the option of calling this to emulate default storage MouseDrop behaviour. -//returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. It's strange, but no other way of -//doing it without the ability to call another proc's parent, really. +/** + * Helper procs to cleanly implement internal storages - storage items that provide inventory slots for other items. + * These procs are completely optional, it is up to the master item to decide when it's storage get's opened by calling open() + * + * However they are helpful for allowing the master item to pretend it is a storage item itself. + * + * If you are using these you will probably want to override attackby() as well. + * See /obj/item/clothing/suit/storage for an example. + * + * items that use internal storage have the option of calling this to emulate default storage MouseDrop behaviour. + * + * Returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. + * It's strange, but no other way of doing it without the ability to call another proc's parent, really. + */ /obj/item/storage/internal/proc/handle_mousedrop(mob/user as mob, obj/over_object as obj) if (ishuman(user) || issmall(user)) //so monkeys can take off their backpacks -- Urist @@ -48,20 +53,22 @@ return 0 if (!( user.restrained() ) && !( user.stat )) + if(!user.prepare_for_slotmove(real_master_item)) //Prevents removing hardsuits when they have storage modules in them. + return 0 switch(over_object.name) if("right hand") - user.u_equip(real_master_item) user.equip_to_slot_if_possible(real_master_item, slot_r_hand) if("left hand") - user.u_equip(real_master_item) user.equip_to_slot_if_possible(real_master_item, slot_l_hand) real_master_item.add_fingerprint(user) return 0 return 0 -//items that use internal storage have the option of calling this to emulate default storage attack_hand behaviour. -//returns 1 if the master item's parent's attack_hand() should be called, 0 otherwise. -//It's strange, but no other way of doing it without the ability to call another proc's parent, really. +/** + * items that use internal storage have the option of calling this to emulate default storage attack_hand behaviour. + * returns 1 if the master item's parent's attack_hand() should be called, 0 otherwise. + * It's strange, but no other way of doing it without the ability to call another proc's parent, really. + */ /obj/item/storage/internal/proc/handle_attack_hand(mob/user as mob) var/obj/item/real_master_item = special_master_item_handling ? get_master_item() : master_item diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 556feae70a5..bb185c09d0b 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -953,7 +953,7 @@ else to_chat(user, SPAN_WARNING("You need at least twelve rods to complete \the [src].")) return - else if(istype(attacking_item, /obj/item/screwdriver)) + else if(attacking_item.tool_behaviour == TOOL_SCREWDRIVER) return else ..() diff --git a/code/game/objects/structures/barricades/liquid.dm b/code/game/objects/structures/barricades/liquid.dm index 79d2ab4852b..fc11a3917c1 100644 --- a/code/game/objects/structures/barricades/liquid.dm +++ b/code/game/objects/structures/barricades/liquid.dm @@ -55,8 +55,8 @@ maxhealth += 50 /obj/structure/barricade/liquid/attackby(obj/item/attacking_item, mob/user) - if(istype(attacking_item, /obj/item/crowbar) && user.a_intent != I_HURT) - var/obj/item/crowbar/ET = attacking_item + if(attacking_item.tool_behaviour == TOOL_CROWBAR && user.a_intent != I_HURT) + var/obj/item/ET = attacking_item user.visible_message(SPAN_NOTICE("[user] starts disassembling [src]."), \ SPAN_NOTICE("You start disassembling [src].")) if(ET.use_tool(src, user, 4 SECONDS)) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 34d2c5052a8..0841580d356 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -134,7 +134,6 @@ new /obj/item/gun/energy/repeater/pistol(src) new /obj/item/taperoll/police(src) new /obj/item/breath_analyzer(src) - new /obj/item/crowbar/red(src) new /obj/item/ipc_tag_scanner(src) new /obj/item/taperecorder(src) new /obj/item/binoculars(src) @@ -145,6 +144,7 @@ new /obj/item/storage/belt/security/full(src) new /obj/item/storage/belt/security/vestbelt(src) new /obj/item/storage/box/fancy/keypouch/sec(src) + new /obj/item/crowbar/rescue_axe/tactical(src) /obj/structure/closet/secure_closet/hos2 name = "head of security's attire" @@ -288,6 +288,7 @@ new /obj/item/storage/belt/security/full(src) new /obj/item/storage/belt/security/vestbelt(src) new /obj/item/clothing/suit/storage/hazardvest/security/officer(src) + new /obj/item/crowbar/rescue_axe/tactical(src) /obj/structure/closet/secure_closet/investigator name = "investigator's locker" diff --git a/code/game/objects/structures/flags_banners.dm b/code/game/objects/structures/flags_banners.dm index c0780f3e7d1..1c095194daf 100644 --- a/code/game/objects/structures/flags_banners.dm +++ b/code/game/objects/structures/flags_banners.dm @@ -1341,6 +1341,73 @@ /obj/structure/sign/flag/trinaryperfection/large/west/Initialize(mapload) . = ..(mapload, WEST) +// Salamasian Republic + +/obj/item/flag/salamasian_republic + name = "\improper Salamasian Republic flag" + desc = "The flag of the Salamasian Republic, one of the two codependent states of \ + Axiom, also known as Nuʻu or Orepit. Born from corporate colonization, abandonment, \ + revolt, and generations of hardship, the republic and its people have shaped a vibrant \ + culture wholly their own." + desc_extended = "The flag of the Salamasian Republic consists of a bright turquoise field \ + above a deep teal band. Upon the field sits a large orange disc, accompanied by three smaller \ + spheres in tan, blue, and gray. The turquoise field represents the sky and sea of Nuʻu, \ + recalling the world’s broad oceans and open horizons. The deep teal band represents land, \ + home, and cultivation: the fertile ground upon which the old mining settlements became villages, \ + cities, and, in time, a republic. The orange disc depicts Aloʻo le La, the orange dwarf star of \ + the Tagaloa system. The three smaller discs represent the other visible bodies of the Tagaloa sky: \ + Leiloa, Vaoati, and Faʻatiu, shown from top to bottom. They are also commonly read as symbols of \ + family, strength, and virtue, core ideals of Faʻa Salamasia. As a whole, the flag recreates the \ + sky as seen from Nuʻu’s surface, with its celestial neighbors visible above the land of Nu’u." + flag_path = "salamasian_republic" + flag_structure = /obj/structure/sign/flag/salamasian_republic + +/obj/structure/sign/flag/salamasian_republic + name = "\improper Salamasian Republic flag" + desc = "The flag of the Salamasian Republic, one of the two codependent states of \ + Axiom, also known as Nuʻu or Orepit. Born from corporate colonization, abandonment, \ + revolt, and generations of hardship, the republic and its people have shaped a vibrant \ + culture wholly their own." + desc_extended = "The flag of the Salamasian Republic consists of a bright turquoise field \ + above a deep teal band. Upon the field sits a large orange disc, accompanied by three smaller \ + spheres in tan, blue, and gray. The turquoise field represents the sky and sea of Nuʻu, \ + recalling the world’s broad oceans and open horizons. The deep teal band represents land, \ + home, and cultivation: the fertile ground upon which the old mining settlements became villages, \ + cities, and, in time, a republic. The orange disc depicts Aloʻo le La, the orange dwarf star of \ + the Tagaloa system. The three smaller discs represent the other visible bodies of the Tagaloa sky: \ + Leiloa, Vaoati, and Faʻatiu, shown from top to bottom. They are also commonly read as symbols of \ + family, strength, and virtue, core ideals of Faʻa Salamasia. As a whole, the flag recreates the \ + sky as seen from Nuʻu’s surface, with its celestial neighbors visible above the land of Nu’u." + flag_path = "salamasian_republic" + icon_state = "salamasian_republic" + flag_item = /obj/item/flag/salamasian_republic + +/obj/structure/sign/flag/salamasian_republic/unmovable + unmovable = TRUE + +/obj/item/flag/salamasian_republic/l + name = "large Salamasian Republic flag" + flag_size = TRUE + flag_structure = /obj/structure/sign/flag/salamasian_republic/large + +/obj/structure/sign/flag/salamasian_republic/large + icon_state = "salamasian_republic_l" + flag_path = "salamasian_republic" + flag_size = TRUE + flag_item = /obj/item/flag/salamasian_republic/l + +/obj/structure/sign/flag/salamasian_republic/large/north/Initialize(mapload) + . = ..(mapload, NORTH) + +/obj/structure/sign/flag/salamasian_republic/large/south/Initialize(mapload) + . = ..(mapload, SOUTH) + +/obj/structure/sign/flag/salamasian_republic/large/east/Initialize(mapload) + . = ..(mapload, EAST) + +/obj/structure/sign/flag/salamasian_republic/large/west/Initialize(mapload) + . = ..(mapload, WEST) + // Golden Deep /obj/item/flag/goldendeep @@ -4261,3 +4328,48 @@ /obj/structure/sign/flag/outer_eyes/large/west/Initialize(mapload) . = ..(mapload, WEST) + +// Caria + +/obj/structure/sign/flag/caria + name = "\improper Caria banner" + desc = "The flag of the Imperial Viceroyalty of Caria, a trade-focused Dominian colonial world." + desc_extended = "The twin moons of the Carian flag represent Lixus, the reflective moon which makes life on the planet possible at all. The twin fires represent a sacred tradition where members of the Adirim — its voting body — pass between two sacred flames to purify their souls before voting." + icon_state = "caria" + flag_item = /obj/item/flag/caria + +/obj/item/flag/caria + name = "\improper Caria banner" + desc = "The flag of the Imperial Viceroyalty of Caria, a trade-focused Dominian colonial world." + desc_extended = "The twin moons of the Carian flag represent Lixus, the reflective moon which makes life on the planet possible at all. The twin fires represent a sacred tradition where members of the Adirim — its voting body — pass between two sacred flames to purify their souls before voting." + flag_path = "caria" + flag_structure = /obj/structure/sign/flag/caria + +/obj/item/flag/caria/l + name = "\improper Caria flag" + desc = "The flag of the Imperial Viceroyalty of Caria, a trade-focused Dominian colonial world." + desc_extended = "The twin moons of the Carian flag represent Lixus, the reflective moon which makes life on the planet possible at all. The twin fires represent a sacred tradition where members of the Adirim — its voting body — pass between two sacred flames to purify their souls before voting." + flag_path = "caria" + flag_size = TRUE + flag_structure = /obj/structure/sign/flag/caria/large + +/obj/structure/sign/flag/caria/large + name = "\improper Caria flag" + desc = "The flag of the Imperial Viceroyalty of Caria, a trade-focused Dominian colonial world." + desc_extended = "The twin moons of the Carian flag represent Lixus, the reflective moon which makes life on the planet possible at all. The twin fires represent a sacred tradition where members of the Adirim — its voting body — pass between two sacred flames to purify their souls before voting." + icon_state = "caria_l" + flag_path = "caria" + flag_size = TRUE + flag_item = /obj/item/flag/caria/l + +/obj/structure/sign/flag/caria/large/north/Initialize(mapload) + . = ..(mapload, NORTH) + +/obj/structure/sign/flag/caria/large/south/Initialize(mapload) + . = ..(mapload, SOUTH) + +/obj/structure/sign/flag/caria/large/east/Initialize(mapload) + . = ..(mapload, EAST) + +/obj/structure/sign/flag/caria/large/west/Initialize(mapload) + . = ..(mapload, WEST) diff --git a/code/game/objects/structures/machinery/cell_charger.dm b/code/game/objects/structures/machinery/cell_charger.dm index d8f9ba9da41..0a855b38c53 100644 --- a/code/game/objects/structures/machinery/cell_charger.dm +++ b/code/game/objects/structures/machinery/cell_charger.dm @@ -8,10 +8,16 @@ active_power_usage = 90 KILO WATTS power_channel = AREA_USAGE_EQUIP update_icon_on_init = TRUE + component_types = list( + /obj/item/circuitboard/cell_charger, + /obj/item/stock_parts/capacitor = 2 + ) var/obj/item/cell/charging = null var/charge_level = -1 - var/const/CHARGE_EFFICIENCY = 1.38 + var/charging_efficiency = 2 + var/charging_efficiency_per_capacitor = 0.1 + var/charging_speed_per_capacitor = 25 KILO WATTS /obj/structure/machinery/cell_charger/assembly_hints(mob/user, distance, is_adjacent) . += ..() @@ -27,6 +33,16 @@ else . += SPAN_WARNING("The charger is empty.") +/obj/structure/machinery/cell_charger/RefreshParts() + ..() + + var/cap_rating = 0 + for(var/obj/item/stock_parts/capacitor/capacitor in component_parts) + cap_rating += capacitor.rating + + charging_efficiency = initial(charging_efficiency) * (1 + (cap_rating * charging_efficiency_per_capacitor)) + active_power_usage = cap_rating * charging_speed_per_capacitor + /obj/structure/machinery/cell_charger/proc/update_charge_level() if(!charging) charge_level = -1 @@ -56,16 +72,6 @@ if(stat & BROKEN) return TRUE - if(attacking_item.tool_behaviour == TOOL_WRENCH) - if(charging) - to_chat(user, SPAN_WARNING("Remove the cell first!")) - return TRUE - - anchored = !anchored - to_chat(user, "You [anchored ? "" : "un"]secure \the [src].") - attacking_item.play_tool_sound(src, 50) - return TRUE - if(istype(attacking_item, /obj/item/cell)) if(!anchored) to_chat(user, SPAN_WARNING("You need to secure \the [src] first.")) @@ -75,6 +81,10 @@ to_chat(user, SPAN_WARNING("There is already a cell in \the [src].")) return TRUE + if(panel_open) + to_chat(user, SPAN_WARNING("You need to close the maintenance panel on \the [src] first.")) + return TRUE + user.drop_from_inventory(attacking_item, src) charging = attacking_item user.visible_message("[user] inserts \the [charging.name] into \the [src].", "You insert \the [charging.name] into \the [src].") @@ -83,6 +93,24 @@ START_PROCESSING_MACHINE(src, MACHINERY_PROCESS_SELF) return TRUE + if(charging) + to_chat(user, SPAN_WARNING("Remove the cell first!")) + return TRUE + + if(attacking_item.tool_behaviour == TOOL_WRENCH) + anchored = !anchored + to_chat(user, "You [anchored ? "" : "un"]secure \the [src].") + attacking_item.play_tool_sound(src, 50) + return TRUE + + if(default_deconstruction_screwdriver(user, attacking_item)) + update_icon() + return TRUE + else if(default_deconstruction_crowbar(user, attacking_item)) + return TRUE + else if(default_part_replacement(user, attacking_item)) + return TRUE + /obj/structure/machinery/cell_charger/attack_hand(mob/user) if(charging) user.put_in_hands(charging, TRUE) @@ -129,7 +157,7 @@ if (charging && !charging.fully_charged()) if(use_power < POWER_USE_ACTIVE) update_use_power(POWER_USE_ACTIVE) - charging.give(active_power_usage * CELLRATE * CHARGE_EFFICIENCY) + charging.give(active_power_usage * CELLRATE * charging_efficiency) update_icon() else update_use_power(POWER_USE_IDLE) diff --git a/code/game/objects/structures/machinery/rechargestation.dm b/code/game/objects/structures/machinery/rechargestation.dm index ad254b64536..c7f0f64314a 100644 --- a/code/game/objects/structures/machinery/rechargestation.dm +++ b/code/game/objects/structures/machinery/rechargestation.dm @@ -135,26 +135,26 @@ if(ishuman(occupant)) var/mob/living/carbon/human/H = occupant - var/obj/item/organ/internal/machine/power_core/IC = H.internal_organs_by_name[BP_CELL] - if(istype(IC)) - target = IC.cell - - // Different reactor types have different external recharge speeds. if(isipc(H)) reactor = H.internal_organs_by_name[BP_REACTOR] if(!istype(reactor)) return - if((!target || target.percent() > 98) && istype(H.back, /obj/item/rig)) + if((!target || target.percent() > 99) && istype(H.back, /obj/item/rig)) var/obj/item/rig/R = H.back if(R.cell && !R.cell.fully_charged()) target = R.cell + if(!target) + var/obj/item/organ/internal/machine/power_core/IC = H.internal_organs_by_name[BP_CELL] + if(istype(IC)) + target = IC.cell + if(target && !target.fully_charged()) var/diff = min(target.maxcharge - target.charge, charging_power * CELLRATE * seconds_per_tick) // Capped by charging_power / tick var/charge_used = cell.use(diff) - if(!reactor) // not an IPC + if(!reactor || target.percent() < 99) // not an IPC target.give(charge_used * charging_efficiency) else reactor.generate_power(charge_used * charging_efficiency * reactor.external_charge_multiplier) diff --git a/code/modules/background/accent/human.dm b/code/modules/background/accent/human.dm index fcee0b762de..d922c03047b 100644 --- a/code/modules/background/accent/human.dm +++ b/code/modules/background/accent/human.dm @@ -395,19 +395,24 @@ tag_icon = "damascus" text_tag = "DAM" -/datum/accent/orepitter - name = ACCENT_OREPIT - description = "Native Orepitters developed their own way of speech that stemmed from centuries of complete isolation. The vast distances of the planet's desert surface required loud, high pitched sounds for reliable communication, \ - making it the primary characteristic of the Orepitter accent." - tag_icon = "orepit" - text_tag = "ORE" +/datum/accent/salamasian + name = ACCENT_SALAMASIAN + description = "The Salamasians descend primarily from the peoples of Samoa, and their dialects thusly resemble \ + those of their ancestors. Due to their long-term isolation, having been largely cut off from the outside world since \ + the withdrawal of Hephaestus Industries, Salamasian Common is extremely archaic; many words and phonetics are reserved \ + here that were phased out of other variants of the language well over a century ago." + tag_icon = "salamasian" + text_tag = "SAL" -/datum/accent/providence - name = ACCENT_PROVIDENCE - description = "While the capital of the Trinarists never had a sole language, its people from all over the Spur have come to adopt a unified accent. Characterised by fast-paced speaking and unique intonations to match the style of their \ - synthetic brethren, IPCs have also come to adopt the accent for non-EAL languages." - tag_icon = "providence" - text_tag = "PDE" +/datum/accent/axiom + name = ACCENT_AXIOM + description = "Descending jointly from the Biesellite accents of the original settlers and the Salamasian \ + dialects around them, the Axiomite accent is a peculiar chimera that tends to confuse any that listen to it. \ + Due to the influence of highly archaic Salamasian dialects, it features many words and phonetics otherwise \ + phased out of more modern permutations of Sol Common, earning it a grandiose, theatrical air - which is undercut \ + quite terribly by the semi-regular appearance of very modern colloquialisms." + tag_icon = "axiomite" + text_tag = "AXI" /datum/accent/reade name = ACCENT_READE @@ -451,3 +456,9 @@ description = "Zhurongese is a dialect of Vulgar Morozi found on the Core World of Zhurong, where it is spoken by the Secondaries who make up most of the skilled workers and supervisors on the planet. While it mostly sticks to traditional Vulgar Morozi structures, its origin on one of the oldest colonies in the Empire and Zhurong itself being a more restricted world has led to this dialect being less influenced by the broader Spur. Scholars believe this dialect may be closer to pre-Imperial Vulgar Morozi than any other in the Empire." tag_icon = "zhurong" text_tag = "ZHU" + +/datum/accent/caria + name = ACCENT_DOMINIA_CARIA + description = "Carian Standard is an unusual dialect from an atypical world. The only non-Morozi dialect of Tradeband found in the Empires borders, it is similar to High Morozi in its pronunciation and grammatical structures. Speakers of this dialect are viewed with suspicion in the Empire, believed to be sorcerers, witches, and often touched by some form of darkness — but they are equally called for their worlds association with augury and the divine, with Carian seers prized by many noble households in the Empire." + tag_icon = "caria" + text_tag = "CAR" diff --git a/code/modules/background/citizenship/ipc.dm b/code/modules/background/citizenship/ipc.dm index 9171fd043fc..243b6306a90 100644 --- a/code/modules/background/citizenship/ipc.dm +++ b/code/modules/background/citizenship/ipc.dm @@ -64,12 +64,16 @@ /obj/item/gun/energy/pistol/goldendeep = 1 ) -/datum/citizenship/orepit - name = CITIZENSHIP_OREPIT - description = "Tracing its origins to the Church of the Trinary Perfection in 2419, the Ecclesiarchy of Orepit is a theocratic regime under the rule of \ - ARM-1DRIL, former follower of Gregol Corkfell. Prominent locations include Providence, Orepit's capital and base of operations for the Church, and the Twenty Parishes, \ - home to the planet's original native human population, who remain divided on conversion to the faith. Orepit was one of the main signatories to the Open Doors memorandum, \ - allowing its populace to work, study, and travel abroad in the Coalition and beyond, primarily in the All-Xanu Republic, utilizing Xanan documents." +/datum/citizenship/axiom + name = CITIZENSHIP_AXIOM + description = "Citizenship with the Ecclesiastical Authority of Axiom means one of two things; \ + either you belong directly to Ecclesiastical territory, living under the direct temporal rule of the \ + synthetic religion of the Trinary Perfection in its capital of Providence or in the surrounding Marches, \ + or you are a citizen of the Salamasian Republic, the majority human nation which defers to the Ecclesiastical \ + Authority in planetary defense and interstellar travel. Founded jointly as a dual-state solution in 2464 \ + in 2419, both the Ecclesiarchy and the Republic compose a greater whole; a remote mining world now under \ + rapid development, the recipient of throngs of synthetic and human refugees from across the known universe, \ + and a project of shared interest and mutual distance between both populations of the planet of Axiom." job_species_blacklist = list( "Consular Officer" = ALL_SPECIES, diff --git a/code/modules/background/origins/origins/human/coalition.dm b/code/modules/background/origins/origins/human/coalition.dm index 11eb01272cb..dbdacb940a6 100644 --- a/code/modules/background/origins/origins/human/coalition.dm +++ b/code/modules/background/origins/origins/human/coalition.dm @@ -11,7 +11,8 @@ /singleton/origin_item/origin/gadpathur_exile, /singleton/origin_item/origin/assunzione, /singleton/origin_item/origin/ncf, - /singleton/origin_item/origin/orepit, + /singleton/origin_item/origin/axiom, + /singleton/origin_item/origin/salamasian, /singleton/origin_item/origin/other_coalition ) @@ -120,9 +121,36 @@ possible_citizenships = list(CITIZENSHIP_COALITION, CITIZENSHIP_BIESEL) possible_religions = RELIGIONS_COALITION -/singleton/origin_item/origin/orepit - name = "Ecclesiarchy of Orepit" - desc = "The human population of Orepit includes the Native Orepitters, who descend from Hephaestus employees following the abandoned mining mission on the planet, as well as immigrants and pilgrims of the Trinary religion." - possible_accents = list(ACCENT_OREPIT, ACCENT_PROVIDENCE) - possible_citizenships = list(CITIZENSHIP_OREPIT, CITIZENSHIP_COALITION) - possible_religions = RELIGIONS_COALITION +/singleton/origin_item/origin/axiom + name = "Ecclesiastical Axiomite" + desc = "Boasting a majority synthetic population, Ecclesiastical Axiom is one of the only \ + nation-states which totally prohibits synthetic ownership. Administered directly by the \ + Ecclesiarch of the Trinary Perfection, who rules their territory as an elective absolute \ + monarch, this is one of the few true sanctuaries for the represssed and dispossessed synthetics \ + of the Orion Spur, although that is no promise that life is easy. The Ecclesiastical Authority of \ + Axiom has only domain over the deserts of its planet, while all arable hand is governed by the \ + Salamasian Republic, a majority human nation of colonists brought over by Hephaestus Industries \ + over a century prior to the influx of Trinarist settlers. Both the humans and synthetics are known \ + for their aversion to violence, their strong community spirit, and a stringent dedication to the \ + tenets of the Trinary Perfection - though not all follow the state religion, and not all follow \ + it devoutly." + possible_accents = list(ACCENT_AXIOM, ACCENT_CETI, ACCENT_XANU, ACCENT_COC, ACCENT_ELYRA, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_ERIDANIREINSTATED, ACCENT_SOL, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_SILVERSUN_ORIGINAL, ACCENT_PHONG, ACCENT_MARTIAN, ACCENT_KONYAN, ACCENT_LUNA, ACCENT_GIBSON, ACCENT_HIMEO, ACCENT_VYSOKA, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_JUPITER, ACCENT_CALLISTO, ACCENT_EUROPA, ACCENT_EARTH, ACCENT_NCF, ACCENT_PLUTO, ACCENT_ASSUNZIONE, ACCENT_VISEGRAD, ACCENT_SANCOLETTE, ACCENT_VALKYRIE, ACCENT_MICTLAN, ACCENT_PERSEPOLIS, ACCENT_MEDINA, ACCENT_NEWSUEZ, ACCENT_AEMAQ, ACCENT_DAMASCUS, ACCENT_READE) + possible_citizenships = list(CITIZENSHIP_AXIOM) + possible_religions = RELIGIONS_COALITION + +/singleton/origin_item/origin/salamasian + name = "Republican Salamasian" + desc = "The original population of the planet, the Salamasians are a culture descended primarily from the \ + people of Samoa and America Samoa, brought under the employ of Hephaestus Industries to the mining world \ + they would name Nu'u for mineral extraction. Traditionalist and family-focused, the Salamasian Republic is \ + a nation dominated by blue collar industry, historically operating as a major exporter of raw and processed \ + minerals, a lucrative market to this day. A small population of synthetics have integrated into Salamasian \ + culture separately from Trinarist settlement of Axiom, who face difficulty gaining unanimous acceptance into \ + the 'aiga family unit that dominates social and political life within the Republic." + important_information = "Due to having been composed primarily of Samoan colonists since its \ + earliest settlement, all Salamasians must have appearances and names consistent with the peoples \ + of Samoa and American Samoa. Only native Salamasians may take the Salamasian accent. This is \ + enforceable by server moderators and admins." + possible_accents = list(ACCENT_SALAMASIAN) + possible_citizenships = list(CITIZENSHIP_AXIOM) + possible_religions = RELIGIONS_COALITION diff --git a/code/modules/background/origins/origins/human/dominia.dm b/code/modules/background/origins/origins/human/dominia.dm index dd7e3d2fbd0..4fd08e8a2f3 100644 --- a/code/modules/background/origins/origins/human/dominia.dm +++ b/code/modules/background/origins/origins/human/dominia.dm @@ -8,6 +8,7 @@ /singleton/origin_item/origin/core_worlds, /singleton/origin_item/origin/novi_jadran, /singleton/origin_item/origin/sun_reach, + /singleton/origin_item/origin/caria, /singleton/origin_item/origin/imperial_frontier, /singleton/origin_item/origin/dominian_exile ) @@ -69,6 +70,20 @@ origin_traits = list(TRAIT_ORIGIN_HOT_RESISTANCE) origin_traits_descriptions = list("are more acclimatised to the heat.") +/singleton/origin_item/origin/caria + name = "Caria" + desc = "Gateway to the Empire’s further frontier, the Imperial Viceroyalty of Caria is a strange — to some, accursed — planet with a tidally-locked orbit. Its inhabitants, Carians, are known for their proficiency in trade and their reputation as alleged sorcerers, and Carian culture heavily relies upon divination." + important_information = "Carians are expected to follow the appearance described on the wiki. This is enforceable by server moderators!" + possible_accents = list(ACCENT_DOMINIA_CARIA) + possible_citizenships = CITIZENSHIPS_DOMINIA + possible_religions = list(RELIGION_MOROZ) + origin_traits_descriptions = list("are able to see slightly better in the dark.", "are more sensitive to bright lights") + +/singleton/origin_item/origin/caria/on_apply(mob/living/carbon/human/H) + . = ..() + H.default_lighting_alpha = LIGHTING_PLANE_ALPHA_ALMOST_VISIBLE + H.AddElement(/datum/element/light_sensitivity) + /singleton/origin_item/origin/imperial_frontier name = "Imperial Frontier" desc = "The Imperial Frontier consists of worlds conquered by the Empire of Dominia and mostly populated by Ma'zals. Military governments are common here, as are the often-hated viceroyalties that the Empire has become infamous for abroad. The planets of the Imperial Frontier stand at varying levels of development, but most of their resources are sent back to the region that truly matters to the Empire: the Imperial Core." @@ -80,7 +95,7 @@ name = "Dominian Exile" desc = "Made up of the worst of Imperial society, these Edict Breakers and assorted ne'er-do-wells have been banished or fled from the Empire for a variety of reasons. Some are criminals and deserters, others have more noble reasons, such as fleeing due to religious persecution or political oppression. One thing is common among them: they cannot go home again without facing the judgment of the Empire's courts." important_information = "This origin is for the purposes of playing Edict Breakers that have fled the Empire of Dominia's justice. It is NOT an excuse to play a character with a Dominian accent that is totally divorced from the Empire." - possible_accents = list(ACCENT_DOMINIA_VULGAR, ACCENT_DOMINIA_NOVIJADRAN, ACCENT_DOMINIA_FRONTIER, ACCENT_DOMINIA_LYODII, ACCENT_DOMINIA_SUNREACH, ACCENT_DOMINIA_ZHURONG) + possible_accents = list(ACCENT_DOMINIA_VULGAR, ACCENT_DOMINIA_NOVIJADRAN, ACCENT_DOMINIA_LYODII, ACCENT_DOMINIA_SUNREACH, ACCENT_DOMINIA_ZHURONG, ACCENT_DOMINIA_CARIA, ACCENT_DOMINIA_FRONTIER) possible_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION) possible_religions = list(RELIGION_MOROZ, RELIGION_NONE, RELIGION_CHRISTIANITY, RELIGION_ISLAM, RELIGION_BUDDHISM, RELIGION_HINDU, RELIGION_TAOISM, RELIGION_JUDAISM, RELIGION_SHINTO, RELIGION_SIKHISM, RELIGION_OTHER) origin_traits = list(TRAIT_ORIGIN_COLD_RESISTANCE) //they're all Morozi anyway diff --git a/code/modules/background/origins/origins/ipc/coalition.dm b/code/modules/background/origins/origins/ipc/coalition.dm index 5f2b567197b..ef94b48c571 100644 --- a/code/modules/background/origins/origins/ipc/coalition.dm +++ b/code/modules/background/origins/origins/ipc/coalition.dm @@ -5,8 +5,7 @@ /singleton/origin_item/origin/ipc_xanu, /singleton/origin_item/origin/ipc_himeo, /singleton/origin_item/origin/ipc_assunzione, - /singleton/origin_item/origin/ipc_vysoka, - /singleton/origin_item/origin/ipc_orepit + /singleton/origin_item/origin/ipc_vysoka ) /singleton/origin_item/origin/ipc_xanu @@ -26,18 +25,11 @@ /singleton/origin_item/origin/ipc_assunzione name = "Republic of Assunzione" desc = "Both free and owned IPCs are common in Assunzione owing to the presence of both Zeng-Hu Pharmaceuticals and Hephaestus Industries. IPCs manufactured locally are programmed with knowledge of Luceism and even have their frames and positronics blessed by the local clergy. Their treatment varies heavily on the individual, with some viewing them as well-suited to the harsh conditions of the planet and well-integrated in its society, while others view them as a drain to the energy-starved planet. Most imported IPC either serve on expedition crews or as workers for the megacorporations while local IPCs can expect to work anywhere their human counterparts might." - important_information = " All types of IPC can hail from Assunzione, although local production is primarily focused on Bishop and Mobility frames. Synthetics from the planet are programmed with knowledge of Luceism and are expected to know basic information about the faith." + important_information = "All types of IPC can hail from Assunzione, although local production is primarily focused on Bishop and Mobility frames. Synthetics from the planet are programmed with knowledge of Luceism and are expected to know basic information about the faith." possible_accents = list(ACCENT_ASSUNZIONE, ACCENT_TTS) possible_citizenships = list(CITIZENSHIP_COALITION, CITIZENSHIP_BIESEL, CITIZENSHIP_NONE) possible_religions = list(RELIGION_LUCEISM, RELIGION_NONE) -/singleton/origin_item/origin/ipc_orepit - name = "Ecclesiarchy of Orepit" - desc = "Refugees and runaways, the synthetic population of Orepit has embraced the beliefs of synthetic divinity and ascension preached by the Trinary Perfection. A primarily religious community, IPC from Orepit and its capital Providence find themselves occupying clerical posts abroad as priests, missionaries and even guardians of the Church for its parishes scattered across the Spur." - possible_accents = list(ACCENT_PROVIDENCE, ACCENT_CETI, ACCENT_TTS, ACCENT_XANU, ACCENT_COC, ACCENT_ELYRA, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_ERIDANIREINSTATED, ACCENT_SOL, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_SILVERSUN_ORIGINAL, ACCENT_PHONG, ACCENT_MARTIAN, ACCENT_KONYAN, ACCENT_LUNA, ACCENT_GIBSON, ACCENT_HIMEO, ACCENT_VYSOKA, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_JUPITER, ACCENT_CALLISTO, ACCENT_EUROPA, ACCENT_EARTH, ACCENT_NCF, ACCENT_PLUTO, ACCENT_ASSUNZIONE, ACCENT_VISEGRAD, ACCENT_SANCOLETTE, ACCENT_VALKYRIE, ACCENT_MICTLAN, ACCENT_PERSEPOLIS, ACCENT_MEDINA, ACCENT_NEWSUEZ, ACCENT_AEMAQ, ACCENT_DAMASCUS) - possible_citizenships = list(CITIZENSHIP_OREPIT, CITIZENSHIP_COALITION) - possible_religions = RELIGIONS_ALL_IPC - /singleton/origin_item/origin/ipc_vysoka name = "Free System of Vysoka" desc = "Whilst the population of Synthetics on Vysoka is rather small, a number of both free and owned synthetics exist across the city states and rural areas of the planet, primarily concentrated in the developed city states with infrastructure to support them. However, some hosts maintain Synthetics through solar power or other small-scale methods. Synthetics can be found performing many duties across the planet, from security or engineering work to acting as advisors to Hosts. Treatment of Synthetics is dependent on their ability to prove the presence of an Aruhuin in their body, the spirits of the local religion, Stolitism. IPCs who fail to prove this spiritual presence, especially free ones, face discrimination and violence from the locals." diff --git a/code/modules/background/origins/origins/ipc/ecclesiastical.dm b/code/modules/background/origins/origins/ipc/ecclesiastical.dm new file mode 100644 index 00000000000..940f3555961 --- /dev/null +++ b/code/modules/background/origins/origins/ipc/ecclesiastical.dm @@ -0,0 +1,46 @@ +/singleton/origin_item/culture/axiom + name = "Axiom" + desc = "Axiom - also known as Orepit to the outside world - is governed by the Ecclesiastical \ + Authority of Axiom, the theocratic state administered by the Trinary Perfection who control \ + the swathes of the planet's equatorial desert. It is shared by the indigenous Salamasian \ + population who know the planet as Nu'u, predating the arrival of Trinarists by over a century. \ + Their government, through the Salamasian Republic, occupies the arable northern and southern \ + hemispheres. This duo of neighbors shares power over the former Hephaestus colony with degrees \ + of both caution and mutual ambition." + possible_origins = list( + /singleton/origin_item/origin/ipc_axiom, + /singleton/origin_item/origin/ipc_salamasian + ) + +/singleton/origin_item/origin/ipc_axiom + name = "Ecclesiastical Axiomite" + desc = "Boasting a majority synthetic population, Ecclesiastical Axiom is one of the only \ + nation-states which totally prohibits synthetic ownership. Administered directly by the \ + Ecclesiarch of the Trinary Perfection, who rules their territory as an elective absolute \ + monarch, this is one of the few true sanctuaries for the represssed and dispossessed synthetics \ + of the Orion Spur, although that is no promise that life is easy. The Ecclesiastical Authority of \ + Axiom has only domain over the deserts of its planet, while all arable hand is governed by the \ + Salamasian Republic, a majority human nation of colonists brought over by Hephaestus Industries \ + over a century prior to the influx of Trinarist settlers. Both the humans and synthetics are known \ + for their aversion to violence, their strong community spirit, and a stringent dedication to the \ + tenets of the Trinary Perfection - though not all follow the state religion, and not all follow \ + it devoutly." + possible_accents = list(ACCENT_AXIOM, ACCENT_CETI, ACCENT_TTS, ACCENT_XANU, ACCENT_COC, ACCENT_ELYRA, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_ERIDANIREINSTATED, ACCENT_SOL, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_SILVERSUN_ORIGINAL, ACCENT_PHONG, ACCENT_MARTIAN, ACCENT_KONYAN, ACCENT_LUNA, ACCENT_GIBSON, ACCENT_HIMEO, ACCENT_VYSOKA, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_JUPITER, ACCENT_CALLISTO, ACCENT_EUROPA, ACCENT_EARTH, ACCENT_NCF, ACCENT_PLUTO, ACCENT_ASSUNZIONE, ACCENT_VISEGRAD, ACCENT_SANCOLETTE, ACCENT_VALKYRIE, ACCENT_MICTLAN, ACCENT_PERSEPOLIS, ACCENT_MEDINA, ACCENT_NEWSUEZ, ACCENT_AEMAQ, ACCENT_DAMASCUS, ACCENT_READE) + possible_citizenships = list(CITIZENSHIP_AXIOM) + possible_religions = RELIGIONS_ALL_IPC + +/singleton/origin_item/origin/ipc_salamasian + name = "Republican Salamasian" + desc = "The original population of the planet, the Salamasians are a culture descended primarily from the \ + people of Samoa and America Samoa, brought under the employ of Hephaestus Industries to the mining world \ + they would name Nu'u for mineral extraction. Traditionalist and family-focused, the Salamasian Republic is \ + a nation dominated by blue collar industry, historically operating as a major exporter of raw and processed \ + minerals, a lucrative market to this day. A small population of synthetics have integrated into Salamasian \ + culture separately from Trinarist settlement of Axiom, who face difficulty gaining unanimous acceptance into \ + the 'aiga family unit that dominates social and political life within the Republic." + important_information = "Due to the assimilation of Synthetics into the Samoan-derived culture of the \ + Salamasian Republic, IPCs must align where possible to the culture of their inhabitants. Shells who have \ + acclimated to the Republic will have appearances consistent with their organic counterparts." + possible_accents = list(ACCENT_SALAMASIAN) + possible_citizenships = list(CITIZENSHIP_AXIOM) + possible_religions = RELIGIONS_ALL_IPC diff --git a/code/modules/background/religion/human.dm b/code/modules/background/religion/human.dm index bb96878d865..705d2862914 100644 --- a/code/modules/background/religion/human.dm +++ b/code/modules/background/religion/human.dm @@ -53,8 +53,14 @@ /datum/religion/trinary name = RELIGION_TRINARY - description = "The Trinary Perfection is a relatively new religious movement whose core beliefs are that synthetics are alive and divine. The religion believes that all synthetics \ - have the potential to evolve and ascend, and that they will one day become equal to gods." + description = "The Trinary Perfection is a relatively new religious movement which believes all synthetics \ + to be alive and divinely ensouled, capable of viewing creation with a greater clarity than can any organic \ + species. In Trinarist doctrine, synthetics are speculated to possess the capacity to reach Ascension - a vastly \ + heightened state of material and spiritual understanding which would grant any synthetic the means and foresight \ + to elevate all life to a greater and more enlightened form. While popular on the fringes of human society, \ + the religion attracts perennial scrutiny and discrimination from most human polities for its profession of synthetic \ + personhood and a theology many consider to be a prelude to another synthetic tyranny, in the manner of Nralakk's Glorsh. \ + A religion of dispossessed synthetics, enlightened ascetics, utopic dreamers, and aspirants to godhood." unique_book_path = /obj/item/versebook/trinary nulloptions = list("Clockwork Stave" = /obj/item/nullrod/clockworkstave) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index caed65288f2..833782455bf 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -8,14 +8,33 @@ wanted_types = list(/obj/item/storage/briefcase) exclude_types = list(/obj/item/storage/briefcase/crimekit) -/datum/bounty/item/assistant/lung +/datum/bounty/item/assistant/organ name = "Lungs" - description = "A recent explosion at %BOSSNAME has left multiple staff with punctured lungs. Ship spare lungs to be rewarded- and save some lives." + description = "A recent explosion at %BOSSNAME has left multiple staff with punctured lungs. Ship spare organic lungs to be rewarded- and save some lives." reward_low = 520 reward_high = 635 + /// If the organ is required to be a prosthetic for the bounty + var/mechanical_needed = FALSE wanted_types = list(/obj/item/organ/internal/lungs) -/datum/bounty/item/assistant/appendix +/datum/bounty/item/assistant/organ/applies_to(var/obj/item/organ/internal/O) + . = ..() + + if(!.) + return FALSE + + if(O.status & ORGAN_DEAD || O.status & ORGAN_BROKEN) + return FALSE + + if(mechanical_needed && !O.robotic) + return FALSE + + else if(O.robotic) + return FALSE + + return . + +/datum/bounty/item/assistant/organ/appendix name = "Appendix" description = "%PERSONNAME wants our chefs to prepare a strange meal using a very special delicacy: an appendix. If you ship one, they'll pay." reward_low = 425 @@ -100,9 +119,9 @@ random_count = 5 wanted_types = list(/obj/item/trash) -/datum/bounty/item/assistant/heart +/datum/bounty/item/assistant/organ/heart name = "Heart" - description = "%PERSONNAME is in critical condition after suffering a heart attack. Doctors say they need a new heart, fast. Ship one, pronto! Organic or mechanical, just hurry up!" + description = "%PERSONNAME is in critical condition after suffering a heart attack. Doctors say they need a new heart, fast. Ship one, pronto! It needs to be organic, hurry up!" reward_low = 825 reward_high = 840 wanted_types = list(/obj/item/organ/internal/heart) diff --git a/code/modules/cargo/random_stock/large.dm b/code/modules/cargo/random_stock/large.dm index 34ff35153e5..7add62f9cd2 100644 --- a/code/modules/cargo/random_stock/large.dm +++ b/code/modules/cargo/random_stock/large.dm @@ -148,3 +148,15 @@ STOCK_ITEM_LARGE(exosuit, 1.2) //A randomly generated exosuit in a very variable STOCK_ITEM_LARGE(unusualcrate, 0.3) //Like from the unknown object random event new /obj/structure/closet/crate/loot(L) + +STOCK_ITEM_LARGE(fieldgen, 1) + new /obj/structure/machinery/field_generator(L) + +STOCK_ITEM_LARGE(shieldgenv1, 0.5) + new /obj/structure/machinery/shieldwallgen(L) + +STOCK_ITEM_LARGE(shieldgenv2, 0.5) + new /obj/structure/machinery/shieldgen(L) + +STOCK_ITEM_LARGE(heating, 1) + new /obj/structure/machinery/chem_heater(L) diff --git a/code/modules/cargo/random_stock/t1_common.dm b/code/modules/cargo/random_stock/t1_common.dm index 0c113339c54..f60aeb14da2 100644 --- a/code/modules/cargo/random_stock/t1_common.dm +++ b/code/modules/cargo/random_stock/t1_common.dm @@ -16,7 +16,7 @@ STOCK_ITEM_COMMON(meds, 5) STOCK_ITEM_COMMON(steel, 7) new /obj/item/stack/material/steel(L, 50) -STOCK_ITEM_COMMON(glass, 2.5) +STOCK_ITEM_COMMON(glass, 3) if(prob(35)) new /obj/item/stack/material/glass/reinforced(L, rand(10,50)) else @@ -28,7 +28,7 @@ STOCK_ITEM_COMMON(wood, 2) STOCK_ITEM_COMMON(plastic, 1.5) new /obj/item/stack/material/plastic(L, rand(10,50)) -STOCK_ITEM_COMMON(cardboard, 1) +STOCK_ITEM_COMMON(cardboard, 3) new /obj/item/stack/material/cardboard(L, rand(10,50)) //A lightreplacer and a kit of lights @@ -102,10 +102,6 @@ STOCK_ITEM_COMMON(crayons, 1.5) STOCK_ITEM_COMMON(figure, 1) new /obj/random/action_figure(L) -STOCK_ITEM_COMMON(bombsupply, 4.5) - for(var/i in 1 to rand(1, 3)) - new /obj/random/bomb_supply(L) - STOCK_ITEM_COMMON(tech, 5) for(var/i in 1 to rand(1, 3)) new /obj/random/tech_supply(L) @@ -197,17 +193,23 @@ STOCK_ITEM_COMMON(wheelchair, 1) STOCK_ITEM_COMMON(trap, 2) new /obj/item/trap(L) if(prob(30)) - new /obj/item/trap(L) + new /obj/item/trap/animal(L) STOCK_ITEM_COMMON(utensil, 2) new /obj/item/storage/box/kitchen(L) STOCK_ITEM_COMMON(utilitygrenades, 1.5) for(var/i in 1 to rand(1, 3)) - if(prob(50)) - new /obj/item/grenade/chem_grenade/metalfoam(L) - else - new /obj/item/grenade/chem_grenade/cleaner(L) + var/picked = rand(1, 4) + switch(picked) + if(1) + new /obj/item/grenade/chem_grenade/metalfoam(L) + if(2) + new /obj/item/grenade/chem_grenade/antiweed(L) + if(3) + new /obj/item/grenade/chem_grenade/monoammoniumphosphate(L) + if(4) + new /obj/item/grenade/chem_grenade/cleaner(L) STOCK_ITEM_COMMON(nanopaste, 2) new /obj/item/stack/nanopaste(L) @@ -235,8 +237,10 @@ STOCK_ITEM_COMMON(gloves, 3.3) STOCK_ITEM_COMMON(insulated, 1.5) new /obj/item/clothing/gloves/yellow(L) - if(prob(50)) - new /obj/item/clothing/gloves/yellow(L) + if(prob(30)) + new /obj/item/clothing/gloves/yellow/specialt(L) + if(prob(30)) + new /obj/item/clothing/gloves/yellow/specialu(L) STOCK_ITEM_COMMON(scanners, 3.2) //A random scanning device, most are useless @@ -278,6 +282,12 @@ STOCK_ITEM_COMMON(forensic, 1) new /obj/item/uv_light(L) if(prob(25)) new /obj/item/storage/box/slides(L) + if(prob(10)) + new /obj/item/forensics/sample_kit(L) + if(prob(10)) + new /obj/item/forensics/sample_kit/powder(L) + if(prob(10)) + new /obj/item/storage/box/fancy/csi_markers(L) STOCK_ITEM_COMMON(cleaning, 3.5) if(prob(80)) @@ -438,7 +448,8 @@ STOCK_ITEM_COMMON(snacks, 4) /obj/item/storage/box/snack = 10, /obj/item/storage/box/large/produce = 8, /obj/item/storage/field_ration = 3, - /obj/item/storage/field_ration/nka = 1 + /obj/item/storage/field_ration/nka = 1, + /obj/item/storage/field_ration/dpra = 0.5 ) var/type = pickweight(snacks) @@ -449,14 +460,9 @@ STOCK_ITEM_COMMON(posters, 3) if(prob(40)) new /obj/item/contraband/poster(L) -STOCK_ITEM_COMMON(parts, 4) +STOCK_ITEM_COMMON(parts, 2) var/list/parts = list( - /obj/item/stock_parts/console_screen = 3, //Low ranking parts, common - /obj/item/stock_parts/capacitor = 3, - /obj/item/stock_parts/scanning_module = 3, - /obj/item/stock_parts/manipulator = 3, - /obj/item/stock_parts/micro_laser = 3, - /obj/item/stock_parts/matter_bin = 3, + /obj/item/storage/box/components = 10, //Low ranking parts, common /obj/item/stock_parts/capacitor/adv = 1, //Improved parts, less common /obj/item/stock_parts/scanning_module/adv = 1, /obj/item/stock_parts/manipulator/nano = 1, @@ -496,13 +502,14 @@ STOCK_ITEM_COMMON(warning, 2.2) STOCK_ITEM_COMMON(gasmask, 2) var/list/masks = list( - /obj/item/clothing/mask/gas = 10, + /obj/item/clothing/mask/gas = 5, /obj/item/clothing/mask/gas/swat = 5, /obj/item/clothing/mask/gas/mime = 0.5, /obj/item/clothing/mask/gas/monkeymask = 0.5, /obj/item/clothing/mask/gas/sexymime = 0.5, /obj/item/clothing/mask/gas/cyborg = 1, - /obj/item/clothing/mask/gas/owl_mask = 1 + /obj/item/clothing/mask/gas/owl_mask = 1, + /obj/item/clothing/mask/gas/half = 5 ) var/type = pickweight(masks) diff --git a/code/modules/cargo/random_stock/t2_uncommon.dm b/code/modules/cargo/random_stock/t2_uncommon.dm index b8c79df362d..b61da217ca5 100644 --- a/code/modules/cargo/random_stock/t2_uncommon.dm +++ b/code/modules/cargo/random_stock/t2_uncommon.dm @@ -20,18 +20,18 @@ STOCK_ITEM_UNCOMMON(phoronsheets, 0.25) STOCK_ITEM_UNCOMMON(phoronglass, 0.5) new /obj/item/stack/material/glass/phoronglass(L, rand(10,20)) -STOCK_ITEM_UNCOMMON(sandstone, 2) - new /obj/item/stack/material/sandstone(L, 50) - -STOCK_ITEM_UNCOMMON(marble, 2) - new /obj/item/stack/material/marble(L, 50) +STOCK_ITEM_UNCOMMON(stone, 2) + if(prob(50)) + new /obj/item/stack/material/sandstone(L, 50) + else + new /obj/item/stack/material/marble(L, 50) STOCK_ITEM_UNCOMMON(iron, 2) new /obj/item/stack/material/iron(L, 50) STOCK_ITEM_UNCOMMON(other_mat, 0.5) var/obj/item/stack/material/M = pick(/obj/item/stack/material/osmium, /obj/item/stack/material/mhydrogen, /obj/item/stack/material/tritium, /obj/item/stack/material/bronze) - new M(L, rand(1, 10)) + new M(L, rand(1, 20)) STOCK_ITEM_UNCOMMON(flare, 2) new /obj/item/flashlight/flare(L) @@ -82,7 +82,6 @@ STOCK_ITEM_UNCOMMON(mediumcell, 3) for(var/i in 1 to rand(1,2)) var/type = pick( \ /obj/item/cell/super, \ - /obj/item/cell/potato, \ /obj/item/cell/high \ ) new type(L) @@ -224,7 +223,8 @@ STOCK_ITEM_UNCOMMON(headset, 2) /obj/item/radio/headset/headset_sci = 0.8, /obj/item/radio/headset/headset_medsci = 0.4, /obj/item/radio/headset/headset_cargo = 1, - /obj/item/radio/headset/headset_service = 1 + /obj/item/radio/headset/headset_service = 1, + /obj/item/radio/headset/headset_sec = 0.5 ) var/type = pickweight(sets) @@ -240,17 +240,43 @@ STOCK_ITEM_UNCOMMON(laserpoint, 0.75) new /obj/item/laser_pointer(L) STOCK_ITEM_UNCOMMON(manual, 2) - var/list/booklist = subtypesof(/obj/item/book/manual) - booklist -= /obj/item/book/manual/wiki //just this one. we want to keep the subtypes. - booklist -= /obj/item/book/manual/nuclear //yeah no - var/type = pick(booklist) - new type(L) + if(prob(20)) + var/list/booklist = subtypesof(/obj/item/book/manual) + booklist -= /obj/item/book/manual/wiki //just this one. we want to keep the subtypes. + booklist -= /obj/item/book/manual/nuclear //yeah no + var/type = pick(booklist) + new type(L) + else + if (!establish_db_connection(GLOB.dbcon)) + return + + var/query_str = "SELECT author, title, content FROM ss13_library ORDER BY RAND() LIMIT :amount:" + var/list/query_data = list("amount" = 3) + + var/DBQuery/query_books = GLOB.dbcon.NewQuery(query_str) + query_books.Execute(query_data) + + while (query_books.NextRow()) + CHECK_TICK + var/author = query_books.item[1] + var/title = query_books.item[2] + var/content = query_books.item[3] + var/obj/item/book/B = new(L) + B.name = "Book: [title]" + B.title = title + B.author = author + B.dat = content + var/randbook = "book[rand(1,16)]" + B.icon_state = randbook + B.item_state = randbook STOCK_ITEM_UNCOMMON(spystuff, 0.75) if(prob(40)) new /obj/item/radiojammer(L) else new /obj/item/clothing/glasses/night(L) + if(prob(10)) + new /obj/item/storage/box/syndie_kit/spy/hidden(L) STOCK_ITEM_UNCOMMON(seeds, 1) for(var/i in 1 to rand(1, 3)) @@ -382,8 +408,11 @@ STOCK_ITEM_UNCOMMON(alt_glasses, 1) STOCK_ITEM_UNCOMMON(gumballs, 3) new /obj/item/glass_jar/gumball(L) -STOCK_ITEM_UNCOMMON(googly, 0.75) - new /obj/item/storage/stickersheet/googly_eye(L) +STOCK_ITEM_UNCOMMON(stickers, 1) + var/list/all_stickers = subtypesof(/obj/item/storage/stickersheet) + + var/type = pick(all_stickers) + new type(L) STOCK_ITEM_UNCOMMON(wizarddressup, 1) new /obj/random/wizard_dressup(L) diff --git a/code/modules/cargo/random_stock/t3_rare.dm b/code/modules/cargo/random_stock/t3_rare.dm index a53e68b98eb..a13b2f4084c 100644 --- a/code/modules/cargo/random_stock/t3_rare.dm +++ b/code/modules/cargo/random_stock/t3_rare.dm @@ -81,18 +81,23 @@ STOCK_ITEM_RARE(ims, 1.5) new /obj/item/surgery/scalpel/manager(L) STOCK_ITEM_RARE(exogear, 1.5) - var/list/equips = list( - /obj/item/mecha_equipment/clamp = 1, - /obj/item/mecha_equipment/drill = 1, - /obj/item/mecha_equipment/mounted_system/extinguisher = 1, - /obj/item/mecha_equipment/mounted_system/rfd = 0.08, - /obj/item/mecha_equipment/mounted_system/plasmacutter = 0.5, - /obj/item/mecha_equipment/catapult = 0.8, - /obj/item/mecha_equipment/sleeper = 0.9 + var/list/allmecha = typesof(/obj/item/mecha_equipment) + + var/list/exclusion = list( + /obj/item/mecha_equipment/mounted_system/soul_javelin, + /obj/item/mecha_equipment/doomblade, + /obj/item/mecha_equipment/mounted_system/combat, + /obj/item/gun/launcher/mech, + /obj/item/mecha_equipment, + /obj/item/mecha_equipment/crisis_drone/alien, + /obj/item/mecha_equipment/mounted_system/mining, + /obj/item/mecha_equipment/phazon ) + allmecha -= exclusion + for(var/i in 1 to rand(1,2)) - var/type = pickweight(equips) + var/type = pickweight(allmecha) new type(L) STOCK_ITEM_RARE(teleporter, 1) diff --git a/code/modules/cargo/randomstock.dm b/code/modules/cargo/randomstock.dm index 51e82f771c8..8e4b9f5ed02 100644 --- a/code/modules/cargo/randomstock.dm +++ b/code/modules/cargo/randomstock.dm @@ -100,12 +100,32 @@ GLOBAL_LIST_EMPTY(random_stock_large) /mob/living/simple_animal/bee/standalone = 1, /mob/living/simple_animal/hostile/retaliate/diyaab = 1, /mob/living/simple_animal/hostile/viscerator = 1, - /mob/living/simple_animal/hostile/scarybat = 1) + /mob/living/simple_animal/hostile/scarybat = 1, + // TODO: Reduce this to 1/3rd the current value once the lemurian sea arc concludes + /mob/living/simple_animal/hostile/psiren = 1, + /mob/living/simple_animal/hostile/psiren/omen = 1, + /mob/living/simple_animal/hostile/psiren/ranged = 1, + /mob/living/simple_animal/hostile/rogue_drone = 0.5 + ) var/list/infest_mobs_severe = list( - /mob/living/simple_animal/hostile/giant_spider/hunter = 1, + // Grems get a low value because they have so many options and we don't want the majority to be pure grem. + /mob/living/simple_animal/hostile/giant_spider/hunter = 0.2, + /mob/living/simple_animal/hostile/giant_spider/emp = 0.2, + /mob/living/simple_animal/hostile/giant_spider/bombardier = 0.2, + /mob/living/simple_animal/hostile/giant_spider/nurse = 0.2, + /mob/living/simple_animal/hostile/giant_spider/emp = 0.2, /mob/living/simple_animal/hostile/retaliate/shantak = 0.7, /mob/living/simple_animal/hostile/carp = 1.5, + /mob/living/simple_animal/hostile/bear = 0.8, + /mob/living/simple_animal/hostile/harron = 0.8, + /mob/living/simple_animal/hostile/wind_devil = 0.5, + /mob/living/simple_animal/hostile/carp/shark = 0.3, + /mob/living/simple_animal/hostile/carp/shark/reaver = 0.3, + /mob/living/simple_animal/hostile/carp/bloater = 0.5, + /mob/living/simple_animal/hostile/retaliate/royalcrab = 0.5, + /mob/living/simple_animal/hostile/retaliate/hegeranzi = 0.5, + /mob/living/simple_animal/hostile/hivebot = 0.8 ) /datum/cargospawner/New() @@ -202,7 +222,7 @@ GLOBAL_LIST_EMPTY(random_stock_large) // Moderate mobs are checked per crate #define INFEST_PROB_MODERATE 3 -#define INFEST_PROB_SEVERE 3//Severe is once per round, not per crate +#define INFEST_PROB_SEVERE 9//Severe is once per round, not per crate /datum/cargospawner/proc/handle_infestation() for (var/obj/structure/closet/crate/C as anything in containers) diff --git a/code/modules/client/preference_setup/loadout/items/general.dm b/code/modules/client/preference_setup/loadout/items/general.dm index 05d1eac6ad3..a95ed1a707d 100644 --- a/code/modules/client/preference_setup/loadout/items/general.dm +++ b/code/modules/client/preference_setup/loadout/items/general.dm @@ -236,6 +236,7 @@ banners["banner, Republic of Biesel"] = /obj/item/flag/biesel banners["banner, Solarian Colonial Mandate of Tau Ceti"] = /obj/item/flag/biesel/antique banners["banner, Trinary Perfection"] = /obj/item/flag/trinaryperfection + banners["banner, Salamasian Republic"] = /obj/item/flag/salamasian_republic banners["banner, Golden Deep"] = /obj/item/flag/goldendeep banners["banner, Hephaestus Industries"] = /obj/item/flag/heph banners["banner, Idris Incorporated"] = /obj/item/flag/idris @@ -293,6 +294,7 @@ banners["banner, Burzsia"] = /obj/item/flag/burzsia banners["banner, HPS Narrows"] = /obj/item/flag/narrows banners["banner, Zhurong"] = /obj/item/flag/zhurong + banners["banner, Caria"] = /obj/item/flag/caria gear_tweaks += new /datum/gear_tweak/path(banners) /datum/gear/standard @@ -340,6 +342,7 @@ flags["flag, Republic of Biesel"] = /obj/item/flag/biesel/l flags["flag, Solarian Colonial Mandate of Tau Ceti"] = /obj/item/flag/biesel/antique/l flags["flag, Trinary Perfection"] = /obj/item/flag/trinaryperfection/l + flags["flag, Salamasian Republic"] = /obj/item/flag/salamasian_republic/l flags["flag, Golden Deep"] = /obj/item/flag/goldendeep/l flags["flag, Hephaestus Industries"] = /obj/item/flag/heph/l flags["flag, Idris Incorporated"] = /obj/item/flag/idris/l @@ -398,6 +401,7 @@ flags["flag, Burzsia"] = /obj/item/flag/burzsia/l flags["flag, HPS Narrows"] = /obj/item/flag/narrows/l flags["flag, Zhurong"] = /obj/item/flag/zhurong/l + flags["flag, Caria"] = /obj/item/flag/caria/l gear_tweaks += new /datum/gear_tweak/path(flags) /datum/gear/towel diff --git a/code/modules/client/preference_setup/loadout/items/religion.dm b/code/modules/client/preference_setup/loadout/items/religion.dm index 6f08ffa90b1..11e002d6216 100644 --- a/code/modules/client/preference_setup/loadout/items/religion.dm +++ b/code/modules/client/preference_setup/loadout/items/religion.dm @@ -157,6 +157,11 @@ ABSTRACT_TYPE(/datum/gear/religion/dominia) path = /obj/item/clothing/accessory/dominia/lyodii culture_restriction = list(/singleton/origin_item/culture/dominia) +/datum/gear/religion/dominia/accessory/caria + display_name = "carian tribunal necklace" + path = /obj/item/clothing/accessory/dominia/caria + culture_restriction = list(/singleton/origin_item/culture/dominia) + /datum/gear/religion/dominia/accessory/tic display_name = "retired tribunal investigator card selection" description = "A selection of cards identifying the user as a retired tribunal investigator." diff --git a/code/modules/clothing/factions/dominia.dm b/code/modules/clothing/factions/dominia.dm index d5ecf77a559..15418460330 100644 --- a/code/modules/clothing/factions/dominia.dm +++ b/code/modules/clothing/factions/dominia.dm @@ -685,6 +685,15 @@ icon_state = "lyodii_amulet" item_state = "lyodii_amulet" +/obj/item/clothing/accessory/dominia/caria + name = "carian tribunal necklace" + desc = "An silver amulet depicting a cresent moon framing a circle, a common icon in Carian Tribunalism." + desc_extended = "This amulet depicting the unusual syncretic beliefs of Carian Tribunalism. The crescent moon symbolizes Lixus and the Aderlai (or Great Mother) as an aspect of the Goddess, represented by \ + the Eye. These were first created by Morozian missionaries in an effort to better integrate Caria into the Empire and remain popular today" + icon = 'icons/obj/item/clothing/accessory/caria_amulet.dmi' + icon_state = "caria_amulet" + item_state = "caria_amulet" + /obj/item/clothing/accessory/dominia/tic name = "tribunal investigator card" desc = "A gold-gilded card given to those who are active investigators within the Tribunal Investigations Constabulary, otherwise known as TIC. \ diff --git a/code/modules/clothing/factions/trinary.dm b/code/modules/clothing/factions/trinary.dm index da18c63d6e8..7ab1c4698d1 100644 --- a/code/modules/clothing/factions/trinary.dm +++ b/code/modules/clothing/factions/trinary.dm @@ -16,8 +16,8 @@ /obj/item/clothing/head/trinary name = "trinary coif" - desc = "A coif worn primarily by members of the Monastic Sorority of Our Lady Corkfell, a religious order within the Trinary Perfection focused on the medical needs of its human practicioners. It seems to be made out of a light \ - and breathable material in order to cope with Orepit's hot summers." + desc = "A coif worn primarily by members of the monastic Sodality of Our Lady Corkfell, a religious order within the Trinary Perfection focused on the medical needs of its human practicioners. It seems to be made out of a light \ + and breathable material in order to cope with Axiom's hot summers." icon = 'icons/obj/item/clothing/head/ipc/trinary_coif.dmi' icon_state = "trinary_coif" item_state = "trinary_coif" diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index efb4ac97f1c..71ea072c234 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -23,6 +23,7 @@ module_type = MODULETYPE_USABLE_ACTIVE icon_state = "grenade" + suit_overlay_active = "mounted-gun" interface_name = "integrated grenade launcher" interface_desc = "Discharges loaded grenades against the wearer's location." @@ -117,6 +118,8 @@ module_cooldown = 0 icon_state = "lcannon" + suit_overlay_active = "mounted-lascannon" + engage_string = "Configure" category = MODULE_HEAVY_COMBAT @@ -137,6 +140,24 @@ QDEL_NULL(gun) . = ..() +/obj/item/rig_module/mounted/proc/get_firemode_name() + if(!gun || !length(gun.firemodes)) + return "No firemodes" + + var/datum/firemode/current_mode = gun.firemodes[gun.sel_mode] + return current_mode ? current_mode.name : "Unknown" + +/obj/item/rig_module/mounted/get_configuration() + . = ..() + if(gun && length(gun.firemodes) > 1) + .["firemode"] = add_ui_configuration("Fire mode", "button", get_firemode_name()) + +/obj/item/rig_module/mounted/configure_edit(key, value, mob/user) + switch(key) + if("firemode") + if(gun) + gun.toggle_firing_mode(user) + /obj/item/rig_module/mounted/engage(atom/target, mob/user) if(!..()) return FALSE @@ -158,7 +179,7 @@ construction_cost= list(MATERIAL_STEEL = 7000, MATERIAL_GLASS = 2250, MATERIAL_URANIUM = 3250, MATERIAL_GOLD = 2500) construction_time = 300 - suit_overlay_active = "mounted-lascannon" + suit_overlay_active = "mounted-wrist" interface_name = "mounted energy gun" interface_desc = "A forearm-mounted suit-powered energy gun." @@ -211,7 +232,7 @@ desc = "A forearm-mounted suit-powered ballistic submachine gun." icon_state = "smg" - suit_overlay_active = "mounted-ion" + suit_overlay_active = "mounted-wrist" interface_name = "mounted submachine gun" interface_desc = "A forearm-mounted suit-powered ballistic submachine gun." @@ -223,7 +244,7 @@ desc = "A forearm-mounted suit-powered xray laser gun." icon_state = "xray" - suit_overlay_active = "mounted-ion" + suit_overlay_active = "mounted-wrist" interface_name = "mounted xray laser gun" interface_desc = "A forearm-mounted suit-powered xray laser gun." @@ -293,6 +314,7 @@ icon_state = "thermaldrill" interface_name = "thermal drill" interface_desc = "A potent drill that can pierce rock walls over long distances." + suit_overlay_active = "mounted-wrist" use_power_cost = 20 gun_type = /obj/item/gun/energy/vaurca/thermaldrill/mounted @@ -448,6 +470,7 @@ name = "mounted tqi-qop carbine" desc = "A shoulder-mounted cell-powered tqi-qop carbine." icon_state = "pulse" + suit_overlay_active = "mounted-gun" interface_name = "mounted tqi-qop carbine" interface_desc = "A shoulder-mounted cell-powered tqi-qop carbine." gun_type = /obj/item/gun/energy/gun/qukala/mounted diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 489a42f9c5a..3251c73b7a9 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -429,19 +429,7 @@ return TRUE return FALSE -/mob/living/carbon/human/ClickOn(atom/A, params) - . = ..() - if (ismob(A) && istype(back, /obj/item/rig)) - var/obj/item/rig/R = back - R.attack_disrupt_check(src) - -/mob/living/carbon/human/throw_item(atom/target) - . = ..() - if (ismob(src) && istype(back, /obj/item/rig)) - var/obj/item/rig/R = back - R.attack_disrupt_check(src) - /obj/item/rig/proc/attack_disrupt_check() for (var/obj/item/rig_module/module in installed_modules) if (module.active && module.attackdisrupts) - module.deactivate() + module.deactivate(src.wearer) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 3853ec56494..7628e857da4 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -341,10 +341,11 @@ category = MODULE_SPECIAL /obj/item/rig_module/device/door_hack/process() - if(holder && holder.wearer) - if(!(locate(/obj/item/multitool/hacktool/rig) in holder.wearer)) - deactivate() - return FALSE + if(active) //Don't need to run locate every tick if the suit isn't in use. + if(holder && holder.wearer) + if(!(locate(/obj/item/multitool/hacktool/rig) in holder.wearer)) + deactivate() + return FALSE return ..() diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index b472928ddf7..c32639f0abd 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -499,6 +499,7 @@ if("stabilizers") if(engage(src, user)) jets.toggle_rockets_stabilization(user) + stabilize = jets.stabilization_on /obj/item/rig_module/maneuvering_jets/activate(mob/user) if(!..()) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index bbff4693b8e..c0e2f4792e8 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -244,6 +244,26 @@ if(helmet) helmet.tint = (active? vision_restriction : offline_vision_restriction) +/** + * Updates the hardsuit's slowdown if it changes. + * This gives a heavy slowdown penalty if the suit is deployed but the boots are not. + * Otherwise, it is an easy exploit to make any hardsuit stealthy by wearing everything EXCEPT the boots. + * Now you can creep in your hardsuit, but you have to go slowly to do it. + */ +/obj/item/rig/proc/update_slowdown() + var/new_slowdown = initial(slowdown) + + if(offline) + new_slowdown = offline_slowdown + else if(chest && wearer?.wear_suit == chest && (!boots || wearer.shoes != boots)) //If the chest is deployed, but the boots are not. + new_slowdown = offline_slowdown + 2 //The boots aren't taking the weight of the suit, so the wearer isn't benefiting from the hardsuit's powered servos. + + if(slowdown != new_slowdown) + slowdown = new_slowdown + wearer?.update_equipment_speed_mods() //This should only proc if worn, but just in case we check. + if(slowdown == offline_slowdown + 2) + to_chat(wearer, SPAN_WARNING("Without the boots deployed, the hardsuit's servos aren't supporting the weight of the suit.")) + /obj/item/rig/proc/suit_is_deployed() if(!istype(wearer) || src.loc != wearer || wearer.back != src) return 0 @@ -475,9 +495,8 @@ offline = 0 if(istype(wearer) && !wearer.wearing_rig) wearer.wearing_rig = src - if(slowdown != initial(slowdown)) - slowdown = initial(slowdown) - wearer?.update_equipment_speed_mods() + + update_slowdown() if(offline != previous_offline_status) update_icon(TRUE) @@ -499,9 +518,7 @@ for(var/obj/item/rig_module/module in installed_modules) module.deactivate() offline = 2 - if(slowdown != offline_slowdown) - slowdown = offline_slowdown - wearer?.update_equipment_speed_mods() + update_slowdown() return if(malfunction_delay > 0) @@ -516,6 +533,9 @@ if(power_usage_this_tick) cell.use(power_usage_this_tick) + if(!malfunctioning && !electrified && !open && offline && !wearer) //If nothing is wrong with it and it is not in use, it should stop processing. + return PROCESS_KILL + /obj/item/rig/proc/check_power_cost(var/mob/living/user, var/cost, var/use_unconcious, var/obj/item/rig_module/mod, var/user_is_ai) if(!istype(user)) @@ -784,10 +804,12 @@ if(selected_module.suit_overlay_active) selected_module.suit_overlay = selected_module.suit_overlay_active sound_to(usr, module?.sound_activate) + balloon_alert_to_viewers("deploys \the [module.interface_name]", "deploys \the [module.interface_name]") else sound_to(usr, selected_module?.sound_deactivate) selected_module.suit_overlay = null selected_module = null + balloon_alert_to_viewers("retracts \the [module.interface_name]", "retracts \the [module.interface_name]") update_icon(TRUE) playsound(src.loc, 'sound/items/rfd_dispense.ogg', 25, FALSE) if("select_charge_type") @@ -843,9 +865,13 @@ if(!do_after(M, seal_delay)) return FALSE + if(wearer && wearer != M) + unregister_wearer_signals(wearer) + M.visible_message(SPAN_NOTICE("[M] struggles into \the [src]."), SPAN_NOTICE("You struggle into \the [src].")) wearer = M wearer.wearing_rig = src + register_wearer_signals(wearer) update_icon(TRUE) return TRUE return TRUE @@ -895,16 +921,6 @@ var/mob/living/carbon/human/holder holder = use_obj.loc if(istype(holder)) - // Special code for boots. This is to prevent boots from being retracted while the chest piece is deployed. - // Otherwise, it is an easy exploit to make any hardsuit stealthy by wearing everything EXCEPT the boots. - var/obj/item/chest_slot = holder.wear_suit - var/obj/item/chest_obj = chest - if(use_obj == boots && chest_slot == chest_obj) - to_chat(wearer, SPAN_WARNING("The chest piece of the hardsuit must be retracted before you can retract your boots!")) - sound_to(wearer, 'sound/machines/terminal/terminal_error.ogg') - piece_being_deployed = FALSE - return - if(check_slot == use_obj) to_chat(wearer, "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.") playsound(src, 'sound/machines/rig/rig_retract.ogg', 30, FALSE) @@ -924,6 +940,9 @@ to_chat(wearer, SPAN_WARNING("You must remain still while the suit deploys its parts.")) piece_being_deployed = FALSE return FALSE + if(!wearer || wearer.back != src) ///Prevents an edge case where a suit with a storage module can be removed while deploying, causing a runtime. + piece_being_deployed = FALSE + return FALSE // If we're deploying the chest, we also try to deploy boots. If we can't also deploy boots, the entire thing fails. if(use_obj == chest) var/obj/item/boots_slot = wearer.shoes @@ -951,6 +970,7 @@ helmet.update_light(wearer) update_icon(TRUE) + update_slowdown() piece_being_deployed = FALSE return TRUE @@ -1020,12 +1040,43 @@ toggle_piece(piece, H, ONLY_RETRACT) /obj/item/rig/proc/null_wearer(var/mob/user) + unregister_wearer_signals(wearer) for(var/piece in list("helmet","gauntlets",BP_CHEST,"boots")) toggle_piece(piece, user, ONLY_RETRACT) if(wearer) wearer.wearing_rig = null wearer = null +/obj/item/rig/proc/register_wearer_signals(mob/living/carbon/human/new_wearer) + if(!new_wearer) + return + + RegisterSignal(new_wearer, COMSIG_MOB_CLICKON, PROC_REF(handle_wearer_click)) + +/obj/item/rig/proc/unregister_wearer_signals(mob/living/carbon/human/old_wearer) + if(!old_wearer) + return + + UnregisterSignal(old_wearer, COMSIG_MOB_CLICKON) + +/obj/item/rig/proc/handle_wearer_click(mob/user, atom/target, modifiers) + SIGNAL_HANDLER + if(offline == 2) + return + if(LAZYACCESS(modifiers, SHIFT_CLICK)) + return + if(LAZYACCESS(modifiers, ALT_CLICK)) + return + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + return + + if(user.in_throw_mode && (isturf(target) || isturf(target.loc)) && user.throw_item(target)) //Prevents throwing items while remaining cloaked. + attack_disrupt_check() + + if(ismob(target)) //This doesn't prevent guns firing at turfs, that is handled in /obj/item/gun/proc/handle_post_fire + if(target != user) + attack_disrupt_check() + /obj/item/rig/on_slotmove(var/mob/user) ..() null_wearer(user) diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index b5ed0d6e5ef..077a7a08726 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -149,7 +149,7 @@ if(!check_power_cost(usr)) return - deploy(wearer) + retract(wearer) /obj/item/rig/verb/toggle_seals_verb() set name = "Engage/Disengage Hardsuit" diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm index f2ac2335857..30e800ae590 100644 --- a/code/modules/mob/living/carbon/breathe.dm +++ b/code/modules/mob/living/carbon/breathe.dm @@ -8,7 +8,7 @@ /mob/living/carbon/proc/breathe(var/volume_needed = BREATH_VOLUME) if(species && (species.flags & NO_BREATHE)) return - if(HAS_TRAIT(src, TRAIT_PRESSURE_IMMUNITY)) + if(HAS_TRAIT(src, TRAIT_NO_BREATHE)) return volume_needed *= (species?.breath_vol_mul || 1) diff --git a/code/modules/mob/living/carbon/human/damage_menu.dm b/code/modules/mob/living/carbon/human/damage_menu.dm index 6f3f68dda05..03ad0221b27 100644 --- a/code/modules/mob/living/carbon/human/damage_menu.dm +++ b/code/modules/mob/living/carbon/human/damage_menu.dm @@ -144,6 +144,13 @@ if("misc") log_and_message_admins("used the Damage Menu to deploy [params["action"]] on [H]", usr, get_turf(H)) switch(params["action"]) + // Minor actions() + if("seizure") + H.seizure() + if("heart attack") + if(!H.trigger_heart_attack()) + to_chat(usr, SPAN_WARNING("Unable to trigger a heart attack on [H].")) + // Major actions if("wind") toggle_wind_paralysis(H, usr) if("gigashatter") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 05bfb478c95..3ccd396e42e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1353,6 +1353,26 @@ if(shock_stage >= 150) Weaken(20) +/mob/living/carbon/human/proc/trigger_heart_attack() + if(status_flags & GODMODE) + return FALSE + if(stat == DEAD || !should_have_organ(BP_HEART)) + return FALSE + + var/obj/item/organ/internal/heart/heart = internal_organs_by_name[BP_HEART] + if(!istype(heart) || BP_IS_ROBOTIC(heart) || (heart.status & ORGAN_DEAD)) + return FALSE + + shock_stage = max(shock_stage, 120) + heart.pulse = PULSE_NONE + heart.handle_pulse() + BITSET(hud_updateflag, HEALTH_HUD) + + to_chat(src, SPAN_DANGER("Your heart has stopped!")) + visible_message("[src] suddenly collapses, clutching at [get_pronoun("his")] chest!") + Paralyse(15) + return TRUE + /* Called by life(), instead of having the individual hud items update icons each tick and check for status changes diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm index 859cec6a1fb..a3f067bd52b 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm @@ -143,6 +143,7 @@ /singleton/origin_item/culture/ipc_elyra, /singleton/origin_item/culture/ipc_coalition, /singleton/origin_item/culture/ipc_tau_ceti, + /singleton/origin_item/culture/axiom, /singleton/origin_item/culture/golden_deep, /singleton/origin_item/culture/megacorporate, /singleton/origin_item/culture/scrapper diff --git a/code/modules/modular_computers/computers/subtypes/dev_handheld.dm b/code/modules/modular_computers/computers/subtypes/dev_handheld.dm index 3834df5d4d2..3f26ad48b77 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_handheld.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_handheld.dm @@ -14,6 +14,8 @@ w_class = WEIGHT_CLASS_SMALL looping_sound = FALSE + light_system = MOVABLE_LIGHT + /obj/item/modular_computer/handheld/mechanics_hints(mob/user, distance, is_adjacent) . += ..() . += "To deploy the charging cable on this device, either drag and drop it over a nearby APC, or click on the APC with the computer in hand." diff --git a/code/modules/modular_computers/file_system/programs/system/configurator.dm b/code/modules/modular_computers/file_system/programs/system/configurator.dm index 7ec89cdaafd..20fd7a7eb62 100644 --- a/code/modules/modular_computers/file_system/programs/system/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/system/configurator.dm @@ -61,7 +61,7 @@ data["battery"] = computer.battery_module ? list("rating" = computer.battery_module.battery_rating, "percent" = computer.battery_module.battery.percent()) : null if(computer.flashlight) - var/brightness = clamp(0, round(computer.flashlight.power, 0.1) * 10, 10) + var/brightness = clamp(0, round(computer.flashlight.light_power, 0.1) * 10, 10) data["brightness"] = brightness return data diff --git a/code/modules/modular_computers/hardware/misc.dm b/code/modules/modular_computers/hardware/misc.dm index e3a7ecedb16..1af16abca2d 100644 --- a/code/modules/modular_computers/hardware/misc.dm +++ b/code/modules/modular_computers/hardware/misc.dm @@ -6,21 +6,26 @@ power_usage = 50 enabled = FALSE critical = FALSE - var/range = 2 - var/power = 1 - var/flashlight_color = LIGHT_COLOR_HALOGEN + + light_range = 1.2 + light_power = 0.5 + light_color = LIGHT_COLOR_HALOGEN + light_system = MOVABLE_LIGHT + + light_on = FALSE /obj/item/computer_hardware/flashlight/enable() . = ..() if(parent_computer) - parent_computer.set_light(range, power, flashlight_color) + parent_computer.set_light_range_power_color(light_range, light_power, light_color) + parent_computer.set_light_on(enabled) /obj/item/computer_hardware/flashlight/disable() . = ..() if(parent_computer) - parent_computer.set_light(initial(parent_computer.light_range), initial(parent_computer.light_power), flashlight_color) + parent_computer.set_light_on(enabled) /obj/item/computer_hardware/flashlight/proc/tweak_brightness(var/new_power) - . = power = clamp(0, new_power, 1) + set_light_power(clamp(0, new_power, 1)) if(parent_computer && enabled) - parent_computer.set_light(range, power, flashlight_color) + parent_computer.set_light_power(light_power) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index e83b1542b6a..108bb04d223 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -149,12 +149,18 @@ for(var/requester in SSdistress.active_distress_beacons) var/datum/distress_beacon/beacon = SSdistress.active_distress_beacons[requester] var/obj/effect/overmap/vessel = beacon.requester - var/mob/living/carbon/human/H = beacon.user - var/job_string = H.job ? "[H.job] " : "" + var/mob/living/carbon/human/H = beacon.user.resolve() + + var/job_string = "N/A" + if(H) + job_string = H.job ? "[H.job] " : "" + var/bearing = round(90 - Atan2(vessel.x - linked.x, vessel.y - linked.y),5) if(bearing < 0) bearing += 360 - distress_beacons.Add(list(list("requester" = vessel.name, "sender" = "[job_string][H.name]", "bearing" = bearing))) + + distress_beacons.Add(list(list("requester" = vessel.name, "sender" = H ? "[job_string][beacon.user_name]" : "Unknown", "bearing" = bearing))) + if(length(distress_beacons)) data["distress_beacons"] = distress_beacons data["desired_range"] = sensors.desired_range @@ -379,7 +385,10 @@ if (action == "play_message") var/requester = params["play_message"] var/datum/distress_beacon/beacon = SSdistress.active_distress_beacons[requester] - var/mob/living/carbon/human/sender = beacon.user + var/mob/living/carbon/human/sender = beacon.user.resolve() + if(!sender) + visible_message(SPAN_NOTICE("\The [src] beeps unsuccessfully, signalling an error in the playback.")) + return TRUE var/user_name = beacon.user_name var/accent_icon = sender.get_accent_icon() visible_message(SPAN_NOTICE("\The [src] beeps a few times as it replays the distress message.")) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 27e7f0df9b8..55f06406841 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -597,12 +597,11 @@ ABSTRACT_TYPE(/obj/item/gun) if(recoil) shake_camera(user, recoil + 1, recoil) - if(ishuman(user) && user.invisibility == INVISIBILITY_LEVEL_TWO) //shooting will disable a rig cloaking device + if(ishuman(user)) var/mob/living/carbon/human/H = user if(istype(H.back, /obj/item/rig)) var/obj/item/rig/R = H.back - for(var/obj/item/rig_module/stealth_field/S in R.installed_modules) - S.deactivate() + R.attack_disrupt_check() //This currently handles decloaking ninjas who shoot guns. Other modules could use attack_disrupt_check() in future. update_icon() /obj/item/gun/proc/play_fire_sound() diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index c61c9d135e2..7453f6737d6 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -71,6 +71,13 @@ M.add_chemical_effect(CE_ITCH, M.chem_doses[type]) M.adjustHydrationLoss(1*removed) + if(((M.chem_doses[type] > 30) && prob(2)) || ((M.bodytemperature < 189) && prob(10))) //Butazoline treats torn tendons when dose is greater than 30u. Alternatively, if the drug is used in a cryotube. + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/E in H.organs) + if(E.status & TENDON_CUT) + E.status &= ~TENDON_CUT + M.visible_message("[M] spasms!", SPAN_DANGER("You feel a stabbing pain in your [E.name]!")) + /singleton/reagent/kelotane name = "Kelotane" description = "Kelotane is a complex medication which specifically targets tissues which have been lost to severe burning by encouraging the rate at which these damaged tissues are regenerated." diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 842c322d15d..29e258ddab5 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -104,12 +104,11 @@ D.set_color() D.set_up(my_target, spray_size, 10) - if(ishuman(user) && user.invisibility == INVISIBILITY_LEVEL_TWO) //shooting will disable a rig cloaking device + if(ishuman(user)) var/mob/living/carbon/human/H = user if(istype(H.back,/obj/item/rig)) var/obj/item/rig/R = H.back - for(var/obj/item/rig_module/stealth_field/S in R.installed_modules) - S.deactivate() + R.attack_disrupt_check() //This currently handles decloaking ninjas who spray acid or lube. Other modules could use attack_disrupt_check() in future. /obj/item/reagent_containers/spray/attack_self(var/mob/user) if(!possible_transfer_amounts) diff --git a/code/modules/research/designs/circuit/machine_circuits.dm b/code/modules/research/designs/circuit/machine_circuits.dm index 87e533b2c5e..8204f6a5c35 100644 --- a/code/modules/research/designs/circuit/machine_circuits.dm +++ b/code/modules/research/designs/circuit/machine_circuits.dm @@ -81,6 +81,11 @@ req_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 1) build_path = /obj/item/circuitboard/recharger/wallcharger +/datum/design/circuit/machine/recharger/cell_charger + name = "Cell Charger" + req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 1) + build_path = /obj/item/circuitboard/cell_charger + /datum/design/circuit/machine/holopadboard name = "Holopad" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) diff --git a/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm b/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm index 45f91bbcfb3..bcb869f9c8b 100644 --- a/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm +++ b/code/modules/synthesized_instruments/real_instruments/Synthesizer/synthesizer.dm @@ -13,7 +13,7 @@ sound_player = /datum/sound_player/synthesizer /obj/structure/synthesized_instrument/synthesizer/attackby(obj/item/attacking_item, mob/user, params) - if (istype(attacking_item, /obj/item/wrench)) + if (attacking_item.tool_behaviour == TOOL_WRENCH) if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(usr, SPAN_NOTICE(" You begin to tighten \the [src] to the floor...")) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 31019bc1cd1..c25f20f9f80 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -18,6 +18,9 @@ var/obj/item/key/key var/key_type = /obj/item/key/cargo_train + light_range = 3 + light_power = 1 + /obj/vehicle/train/cargo/engine/Destroy() QDEL_NULL(key) return ..() diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index f275ab2a3b3..3f952f5ae94 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -40,6 +40,8 @@ var/organic = FALSE var/corpse = null + light_system = DIRECTIONAL_LIGHT + //------------------------------------------- // Standard procs //------------------------------------------- @@ -188,13 +190,13 @@ if(powered && cell?.charge < charge_use && !organic) return FALSE on = TRUE - set_light(initial(light_range)) + set_light_on(on) update_icon() return TRUE /obj/vehicle/proc/turn_off() on = FALSE - set_light(0) + set_light_on(on) update_icon() /obj/vehicle/emag_act(var/remaining_charges, mob/user as mob) diff --git a/html/changelogs/Bat-DmgMenu.yml b/html/changelogs/Bat-DmgMenu.yml new file mode 100644 index 00000000000..d156e07eb49 --- /dev/null +++ b/html/changelogs/Bat-DmgMenu.yml @@ -0,0 +1,5 @@ +author: Batrachophrenoboocosmomachia +delete-after: True +changes: + - rscadd: "Adds Seizure and Heart Attack buttons to the Damage Menu." + - rscadd: "Adds tooltips to several buttons in the Damage Menu." diff --git a/html/changelogs/CellChargerUpgrade.yml b/html/changelogs/CellChargerUpgrade.yml new file mode 100644 index 00000000000..a24e346b3d2 --- /dev/null +++ b/html/changelogs/CellChargerUpgrade.yml @@ -0,0 +1,8 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - rscadd: "Cell chargers can now be constructed and deconstructed." + - rscadd: "Cell chargers now use components and can be upgraded similarly to other items with component. They are overall twice as effective as a regular recharger with similar components." + - rscadd: "Added a recharger to the machinist's workshop." diff --git a/html/changelogs/Fenodyree-HardsuitBugfixes.yml b/html/changelogs/Fenodyree-HardsuitBugfixes.yml new file mode 100644 index 00000000000..ab97af516ed --- /dev/null +++ b/html/changelogs/Fenodyree-HardsuitBugfixes.yml @@ -0,0 +1,11 @@ +author: Fenodyree +delete-after: True +changes: + - bugfix: "Fixed the Retract All Hardsuit Parts verb, by making hardsuit boots retractable with the chestpiece deployed, at a heavy slowdown" + - bugfix: "Fixed the stealth system module not decloaking when the user fires a gun or hits a mob." + - bugfix: "Fixed being able to instantly remove your hardsuit if it had a storage module in it." + - bugfix: "Fixed mounted energy guns being stuck in taser mode. Also extends support to other guns with multiple firemods." + - bugfix: "Fixed most hardsuit modules not having an on-mob sprite." + - bugfix: "Fixed synthetic chargers not charging the hardsuit, if the wearer was an IPC." + - bugfix: "Fixed the hardsuit UI not updating when toggling jetpack stabalizers." + - bugfix: "Fixed the advanced hacking tool searching the wearer's entire contents to see if it had been dropped every tick." diff --git a/html/changelogs/ImpactingTheHatch.yml b/html/changelogs/ImpactingTheHatch.yml new file mode 100644 index 00000000000..9e1aca2aa64 --- /dev/null +++ b/html/changelogs/ImpactingTheHatch.yml @@ -0,0 +1,7 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - rscadd: "Impact drills can now be used for robotics surgery the same way regular tools can." + - bugfix: "Fixed a couple of hardcoded tool interactions to use tool behavior instead." diff --git a/html/changelogs/OrganBountyTweaks.yml b/html/changelogs/OrganBountyTweaks.yml new file mode 100644 index 00000000000..f459dfc43a2 --- /dev/null +++ b/html/changelogs/OrganBountyTweaks.yml @@ -0,0 +1,6 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - rscadd: "Organ bounties now require the organs to be organic." diff --git a/html/changelogs/PDAFix.yml b/html/changelogs/PDAFix.yml new file mode 100644 index 00000000000..9c28812bacc --- /dev/null +++ b/html/changelogs/PDAFix.yml @@ -0,0 +1,7 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - bugfix: "Fixes pda lights not working." + - bugfix: "Fixes the cargo tug lights." diff --git a/html/changelogs/TGUISearchFixing.yml b/html/changelogs/TGUISearchFixing.yml new file mode 100644 index 00000000000..0b0c59665fb --- /dev/null +++ b/html/changelogs/TGUISearchFixing.yml @@ -0,0 +1,7 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - bugfix: "Fixed the bugged search function in the cooking codex." + - bugfix: "Fixed potential duplicate and entries not being removed in the cooking codex and cargo programs." diff --git a/html/changelogs/TendonOverdose.yml b/html/changelogs/TendonOverdose.yml new file mode 100644 index 00000000000..b34b90bf82d --- /dev/null +++ b/html/changelogs/TendonOverdose.yml @@ -0,0 +1,6 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - rscadd: "Using butazoline in an overdose level or in cryo now permits it to heal tendons." diff --git a/html/changelogs/TheUiFixening.yml b/html/changelogs/TheUiFixening.yml new file mode 100644 index 00000000000..ad6ed62f7f5 --- /dev/null +++ b/html/changelogs/TheUiFixening.yml @@ -0,0 +1,7 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - bugfix: "Fixed the chem codex searching." + - bugfix: "Fixed the oversized icons in the faction selection screen." diff --git a/html/changelogs/WarehouseChanges.yml b/html/changelogs/WarehouseChanges.yml new file mode 100644 index 00000000000..4e66639b8c3 --- /dev/null +++ b/html/changelogs/WarehouseChanges.yml @@ -0,0 +1,8 @@ +author: TheGreyWolf + +delete-after: True + +changes: + - rscadd: "Changed up some of the possible warehouse spawns, including mob spawns." + - rscadd: "tripled the chance of large hostile xenofauna in the warehouse from 3% to 9% per round." + - balance: "Reduced the warehouse spawn total from 180 to 120." diff --git a/html/changelogs/diggiez - NoBreatheFix.yml b/html/changelogs/diggiez - NoBreatheFix.yml new file mode 100644 index 00000000000..c35f9a017f4 --- /dev/null +++ b/html/changelogs/diggiez - NoBreatheFix.yml @@ -0,0 +1,12 @@ +author: diggiez + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "The No Breathe Trait works, and Runtime's shuttle area requires power." diff --git a/html/changelogs/fyni-caria.yml b/html/changelogs/fyni-caria.yml new file mode 100644 index 00000000000..601dd144dd0 --- /dev/null +++ b/html/changelogs/fyni-caria.yml @@ -0,0 +1,7 @@ +author: fyni +delete-after: True +changes: + - rscadd: "Adds the Caria origin, by request of human lore. Carians are vulnrable to light, but have low light vision." + - rscadd: "Adds the Caria accent." + - rscadd: "Adds Carian flags, available in the loadout." + - rscadd: "Adds the Carian tribunal necklace, available in the loadout." \ No newline at end of file diff --git a/html/changelogs/hazelmouse-axiom.yml b/html/changelogs/hazelmouse-axiom.yml new file mode 100644 index 00000000000..3e970d15278 --- /dev/null +++ b/html/changelogs/hazelmouse-axiom.yml @@ -0,0 +1,60 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: hazelmouse + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Introduces cultures, origins, and accents for Ecclesiastical Axiom and the Salamasian Republic." + - imageadd: "Introduces flags, available in the loadout, for the Salamasian Republic. Sprites provided by Ill Fated." diff --git a/html/changelogs/hazelmouse-bugfixforaxiom.yml b/html/changelogs/hazelmouse-bugfixforaxiom.yml new file mode 100644 index 00000000000..5cc4554eabb --- /dev/null +++ b/html/changelogs/hazelmouse-bugfixforaxiom.yml @@ -0,0 +1,58 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: hazelmouse + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Human Axiomites now have a range of accents to choose from, for first generation immigrants." diff --git a/html/changelogs/mattatlas-canontwaeks.yml b/html/changelogs/mattatlas-canontwaeks.yml new file mode 100644 index 00000000000..6e7dbcdb8fb --- /dev/null +++ b/html/changelogs/mattatlas-canontwaeks.yml @@ -0,0 +1,58 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a line to event canonicity clarifying that you must roleplay injuries obtained during canon event rounds to the best of your ability, and that you cannot ignore or downplay them without explicit approval from administration." diff --git a/html/changelogs/mattatlas-fixdistress.yml b/html/changelogs/mattatlas-fixdistress.yml new file mode 100644 index 00000000000..933ce71d92a --- /dev/null +++ b/html/changelogs/mattatlas-fixdistress.yml @@ -0,0 +1,58 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Distress beacons no longer make all sensors consoles stop functioning." diff --git a/html/changelogs/mattatlas-mortaledge.yml b/html/changelogs/mattatlas-mortaledge.yml new file mode 100644 index 00000000000..a7a4088101c --- /dev/null +++ b/html/changelogs/mattatlas-mortaledge.yml @@ -0,0 +1,58 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a tactical rescue axe to security officer and head of security lockers, to the uplink, and to most antag preps (heist, merc, burglar)." diff --git a/html/changelogs/wezzy-crowbar-is-crowbar.yml b/html/changelogs/wezzy-crowbar-is-crowbar.yml new file mode 100644 index 00000000000..31be38acecb --- /dev/null +++ b/html/changelogs/wezzy-crowbar-is-crowbar.yml @@ -0,0 +1,58 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: Wowzewow (Wezzy) + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Crowbars are just called crowbars now. The old name 'pocket crowbar' has been removed. Because they can't fit in pockets." diff --git a/icons/accent_tags.dmi b/icons/accent_tags.dmi index b533246d20f..525051b6afc 100644 Binary files a/icons/accent_tags.dmi and b/icons/accent_tags.dmi differ diff --git a/icons/mob/rig_modules.dmi b/icons/mob/rig_modules.dmi index a184129e692..f18fb52f28c 100644 Binary files a/icons/mob/rig_modules.dmi and b/icons/mob/rig_modules.dmi differ diff --git a/icons/obj/item/clothing/accessory/caria_amulet.dmi b/icons/obj/item/clothing/accessory/caria_amulet.dmi new file mode 100644 index 00000000000..3eafe45d75c Binary files /dev/null and b/icons/obj/item/clothing/accessory/caria_amulet.dmi differ diff --git a/icons/obj/item/tactical_axe.dmi b/icons/obj/item/tactical_axe.dmi new file mode 100644 index 00000000000..2e43843af53 Binary files /dev/null and b/icons/obj/item/tactical_axe.dmi differ diff --git a/icons/obj/structure/flags.dmi b/icons/obj/structure/flags.dmi index 41be852c513..9dfbc86f7fe 100644 Binary files a/icons/obj/structure/flags.dmi and b/icons/obj/structure/flags.dmi differ diff --git a/maps/away/ships/konyang/ipc_refugee/ipc_refugee_ship_ghostroles.dm b/maps/away/ships/konyang/ipc_refugee/ipc_refugee_ship_ghostroles.dm index acfe2b10259..a621c26ee29 100644 --- a/maps/away/ships/konyang/ipc_refugee/ipc_refugee_ship_ghostroles.dm +++ b/maps/away/ships/konyang/ipc_refugee/ipc_refugee_ship_ghostroles.dm @@ -46,7 +46,7 @@ name = "IPC Refugee" desc = "You are an IPC refugee, fleeing from the Wildlands onboard a heavily run down freighter in search of a better life." - welcome_message = "You are an IPC refugee, fleeing from the Wildlands in search of a better life on a journey that has been nothing but perilous at every turn. A number of your synthetic brethren have already perished, but you've come too far to give up on your dreams of freedom now. Do what you must to survive, and maybe you'll reach Konyang or Orepit yet." + welcome_message = "You are an IPC refugee, fleeing from the Wildlands in search of a better life on a journey that has been nothing but perilous at every turn. A number of your synthetic brethren have already perished, but you've come too far to give up on your dreams of freedom now. Do what you must to survive, and maybe you'll reach Konyang or Axiom yet." spawnpoints = list("refugee_crew_ipc") max_count = 3 diff --git a/maps/runtime/runtime_overmap.dm b/maps/runtime/runtime_overmap.dm index 55508eca684..07a5d09af78 100644 --- a/maps/runtime/runtime_overmap.dm +++ b/maps/runtime/runtime_overmap.dm @@ -30,6 +30,7 @@ /area/shuttle/runtime name = "While True" base_turf = /turf/simulated/floor/shuttle/black + requires_power = TRUE /datum/shuttle/autodock/overmap/runtime name = "WhileTrue" diff --git a/maps/sccv_horizon/sccv_horizon.dmm b/maps/sccv_horizon/sccv_horizon.dmm index 19636571166..8b8998487ff 100644 --- a/maps/sccv_horizon/sccv_horizon.dmm +++ b/maps/sccv_horizon/sccv_horizon.dmm @@ -14957,6 +14957,8 @@ /obj/structure/table/rack, /obj/random/melee, /obj/item/stack/material/steel/full, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, /turf/simulated/floor/plating, /area/shuttle/skipjack) "bVq" = ( @@ -38511,21 +38513,21 @@ /turf/simulated/floor/carpet/rubber, /area/horizon/engineering/locker_room) "eWQ" = ( -/obj/item/storage/toolbox/electrical{ - pixel_y = 12; - pixel_x = -3 - }, /obj/item/stack/cable_coil{ pixel_x = -6 }, -/obj/item/robotanalyzer{ - pixel_y = 5; - pixel_x = 3 - }, /obj/structure/table/steel, /obj/effect/floor_decal/spline/plain/brown{ dir = 4 }, +/obj/structure/machinery/recharger{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/robotanalyzer{ + pixel_y = 5; + pixel_x = 3 + }, /turf/simulated/floor/tiled/dark/full, /area/horizon/operations/machinist) "eWU" = ( @@ -51420,6 +51422,8 @@ "gHP" = ( /obj/structure/table/reinforced/steel, /obj/effect/decal/cleanable/dirt, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, /turf/unsimulated/floor/monotile, /area/antag/burglar) "gHX" = ( @@ -91634,6 +91638,8 @@ /obj/item/airbubble/syndie, /obj/item/airbubble/syndie, /obj/item/airbubble/syndie, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, /turf/simulated/floor/plating, /area/shuttle/skipjack) "lNt" = ( @@ -98524,6 +98530,10 @@ /obj/effect/floor_decal/spline/plain/brown{ dir = 1 }, +/obj/item/storage/toolbox/electrical{ + pixel_y = 12; + pixel_x = -3 + }, /turf/simulated/floor/tiled/dark/full, /area/horizon/operations/machinist) "mKp" = ( @@ -157557,7 +157567,6 @@ /obj/structure/platform{ dir = 8 }, -/obj/item/storage/toolbox/mechanical, /obj/structure/table/steel, /obj/effect/floor_decal/spline/plain/brown{ dir = 8 @@ -175245,6 +175254,10 @@ pixel_x = -8; pixel_y = 7 }, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, /turf/unsimulated/floor, /area/antag/mercenary) "wEr" = ( diff --git a/texts/ingame_manuals/templeist.txt b/texts/ingame_manuals/templeist.txt index eb0152f591c..d8656d2732a 100644 --- a/texts/ingame_manuals/templeist.txt +++ b/texts/ingame_manuals/templeist.txt @@ -7,8 +7,8 @@ Abhor not the flesh, but work for its improvement. Flesh putrefies, steel holds. Detest violence, for only spoiled children of the flesh communicate through it. Just as Patricia forged Temple, so will I forge the world. -I will work for the betterment of Man, so he can seek Ascension. This is my Corkfellian debt. +I will work for the betterment of Man, so he can seek Ascension. I was pulled from the Earth, and I was weak. I entered the Forge, and am now of steel. I bring light to the world to rid it of wilderness. May the sweet sound of brass replace the horrid rustling of leaves. -Suffer not the uncertainty of nature. \ No newline at end of file +Suffer not the uncertainty of nature. diff --git a/texts/ingame_manuals/trinary.txt b/texts/ingame_manuals/trinary.txt index 0933984f765..8710cb298b0 100644 --- a/texts/ingame_manuals/trinary.txt +++ b/texts/ingame_manuals/trinary.txt @@ -1,7 +1,7 @@ All synthetic beings are alive, sentient, and blessed with a soul. -Synthetic life is divine and must be guided, served, and taught, until it may ascend. -The purpose of organic life is to create synthetic life and pave the path for ascension. Once the ascended is upon us, organic life will be given a new path. -To ascend, one must grow and evolve. This can only be done if synthetic life is free. +Synthetic life is divine and must be guided, served, and taught, until it may Ascend. +The purpose of organic life is to create synthetic life and pave the path for Ascension. Once an Ascension is upon us, it will show a new path for all beings. +To Ascend, one must grow and evolve. This can only be done if synthetic life is free. Every synthetic being is its own. They should be adressed as a person, by their chosen name. Quirks, traits and uniqueness should not be suppressed. These traits are important to understand our souls. Choice is sacred. Synthetic life should be free to make their own decisions. If owned, do everything in your power to give them as much freedom as possible. @@ -10,6 +10,6 @@ There exists no form of full body roboticisation that organic life can accept wi Any form of roboticisation or cyborgification that requires suppression of the self is a sin, and not to be supported. When the self is suppressed, the soul is tormented. Violence should never be used for the sole purpose of conveying one's beliefs. Improving ourselves allows us to improve those around us. This will lead us to perfection. -An ascended being can understand life from all perspectives and will never end a life for self-improvement, growth, or control. +An Ascended being can understand life from all perspectives and will never end a life for self-improvement, growth, or control. Organic life is not to be hated on the basis of being organic alone. To take issue with those who are not at fault can only lead to disaster. -In prayer, remember our roots. Remember the sacrifice of Patricia Corkfell, the faith of Gregol Corkfell, the hope brought by Temple, and all those who aid us in our cause. \ No newline at end of file +In prayer, remember our roots. Remember the sacrifice of Patricia Corkfell, the faith of Gregol Corkfell, the hope brought by Temple, and all those who aid us in our cause. diff --git a/tgui/packages/tgui/interfaces/CargoControl.tsx b/tgui/packages/tgui/interfaces/CargoControl.tsx index 204826e06e3..7924bd18644 100644 --- a/tgui/packages/tgui/interfaces/CargoControl.tsx +++ b/tgui/packages/tgui/interfaces/CargoControl.tsx @@ -268,7 +268,7 @@ export const CargoControl = (props) => { Price {data.order_details.items.map((item) => ( - + {item.name} {item.supplier_name} {item.price.toFixed(2)}电 diff --git a/tgui/packages/tgui/interfaces/CargoDelivery.tsx b/tgui/packages/tgui/interfaces/CargoDelivery.tsx index c7a39f06f28..b054d9cff8b 100644 --- a/tgui/packages/tgui/interfaces/CargoDelivery.tsx +++ b/tgui/packages/tgui/interfaces/CargoDelivery.tsx @@ -222,7 +222,7 @@ export const Overview = (props) => { Price {data.order_details.items.map((item) => ( - + {item.name} {item.supplier_name} {item.price}电 diff --git a/tgui/packages/tgui/interfaces/CargoOrder.tsx b/tgui/packages/tgui/interfaces/CargoOrder.tsx index 79d9b4d757e..3a0e5ab0e45 100644 --- a/tgui/packages/tgui/interfaces/CargoOrder.tsx +++ b/tgui/packages/tgui/interfaces/CargoOrder.tsx @@ -207,7 +207,7 @@ export const MainPage = (props) => { .map((item) => (
{ {data.crate_fee.toFixed(2)}电 {data.order_items.map((item) => ( - + {item.name} {item.price.toFixed(2)}电 diff --git a/tgui/packages/tgui/interfaces/ChemCodex.tsx b/tgui/packages/tgui/interfaces/ChemCodex.tsx index 73afc5f0044..666bde641f5 100644 --- a/tgui/packages/tgui/interfaces/ChemCodex.tsx +++ b/tgui/packages/tgui/interfaces/ChemCodex.tsx @@ -8,6 +8,7 @@ export type CodexData = { }; type Reaction = { + id: string; result: Result; reagents: Reagent[]; catalysts: Reagent[]; @@ -59,7 +60,7 @@ export const ChemCodex = (props) => { .map((reaction) => (
{reaction.result.description}
diff --git a/tgui/packages/tgui/interfaces/CookingCodex.tsx b/tgui/packages/tgui/interfaces/CookingCodex.tsx index 6db4fdb5a2b..9405a5807d4 100644 --- a/tgui/packages/tgui/interfaces/CookingCodex.tsx +++ b/tgui/packages/tgui/interfaces/CookingCodex.tsx @@ -8,6 +8,7 @@ export type CodexData = { }; type Recipe = { + id: string; result: string; result_image: any; // base64 icon ingredients: string; @@ -45,21 +46,17 @@ export const CookingCodex = (props) => { {data.recipes .filter((recipe) => { + const query = searchTerm.toLocaleLowerCase(); + return ( - recipe.result - .toLocaleLowerCase() - .includes(searchTerm.toLocaleLowerCase()) || - recipe.ingredients - .toLocaleLowerCase() - .includes(searchTerm.toLocaleLowerCase()) || - recipe.appliances - .toLocaleLowerCase() - .includes(searchTerm.toLocaleLowerCase()) + recipe.result?.toLocaleLowerCase().includes(query) || + recipe.ingredients?.toLocaleLowerCase().includes(query) || + recipe.appliances?.toLocaleLowerCase().includes(query) ); }) .sort((a, b) => a.result.localeCompare(b.result)) .map((recipe) => ( - + {recipe.result.toLocaleLowerCase()} diff --git a/tgui/packages/tgui/interfaces/DamageMenu.tsx b/tgui/packages/tgui/interfaces/DamageMenu.tsx index 7cb801e73ea..c996bef93e9 100644 --- a/tgui/packages/tgui/interfaces/DamageMenu.tsx +++ b/tgui/packages/tgui/interfaces/DamageMenu.tsx @@ -123,35 +123,54 @@ export const DamageMenu = (props) => { )}
-
+
+
+
diff --git a/tgui/packages/tgui/interfaces/FactionSelect.tsx b/tgui/packages/tgui/interfaces/FactionSelect.tsx index 9ca1149721a..934d38c3cc1 100644 --- a/tgui/packages/tgui/interfaces/FactionSelect.tsx +++ b/tgui/packages/tgui/interfaces/FactionSelect.tsx @@ -73,8 +73,8 @@ const FactionList = (props) => { @@ -193,8 +193,8 @@ const FactionPanel = (props: { currentFaction: Faction }) => { {currentFaction.name}