From 43aa0f219f1515ca5370a23f30e06ec14f5a422d Mon Sep 17 00:00:00 2001 From: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> Date: Sat, 18 May 2024 11:39:28 -0400 Subject: [PATCH] Two New Skills (#26880) * sure * cough, girders are something * what if I said this --------- Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com> --- code/datums/components/crafting/crafting.dm | 11 +++++- code/datums/elements/loomable.dm | 7 +++- code/game/objects/items.dm | 11 ++++++ .../items/stacks/sheets/sheet_types.dm | 4 +- code/game/objects/items/stacks/stack.dm | 5 ++- code/game/objects/structures/girders.dm | 37 ++++++++++++------ .../ashwalkers/code/buildings/antfarm.dm | 9 ++++- .../ashwalkers/code/buildings/ash_farming.dm | 32 ++++++++++++++- .../ashwalkers/code/buildings/planttank.dm | 12 +++++- .../ashwalkers/code/buildings/wormfarm.dm | 15 +++++-- .../ashwalkers/code/items/ash_centrifuge.dm | 8 +++- .../ashwalkers/code/items/ash_seedmesh.dm | 13 ++++-- .../code/big_mortar.dm | 10 ++++- .../code/millstone.dm | 11 +++++- .../primitive_production/code/construction.dm | 18 +++++++++ .../primitive_production/code/primitive.dm | 18 +++++++++ .../primitive_production/icons/cloaks.dmi | Bin 1280 -> 1900 bytes .../primitive_production/icons/neck.dmi | Bin 1336 -> 2393 bytes tgstation.dme | 2 + 19 files changed, 190 insertions(+), 33 deletions(-) create mode 100644 modular_skyrat/modules/primitive_production/code/construction.dm create mode 100644 modular_skyrat/modules/primitive_production/code/primitive.dm diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 7a56f89c8e9..228a1918c98 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -242,7 +242,13 @@ return ", must be made on a tram!" //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item - if(ismob(crafter) && !do_after(crafter, recipe.time, target = crafter)) + //SKYRAT EDIT START: Two Skills (Construction) + var/mob/crafter_mob + var/skill_modifier = 1 + if(ismob(crafter)) + crafter_mob = crafter + skill_modifier = crafter_mob.mind.get_skill_modifier(/datum/skill/construction, SKILL_SPEED_MODIFIER) + if(!do_after(crafter, recipe.time * skill_modifier, target = crafter)) return "." contents = get_surroundings(crafter, recipe.blacklist) if(!check_contents(crafter, recipe, contents)) @@ -260,6 +266,9 @@ if(result.atom_storage && recipe.delete_contents) for(var/obj/item/thing in result) qdel(thing) + if(crafter_mob) + crafter_mob.mind.adjust_experience(/datum/skill/construction, 5) + //SKYRAT EDIT STOP: Construction Skill var/datum/reagents/holder = locate() in parts if(holder) //transfer reagents from ingredients to result if(!ispath(recipe.result, /obj/item/reagent_containers) && result.reagents) diff --git a/code/datums/elements/loomable.dm b/code/datums/elements/loomable.dm index 76ee071a9a2..d02b062f668 100644 --- a/code/datums/elements/loomable.dm +++ b/code/datums/elements/loomable.dm @@ -73,10 +73,11 @@ /datum/element/loomable/proc/loom_me(obj/item/source, mob/living/user, atom/target) //this allows us to count the amount of times it has successfully used the stack's required amount var/spawning_amount = 0 + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/production, SKILL_SPEED_MODIFIER) //SKYRAT EDIT if(isstack(source)) var/obj/item/stack/stack_we_use = source while(stack_we_use.amount >= required_amount) - if(!do_after(user, loom_time, target)) + if(!do_after(user, loom_time * skill_modifier, target)) //SKYRAT EDIT break if(!stack_we_use.use(required_amount)) @@ -84,14 +85,16 @@ break spawning_amount++ + user.mind.adjust_experience(/datum/skill/production, 5) //SKYRAT EDIT else - if(!do_after(user, loom_time, target)) + if(!do_after(user, loom_time * skill_modifier, target)) //SKYRAT EDIT user.balloon_alert(user, "interrupted!") return qdel(source) spawning_amount++ + user.mind.adjust_experience(/datum/skill/production, 5) //SKYRAT EDIT if(spawning_amount == 0) return diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 005c0af21c5..c04d82e8ef4 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1136,6 +1136,12 @@ if(user.mind.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_JOURNEYMAN && prob(user.mind.get_skill_modifier(/datum/skill/mining, SKILL_PROBS_MODIFIER))) // we check if the skill level is greater than Journeyman and then we check for the probality for that specific level. mineral_scan_pulse(get_turf(user), SKILL_LEVEL_JOURNEYMAN - 2, scanner = src) //SKILL_LEVEL_JOURNEYMAN = 3 So to get range of 1+ we have to subtract 2 from it,. + //SKYRAT EDIT START: Construction Skill + var/construction_tools = list(TOOL_CROWBAR, TOOL_MULTITOOL, TOOL_SCREWDRIVER, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER) + for(var/checking_behavior in construction_tools) + if(tool_behaviour == checking_behavior && user.mind) + skill_modifier = user.mind.get_skill_modifier(/datum/skill/construction, SKILL_SPEED_MODIFIER) + //SKYRAT EDIT STOP: Construction Skill delay *= toolspeed * skill_modifier // Play tool sound at the beginning of tool usage. @@ -1161,6 +1167,11 @@ if(delay >= MIN_TOOL_SOUND_DELAY) play_tool_sound(target, volume) + //SKYRAT EDIT START: Construction Skill + for(var/checking_behavior in construction_tools) + if(tool_behaviour == checking_behavior && user.mind) + user.mind.adjust_experience(/datum/skill/construction, 2) + //SKYRAT EDIT STOP: Construction Skill return TRUE /// Called before [obj/item/proc/use_tool] if there is a delay, or by [obj/item/proc/use_tool] if there isn't. Only ever used by welding tools and stacks, so it's not added on any other [obj/item/proc/use_tool] checks. diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 2fe8bd687cf..d462bf33c00 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -237,7 +237,8 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ if(get_amount() < 2) user.balloon_alert(user, "not enough material!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!do_after(user, 4 SECONDS, build_on)) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/construction, SKILL_SPEED_MODIFIER) //SKYRAT EDIT: Construction Skill + if(!do_after(user, 4 SECONDS * skill_modifier, build_on)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(build_on.is_blocked_turf()) user.balloon_alert(user, "something is blocking the tile!") @@ -246,6 +247,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ user.balloon_alert(user, "not enough material!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN new/obj/structure/girder/displaced(build_on) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT: Construction Skill return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return SECONDARY_ATTACK_CONTINUE_CHAIN diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 4258465f3a0..ebcff33b546 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -400,7 +400,8 @@ adjusted_time = (recipe.time * recipe.trait_modifier) else adjusted_time = recipe.time - if(!do_after(builder, adjusted_time, target = builder)) + var/skill_modifier = builder.mind.get_skill_modifier(/datum/skill/construction, SKILL_SPEED_MODIFIER) //SKYRAT EDIT: Construction Skill + if(!do_after(builder, adjusted_time * skill_modifier, target = builder)) builder.balloon_alert(builder, "interrupted!") return if(!building_checks(builder, recipe, multiplier)) @@ -428,6 +429,8 @@ created.setDir(builder.dir) on_item_crafted(builder, created) + builder.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT: Construction Skill + // Use up the material use(recipe.req_amount * multiplier) builder.investigate_log("crafted [recipe.title]", INVESTIGATE_CRAFTING) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a1cb0f82696..c9804fab0f8 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -39,6 +39,7 @@ . += span_notice("[src] is designed for tram usage. Deconstructed with a screwdriver!") /obj/structure/girder/attackby(obj/item/W, mob/user, params) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/construction, SKILL_SPEED_MODIFIER) //SKYRAT EDIT var/platingmodifier = 1 if(HAS_TRAIT(user, TRAIT_QUICK_BUILD)) platingmodifier = 0.7 @@ -81,11 +82,12 @@ balloon_alert(user, "need [amount] rods!") return balloon_alert(user, "concealing entrance...") - if(do_after(user, 2 SECONDS, target = src)) + if(do_after(user, 2 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(rod.get_amount() < amount) return rod.use(amount) var/obj/structure/falsewall/iron/FW = new (loc) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(FW) qdel(src) return @@ -94,12 +96,13 @@ balloon_alert(user, "need [amount] rods!") return balloon_alert(user, "adding plating...") - if(do_after(user, 4 SECONDS, target = src)) + if(do_after(user, 4 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(rod.get_amount() < amount) return rod.use(amount) var/turf/T = get_turf(src) T.place_on_top(/turf/closed/wall/mineral/iron) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(T) qdel(src) return @@ -115,11 +118,12 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "concealing entrance...") - if(do_after(user, 20*platingmodifier, target = src)) + if(do_after(user, 20 * platingmodifier * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/obj/structure/falsewall/F = new (loc) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(F) qdel(src) return @@ -131,11 +135,12 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "adding plating...") - if (do_after(user, 4 SECONDS, target = src)) + if (do_after(user, 4 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/obj/structure/tram/alt/iron/tram_wall = new(loc) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(tram_wall) qdel(src) return @@ -144,12 +149,13 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "adding plating...") - if (do_after(user, 40*platingmodifier, target = src)) + if (do_after(user, 40 * platingmodifier * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/turf/T = get_turf(src) T.place_on_top(/turf/closed/wall) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(T) qdel(src) return @@ -160,11 +166,12 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "adding panel...") - if (do_after(user, 2 SECONDS, target = src)) + if (do_after(user, 2 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/obj/structure/tram/tram_wall = new(loc) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(tram_wall) qdel(src) return @@ -176,11 +183,12 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "concealing entrance...") - if(do_after(user, 2 SECONDS, target = src)) + if(do_after(user, 2 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/obj/structure/falsewall/reinforced/FW = new (loc) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(FW) qdel(src) return @@ -189,12 +197,13 @@ if(sheets.get_amount() < amount) return balloon_alert(user, "adding plating...") - if(do_after(user, 50*platingmodifier, target = src)) + if(do_after(user, 50 * platingmodifier * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/turf/T = get_turf(src) T.place_on_top(/turf/closed/wall/r_wall) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(T) qdel(src) return @@ -203,11 +212,12 @@ if(sheets.get_amount() < amount) return balloon_alert(user, "reinforcing frame...") - if(do_after(user, 60*platingmodifier, target = src)) + if(do_after(user, 60 * platingmodifier * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/obj/structure/girder/reinforced/R = new (loc) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT transfer_fingerprints_to(R) qdel(src) return @@ -227,11 +237,12 @@ balloon_alert(user, "need titanium glass or mineral!") return balloon_alert(user, "adding plating...") - if (do_after(user, 4 SECONDS, target = src)) + if (do_after(user, 4 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return var/obj/structure/tram/tram_wall tram_wall = new tram_wall_type(loc) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT sheets.use(amount) transfer_fingerprints_to(tram_wall) qdel(src) @@ -242,11 +253,12 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "concealing entrance...") - if(do_after(user, 2 SECONDS, target = src)) + if(do_after(user, 2 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/obj/structure/falsewall/falsewall + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT if(falsewall_type) falsewall = new falsewall_type (loc) else @@ -264,11 +276,12 @@ balloon_alert(user, "need [amount] sheets!") return balloon_alert(user, "adding plating...") - if (do_after(user, 4 SECONDS, target = src)) + if (do_after(user, 4 SECONDS * skill_modifier, target = src)) //SKYRAT EDIT if(sheets.get_amount() < amount) return sheets.use(amount) var/turf/T = get_turf(src) + user.mind.adjust_experience(/datum/skill/construction, 5) //SKYRAT EDIT if(sheets.walltype) T.place_on_top(sheets.walltype) else diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm b/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm index c5f2e645c95..3726fb2cedf 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm @@ -72,17 +72,24 @@ if(istype(attacking_item, /obj/item/food)) qdel(attacking_item) balloon_alert(user, "food has been placed") + user.mind.adjust_experience(/datum/skill/primitive, 5) ant_chance++ + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + ant_chance++ return if(istype(attacking_item, /obj/item/storage/bag/plants)) balloon_alert(user, "feeding the ants") + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) for(var/obj/item/food/selected_food in attacking_item.contents) - if(!do_after(user, 1 SECONDS, src)) + if(!do_after(user, 1 SECONDS * skill_modifier, src)) return qdel(selected_food) + user.mind.adjust_experience(/datum/skill/primitive, 5) ant_chance++ + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + ant_chance++ return diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm b/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm index 90cd456f160..ddd3f209358 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/ash_farming.dm @@ -40,6 +40,7 @@ return locate_farm = new(get_turf(atom_parent)) + user.mind.adjust_experience(/datum/skill/primitive, 5) locate_farm.pixel_x = pixel_shift[1] locate_farm.pixel_y = pixel_shift[2] locate_farm.layer = atom_parent.layer + 0.1 @@ -151,6 +152,7 @@ COOLDOWN_START(src, harvest_timer, harvest_cooldown) create_harvest() + user.mind.adjust_experience(/datum/skill/primitive, 5) update_appearance() return ..() @@ -170,6 +172,7 @@ return decrease_cooldown(user) + user.mind.adjust_experience(/datum/skill/primitive, 5) return //if its goliath hide, increase the amount dropped @@ -180,12 +183,17 @@ return increase_yield(user) + user.mind.adjust_experience(/datum/skill/primitive, 5) return else if(istype(attacking_item, /obj/item/stack/worm_fertilizer)) var/obj/item/stack/attacking_stack = attacking_item + if(!allow_yield_increase() && !allow_decrease_cooldown()) + balloon_alert(user, "plant is already fully upgraded") + return + if(!attacking_stack.use(1)) balloon_alert(user, "unable to use [attacking_item]") return @@ -195,6 +203,7 @@ else balloon_alert(user, "plant was upgraded") + user.mind.adjust_experience(/datum/skill/primitive, 5) return @@ -204,16 +213,26 @@ COOLDOWN_START(src, harvest_timer, harvest_cooldown) create_harvest(attacking_item, user) + user.mind.adjust_experience(/datum/skill/primitive, 5) update_appearance() return return ..() +/** + * a proc that will check if we can increase the yield-- without increasing it + */ +/obj/structure/simple_farm/proc/allow_yield_increase() + if(max_harvest >= 6) + return FALSE + + return TRUE + /** * a proc that will increase the amount of items the crop could produce (at a maximum of 6, from base of 3) */ /obj/structure/simple_farm/proc/increase_yield(mob/user, var/silent = FALSE) - if(max_harvest >= 6) + if(!allow_yield_increase()) if(!silent) balloon_alert(user, "plant is at maximum yield") @@ -226,11 +245,20 @@ return TRUE +/** + * a proc that will check if we can decrease the time-- without increasing it + */ +/obj/structure/simple_farm/proc/allow_decrease_cooldown() + if(harvest_cooldown <= 30 SECONDS) + return FALSE + + return TRUE + /** * a proc that will decrease the amount of time it takes to be ready for harvest (at a maximum of 30 seconds, from a base of 1 minute) */ /obj/structure/simple_farm/proc/decrease_cooldown(mob/user, var/silent = FALSE) - if(harvest_cooldown <= 30 SECONDS) + if(!allow_decrease_cooldown()) if(!silent) balloon_alert(user, "already at maximum growth speed!") diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm b/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm index de9bb608a50..38711823411 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/planttank.dm @@ -35,15 +35,26 @@ qdel(attacking_item) balloon_alert(user, "[attacking_item] placed inside") + user.mind.adjust_experience(/datum/skill/primitive, 5) operation_number += 2 + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + operation_number += 2 + return if(istype(attacking_item, /obj/item/storage/bag/plants)) balloon_alert(user, "placing food inside") + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) for(var/obj/item/food/selected_food in attacking_item.contents) + if(!do_after(user, 1 SECONDS * skill_modifier, src)) + return + qdel(selected_food) operation_number += 2 + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + operation_number += 2 + user.mind.adjust_experience(/datum/skill/primitive, 5) return if(istype(attacking_item, /obj/item/stack/ore/glass)) @@ -82,7 +93,6 @@ var/proportion = src_mixture.gases[/datum/gas/carbon_dioxide][MOLES] if(proportion) //if there is carbon dioxide in the air, lets turn it into oxygen - proportion = min(src_mixture.gases[/datum/gas/carbon_dioxide][MOLES], MOLES_CELLSTANDARD) src_mixture.gases[/datum/gas/carbon_dioxide][MOLES] -= proportion src_mixture.gases[/datum/gas/oxygen][MOLES] += proportion diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/wormfarm.dm b/modular_skyrat/modules/ashwalkers/code/buildings/wormfarm.dm index 8046a7b4fd0..a9aef487c28 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/wormfarm.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/wormfarm.dm @@ -53,7 +53,8 @@ return ..() balloon_alert(user, "digging up worms") - if(!do_after(user, 2 SECONDS, src)) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) + if(!do_after(user, 2 SECONDS * skill_modifier, src)) balloon_alert(user, "stopped digging") in_use = FALSE return ..() @@ -89,7 +90,8 @@ in_use = TRUE balloon_alert(user, "feeding the worms") - if(!do_after(user, 1 SECONDS, src)) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) + if(!do_after(user, 1 SECONDS * skill_modifier, src)) balloon_alert(user, "stopped feeding the worms") in_use = FALSE return @@ -103,7 +105,10 @@ balloon_alert(user, "feeding complete, check back later") current_food++ + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + current_food++ + user.mind.adjust_experience(/datum/skill/primitive, 5) in_use = FALSE return @@ -114,14 +119,18 @@ in_use = TRUE balloon_alert(user, "feeding the worms") + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) for(var/obj/item/food/selected_food in attacking_item.contents) - if(!do_after(user, 1 SECONDS, src)) + if(!do_after(user, 1 SECONDS * skill_modifier, src)) in_use = FALSE return qdel(selected_food) current_food++ + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + current_food++ + user.mind.adjust_experience(/datum/skill/primitive, 5) in_use = FALSE return diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm index 77a24c313db..fd06106cee8 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ash_centrifuge.dm @@ -22,11 +22,13 @@ return user.balloon_alert_to_viewers("spinning [src]...") - if(!do_after(user, 5 SECONDS, target = src)) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) + if(!do_after(user, 5 SECONDS * skill_modifier, target = src)) user.balloon_alert_to_viewers("stopped spinning [src]") return reagents.del_reagent(user_input.type) + user.mind.adjust_experience(/datum/skill/primitive, 5) balloon_alert(user, "removed reagent from [src]") /obj/item/reagent_containers/cup/primitive_centrifuge/CtrlShiftClick(mob/user) @@ -40,7 +42,8 @@ return user.balloon_alert_to_viewers("spinning [src]...") - if(!do_after(user, 5 SECONDS, target = src)) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) + if(!do_after(user, 5 SECONDS * skill_modifier, target = src)) user.balloon_alert_to_viewers("stopped spinning [src]") return @@ -48,4 +51,5 @@ if(!istype(remove_reagent, user_input.type)) reagents.del_reagent(remove_reagent.type) + user.mind.adjust_experience(/datum/skill/primitive, 5) balloon_alert(user, "removed reagents from [src]") diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm index 205e357313e..4e25fb152a0 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm @@ -14,21 +14,28 @@ user.balloon_alert(user, "[ore_item] is worthless!") return - while(ore_item.amount >= 5) - if(!do_after(user, 5 SECONDS, src)) + var/ore_usage = 5 + while(ore_item.amount >= ore_usage) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) + if(!do_after(user, 5 SECONDS * skill_modifier, src)) user.balloon_alert(user, "have to stand still!") return - if(!ore_item.use(5)) + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + ore_usage = 3 + + if(!ore_item.use(ore_usage)) user.balloon_alert(user, "unable to use five of [ore_item]!") return + user.mind.adjust_experience(/datum/skill/primitive, 5) if(prob(70)) user.balloon_alert(user, "[ore_item] reveals nothing!") continue var/spawn_seed = pick(subtypesof(/obj/item/seeds) - seeds_blacklist) new spawn_seed(get_turf(src)) + user.mind.adjust_experience(/datum/skill/primitive, 10) user.balloon_alert(user, "[ore_item] revealed something!") return ..() diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm b/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm index 282369b1e85..f5ea7ebc132 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/big_mortar.dm @@ -108,11 +108,17 @@ return balloon_alert_to_viewers("grinding...") - if(!do_after(user, 5 SECONDS, target = src)) + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) + if(!do_after(user, 5 SECONDS * skill_modifier, target = src)) balloon_alert_to_viewers("stopped grinding") return - user.adjustStaminaLoss(LARGE_MORTAR_STAMINA_USE) //This is a bit more tiring than a normal sized mortar and pestle + var/stamina_use = LARGE_MORTAR_STAMINA_USE + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + stamina_use *= 0.5 //so it uses half the amount of stamina (35 instead of 70) + + user.adjustStaminaLoss(stamina_use) //This is a bit more tiring than a normal sized mortar and pestle + user.mind.adjust_experience(/datum/skill/primitive, 5) switch(picked_option) if("Juice") for(var/obj/item/target_item as anything in contents) diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm b/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm index 76a21851856..15a81b94376 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/millstone.dm @@ -142,12 +142,19 @@ flick("millstone_spin", src) playsound(src, 'sound/effects/stonedoor_openclose.ogg', 50, TRUE) - user.adjustStaminaLoss(MILLSTONE_STAMINA_USE) // Prevents spamming it + var/stamina_use = MILLSTONE_STAMINA_USE + if(prob(user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_PROBS_MODIFIER))) + stamina_use *= 0.5 //so it uses half the amount of stamina (50 instead of 100) - if(!do_after(user, 5 SECONDS, target = src)) + user.adjustStaminaLoss(stamina_use) // Prevents spamming it + + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/primitive, SKILL_SPEED_MODIFIER) + if(!do_after(user, 5 SECONDS * skill_modifier, target = src)) balloon_alert_to_viewers("stopped grinding") return + user.mind.adjust_experience(/datum/skill/primitive, 5) + for(var/target_item as anything in contents) seedify(target_item, t_max = 1) diff --git a/modular_skyrat/modules/primitive_production/code/construction.dm b/modular_skyrat/modules/primitive_production/code/construction.dm new file mode 100644 index 00000000000..5169d6a1e28 --- /dev/null +++ b/modular_skyrat/modules/primitive_production/code/construction.dm @@ -0,0 +1,18 @@ +/datum/skill/construction + name = "Construction" + title = "Builder" + desc = "To be a builder is to enjoy the start and construction of civilization." + modifiers = list( + SKILL_SPEED_MODIFIER = list(1, 0.95, 0.9, 0.85, 0.75, 0.6, 0.5), + SKILL_PROBS_MODIFIER = list(0, 5, 10, 20, 40, 80, 100) + ) + skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/construction + +/obj/item/clothing/neck/cloak/skill_reward/construction + name = "legendary builder's cloak" + desc = "Those who wear this cloak have the knowledge and understanding to start the foundation of a civilization. \ + It is within folklore that there exists people who can create and destroy villages, towns, and cities within minutes." + icon = 'modular_skyrat/modules/primitive_production/icons/cloaks.dmi' + worn_icon = 'modular_skyrat/modules/primitive_production/icons/neck.dmi' + icon_state = "buildercloak" + associated_skill_path = /datum/skill/construction diff --git a/modular_skyrat/modules/primitive_production/code/primitive.dm b/modular_skyrat/modules/primitive_production/code/primitive.dm new file mode 100644 index 00000000000..f1260e7b9ac --- /dev/null +++ b/modular_skyrat/modules/primitive_production/code/primitive.dm @@ -0,0 +1,18 @@ +/datum/skill/primitive + name = "Primitive" + title = "Survivalist" + desc = "Even after society has collapsed and they are by themselves, they can survive till the bitter end." + modifiers = list( + SKILL_SPEED_MODIFIER = list(1, 0.85, 0.75, 0.60, 0.45, 0.35, 0.25), + SKILL_PROBS_MODIFIER = list(0, 5, 10, 20, 40, 80, 100) + ) + skill_item_path = /obj/item/clothing/neck/cloak/skill_reward/primitive + +/obj/item/clothing/neck/cloak/skill_reward/primitive + name = "legendary survivalist's cloak" + desc = "Those who wear this cloak take the responsibility that comes with it: that they may be last survivor of their race. \ + Society may change or crumble, yet those who wear this cloak will observe that destruction and carry their task." + icon = 'modular_skyrat/modules/primitive_production/icons/cloaks.dmi' + worn_icon = 'modular_skyrat/modules/primitive_production/icons/neck.dmi' + icon_state = "primitivecloak" + associated_skill_path = /datum/skill/primitive diff --git a/modular_skyrat/modules/primitive_production/icons/cloaks.dmi b/modular_skyrat/modules/primitive_production/icons/cloaks.dmi index b4467ca916ddcb470837c0f15b0dc2495c5ae0d2..37b889c83e15523794f039d4895f2a01d6bd0eec 100644 GIT binary patch delta 1711 zcmXX{c~p{l7k+_wHHSs5QBf0GI9Ow4ZeyuHbIcS=NNsURtqiBM(X>8X&=+#SzEUEY z(y0VbIof!Vv1xHZ#WS68Qp+Wm$~DAg(g_L;S(Fd!`{VaK_dfUDbMC$8p7Y~a%wvd` z86o@87WNhZ0HA{c{Xt9c&>4m(Ma0Ccg|R2j*GP%$<`=RGE<2SH?ioO;pX6^v6#epx?YZ(*q&bsNKe<3 z9ZKQhyVtpMN}+$;!=ASS;Sq&!f<^Z9zE5eKZNZ1&{`b4P%=+=2)Xm3l-r!CTHal7kX3|9Q-eb>lP=TwZGPP z0}vtcd^B4RntfOkCetWWCIURrh9#KUhrARh`$6*KBNnz-7CWY7or#E|%=tEto{JR;oS| zy1SXbsaZ{Tq?1*R`kfE$!t;j${K1yh(4OVAJ;zO<*&4omef|K_&)1ODR+@1b#QZIrKPh$= zcaIA>o2?nqC?WA`8N@n0k%to6B9<42H~!>2Z?956fK{N((PfvNPZQr@Zp%Uy}=Jb*h4rUD#@OS$V~PP z(G0PQ1r#k2M9?vau=t5L8z+#sQg2k3fZL)&WQpCDI$V2Pw$^c(L0hj9iI7c?%UTKe z3z6t$QuFKXEes4{wrt}h96E9$PTp9(-)R9St=@0{1)Ubkv>Y7@%x#NvwYz#gC5kLU zLy2DjBDMU$o|;JRo>4wKTFAoH`-xhyu{i0UZU1Tw-t5z=Co)TVAo8zw-{n33l^39|yFvv_2i{hOX-J_ndd2ePXG&v2E5(v+q^O}~ZjavhTw_+PG?K>g zfh&WjxN*MT zFVRjv-xNl=ERnDKwMN#^Z+FlAJh!evEk|kf85sqJ(G2d0wumO_KA3Y3+Qf<}{{7%B zsMRMR;)B%Np(dvtnL1P1RvD?P>3dk}BPp=caXkM{o$>LD*BtsFO)d0mj3f|aSxdj5 zM zt+O_Ta$xb}<2Ij2Z&{df+=X?Plh6yTlP99+*+u5QUycd|PPSS3jB6;r6<>O-Z5EEX zFgHbrr`4YFJ9At{3mxexl2|D{EUUj*=&|Pb`4^h!V4;?MPK7~KutiCP)NNJ=zOB}U z&FI7X9VWq-Ne}s?8GSq=c-;*yK!0hZ18`n+&!M)YPZAi4Z-YG)nVEezUl7(g7$^@*ZvT9>3<0b BF5mzF delta 1086 zcmV-E1i}044uA?JiBL{Q4GJ0x0000DNk~Le0001h0001h2m=5B0QBII`2YX_a*-t> z31=4)ju#T492SvZHY%B!nas@0PfALMhljhnyJlu)z`(%zQ^z9!0004WQchCy zHk&~B|8J}%gOS0G+0}Z;w7$c5ItWPz)qv~(BqhyI-VtDq@{Rxtly?mKPY9e~cx8EgRU&12XAIy+~u0X+U{`r*j4cMJrOqn&$qF$kbQJI~%RtVZ}-08dYN z_yL}OpYiYmyu9Gy2XOhTMCU?$-Z0A~=GNi+n&83<+) z4gp;L>@j>LfH(FS&aB61O99^5V>GuO!w&-ZWRKxugueyQjc$N$bOUsw8^Gm%1FzzL z=|4uZ*}C^FUR$5z`Fzv+mTs)i@nW&-eT#S2=lHrm0n8i#O9n7^1h``W3kSf80bKJp zEg1*UEg4uX84sXasun=EWE?=ZWMH*qK7Z4cG6r*oH>E6wIm4S$#$e8@M))TsB_$;# zahX} zYvF!+#7~(@ty_K%LTG(2mH78ne=&e?{V&dc5&r%!29W;#F9wiywbK03-~Yt`7h8Y7 zvXKHv*LGrn$t#cme*7Hx535@#z{GFD=_`=d_enoiU$bPg+@b&?Q~&?~07*qoM6N<$ Ef>Jx@e*gdg diff --git a/modular_skyrat/modules/primitive_production/icons/neck.dmi b/modular_skyrat/modules/primitive_production/icons/neck.dmi index 502db224f735dd7e801ead6433c2287650adab5a..150bcf8b981a6f334aa299715d75cef9f0870642 100644 GIT binary patch delta 2302 zcmX|Dc{r478-Hb)A|^=;naNHRMY5D3R1{uQX zAn$y_(Gvh9?8Ilcl%zOv$fdejY}DOPc{_=1W@ctbM+ccq#<;iy1_sh-Gzb8q0l;^f zIwwv`gn7Do0d^Auf#S>KhhE`e+*RkIOe@2ePJO1Y3JlB+QFW-s%J~7lZL+1Leb`h< z;BUQSP;unteE_i8#o5u`J0fR3w+l07x#MGQF!ghV;hrm|y+!?3Gf^ME=Avwl8>n~6 z&Ba+g)$&L&C~*f|!z z=OesoPxs23a=qtfVAS6Tmi$!Qgg-~?6D3H~b`*PT%uE%l+S?s)rJkbG-+T3uZ)pne zzn<8?QUbk+h=OP5@I+>ze-8g7$#>>0vh4Wr{b=pl1a>kq>;qwZ6L;qFTm?d=y-t6Z z;_dAU)?-Ji4)cZrfzsmOIq$l+TH(A9|1Z&2@IOD*)` zN78kutBjB0?C(vjqnYqGmVY?nK6I{by}16NHpf)zU#|}%%FlLYq;?HQbh;%R9zcF6Adw8 zqI@Qu+O9M$jJW7U^<6gjHSJv6JBZAQO{fQvU8A9kk)fYKX^CCyAn9{#cFQAj$h5{f zsFDmjbXgaELrz{ull#ywnYTX=mMDk(_IOnq71EKth8HEX!yUn*;ESghO`BrMFom2o zd-^C2_pB}?MVhpEm8!BzCXEjtBdv+&w#oF9@15TY0`B8bE z1Go@uG}@X2=PYq!QT+t{Qym=m7%x0C7w#~vSNDKy@+MzVb%}M}uw^(za!N^f2 z)Y}iY=0YpuktssD{PwU}C_q>cii`)v&>N)tNms`iW1BBj)O^<^RqU3ycCN!vIZDdK zvar=gEnPxr zW2{W@j1uoN1+G85-SWMX@&wim-7~bnU!TqXIgxe9*acchz(*8}O~V3Q!Bbvq-w>z{ zaf?Ze6>WA@yVEP{NHYLOXrS;PU}uUzd^pv*f$s81AXhSY%cYefVeLj6TULmiBrr7t zG;YkWqr!67W{+kyPu3m`$c48_@9Jx}EUs5-C?UL84AB2kU}lSLU(Q2Ia(9euZB+ix zgIf#)-2<4;xGn0Das~O{F=?()eYm`{O0V5nhpN@}-ye#q*4`-$m~<=W-^Kbxizlyl zNW&K=Smnbd8KfZNKD@69 zVg8dMrl;?L2HVbI!48eajH~Rl%W@IdvtEZ-+DDtVuL^zx&GKIfR0YPZaH{8lp63U1 zZN@!*?f86^?>f0th}K|jaBe|}mS>4UT>O9J9~O$~*{n1v%1_X*64J{@L5rmTrciO| z_gFu|^=DEaH@Wptbb{3ECYtX-=Xgw=rk&8f5&>;Lc*@72Ff5^E=T{JtGs>InL*`Ej zXg5C#Xc^}U*YNXO+C=_m*+iLxB2B|U?=8TDFPG)H6WBdpKZklnq#b!7zk3}tv~g00 znR4Lw(|XjDf4c->*ev69vg0K5QWWsAGeYZ6RLHg9$2jDMx`($z5uzl_LQ$ z(*F6Lx(&qspqb%#Wr&&qMhil-LDhW-fAo*?B~}gZZ6|$QMTV~+w8?}UA)`z#RwQb- zdj`ZvLGC}A+vqs%d0E1nRS4cD8unqewxIiH7|xliPPRA z@-L24^0@?=(67HZnlQN5q|cF@Pc5MSgyM@pp2kX*A6hj9!^)uT;aTm~8oZTKoi zRkJXMHJzQMf2?Si45kU_y34E)vvS`JQeT4Hx&JczrX;UT3zIX1Qxj$AO!Yyy$t1B- z`=h4@pkB(P6&JEN!FaQwjGdAHsQT@3&KEAKYTvTZVXln`ZEHU;jBa_`!Gl-i7O+K{ zx8H&BLI-30paw9JBekBePCo0#*eDAg5XRuAJidrDA9H30rR>RhHwX$tK9rH+5%yvG zX^4-{*?s>U#o937)KOA~URng%!O;HcoWTV@J!QfvFY9Bdh_ zf7*p9VOh`UYePYB@ExIs_+J7zJGnWQ9>vD| E4+|r*@Bjb+ delta 1236 zcmV;_1S|X561WOeiBL{Q4GJ0x0000DNk~Le0002s0002M1Oos70PnAINkleJO3-o`Ouk3*NLj=#|W_7pj+xYz^pFe^=yjYu4#Iw6{HlANT zSDWYRxocWhuMdxZDtN}dG{%_ACpjC>FW-;V@xAYmRsUXIt78u=WU+YwL*(;KDR-lJ zp3AkYf4W7em%LHmBQK@e!GH@Ti`8hJSJnGwQ&q?F@v>?KJ_SW7&5wV*Ec!J>^EEJQ zCjQtTw>ow`Ze*eQ8EocAmGX8p&)Ws%-Li5$BVd_tj3cHe?RGTJ^>QzVMhI8rbk5t+ zd=Oy$=jYgfkiULFeYyGI8dx_|Zmc1eZ^y>FkFh&KektH=JYNI+JTdLD20)+O4G884 z&DWE`&l98nY~3k50nvYazzE&1r-3UxXny-C&$9*qccN^eR0i*5x%&kSP9apy*T4GX zR-kw3@E)n4CKOL1kw~P(x`tnj@_T5WMfyE7AM5w9e6-)g^09so&ByvZG#~5t(0r`l zL-VnI56#E=Jv7fE?H8I)98jG2kM3CO0|Ie=&*a64FS=u`!UBIH{GQn&4w^sj??1Uh zFh>XNhC27-x}j2TnIQqk@8_+6rS^MWhf+^Ta6rFbWTt})xI$w+>=wV@Y%UQ1u3u~g zhd1aK{d^;og|p$yO(YVDMEXi4_lv3XgFZfae$d0m`#mHd@Ar^=^8BEWPo5w2@$r5S z$Ft=5L5mkB9_)X-6XyplUYvNa5gqn>em5k{eYw?O^DN$e3CkL_?w|{3+dnTbO+d$- z03dOG(Hk&zezDQ8{Ysr*^a82#iwv6|jLk2yc)y3^S-jsPzepmHNME3->q(t>6W5d4 zEtA)iTKx3&q!vGYJ*mZ`{oX6qo(|o`2Qwn)6Pn`T-xAi|g^;ZVJfcy^f7ra8__x?iQZOHFk@*0Iv^u?5dTWvQt)Y!Ls z2>edz7cX9+ls_TxBV~SZ`tnYT|AK&#eh#WZo=lAMeuYeKiZLc&U3NyUet5WU3`x33+djmc8 zZo$qI2#)oOqV;?IIYsODKnzi=%_$P@`C{~99*nl3{lej zpkImegMKB>4|