diff --git a/code/__DEFINES/armor.dm b/code/__DEFINES/armor.dm index 409cdd38f6b..710c15c2b34 100644 --- a/code/__DEFINES/armor.dm +++ b/code/__DEFINES/armor.dm @@ -959,6 +959,12 @@ GLOBAL_LIST_INIT(armor_token_operation_legend, list( #define ARMOR_SLOWDOWN_REPA 1.2 +/* + * Refurbished Power Armor + * Basically driving a crappy car +*/ +#define ARMOR_SLOWDOWN_REPA 1.2 + /* * Power Armor * Basically driving a car diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 845a04e6aca..222788e61b8 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -81,13 +81,14 @@ SUBSYSTEM_DEF(atoms) var/batch_time = ((batch_end - batch_start) * 0.1) var/batch_rate = (this_batch / batch_time) var/batch_percent = (atoms_did / all_atoms) * 100 - var/batch_time_left = ((all_atoms - atoms_did) / batch_rate) portion++ next_milestone = round(all_atoms * (portion * portion_amount)) rates += batch_rate batch_start = REALTIMEOFDAY this_batch = 0 - to_chat(world, span_boldannounce("Init'd [shorten_number(atoms_did, 2)]/[shorten_number(all_atoms, 2)] ([round(batch_percent)]%) atoms in [DisplayTimeText(REALTIMEOFDAY - start_timery)]. \nProjected time left at [shorten_number(batch_rate, 1)]/sec: [DisplayTimeText(batch_time_left)]!")) + var/current_time = REALTIMEOFDAY - start_timery + var/batch_time_left = (current_time / atoms_did) * (all_atoms - atoms_did) + to_chat(world, span_boldannounce("Init'd [shorten_number(atoms_did, 2)]/[shorten_number(all_atoms, 2)] ([round(batch_percent)]%) atoms in [DisplayTimeText(current_time)]. \nProjected time left at [shorten_number(batch_rate, 1)]/sec: [DisplayTimeText(batch_time_left)]!")) #endif CHECK_TICK #ifdef PRINT_ATOM_STATS diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 4dd7c0c3e73..b8f5d7b0166 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -675,6 +675,31 @@ subcategory = CAT_SCAVENGING always_available = FALSE +/datum/crafting_recipe/repair_t45/hotrod + name = "Refurbished T-45b Hotrod Power Armor" + result = /obj/item/clothing/suit/armor/power_armor/t45b/hotrod + reqs = list(/obj/item/clothing/suit/armor/heavy/salvaged_pa/t45b/hotrod = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/crafting/electronicparts = 5, + /obj/item/stock_parts/manipulator/pico = 1, + /obj/item/stock_parts/cell/ammo/mfc = 1) + time = 35 + category = CAT_CRAFTING + subcategory = CAT_SCAVENGING + always_available = FALSE + +/datum/crafting_recipe/repair_t45_helm/hotrod + name = "Refurbished T-45b Hotrod Power Armor Helmet" + result = /obj/item/clothing/head/helmet/f13/power_armor/t45b/hotrod + reqs = list(/obj/item/clothing/head/helmet/f13/heavy/salvaged_pa/t45b/hotrod = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/crafting/electronicparts = 2) + time = 25 + category = CAT_CRAFTING + subcategory = CAT_SCAVENGING + always_available = FALSE + + /datum/crafting_recipe/teachboy name = "Refurbish Educational Pip-Boy 2000" result = /obj/item/pda/teachboy diff --git a/code/datums/martial/berserker.dm b/code/datums/martial/berserker.dm index be2b1ad31b9..e0c06e35828 100644 --- a/code/datums/martial/berserker.dm +++ b/code/datums/martial/berserker.dm @@ -1,6 +1,6 @@ #define HARD_PUNCH_COMBO "HH" #define SHOULDERCHECK_COMBO "HD" -#define CHOKE_SLAM_COMBO "HG" +#define WRIST_WRENCH_COMBO "DD" /datum/martial_art/berserker name = "Berserker Rites" @@ -18,9 +18,9 @@ streak = "" shoulderCheck(A,D) return TRUE - if(findtext(streak,CHOKE_SLAM_COMBO)) + if(findtext(streak,WRIST_WRENCH_COMBO)) streak = "" - chokeSlam(A,D) + wristWrench(A,D) return TRUE return FALSE @@ -65,28 +65,44 @@ return TRUE ///chokeslam: Harm Grab combo, knocks people down, deals stamina damage while they're on the floor -/datum/martial_art/berserker/proc/chokeSlam(mob/living/carbon/human/A, mob/living/carbon/human/D) - var/damage = damage_roll(A,D) - A.do_attack_animation(D, ATTACK_EFFECT_KICK) - var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_HEAD) - var/armor_block = D.run_armor_check(affecting, "melee") - playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - if((D.mobility_flags & MOBILITY_STAND)) - D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) - D.DefaultCombatKnockdown(10, null, TRUE) - D.apply_damage(damage + 20, STAMINA, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) //A cit specific change form the tg port to really punish anyone who tries to stand up - D.visible_message(span_warning("[A] grabs [D] by the throat, slamming them face first into the ground!"), \ - span_userdanger("[A] grabs you by the throat, slammed your head into the ground!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A) - to_chat(A, span_danger("You chokeslam [D]!")) - else - D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) - D.apply_damage(damage + 20, STAMINA, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) - D.drop_all_held_items() - D.visible_message(span_warning("[A] pummels [D]!"), \ - span_userdanger("You are kicked in the head by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A) - to_chat(A, span_danger("You pummel [D]!")) - log_combat(A, D, "chokeslammed (Berserker") - return TRUE +//datum/martial_art/berserker/proc/chokeSlam(mob/living/carbon/human/A, mob/living/carbon/human/D) + //var/damage = damage_roll(A,D) + //A.do_attack_animation(D, ATTACK_EFFECT_KICK) + //var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_HEAD) + //var/armor_block = D.run_armor_check(affecting, "melee") + //playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + //if((D.mobility_flags & MOBILITY_STAND)) + //D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) + //D.DefaultCombatKnockdown(10, null, TRUE) + //D.apply_damage(damage + 20, STAMINA, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) //A cit specific change form the tg port to really punish anyone who tries to stand up + //D.visible_message(span_warning("[A] grabs [D] by the throat, slamming them face first into the ground!"), + //span_userdanger("[A] grabs you by the throat, slammed your head into the ground!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A) + //to_chat(A, span_danger("You chokeslam [D]!")) + //else + //D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) + //D.apply_damage(damage + 20, STAMINA, BODY_ZONE_HEAD, armor_block, wound_bonus = CANT_WOUND) + //D.drop_all_held_items() + //D.visible_message(span_warning("[A] pummels [D]!"), + //span_userdanger("You are kicked in the head by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A) + //to_chat(A, span_danger("You pummel [D]!")) + //log_combat(A, D, "chokeslammed (Berserker") + //return TRUE + +/datum/martial_art/berserker/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D) + log_combat(A, D, "wrist wrenched (Berserker)") + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \ + "[A] grabs your wrist and violently wrenches it to the side!") + playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + D.emote("scream") + D.dropItemToGround(D.get_active_held_item()) + D.apply_damage(10, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + D.apply_damage(20, STAMINA, pick(A.zone_selected)) + to_chat(A, span_danger("You wrench [D]'s wrist!")) + log_combat(A, D, "wrist wrenched (Berserker)") + + return TRUE + /datum/martial_art/berserker/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("G",D) @@ -124,20 +140,24 @@ . = ..() if(!.) return - ADD_TRAIT(H, TRAIT_NOGUNS, BERSERKER_TRAIT) - ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, BERSERKER_TRAIT) - ADD_TRAIT(H, TRAIT_NODISMEMBER, BERSERKER_TRAIT) - ADD_TRAIT(H, TRAIT_BERSERKER, BERSERKER_TRAIT) + ADD_TRAIT(H, TRAIT_NODRUGS, TRAIT_BERSERKER) + ADD_TRAIT(H, TRAIT_NOGUNS, TRAIT_BERSERKER) + //ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, BERSERKER_TRAIT) + //ADD_TRAIT(H, TRAIT_NODISMEMBER, BERSERKER_TRAIT) + ADD_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, TRAIT_BERSERKER) + ADD_TRAIT(H, TRAIT_BERSERKER, TRAIT_BERSERKER) H.physiology.stamina_mod *= 0.3 //more stamina H.physiology.stun_mod *= 0.3 //better stun resistance /datum/martial_art/berserker/on_remove(mob/living/carbon/human/H) . = ..() - REMOVE_TRAIT(H, TRAIT_NOGUNS, BERSERKER_TRAIT) - REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, BERSERKER_TRAIT) - REMOVE_TRAIT(H, TRAIT_NODISMEMBER, BERSERKER_TRAIT) + REMOVE_TRAIT(H, TRAIT_NODRUGS, TRAIT_BERSERKER) + REMOVE_TRAIT(H, TRAIT_NOGUNS, TRAIT_BERSERKER) + //REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, BERSERKER_TRAIT) + //REMOVE_TRAIT(H, TRAIT_NODISMEMBER, BERSERKER_TRAIT) REMOVE_TRAIT(H, TRAIT_BERSERKER, BERSERKER_TRAIT) + REMOVE_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, TRAIT_BERSERKER) H.physiology.stamina_mod = initial(H.physiology.stamina_mod) H.physiology.stun_mod = initial(H.physiology.stun_mod) @@ -150,6 +170,6 @@ to_chat(usr, "Gutpunch: Harm Harm. Deal additional damage every second punch, with a chance for even more damage!") to_chat(usr, "Shoulder Check: Harm Disarm. Launch people brutally across rooms, and away from you.") - to_chat(usr, "Chokeslam: Harm Grab. Chokeslam to the floor. Against prone targets, deal additional stamina damage and disarm them.") + to_chat(usr, span_notice("Wrist Wrench: Disarm Disarm. Grab and painfully wrench someone's wrist, disarming them and dealing minor brute and stamina damage.")) to_chat(usr, span_notice("In addition, your body is better conditioned, giving you further stamina and increased stun resistance.")) - + //to_chat(usr, "Chokeslam: Harm Grab. Chokeslam to the floor. Against prone targets, deal additional stamina damage and disarm them.") diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index ea9d14e54a7..b0b36aad168 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -95,7 +95,10 @@ GLOBAL_LIST_INIT(pa_repair, list( /datum/crafting_recipe/repair_t45, /datum/crafting_recipe/repair_t45_helm, /datum/crafting_recipe/scrap_pa, - /datum/crafting_recipe/scrap_pa_helm)) + /datum/crafting_recipe/scrap_pa_helm, + /datum/crafting_recipe/repair_t45/hotrod, + /datum/crafting_recipe/repair_t45_helm/hotrod)) + GLOBAL_LIST_INIT(weapons_of_texarkana, list( /datum/crafting_recipe/policepistol, diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 96e3da62c3e..19f3878123b 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -393,6 +393,13 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "
  • Eject pAI Device
  • " dat += "" + if (cartridge) + if(cartridge.access & CART_RESIZE) + dat += "

    Experimental

    " + dat += "" + if (1) dat += "

    [PDAIMG(notes)] Notekeeper V2.2

    " dat += "Edit
    " diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 43bd2ce056d..91e7cb243e5 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -11,6 +11,7 @@ #define CART_QUARTERMASTER (1<<12) #define CART_HYDROPONICS (1<<13) #define CART_DRONEPHONE (1<<14) +#define CART_RESIZE (1<<15) /obj/item/cartridge @@ -192,6 +193,11 @@ ..() radio = new(src) +/obj/item/cartridge/resize + name = "\improper Experimental Nanite-Factory cartridge" + icon_state = "cart-mi" + access = CART_RESIZE + /obj/item/cartridge/proc/post_status(command, data1, data2) var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) @@ -599,6 +605,14 @@ Code: menu += "
    To use an emoji in a pda message, refer to the guide and add \":\" around the emoji. Your PDA supports the following emoji:
    " menu += emoji_table + if (50) + menu = "

    [PDAIMG(medical)] Nanite-Factory Experimental Size-Alteration Cartridge Menu

    " + menu += {" +
    /!\\ Warning! This cartridge is experimental! Use at your own risk! /!\\

    +Current Size: [usr.transform.a]

    +Activate Nanite Factory +"} + if (99) //Newscaster message permission error menu = "
    ERROR : NOT AUTHORIZED [host_pda.id ? "" : "- ID SLOT EMPTY"]
    " @@ -698,6 +712,28 @@ Code: host_pda.Topic(null,list("choice"=num2text(host_pda.mode))) playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) return + + if("Resize") + var/mob/living/U = usr + if(!istype(U, /mob/living/carbon/human)) + return + + if (usr.transform.a == U.transform.e) + var/current_size = U.transform.a + var/desired_size = input(usr, "Enter desired size in percent", "Choose Size", RESIZE_DEFAULT_SIZE * 100) as num + + if(!isnum(desired_size)) + desired_size = 100 + var/scaled_size = desired_size / 100 + var/size_max = CONFIG_GET(number/body_size_max) + var/size_min = CONFIG_GET(number/body_size_min) + var/size_to_use = clamp(scaled_size, size_min, size_max) + + U.resize = size_to_use / current_size + U.update_transform() + + playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + return //emoji previews if(href_list["emoji"]) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index f900eff5e90..50533ba303d 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -511,7 +511,7 @@ martial = /datum/martial_art/berserker name = "berserker's rites" martialname = "berserkers rites" - desc = "A paper scroll detailing the sacred rites of the berserker. It is against the law of the Legion for any not walking the path of the berserker to read this." + desc = "A paper scroll detailing the sacred rites of a tribal berserker, the words are awash with primal, barely contained fury." greet = span_sciradio("You have mastered the rites of the berserker. Use the help verb to see your combos.") icon = 'icons/obj/wizard.dmi' icon_state = "scroll2" diff --git a/code/game/objects/items/loadout_beacons.dm b/code/game/objects/items/loadout_beacons.dm index e5e3928e7f4..93f293eb382 100644 --- a/code/game/objects/items/loadout_beacons.dm +++ b/code/game/objects/items/loadout_beacons.dm @@ -2422,3 +2422,9 @@ GLOBAL_LIST_EMPTY(loadout_boxes) entry_flags = LOADOUT_FLAG_WASTER entry_class = LOADOUT_CAT_SHIELD spawn_thing = /obj/item/shield/coyote/riotweathered + +/datum/loadout_box/beserker + entry_tag = "Berserker's rites" + entry_flags = LOADOUT_FLAG_WASTER + entry_class = LOADOUT_CAT_MISC + spawn_thing = /obj/item/book/granter/martial/berserker diff --git a/code/modules/clothing/head/f13heavy_helmets.dm b/code/modules/clothing/head/f13heavy_helmets.dm index a3baeadb80d..c7142739e04 100644 --- a/code/modules/clothing/head/f13heavy_helmets.dm +++ b/code/modules/clothing/head/f13heavy_helmets.dm @@ -21,7 +21,16 @@ icon_state = "raiderpa_helm" item_state = "raiderpa_helm" armor = ARMOR_VALUE_SALVAGE + +/obj/item/clothing/head/helmet/f13/power_armor/t45b/hotrod + name = "Refurbished T-45b Hotrod helmet" + desc = "This power armor helmet was restored and modified to protect against flames and high intensity lasers at the cost of some protection against blunt trauma." + icon_state = "t45hotrod_helm" + item_state = "t45hotrod_helm" + armor = ARMOR_VALUE_SALVAGE + armor_tokens = list( ARMOR_MODIFIER_UP_FIRE_T3, ARMOR_MODIFIER_DOWN_MELEE_T2, ARMOR_MODIFIER_UP_LASER_T3,) slowdown = ARMOR_SLOWDOWN_REPA * ARMOR_SLOWDOWN_GLOBAL_MULT + /obj/item/clothing/head/helmet/f13/heavy/salvaged_pa/t45b/ncr name = "ncr salvaged T-45b helmet" desc = "It's an NCR salvaged T-45b power armor helmet, better repaired than regular salvaged PA, and decorated with the NCR flag and other markings for an NCR Heavy Trooper." @@ -92,3 +101,5 @@ item_state = "advanced" armor_tokens = list(ARMOR_MODIFIER_UP_MELEE_T3, ARMOR_MODIFIER_UP_BULLET_T3, ARMOR_MODIFIER_UP_LASER_T3) + + diff --git a/code/modules/clothing/suits/arfsuits.dm b/code/modules/clothing/suits/arfsuits.dm index a20394c5eff..aeb84e8a611 100644 --- a/code/modules/clothing/suits/arfsuits.dm +++ b/code/modules/clothing/suits/arfsuits.dm @@ -3465,6 +3465,17 @@ icon_state = "t51bpowerarmor_bos" item_state = "t51bpowerarmor_bos" +/obj/item/clothing/suit/armor/power_armor/t45b/hotrod + name = "Refurbished T-45b Hotrod power armor" + desc = "It's a set of T-45b power armor with a with some of its plating replaced by ablative, fire resistant armor. This set has exhaust pipes piped to the pauldrons, flames erupting from them." + icon_state = "t45hotrod" + item_state = "t45hotrod" + armor = ARMOR_VALUE_SALVAGE + slowdown = ARMOR_SLOWDOWN_REPA * ARMOR_SLOWDOWN_GLOBAL_MULT + salvaged_type = /obj/item/clothing/suit/armor/heavy/salvaged_pa/t45b/hotrod + armor_tokens = list(ARMOR_MODIFIER_UP_FIRE_T3, ARMOR_MODIFIER_DOWN_MELEE_T2, ARMOR_MODIFIER_UP_LASER_T3, ) + + /obj/item/clothing/suit/armor/power_armor/excavator name = "excavator power armor" desc = "Developed by Garrahan Mining Co. in collaboration with West Tek, the Excavator-class power armor was designed to protect miners from rockfalls and airborne contaminants while increasing the speed at which they could work. " diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index e2106284c72..cccf0f2e90e 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -371,6 +371,11 @@ ckeywhitelist = list("dameonowen") cost = 1 +/datum/gear/donator/kits/dameonowencart + name = "Experimental Nanite Factory Cartridge" + path = /obj/item/cartridge/resize + ckeywhitelist = list("dameonowen") + /datum/gear/donator/kits/darknova92 name = "Nikolatz BoS" path = /obj/item/storage/box/large/custom_kit/darknova92