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 b4467ca916d..37b889c83e1 100644 Binary files a/modular_skyrat/modules/primitive_production/icons/cloaks.dmi and b/modular_skyrat/modules/primitive_production/icons/cloaks.dmi differ diff --git a/modular_skyrat/modules/primitive_production/icons/neck.dmi b/modular_skyrat/modules/primitive_production/icons/neck.dmi index 502db224f73..150bcf8b981 100644 Binary files a/modular_skyrat/modules/primitive_production/icons/neck.dmi and b/modular_skyrat/modules/primitive_production/icons/neck.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 9dfb62ddfc1..4578b80e21f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8093,8 +8093,10 @@ #include "modular_skyrat\modules\primitive_cooking_additions\code\stone_oven.dm" #include "modular_skyrat\modules\primitive_cooking_additions\code\stone_stove.dm" #include "modular_skyrat\modules\primitive_production\code\ceramics.dm" +#include "modular_skyrat\modules\primitive_production\code\construction.dm" #include "modular_skyrat\modules\primitive_production\code\glassblowing.dm" #include "modular_skyrat\modules\primitive_production\code\misc.dm" +#include "modular_skyrat\modules\primitive_production\code\primitive.dm" #include "modular_skyrat\modules\primitive_production\code\production_skill.dm" #include "modular_skyrat\modules\primitive_structures\code\fencing.dm" #include "modular_skyrat\modules\primitive_structures\code\storage_structures.dm"