From 1b0152eb484f2efce34266d17f41184e2d3a8ef8 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Fri, 14 Aug 2020 18:28:48 +1000 Subject: [PATCH 01/85] Create anvil.dm --- code/modules/smithing/anvil.dm | 97 ++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 code/modules/smithing/anvil.dm diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm new file mode 100644 index 0000000000..5de308a7fb --- /dev/null +++ b/code/modules/smithing/anvil.dm @@ -0,0 +1,97 @@ +#define WORKPIECE_PRESENT 1 +#define WORKPIECE_INPROGRESS 2 +#define WORKPIECE_FINISHED 3 +#define WORKPIECE_SLAG 5 + +#define RECIPE_SMALLPICK "dbp" //draw bend punch +#define RECIPE_LARGEPICK "ddbp" //draw draw bend punch +#define RECIPE_SHOVEL "dfup" //draw fold upset punch +#define RECIPE_SMALLKNIFE "sdd" //shrink draw draw +#define RECIPE_HAMMER "sfp" //shrink fold punch +#define RECIPE_AXE "ufp" //upset fold punch +#define RECIPE_SHORTSWORD "dff" //draw fold fold +#define RECIPE_JAVELIN "dbf" //draw bend fold +#define RECIPE_SCYTHE "bdf" //bend draw fold +#define RECIPE_COGHEAD "bsf" //bend shrink fold. +#define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw +#define RECIPE_HALBERD "duffp" //draw upset fold fold punch + +/obj/structure/anvil + name = "anvil" + desc = "Base class of anvil. This shouldn't exist, but is useable." + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "loom" + density = TRUE + anchored = TRUE + var/workpiece_state = FALSE + var/qualitymod = 0 + var/currentquality = qualitymod + var/currentsteps = 0 + var/strengthstepcostmod = 1 + var/stepsdone + var/list/recipes = (RECIPE_AXE, RECIPE_HAMMER, RECIPE_SCYTHE, RECIPE_SHOVEL, RECIPE_COGHEAD, RECIPE_JAVELIN, RECIPE_LARGEPICK, RECIPE_SMALLPICK, RECIPE_SHORTSWORD, RECIPE_SMALLKNIFE) + +/obj/structure/anvil/attackby(obj/item/I, mob/user) + if(istype(I, obj/item/ingot)) + var/obj/item/ingot/notsword = I + if(workpiece_state) + to_chat(user, "There's already a workpiece! Finish it or take it off.") + return FALSE + if(notsword.workability == "shapeable") + workpiece_state = WORKPIECE_PRESENT + to_chat(user, "You place the [notsword] on the [src].") + else + to_chat(user, "The ingot isn't workable yet!") + return FALSE + return + return ..() + +/obj/structure/anvil/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I, 5) + return TRUE + + +/obj/structure/anvil/proc/do_shaping(mob/user) + var/list/shapingsteps = ("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. + var/stepdone = input(user, "How would you like to work the metal?") in shapingsteps + switch(stepdone) + if("weak hit") + currentsteps += 1 * strengthstepcostmod + strengthstepcostmod += 0.3 + qualitymod += 1 + if("strong hit") + currentsteps += 1.25 * strengthstepcostmod + strengthstepcostmod += 0.5 + qualitymod += 2 + if("heavy hit") + currentsteps += 1.5 * strengthstepcostmod + strengthstepcostmod += 0.7 + qualitymod += 3 + if("fold") + stepsdone += "f" + currentsteps += 1 + qualitymod -= 2 + if("draw") + stepsdone += "d" + currentsteps += 1 + qualitymod -= 2 + if("shrink") + stepsdone += "s" + currentsteps += 1 + qualitymod -= 2 + if("bend") + stepsdone += "b" + currentsteps += 1 + qualitymod -= 2 + if("punch") + stepsdone += "p" + currentsteps += 1 + qualitymod -= 2 + if("upset") + stepsdone += "u" + currentsteps += 1 + qualitymod -= 2 + if(length(stepsdone) >= 3) + //todo: TRYFINISHTHEPIECE + //TODO: CHECK IF IT'S TOO WORKED From 67fe32aa13c8bf2ad440b130b5420c789fdf5f7a Mon Sep 17 00:00:00 2001 From: lolman360 Date: Fri, 14 Aug 2020 19:10:29 +1000 Subject: [PATCH 02/85] www --- code/modules/smithing/anvil.dm | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 5de308a7fb..378641eaa1 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -16,6 +16,7 @@ #define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw #define RECIPE_HALBERD "duffp" //draw upset fold fold punch +#define STEPS_CAP 8 /obj/structure/anvil name = "anvil" desc = "Base class of anvil. This shouldn't exist, but is useable." @@ -29,7 +30,7 @@ var/currentsteps = 0 var/strengthstepcostmod = 1 var/stepsdone - var/list/recipes = (RECIPE_AXE, RECIPE_HAMMER, RECIPE_SCYTHE, RECIPE_SHOVEL, RECIPE_COGHEAD, RECIPE_JAVELIN, RECIPE_LARGEPICK, RECIPE_SMALLPICK, RECIPE_SHORTSWORD, RECIPE_SMALLKNIFE) + var/list/smithrecipes = (RECIPE_AXE, RECIPE_HAMMER, RECIPE_SCYTHE, RECIPE_SHOVEL, RECIPE_COGHEAD, RECIPE_JAVELIN, RECIPE_LARGEPICK, RECIPE_SMALLPICK, RECIPE_SHORTSWORD, RECIPE_SMALLKNIFE, RECIPE_BROADSWORD, RECIPE_HALBERD) /obj/structure/anvil/attackby(obj/item/I, mob/user) if(istype(I, obj/item/ingot)) @@ -44,6 +45,13 @@ to_chat(user, "The ingot isn't workable yet!") return FALSE return + else if(istype(I, obj/item/hammer)) + var/obj/item/hammer/hammertime = I + if(workpiece_state = WORKPIECE_PRESENT || WORKPIECE_INPROGRESS) + do_shaping(user, hammer.qualitymod) + else + to_chat(user, "You can't work an empty anvil!") + return FALSE return ..() /obj/structure/anvil/wrench_act(mob/living/user, obj/item/I) @@ -52,8 +60,10 @@ return TRUE -/obj/structure/anvil/proc/do_shaping(mob/user) +/obj/structure/anvil/proc/do_shaping(mob/user, var/qualitychange) + qualitymod += qualitychange var/list/shapingsteps = ("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. + workpiece_state = WORKPIECE_INPROGRESS var/stepdone = input(user, "How would you like to work the metal?") in shapingsteps switch(stepdone) if("weak hit") @@ -93,5 +103,17 @@ currentsteps += 1 qualitymod -= 2 if(length(stepsdone) >= 3) - //todo: TRYFINISHTHEPIECE - //TODO: CHECK IF IT'S TOO WORKED + if(currentsteps > STEPS_CAP) + to_chat(user, "You overwork the metal, causing it to turn into useless slag!") + var/turf/T = get_turf(user) + workpiece_state = FALSE + new /obj/item/stack/ore/slag(T) + for(var/solutions in smithrecipes) + if(!solution == stepsdone) + return FALSE + else + var/finisheditem = smithrecipes[stepsdone] + var/turf/T = get_turf(user) + workpiece_state = FALSE + new finisheditem(T) + to_chat(user, "You finish your [finisheditem]!") From 87eec3a9eb2562bd231797da2c7fdd9a8bed6aa1 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Fri, 14 Aug 2020 19:17:09 +1000 Subject: [PATCH 03/85] weeee --- code/modules/smithing/anvil.dm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 378641eaa1..ba8459109e 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -30,7 +30,18 @@ var/currentsteps = 0 var/strengthstepcostmod = 1 var/stepsdone - var/list/smithrecipes = (RECIPE_AXE, RECIPE_HAMMER, RECIPE_SCYTHE, RECIPE_SHOVEL, RECIPE_COGHEAD, RECIPE_JAVELIN, RECIPE_LARGEPICK, RECIPE_SMALLPICK, RECIPE_SHORTSWORD, RECIPE_SMALLKNIFE, RECIPE_BROADSWORD, RECIPE_HALBERD) + var/list/smithrecipes = (RECIPE_AXE = obj/item/smithing/axehead, + RECIPE_HAMMER = obj/item/smithing/hammerhead, + RECIPE_SCYTHE = obj/item/smithing/scytheblade, + RECIPE_SHOVEL = obj/item/smithing/shovelhead, + RECIPE_COGHEAD = obj/item/smithing/cogheadclubhead, + RECIPE_JAVELIN = obj/item/smithing/javelinhead, + RECIPE_LARGEPICK = obj/item/smithing/pickaxehead, + RECIPE_SMALLPICK = obj/item/smithing/prospectingpickhead, + RECIPE_SHORTSWORD = obj/item/smithing/shortswordblade, + RECIPE_SMALLKNIFE = obj/item/smithing/knifeblade, + RECIPE_BROADSWORD = obj/item/smithing/broadblade, + RECIPE_HALBERD = obj/item/smithing/halberdhead) /obj/structure/anvil/attackby(obj/item/I, mob/user) if(istype(I, obj/item/ingot)) From 0bc79b82ebd3b73ad5252c3d06aeaf7c69068a62 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Fri, 14 Aug 2020 20:18:55 +1000 Subject: [PATCH 04/85] ABDCE --- .../mining/equipment/mineral_scanner.dm | 11 +++- code/modules/smithing/anvil.dm | 9 ++- code/modules/smithing/smithed_items.dm | 57 +++++++++++++++++++ 3 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 code/modules/smithing/smithed_items.dm diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index 9ccb7c0efc..bd5ce44998 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -12,13 +12,14 @@ slot_flags = ITEM_SLOT_BELT var/cooldown = 35 var/current_cooldown = 0 + var/range = 7 /obj/item/mining_scanner/attack_self(mob/user) if(!user.client) return if(current_cooldown <= world.time) current_cooldown = world.time + cooldown - mineral_scan_pulse(get_turf(user)) + mineral_scan_pulse(get_turf(user), range) //Debug item to identify all ore spread quickly /obj/item/mining_scanner/admin @@ -41,7 +42,7 @@ slot_flags = ITEM_SLOT_BELT var/cooldown = 35 var/current_cooldown = 0 - var/range = 7 + /obj/item/t_scanner/adv_mining_scanner/lesser name = "automatic mining scanner" @@ -80,3 +81,9 @@ /obj/effect/temp_visual/mining_overlay/Initialize() . = ..() animate(src, alpha = 0, time = duration, easing = EASE_IN) + +/obj/item/mining_scanner/prospector + name = "prospector's pickaxe" + desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." + icon = 'icons/obj/mining.dmi' + icon_state = "pickaxe" diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index ba8459109e..597e65c662 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -25,6 +25,7 @@ density = TRUE anchored = TRUE var/workpiece_state = FALSE + var/datum/material = workpiece_material var/qualitymod = 0 var/currentquality = qualitymod var/currentsteps = 0 @@ -44,20 +45,22 @@ RECIPE_HALBERD = obj/item/smithing/halberdhead) /obj/structure/anvil/attackby(obj/item/I, mob/user) - if(istype(I, obj/item/ingot)) - var/obj/item/ingot/notsword = I + if(istype(I, obj/item/smithing/ingot)) + var/obj/item/smithing/ingot/notsword = I if(workpiece_state) to_chat(user, "There's already a workpiece! Finish it or take it off.") return FALSE if(notsword.workability == "shapeable") workpiece_state = WORKPIECE_PRESENT + workpiece_material = notsword.custom_materials to_chat(user, "You place the [notsword] on the [src].") + qdel(notsword) else to_chat(user, "The ingot isn't workable yet!") return FALSE return else if(istype(I, obj/item/hammer)) - var/obj/item/hammer/hammertime = I + var/obj/item/melee/hammer/hammertime = I if(workpiece_state = WORKPIECE_PRESENT || WORKPIECE_INPROGRESS) do_shaping(user, hammer.qualitymod) else diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm new file mode 100644 index 0000000000..e6959e0183 --- /dev/null +++ b/code/modules/smithing/smithed_items.dm @@ -0,0 +1,57 @@ +/obj/item/smithing + name = "base class /obj/item/smithing" + desc = "A [src]." + var/quality = 0 //quality. Changed by the smithing process. + var/obj/item/finishingitem = /obj/item/stick //What this item needs to be hit by to create finalitem + var/obj/item/finalitem = /obj/item + +/obj/item/smithing/axehead + name = "smithed axe head" + finalitem = /obj/item/hatchet/smithed + +/obj/item/smithing/hammerhead + name = "smithed hammer head" + finalitem = /obj/item/melee/hammer + +/obj/item/smithing/scytheblade + name = "smithed scythe head" + finalitem = /obj/item/scythe/smithed + +/obj/item/smithing/shovelhead + name = "smithed shovel head" + finalitem = /obj/item/shovel/smithed + +/obj/item/smithing/cogheadclubhead + name = "smithed coghead club head" + finalitem = /obj/item/melee/cleric_mace/cogheadclub + +/obj/item/smithing/javelinhead + name = "smithed javelin head" + finalitem = /obj/item/spear/javelin + +/obj/item/smithing/pickaxehead + name = "smithed pickaxe head" + finalitem = /obj/item/pickaxe/smithed + +/obj/item/smithing/prospectingpickhead + name = "smithed prospector's pickaxe head" + finalitem = /obj/item/mining_scanner/prospector + +/obj/item/smithing/shortswordblade + name = "smithed shortsword blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/shortsword + +/obj/item/smithing/knifeblade + name = "smithed knife blade" + finishingitem = /obj/item/swordhandle + finalitem = + +/obj/item/smithing/broadblade + name = "smithed broadsword blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/broadsword + +/obj/item/smithing/halberdhead + name = "smithed halberd head" + finalitem = /obj/item/spear/halberd From 2ff1529df2031457eb17ac1b80d2a919788ff2ad Mon Sep 17 00:00:00 2001 From: lolman360 Date: Fri, 14 Aug 2020 21:02:00 +1000 Subject: [PATCH 05/85] ee --- code/modules/smithing/smithed_items.dm | 70 +++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index e6959e0183..91e01c3e07 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -1,57 +1,123 @@ /obj/item/smithing name = "base class /obj/item/smithing" - desc = "A [src]." + desc = "A [src]. Hit it with a [finishingitem] to create a [finalitem]." var/quality = 0 //quality. Changed by the smithing process. var/obj/item/finishingitem = /obj/item/stick //What this item needs to be hit by to create finalitem var/obj/item/finalitem = /obj/item +/obj/item/smithing/attackby(obj/item/I, mob/user) + if(istype(I, finishingitem)) + to_chat(user, "You finish the [src].") + qdel(I) + dofinish() + else + return ..() + + +/obj/item/smithing/proc/dofinish() + var/turf/T = get_turf(src) + new finalitem(T) + qdel(src) + /obj/item/smithing/axehead name = "smithed axe head" finalitem = /obj/item/hatchet/smithed +/obj/item/smithing/axehead/dofinish() + finalitem.force += quality + ..() + /obj/item/smithing/hammerhead name = "smithed hammer head" finalitem = /obj/item/melee/hammer +/obj/item/smithing/hammerhead/dofinish() + finalitem.force += quality/2 + finalitem.qualitymod = quality/4 + ..() + /obj/item/smithing/scytheblade name = "smithed scythe head" finalitem = /obj/item/scythe/smithed +/obj/item/smithing/scytheblade/dofinish() + finalitem.force += quality + ..() + /obj/item/smithing/shovelhead name = "smithed shovel head" finalitem = /obj/item/shovel/smithed +/obj/item/smithing/shovelhead/dofinish() + finalitem.force += quality/2 + finalitem.toolspeed /= quality + ..() + /obj/item/smithing/cogheadclubhead name = "smithed coghead club head" finalitem = /obj/item/melee/cleric_mace/cogheadclub +/obj/item/smithing/cogheadclubhead/dofinish() + finalitem.force += quality + ..() + /obj/item/smithing/javelinhead name = "smithed javelin head" finalitem = /obj/item/spear/javelin +/obj/item/smithing/javelinhead/dofinish() + finalitem.force += quality + ..() + /obj/item/smithing/pickaxehead name = "smithed pickaxe head" finalitem = /obj/item/pickaxe/smithed +/obj/item/smithing/pickaxehead/dofinish() + finalitem.force += quality/2 + finalitem.toolspeed /= quality + ..() + /obj/item/smithing/prospectingpickhead name = "smithed prospector's pickaxe head" finalitem = /obj/item/mining_scanner/prospector +/obj/item/smithing/prospectingpickhead/dofinish() + finalitem.range = 2 + quality + finalitem.cooldown = 50/quality + ..() + /obj/item/smithing/shortswordblade name = "smithed shortsword blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/shortsword +/obj/item/smithing/shortswordblade/dofinish() + finalitem.force += quality + ..() + /obj/item/smithing/knifeblade name = "smithed knife blade" finishingitem = /obj/item/swordhandle - finalitem = + finalitem = /obj/item/kitchen/knife + +/obj/item/smithing/knifehead/dofinish() + finalitem.force += quality/2 + ..() /obj/item/smithing/broadblade name = "smithed broadsword blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/broadsword +/obj/item/smithing/broadblade/dofinish() + finalitem.force += quality + ..() + /obj/item/smithing/halberdhead name = "smithed halberd head" finalitem = /obj/item/spear/halberd + +/obj/item/smithing/halberdhead/dofinish() + finalitem.force += quality + ..() From 7ca4fa2f5599565f3cbe3437e0d5a731928ff7a5 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sat, 15 Aug 2020 17:09:12 +1000 Subject: [PATCH 06/85] compilies/?? --- .../items/stacks/sheets/sheet_types.dm | 1 + .../mining/equipment/mineral_scanner.dm | 8 +- code/modules/smithing/anvil.dm | 65 +++++++----- code/modules/smithing/finished_items.dm | 78 ++++++++++++++ code/modules/smithing/smithed_items.dm | 96 ++++++++++++++---- icons/obj/smith.dmi | Bin 0 -> 481 bytes tgstation.dme | 3 + 7 files changed, 200 insertions(+), 51 deletions(-) create mode 100644 code/modules/smithing/finished_items.dm create mode 100644 icons/obj/smith.dmi diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 5f6341ea21..83ba5612a4 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -121,6 +121,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 50), \ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("iron ingot", /obj/item/ingot/iron, 6, time = 100), \ )) /obj/item/stack/sheet/metal diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index bd5ce44998..b2cd840468 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -42,7 +42,7 @@ slot_flags = ITEM_SLOT_BELT var/cooldown = 35 var/current_cooldown = 0 - + var/range = 7 /obj/item/t_scanner/adv_mining_scanner/lesser name = "automatic mining scanner" @@ -81,9 +81,3 @@ /obj/effect/temp_visual/mining_overlay/Initialize() . = ..() animate(src, alpha = 0, time = duration, easing = EASE_IN) - -/obj/item/mining_scanner/prospector - name = "prospector's pickaxe" - desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." - icon = 'icons/obj/mining.dmi' - icon_state = "pickaxe" diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 597e65c662..01736f03d0 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -20,33 +20,35 @@ /obj/structure/anvil name = "anvil" desc = "Base class of anvil. This shouldn't exist, but is useable." - icon = 'icons/obj/hydroponics/equipment.dmi' - icon_state = "loom" + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" density = TRUE anchored = TRUE var/workpiece_state = FALSE - var/datum/material = workpiece_material + var/datum/material/workpiece_material var/qualitymod = 0 - var/currentquality = qualitymod + var/currentquality = 0 var/currentsteps = 0 var/strengthstepcostmod = 1 - var/stepsdone - var/list/smithrecipes = (RECIPE_AXE = obj/item/smithing/axehead, - RECIPE_HAMMER = obj/item/smithing/hammerhead, - RECIPE_SCYTHE = obj/item/smithing/scytheblade, - RECIPE_SHOVEL = obj/item/smithing/shovelhead, - RECIPE_COGHEAD = obj/item/smithing/cogheadclubhead, - RECIPE_JAVELIN = obj/item/smithing/javelinhead, - RECIPE_LARGEPICK = obj/item/smithing/pickaxehead, - RECIPE_SMALLPICK = obj/item/smithing/prospectingpickhead, - RECIPE_SHORTSWORD = obj/item/smithing/shortswordblade, - RECIPE_SMALLKNIFE = obj/item/smithing/knifeblade, - RECIPE_BROADSWORD = obj/item/smithing/broadblade, - RECIPE_HALBERD = obj/item/smithing/halberdhead) + var/stepsdone = 0 + var/list/smithrecipes = list(RECIPE_AXE = /obj/item/smithing/axehead, + RECIPE_HAMMER = /obj/item/smithing/hammerhead, + RECIPE_SCYTHE = /obj/item/smithing/scytheblade, + RECIPE_SHOVEL = /obj/item/smithing/shovelhead, + RECIPE_COGHEAD = /obj/item/smithing/cogheadclubhead, + RECIPE_JAVELIN = /obj/item/smithing/javelinhead, + RECIPE_LARGEPICK = /obj/item/smithing/pickaxehead, + RECIPE_SMALLPICK = /obj/item/smithing/prospectingpickhead, + RECIPE_SHORTSWORD = /obj/item/smithing/shortswordblade, + RECIPE_SMALLKNIFE = /obj/item/smithing/knifeblade, + RECIPE_BROADSWORD = /obj/item/smithing/broadblade, + RECIPE_HALBERD = /obj/item/smithing/halberdhead) + + /obj/structure/anvil/attackby(obj/item/I, mob/user) - if(istype(I, obj/item/smithing/ingot)) - var/obj/item/smithing/ingot/notsword = I + if(istype(I, /obj/item/ingot)) + var/obj/item/ingot/notsword = I if(workpiece_state) to_chat(user, "There's already a workpiece! Finish it or take it off.") return FALSE @@ -54,15 +56,16 @@ workpiece_state = WORKPIECE_PRESENT workpiece_material = notsword.custom_materials to_chat(user, "You place the [notsword] on the [src].") + currentquality = qualitymod qdel(notsword) else to_chat(user, "The ingot isn't workable yet!") return FALSE return - else if(istype(I, obj/item/hammer)) - var/obj/item/melee/hammer/hammertime = I - if(workpiece_state = WORKPIECE_PRESENT || WORKPIECE_INPROGRESS) - do_shaping(user, hammer.qualitymod) + else if(istype(I, /obj/item/melee/smith/hammer)) + var/obj/item/melee/smith/hammer/hammertime = I + if(workpiece_state == WORKPIECE_PRESENT || WORKPIECE_INPROGRESS) + do_shaping(user, hammertime.qualitymod) else to_chat(user, "You can't work an empty anvil!") return FALSE @@ -76,7 +79,7 @@ /obj/structure/anvil/proc/do_shaping(mob/user, var/qualitychange) qualitymod += qualitychange - var/list/shapingsteps = ("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. + var/list/shapingsteps = list("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. workpiece_state = WORKPIECE_INPROGRESS var/stepdone = input(user, "How would you like to work the metal?") in shapingsteps switch(stepdone) @@ -122,12 +125,20 @@ var/turf/T = get_turf(user) workpiece_state = FALSE new /obj/item/stack/ore/slag(T) + currentquality = qualitymod for(var/solutions in smithrecipes) - if(!solution == stepsdone) + if(!solutions == stepsdone) return FALSE else - var/finisheditem = smithrecipes[stepsdone] + var/obj/item/smithing/finisheditem = smithrecipes[stepsdone] var/turf/T = get_turf(user) workpiece_state = FALSE - new finisheditem(T) + finisheditem.set_custom_materials(workpiece_material) to_chat(user, "You finish your [finisheditem]!") + new finisheditem(T) + currentquality = qualitymod + +#undef WORKPIECE_PRESENT +#undef WORKPIECE_INPROGRESS +#undef WORKPIECE_FINISHED +#undef WORKPIECE_SLAG diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm new file mode 100644 index 0000000000..7aa7384036 --- /dev/null +++ b/code/modules/smithing/finished_items.dm @@ -0,0 +1,78 @@ +/obj/item/melee/smith + name = "base class obj/item/melee/smith" //tin. handles overlay and quality and shit. + icon = 'icons/obj/smith.dmi' + icon_state = "mace_greyscale" + item_state = "mace_greyscale" + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + var/quality + var/overlay_state = "stick" + var/mutable_appearance/overlay + + +/obj/item/melee/smith/Initialize() + desc = "A handmade [name]." + . = ..() + overlay = mutable_appearance(icon, overlay_state) + overlay.appearance_flags = RESET_COLOR + add_overlay(overlay) + + + + +/////////////////////////// +// Mining // +/////////////////////////// +/obj/item/mining_scanner/prospector + name = "prospector's pickaxe" + desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." + icon = 'icons/obj/mining.dmi' + icon_state = "pickaxe" //todo:sprite + +/obj/item/pickaxe/smithed + name = "pickaxe" + desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." + icon = 'icons/obj/mining.dmi' + icon_state = "pickaxe" + +/obj/item/shovel/smithed + name = "prospector's pickaxe" + desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." + icon = 'icons/obj/mining.dmi' + icon_state = "pickaxe" + + + + + +/////////////////////////// +// Spears // +/////////////////////////// + + +/obj/item/melee/smith/halberd + + +/obj/item/melee/smith/javelin + + + + + +////////////////////////// +// Other Melee // +/////////////////////////// + +/obj/item/melee/smith/axe + +/obj/item/melee/smith/hammer//blacksmithing, not warhammer. + var/qualitymod = 0 + +/obj/item/scythe/smithed //we need to inherit scythecode + +/obj/item/melee/smith/cogheadclub + +/obj/item/melee/smith/shortsword + +/obj/item/melee/smith/shortsword diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 91e01c3e07..3da44c90d3 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -1,10 +1,24 @@ /obj/item/smithing name = "base class /obj/item/smithing" - desc = "A [src]. Hit it with a [finishingitem] to create a [finalitem]." + icon = 'icons/obj/smith.dmi' + icon_state = "unfinished" + material_flags = MATERIAL_COLOR | MATERIAL_ADD_PREFIX var/quality = 0 //quality. Changed by the smithing process. var/obj/item/finishingitem = /obj/item/stick //What this item needs to be hit by to create finalitem - var/obj/item/finalitem = /obj/item + var/obj/item/finalitem = /obj/item/melee/smith +/obj/item/ingot + name = "ingot" + icon = 'icons/obj/smith.dmi' + icon_state = "unfinished" + material_flags = MATERIAL_COLOR | MATERIAL_ADD_PREFIX + var/workability = "shapeable" + +/obj/item/ingot/iron + custom_materials = list(/datum/material/iron=12000) + +/obj/item/smithing/Initialize() + desc = "A [src]. Hit it with a [finishingitem] to create a [finalitem]." /obj/item/smithing/attackby(obj/item/I, mob/user) if(istype(I, finishingitem)) to_chat(user, "You finish the [src].") @@ -16,12 +30,37 @@ /obj/item/smithing/proc/dofinish() var/turf/T = get_turf(src) - new finalitem(T) + . = new finalitem(T) + finalitem.set_custom_materials(custom_materials) + var/qualname + switch(quality) + if(-1000 to -5) + qualname = "awful" + if(-1000 to -2) + qualname = "shoddy" + if(-1000 to 0) + qualname = "poor" + if(0) + qualname = "normal" + if(10 to INFINITY) + qualname = "legendary" + if(8,9) + qualname = "masterwork" + if(6,7) + qualname = "excellent" + if(4,5) + qualname = "good" + if(1,2,3) + qualname = "above-average" + var/datum/material/mat = custom_materials[1] + mat = mat.name + finalitem.name = "[qualname] [mat] [finalitem.name]." qdel(src) + return /obj/item/smithing/axehead name = "smithed axe head" - finalitem = /obj/item/hatchet/smithed + finalitem = /obj/item/melee/smith/axe /obj/item/smithing/axehead/dofinish() finalitem.force += quality @@ -29,11 +68,12 @@ /obj/item/smithing/hammerhead name = "smithed hammer head" - finalitem = /obj/item/melee/hammer + var/obj/item/melee/smith/hammer/finalforreal = /obj/item/melee/smith/hammer /obj/item/smithing/hammerhead/dofinish() - finalitem.force += quality/2 - finalitem.qualitymod = quality/4 + finalforreal.force += quality/2 + finalforreal.qualitymod = quality/4 + finalitem = finalforreal ..() /obj/item/smithing/scytheblade @@ -55,7 +95,7 @@ /obj/item/smithing/cogheadclubhead name = "smithed coghead club head" - finalitem = /obj/item/melee/cleric_mace/cogheadclub + finalitem = /obj/item/melee/smith/cogheadclub /obj/item/smithing/cogheadclubhead/dofinish() finalitem.force += quality @@ -63,7 +103,7 @@ /obj/item/smithing/javelinhead name = "smithed javelin head" - finalitem = /obj/item/spear/javelin + finalitem = /obj/item/melee/smith/javelin /obj/item/smithing/javelinhead/dofinish() finalitem.force += quality @@ -71,20 +111,29 @@ /obj/item/smithing/pickaxehead name = "smithed pickaxe head" - finalitem = /obj/item/pickaxe/smithed + var/obj/item/pickaxe/smithed/finalforreal = /obj/item/pickaxe/smithed /obj/item/smithing/pickaxehead/dofinish() - finalitem.force += quality/2 - finalitem.toolspeed /= quality + finalforreal.force += quality/2 + finalforreal.toolspeed /= quality + switch(quality) + if(10 to INFINITY) + finalforreal.digrange = 4 + if(5 to 9) + finalforreal.digrange = 3 + if(3,4) + finalforreal.digrange = 2 + finalitem = finalforreal ..() /obj/item/smithing/prospectingpickhead name = "smithed prospector's pickaxe head" - finalitem = /obj/item/mining_scanner/prospector + var/obj/item/mining_scanner/prospector/finalforreal = /obj/item/mining_scanner/prospector /obj/item/smithing/prospectingpickhead/dofinish() - finalitem.range = 2 + quality - finalitem.cooldown = 50/quality + finalforreal.range = 2 + quality + finalforreal.cooldown = 100/quality + finalitem = finalforreal ..() /obj/item/smithing/shortswordblade @@ -108,7 +157,7 @@ /obj/item/smithing/broadblade name = "smithed broadsword blade" finishingitem = /obj/item/swordhandle - finalitem = /obj/item/melee/smith/broadsword + finalitem = /obj/item/melee/smith/shortsword /obj/item/smithing/broadblade/dofinish() finalitem.force += quality @@ -116,8 +165,21 @@ /obj/item/smithing/halberdhead name = "smithed halberd head" - finalitem = /obj/item/spear/halberd + finalitem = /obj/item/melee/smith/halberd /obj/item/smithing/halberdhead/dofinish() finalitem.force += quality ..() + +/obj/item/stick + name = "wooden rod" + desc = "It's a rod, suitable for use of a handle of a tool. Also could serve as a weapon, in a pinch." + icon = 'icons/obj/smith.dmi' + icon_state = "stick" + force = 7 + +/obj/item/swordhandle + name = "sword handle" + desc = "It's a rod, suitable for use of a handle of a tool. Also could serve as a weapon, in a pinch." + icon = 'icons/obj/smith.dmi' + icon_state = "stick" \ No newline at end of file diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1e28c69386db4e737014b4c05926d7145a584207 GIT binary patch literal 481 zcmV<70UrK|P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DKW1sGe?PwGbOXA7|1u|;!G<_%uR)`;i^jW(lYZhi!)MF2r4Zu z$xP11rHV5nzofVzALIxl106#{9YZc<1y?^8u+sso;WnD7R_vVs007xZL_t(YiRF?p z4#F@DMQu^`@0&0nI00ql5{MNEAyx(sj-8^`g%C@Gp#pbF;+JQ~D$yi@r4P76w;osw zd52^HzxxQlF4*IF^C7wu4(FSO Date: Sun, 16 Aug 2020 12:42:40 +1000 Subject: [PATCH 07/85] workies!! --- code/modules/smithing/anvil.dm | 52 ++++++++++----- code/modules/smithing/finished_items.dm | 45 +++++++++++-- code/modules/smithing/smithed_items.dm | 83 ++++++++++++++++-------- icons/obj/smith.dmi | Bin 481 -> 484 bytes 4 files changed, 128 insertions(+), 52 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 01736f03d0..2a8b476628 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -26,11 +26,12 @@ anchored = TRUE var/workpiece_state = FALSE var/datum/material/workpiece_material + var/anvilquality = 0 var/qualitymod = 0 var/currentquality = 0 var/currentsteps = 0 var/strengthstepcostmod = 1 - var/stepsdone = 0 + var/stepsdone = "" var/list/smithrecipes = list(RECIPE_AXE = /obj/item/smithing/axehead, RECIPE_HAMMER = /obj/item/smithing/hammerhead, RECIPE_SCYTHE = /obj/item/smithing/scytheblade, @@ -44,7 +45,9 @@ RECIPE_BROADSWORD = /obj/item/smithing/broadblade, RECIPE_HALBERD = /obj/item/smithing/halberdhead) - +/obj/structure/anvil/Initialize() + ..() + qualitymod = anvilquality /obj/structure/anvil/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/ingot)) @@ -64,8 +67,9 @@ return else if(istype(I, /obj/item/melee/smith/hammer)) var/obj/item/melee/smith/hammer/hammertime = I - if(workpiece_state == WORKPIECE_PRESENT || WORKPIECE_INPROGRESS) + if(workpiece_state == WORKPIECE_PRESENT || workpiece_state == WORKPIECE_INPROGRESS) do_shaping(user, hammertime.qualitymod) + return else to_chat(user, "You can't work an empty anvil!") return FALSE @@ -119,24 +123,38 @@ stepsdone += "u" currentsteps += 1 qualitymod -= 2 + to_chat(user, "You [stepdone] the metal.") + currentquality += qualitymod + to_chat(user, stepsdone) if(length(stepsdone) >= 3) - if(currentsteps > STEPS_CAP) - to_chat(user, "You overwork the metal, causing it to turn into useless slag!") + tryfinish(user) + +/obj/structure/anvil/proc/tryfinish(mob/user) + if(currentsteps > STEPS_CAP) + to_chat(user, "You overwork the metal, causing it to turn into useless slag!") + var/turf/T = get_turf(user) + workpiece_state = FALSE + new /obj/item/stack/ore/slag(T) + currentquality = 0 + qualitymod = anvilquality + stepsdone = "" + currentsteps = 0 + for(var/i in smithrecipes) + to_chat(user, "comparing [i] to [stepsdone]") + if(i == stepsdone) var/turf/T = get_turf(user) + var/obj/item/smithing/create = smithrecipes[stepsdone] + var/obj/item/smithing/finisheditem = new create(T) + to_chat(user, "You finish your [finisheditem]!") workpiece_state = FALSE - new /obj/item/stack/ore/slag(T) + finisheditem.quality = currentquality + finisheditem.set_custom_materials(workpiece_material) currentquality = qualitymod - for(var/solutions in smithrecipes) - if(!solutions == stepsdone) - return FALSE - else - var/obj/item/smithing/finisheditem = smithrecipes[stepsdone] - var/turf/T = get_turf(user) - workpiece_state = FALSE - finisheditem.set_custom_materials(workpiece_material) - to_chat(user, "You finish your [finisheditem]!") - new finisheditem(T) - currentquality = qualitymod + qualitymod = anvilquality + stepsdone = "" + currentsteps = 0 + break + #undef WORKPIECE_PRESENT #undef WORKPIECE_INPROGRESS diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 7aa7384036..7bd6f4e78e 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -4,6 +4,7 @@ icon_state = "mace_greyscale" item_state = "mace_greyscale" material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + force = 10 lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' var/quality @@ -12,13 +13,26 @@ /obj/item/melee/smith/Initialize() + ..() desc = "A handmade [name]." - . = ..() overlay = mutable_appearance(icon, overlay_state) overlay.appearance_flags = RESET_COLOR add_overlay(overlay) + if(force < 0) + force = 0 +/obj/item/melee/smith/twohand + var/wielded_mult = 1.75 + + +/obj/item/melee/smith/twohand/ComponentInitialize() + . = ..() + AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad. + AddComponent(/datum/component/jousting) + AddElement(/datum/element/sword_point) + var/fw = force*wielded_mult + AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=fw, icon_wielded="[icon_state]_wield") /////////////////////////// @@ -51,13 +65,21 @@ /////////////////////////// -/obj/item/melee/smith/halberd - - -/obj/item/melee/smith/javelin +/obj/item/melee/smith/twohand/halberd + name = "halberd" + +/obj/item/melee/smith/twohand/halberd/Initialize() + ..() + throwforce = force/3 +/obj/item/melee/smith/twohand/javelin + name = "javelin" + wielded_mult = 1.5 +/obj/item/melee/smith/twohand/javelin/Initialize() + ..() + throwforce = force*2 ////////////////////////// @@ -65,14 +87,23 @@ /////////////////////////// /obj/item/melee/smith/axe + name = "axe" /obj/item/melee/smith/hammer//blacksmithing, not warhammer. + name = "hammer" var/qualitymod = 0 -/obj/item/scythe/smithed //we need to inherit scythecode +/obj/item/scythe/smithed //we need to inherit scythecode, but that's about it. + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + /obj/item/melee/smith/cogheadclub + name = "coghead club" /obj/item/melee/smith/shortsword + name = "shortsword" -/obj/item/melee/smith/shortsword +/obj/item/melee/smith/twohand/broadsword + name = "broadsword" + force = 15 + wielded_mult = 1.8 diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 3da44c90d3..84ba872460 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -1,3 +1,7 @@ + + + + /obj/item/smithing name = "base class /obj/item/smithing" icon = 'icons/obj/smith.dmi' @@ -5,7 +9,7 @@ material_flags = MATERIAL_COLOR | MATERIAL_ADD_PREFIX var/quality = 0 //quality. Changed by the smithing process. var/obj/item/finishingitem = /obj/item/stick //What this item needs to be hit by to create finalitem - var/obj/item/finalitem = /obj/item/melee/smith + var/obj/item/finalitem /obj/item/ingot name = "ingot" @@ -18,20 +22,22 @@ custom_materials = list(/datum/material/iron=12000) /obj/item/smithing/Initialize() + ..() desc = "A [src]. Hit it with a [finishingitem] to create a [finalitem]." + + /obj/item/smithing/attackby(obj/item/I, mob/user) if(istype(I, finishingitem)) - to_chat(user, "You finish the [src].") qdel(I) - dofinish() + startfinish() else return ..() +/obj/item/smithing/proc/startfinish() + dofinish() /obj/item/smithing/proc/dofinish() - var/turf/T = get_turf(src) - . = new finalitem(T) - finalitem.set_custom_materials(custom_materials) + visible_message("The finishing of [src].") var/qualname switch(quality) if(-1000 to -5) @@ -54,33 +60,39 @@ qualname = "above-average" var/datum/material/mat = custom_materials[1] mat = mat.name - finalitem.name = "[qualname] [mat] [finalitem.name]." + finalitem.name = "[qualname] [mat] [finalitem.name]" + finalitem.forceMove(get_turf(src)) qdel(src) - return + /obj/item/smithing/axehead name = "smithed axe head" finalitem = /obj/item/melee/smith/axe -/obj/item/smithing/axehead/dofinish() +/obj/item/smithing/axehead/startfinish() + finalitem = new /obj/item/melee/smith/axe(src) finalitem.force += quality ..() /obj/item/smithing/hammerhead name = "smithed hammer head" - var/obj/item/melee/smith/hammer/finalforreal = /obj/item/melee/smith/hammer + finalitem = /obj/item/melee/smith/hammer -/obj/item/smithing/hammerhead/dofinish() +/obj/item/smithing/hammerhead/startfinish() + var/obj/item/melee/smith/hammer/finalforreal = new /obj/item/melee/smith/hammer(src) finalforreal.force += quality/2 finalforreal.qualitymod = quality/4 finalitem = finalforreal ..() + + /obj/item/smithing/scytheblade name = "smithed scythe head" finalitem = /obj/item/scythe/smithed -/obj/item/smithing/scytheblade/dofinish() +/obj/item/smithing/scytheblade/startfinish() + finalitem = new /obj/item/scythe/smithed(src) finalitem.force += quality ..() @@ -88,16 +100,19 @@ name = "smithed shovel head" finalitem = /obj/item/shovel/smithed -/obj/item/smithing/shovelhead/dofinish() +/obj/item/smithing/shovelhead/startfinish() + finalitem = new /obj/item/shovel/smithed(src) finalitem.force += quality/2 - finalitem.toolspeed /= quality + if(quality) + finalitem.toolspeed /= quality ..() /obj/item/smithing/cogheadclubhead name = "smithed coghead club head" finalitem = /obj/item/melee/smith/cogheadclub -/obj/item/smithing/cogheadclubhead/dofinish() +/obj/item/smithing/cogheadclubhead/startfinish() + finalitem = new /obj/item/melee/smith/cogheadclub(src) finalitem.force += quality ..() @@ -105,17 +120,21 @@ name = "smithed javelin head" finalitem = /obj/item/melee/smith/javelin -/obj/item/smithing/javelinhead/dofinish() +/obj/item/smithing/javelinhead/startfinish() + finalitem = new /obj/item/melee/smith/javelin(src) finalitem.force += quality ..() + /obj/item/smithing/pickaxehead name = "smithed pickaxe head" - var/obj/item/pickaxe/smithed/finalforreal = /obj/item/pickaxe/smithed + finalitem = /obj/item/pickaxe/smithed -/obj/item/smithing/pickaxehead/dofinish() +/obj/item/smithing/pickaxehead/startfinish() + var/obj/item/pickaxe/smithed/finalforreal = new /obj/item/pickaxe/smithed(src) finalforreal.force += quality/2 - finalforreal.toolspeed /= quality + if(quality) + finalforreal.toolspeed /= quality switch(quality) if(10 to INFINITY) finalforreal.digrange = 4 @@ -126,22 +145,27 @@ finalitem = finalforreal ..() + /obj/item/smithing/prospectingpickhead name = "smithed prospector's pickaxe head" - var/obj/item/mining_scanner/prospector/finalforreal = /obj/item/mining_scanner/prospector + finalitem = /obj/item/mining_scanner/prospector -/obj/item/smithing/prospectingpickhead/dofinish() +/obj/item/smithing/prospectingpickhead/startfinish() + var/obj/item/mining_scanner/prospector/finalforreal = new /obj/item/mining_scanner/prospector(src) finalforreal.range = 2 + quality - finalforreal.cooldown = 100/quality + if(quality) + finalforreal.cooldown = 100/quality finalitem = finalforreal ..() + /obj/item/smithing/shortswordblade name = "smithed shortsword blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/shortsword -/obj/item/smithing/shortswordblade/dofinish() +/obj/item/smithing/shortswordblade/startfinish() + finalitem = new /obj/item/melee/smith/shortsword(src) finalitem.force += quality ..() @@ -150,16 +174,18 @@ finishingitem = /obj/item/swordhandle finalitem = /obj/item/kitchen/knife -/obj/item/smithing/knifehead/dofinish() +/obj/item/smithing/knifehead/startfinish() + finalitem = new /obj/item/kitchen/knife(src) finalitem.force += quality/2 ..() /obj/item/smithing/broadblade name = "smithed broadsword blade" finishingitem = /obj/item/swordhandle - finalitem = /obj/item/melee/smith/shortsword + finalitem = /obj/item/melee/smith/broadsword -/obj/item/smithing/broadblade/dofinish() +/obj/item/smithing/broadblade/startfinish() + finalitem = new /obj/item/melee/smith/broadsword(src) finalitem.force += quality ..() @@ -167,7 +193,8 @@ name = "smithed halberd head" finalitem = /obj/item/melee/smith/halberd -/obj/item/smithing/halberdhead/dofinish() +/obj/item/smithing/halberdhead/startfinish() + finalitem = new /obj/item/melee/smith/halberd(src) finalitem.force += quality ..() @@ -182,4 +209,4 @@ name = "sword handle" desc = "It's a rod, suitable for use of a handle of a tool. Also could serve as a weapon, in a pinch." icon = 'icons/obj/smith.dmi' - icon_state = "stick" \ No newline at end of file + icon_state = "stick" diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index 1e28c69386db4e737014b4c05926d7145a584207..7a34789020437232cc3a16818b10883d6e5254ea 100644 GIT binary patch delta 278 zcmV+x0qOqX1LOmcFBw}`RlvZ&aY8YOR6#Wu4W(pDPAVM4T(M=5NUML`Nkl%uF0-&*ogh7riI2v>)Z85&j000_K ztTRgnX2}1mm6JC+2k38(;JBz0%=U*eaJg0rHlE;AEjX8fzIKA8C)hfIwIgV}pXdo- c?g)OM?osnJd_63_0RR9107*qoM6N<$g3fn$(f|Me delta 275 zcmV+u0qp+d1K|UZFB!nVz;Qw`h*Uu}7!9RlOHL{rTUS-HJ(n<%NUML@NklEZY< Date: Sun, 16 Aug 2020 14:04:56 +1000 Subject: [PATCH 08/85] wewwewe --- code/modules/smithing/anvil.dm | 8 ++++---- code/modules/smithing/finished_items.dm | 20 ++++++++++---------- code/modules/smithing/smithed_items.dm | 24 +++++++++++++++--------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 2a8b476628..5ac705ee09 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -28,9 +28,9 @@ var/datum/material/workpiece_material var/anvilquality = 0 var/qualitymod = 0 - var/currentquality = 0 - var/currentsteps = 0 - var/strengthstepcostmod = 1 + var/currentquality = 0 //lolman? what the fuck do these vars do? + var/currentsteps = 0 //even i don't know + var/strengthstepcostmod = 1 //todo: document this shit var/stepsdone = "" var/list/smithrecipes = list(RECIPE_AXE = /obj/item/smithing/axehead, RECIPE_HAMMER = /obj/item/smithing/hammerhead, @@ -149,7 +149,7 @@ workpiece_state = FALSE finisheditem.quality = currentquality finisheditem.set_custom_materials(workpiece_material) - currentquality = qualitymod + currentquality = 0 qualitymod = anvilquality stepsdone = "" currentsteps = 0 diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 7bd6f4e78e..d0d115fca8 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -10,7 +10,8 @@ var/quality var/overlay_state = "stick" var/mutable_appearance/overlay - + var/wielded_mult = 1 + var/wield_force = 15 /obj/item/melee/smith/Initialize() ..() @@ -23,16 +24,15 @@ /obj/item/melee/smith/twohand - var/wielded_mult = 1.75 + wielded_mult = 1.75 -/obj/item/melee/smith/twohand/ComponentInitialize() - . = ..() +/obj/item/melee/smith/twohand/Initialize() + ..() AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad. AddComponent(/datum/component/jousting) AddElement(/datum/element/sword_point) - var/fw = force*wielded_mult - AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=fw, icon_wielded="[icon_state]_wield") + AddComponent(/datum/component/two_handed, force_unwielded=force, force_wielded=wield_force, icon_wielded="[icon_state]_wield") /////////////////////////// @@ -46,15 +46,15 @@ /obj/item/pickaxe/smithed name = "pickaxe" - desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." + desc = "A pickaxe." icon = 'icons/obj/mining.dmi' icon_state = "pickaxe" /obj/item/shovel/smithed - name = "prospector's pickaxe" - desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." + name = "shovel" + desc = "A shovel." icon = 'icons/obj/mining.dmi' - icon_state = "pickaxe" + icon_state = "shovel" diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 84ba872460..a4b12002d8 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -118,11 +118,13 @@ /obj/item/smithing/javelinhead name = "smithed javelin head" - finalitem = /obj/item/melee/smith/javelin + finalitem = /obj/item/melee/smith/twohand/javelin /obj/item/smithing/javelinhead/startfinish() - finalitem = new /obj/item/melee/smith/javelin(src) - finalitem.force += quality + var/obj/item/melee/smith/twohand/javelin/finalforreal = new /obj/item/melee/smith/twohand/javelin(src) + finalforreal.force += quality + finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalitem = finalforreal ..() @@ -182,20 +184,24 @@ /obj/item/smithing/broadblade name = "smithed broadsword blade" finishingitem = /obj/item/swordhandle - finalitem = /obj/item/melee/smith/broadsword + finalitem = /obj/item/melee/smith/twohand/broadsword /obj/item/smithing/broadblade/startfinish() - finalitem = new /obj/item/melee/smith/broadsword(src) - finalitem.force += quality + var/obj/item/melee/smith/twohand/broadsword/finalforreal = new /obj/item/melee/smith/twohand/broadsword(src) + finalforreal.force += quality + finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalitem = finalforreal ..() /obj/item/smithing/halberdhead name = "smithed halberd head" - finalitem = /obj/item/melee/smith/halberd + finalitem = /obj/item/melee/smith/twohand/halberd /obj/item/smithing/halberdhead/startfinish() - finalitem = new /obj/item/melee/smith/halberd(src) - finalitem.force += quality + var/obj/item/melee/smith/twohand/halberd/finalforreal = new /obj/item/melee/smith/twohand/halberd(src) + finalforreal.force += quality + finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalitem = finalforreal ..() /obj/item/stick From c2f36c8fe445939ecaba4f7e4cd626d31f9dce4d Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 16 Aug 2020 17:03:57 +1000 Subject: [PATCH 09/85] sprites --- code/modules/smithing/anvil.dm | 4 +- code/modules/smithing/finished_items.dm | 66 ++++++++++++++++++------ code/modules/smithing/smithed_items.dm | 35 ++++++++++++- icons/obj/smith.dmi | Bin 484 -> 3210 bytes 4 files changed, 86 insertions(+), 19 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 5ac705ee09..3326049ff2 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -15,6 +15,7 @@ #define RECIPE_COGHEAD "bsf" //bend shrink fold. #define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw #define RECIPE_HALBERD "duffp" //draw upset fold fold punch +#define RECIPE_GLAIVE "usfp" //upset shrink fold punch #define STEPS_CAP 8 /obj/structure/anvil @@ -43,7 +44,8 @@ RECIPE_SHORTSWORD = /obj/item/smithing/shortswordblade, RECIPE_SMALLKNIFE = /obj/item/smithing/knifeblade, RECIPE_BROADSWORD = /obj/item/smithing/broadblade, - RECIPE_HALBERD = /obj/item/smithing/halberdhead) + RECIPE_HALBERD = /obj/item/smithing/halberdhead, + RECIPE_GLAIVE = /obj/item/smithing/glaivehead) /obj/structure/anvil/Initialize() ..() diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index d0d115fca8..aaadce5106 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -27,12 +27,11 @@ wielded_mult = 1.75 -/obj/item/melee/smith/twohand/Initialize() - ..() +/obj/item/melee/smith/twohand/ComponentInitialize() + . = ..() AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad. - AddComponent(/datum/component/jousting) AddElement(/datum/element/sword_point) - AddComponent(/datum/component/two_handed, force_unwielded=force, force_wielded=wield_force, icon_wielded="[icon_state]_wield") + /////////////////////////// @@ -41,23 +40,47 @@ /obj/item/mining_scanner/prospector name = "prospector's pickaxe" desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." - icon = 'icons/obj/mining.dmi' + icon = 'icons/obj/smith.dmi' icon_state = "pickaxe" //todo:sprite +/obj/item/mining_scanner/prospector/Initialize() + ..() + desc = "A handmade [name]." + overlay = mutable_appearance(icon, "minihandle") + overlay.appearance_flags = RESET_COLOR + add_overlay(overlay) + if(force < 0) + force = 0 + /obj/item/pickaxe/smithed name = "pickaxe" desc = "A pickaxe." - icon = 'icons/obj/mining.dmi' + icon = 'icons/obj/smith.dmi' icon_state = "pickaxe" +/obj/item/pickaxe/smithed/Initialize() + ..() + desc = "A handmade [name]." + overlay = mutable_appearance(icon, "stick") + overlay.appearance_flags = RESET_COLOR + add_overlay(overlay) + if(force < 0) + force = 0 + /obj/item/shovel/smithed name = "shovel" desc = "A shovel." - icon = 'icons/obj/mining.dmi' + icon = 'icons/obj/smith.dmi' icon_state = "shovel" - - +/obj/item/shovel/smithed/Initialize() + ..() + desc = "A handmade [name]." + overlay = mutable_appearance(icon, "shovelhandle") + overlay.appearance_flags = RESET_COLOR + add_overlay(overlay) + if(force < 0) + force = 0 /////////////////////////// @@ -67,21 +90,32 @@ /obj/item/melee/smith/twohand/halberd name = "halberd" + icon_state = "halberd" + overlay_state = "spearhandle" -/obj/item/melee/smith/twohand/halberd/Initialize() - ..() - throwforce = force/3 - +/obj/item/melee/smith/twohand/halberd/ComponentInitialize() + . = ..() + AddComponent(/datum/component/jousting) /obj/item/melee/smith/twohand/javelin name = "javelin" + icon_state = "javelin" + overlay_state = "longhandle" wielded_mult = 1.5 -/obj/item/melee/smith/twohand/javelin/Initialize() - ..() - throwforce = force*2 +/obj/item/melee/smith/twohand/javelin/ComponentInitialize() + . = ..() + AddComponent(/datum/component/jousting) +/obj/item/melee/smith/twohand/glaive + name = "glaive" + icon_state = "glaive" + overlay_state = "longhandle" + +/obj/item/melee/smith/twohand/glaive/ComponentInitialize() + . = ..() + AddComponent(/datum/component/jousting) ////////////////////////// // Other Melee // /////////////////////////// diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index a4b12002d8..9fedb6124d 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -14,7 +14,7 @@ /obj/item/ingot name = "ingot" icon = 'icons/obj/smith.dmi' - icon_state = "unfinished" + icon_state = "ingot" material_flags = MATERIAL_COLOR | MATERIAL_ADD_PREFIX var/workability = "shapeable" @@ -69,6 +69,7 @@ name = "smithed axe head" finalitem = /obj/item/melee/smith/axe + /obj/item/smithing/axehead/startfinish() finalitem = new /obj/item/melee/smith/axe(src) finalitem.force += quality @@ -77,6 +78,7 @@ /obj/item/smithing/hammerhead name = "smithed hammer head" finalitem = /obj/item/melee/smith/hammer + icon_state = "hammer" /obj/item/smithing/hammerhead/startfinish() var/obj/item/melee/smith/hammer/finalforreal = new /obj/item/melee/smith/hammer(src) @@ -90,6 +92,7 @@ /obj/item/smithing/scytheblade name = "smithed scythe head" finalitem = /obj/item/scythe/smithed + icon_state = "scythe" /obj/item/smithing/scytheblade/startfinish() finalitem = new /obj/item/scythe/smithed(src) @@ -99,6 +102,7 @@ /obj/item/smithing/shovelhead name = "smithed shovel head" finalitem = /obj/item/shovel/smithed + icon_state = "shovel" /obj/item/smithing/shovelhead/startfinish() finalitem = new /obj/item/shovel/smithed(src) @@ -119,11 +123,14 @@ /obj/item/smithing/javelinhead name = "smithed javelin head" finalitem = /obj/item/melee/smith/twohand/javelin + icon_state = "javelin" /obj/item/smithing/javelinhead/startfinish() var/obj/item/melee/smith/twohand/javelin/finalforreal = new /obj/item/melee/smith/twohand/javelin(src) finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalforreal.throwforce = finalforreal.force*2 finalitem = finalforreal ..() @@ -131,6 +138,7 @@ /obj/item/smithing/pickaxehead name = "smithed pickaxe head" finalitem = /obj/item/pickaxe/smithed + icon_state = "pickaxe" /obj/item/smithing/pickaxehead/startfinish() var/obj/item/pickaxe/smithed/finalforreal = new /obj/item/pickaxe/smithed(src) @@ -151,6 +159,7 @@ /obj/item/smithing/prospectingpickhead name = "smithed prospector's pickaxe head" finalitem = /obj/item/mining_scanner/prospector + icon_state = "minipick" /obj/item/smithing/prospectingpickhead/startfinish() var/obj/item/mining_scanner/prospector/finalforreal = new /obj/item/mining_scanner/prospector(src) @@ -165,6 +174,7 @@ name = "smithed shortsword blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/shortsword + icon_state = "gladius" /obj/item/smithing/shortswordblade/startfinish() finalitem = new /obj/item/melee/smith/shortsword(src) @@ -175,6 +185,7 @@ name = "smithed knife blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/kitchen/knife + icon_state = "dagger" /obj/item/smithing/knifehead/startfinish() finalitem = new /obj/item/kitchen/knife(src) @@ -185,25 +196,45 @@ name = "smithed broadsword blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/twohand/broadsword + icon_state = "broadsword" /obj/item/smithing/broadblade/startfinish() var/obj/item/melee/smith/twohand/broadsword/finalforreal = new /obj/item/melee/smith/twohand/broadsword(src) finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") finalitem = finalforreal ..() /obj/item/smithing/halberdhead name = "smithed halberd head" finalitem = /obj/item/melee/smith/twohand/halberd + icon_state = "halberd" /obj/item/smithing/halberdhead/startfinish() var/obj/item/melee/smith/twohand/halberd/finalforreal = new /obj/item/melee/smith/twohand/halberd(src) finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalforreal.throwforce = finalforreal.force/3 + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") finalitem = finalforreal ..() +/obj/item/smithing/glaivehead + name = "smithed glaive head" + finalitem = /obj/item/melee/smith/twohand/glaive + icon_state = "glaive" + +/obj/item/smithing/glaive/startfinish() + var/obj/item/melee/smith/twohand/halberd/finalforreal = new /obj/item/melee/smith/twohand/glaive(src) + finalforreal.force += quality + finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalforreal.throwforce = finalforreal.force + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalitem = finalforreal + ..() + + /obj/item/stick name = "wooden rod" desc = "It's a rod, suitable for use of a handle of a tool. Also could serve as a weapon, in a pinch." @@ -215,4 +246,4 @@ name = "sword handle" desc = "It's a rod, suitable for use of a handle of a tool. Also could serve as a weapon, in a pinch." icon = 'icons/obj/smith.dmi' - icon_state = "stick" + icon_state = "shorthilt" diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index 7a34789020437232cc3a16818b10883d6e5254ea..4893018b231d97d2b23055573315f4c6a70e97c0 100644 GIT binary patch literal 3210 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 w8|w+?XWiY6Mq_<{907*qoM6N<$f;S0A;Q#;t literal 484 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DKW1sGe?PwGbOXA7|1u|;!G<_%uR)`;i^jW(lYZhi!)MF2r4Zu z$xP11rHV5nzofVzALIxl106#{9YZc<1y?^8u+sso;WnD7R_vVs007)cL_t(YiRF+n z4#F@DMQw>P+dToP#64ILoPaWN3dG2O5XZ(2D7aOKCBjgF+ac+Hd3Fjgi9$|A=A&76 zspyq=At717?mhzA$pM)k6#@1PUjWDff(sN{@L-0_HPPhR!Zs9h>5<8a3G=XI@}k6V z00Kseu>vGZWO-DnV Date: Sun, 16 Aug 2020 22:04:28 +1000 Subject: [PATCH 10/85] dix --- code/datums/materials/basemats.dm | 13 +++--- code/datums/skills/_skill_holder.dm | 2 +- code/datums/skills/blacksmithing.dm | 6 +++ code/modules/smithing/anvil.dm | 57 +++++++++++++------------ code/modules/smithing/finished_items.dm | 15 ++++++- code/modules/smithing/smithed_items.dm | 2 +- tgstation.dme | 1 + 7 files changed, 61 insertions(+), 35 deletions(-) create mode 100644 code/datums/skills/blacksmithing.dm diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 721af65449..2e9c8efab7 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -35,23 +35,24 @@ Unless you know what you're doing, only use the first three numbers. They're in value_per_unit = 0.025 beauty_modifier = 0.075 -///Slight force increase +///Slight force decrease. It's gold, it's soft as fuck. /datum/material/gold name = "gold" desc = "Gold" color = list(340/255, 240/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //gold is shiny, but not as bright as bananium - strength_modifier = 1.2 + strength_modifier = 0.8 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold value_per_unit = 0.0625 beauty_modifier = 0.15 armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 1.15, "energy" = 1.15, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1.1) -///Has no special properties +///Small force increase, for diamond swords /datum/material/diamond name = "diamond" desc = "Highly pressurized carbon" color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) + strength_modifier = 1.1 alpha = 132 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond @@ -106,6 +107,7 @@ Unless you know what you're doing, only use the first three numbers. They're in name = "bluespace crystal" desc = "Crystals with bluespace properties" color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) + integrity_modifier = 0.2 //these things shatter when thrown. alpha = 200 categories = list(MAT_CATEGORY_ORE = TRUE) beauty_modifier = 0.5 @@ -139,7 +141,7 @@ Unless you know what you're doing, only use the first three numbers. They're in name = "titanium" desc = "Titanium" color = "#b3c0c7" - strength_modifier = 1.3 + strength_modifier = 1.1 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium value_per_unit = 0.0625 @@ -203,7 +205,7 @@ Unless you know what you're doing, only use the first three numbers. They're in name = "adamantine" desc = "A powerful material made out of magic, I mean science!" color = "#6d7e8e" - strength_modifier = 1.5 + strength_modifier = 1.3 categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/adamantine value_per_unit = 0.25 @@ -276,6 +278,7 @@ Unless you know what you're doing, only use the first three numbers. They're in desc = "Mir'ntrath barhah Nar'sie." color = "#3C3434" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + strength_modifier = 1.2 sheet_type = /obj/item/stack/sheet/runed_metal value_per_unit = 0.75 armor_modifiers = list("melee" = 1.2, "bullet" = 1.2, "laser" = 1, "energy" = 1, "bomb" = 1.2, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index 73748417c3..83c95c6439 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -110,7 +110,7 @@ /** * Automatic skill increase, multiplied by skill affinity if existing. - * Only works if skill is numerical. + * Only works if skill is numerical or levelled.. */ /datum/mind/proc/auto_gain_experience(skill, value, maximum, silent = FALSE) if(!ispath(skill, /datum/skill)) diff --git a/code/datums/skills/blacksmithing.dm b/code/datums/skills/blacksmithing.dm new file mode 100644 index 0000000000..0bddae5562 --- /dev/null +++ b/code/datums/skills/blacksmithing.dm @@ -0,0 +1,6 @@ +/datum/skill/level/dorfy/blacksmithing + name = "Blacksmithing" + desc = "Making metal into fancy shapes using heat and force. Higher levels increase both your working speed at an anvil as well as the quality of your works." + name_color = COLOR_FLOORTILE_GRAY + skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE, SKILL_USE_TOOL, SKILL_TRAINING_TOOL) + ui_category = SKILL_UI_CAT_MISC diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 3326049ff2..7886b87225 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -17,7 +17,6 @@ #define RECIPE_HALBERD "duffp" //draw upset fold fold punch #define RECIPE_GLAIVE "usfp" //upset shrink fold punch -#define STEPS_CAP 8 /obj/structure/anvil name = "anvil" desc = "Base class of anvil. This shouldn't exist, but is useable." @@ -28,10 +27,9 @@ var/workpiece_state = FALSE var/datum/material/workpiece_material var/anvilquality = 0 - var/qualitymod = 0 var/currentquality = 0 //lolman? what the fuck do these vars do? var/currentsteps = 0 //even i don't know - var/strengthstepcostmod = 1 //todo: document this shit + var/outrightfailchance = 1 //todo: document this shit var/stepsdone = "" var/list/smithrecipes = list(RECIPE_AXE = /obj/item/smithing/axehead, RECIPE_HAMMER = /obj/item/smithing/hammerhead, @@ -49,7 +47,7 @@ /obj/structure/anvil/Initialize() ..() - qualitymod = anvilquality + currentquality = anvilquality /obj/structure/anvil/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/ingot)) @@ -61,7 +59,11 @@ workpiece_state = WORKPIECE_PRESENT workpiece_material = notsword.custom_materials to_chat(user, "You place the [notsword] on the [src].") - currentquality = qualitymod + currentquality = anvilquality + var/skillmod = 0 + if(user.mind.skill_holder) + skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/2 + currentquality += skillmod qdel(notsword) else to_chat(user, "The ingot isn't workable yet!") @@ -84,63 +86,64 @@ /obj/structure/anvil/proc/do_shaping(mob/user, var/qualitychange) - qualitymod += qualitychange + currentquality += qualitychange var/list/shapingsteps = list("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. workpiece_state = WORKPIECE_INPROGRESS var/stepdone = input(user, "How would you like to work the metal?") in shapingsteps switch(stepdone) if("weak hit") - currentsteps += 1 * strengthstepcostmod - strengthstepcostmod += 0.3 - qualitymod += 1 + currentsteps += 1 + outrightfailchance += 10 + currentquality += 1 if("strong hit") - currentsteps += 1.25 * strengthstepcostmod - strengthstepcostmod += 0.5 - qualitymod += 2 + currentsteps += 2 + outrightfailchance += 17.5 + currentquality += 2 if("heavy hit") - currentsteps += 1.5 * strengthstepcostmod - strengthstepcostmod += 0.7 - qualitymod += 3 + currentsteps += 3 + outrightfailchance += 25 + currentquality += 3 if("fold") stepsdone += "f" currentsteps += 1 - qualitymod -= 2 + currentquality -= 1 if("draw") stepsdone += "d" currentsteps += 1 - qualitymod -= 2 + currentquality -= 1 if("shrink") stepsdone += "s" currentsteps += 1 - qualitymod -= 2 + currentquality -= 1 if("bend") stepsdone += "b" currentsteps += 1 - qualitymod -= 2 + currentquality -= 1 if("punch") stepsdone += "p" currentsteps += 1 - qualitymod -= 2 + currentquality -= 1 if("upset") stepsdone += "u" currentsteps += 1 - qualitymod -= 2 + currentquality -= 1 to_chat(user, "You [stepdone] the metal.") - currentquality += qualitymod to_chat(user, stepsdone) if(length(stepsdone) >= 3) tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) - if(currentsteps > STEPS_CAP) + if(currentsteps > 12 || (rng && prob(outrightfailchance)) to_chat(user, "You overwork the metal, causing it to turn into useless slag!") var/turf/T = get_turf(user) workpiece_state = FALSE new /obj/item/stack/ore/slag(T) - currentquality = 0 - qualitymod = anvilquality + currentquality = anvilquality stepsdone = "" currentsteps = 0 + outrightfailchance = 1 + if(user.mind.skill_holder) + user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 25, 400, silent = FALSE) for(var/i in smithrecipes) to_chat(user, "comparing [i] to [stepsdone]") if(i == stepsdone) @@ -151,10 +154,10 @@ workpiece_state = FALSE finisheditem.quality = currentquality finisheditem.set_custom_materials(workpiece_material) - currentquality = 0 - qualitymod = anvilquality + currentquality = anvilquality stepsdone = "" currentsteps = 0 + outrightfailchance = 1 break diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index aaadce5106..cb95ae11b8 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -1,3 +1,7 @@ +//TODO: OBTAILABILITY, ANVIL TYPES, HAMMER TYPES, INGOTS + + + /obj/item/melee/smith name = "base class obj/item/melee/smith" //tin. handles overlay and quality and shit. icon = 'icons/obj/smith.dmi' @@ -45,6 +49,7 @@ /obj/item/mining_scanner/prospector/Initialize() ..() + var/mutable_appearance/overlay desc = "A handmade [name]." overlay = mutable_appearance(icon, "minihandle") overlay.appearance_flags = RESET_COLOR @@ -61,6 +66,7 @@ /obj/item/pickaxe/smithed/Initialize() ..() desc = "A handmade [name]." + var/mutable_appearance/overlay overlay = mutable_appearance(icon, "stick") overlay.appearance_flags = RESET_COLOR add_overlay(overlay) @@ -76,6 +82,7 @@ /obj/item/shovel/smithed/Initialize() ..() desc = "A handmade [name]." + var/mutable_appearance/overlay overlay = mutable_appearance(icon, "shovelhandle") overlay.appearance_flags = RESET_COLOR add_overlay(overlay) @@ -125,6 +132,8 @@ /obj/item/melee/smith/hammer//blacksmithing, not warhammer. name = "hammer" + icon_state = "hammer" + overlay_state = "hammerhandle" var/qualitymod = 0 /obj/item/scythe/smithed //we need to inherit scythecode, but that's about it. @@ -135,9 +144,13 @@ name = "coghead club" /obj/item/melee/smith/shortsword - name = "shortsword" + name = "gladius" + icon_state = "gladius" + overlay_state = "gladiushilt" /obj/item/melee/smith/twohand/broadsword name = "broadsword" + icon_state = "broadsword" + overlay_state = "broadhilt" force = 15 wielded_mult = 1.8 diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 9fedb6124d..ca12033447 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -226,7 +226,7 @@ icon_state = "glaive" /obj/item/smithing/glaive/startfinish() - var/obj/item/melee/smith/twohand/halberd/finalforreal = new /obj/item/melee/smith/twohand/glaive(src) + var/obj/item/melee/smith/twohand/glaive/finalforreal = new /obj/item/melee/smith/twohand/glaive(src) finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.throwforce = finalforreal.force diff --git a/tgstation.dme b/tgstation.dme index 8153b6617c..ac09c11fd3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -633,6 +633,7 @@ #include "code\datums\skills\_skill.dm" #include "code\datums\skills\_skill_holder.dm" #include "code\datums\skills\_skill_modifier.dm" +#include "code\datums\skills\blacksmithing.dm" #include "code\datums\skills\engineering.dm" #include "code\datums\skills\medical.dm" #include "code\datums\skills\modifiers\job.dm" From 09fc795f3b0d60a7f847fc141e52dd6ebe270837 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 17 Aug 2020 11:45:24 +1000 Subject: [PATCH 11/85] AnPrim --- .../crafting/recipes/recipes_misc.dm | 54 +++++++++++++- code/modules/smithing/anvil.dm | 69 +++++++++++++++++- code/modules/smithing/finished_items.dm | 63 +++++++++++++++- code/modules/smithing/smithed_items.dm | 17 ++++- icons/obj/smith.dmi | Bin 3210 -> 3268 bytes 5 files changed, 194 insertions(+), 9 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 0cb0547978..ee0a55c657 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -111,6 +111,26 @@ category = CAT_MISC always_availible = FALSE // Disabled til learned +/datum/crafting_recipe/tableanvil + name = "Table Anvil" + result = /obj/structure/anvil/obtainable/table + time = 300 + reqs = list(/obj/item/stack/sheet/metal = 4, + /obj/item/stack/rods = 2) + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC + +/datum/crafting_recipe/sandvil + name = "Sandstone Anvil" + result = /obj/structure/anvil/obtainable/sandstone + time = 300 + reqs = list(/obj/item/stack/sheet/mineral/sandstone = 4) + tools = list(TOOL_CROWBAR) + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC + + /////////////////// //Tools & Storage// /////////////////// @@ -166,6 +186,17 @@ subcategory = CAT_TOOL category = CAT_MISC +/datum/crafting_recipe/toolboxhammer + name = "Toolbox Hammer" + result = /obj/item/melee/smith/hammer/toolbox + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + reqs = list(/obj/item/storage/toolbox = 1, + /obj/item/stack/sheet/metal = 4, + /obj/item/stack/rods = 2) + time = 40 + subcategory = CAT_TOOL + category = CAT_MISC + /datum/crafting_recipe/papersack name = "Paper Sack" result = /obj/item/storage/box/papersack @@ -324,7 +355,7 @@ result = /obj/item/toy/sword/cx subcategory = CAT_MISCELLANEOUS category = CAT_MISC - + /datum/crafting_recipe/catgirlplushie name = "Catgirl Plushie" reqs = list(/obj/item/toy/plush/hairball = 3) @@ -336,6 +367,27 @@ //Unsorted// //////////// + + +/datum/crafting_recipe/stick + name = "Stick" + time = 30 + reqs = list(/obj/item/stack/sheet/mineral/wood = 1) + tools = list(/obj/item/hatchet) + result = /obj/item/stick + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC + + +/datum/crafting_recipe/swordhilt + name = "Sword Hilt" + time = 30 + reqs = list(/obj/item/stack/sheet/mineral/wood = 2) + tools = list(/obj/item/hatchet) + result = /obj/item/swordhandle + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC + /datum/crafting_recipe/blackcarpet name = "Black Carpet" reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 7886b87225..80268bfa41 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -6,14 +6,21 @@ #define RECIPE_SMALLPICK "dbp" //draw bend punch #define RECIPE_LARGEPICK "ddbp" //draw draw bend punch #define RECIPE_SHOVEL "dfup" //draw fold upset punch -#define RECIPE_SMALLKNIFE "sdd" //shrink draw draw #define RECIPE_HAMMER "sfp" //shrink fold punch #define RECIPE_AXE "ufp" //upset fold punch + + +#define RECIPE_SMALLKNIFE "sdd" //shrink draw draw #define RECIPE_SHORTSWORD "dff" //draw fold fold -#define RECIPE_JAVELIN "dbf" //draw bend fold +#define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw +#define RECIPE_KATANA "fffff" //fold fold fold fold fold + + #define RECIPE_SCYTHE "bdf" //bend draw fold #define RECIPE_COGHEAD "bsf" //bend shrink fold. -#define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw + + +#define RECIPE_JAVELIN "dbf" //draw bend fold #define RECIPE_HALBERD "duffp" //draw upset fold fold punch #define RECIPE_GLAIVE "usfp" //upset shrink fold punch @@ -31,6 +38,7 @@ var/currentsteps = 0 //even i don't know var/outrightfailchance = 1 //todo: document this shit var/stepsdone = "" + var/rng = FALSE var/list/smithrecipes = list(RECIPE_AXE = /obj/item/smithing/axehead, RECIPE_HAMMER = /obj/item/smithing/hammerhead, RECIPE_SCYTHE = /obj/item/smithing/scytheblade, @@ -133,7 +141,7 @@ tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) - if(currentsteps > 12 || (rng && prob(outrightfailchance)) + if(currentsteps > 12 || (rng && prob(outrightfailchance))) to_chat(user, "You overwork the metal, causing it to turn into useless slag!") var/turf/T = get_turf(user) workpiece_state = FALSE @@ -160,6 +168,59 @@ outrightfailchance = 1 break +/obj/structure/anvil/debugsuper + name = "super ultra epic anvil of debugging." + desc = "WOW. A DEBUG ITEM STRUCTURE. EPIC." + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = 10 + outrightfailchance = 0 + +/obj/structure/anvil/obtainable + name = "anvil" + desc = "Base class of anvil. This shouldn't exist, but is useable." + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = 0 + outrightfailchance = 5 + rng = TRUE + +/obj/structure/anvil/obtainable/table + name = "table anvil" + desc = "A slightly reinforced table. Good luck." + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = -2 + + +/obj/structure/anvil/obtainable/table/do_shaping(mob/user, var/qualitychange) + if(prob(5)) + to_chat(user, "The [src] breaks under the strain!") + take_damage(max_integrity) + return FALSE + else + ..() + +/obj/structure/anvil/obtainable/sandstone + name = "sandstone brick anvil" + desc = "A big block of sandstone. Useable as an anvil." + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = -1 + +/obj/structure/anvil/obtainable/basalt + name = "basalt brick anvil" + desc = "A big block of basalt. Useable as an anvil, better than sandstone. Igneous!" + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = -0.5 + +/obj/structure/anvil/obtainable/basic + name = "anvil" + desc = "An anvil. It's got wheels bolted to the bottom." + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = 0 #undef WORKPIECE_PRESENT #undef WORKPIECE_INPROGRESS diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index cb95ae11b8..a03efc4496 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -1,9 +1,33 @@ //TODO: OBTAILABILITY, ANVIL TYPES, HAMMER TYPES, INGOTS +/* +sords: +broadsword [x] +gladius [x] +dirk [x] +zweihander [x] +sabre +rapier +scimitar +katana [x] +polearms: +halberd [x] +glaive [x] +javelin [x] +pike + +misc: +blacksmith's hammer [x] +scythe [x] +axe +coghead club +pickaxes [x] +*/ /obj/item/melee/smith name = "base class obj/item/melee/smith" //tin. handles overlay and quality and shit. + desc = "cringe" icon = 'icons/obj/smith.dmi' icon_state = "mace_greyscale" item_state = "mace_greyscale" @@ -19,7 +43,8 @@ /obj/item/melee/smith/Initialize() ..() - desc = "A handmade [name]." + if(desc == "cringe") + desc = "A handmade [name]." overlay = mutable_appearance(icon, overlay_state) overlay.appearance_flags = RESET_COLOR add_overlay(overlay) @@ -28,6 +53,7 @@ /obj/item/melee/smith/twohand + item_flags = NEEDS_PERMIT //it's a bigass sword/spear. beepsky is going to give you shit for it. wielded_mult = 1.75 @@ -129,6 +155,7 @@ /obj/item/melee/smith/axe name = "axe" + item_flags = NEEDS_PERMIT /obj/item/melee/smith/hammer//blacksmithing, not warhammer. name = "hammer" @@ -142,9 +169,11 @@ /obj/item/melee/smith/cogheadclub name = "coghead club" + item_flags = NEEDS_PERMIT /obj/item/melee/smith/shortsword name = "gladius" + item_flags = NEEDS_PERMIT icon_state = "gladius" overlay_state = "gladiushilt" @@ -152,5 +181,35 @@ name = "broadsword" icon_state = "broadsword" overlay_state = "broadhilt" - force = 15 + force = 11 wielded_mult = 1.8 + +/obj/item/melee/smith/twohand/zweihander + name = "zweihander" + icon_state = "zweihander" + overlay_state = "zweihilt" + force = 4 + wielded_mult = 3 + +/obj/item/melee/smith/twohand/katana + name = "katana" + icon_state = "katana" + overlay_state = "katanahilt" + force = 7 + wielded_mult = 2 + item_flags = ITEM_CAN_PARRY | UNIQUE_RENAME //want to name your katana "DEMON BLADE" or some shit? go ahead, idiot. + block_parry_data = /datum/block_parry_data/captain_saber + +//unique hammers +/obj/item/melee/smith/hammer/toolbox + name = "toolbox hammer" + desc = "A metal filled toolbox on a stick. Useable as a really shitty hammer." + w_class = WEIGHT_CLASS_BULKY + icon_state = "toolbox" + overlay_state = "hammerhandle" + qualitymod = -2 + +/obj/item/melee/smith/hammer/debug + name = "debugging hammer" + desc = "A DEBUGGING HAMMER!! EPIC!!." + qualitymod = 10 diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index ca12033447..e8c3c02378 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -23,7 +23,7 @@ /obj/item/smithing/Initialize() ..() - desc = "A [src]. Hit it with a [finishingitem] to create a [finalitem]." + desc = "A [src]. Hit it with a [finishingitem.name] to create a [finalitem.name]." /obj/item/smithing/attackby(obj/item/I, mob/user) @@ -234,6 +234,19 @@ finalitem = finalforreal ..() +/obj/item/smithing/katanablade + name = "smithed katana blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/twohand/katana + icon_state = "katana" + + +/obj/item/smithing/katanablade/startfinish() + var/obj/item/melee/smith/twohand/katana/finalforreal = new /obj/item/melee/smith/twohand/katana(src) + finalforreal.force += quality + finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalitem = finalforreal /obj/item/stick name = "wooden rod" @@ -244,6 +257,6 @@ /obj/item/swordhandle name = "sword handle" - desc = "It's a rod, suitable for use of a handle of a tool. Also could serve as a weapon, in a pinch." + desc = "It's a crudlely shaped wooden sword hilt." icon = 'icons/obj/smith.dmi' icon_state = "shorthilt" diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index 4893018b231d97d2b23055573315f4c6a70e97c0..e2a303112c383a3d67c372780f06b8b93a1a3d60 100644 GIT binary patch delta 2856 zcmV+@3)l3D8N?ZoBmtzcB})MbBOG%wjk+~YnUiw?RDX>@&xZg200DGTPE!Ct=GbNc z00B;VR9JLGWpiV4X>fFDZ*Bkpc$|%u&2GXl49CyyQ&ez86R=%(nT93~;}s^;q>V=! zSBYtXr(Z^=X*+;@i=|)uk-zQCtC!8&c2~W=Z_B~PgcPdh>gi!w79$#V*?3%+g|pZ? zo{Yr6Hh&*y5C-(KvM?A^wpV4*MCj~v{-utg!GOtGBch41KHQ=TN1S^4PGY@WtX7LZ z7ajP$jdFn6!?~kqMeqO&0px^7iiVm-1RZppjUv{1z(LNggW7&L2*%57>McYi>nXHK z^b-c_F(?by=ISW2L(d|)j|ArW`Z`qQ^fFphL4PW5J$TD37o9aXcuXpvKdeG@Fp)@> zXM_V>AO{yo18uA5;QGiOlAPh>PF3_Yiz*aDOA2N3mVwhvW$rDS+@ZPeBUlT_f z$A2f95MUt~z0#h6un{#vZ9{vak!!ED^`)(P_E0z}id+w(hi9wBm%|h3dyM?keP$O( zl$qz5-Dj6!{p2U2?96PwznN!dHj~*!h(s%8_vQC&KeRW{3DR~A>`8Asw0Cb12dRuz z0}6hzw5d0frY7WuT*@BMg6}26FrId4Kfv zogPOjt(pfqI`)U*H=W2@3}_wX_Vsn+05FIO$**n!(twITL<{H)koE7$YXD^n?57MU z`J*$?o6BPzU`vu;*#eXSHGdcbN(cE~Gk&3oAklFEH=yAUZb01xru8o;10_FYK*t}( zfZ{B@`%L-OW2m4EX!(r|G_Qpe27dzZI~so6fS%v@{XiCrA9H@?BF0xtgs|mkhAS*VGX0scATYr%1HGiGIXoWJc zLEc1D7}#*J*+Ra}jSS}V7p;&6e0V?boAI>Gz(#DnW*`?Ke@FvDY{HAJZ>?UoEC|tT zq|FRb)_*ty)FO}Gfd8#8LjJej=8vJ<)a)Fu{Ls>gBUB9hZ6#R;t-g8z#5=>mOf)3n zR2Uc>)EOumo#9|+C_0?LDt`)zKE2fJE7A*4*0{@_^Oe>~Aqyyl$Xuzv~J^#=U z>A*Jspj#@q$~4LEkPZ%JYz9yPy04BO900%L;0|o_7i1UErWYl@l-7Y|eu)3U0T;

Fy!d|4%8FtB7M|f}fhdNdAHwQ`P&T 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 From bb86003510d316be764109451c734c63a8635dbd Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 10:04:52 +1000 Subject: [PATCH 12/85] w e w --- .../crafting/recipes/recipes_misc.dm | 16 ++++ code/datums/materials/basemats.dm | 1 + .../objects/items/stacks/sheets/mineral.dm | 8 ++ .../items/stacks/sheets/sheet_types.dm | 2 + code/modules/smithing/anvil.dm | 4 +- code/modules/smithing/furnace.dm | 47 ++++++++++++ code/modules/smithing/smithed_items.dm | 76 ++++++++++++++++--- tgstation.dme | 1 + 8 files changed, 145 insertions(+), 10 deletions(-) create mode 100644 code/modules/smithing/furnace.dm diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index ee0a55c657..e662fa795f 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -130,7 +130,23 @@ subcategory = CAT_MISCELLANEOUS category = CAT_MISC +/datum/crafting_recipe/basaltblock + name = "Sintered Basalt Block" + result = /obj/item/basaltblock + time = 200 + reqs = list(/obj/item/stack/ore/glass/basalt = 50) + tools = list(TOOL_WELDER) + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC +/datum/crafting_recipe/basaltanvil + name = "Basalt Anvil" + result = /obj/structure/anvil/obtainable/sandstone + time = 200 + reqs = list(/obj/item/basaltblock = 5) + tools = list(TOOL_CROWBAR) + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC /////////////////// //Tools & Storage// /////////////////// diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 2e9c8efab7..cd996d337c 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -289,6 +289,7 @@ Unless you know what you're doing, only use the first three numbers. They're in name = "bronze" desc = "Clock Cult? Never heard of it." color = "#92661A" + strength_modifier = 1.1 categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/tile/bronze value_per_unit = 0.025 diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 7692278ba3..83ad9984c1 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -117,6 +117,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("diamond brick", /obj/item/ingot/diamond, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/diamond/get_main_recipes() @@ -145,6 +146,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20), \ new/datum/stack_recipe("Nuke Statue", /obj/structure/statue/uranium/nuke, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Engineer Statue", /obj/structure/statue/uranium/eng, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("uranium ingot", /obj/item/ingot/uranium, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/uranium/get_main_recipes() @@ -177,6 +179,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \ new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("plasma ingot", /obj/item/ingot/plasma, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/plasma/get_main_recipes() @@ -221,6 +224,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("RD Statue", /obj/structure/statue/gold/rd, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/crown, 5), \ new/datum/stack_recipe("CMO Statue", /obj/structure/statue/gold/cmo, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("gold ingot", /obj/item/ingot/gold, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/gold/get_main_recipes() @@ -252,6 +256,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("Sec Officer Statue", /obj/structure/statue/silver/sec, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Sec Borg Statue", /obj/structure/statue/silver/secborg, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Med Borg Statue", /obj/structure/statue/silver/medborg, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("silver ingot", /obj/item/ingot/silver, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/silver/get_main_recipes() @@ -278,6 +283,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("hilarious ingot", /obj/item/ingot/bananium, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/bananium/get_main_recipes() @@ -306,6 +312,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ GLOBAL_LIST_INIT(titanium_recipes, list ( \ new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \ + new/datum/stack_recipe("titanic ingot", /obj/item/ingot/titanium, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/titanium/get_main_recipes() @@ -353,6 +360,7 @@ GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ */ GLOBAL_LIST_INIT(adamantine_recipes, list( new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount=1, res_amount=1), + new/datum/stack_recipe("adamant ingot", /obj/item/ingot/adamantine, 6, time = 100), \ )) /obj/item/stack/sheet/mineral/adamantine diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 83ba5612a4..7c17703ae2 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -556,6 +556,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ new/datum/stack_recipe("forge", /obj/structure/destructible/cult/forge, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("archives", /obj/structure/destructible/cult/tome, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("altar", /obj/structure/destructible/cult/talisman, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("runic ingot", /obj/item/ingot/cult, 2, time = 100), \ )) /obj/item/stack/sheet/runed_metal @@ -680,6 +681,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("bronze ingot", /obj/item/ingot/bronze, 6, time = 100), \ )) /obj/item/stack/tile/bronze diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 80268bfa41..8c3890eb00 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -51,7 +51,8 @@ RECIPE_SMALLKNIFE = /obj/item/smithing/knifeblade, RECIPE_BROADSWORD = /obj/item/smithing/broadblade, RECIPE_HALBERD = /obj/item/smithing/halberdhead, - RECIPE_GLAIVE = /obj/item/smithing/glaivehead) + RECIPE_GLAIVE = /obj/item/smithing/glaivehead, + RECIPE_KATANA = /obj/item/smithing/katanablade) /obj/structure/anvil/Initialize() ..() @@ -204,6 +205,7 @@ /obj/structure/anvil/obtainable/sandstone name = "sandstone brick anvil" desc = "A big block of sandstone. Useable as an anvil." + custom_materials = list(/datum/material/sandstone=8000) icon = 'icons/obj/smith.dmi' icon_state = "anvil" anvilquality = -1 diff --git a/code/modules/smithing/furnace.dm b/code/modules/smithing/furnace.dm new file mode 100644 index 0000000000..205ccd189d --- /dev/null +++ b/code/modules/smithing/furnace.dm @@ -0,0 +1,47 @@ +/obj/structure/furnace + name = "furnace" + desc = "A furnace." + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + density = TRUE + anchored = TRUE + var/debug = FALSE //debugging only + var/working = TRUE + var/fueluse = 1 + + +/obj/structure/furnace/Initialize() + ..() + create_reagents(250, TRANSPARENT) + START_PROCESSING(SSobj, src) + +/obj/structure/furnace/Destroy() + ..() + STOP_PROCESSING(SSobj, src) + +/obj/structure/furnace/process() + if(debug) + reagents.add_reagent(/datum/reagent/fuel, 1) + return TRUE + if(reagents.remove_reagent(/datum/reagent/fuel, fueluse)) + working = TRUE + else + working = FALSE +/obj/structure/furnace/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/ingot)) + var/obj/item/ingot/notsword = I + if(working) + to_chat(user, "You heat the [notsword] in the [src].") + else + to_chat(user, "The furnace isn't working!.") + else + ..() + +/obj/structure/furnace/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I, 5) + return TRUE + +/obj/structure/furnace/infinite + name = "fuelless furnace" + debug = TRUE diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index e8c3c02378..a41c938482 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -1,5 +1,8 @@ - - +/obj/item/basaltblock + name = "basalt block" + desc = "A block of basalt." + icon = 'icons/obj/smith.dmi' + icon_state = "unfinished" /obj/item/smithing @@ -16,11 +19,66 @@ icon = 'icons/obj/smith.dmi' icon_state = "ingot" material_flags = MATERIAL_COLOR | MATERIAL_ADD_PREFIX - var/workability = "shapeable" + var/workability = "cold" + + +/obj/item/ingot/on_attack_hand(mob/user) + var/mob/living/carbon/human/H + if(!workability == "shapeable") + return ..() + var/prot = 0 + if(ishuman(user)) + H = user + if(H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(G.max_heat_protection_temperature) + prot = (G.max_heat_protection_temperature > 360) + else + prot = 1 + if(prot > 0 || HAS_TRAIT(user, TRAIT_RESISTHEAT) || HAS_TRAIT(user, TRAIT_RESISTHEATHANDS)) + to_chat(user, "You pick up the [src].") + return ..() + else + to_chat(user, "You try to move the [src], but you burn your hand on it!") + if(H) + var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") + if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage + H.update_damage_overlays() /obj/item/ingot/iron custom_materials = list(/datum/material/iron=12000) +/obj/item/ingot/diamond + custom_materials = list(/datum/material/diamond=12000) //yeah ok + +/obj/item/ingot/uranium + custom_materials = list(/datum/material/uranium=12000) + +/obj/item/ingot/plasma + custom_materials = list(/datum/material/plasma=12000)//yeah ok + +/obj/item/ingot/gold + custom_materials = list(/datum/material/gold=12000) + +/obj/item/ingot/silver + custom_materials = list(/datum/material/silver=12000) + +/obj/item/ingot/bananium + custom_materials = list(/datum/material/bananium=12000) + +/obj/item/ingot/titanium + custom_materials = list(/datum/material/titanium=12000) + +/obj/item/ingot/adamantine + custom_materials = list(/datum/material/adamantine=12000) + +/obj/item/ingot/cult + custom_materials = list(/datum/material/runedmetal=12000) + +/obj/item/ingot/bronze + custom_materials = list(/datum/material/bronze=12000) + + /obj/item/smithing/Initialize() ..() desc = "A [src]. Hit it with a [finishingitem.name] to create a [finalitem.name]." @@ -129,7 +187,7 @@ var/obj/item/melee/smith/twohand/javelin/finalforreal = new /obj/item/melee/smith/twohand/javelin(src) finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult - finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalforreal.throwforce = finalforreal.force*2 finalitem = finalforreal ..() @@ -202,7 +260,7 @@ var/obj/item/melee/smith/twohand/broadsword/finalforreal = new /obj/item/melee/smith/twohand/broadsword(src) finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult - finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal ..() @@ -216,7 +274,7 @@ finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.throwforce = finalforreal.force/3 - finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal ..() @@ -230,7 +288,7 @@ finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.throwforce = finalforreal.force - finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal ..() @@ -239,13 +297,13 @@ finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/twohand/katana icon_state = "katana" - + /obj/item/smithing/katanablade/startfinish() var/obj/item/melee/smith/twohand/katana/finalforreal = new /obj/item/melee/smith/twohand/katana(src) finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult - finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]_wield") + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal /obj/item/stick diff --git a/tgstation.dme b/tgstation.dme index ac09c11fd3..5ed22d673e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3263,6 +3263,7 @@ #include "code\modules\shuttle\shuttle_creation\shuttle_upgrades.dm" #include "code\modules\smithing\anvil.dm" #include "code\modules\smithing\finished_items.dm" +#include "code\modules\smithing\furnace.dm" #include "code\modules\smithing\smithed_items.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\aimed.dm" From 93fa8b72b89aa061cec7d9cfb206d2a84d013e4e Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 10:05:54 +1000 Subject: [PATCH 13/85] w e w --- code/modules/smithing/furnace.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/smithing/furnace.dm b/code/modules/smithing/furnace.dm index 205ccd189d..1046b40dae 100644 --- a/code/modules/smithing/furnace.dm +++ b/code/modules/smithing/furnace.dm @@ -32,6 +32,7 @@ var/obj/item/ingot/notsword = I if(working) to_chat(user, "You heat the [notsword] in the [src].") + notsword.workability = "shapeable" else to_chat(user, "The furnace isn't working!.") else From 8f5078a15a601e67c01840314de56661540d615b Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 14:47:47 +1000 Subject: [PATCH 14/85] Update mineral.dm --- code/game/objects/items/stacks/sheets/mineral.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 83ad9984c1..426958b99a 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -117,7 +117,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("diamond brick", /obj/item/ingot/diamond, 6, time = 100), \ +// new/datum/stack_recipe("diamond brick", /obj/item/ingot/diamond, 6, time = 100), \ not yet )) /obj/item/stack/sheet/mineral/diamond/get_main_recipes() @@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \ new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("plasma ingot", /obj/item/ingot/plasma, 6, time = 100), \ +// new/datum/stack_recipe("plasma ingot", /obj/item/ingot/plasma, 6, time = 100), \ no )) /obj/item/stack/sheet/mineral/plasma/get_main_recipes() From 8085ab01d96650e082beecbb36c2c8481fb2d92d Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 18 Aug 2020 15:38:59 +1000 Subject: [PATCH 15/85] culst! --- .../items/stacks/sheets/sheet_types.dm | 5 +++ .../antagonists/cult/cult_structures.dm | 9 ++++- code/modules/smithing/anvil.dm | 36 +++++++++++++++++ code/modules/smithing/finished_items.dm | 40 +++++++++++++++++++ code/modules/smithing/furnace.dm | 10 +++++ code/modules/smithing/smithed_items.dm | 4 ++ 6 files changed, 103 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 7c17703ae2..40cef1d2fd 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -556,7 +556,9 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ new/datum/stack_recipe("forge", /obj/structure/destructible/cult/forge, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("archives", /obj/structure/destructible/cult/tome, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("altar", /obj/structure/destructible/cult/talisman, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("anvil", /obj/structure/anvil/obtainable/narsie, 4, time = 40, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("runic ingot", /obj/item/ingot/cult, 2, time = 100), \ + new/datum/stack_recipe("rune smith's hammer", /obj/item/melee/smith/hammer/narsie, 6), \ )) /obj/item/stack/sheet/runed_metal @@ -619,6 +621,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ new/datum/stack_recipe("brass bar stool", /obj/structure/chair/stool/bar/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass stool", /obj/structure/chair/stool/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("brass anvil", /obj/structure/anvil/obtainable/ratvar, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ null, \ new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ @@ -630,6 +633,8 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \ null, \ new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/bottle/holyoil/empty), \ + new/datum/stack_recipe("brass smith's hammer", /obj/item/melee/smith/hammer/ratvar, 6), \ + new/datum/stack_recipe("brass ingot", /obj/item/ingot/bronze/ratvar, 6, time = 100), \ )) /obj/item/stack/tile/brass diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 5803941f36..a388621c92 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -174,7 +174,14 @@ new reward(get_turf(src)) to_chat(user, "You work the forge as dark knowledge guides your hands, creating the [choice]!") - +/obj/structure/destructible/cult/forge/attackby(obj/item/I, mob/user) + if(!iscultist(user)) + to_chat(user, "The heat radiating from [src] pushes you back.") + return + if(istype(I, /obj/item/ingot)) + var/obj/item/ingot/notsword = I + to_chat(user, "You heat the [notsword] in the [src].") + notsword.workability = "shapeable" /obj/structure/destructible/cult/pylon name = "pylon" diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 8c3890eb00..9bec834e29 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -202,6 +202,14 @@ else ..() +/obj/structure/anvil/obtainable/bronze + name = "slab of bronze" + desc = "A big block of bronze. Useable as an anvil." + custom_materials = list(/datum/material/bronze=8000) + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = -1 + /obj/structure/anvil/obtainable/sandstone name = "sandstone brick anvil" desc = "A big block of sandstone. Useable as an anvil." @@ -224,6 +232,34 @@ icon_state = "anvil" anvilquality = 0 +/obj/structure/anvil/obtainable/ratvar + name = "brass anvil" + desc = "A big block of what appears to be brass. Useable as an anvil, if whatever's holding the brass together lets you." + custom_materials = list(/datum/material/bronze=8000) + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = 1 + +/obj/structure/anvil/obtainable/ratvar/attackby(obj/item/I, mob/user) + if(is_servant_of_ratvar(user)) + return ..() + else + to_chat(user, "KNPXWN, QNJCQNW!") //rot13 then rot22 if anyone wants to decode + +/obj/structure/anvil/obtainable/narsie + name = "runic anvil" + desc = "An anvil made of a strange, runic metal." + custom_materials = list(/datum/material/runedmetal=8000) + icon = 'icons/obj/smith.dmi' + icon_state = "anvil" + anvilquality = 1 + +/obj/structure/anvil/obtainable/narsie/attackby(obj/item/I, mob/user) + if(iscultistr(user)) + return ..() + else + to_chat(user, "That is not yours to use!") + #undef WORKPIECE_PRESENT #undef WORKPIECE_INPROGRESS #undef WORKPIECE_FINISHED diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index a03efc4496..45ce53d630 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -209,6 +209,46 @@ pickaxes [x] overlay_state = "hammerhandle" qualitymod = -2 +/obj/item/melee/smith/hammer/narsie + name = "runemetal hammer" + custom_materials = list(datum/material/runedmetal = 12000) + desc = "A metal hammer inscribed with geometeric runes." + qualitymod = 1 + +/obj/item/melee/smith/hammer/narsie(mob/living/target, mob/living/carbon/human/user) + if(!iscultist(user)) + user.DefaultCombatKnockdown(100) + user.dropItemToGround(src, TRUE) + user.visible_message("A powerful force shoves [user] away from [target]!", \ + "\"You shouldn't be touching tools that aren't yours.\"") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + else + user.adjustBruteLoss(rand(force/2,force)) + return + ..() + +/obj/item/melee/smith/hammer/ratvar + name = "brass hammer" + custom_materials = list(datum/material/bronze = 12000) + desc = "A brass hammer inscribed with... writing? You can't read it." + qualitymod = 1 + +/obj/item/melee/smith/hammer/ratvar(mob/living/target, mob/living/carbon/human/user) + if(!is_servant_of_ratvar(user)) + user.DefaultCombatKnockdown(100) + user.dropItemToGround(src, TRUE) + user.visible_message("A powerful force shoves [user] away from [target]!", \ + "\""You shouldn't be touching tools that aren't yours.\"") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + else + user.adjustBruteLoss(rand(force/2,force)) + return + ..() + /obj/item/melee/smith/hammer/debug name = "debugging hammer" desc = "A DEBUGGING HAMMER!! EPIC!!." diff --git a/code/modules/smithing/furnace.dm b/code/modules/smithing/furnace.dm index 1046b40dae..4cc647353c 100644 --- a/code/modules/smithing/furnace.dm +++ b/code/modules/smithing/furnace.dm @@ -27,6 +27,7 @@ working = TRUE else working = FALSE + /obj/structure/furnace/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/ingot)) var/obj/item/ingot/notsword = I @@ -46,3 +47,12 @@ /obj/structure/furnace/infinite name = "fuelless furnace" debug = TRUE + + +/obj/structure/furnace/infinite/ratvar + name = "brass furnace" + desc = "A brass furnace. Powered by... something, but seems otherwise safe." //todo:sprites they're safe for noncultists because you're just putting ingots in them. also there';s a reason to steal them ig + +/obj/structure/furnace/infinite/narsie + name = "rune furnace" + desc = "A runed furnace. Powered by... something, but seems otherwise safe."//todo:sprites diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index a41c938482..8fa8e8e167 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -78,6 +78,10 @@ /obj/item/ingot/bronze custom_materials = list(/datum/material/bronze=12000) +/obj/item/ingot/bronze/ratvar + material_flags = MATERIAL_COLOR + name = "brass ingnot" + desc = "On closer inspection, what appears to be wholly-unsuitable-for-smithing brass is actually more structurally stable bronze. Ratvar must have transformed the brass into bronze. Somehow." /obj/item/smithing/Initialize() ..() From 1146ed0d1fdc977d198c5c5ed87441817474c0b9 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 13:12:51 +1000 Subject: [PATCH 16/85] is thsi it --- code/modules/smithing/finished_items.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 45ce53d630..1c8711aa2b 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -239,8 +239,7 @@ pickaxes [x] if(!is_servant_of_ratvar(user)) user.DefaultCombatKnockdown(100) user.dropItemToGround(src, TRUE) - user.visible_message("A powerful force shoves [user] away from [target]!", \ - "\""You shouldn't be touching tools that aren't yours.\"") + user.visible_message("A powerful force shoves [user] away from [target]!", "\""You shouldn't be touching tools that aren't yours.\"") if(ishuman(user)) var/mob/living/carbon/human/H = user H.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) From 2a3ada511e058d38e6ddc832657d2e44a32ce43c Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 16:51:55 +1000 Subject: [PATCH 17/85] It's all codersprites? Always has been. --- .../crafting/recipes/recipes_clothing.dm | 10 ++ code/game/objects/items/storage/belt.dm | 17 ++- code/modules/smithing/anvil.dm | 34 +++--- code/modules/smithing/finished_items.dm | 113 +++++++++++++----- code/modules/smithing/furnace.dm | 21 +++- code/modules/smithing/smithed_items.dm | 54 +++++++-- icons/obj/clothing/belts.dmi | Bin 13239 -> 13508 bytes icons/obj/smith.dmi | Bin 3268 -> 14133 bytes 8 files changed, 180 insertions(+), 69 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index 2a24c0b451..8c02d96dec 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -263,6 +263,16 @@ time = 30 category = CAT_CLOTHING +/datum/crafting_recipe/twinsheath + name = "Twin Sword Sheath" + result = /obj/item/storage/belt/sabre/twin + reqs = list(/obj/item/stack/sheet/wood = 3, + /obj/item/stack/sheet/leather = 8) + tools = list(TOOL_WIRECUTTER) + time = 70 + category = CAT_CLOTHING + + /datum/crafting_recipe/durathread_reinforcement_kit name = "Durathread Reinforcement Kit" result = /obj/item/armorkit diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3c554aa58e..76f87adc6a 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -492,7 +492,7 @@ icon_state = "grenadebeltnew" item_state = "security" rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE - + /obj/item/storage/belt/grenade/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) @@ -815,3 +815,18 @@ attack_verb = list("bashed", "slashes", "prods", "pokes") fitting_swords = list(/obj/item/melee/rapier) starting_sword = /obj/item/melee/rapier + +/obj/item/storage/belt/sabre/twin + name = "twin sheath" + desc = "Two sheaths. One is capable of holding a katana (or bokken) and the other a wakizashi. You could put two wakizashis in if you really wanted to. Now you can really roleplay as a samurai." + icon_state = "twinsheath" + item_state = "quiver" //this'll do. + w_class = WEIGHT_CLASS_BULKY + var/list/fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken) + starting_sword = null + +/obj/item/storage/belt/sabre/twin/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 2 + STR.max_w_class = WEIGHT_CLASS_BULKY + WEIGHT_CLASS_NORMAL //katana and waki. diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 9bec834e29..c0f951879d 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -7,12 +7,13 @@ #define RECIPE_LARGEPICK "ddbp" //draw draw bend punch #define RECIPE_SHOVEL "dfup" //draw fold upset punch #define RECIPE_HAMMER "sfp" //shrink fold punch -#define RECIPE_AXE "ufp" //upset fold punch #define RECIPE_SMALLKNIFE "sdd" //shrink draw draw #define RECIPE_SHORTSWORD "dff" //draw fold fold +#define RECIPE_SCIMITAR "dfb" //draw fold bend #define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw +#define RECIPE_ZWEIHANDER "udfsf" //upset draw fold shrink fold #define RECIPE_KATANA "fffff" //fold fold fold fold fold @@ -23,6 +24,7 @@ #define RECIPE_JAVELIN "dbf" //draw bend fold #define RECIPE_HALBERD "duffp" //draw upset fold fold punch #define RECIPE_GLAIVE "usfp" //upset shrink fold punch +#define RECIPE_PIKE "ddbf" //draw draw bend fold /obj/structure/anvil name = "anvil" @@ -39,8 +41,7 @@ var/outrightfailchance = 1 //todo: document this shit var/stepsdone = "" var/rng = FALSE - var/list/smithrecipes = list(RECIPE_AXE = /obj/item/smithing/axehead, - RECIPE_HAMMER = /obj/item/smithing/hammerhead, + var/list/smithrecipes = list(RECIPE_HAMMER = /obj/item/smithing/hammerhead, RECIPE_SCYTHE = /obj/item/smithing/scytheblade, RECIPE_SHOVEL = /obj/item/smithing/shovelhead, RECIPE_COGHEAD = /obj/item/smithing/cogheadclubhead, @@ -48,11 +49,14 @@ RECIPE_LARGEPICK = /obj/item/smithing/pickaxehead, RECIPE_SMALLPICK = /obj/item/smithing/prospectingpickhead, RECIPE_SHORTSWORD = /obj/item/smithing/shortswordblade, + RECIPE_SCIMITAR = /obj/item/smithing/scimitarblade, RECIPE_SMALLKNIFE = /obj/item/smithing/knifeblade, RECIPE_BROADSWORD = /obj/item/smithing/broadblade, + RECIPE_ZWEIHANDER = /obj/item/smithing/zweiblade, + RECIPE_KATANA = /obj/item/smithing/katanablade, RECIPE_HALBERD = /obj/item/smithing/halberdhead, RECIPE_GLAIVE = /obj/item/smithing/glaivehead, - RECIPE_KATANA = /obj/item/smithing/katanablade) + RECIPE_PIKE = /obj/item/smithing/pikehead) /obj/structure/anvil/Initialize() ..() @@ -172,7 +176,6 @@ /obj/structure/anvil/debugsuper name = "super ultra epic anvil of debugging." desc = "WOW. A DEBUG ITEM STRUCTURE. EPIC." - icon = 'icons/obj/smith.dmi' icon_state = "anvil" anvilquality = 10 outrightfailchance = 0 @@ -180,8 +183,6 @@ /obj/structure/anvil/obtainable name = "anvil" desc = "Base class of anvil. This shouldn't exist, but is useable." - icon = 'icons/obj/smith.dmi' - icon_state = "anvil" anvilquality = 0 outrightfailchance = 5 rng = TRUE @@ -189,7 +190,6 @@ /obj/structure/anvil/obtainable/table name = "table anvil" desc = "A slightly reinforced table. Good luck." - icon = 'icons/obj/smith.dmi' icon_state = "anvil" anvilquality = -2 @@ -206,38 +206,32 @@ name = "slab of bronze" desc = "A big block of bronze. Useable as an anvil." custom_materials = list(/datum/material/bronze=8000) - icon = 'icons/obj/smith.dmi' - icon_state = "anvil" + icon_state = "ratvaranvil" anvilquality = -1 /obj/structure/anvil/obtainable/sandstone name = "sandstone brick anvil" desc = "A big block of sandstone. Useable as an anvil." custom_materials = list(/datum/material/sandstone=8000) - icon = 'icons/obj/smith.dmi' - icon_state = "anvil" + icon_state = "sandvil" anvilquality = -1 /obj/structure/anvil/obtainable/basalt name = "basalt brick anvil" desc = "A big block of basalt. Useable as an anvil, better than sandstone. Igneous!" - icon = 'icons/obj/smith.dmi' - icon_state = "anvil" + icon_state = "sandvilnoir" anvilquality = -0.5 /obj/structure/anvil/obtainable/basic name = "anvil" desc = "An anvil. It's got wheels bolted to the bottom." - icon = 'icons/obj/smith.dmi' - icon_state = "anvil" anvilquality = 0 /obj/structure/anvil/obtainable/ratvar name = "brass anvil" desc = "A big block of what appears to be brass. Useable as an anvil, if whatever's holding the brass together lets you." custom_materials = list(/datum/material/bronze=8000) - icon = 'icons/obj/smith.dmi' - icon_state = "anvil" + icon_state = "ratvaranvil" anvilquality = 1 /obj/structure/anvil/obtainable/ratvar/attackby(obj/item/I, mob/user) @@ -251,11 +245,11 @@ desc = "An anvil made of a strange, runic metal." custom_materials = list(/datum/material/runedmetal=8000) icon = 'icons/obj/smith.dmi' - icon_state = "anvil" + icon_state = "evil" anvilquality = 1 /obj/structure/anvil/obtainable/narsie/attackby(obj/item/I, mob/user) - if(iscultistr(user)) + if(iscultist(user)) return ..() else to_chat(user, "That is not yours to use!") diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 1c8711aa2b..8f0bb99036 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -1,29 +1,3 @@ -//TODO: OBTAILABILITY, ANVIL TYPES, HAMMER TYPES, INGOTS - -/* -sords: -broadsword [x] -gladius [x] -dirk [x] -zweihander [x] -sabre -rapier -scimitar -katana [x] - -polearms: -halberd [x] -glaive [x] -javelin [x] -pike - -misc: -blacksmith's hammer [x] -scythe [x] -axe -coghead club -pickaxes [x] -*/ /obj/item/melee/smith name = "base class obj/item/melee/smith" //tin. handles overlay and quality and shit. @@ -32,6 +6,9 @@ pickaxes [x] icon_state = "mace_greyscale" item_state = "mace_greyscale" material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON //yeah ok + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_NORMAL force = 10 lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' @@ -55,7 +32,7 @@ pickaxes [x] /obj/item/melee/smith/twohand item_flags = NEEDS_PERMIT //it's a bigass sword/spear. beepsky is going to give you shit for it. wielded_mult = 1.75 - + w_class = WEIGHT_CLASS_BULKY /obj/item/melee/smith/twohand/ComponentInitialize() . = ..() @@ -125,6 +102,7 @@ pickaxes [x] name = "halberd" icon_state = "halberd" overlay_state = "spearhandle" + slot_flags = ITEM_SLOT_BACK /obj/item/melee/smith/twohand/halberd/ComponentInitialize() . = ..() @@ -135,6 +113,7 @@ pickaxes [x] icon_state = "javelin" overlay_state = "longhandle" wielded_mult = 1.5 + slot_flags = ITEM_SLOT_BACK /obj/item/melee/smith/twohand/javelin/ComponentInitialize() @@ -145,17 +124,24 @@ pickaxes [x] name = "glaive" icon_state = "glaive" overlay_state = "longhandle" + slot_flags = ITEM_SLOT_BACK /obj/item/melee/smith/twohand/glaive/ComponentInitialize() . = ..() AddComponent(/datum/component/jousting) + + +/obj/item/melee/smith/twohand/pike + name = "pike" + icon_state = "pike" + overlay_state = "longhandle" + reach = 2 //yeah ok + slot_flags = ITEM_SLOT_BACK + ////////////////////////// // Other Melee // /////////////////////////// -/obj/item/melee/smith/axe - name = "axe" - item_flags = NEEDS_PERMIT /obj/item/melee/smith/hammer//blacksmithing, not warhammer. name = "hammer" @@ -169,7 +155,9 @@ pickaxes [x] /obj/item/melee/smith/cogheadclub name = "coghead club" + icon_state = "coghead" item_flags = NEEDS_PERMIT + overlay_state = "stick" /obj/item/melee/smith/shortsword name = "gladius" @@ -177,11 +165,37 @@ pickaxes [x] icon_state = "gladius" overlay_state = "gladiushilt" +/obj/item/melee/smith/shortsword/scimitar + name = "scimitar" + icon_state = "scimitar" + overlay_state = "scimitarhilt" + +/obj/item/melee/smith/wakizashi + name = "wakizashi" + item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY + icon_state = "waki" + overlay_state = "wakihilt" + block_parry_data = /datum/block_parry_data/waki + +/datum/block_parry_data/waki //like longbokken but worse reflect + parry_stamina_cost = 6 + parry_time_windup = 0 + parry_time_active = 15 //decent window + parry_time_spindown = 0 + parry_time_perfect = 2 + parry_time_perfect_leeway = 0.75 + parry_imperfect_falloff_percent = 7.5 + parry_efficiency_to_counterattack = 100 + parry_efficiency_considered_successful = 80 + parry_efficiency_perfect = 120 + parry_failed_stagger_duration = 3 SECONDS + parry_data = list(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1.9) + /obj/item/melee/smith/twohand/broadsword name = "broadsword" icon_state = "broadsword" overlay_state = "broadhilt" - force = 11 + force = 9 wielded_mult = 1.8 /obj/item/melee/smith/twohand/zweihander @@ -189,7 +203,7 @@ pickaxes [x] icon_state = "zweihander" overlay_state = "zweihilt" force = 4 - wielded_mult = 3 + wielded_mult = 3 //affected more by quality. a -1 is 25% less damage, a +1 is 25% more. These bonuses are tripled when wielded. /obj/item/melee/smith/twohand/katana name = "katana" @@ -198,7 +212,40 @@ pickaxes [x] force = 7 wielded_mult = 2 item_flags = ITEM_CAN_PARRY | UNIQUE_RENAME //want to name your katana "DEMON BLADE" or some shit? go ahead, idiot. - block_parry_data = /datum/block_parry_data/captain_saber + block_parry_data = /datum/block_parry_data/captain_saber //todo + +/obj/item/melee/smith/sabre + name = "sabre" + icon_state = "sabre" + overlay_state = "sabrehilt" + armour_penetration = 15 + force = 9 + hitsound = 'sound/weapons/rapierhit.ogg' + item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY + block_parry_data = /datum/block_parry_data/captain_saber //yeah this is fine i guess + +/obj/item/melee/smith/sabre/rapier + name = "rapier" + icon_state = "rapier" + overlay_state = "rapierhilt" + force = 6 //less force, stronger parry + armour_penetration = 30 + block_parry_data = /datum/block_parry_data/smithrapier + +/datum/block_parry_data/smithrapier //parry into riposte. i am pretty sure this is going to be nearly fucking impossible to land. + parry_stamina_cost = 12 //dont miss + parry_time_active = 4 + parry_time_perfect = 2 + parry_time_perfect_leeway = 2 + parry_failed_stagger_duration = 3 SECONDS + parry_failed_clickcd_duration = 3 SECONDS + parry_time_windup = 0 + parry_time_spindown = 0 + parry_imperfect_falloff_percent = 0 + parry_efficiency_to_counterattack = 100 + parry_efficiency_considered_successful = 120 + parry_efficiency_perfect = 120 + parry_data = list(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 4) //unique hammers /obj/item/melee/smith/hammer/toolbox diff --git a/code/modules/smithing/furnace.dm b/code/modules/smithing/furnace.dm index 4cc647353c..ee1d6a1b93 100644 --- a/code/modules/smithing/furnace.dm +++ b/code/modules/smithing/furnace.dm @@ -2,7 +2,7 @@ name = "furnace" desc = "A furnace." icon = 'icons/obj/smith.dmi' - icon_state = "anvil" + icon_state = "furnace0" density = TRUE anchored = TRUE var/debug = FALSE //debugging only @@ -25,8 +25,11 @@ return TRUE if(reagents.remove_reagent(/datum/reagent/fuel, fueluse)) working = TRUE + if(icon_state == "furnace0") + icon_state = "furnace1" else working = FALSE + icon_state = "furnace0" /obj/structure/furnace/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/ingot)) @@ -44,9 +47,23 @@ default_unfasten_wrench(user, I, 5) return TRUE +/obj/structure/furnace/attackby(obj/item/W, mob/user, params) + if(W.reagents) + W.reagents.trans_to(src, 250) + else + return ..() + +/obj/structure/furnace/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + to_chat(user, "You start furiously plunging [name].") + if(do_after(user, 30, target = src)) + to_chat(user, "You finish plunging the [name].") + reagents.reaction(get_turf(src), TOUCH) //splash on the floor + reagents.clear_reagents() + /obj/structure/furnace/infinite name = "fuelless furnace" debug = TRUE + icon_state = "ratfurnace" /obj/structure/furnace/infinite/ratvar @@ -55,4 +72,4 @@ /obj/structure/furnace/infinite/narsie name = "rune furnace" - desc = "A runed furnace. Powered by... something, but seems otherwise safe."//todo:sprites + desc = "A runed furnace. Powered by... something, but seems otherwise safe." diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 8fa8e8e167..e078871b2e 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -124,18 +124,6 @@ mat = mat.name finalitem.name = "[qualname] [mat] [finalitem.name]" finalitem.forceMove(get_turf(src)) - qdel(src) - - -/obj/item/smithing/axehead - name = "smithed axe head" - finalitem = /obj/item/melee/smith/axe - - -/obj/item/smithing/axehead/startfinish() - finalitem = new /obj/item/melee/smith/axe(src) - finalitem.force += quality - ..() /obj/item/smithing/hammerhead name = "smithed hammer head" @@ -176,6 +164,7 @@ /obj/item/smithing/cogheadclubhead name = "smithed coghead club head" finalitem = /obj/item/melee/smith/cogheadclub + icon_state = "coghead" /obj/item/smithing/cogheadclubhead/startfinish() finalitem = new /obj/item/melee/smith/cogheadclub(src) @@ -196,6 +185,19 @@ finalitem = finalforreal ..() +/obj/item/smithing/pikehead + name = "smithed pike head" + finalitem = /obj/item/melee/smith/twohand/pike + icon_state = "pike" + +/obj/item/smithing/pikehead/startfinish() + var/obj/item/melee/smith/twohand/pike/finalforreal = new /obj/item/melee/smith/twohand/pike(src) + finalforreal.force += quality + finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") + finalforreal.throwforce = finalforreal.force/10 //its a pike not a javelin + finalitem = finalforreal + ..() /obj/item/smithing/pickaxehead name = "smithed pickaxe head" @@ -233,7 +235,7 @@ /obj/item/smithing/shortswordblade - name = "smithed shortsword blade" + name = "smithed gladius blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/shortsword icon_state = "gladius" @@ -243,6 +245,18 @@ finalitem.force += quality ..() +/obj/item/smithing/scimitarblade + name = "smithed scimitar blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/shortsword/scimitar + icon_state = "scimitar" + +/obj/item/smithing/shortswordblade/startfinish() + finalitem = new /obj/item/melee/smith/shortsword/scimitar(src) + finalitem.force += quality + ..() + + /obj/item/smithing/knifeblade name = "smithed knife blade" finishingitem = /obj/item/swordhandle @@ -268,6 +282,20 @@ finalitem = finalforreal ..() +/obj/item/smithing/zweiblade + name = "smithed zweihander blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/twohand/zweihander + icon_state = "zweihander" + +/obj/item/smithing/zweiblade/startfinish() + var/obj/item/melee/smith/twohand/zweihander/finalforreal = new /obj/item/melee/smith/twohand/zweihander(src) + finalforreal.force += quality + finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult + finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") + finalitem = finalforreal + ..() + /obj/item/smithing/halberdhead name = "smithed halberd head" finalitem = /obj/item/melee/smith/twohand/halberd diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index c106bd12fcfd9e39ad4d5b4edd7a756e0d00ffb3..1a98872463e35d2e90654f007135675470d21af1 100644 GIT binary patch literal 13508 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 diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index e2a303112c383a3d67c372780f06b8b93a1a3d60..0af21125927745304449f77ffc8db7dc2349ce22 100644 GIT binary patch literal 14133 zcmZ8|Wk6I<)c0MM?vR!e1VoW8iCv`;0Rct2MLGqfcIgg92@w|*1w=x+J4BFHx|Rls zB^OxO_ws+9=ga$LcXsZbGbd)wIdguqv3fe{ROD>r002;FYN+S~00eA808(P`%gn3b zIrt+#!0?%mioLh3m!pS|qq`db_i>JL+oD{a3zDgc&qVdb*=qi>J=4m0W?0TZj53lAI?!Qh)I1!FvkTL9Qjd8S=N6E#u<`cMd!wiB zd_H0Psx(V4So$fR>o=NlFlag2Df1Sh7B2eK=K3P9`?nR$3uyT?GAPRA1g9}4JgtSL z=h#Nd`Ql2vQkX`}X#_Nfmj04UqrwMYu86gR0!_~Na=od!=Cwkfsubg|UPfvWom zz#j7BC7-ebR_43thS-mGyZG3dQEeihH9XuDJCw)1@rsf(AdLL&7HLpY2woJT+weO( zKg37GJ+KC$IEH|bVeQzY1Hx+ofE&h=f^izW>UO7 zQ|HYh@w`8$MzyO{vzJFL*s--TudAzT867Xu9m^oVmv}yQ;GC_!R+{{sGGnkmUGSZj zjU-#{(;`S2C0v{keKHxFUsQbX=PO@moMrx~CfiBj+W4DyCwSJ>lAm39x4l%8YkW5J zTlzf;u(ySTusy`@Aj>N&avU!nKYpxH|4sg5@Uij!`sZXXq%1oB*>Bab=t(|jU zYx(0u1gNO0hCYXSWg?5Pk;Sl9C*TuLH5STqlx~VUZ;@|}hl$Clierq7j1CY`WZ6UR zn})b+Mi{6C3*5qj({ubR`kv2=_^+3_Ni&Z4%U$Y)A>FPWCSU~8qz5T%@h0dc#s*fH~IXO8koSBvJ)?jHa3=@=L zjJ6|;b)Vu<<*yE&yY;0BH)0{&ii#XaUIx(Y&&us$`S?ZkFwpzYfrh`=H13v{my3%( z?`J7#Y`lK+=FK2FS`Ry@ByWbeecV_BKZRHRMRbTzH^#O{bR*78yLpFAvr{*hAD*km zE#=#gT~tu8ZiIu=vbMH8D$?{ayYqCQ>4`qW&!0bmh4r;$F4#vAU?h!;)?wB3^N-&f zH8AcPY-I3d@3?t*w2>lzCiYgAjQi^T!9m?8zw2u727+sabgBdTr#Mg^4{`@T$T1*4o5CN#cNXu%mnmCcS|C~UFzz!4 zR5o|(*k~Hd&C_VA^705lebGL>sHmub_&AWa#e6{PYU_mNHs`9NEOjsj((ZHpk6-Uj zR*)crX2a%4*Y6^o`&#@rye69u)wzP-npVD`Ls8W#A$DfuP(3bHmFGcOA8*uPH^waF z&T!C3Hi%THuxT~+H)R`A3NYE51_i826fUpA?c}fmt{0&T{lGFUJ}!(TRu4Bl7xeJ2 zQj35d!yYpRO3#91nMEG;tug?zdL~Iz-AvzSF|qSOIXj@%7o3Tj^VGWILzn6C6oZOT z<>2sC>_zS%Ob@4tL&gwu|Fz3CcP9TSB{wPirS!xZLvem-6Jx2fOpgc&QDVB-Xc6JRaQT^yAJah1kON$kD)yAA?*P{`LU0 zZm4IR8TuGAs?-9DZz(HF5yb=!Zc%7q+5LwqQE~Hn^R1n`%Chb|WE0~@fFahV5*NxH z(&~B9GJ%$P?XT~Ea5_j_TwMYqoL5lsk!fTxL=DfJBDnGL zrEG``v^f8N6L<0tjfC8yjpGFF2(Qs8O3rOajZua{tc@0E7zWVAyd9a?-~>wxioMO% z^xm7EKeTaoYvTfYMij*T%=btwNVESbn+8R*#`uY}=tXi7<=kr8av$$m*LBASo^cxa z7T@C5JYs}MjP>kMwJ*XzN3qazY939>8vc3E8t!*PSV#!{0x^G7({NH7nCQX&;A%v# z=Z_FrZ}ei|=GNgevCH|Osoj!N)Y}Z??RF)5{sra6`kNUnqk$VoxbG`8kHBq^biV61 z`r|zJ9?K^C%<+-sRnPY`ud(rsm5HvLyg@ej~tchuDGJZeT z*Vk|F9%cnHAQ9J|S7aI*8e(U&9hF1hyrBmlJ?MX4VVNl+fuy}Jc&TSz`0TEhmX?N= z7P(q7=eBRGn;b}mKorwQ!iZ1dQ68F_5<1yAM6$wDIyyzTO3>q5M;9f31f=?bFc$uh zQ&K_<6l^kGHLv~Gq`zwNT{VLSKt~um_V8`Pr>8}7{2?1;k{D=6z{4`QYE7`PoSwv{fgIvE-oj27En`RITT=ju*awq{idHdeaSqn7C*~6nuI_Bnj*hFSM`;9xvRzb z5d_jY-=1BC3sr4pL(Vv!T)F9j`6mC1@>4?i&)Gh)XPq>JFPPywm07;>4>t1r?8n~| zcsU5MAcXL-?a4SoVh+D4fNmos)@3&p}-cw&um`_j0A=x75pU*)Q!3c zg>d`0n-6q~Bw}H6k`K#yww0)IJZ6PMJWuHBOf9T&dWBvMH?G0Bo5{3pg*B&qUMc-9 zsp*Tmcn)y6zgJzxiGwaGcLZJM1(L^ zhfVuqW5@Q_sI0x^Spz=&jb)t%8aES;ee`_QS0rkgcV$h_*pWaHFRdi`=s3P8?;8F> zB&1FACC*J9LOwqGfIl&|J6D|IJ)7&Zi|%or@%>+lQwubW^{4h;nr7dZ(aawaz|h!> z)Eh1+joE#QWJ~P;JAj?*y;=+_k8ntxIy){D^r9O2!I8^LxRNz4#+K`>1=nlkFTbi~ zy)Z_O{(?ttx$$&T8nU>S$6D@aDtYyskSv=NPjU^w} zG?t+LV_VJxLJDCd2wD8HO3BjhFi}dyiUT^GIlwyk14>yi&N61KXOI~JgS{YJIKO7g z{Zm+}Zt0w&2KFQL^U0HxGw+lG+yTk*y^u*Gl4BA~@5>Ph7BAigh$u#kWuGStGNelX z$4QDoDV&F)+>FvrIxAKuzXMG5mPrS#MDKFfLG&y4B8riZpSKg|p*_PRX(*Aguu5w*jTr{Y$p$wz&NT20|DPV0s~%*p9UA`}P2-w@ zg<9g^TpdWzYt+ttS1uj@3<{nghOXm}YpxVF0Lr5}UX$o8XuL^w2)hSYO9y|wl9H~*vhfV?D@ zq_O44&uW~izYE*y>(dLUP9d7h`K-!;TN$UF`7@p0HBfgsN7e-42!3wHEEq1u+3jKL zDh-TM4g-a!mT-2A&|^m1f;BkAu0NJeoF60XMAtpq_1Kuihn~Quy0zi0{Q^oWL3RE= zk!}uW=-)+s|63JZ#(n<1{HzOnk(@zHkYa zm9E{_tOnOBE}x6|bNb;uiM_h>KA)v8O_=^g;_KH+wQ)DvD3OcIZ<$-vfrUMh{12QC zXlCZ;0Hqq~l8h99SQ{%eSl(Og09WkdF0-inoWkFGVhT1ZGp1y~RixSej8zZL6O&7 z%?XtGZcl~Sib3~y#t7#S_+S7$`B`Yh*!T^HypdI4`1@5&ySGV!FXY!fo6) z&oz(03ugvh*!{!%woGet7l;GlZE#BBa2Mf0(1vxX0=l27su<^k4yd&G8J>QB2C0~& zEc(MXCX62Mf~8KoeT;M0eVX&fuCuf!Nm;@-Y^LGnEuS~ZEiqg`Nz-wF8@}dT?DVYH zO(HZ$6c7qZRD&j}@fOk9+1Yu3Q!B3i&g%J{EuTJJ?aE%#e71=+5ualJx@<9U;Zc6Q zn4gzA_-RbZ*MKopap%V92xa1qi2-*}o7U{w31Kc-UVh%aOgNk!sfSIs2)G3vuT$Q= zBg&=w`NPtCZD6GZhrsE0rhQ1Jb`ioN|!d`n9T3N_etwpk>L zxK#M``E&RbA(M#t01AgN-VqH|?n#RG?f>6{Gvnl7rR>jHwa2dmX7LO?P()jw4C(-2@X8-(H_O-Qr+NdpTS)MYq6e+Br+ zIRUb-_W6KX*X`T4Z(B>UL0Uy3Me@MtUiL7i$rc=BXQ*{UXJhN}^u&$Rmq%OazXiZE zcr9X;N_O0ZEF-N&hF~*_o7volZfZI^orIci(E#L6C;OhNS|Zz@t;@S6l`*=R;4*xa zq@;$YR=qltjW63R!5!=Fpz{gi!OXZ10E=I@Z$r2jB1D#la+U2y@-*E}0?!UNbS~_R zpZ4Li-@GAcvPjmG2n)}8$^ewd!zNhts1|w~@_#<91a}OYnoB96Bbw$QnKe4vDSg=%*JHB_IWU18l5Acn6`gw4C&KVq zTmnq403Sb+J4_T{W*a3d2&jL9nS5?v{3XpFl9^*vk@%}0X;B(&QMx9eAcm3X49il` zzYmIB{ub3ndjDDn+E5!usTPAiVTOvaP-6DZ*~3JyzBev_olHC#1UX(a&vtD#R@Hmw zr1$N#jGx=#=7AMvC6S99`<=pL5U2ZdC~N~jrct3t8p-aw_l9M99C>smw_Hn4;@J8l zox}-CI=HFsxg1@=iHf+>+=wB0P`_bL0Q?a zk$!5TVC@PFh&i}b%6~EmtsrBy4wnLadXE-<(m04gS|7{m@VlGvEcW)GNuCDzkw%ur z=@0-DcZdrZysau&R0c^S+LM!#h=FH!nDV}UZMXU1|Bf!kOSjcZG?dJU#_xkH>_eB) z#8Q^)4=jYiGNx$Hl?m#?1pV};hxd*eg|j)C;jkvoyIGpRXmOPFQ(<9YOk(0yVH5OZ zr)vsgVfWcvx2D}!%qjqGS#7J$H?BmE9kvq?B?a zSJxS^aUftQX(5N#Ak!6p5Hh~|0}a?+|Ly~LG&YkC8Eu>gUA*QR_!RsMdSd}g?^px{ zu#0!3|4na?5kMAD`Nedz-A|Y;cRYorEOB&cnz9VRq=0Cy$W4tgKX&!^c-qG1Zb80-5mb zNv)u2ynKH~Q1-Ozg^5r964U&6h{zw_Z%e;eOY=t+jFCcN3 zwxj7zGYKZO%4E#^nLp7wlcMX9`4*()B4DaK(1ec=Sd!xy85zkL-2ebbN5`NRRP|ZO z5ilO2=sKw=Oh4ipUoUNi;D?{CQ6zgHLa?V6MQ2SfsX8NcR3IM=@HFGitH(!&5sls} zDC{_>E}8*~k>R#(#Ky1u*8%z7(v<>oA870PsZr27mz4tsUTX}zeCadr~vY=mU`Y}Qk(m?)wh4C&FN0YG-2+zDFIm`|I?ybib5DDyfaW z@>6|aayzGVTl8g?Mnhfb{FNiNv9$$JwcOE-p_!R~V^h#|F*Z2Y=Z(gO8$7|uTh5Ww z>Hk82cI})Wwcp1V;fo%qvfa|s5!>He2q@54{+!~g@P|p~^jw(IG@hf`Kal3~w4GPy zoV)R?f0p)*^VB5!4>3j4TZ_j5>~U-wK~tOLrk3gy6Xu=t63q?%h6z51&Lmwq$qpna z!hz?lkDWC;!rYQj()dAOsu(~H{3VX)a)75^8@G)~W+Ha%nx8d;Sbv+hCYXBvQlrto z(LmZtA-^Mdx0hlyZD6VivIewp(v*&CfG=0leTJO2%>`gXk zs8%pY@AnDJbVgtv)?A@Jq+ZQf)B)&C^8R?^=UAHY%t>@ z)rk}eUZU-%FT_WXF@m6Vko>m>ia^zxN0SBJ=3>qI`}uZGuf~!=2%vL;Fxfl!s-a=2 zZW@%+ASn2cTvA3R-W2N5HHtwjs$@@k?+82?{`;|*Fiv4Ux|tvHYTEKBqS=O$@ABdE zn<%gR`B9>KC66!a38GLEVif~yV;G2RSH3@cOG!0TFY{l!e=e@bVcISSh??@}9@Phn z&Nlk=w4C9brJwQRD8W#j@r24sNnl{<67JWxt@%1diT_%i^DMHNn0CX4TP!CmTX8Mq z&6~{jngwVkm4@nWy|57&t~RT^KET#2B(n~Kev!%6w6?zuikwPH|J(fcvju!~aL(qC z3-+Za)-wAfVF~}K=dQxjNM%5OSNpz8f0NF%6(%rwesZeS0g}BoC}&UD+8P&8f+iWV zjmp`3c_;(qUp9LXb1`ng<06`3=Z}8fA73NbOtUh?ebk10MWZ|}o?HwF&{8iBqv?he z(;6?b{QFxL8&k24JlYfDZRdeap-2CWMevuRl$$djF`i0(S!ZkFez{Y&!V_0WqK zDlGI^Is$9Yl=q>U^9y_-e(io;*>t2^(DvIG$eo?AGFib!$!D@A3qnC5h`%spk;@c3OP!ZAWX{RzsK z@j7Ejw(ar)0T{V_GCXp-beHC#hj)XF%o36Bfg$sa{8<8{f{94wuu2{7Yf3j4D3Ql& z8-%%`;)`cR9?R3=oK4YB69&_-zpQWV%yOk%ZBksCU%jOAf8TXt9pps#GLV84=*$f* zCDCITvdcTl;G}GIq#uSy?#2y~uG<=7OO{UIgY}T@yR{5g)VXg;bZv#ScpSDeVEgnG zyL!AAje}mHPoD6CW@@MDGF@yKF-ioG)0c`vHG8)p4uH+!Ii%;G=s1~>Bo&ADZFI@t zh8zF&coBD8=)wRgvJ!H%8yqUn3j{D7D@^j6vh@@BRg5)e_E7u#?f<~;cb^b$%@I7< zg4&R`$Z!T9J_ef~$x-c;Im~8jUjoDT2oIlIQ!-gLV{;$C9}&KxxBMtN=MsOFe;2fh zBSTpJo%w_-o<0kDwL~J{53nTAM!keweX=4uuQ4;HqR}>}JAuEgD4CuE^!jFI+IO3= zHg$d=*7d*mmJGZf;0udG&CP_irLa{@Y6}So>6yT7W~v=DT7D2)R0Xlwi-$CNwiN_$a57)qX?8!#h6DH#$~%r5__9{a^& zSThk+Zdrm&#YW1+SVd5mpm&RpNC}UD4_o5xwi;CNT)d}t8^a4LAgI7Ny1@qc(B+`dipq8k0Y2h z1{)eexqyMq>Hw|Me2iq<*#JO2J56OEG?bSV@#S|MU1pMVwQhFF1MNVPdkv&6=H_LS z+oT4CIfjBmnhAP>vOZHT&l+57MycnN9IjFCI&Z$T?9`eJhA^}s=zbNqC!~UCW<#IZ^ZyZPd`VC zk3@;85C92jzTa_6t`YB%CamEd=kG-^-PUd=_TvKvdo@g`_Rd{P(k`xV#VrE0Qb_fk z=ETmPuKV+xp+DCJYd&%PbO%H~{^1c5qfGPd@zQa9db^VBhp1%r9_IN)F!RYUenuyt z4*(S|*@hPf53l&JD%{7>4uG>^&6l2QZQWU*((jX0eNP~Bre%0&s^~$!ts_=W$ zbVZ&sKlKVdl++!rC?(%KjbJ*9D0nBvBHbAmD|2thJH(%BXl&}_Mv6@b$YgCCs_GKj z(F;7iTmP<;CSKVzn(D(7B2%~E(Rk_CO0tWg4(!C zX!buo?Q;;RqM^00HpEE>juT;e0);~=ec=rG5wmkd4^0K`-HqXbm!k7Y1=eblF4EIw zDRb((h%06zI?fef3v9|uIjbOnbCO^(F8I%2&bf9*M#jb04eq?hcM0Tqh6?BbS{B!} zrm37swn$%_2NC*YL~B@TdYfp#BWAuNscp4bUg6R!NQy2dZa&Kx333(coJ(WXe!`># z)zFGj56tH%6SR7GJ?f`PmQf_kyUUob+bL&RwsN}ON<7Po7p`m|fi@T&ni$#qlce8v zX{)KE$@T5Q%Xq2{Wm{r9f_A1BGHu+)eau&5LSUzMm)E#U)$}4GgQYjJ1(WNze97EG zde8eY1fG>0K0HPJFpElTJ@|{M?u#0^Zp!rD`4()9j&h=%9CD{Qp9O6cwQ)X>U zEhvGeEp_~s(jySTO_Y?HvZD)si$WNDriwO;;HqQ=@X12-NP7=pB!tARq2WzM6xK6D zkighCOG7X3FPoba{)!Q8eZGdOnItwM$++P~Ola<<%36m#@9`6W#Ghe#H@|7dBV(Sgo0Kl9vsf)#t z^|gVS#s!fWF?hD)CwVo#YeaLj8y|-w1JTXa?J6L<<5Or9lOTN*fz;YC(-(MN6@}|# z@`-+5!6-Gj{Z7Oq4&sJF=&xMsvKpTUg^%0ZD(~m&!E={$^gNOdQMBN?c;Q%OwZ$$^ z@={z35>LZ`SYP-H7+OCr^DgF&^H7P342@5S_|`%2E`an}HouRmYEIuw?A}ig@P5br zYvd7yvL3^a*I#UNuI+B#NNR>bOiWBjghPI~Eq1N1g5}5*(AxZ$w4p7x1R)R}!febB z(64gGCQ*dF?InwON&{h)Ce->uV20C+C~Bw6q>tVcWxR%QicpVIekV(~Xst!5nXGE) z!}pe)$dFkmEHP0yoC&7P_Ot~f)zis!Pqvu4aaorlU<_YhU!S8VIP_=5tkIy*aJ|yl zx`xh!Tz&qdk6Z%b`p%a3!W9Y)ixj3Au!<0MF$aiwBdm#A!8XJd@S7J`{rk@SSr8L! zXo=)Iq(3W7U7UXGS-|w8@*uK1O7UEj7*z>mZ>m82aa(_bT(aHG0y+-XsPAucpZT5} zYPJwEp}J_&u%8kMK>UK>>fEcuLGVH5x91*^qkoH*bv5HfP)ROh>Ay3r!$q~Lm%m~` zWcyxr(!YrxP~vb1Q06v!uiS06{(i$UVs<8Y4|x!&n%T=XoSo6-fC(3F)}>k~@4L%u zh>K?yQBzSN{9A0Q9!2HdvJfpWBPErbpcCs^UpetEA%f>q@P8a9V1k{1$jHbXbZJRR zcNh_csBJf;q?FWR8wuCpJ;nDDQptAC97e#@wmEJ#((v2P>~6W={anKsbmx`8-!Z|@ zf%Y`;M&;@L%Cj;n2$P6K0>1t$oUGY1C+%GC zdFYyy{M6>dgd0u*P_N3ccS2HnPEG~kZfHmax?y~X4&=cb;-L7IkQ9`?Wdcd+Fs@y7ola+J+Kv}QwS`eF^<5tA) zzeL`q0+e5=8&6giU_n;{jq$7{ z?(WfS^dPzd+jiZuG7~8$CwJZTl;n1ZpCPK|hFKx}=+*5{?N4IJjd&VSG|`~VjDs9h zW|!LXE=nq=Az$=E3p^M%-xsr_UXL9mmiTC_!1j)q!K9euqW-hU(tJ=IaX!`a{>B?m z)3C|9x}A>Utnne~+z)X?we}PIdZoWHTI9@JL5ICRBd}Nj6Rmd3 zbIPjQyKjV;aeiA7auM0S#>4>pv^)}G&W%Xz_}wJN`dVz!e{og4(DDAay@sJ0wNUds8+_3_zBfI(2mn_4cKA4$ z)0he*Gs@7_hK-hn(fMh~-5m$&R)!{$tEIQ@t2O@GxNyIm>Br;2Md|-G@sJTe8L0NT zgZe|El&#%U$r4ufcxX@7&3OFWe7E(+{6ozCuj>jwPWhhx9_aMuGSplNcEG z{LX}nxkds_&zE!+UVOJd?v%^^O&1p%N7U#&ijU9k5#ulQqn*X2WcBP1g_ zCN~rD3+Bcw*>s_x1R;LjY#}mIlUvvjM}TXmv~~V@GTdfF)MuhWPn4Gtz$y(O=Dv4X z{>4YVb{xi{i`a1XX-lsfnkcR#cemuOaP8RG*qG#G^`IbyN)zE#5YEmK$!)j<)ZOIWzv$CQp^T6tP!RiSU&DEMe=iN^94ts>Rmwdm^;ORW1@_>e-J= znS_Cuy?f1;Y^~VWnA(5*M7|*=;lqnUX1=MmGLBphlT-S*gIqCL1KYNZDQetcb%kQJ zCw9;Jx?;e!o+J+Cz(9F6HnxW(U)4Hxo_E=cExDiiDZUjV8W^jz?n!@%oo_eMToOTGWN@}?av%P_v^hSC^*`tf z&|JdnyFIXfNA%oVVBk+Ry6!~iW@3w@E|puI7t7_mQ9$EiE5fRGUN?Yaz7+JvgTnkP zYwyd}&-`)aH5BO<%NnkT$!YVMpIUMEzqBp;45>K_h~L$I%S{N7R!$jSo`RSih}Mn$ zJyv+!l!*V`%e0Uegelw*HZ>J`h%0U=I_+7GDUBuXh-Z!vP{#>JN|kfs*)3(Ycl&q~ z!{c_1!2gJxGRu9~ZAvICkk3(m-0iLrUH9%U%#pTR5RQM3y?h<@xp9 zpiMz_n5dW-9TgST3wL+*=g;{Od*J9n^hxI~<$`;K`a(%y>X7WwwJ6=~R`V17#UJuf z%HE5BIh{_(5M?Yp+ameHhwE3t>EC39Xx8tazkY@37y6usTsh|zY{(y?7h9DbE^a;F zNH}f{_V;#(o)5kQkOicS1FYIVYg2ag1Pm#ZGQ5cy%5NA7-nw<)*H>By1aGTMhR4PT z!EjTpBM)*@fhEBG0^EL4LusSjw+3uRxkS7IN-9RF--UI^-Jj1N9$P(Rdl#nckk4Uk zT`VXfLIPxHCylGKv+rR}jxxGH0(U|{7}+4V zFE6m;Pc{=tDYkSRXB1J4e}BRJ4m!16&Ofc`(SaO92L!cN`H_U8jRg}azdFPt%%55r{e%TvxN1lG`pAj%^ZDqLSRNgj6pu`7iO{f zQslKA#u%p;4;p!IemAHcf~8eM?aq)%SYu4 zdBt8UGB6utQSFlMgs$#1{bybIrE%hgB;!}FI%iY9&Qb>%E}xr<{Qz|&+LJyD?C;dy#B7z!>Ex~t>ZJ< zpkmJWuFWbYTK)gtsiB+zmMyrl+pMr3A*{%mtOf|^tz%7YZdY6s z)9pLkNo!6f_x9$}uaI5tg(E|&x^Z>zwp+MEYurn76fU#t^Hp$eEWGvR`<2*1x~Lk$ zE$86t{|K}32RJi91+8Rvh}|$qJf;p4$|jr$02c9QEElV!D2Bjv%!wif56$vi>^_{*vbTmet=Y9!9`K{>&5= zRA3TGcWYQSq?^*!Npj$?9A&G~e=|CII0K+UE-z))=t|HjEbLKt8>r^rRUJ-r{~rNE z=$>8h{@PseGS|VMD+?-{1YCox{AUOa_2j$%Ylw|?>;E-tUPmFt|Cm+TK9$@+N{4>%?{I*os*Xy@1FNwA E2gNgoEC2ui literal 3268 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 Date: Sun, 23 Aug 2020 17:01:32 +1000 Subject: [PATCH 18/85] its asking me to commit hold on --- code/datums/components/crafting/recipes/recipes_clothing.dm | 2 +- code/game/objects/items/storage/belt.dm | 4 ++-- code/modules/smithing/finished_items.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index 8c02d96dec..31a90362be 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -266,7 +266,7 @@ /datum/crafting_recipe/twinsheath name = "Twin Sword Sheath" result = /obj/item/storage/belt/sabre/twin - reqs = list(/obj/item/stack/sheet/wood = 3, + reqs = list(/obj/item/stack/sheet/mineral/wood = 3, /obj/item/stack/sheet/leather = 8) tools = list(TOOL_WIRECUTTER) time = 70 diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 76f87adc6a..024e0495a8 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -820,9 +820,9 @@ name = "twin sheath" desc = "Two sheaths. One is capable of holding a katana (or bokken) and the other a wakizashi. You could put two wakizashis in if you really wanted to. Now you can really roleplay as a samurai." icon_state = "twinsheath" - item_state = "quiver" //this'll do. + item_state = "quiver" //this'll do. w_class = WEIGHT_CLASS_BULKY - var/list/fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken) + fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken) starting_sword = null /obj/item/storage/belt/sabre/twin/ComponentInitialize() diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 8f0bb99036..0ae833394f 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -286,7 +286,7 @@ if(!is_servant_of_ratvar(user)) user.DefaultCombatKnockdown(100) user.dropItemToGround(src, TRUE) - user.visible_message("A powerful force shoves [user] away from [target]!", "\""You shouldn't be touching tools that aren't yours.\"") + user.visible_message("A powerful force shoves [user] away from [target]!", "\"You shouldn't be touching tools that aren't yours.\"") if(ishuman(user)) var/mob/living/carbon/human/H = user H.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) From ce4d50b9a957ef5bcf574dc222b4d62c2bb01b91 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 17:09:13 +1000 Subject: [PATCH 19/85] E --- code/modules/smithing/finished_items.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 0ae833394f..3e6e3de9e6 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -258,11 +258,11 @@ /obj/item/melee/smith/hammer/narsie name = "runemetal hammer" - custom_materials = list(datum/material/runedmetal = 12000) + custom_materials = list(/datum/material/runedmetal = 12000) desc = "A metal hammer inscribed with geometeric runes." qualitymod = 1 -/obj/item/melee/smith/hammer/narsie(mob/living/target, mob/living/carbon/human/user) +/obj/item/melee/smith/hammer/narsie/attack(mob/living/target, mob/living/carbon/human/user) if(!iscultist(user)) user.DefaultCombatKnockdown(100) user.dropItemToGround(src, TRUE) @@ -278,11 +278,11 @@ /obj/item/melee/smith/hammer/ratvar name = "brass hammer" - custom_materials = list(datum/material/bronze = 12000) + custom_materials = list(/datum/material/bronze = 12000) desc = "A brass hammer inscribed with... writing? You can't read it." qualitymod = 1 -/obj/item/melee/smith/hammer/ratvar(mob/living/target, mob/living/carbon/human/user) +/obj/item/melee/smith/hammer/ratvar/attack(mob/living/target, mob/living/carbon/human/user) if(!is_servant_of_ratvar(user)) user.DefaultCombatKnockdown(100) user.dropItemToGround(src, TRUE) From 220546b558ef527d211a1ed3e702535b5ca34366 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 17:19:30 +1000 Subject: [PATCH 20/85] you forgot the knife idiot --- code/modules/smithing/anvil.dm | 8 ++++---- code/modules/smithing/smithed_items.dm | 10 +++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index c0f951879d..174ccb2e12 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -106,15 +106,15 @@ switch(stepdone) if("weak hit") currentsteps += 1 - outrightfailchance += 10 + outrightfailchance += 5 currentquality += 1 if("strong hit") currentsteps += 2 - outrightfailchance += 17.5 + outrightfailchance += 9.5 currentquality += 2 if("heavy hit") currentsteps += 3 - outrightfailchance += 25 + outrightfailchance += 12.5 currentquality += 3 if("fold") stepsdone += "f" @@ -146,7 +146,7 @@ tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) - if(currentsteps > 12 || (rng && prob(outrightfailchance))) + if(currentsteps > 10 || (rng && prob(outrightfailchance))) to_chat(user, "You overwork the metal, causing it to turn into useless slag!") var/turf/T = get_turf(user) workpiece_state = FALSE diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index e078871b2e..e6b9cf2824 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -265,7 +265,15 @@ /obj/item/smithing/knifehead/startfinish() finalitem = new /obj/item/kitchen/knife(src) - finalitem.force += quality/2 + finalitem.force = 4 + quality/2 + finalitem.icon = 'icons/obj/smith.dmi' + finalitem.icon_state = "dagger" + var/mutable_appearance/overlay = mutable_appearance('icons/obj/smith.dmi', "daggerhilt") + overlay.appearance_flags = RESET_COLOR + finalitem.add_overlay(overlay) + if(finalitem.force < 0) + finalitem.force = 0 + finalitem.MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS ..() /obj/item/smithing/broadblade From 73932b27d28d8ec5a67d95ad6f7d63b755c80623 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 17:43:34 +1000 Subject: [PATCH 21/85] TESTMERGE TIME? --- code/modules/smithing/anvil.dm | 8 ++++++- code/modules/smithing/finished_items.dm | 17 ++++++++++++- code/modules/smithing/smithed_items.dm | 32 +++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 174ccb2e12..64ca2ae6d4 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -11,8 +11,11 @@ #define RECIPE_SMALLKNIFE "sdd" //shrink draw draw #define RECIPE_SHORTSWORD "dff" //draw fold fold +#define RECIPE_WAKI "dfsf" //draw shrink fold #define RECIPE_SCIMITAR "dfb" //draw fold bend -#define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw +#define RECIPE_SABRE "ddsf" //draw draw shrink fold +#define RECIPE_RAPIER "sddf" //shrink draw draw fold +#define RECIPE_BROADSWORD "dfuf" //draw fold upset fold #define RECIPE_ZWEIHANDER "udfsf" //upset draw fold shrink fold #define RECIPE_KATANA "fffff" //fold fold fold fold fold @@ -50,6 +53,9 @@ RECIPE_SMALLPICK = /obj/item/smithing/prospectingpickhead, RECIPE_SHORTSWORD = /obj/item/smithing/shortswordblade, RECIPE_SCIMITAR = /obj/item/smithing/scimitarblade, + RECIPE_WAKI = /obj/item/smithing/wakiblade, + RECIPE_RAPIER = /obj/item/smithing/rapierblade, + RECIPE_SABRE = /obj/item/smithing/sabreblade, RECIPE_SMALLKNIFE = /obj/item/smithing/knifeblade, RECIPE_BROADSWORD = /obj/item/smithing/broadblade, RECIPE_ZWEIHANDER = /obj/item/smithing/zweiblade, diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 3e6e3de9e6..142ef39fe0 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -9,7 +9,7 @@ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON //yeah ok slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL - force = 10 + force = 6 lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' var/quality @@ -31,6 +31,8 @@ /obj/item/melee/smith/twohand item_flags = NEEDS_PERMIT //it's a bigass sword/spear. beepsky is going to give you shit for it. + sharpness = SHARP_EDGED + force = 5 wielded_mult = 1.75 w_class = WEIGHT_CLASS_BULKY @@ -49,6 +51,7 @@ desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." icon = 'icons/obj/smith.dmi' icon_state = "pickaxe" //todo:sprite + sharpness = SHARP_POINTY//it doesnt have a blade it has a point /obj/item/mining_scanner/prospector/Initialize() ..() @@ -65,6 +68,7 @@ desc = "A pickaxe." icon = 'icons/obj/smith.dmi' icon_state = "pickaxe" + sharpness = SHARP_POINTY /obj/item/pickaxe/smithed/Initialize() ..() @@ -81,6 +85,7 @@ desc = "A shovel." icon = 'icons/obj/smith.dmi' icon_state = "shovel" + sharpness = SHARP_EDGED //it cuts through the earth /obj/item/shovel/smithed/Initialize() ..() @@ -101,6 +106,7 @@ /obj/item/melee/smith/twohand/halberd name = "halberd" icon_state = "halberd" + w_class = WEIGHT_CLASS_HUGE overlay_state = "spearhandle" slot_flags = ITEM_SLOT_BACK @@ -114,6 +120,7 @@ overlay_state = "longhandle" wielded_mult = 1.5 slot_flags = ITEM_SLOT_BACK + sharpness = SHARP_POINTY /obj/item/melee/smith/twohand/javelin/ComponentInitialize() @@ -134,9 +141,11 @@ /obj/item/melee/smith/twohand/pike name = "pike" icon_state = "pike" + w_class = WEIGHT_CLASS_HUGE overlay_state = "longhandle" reach = 2 //yeah ok slot_flags = ITEM_SLOT_BACK + sharpness = SHARP_POINTY ////////////////////////// // Other Melee // @@ -162,16 +171,19 @@ /obj/item/melee/smith/shortsword name = "gladius" item_flags = NEEDS_PERMIT + sharpness = SHARP_EDGED icon_state = "gladius" overlay_state = "gladiushilt" /obj/item/melee/smith/shortsword/scimitar name = "scimitar" + sharpness = SHARP_EDGED icon_state = "scimitar" overlay_state = "scimitarhilt" /obj/item/melee/smith/wakizashi name = "wakizashi" + sharpness = SHARP_EDGED item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY icon_state = "waki" overlay_state = "wakihilt" @@ -217,6 +229,7 @@ /obj/item/melee/smith/sabre name = "sabre" icon_state = "sabre" + sharpness = SHARP_EDGED overlay_state = "sabrehilt" armour_penetration = 15 force = 9 @@ -227,8 +240,10 @@ /obj/item/melee/smith/sabre/rapier name = "rapier" icon_state = "rapier" + sharpness = SHARP_EDGED overlay_state = "rapierhilt" force = 6 //less force, stronger parry + sharpness = SHARP_POINTY armour_penetration = 30 block_parry_data = /datum/block_parry_data/smithrapier diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index e6b9cf2824..6cbe4b237f 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -256,6 +256,38 @@ finalitem.force += quality ..() +/obj/item/smithing/wakiblade + name = "smithed wakizashi blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/wakizashi + icon_state = "waki" + +/obj/item/smithing/wakiblade/startfinish() + finalitem = new /obj/item/melee/smith/wakizashi(src) + finalitem.force += quality + ..() + +/obj/item/smithing/sabreblade + name = "smithed sabre blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/sabre + icon_state = "sabre" + +/obj/item/smithing/sabrerblade/startfinish() + finalitem = new /obj/item/melee/smith/sabre(src) + finalitem.force += quality + ..() + +/obj/item/smithing/rapierblade + name = "smithed rapier blade" + finishingitem = /obj/item/swordhandle + finalitem = /obj/item/melee/smith/sabre/rapier + icon_state = "rapier" + +/obj/item/smithing/rapierblade/startfinish() + finalitem = new /obj/item/melee/smith/sabre/rapier(src) + finalitem.force += quality + ..() /obj/item/smithing/knifeblade name = "smithed knife blade" From 04a755746bba6d3048b9aaae712a8c0a0b16a6a7 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 17:45:13 +1000 Subject: [PATCH 22/85] oh yeah --- code/modules/smithing/anvil.dm | 2 +- icons/obj/smith.dmi | Bin 14133 -> 14410 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 64ca2ae6d4..1e8a436470 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -196,7 +196,7 @@ /obj/structure/anvil/obtainable/table name = "table anvil" desc = "A slightly reinforced table. Good luck." - icon_state = "anvil" + icon_state = "tablevil" anvilquality = -2 diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index 0af21125927745304449f77ffc8db7dc2349ce22..c6fb94dce6e5c61b44751ce4dd3bf5ce46fc466e 100644 GIT binary patch literal 14410 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 HtzP{foZ#ZN literal 14133 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 E2gNgoEC2ui From c8ecfdf4a959231ae7a242622809ebda1b5b122e Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 17:50:33 +1000 Subject: [PATCH 23/85] Update anvil.dm --- code/modules/smithing/anvil.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 1e8a436470..63c0920511 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -44,6 +44,7 @@ var/outrightfailchance = 1 //todo: document this shit var/stepsdone = "" var/rng = FALSE + var/itemqualitymax = 2 var/list/smithrecipes = list(RECIPE_HAMMER = /obj/item/smithing/hammerhead, RECIPE_SCYTHE = /obj/item/smithing/scytheblade, RECIPE_SHOVEL = /obj/item/smithing/shovelhead, @@ -171,7 +172,7 @@ var/obj/item/smithing/finisheditem = new create(T) to_chat(user, "You finish your [finisheditem]!") workpiece_state = FALSE - finisheditem.quality = currentquality + finisheditem.quality = min(currentquality, itemqualitymax) finisheditem.set_custom_materials(workpiece_material) currentquality = anvilquality stepsdone = "" @@ -198,6 +199,7 @@ desc = "A slightly reinforced table. Good luck." icon_state = "tablevil" anvilquality = -2 + itemqualitymax = 0 /obj/structure/anvil/obtainable/table/do_shaping(mob/user, var/qualitychange) @@ -214,6 +216,7 @@ custom_materials = list(/datum/material/bronze=8000) icon_state = "ratvaranvil" anvilquality = -1 + itemqualitymax = 1 /obj/structure/anvil/obtainable/sandstone name = "sandstone brick anvil" @@ -221,17 +224,20 @@ custom_materials = list(/datum/material/sandstone=8000) icon_state = "sandvil" anvilquality = -1 + itemqualitymax = 2 /obj/structure/anvil/obtainable/basalt name = "basalt brick anvil" desc = "A big block of basalt. Useable as an anvil, better than sandstone. Igneous!" icon_state = "sandvilnoir" anvilquality = -0.5 + itemqualitymax = 4 /obj/structure/anvil/obtainable/basic name = "anvil" desc = "An anvil. It's got wheels bolted to the bottom." anvilquality = 0 + itemqualitymax = 5 /obj/structure/anvil/obtainable/ratvar name = "brass anvil" @@ -239,6 +245,7 @@ custom_materials = list(/datum/material/bronze=8000) icon_state = "ratvaranvil" anvilquality = 1 + itemqualitymax = 8 /obj/structure/anvil/obtainable/ratvar/attackby(obj/item/I, mob/user) if(is_servant_of_ratvar(user)) @@ -253,6 +260,7 @@ icon = 'icons/obj/smith.dmi' icon_state = "evil" anvilquality = 1 + itemqualitymax = 8 /obj/structure/anvil/obtainable/narsie/attackby(obj/item/I, mob/user) if(iscultist(user)) From e138536cb62cf54fd905adc04c042feea02763f7 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 18:29:01 +1000 Subject: [PATCH 24/85] eee eee eee --- code/modules/smithing/smithed_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 6cbe4b237f..5a9770218b 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -305,7 +305,7 @@ finalitem.add_overlay(overlay) if(finalitem.force < 0) finalitem.force = 0 - finalitem.MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + finalitem.material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS ..() /obj/item/smithing/broadblade From ce2dca59326bb5d69bfdc58aa724d1bf211d8259 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sun, 23 Aug 2020 22:19:25 +1000 Subject: [PATCH 25/85] Update anvil.dm --- code/modules/smithing/anvil.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 63c0920511..141f631f91 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -44,7 +44,7 @@ var/outrightfailchance = 1 //todo: document this shit var/stepsdone = "" var/rng = FALSE - var/itemqualitymax = 2 + var/itemqualitymax = 20 var/list/smithrecipes = list(RECIPE_HAMMER = /obj/item/smithing/hammerhead, RECIPE_SCYTHE = /obj/item/smithing/scytheblade, RECIPE_SHOVEL = /obj/item/smithing/shovelhead, @@ -185,6 +185,7 @@ desc = "WOW. A DEBUG ITEM STRUCTURE. EPIC." icon_state = "anvil" anvilquality = 10 + itemqualitymax = 9001 outrightfailchance = 0 /obj/structure/anvil/obtainable From ccf8aaf4126f61c551d0b61c9245fdc075acaedb Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 23 Aug 2020 23:53:38 +1000 Subject: [PATCH 26/85] ee --- code/modules/smithing/finished_items.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 142ef39fe0..5c653eb011 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -214,6 +214,7 @@ name = "zweihander" icon_state = "zweihander" overlay_state = "zweihilt" + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON * 2 force = 4 wielded_mult = 3 //affected more by quality. a -1 is 25% less damage, a +1 is 25% more. These bonuses are tripled when wielded. From 05250939c6b551ccbbf43f327a0daa668e7da77f Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sun, 23 Aug 2020 23:58:04 +1000 Subject: [PATCH 27/85] e --- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 4cb898d51f..100a705f15 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -689,6 +689,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze), \ null, new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("bronze anvil", /obj/structure/anvil/obtainable/bronze, 20, time = 110, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ From 289280f0ecc56524a6539f1eadddb050dca9b55d Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 24 Aug 2020 00:00:39 +1000 Subject: [PATCH 28/85] Update recipes_misc.dm --- .../components/crafting/recipes/recipes_misc.dm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index f47a879a9a..7166813ff5 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -119,6 +119,17 @@ subcategory = CAT_MISCELLANEOUS category = CAT_MISC always_availible = FALSE // Disabled til learned + +/datum/crafting_recipe/furnace + name = "Sandstone Furnace" + result = /obj/structure/furnace + time = 300 + reqs = list(/obj/item/stack/sheet/mineral/sandstone = 15, + /obj/item/stack/sheet/metal = 4, + /obj/item/stack/rods = 2) + tools = list(TOOL_CROWBAR) + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC /datum/crafting_recipe/tableanvil name = "Table Anvil" @@ -134,7 +145,7 @@ name = "Sandstone Anvil" result = /obj/structure/anvil/obtainable/sandstone time = 300 - reqs = list(/obj/item/stack/sheet/mineral/sandstone = 4) + reqs = list(/obj/item/stack/sheet/mineral/sandstone = 24) tools = list(TOOL_CROWBAR) subcategory = CAT_MISCELLANEOUS category = CAT_MISC From d45ac6323a455c1eaaca2b2cf96dd2f67169ad86 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 24 Aug 2020 00:09:58 +1000 Subject: [PATCH 29/85] Update smithed_items.dm --- code/modules/smithing/smithed_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 5a9770218b..e55ea96f75 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -24,7 +24,7 @@ /obj/item/ingot/on_attack_hand(mob/user) var/mob/living/carbon/human/H - if(!workability == "shapeable") + if(!(workability == "shapeable")) return ..() var/prot = 0 if(ishuman(user)) From 1f576dfd124c12d91bc2cb0cef73874002058ea1 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 24 Aug 2020 00:15:27 +1000 Subject: [PATCH 30/85] Update smithed_items.dm --- code/modules/smithing/smithed_items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index e55ea96f75..0224069431 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -19,12 +19,12 @@ icon = 'icons/obj/smith.dmi' icon_state = "ingot" material_flags = MATERIAL_COLOR | MATERIAL_ADD_PREFIX - var/workability = "cold" + var/workability = 0 /obj/item/ingot/on_attack_hand(mob/user) var/mob/living/carbon/human/H - if(!(workability == "shapeable")) + if(!workability) return ..() var/prot = 0 if(ishuman(user)) From 460c92de74f43931f4e5134fd67a870817221f60 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 24 Aug 2020 00:20:04 +1000 Subject: [PATCH 31/85] 3 --- code/game/objects/items/stacks/sheets/sheet_types.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 100a705f15..3fb72b8191 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -695,7 +695,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("bronze ingot", /obj/item/ingot/bronze, 6, time = 100), \ new/datum/stack_recipe("bronze floor tiles", /obj/item/stack/tile/bronze, 1, 4, 20), \ -)) +) /obj/item/stack/sheet/bronze name = "brass" From cdc7490ee17b55537ce657ed51af0db3151d977b Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 00:26:26 +1000 Subject: [PATCH 33/85] e --- code/modules/smithing/anvil.dm | 7 ++----- code/modules/smithing/smithed_items.dm | 1 + 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 141f631f91..34be1ae3e7 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -147,14 +147,13 @@ stepsdone += "u" currentsteps += 1 currentquality -= 1 - to_chat(user, "You [stepdone] the metal.") - to_chat(user, stepsdone) + to_chat(user, "") if(length(stepsdone) >= 3) tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) if(currentsteps > 10 || (rng && prob(outrightfailchance))) - to_chat(user, "You overwork the metal, causing it to turn into useless slag!") + to_chat(user, "") var/turf/T = get_turf(user) workpiece_state = FALSE new /obj/item/stack/ore/slag(T) @@ -164,8 +163,6 @@ outrightfailchance = 1 if(user.mind.skill_holder) user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 25, 400, silent = FALSE) - for(var/i in smithrecipes) - to_chat(user, "comparing [i] to [stepsdone]") if(i == stepsdone) var/turf/T = get_turf(user) var/obj/item/smithing/create = smithrecipes[stepsdone] diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 5a9770218b..e8216865cb 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -377,6 +377,7 @@ finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal + ..() /obj/item/stick name = "wooden rod" From b74c5ba22dae622913059ec118480311ea9a32b8 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 00:27:22 +1000 Subject: [PATCH 34/85] ee --- code/game/objects/items/stacks/sheets/sheet_types.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 4cb898d51f..8f0fdc1aa9 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -691,10 +691,10 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ - + null, new/datum/stack_recipe("bronze ingot", /obj/item/ingot/bronze, 6, time = 100), \ new/datum/stack_recipe("bronze floor tiles", /obj/item/stack/tile/bronze, 1, 4, 20), \ -)) +) /obj/item/stack/sheet/bronze name = "brass" From a032fb4a3de235cc167c2d51c1e05e217cdb4aec Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 00:35:12 +1000 Subject: [PATCH 35/85] e --- code/modules/smithing/anvil.dm | 2 ++ code/modules/smithing/smithed_items.dm | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 34be1ae3e7..e05e3c45db 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -110,6 +110,8 @@ var/list/shapingsteps = list("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. workpiece_state = WORKPIECE_INPROGRESS var/stepdone = input(user, "How would you like to work the metal?") in shapingsteps + if(!do_after(user, 20, target = src)) + return FALSE switch(stepdone) if("weak hit") currentsteps += 1 diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index d22003b95c..5da7a0f8f4 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -99,7 +99,6 @@ dofinish() /obj/item/smithing/proc/dofinish() - visible_message("The finishing of [src].") var/qualname switch(quality) if(-1000 to -5) @@ -124,6 +123,7 @@ mat = mat.name finalitem.name = "[qualname] [mat] [finalitem.name]" finalitem.forceMove(get_turf(src)) + qdel(src) /obj/item/smithing/hammerhead name = "smithed hammer head" From eda8d516b95edc848b86bdbcbe2523c6982c34b5 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 00:41:22 +1000 Subject: [PATCH 36/85] e --- code/modules/smithing/smithed_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 5da7a0f8f4..a1e8592a93 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -2,7 +2,7 @@ name = "basalt block" desc = "A block of basalt." icon = 'icons/obj/smith.dmi' - icon_state = "unfinished" + icon_state = "sandvilnoir" /obj/item/smithing From 4b2b4afc64bbcf04a0d6ad738482f10c55304185 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 00:49:31 +1000 Subject: [PATCH 37/85] e --- code/game/objects/items/stacks/sheets/sheet_types.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index a065983b8a..6f5aaaebfb 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -689,13 +689,12 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze), \ null, new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("bronze anvil", /obj/structure/anvil/obtainable/bronze, 20, time = 110, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ null, new/datum/stack_recipe("bronze ingot", /obj/item/ingot/bronze, 6, time = 100), \ new/datum/stack_recipe("bronze floor tiles", /obj/item/stack/tile/bronze, 1, 4, 20), \ -) +)) /obj/item/stack/sheet/bronze name = "brass" From 0f9f1e240cc09193bf8d2f6072a5d88b313519ca Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 00:51:13 +1000 Subject: [PATCH 38/85] w --- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 6f5aaaebfb..da571b514e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -691,6 +691,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("bronze anvil",/obj/structure/anvil/obtainable/bronze, 20, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ null, new/datum/stack_recipe("bronze ingot", /obj/item/ingot/bronze, 6, time = 100), \ new/datum/stack_recipe("bronze floor tiles", /obj/item/stack/tile/bronze, 1, 4, 20), \ From 69caf7a3315e411a86ce9bd351f8a98f56eb63e1 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 00:56:38 +1000 Subject: [PATCH 39/85] ear --- code/modules/smithing/anvil.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index e05e3c45db..3d98b21945 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -14,7 +14,7 @@ #define RECIPE_WAKI "dfsf" //draw shrink fold #define RECIPE_SCIMITAR "dfb" //draw fold bend #define RECIPE_SABRE "ddsf" //draw draw shrink fold -#define RECIPE_RAPIER "sddf" //shrink draw draw fold +#define RECIPE_RAPIER "sdfd" //shrink draw fold draw #define RECIPE_BROADSWORD "dfuf" //draw fold upset fold #define RECIPE_ZWEIHANDER "udfsf" //upset draw fold shrink fold #define RECIPE_KATANA "fffff" //fold fold fold fold fold @@ -165,6 +165,7 @@ outrightfailchance = 1 if(user.mind.skill_holder) user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 25, 400, silent = FALSE) + for(var/i in smithrecipes) if(i == stepsdone) var/turf/T = get_turf(user) var/obj/item/smithing/create = smithrecipes[stepsdone] @@ -177,6 +178,8 @@ stepsdone = "" currentsteps = 0 outrightfailchance = 1 + if(user.mind.skill_holder) + user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 200, 10000000, silent = FALSE) break /obj/structure/anvil/debugsuper From daeaf81ab647814ecbc3ab6bdcd41bf89117c384 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 01:25:26 +1000 Subject: [PATCH 40/85] e --- code/game/objects/items/stacks/sheets/sheet_types.dm | 2 +- code/modules/smithing/anvil.dm | 4 ++-- code/modules/smithing/finished_items.dm | 1 + code/modules/smithing/smithed_items.dm | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index da571b514e..aeb27dd401 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -691,7 +691,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("bronze anvil",/obj/structure/anvil/obtainable/bronze, 20, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("bronze anvil",/obj/structure/anvil/obtainable/bronze, 20, time = 110, one_per_turf = TRUE, on_floor = TRUE), \ null, new/datum/stack_recipe("bronze ingot", /obj/item/ingot/bronze, 6, time = 100), \ new/datum/stack_recipe("bronze floor tiles", /obj/item/stack/tile/bronze, 1, 4, 20), \ diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 3d98b21945..d6c144bdf7 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -149,7 +149,7 @@ stepsdone += "u" currentsteps += 1 currentquality -= 1 - to_chat(user, "") + to_chat(user, "You [stepdone] the metal.") if(length(stepsdone) >= 3) tryfinish(user) @@ -179,7 +179,7 @@ currentsteps = 0 outrightfailchance = 1 if(user.mind.skill_holder) - user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 200, 10000000, silent = FALSE) + user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 50, 10000000, silent = FALSE) break /obj/structure/anvil/debugsuper diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 5c653eb011..0d61097002 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -32,6 +32,7 @@ /obj/item/melee/smith/twohand item_flags = NEEDS_PERMIT //it's a bigass sword/spear. beepsky is going to give you shit for it. sharpness = SHARP_EDGED + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS force = 5 wielded_mult = 1.75 w_class = WEIGHT_CLASS_BULKY diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index a1e8592a93..3d036d380c 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -24,7 +24,7 @@ /obj/item/ingot/on_attack_hand(mob/user) var/mob/living/carbon/human/H - if(!workability) + if(workability != "shapeable") return ..() var/prot = 0 if(ishuman(user)) From 5218840e6dd242e3657ffa89d2cc7ce8414c6f3b Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 02:01:46 +1000 Subject: [PATCH 41/85] w --- code/modules/smithing/smithed_items.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 3d036d380c..5a96eb2244 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -83,10 +83,6 @@ name = "brass ingnot" desc = "On closer inspection, what appears to be wholly-unsuitable-for-smithing brass is actually more structurally stable bronze. Ratvar must have transformed the brass into bronze. Somehow." -/obj/item/smithing/Initialize() - ..() - desc = "A [src]. Hit it with a [finishingitem.name] to create a [finalitem.name]." - /obj/item/smithing/attackby(obj/item/I, mob/user) if(istype(I, finishingitem)) From bd5848a0e385fbdd799c6fbf11516dbebd878787 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 24 Aug 2020 08:52:42 +1000 Subject: [PATCH 42/85] Update recipes_misc.dm --- code/datums/components/crafting/recipes/recipes_misc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 7166813ff5..ca1b65e220 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -161,7 +161,7 @@ /datum/crafting_recipe/basaltanvil name = "Basalt Anvil" - result = /obj/structure/anvil/obtainable/sandstone + result = /obj/structure/anvil/obtainable/basalt time = 200 reqs = list(/obj/item/basaltblock = 5) tools = list(TOOL_CROWBAR) From 40bcd3f902dc501450848724775e8ef55a96cc16 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 11:18:02 +1000 Subject: [PATCH 43/85] PACK IT UP FOLKS --- code/modules/smithing/anvil.dm | 18 +++++++++++++++--- code/modules/smithing/finished_items.dm | 2 +- code/modules/smithing/smithed_items.dm | 7 +++++-- icons/obj/smith.dmi | Bin 14410 -> 14762 bytes 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index d6c144bdf7..73c748e148 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -110,7 +110,11 @@ var/list/shapingsteps = list("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. workpiece_state = WORKPIECE_INPROGRESS var/stepdone = input(user, "How would you like to work the metal?") in shapingsteps - if(!do_after(user, 20, target = src)) + var/steptime = 100 + if(user.mind.skill_holder) + var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 + steptime = 100 / skillmod + if(!do_after(user, steptime, target = src)) return FALSE switch(stepdone) if("weak hit") @@ -149,12 +153,20 @@ stepsdone += "u" currentsteps += 1 currentquality -= 1 - to_chat(user, "You [stepdone] the metal.") + user.visible_message("[user] works the metal on the anvil with their hammer with a loud clang!", \ + "You [stepdone] the metal with a loud clang!") + playsound(src, 'sound/effects/clang2.ogg',20, 2) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/clang2.ogg', 20, 2), 15) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/clang2.ogg', 20, 2), 30) if(length(stepsdone) >= 3) tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) - if(currentsteps > 10 || (rng && prob(outrightfailchance))) + var/finalfailchance = outrightfailchance + if(user.mind.skill_holder) + var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 + finalfailchance = max(0, finalfailchance / skillmod) //lv 2 gives 20% less to fail, 3 30%, etc + if(currentsteps > 10 || (rng && prob(finalfailchance))) to_chat(user, "") var/turf/T = get_turf(user) workpiece_state = FALSE diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 0d61097002..f36287b33a 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -23,7 +23,7 @@ if(desc == "cringe") desc = "A handmade [name]." overlay = mutable_appearance(icon, overlay_state) - overlay.appearance_flags = RESET_COLOR + overlay.color = "FFFFFF" add_overlay(overlay) if(force < 0) force = 0 diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 5a96eb2244..1e8c549dd7 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -101,7 +101,7 @@ qualname = "awful" if(-1000 to -2) qualname = "shoddy" - if(-1000 to 0) + if(-1000 to -1) qualname = "poor" if(0) qualname = "normal" @@ -118,6 +118,7 @@ var/datum/material/mat = custom_materials[1] mat = mat.name finalitem.name = "[qualname] [mat] [finalitem.name]" + finalitem.desc = "A [qualname] [finalitem.name]." finalitem.forceMove(get_turf(src)) qdel(src) @@ -291,11 +292,13 @@ finalitem = /obj/item/kitchen/knife icon_state = "dagger" -/obj/item/smithing/knifehead/startfinish() +/obj/item/smithing/knifeblade/startfinish() finalitem = new /obj/item/kitchen/knife(src) finalitem.force = 4 + quality/2 finalitem.icon = 'icons/obj/smith.dmi' finalitem.icon_state = "dagger" + finalitem.name = "dagger" + finalitem.desc = "A dagger." var/mutable_appearance/overlay = mutable_appearance('icons/obj/smith.dmi', "daggerhilt") overlay.appearance_flags = RESET_COLOR finalitem.add_overlay(overlay) diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index c6fb94dce6e5c61b44751ce4dd3bf5ce46fc466e..a40b9a2b1908d68516a9faa02d8a402c8d5efea4 100644 GIT binary patch literal 14762 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 ZX|jpJ4+dlk;5(Rr_I-WzYBlS~{{veOmgfKf literal 14410 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 HtzP{foZ#ZN From d9f1ebd6f52d2ee50f61a17a87f6bd236edb84f8 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 11:44:18 +1000 Subject: [PATCH 44/85] MOVING SOME LINES AROUND FOLKS --- code/modules/smithing/anvil.dm | 2 +- code/modules/smithing/finished_items.dm | 5 +++-- code/modules/smithing/smithed_items.dm | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 73c748e148..ffa8790a17 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -114,6 +114,7 @@ if(user.mind.skill_holder) var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 steptime = 100 / skillmod + playsound(src, 'sound/effects/clang2.ogg',20, 2) if(!do_after(user, steptime, target = src)) return FALSE switch(stepdone) @@ -157,7 +158,6 @@ "You [stepdone] the metal with a loud clang!") playsound(src, 'sound/effects/clang2.ogg',20, 2) addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/clang2.ogg', 20, 2), 15) - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/clang2.ogg', 20, 2), 30) if(length(stepsdone) >= 3) tryfinish(user) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index f36287b33a..33a258cbd2 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/smith.dmi' icon_state = "mace_greyscale" item_state = "mace_greyscale" + color = null material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS total_mass = TOTAL_MASS_MEDIEVAL_WEAPON //yeah ok slot_flags = ITEM_SLOT_BELT @@ -185,7 +186,7 @@ /obj/item/melee/smith/wakizashi name = "wakizashi" sharpness = SHARP_EDGED - item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY + item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY | UNIQUE_RENAME icon_state = "waki" overlay_state = "wakihilt" block_parry_data = /datum/block_parry_data/waki @@ -225,7 +226,7 @@ overlay_state = "katanahilt" force = 7 wielded_mult = 2 - item_flags = ITEM_CAN_PARRY | UNIQUE_RENAME //want to name your katana "DEMON BLADE" or some shit? go ahead, idiot. + item_flags = ITEM_CAN_PARRY | UNIQUE_RENAME | NEEDS_PERMIT //want to name your katana "DEMON BLADE" or some shit? go ahead, idiot. block_parry_data = /datum/block_parry_data/captain_saber //todo /obj/item/melee/smith/sabre diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 1e8c549dd7..121b26c671 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -117,8 +117,8 @@ qualname = "above-average" var/datum/material/mat = custom_materials[1] mat = mat.name - finalitem.name = "[qualname] [mat] [finalitem.name]" - finalitem.desc = "A [qualname] [finalitem.name]." + finalitem.name = "[qualname] [mat] [initial(finalitem.name)]" + finalitem.desc = "A [qualname] [initial(finalitem.name)]." finalitem.forceMove(get_turf(src)) qdel(src) @@ -248,7 +248,7 @@ finalitem = /obj/item/melee/smith/shortsword/scimitar icon_state = "scimitar" -/obj/item/smithing/shortswordblade/startfinish() +/obj/item/smithing/scimitarblade/startfinish() finalitem = new /obj/item/melee/smith/shortsword/scimitar(src) finalitem.force += quality ..() From 97e5fbd29fc43a447ecc7c196fd92f1328b40760 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 11:48:22 +1000 Subject: [PATCH 45/85] YOU CAN UNPACK IT NOW FOLKS, KATANAS NO LONGER DROPDEL --- code/modules/smithing/finished_items.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 33a258cbd2..f7c91187c5 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -186,7 +186,8 @@ /obj/item/melee/smith/wakizashi name = "wakizashi" sharpness = SHARP_EDGED - item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY | UNIQUE_RENAME + item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY + obj_flags = UNIQUE_RENAME icon_state = "waki" overlay_state = "wakihilt" block_parry_data = /datum/block_parry_data/waki @@ -226,7 +227,8 @@ overlay_state = "katanahilt" force = 7 wielded_mult = 2 - item_flags = ITEM_CAN_PARRY | UNIQUE_RENAME | NEEDS_PERMIT //want to name your katana "DEMON BLADE" or some shit? go ahead, idiot. + item_flags = ITEM_CAN_PARRY | NEEDS_PERMIT //want to name your katana "DEMON BLADE" or some shit? go ahead, idiot. + obj_flags = UNIQUE_RENAME block_parry_data = /datum/block_parry_data/captain_saber //todo /obj/item/melee/smith/sabre From 037b939f550b92d65bac5a12009b38e3638e4ded Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 12:36:17 +1000 Subject: [PATCH 46/85] THIS WAS THE PROBLEM THE ENTIRE TIME --- code/modules/smithing/finished_items.dm | 3 +-- code/modules/smithing/smithed_items.dm | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index f7c91187c5..1aa017e100 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -5,7 +5,6 @@ icon = 'icons/obj/smith.dmi' icon_state = "mace_greyscale" item_state = "mace_greyscale" - color = null material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS total_mass = TOTAL_MASS_MEDIEVAL_WEAPON //yeah ok slot_flags = ITEM_SLOT_BELT @@ -24,7 +23,7 @@ if(desc == "cringe") desc = "A handmade [name]." overlay = mutable_appearance(icon, overlay_state) - overlay.color = "FFFFFF" + overlay.appearance_flags = RESET_COLOR add_overlay(overlay) if(force < 0) force = 0 diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 121b26c671..4c23a28aff 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -116,6 +116,7 @@ if(1,2,3) qualname = "above-average" var/datum/material/mat = custom_materials[1] + finalitem.set_custom_materials(custom_materials) mat = mat.name finalitem.name = "[qualname] [mat] [initial(finalitem.name)]" finalitem.desc = "A [qualname] [initial(finalitem.name)]." From 579d7bb4f2361323413377bf8ff4148c7723f337 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 12:49:54 +1000 Subject: [PATCH 47/85] whoops! --- code/modules/smithing/anvil.dm | 2 +- code/modules/smithing/finished_items.dm | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index ffa8790a17..477a337f18 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -11,7 +11,7 @@ #define RECIPE_SMALLKNIFE "sdd" //shrink draw draw #define RECIPE_SHORTSWORD "dff" //draw fold fold -#define RECIPE_WAKI "dfsf" //draw shrink fold +#define RECIPE_WAKI "dfsf" //draw fold shrink fold #define RECIPE_SCIMITAR "dfb" //draw fold bend #define RECIPE_SABRE "ddsf" //draw draw shrink fold #define RECIPE_RAPIER "sdfd" //shrink draw fold draw diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 1aa017e100..fdefe974ac 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -50,8 +50,9 @@ /obj/item/mining_scanner/prospector name = "prospector's pickaxe" desc = "A pickaxe that can sound rocks to find mineral deposits and stop gibtonite detonations." + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS icon = 'icons/obj/smith.dmi' - icon_state = "pickaxe" //todo:sprite + icon_state = "minipick" //todo:sprite sharpness = SHARP_POINTY//it doesnt have a blade it has a point /obj/item/mining_scanner/prospector/Initialize() @@ -67,6 +68,7 @@ /obj/item/pickaxe/smithed name = "pickaxe" desc = "A pickaxe." + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS icon = 'icons/obj/smith.dmi' icon_state = "pickaxe" sharpness = SHARP_POINTY @@ -81,10 +83,14 @@ if(force < 0) force = 0 +/obj/item/pickaxe/smithed/attack_self(mob/user) + to_chat(user, "Tool does not have a configureable dig range.") + /obj/item/shovel/smithed name = "shovel" desc = "A shovel." icon = 'icons/obj/smith.dmi' + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS icon_state = "shovel" sharpness = SHARP_EDGED //it cuts through the earth From ff5c4d779f99ce153237dfaad3ce40540aa61444 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 13:19:05 +1000 Subject: [PATCH 48/85] ok --- code/modules/smithing/finished_items.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index fdefe974ac..55082d3992 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -3,15 +3,15 @@ name = "base class obj/item/melee/smith" //tin. handles overlay and quality and shit. desc = "cringe" icon = 'icons/obj/smith.dmi' - icon_state = "mace_greyscale" - item_state = "mace_greyscale" + icon_state = "claymore" + item_state = "claymore" material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS total_mass = TOTAL_MASS_MEDIEVAL_WEAPON //yeah ok slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL force = 6 - lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' var/quality var/overlay_state = "stick" var/mutable_appearance/overlay From 94e24a97382dbfb95e58751446727c6b7a42a1ec Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 17:52:42 +1000 Subject: [PATCH 49/85] anvillan --- code/modules/cargo/packs/misc.dm | 7 +++++++ code/modules/smithing/anvil.dm | 2 +- code/modules/smithing/smithed_items.dm | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm index c6728831eb..394b86bb81 100644 --- a/code/modules/cargo/packs/misc.dm +++ b/code/modules/cargo/packs/misc.dm @@ -13,6 +13,13 @@ //////////////////// Paperwork and Writing Supplies ////////////////////////// ////////////////////////////////////////////////////////////////////////////// + +/datum/supply_pack/misc/anvil + name = "Anvil Crate" + desc = "An anvil in a crate, we had to dig this out of the old warehouse. It's got wheels on it so you can move it." + cost = 7500 + contains = list(/obj/structure/anvil/obtainable/basic) + /datum/supply_pack/misc/artsupply name = "Art Supplies" desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!" diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 477a337f18..fc4608361b 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -252,7 +252,7 @@ name = "anvil" desc = "An anvil. It's got wheels bolted to the bottom." anvilquality = 0 - itemqualitymax = 5 + itemqualitymax = 6 /obj/structure/anvil/obtainable/ratvar name = "brass anvil" diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 4c23a28aff..daa16e2da3 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -103,7 +103,7 @@ qualname = "shoddy" if(-1000 to -1) qualname = "poor" - if(0) + if(-1 to 1) qualname = "normal" if(10 to INFINITY) qualname = "legendary" From 2df3bbd82245396a20bfc39971e0b497c1fbfdc4 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 18:55:48 +1000 Subject: [PATCH 50/85] r --- code/modules/smithing/anvil.dm | 12 ++++++++++-- code/modules/smithing/smithed_items.dm | 25 +++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index fc4608361b..f3dcefed22 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -162,11 +162,13 @@ tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) + var/artifactchance = (1+(user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/4))/2500 + var/artifact = prob(artifactchance) var/finalfailchance = outrightfailchance if(user.mind.skill_holder) var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 finalfailchance = max(0, finalfailchance / skillmod) //lv 2 gives 20% less to fail, 3 30%, etc - if(currentsteps > 10 || (rng && prob(finalfailchance))) + if(currentsteps > 10 || (rng && prob(finalfailchance)) || artifact) to_chat(user, "") var/turf/T = get_turf(user) workpiece_state = FALSE @@ -183,8 +185,14 @@ var/obj/item/smithing/create = smithrecipes[stepsdone] var/obj/item/smithing/finisheditem = new create(T) to_chat(user, "You finish your [finisheditem]!") + if(artifact) + to_chat(user, "It is an artifact, a creation whose legacy shall live on forevermore.") //todo: SSblackbox + currentquality = max(currentquality, 2) + finisheditem.quality = currentquality * 3//this is insane i know it's 1/2500 for most of the time and 0.8% at best + finisheditem.artifact = TRUE + else + finisheditem.quality = min(currentquality, itemqualitymax) workpiece_state = FALSE - finisheditem.quality = min(currentquality, itemqualitymax) finisheditem.set_custom_materials(workpiece_material) currentquality = anvilquality stepsdone = "" diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index daa16e2da3..47fd9727e2 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -13,6 +13,7 @@ var/quality = 0 //quality. Changed by the smithing process. var/obj/item/finishingitem = /obj/item/stick //What this item needs to be hit by to create finalitem var/obj/item/finalitem + var/artifact = FALSE /obj/item/ingot name = "ingot" @@ -118,11 +119,31 @@ var/datum/material/mat = custom_materials[1] finalitem.set_custom_materials(custom_materials) mat = mat.name - finalitem.name = "[qualname] [mat] [initial(finalitem.name)]" - finalitem.desc = "A [qualname] [initial(finalitem.name)]." + if(artifact) + dwarfyartifact(finalitem, mat) + else + finalitem.name = "[qualname] [mat] [initial(finalitem.name)]" + finalitem.desc = "A [qualname] [initial(finalitem.name)]." finalitem.forceMove(get_turf(src)) qdel(src) + +/obj/item/smithing/proc/dwarfyartifact(var/obj/item/finalitem, var/mat) + var/finaldesc = "A [initial(finalitem.name)] made of [mat], all craftsmanship is of the highest quality. " + switch(pick(1,2,3,4,5)) + if(1) + finaldesc += "It is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapiz lazuli")]." + if(2) + finaldesc += "is laced with studs of [pick("gold","silver","aluminium","titanium")]." + if(3) + finaldesc += "is encircled with bands of [pick("durasteel","metallic hydrogen","ferritic-alloy","plasteel","duranium")]." + if(4) + finaldesc += "menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." + if(5) + finaldesc += "It is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapiz lazuli")],laced with studs of [pick("gold","silver","aluminium","titanium")], encircled with bands of [pick("durasteel","metallic hydrogen","ferritic-alloy","plasteel","duranium")] and menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." + finalitem.desc = finaldesc + finalitem.name = pick("Delersibnir", "Nekolangrir", "Zanoreshik","Öntakrítin", "Nogzatan", "Vunomam", "Nazushagsaldôbar", "Sergeb", "Zafaldastot", "Vudnis", "Dostust", "Shotom", "Mugshith", "Angzak", "Oltud", "Deleratîs", "Nökornomal") //one of these is literally BLOOD POOL CREATE.iirc its Nazushagsaldôbar. + /obj/item/smithing/hammerhead name = "smithed hammer head" finalitem = /obj/item/melee/smith/hammer From e8379eb6a215c0b6811a20a1b36b45c73ec1e0d1 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 19:11:01 +1000 Subject: [PATCH 51/85] whoops --- code/modules/smithing/anvil.dm | 11 ++++++----- code/modules/smithing/finished_items.dm | 2 +- code/modules/smithing/smithed_items.dm | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index f3dcefed22..8e57aaccd3 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -44,6 +44,7 @@ var/outrightfailchance = 1 //todo: document this shit var/stepsdone = "" var/rng = FALSE + var/debug = FALSE //vv this if you want an artifact var/itemqualitymax = 20 var/list/smithrecipes = list(RECIPE_HAMMER = /obj/item/smithing/hammerhead, RECIPE_SCYTHE = /obj/item/smithing/scytheblade, @@ -114,7 +115,7 @@ if(user.mind.skill_holder) var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 steptime = 100 / skillmod - playsound(src, 'sound/effects/clang2.ogg',20, 2) + playsound(src, 'sound/effects/clang2.ogg',40, 2) if(!do_after(user, steptime, target = src)) return FALSE switch(stepdone) @@ -156,14 +157,14 @@ currentquality -= 1 user.visible_message("[user] works the metal on the anvil with their hammer with a loud clang!", \ "You [stepdone] the metal with a loud clang!") - playsound(src, 'sound/effects/clang2.ogg',20, 2) - addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/clang2.ogg', 20, 2), 15) + playsound(src, 'sound/effects/clang2.ogg',40, 2) + addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/clang2.ogg', 40, 2), 15) if(length(stepsdone) >= 3) tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) - var/artifactchance = (1+(user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/4))/2500 - var/artifact = prob(artifactchance) + var/artifactchance = (1+(get_skill_level(/datum/skill/level/dorfy/blacksmithing)/4))/2500 + var/artifact = max(prob(artifactchance), debug) var/finalfailchance = outrightfailchance if(user.mind.skill_holder) var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 55082d3992..133009e5d1 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -220,7 +220,7 @@ /obj/item/melee/smith/twohand/zweihander name = "zweihander" - icon_state = "zweihander" + icon_state = "zwei" overlay_state = "zweihilt" total_mass = TOTAL_MASS_MEDIEVAL_WEAPON * 2 force = 4 diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 47fd9727e2..7e89b88afb 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -129,10 +129,10 @@ /obj/item/smithing/proc/dwarfyartifact(var/obj/item/finalitem, var/mat) - var/finaldesc = "A [initial(finalitem.name)] made of [mat], all craftsmanship is of the highest quality. " + var/finaldesc = "A [initial(finalitem.name)] made of [mat], all craftsmanship is of the highest quality. It " switch(pick(1,2,3,4,5)) if(1) - finaldesc += "It is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapiz lazuli")]." + finaldesc += "is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapiz lazuli")]." if(2) finaldesc += "is laced with studs of [pick("gold","silver","aluminium","titanium")]." if(3) @@ -140,7 +140,7 @@ if(4) finaldesc += "menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." if(5) - finaldesc += "It is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapiz lazuli")],laced with studs of [pick("gold","silver","aluminium","titanium")], encircled with bands of [pick("durasteel","metallic hydrogen","ferritic-alloy","plasteel","duranium")] and menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." + finaldesc += "is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapiz lazuli")],laced with studs of [pick("gold","silver","aluminium","titanium")], encircled with bands of [pick("durasteel","metallic hydrogen","ferritic-alloy","plasteel","duranium")] and menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." finalitem.desc = finaldesc finalitem.name = pick("Delersibnir", "Nekolangrir", "Zanoreshik","Öntakrítin", "Nogzatan", "Vunomam", "Nazushagsaldôbar", "Sergeb", "Zafaldastot", "Vudnis", "Dostust", "Shotom", "Mugshith", "Angzak", "Oltud", "Deleratîs", "Nökornomal") //one of these is literally BLOOD POOL CREATE.iirc its Nazushagsaldôbar. @@ -347,7 +347,7 @@ name = "smithed zweihander blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/twohand/zweihander - icon_state = "zweihander" + icon_state = "zwei" /obj/item/smithing/zweiblade/startfinish() var/obj/item/melee/smith/twohand/zweihander/finalforreal = new /obj/item/melee/smith/twohand/zweihander(src) From 9d9a6d0d5d321f590890840c44b8b16eb84dec24 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Mon, 24 Aug 2020 20:33:21 +1000 Subject: [PATCH 52/85] Update anvil.dm --- code/modules/smithing/anvil.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 8e57aaccd3..892cf6c40a 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -163,7 +163,7 @@ tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) - var/artifactchance = (1+(get_skill_level(/datum/skill/level/dorfy/blacksmithing)/4))/2500 + var/artifactchance = (1+(user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/4))/2500 var/artifact = max(prob(artifactchance), debug) var/finalfailchance = outrightfailchance if(user.mind.skill_holder) From e646b3af32a2d1234dccd6485c43ad1b2ca08d1c Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 21:03:11 +1000 Subject: [PATCH 53/85] bet --- code/modules/smithing/smithed_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 7e89b88afb..bf0c50b23f 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -140,7 +140,7 @@ if(4) finaldesc += "menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." if(5) - finaldesc += "is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapiz lazuli")],laced with studs of [pick("gold","silver","aluminium","titanium")], encircled with bands of [pick("durasteel","metallic hydrogen","ferritic-alloy","plasteel","duranium")] and menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." + finaldesc += "is encrusted with [pick("","synthetic ","multi-faceted ","magical ","sparkling ") + pick("rubies","emeralds","jade","opals","lapis lazuli")],laced with studs of [pick("gold","silver","aluminium","titanium")], encircled with bands of [pick("durasteel","metallic hydrogen","ferritic-alloy","plasteel","duranium")] and menaces with spikes of [pick("ytterbium","uranium","white pearl","black steel")]." finalitem.desc = finaldesc finalitem.name = pick("Delersibnir", "Nekolangrir", "Zanoreshik","Öntakrítin", "Nogzatan", "Vunomam", "Nazushagsaldôbar", "Sergeb", "Zafaldastot", "Vudnis", "Dostust", "Shotom", "Mugshith", "Angzak", "Oltud", "Deleratîs", "Nökornomal") //one of these is literally BLOOD POOL CREATE.iirc its Nazushagsaldôbar. From dcbdc05c5a346b2b98fedccd025caf3d46c26ccc Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 23:31:21 +1000 Subject: [PATCH 54/85] Update smithed_items.dm --- code/modules/smithing/smithed_items.dm | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index bf0c50b23f..6ee0d221cf 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -151,7 +151,7 @@ /obj/item/smithing/hammerhead/startfinish() var/obj/item/melee/smith/hammer/finalforreal = new /obj/item/melee/smith/hammer(src) - finalforreal.force += quality/2 + finalforreal.force *= 1+(quality/15) finalforreal.qualitymod = quality/4 finalitem = finalforreal ..() @@ -165,7 +165,7 @@ /obj/item/smithing/scytheblade/startfinish() finalitem = new /obj/item/scythe/smithed(src) - finalitem.force += quality + finalitem.force *= 1+(quality/10) ..() /obj/item/smithing/shovelhead @@ -175,7 +175,7 @@ /obj/item/smithing/shovelhead/startfinish() finalitem = new /obj/item/shovel/smithed(src) - finalitem.force += quality/2 + finalitem.force *= 1+(quality/20) if(quality) finalitem.toolspeed /= quality ..() @@ -187,7 +187,7 @@ /obj/item/smithing/cogheadclubhead/startfinish() finalitem = new /obj/item/melee/smith/cogheadclub(src) - finalitem.force += quality + finalitem.force *= 1+(quality/10) ..() /obj/item/smithing/javelinhead @@ -197,7 +197,7 @@ /obj/item/smithing/javelinhead/startfinish() var/obj/item/melee/smith/twohand/javelin/finalforreal = new /obj/item/melee/smith/twohand/javelin(src) - finalforreal.force += quality + finalforreal.force += *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalforreal.throwforce = finalforreal.force*2 @@ -211,7 +211,7 @@ /obj/item/smithing/pikehead/startfinish() var/obj/item/melee/smith/twohand/pike/finalforreal = new /obj/item/melee/smith/twohand/pike(src) - finalforreal.force += quality + finalforreal.force *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalforreal.throwforce = finalforreal.force/10 //its a pike not a javelin @@ -225,7 +225,7 @@ /obj/item/smithing/pickaxehead/startfinish() var/obj/item/pickaxe/smithed/finalforreal = new /obj/item/pickaxe/smithed(src) - finalforreal.force += quality/2 + finalforreal.force *= 1+(quality/20) if(quality) finalforreal.toolspeed /= quality switch(quality) @@ -261,7 +261,7 @@ /obj/item/smithing/shortswordblade/startfinish() finalitem = new /obj/item/melee/smith/shortsword(src) - finalitem.force += quality + finalitem.force *= 1+(quality/10) ..() /obj/item/smithing/scimitarblade @@ -272,7 +272,7 @@ /obj/item/smithing/scimitarblade/startfinish() finalitem = new /obj/item/melee/smith/shortsword/scimitar(src) - finalitem.force += quality + finalitem.force *= 1+(quality/10) ..() /obj/item/smithing/wakiblade @@ -283,7 +283,7 @@ /obj/item/smithing/wakiblade/startfinish() finalitem = new /obj/item/melee/smith/wakizashi(src) - finalitem.force += quality + finalitem.force *= 1+(quality/10) ..() /obj/item/smithing/sabreblade @@ -294,7 +294,7 @@ /obj/item/smithing/sabrerblade/startfinish() finalitem = new /obj/item/melee/smith/sabre(src) - finalitem.force += quality + finalitem.force *= 1+(quality/10) ..() /obj/item/smithing/rapierblade @@ -305,7 +305,7 @@ /obj/item/smithing/rapierblade/startfinish() finalitem = new /obj/item/melee/smith/sabre/rapier(src) - finalitem.force += quality + finalitem.force *= 1+(quality/10) ..() /obj/item/smithing/knifeblade @@ -337,7 +337,7 @@ /obj/item/smithing/broadblade/startfinish() var/obj/item/melee/smith/twohand/broadsword/finalforreal = new /obj/item/melee/smith/twohand/broadsword(src) - finalforreal.force += quality + finalforreal.force *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal @@ -351,7 +351,7 @@ /obj/item/smithing/zweiblade/startfinish() var/obj/item/melee/smith/twohand/zweihander/finalforreal = new /obj/item/melee/smith/twohand/zweihander(src) - finalforreal.force += quality + finalforreal.force *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal @@ -364,7 +364,7 @@ /obj/item/smithing/halberdhead/startfinish() var/obj/item/melee/smith/twohand/halberd/finalforreal = new /obj/item/melee/smith/twohand/halberd(src) - finalforreal.force += quality + finalforreal.force *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.throwforce = finalforreal.force/3 finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") @@ -376,9 +376,9 @@ finalitem = /obj/item/melee/smith/twohand/glaive icon_state = "glaive" -/obj/item/smithing/glaive/startfinish() +/obj/item/smithing/glaivehead/startfinish() var/obj/item/melee/smith/twohand/glaive/finalforreal = new /obj/item/melee/smith/twohand/glaive(src) - finalforreal.force += quality + finalforreal.force *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.throwforce = finalforreal.force finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") @@ -394,7 +394,7 @@ /obj/item/smithing/katanablade/startfinish() var/obj/item/melee/smith/twohand/katana/finalforreal = new /obj/item/melee/smith/twohand/katana(src) - finalforreal.force += quality + finalforreal.force *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal From a2f33d27a2aa0419a8c3cf4104a74843f2952511 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 23:42:39 +1000 Subject: [PATCH 55/85] ee --- code/modules/smithing/anvil.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 892cf6c40a..12473a3ebc 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -169,7 +169,7 @@ if(user.mind.skill_holder) var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 finalfailchance = max(0, finalfailchance / skillmod) //lv 2 gives 20% less to fail, 3 30%, etc - if(currentsteps > 10 || (rng && prob(finalfailchance)) || artifact) + if(currentsteps > 10 || (rng && prob(finalfailchance)) || !artifact) to_chat(user, "") var/turf/T = get_turf(user) workpiece_state = FALSE From 4e82ce87eb53261ee20de819c8a90759e130df09 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 23:43:42 +1000 Subject: [PATCH 56/85] EEEEEEEEEEEEe --- code/modules/smithing/smithed_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 6ee0d221cf..78064a528e 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -197,7 +197,7 @@ /obj/item/smithing/javelinhead/startfinish() var/obj/item/melee/smith/twohand/javelin/finalforreal = new /obj/item/melee/smith/twohand/javelin(src) - finalforreal.force += *= 1+(quality/10) + finalforreal.force *= 1+(quality/10) finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalforreal.throwforce = finalforreal.force*2 From b5c000cac4e8f71ad33b997712b687f3dffb805e Mon Sep 17 00:00:00 2001 From: lolman360 Date: Mon, 24 Aug 2020 23:48:45 +1000 Subject: [PATCH 57/85] eee --- code/modules/smithing/anvil.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 12473a3ebc..f873b62dd8 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -45,6 +45,7 @@ var/stepsdone = "" var/rng = FALSE var/debug = FALSE //vv this if you want an artifact + var/artifactrolled = FALSE var/itemqualitymax = 20 var/list/smithrecipes = list(RECIPE_HAMMER = /obj/item/smithing/hammerhead, RECIPE_SCYTHE = /obj/item/smithing/scytheblade, @@ -163,13 +164,16 @@ tryfinish(user) /obj/structure/anvil/proc/tryfinish(mob/user) - var/artifactchance = (1+(user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/4))/2500 + var/artifactchance = 0 + if(!artifactrolled) + artifactchance = (1+(user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/4))/2500 + artifactrolled = TRUE var/artifact = max(prob(artifactchance), debug) var/finalfailchance = outrightfailchance if(user.mind.skill_holder) var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 finalfailchance = max(0, finalfailchance / skillmod) //lv 2 gives 20% less to fail, 3 30%, etc - if(currentsteps > 10 || (rng && prob(finalfailchance)) || !artifact) + if((currentsteps > 10 || (rng && prob(finalfailchance))) && !artifact) to_chat(user, "") var/turf/T = get_turf(user) workpiece_state = FALSE @@ -178,6 +182,7 @@ stepsdone = "" currentsteps = 0 outrightfailchance = 1 + artifactrolled = FALSE if(user.mind.skill_holder) user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 25, 400, silent = FALSE) for(var/i in smithrecipes) @@ -199,6 +204,7 @@ stepsdone = "" currentsteps = 0 outrightfailchance = 1 + artifactrolled = FALSE if(user.mind.skill_holder) user.mind.auto_gain_experience(/datum/skill/level/dorfy/blacksmithing, 50, 10000000, silent = FALSE) break From c79f63bd008353d97632dcaa77f3119ed4e4fa6c Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 25 Aug 2020 18:54:22 +1000 Subject: [PATCH 58/85] e --- code/modules/smithing/smithed_items.dm | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 78064a528e..ddc0c0e93a 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -108,13 +108,13 @@ qualname = "normal" if(10 to INFINITY) qualname = "legendary" - if(8,9) + if(7.5 to 10) qualname = "masterwork" - if(6,7) + if(5.5 to 7.5) qualname = "excellent" - if(4,5) + if(3.5 to 5.5) qualname = "good" - if(1,2,3) + if(0 to 3.5) qualname = "above-average" var/datum/material/mat = custom_materials[1] finalitem.set_custom_materials(custom_materials) @@ -123,7 +123,7 @@ dwarfyartifact(finalitem, mat) else finalitem.name = "[qualname] [mat] [initial(finalitem.name)]" - finalitem.desc = "A [qualname] [initial(finalitem.name)]." + finalitem.desc = "A [qualname] [initial(finalitem.name)]. Its quality is [quality]." finalitem.forceMove(get_turf(src)) qdel(src) @@ -176,8 +176,10 @@ /obj/item/smithing/shovelhead/startfinish() finalitem = new /obj/item/shovel/smithed(src) finalitem.force *= 1+(quality/20) - if(quality) + if(quality > 0) finalitem.toolspeed /= quality + else + finalitem.toolspeed *= (quality * -1) ..() /obj/item/smithing/cogheadclubhead @@ -226,8 +228,10 @@ /obj/item/smithing/pickaxehead/startfinish() var/obj/item/pickaxe/smithed/finalforreal = new /obj/item/pickaxe/smithed(src) finalforreal.force *= 1+(quality/20) - if(quality) + if(quality > 0) finalforreal.toolspeed /= quality + else + finalforreal.toolspeed *= (quality * -1) switch(quality) if(10 to INFINITY) finalforreal.digrange = 4 @@ -235,6 +239,8 @@ finalforreal.digrange = 3 if(3,4) finalforreal.digrange = 2 + else + finalforreal.digrange = 1 finalitem = finalforreal ..() From 6b096d80cc041364f01f8d59ba85b08f5172d1bf Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 25 Aug 2020 18:55:57 +1000 Subject: [PATCH 59/85] eee o aaa --- code/datums/components/crafting/recipes/recipes_misc.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index ca1b65e220..14987bac44 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -119,7 +119,7 @@ subcategory = CAT_MISCELLANEOUS category = CAT_MISC always_availible = FALSE // Disabled til learned - + /datum/crafting_recipe/furnace name = "Sandstone Furnace" result = /obj/structure/furnace @@ -422,7 +422,6 @@ name = "Stick" time = 30 reqs = list(/obj/item/stack/sheet/mineral/wood = 1) - tools = list(/obj/item/hatchet) result = /obj/item/stick subcategory = CAT_MISCELLANEOUS category = CAT_MISC @@ -432,7 +431,6 @@ name = "Sword Hilt" time = 30 reqs = list(/obj/item/stack/sheet/mineral/wood = 2) - tools = list(/obj/item/hatchet) result = /obj/item/swordhandle subcategory = CAT_MISCELLANEOUS category = CAT_MISC From 519592693be290c978e2dd7acaf6a65789abe761 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 25 Aug 2020 19:01:07 +1000 Subject: [PATCH 60/85] e --- code/modules/smithing/finished_items.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 133009e5d1..ffb862040d 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -177,6 +177,7 @@ /obj/item/melee/smith/shortsword name = "gladius" + force = 9 item_flags = NEEDS_PERMIT sharpness = SHARP_EDGED icon_state = "gladius" @@ -191,6 +192,7 @@ /obj/item/melee/smith/wakizashi name = "wakizashi" sharpness = SHARP_EDGED + force = 9 item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY obj_flags = UNIQUE_RENAME icon_state = "waki" From 43af2650377e540073e1c5c42b8d9536367c1d1e Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 25 Aug 2020 19:01:24 +1000 Subject: [PATCH 61/85] Update finished_items.dm --- code/modules/smithing/finished_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index ffb862040d..4ea5c441cf 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -192,7 +192,7 @@ /obj/item/melee/smith/wakizashi name = "wakizashi" sharpness = SHARP_EDGED - force = 9 + force = 7 item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY obj_flags = UNIQUE_RENAME icon_state = "waki" From 2b057b2483cedd365db3ec86c00af2c06fbd20ee Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 25 Aug 2020 19:03:04 +1000 Subject: [PATCH 62/85] reverti9es --- code/modules/smithing/smithed_items.dm | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index ddc0c0e93a..2d1a998b28 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -151,7 +151,7 @@ /obj/item/smithing/hammerhead/startfinish() var/obj/item/melee/smith/hammer/finalforreal = new /obj/item/melee/smith/hammer(src) - finalforreal.force *= 1+(quality/15) + finalforreal.force += quality/2 finalforreal.qualitymod = quality/4 finalitem = finalforreal ..() @@ -165,7 +165,7 @@ /obj/item/smithing/scytheblade/startfinish() finalitem = new /obj/item/scythe/smithed(src) - finalitem.force *= 1+(quality/10) + finalitem.force += quality ..() /obj/item/smithing/shovelhead @@ -175,7 +175,7 @@ /obj/item/smithing/shovelhead/startfinish() finalitem = new /obj/item/shovel/smithed(src) - finalitem.force *= 1+(quality/20) + finalitem.force += quality/2 if(quality > 0) finalitem.toolspeed /= quality else @@ -189,7 +189,7 @@ /obj/item/smithing/cogheadclubhead/startfinish() finalitem = new /obj/item/melee/smith/cogheadclub(src) - finalitem.force *= 1+(quality/10) + finalitem.force += quality ..() /obj/item/smithing/javelinhead @@ -199,7 +199,7 @@ /obj/item/smithing/javelinhead/startfinish() var/obj/item/melee/smith/twohand/javelin/finalforreal = new /obj/item/melee/smith/twohand/javelin(src) - finalforreal.force *= 1+(quality/10) + finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalforreal.throwforce = finalforreal.force*2 @@ -213,7 +213,7 @@ /obj/item/smithing/pikehead/startfinish() var/obj/item/melee/smith/twohand/pike/finalforreal = new /obj/item/melee/smith/twohand/pike(src) - finalforreal.force *= 1+(quality/10) + finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalforreal.throwforce = finalforreal.force/10 //its a pike not a javelin @@ -227,7 +227,7 @@ /obj/item/smithing/pickaxehead/startfinish() var/obj/item/pickaxe/smithed/finalforreal = new /obj/item/pickaxe/smithed(src) - finalforreal.force *= 1+(quality/20) + finalforreal.force += quality/2 if(quality > 0) finalforreal.toolspeed /= quality else @@ -267,7 +267,7 @@ /obj/item/smithing/shortswordblade/startfinish() finalitem = new /obj/item/melee/smith/shortsword(src) - finalitem.force *= 1+(quality/10) + finalitem.force += quality ..() /obj/item/smithing/scimitarblade @@ -278,7 +278,7 @@ /obj/item/smithing/scimitarblade/startfinish() finalitem = new /obj/item/melee/smith/shortsword/scimitar(src) - finalitem.force *= 1+(quality/10) + finalitem.force += quality ..() /obj/item/smithing/wakiblade @@ -289,7 +289,7 @@ /obj/item/smithing/wakiblade/startfinish() finalitem = new /obj/item/melee/smith/wakizashi(src) - finalitem.force *= 1+(quality/10) + finalitem.force += quality ..() /obj/item/smithing/sabreblade @@ -300,7 +300,7 @@ /obj/item/smithing/sabrerblade/startfinish() finalitem = new /obj/item/melee/smith/sabre(src) - finalitem.force *= 1+(quality/10) + finalitem.force += quality ..() /obj/item/smithing/rapierblade @@ -311,7 +311,7 @@ /obj/item/smithing/rapierblade/startfinish() finalitem = new /obj/item/melee/smith/sabre/rapier(src) - finalitem.force *= 1+(quality/10) + finalitem.force += quality ..() /obj/item/smithing/knifeblade @@ -343,7 +343,7 @@ /obj/item/smithing/broadblade/startfinish() var/obj/item/melee/smith/twohand/broadsword/finalforreal = new /obj/item/melee/smith/twohand/broadsword(src) - finalforreal.force *= 1+(quality/10) + finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal @@ -357,7 +357,7 @@ /obj/item/smithing/zweiblade/startfinish() var/obj/item/melee/smith/twohand/zweihander/finalforreal = new /obj/item/melee/smith/twohand/zweihander(src) - finalforreal.force *= 1+(quality/10) + finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal @@ -370,7 +370,7 @@ /obj/item/smithing/halberdhead/startfinish() var/obj/item/melee/smith/twohand/halberd/finalforreal = new /obj/item/melee/smith/twohand/halberd(src) - finalforreal.force *= 1+(quality/10) + finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.throwforce = finalforreal.force/3 finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") @@ -382,9 +382,9 @@ finalitem = /obj/item/melee/smith/twohand/glaive icon_state = "glaive" -/obj/item/smithing/glaivehead/startfinish() +/obj/item/smithing/glaive/startfinish() var/obj/item/melee/smith/twohand/glaive/finalforreal = new /obj/item/melee/smith/twohand/glaive(src) - finalforreal.force *= 1+(quality/10) + finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.throwforce = finalforreal.force finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") @@ -400,7 +400,7 @@ /obj/item/smithing/katanablade/startfinish() var/obj/item/melee/smith/twohand/katana/finalforreal = new /obj/item/melee/smith/twohand/katana(src) - finalforreal.force *= 1+(quality/10) + finalforreal.force += quality finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]") finalitem = finalforreal From 408babe0dc25089a34678267e33ad7e76aa4ac6e Mon Sep 17 00:00:00 2001 From: lolman360 Date: Thu, 27 Aug 2020 12:00:11 +1000 Subject: [PATCH 63/85] Math --- code/modules/smithing/smithed_items.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 2d1a998b28..29c4091d1e 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -177,9 +177,11 @@ finalitem = new /obj/item/shovel/smithed(src) finalitem.force += quality/2 if(quality > 0) - finalitem.toolspeed /= quality + finalforreal.toolspeed = max(0.05,(1-(quality/10))) + else if(quality = 0) + finalforreal.toolspeed = 1 else - finalitem.toolspeed *= (quality * -1) + finalforreal.toolspeed *= (quality * -1) ..() /obj/item/smithing/cogheadclubhead @@ -229,7 +231,9 @@ var/obj/item/pickaxe/smithed/finalforreal = new /obj/item/pickaxe/smithed(src) finalforreal.force += quality/2 if(quality > 0) - finalforreal.toolspeed /= quality + finalforreal.toolspeed = max(0.05,(1-(quality/10))) + else if(quality = 0) + finalforreal.toolspeed = 1 else finalforreal.toolspeed *= (quality * -1) switch(quality) From a988dcce73b9027d381bad3896d89f60403f2c18 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Thu, 27 Aug 2020 12:02:18 +1000 Subject: [PATCH 64/85] better --- code/modules/smithing/smithed_items.dm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 29c4091d1e..e066d708cf 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -178,10 +178,8 @@ finalitem.force += quality/2 if(quality > 0) finalforreal.toolspeed = max(0.05,(1-(quality/10))) - else if(quality = 0) - finalforreal.toolspeed = 1 else - finalforreal.toolspeed *= (quality * -1) + finalforreal.toolspeed *= max(1, (quality * -1)) ..() /obj/item/smithing/cogheadclubhead @@ -232,10 +230,8 @@ finalforreal.force += quality/2 if(quality > 0) finalforreal.toolspeed = max(0.05,(1-(quality/10))) - else if(quality = 0) - finalforreal.toolspeed = 1 else - finalforreal.toolspeed *= (quality * -1) + finalforreal.toolspeed *= max(1, (quality * -1)) switch(quality) if(10 to INFINITY) finalforreal.digrange = 4 From 54c32f916275103d72577014b85b552e4505be33 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Thu, 27 Aug 2020 17:43:46 +1000 Subject: [PATCH 65/85] Update smithed_items.dm --- code/modules/smithing/smithed_items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index e066d708cf..0965b1b834 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -177,9 +177,9 @@ finalitem = new /obj/item/shovel/smithed(src) finalitem.force += quality/2 if(quality > 0) - finalforreal.toolspeed = max(0.05,(1-(quality/10))) + finalitem.toolspeed = max(0.05,(1-(quality/10))) else - finalforreal.toolspeed *= max(1, (quality * -1)) + finalitem.toolspeed *= max(1, (quality * -1)) ..() /obj/item/smithing/cogheadclubhead From 55c825032413b0a68df9fa7cade6013034c06805 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Fri, 28 Aug 2020 12:44:59 +1000 Subject: [PATCH 66/85] AAAAAAAAAAAAAAAAA --- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index aeb27dd401..9ed930b8c7 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -623,6 +623,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ new/datum/stack_recipe("brass stool", /obj/structure/chair/stool/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass anvil", /obj/structure/anvil/obtainable/ratvar, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("brass furnace", /obj/structure/furnace/infinite/ratvar, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ null, \ new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ From c2ded74d6a47e7835e69a7f9b0b6b34a388627f0 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Fri, 28 Aug 2020 12:54:58 +1000 Subject: [PATCH 67/85] e --- code/modules/smithing/smithed_items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index 0965b1b834..df30a01f8c 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -179,7 +179,7 @@ if(quality > 0) finalitem.toolspeed = max(0.05,(1-(quality/10))) else - finalitem.toolspeed *= max(1, (quality * -1)) + finalitem.toolspeed *= max(1, (quality * -1)) ..() /obj/item/smithing/cogheadclubhead @@ -298,7 +298,7 @@ finalitem = /obj/item/melee/smith/sabre icon_state = "sabre" -/obj/item/smithing/sabrerblade/startfinish() +/obj/item/smithing/sabreblade/startfinish() finalitem = new /obj/item/melee/smith/sabre(src) finalitem.force += quality ..() From a7d68281a3c1238430af3e92f8203d0aa827d4cb Mon Sep 17 00:00:00 2001 From: kiwedespars <47008095+kiwedespars@users.noreply.github.com> Date: Fri, 28 Aug 2020 16:42:25 -0700 Subject: [PATCH 68/85] new changes - runes can now be destroyed by non-heretics using a bible or a null rod - mansus grasp now has a unique inhand color. - madness grasp now has a unique inhand color. - blood siphon is now redder. - silence spell, lasts 20 seconds, gives an obvious message to the victim. - fire immunity passive for ash - guaranteed dislocation passive for flesh - rust grasp passive for disgusting mood/vomiting - rust grasp cooldown reduced by 75% on hit - living heart now checks z-level when telling you where someone is. - grasp of decay: forced corrosion for 20 seconds, can make you vomit. probably shitcode. - madness touch: give people trauma, braindamage and a terrible mood. - nightwatcher's rite: fire shotgun that can do 75 damage on point blank - flesh sickle buffed a bit. - descriptions touched up a bit. --- code/datums/status_effects/debuffs.dm | 32 ++++ .../eldritch_cult/eldritch_antag.dm | 7 +- .../eldritch_cult/eldritch_effects.dm | 6 +- .../eldritch_cult/eldritch_items.dm | 27 ++-- .../eldritch_cult/eldritch_knowledge.dm | 10 +- .../eldritch_cult/eldritch_magic.dm | 149 +++++++++++++----- .../eldritch_cult/knowledge/ash_lore.dm | 27 +++- .../eldritch_cult/knowledge/flesh_lore.dm | 29 +++- .../eldritch_cult/knowledge/rust_lore.dm | 50 ++++-- icons/effects/mouse_pointers/mute_target.dmi | Bin 0 -> 539 bytes icons/mob/actions/actions_ecult.dmi | Bin 48398 -> 48756 bytes icons/mob/inhands/items_lefthand.dmi | Bin 22741 -> 22383 bytes icons/mob/inhands/items_righthand.dmi | Bin 24751 -> 24537 bytes icons/obj/eldritch.dmi | Bin 7557 -> 23269 bytes 14 files changed, 267 insertions(+), 70 deletions(-) create mode 100644 icons/effects/mouse_pointers/mute_target.dmi diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 9cd47403d1..a2f534115a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -533,6 +533,38 @@ if(100) H.adjustOrganLoss(ORGAN_SLOT_BRAIN,20) +/datum/status_effect/corrosion_curse/lesser + id = "corrosion_curse_lesser" + duration = 20 SECONDS + +/datum/status_effect/corrosion_curse/lesser/tick() + . = ..() + if(!ishuman(owner)) + return + var/mob/living/carbon/human/H = owner + var/chance = rand(0,100) + switch(chance) + if(0 to 19) + H.adjustBruteLoss(6) + if(20 to 29) + H.Dizzy(10) + if(30 to 39) + H.adjustOrganLoss(ORGAN_SLOT_LIVER,2) + if(40 to 49) + H.adjustOrganLoss(ORGAN_SLOT_HEART,2) + if(50 to 59) + H.adjustOrganLoss(ORGAN_SLOT_STOMACH,2) + if(60 to 69) + H.adjustOrganLoss(ORGAN_SLOT_EYES,5) + if(70 to 79) + H.adjustOrganLoss(ORGAN_SLOT_EARS,5) + if(80 to 89) + H.adjustOrganLoss(ORGAN_SLOT_LUNGS,5) + if(90 to 99) + H.adjustOrganLoss(ORGAN_SLOT_TONGUE,5) + if(100) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN,10) + /datum/status_effect/amok id = "amok" status_type = STATUS_EFFECT_REPLACE diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index 367710b110..79c5418075 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -29,6 +29,7 @@ /datum/antagonist/heretic/on_gain() var/mob/living/current = owner.current + owner.teach_crafting_recipe(/datum/crafting_recipe/heretic/codex) if(ishuman(current)) forge_primary_objectives() gain_knowledge(/datum/eldritch_knowledge/spell/basic) @@ -40,7 +41,6 @@ START_PROCESSING(SSprocessing,src) if(give_equipment) equip_cultist() - owner.teach_crafting_recipe(/datum/crafting_recipe/heretic/codex) return ..() /datum/antagonist/heretic/on_removal() @@ -110,17 +110,12 @@ P.find_target(owners,assasination) protection += P.target objectives += P - var/datum/objective/sacrifice_ecult/SE = new SE.owner = owner SE.update_explanation_text() objectives += SE - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - /datum/antagonist/heretic/apply_innate_effects(mob/living/mob_override) . = ..() var/mob/living/current = owner.current diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm index 899e588bda..99794024f1 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm @@ -20,9 +20,11 @@ if(!is_in_use) INVOKE_ASYNC(src, .proc/activate , user) -/obj/effect/eldritch/attacked_by(obj/item/I, mob/living/user) +/obj/effect/eldritch/attackby(obj/item/I, mob/living/user) . = ..() - if(istype(I,/obj/item/nullrod)) + if(istype(I, /obj/item/storage/book/bible) || istype(I, /obj/item/nullrod)) + user.say("BEGONE FOUL MAGICKS!!", forced = "bible") + to_chat(user, "You disrupt the magic of [src] with [I].") qdel(src) /obj/effect/eldritch/proc/activate(mob/living/user) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 4dab6d789d..2052a2fbb3 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -16,16 +16,19 @@ return var/dist = get_dist(user.loc,target.loc) var/dir = get_dir(user.loc,target.loc) - - switch(dist) - if(0 to 15) - to_chat(user,"[target.real_name] is near you. They are to the [dir2text(dir)] of you!") - if(16 to 31) - to_chat(user,"[target.real_name] is somewhere in your vicinty. They are to the [dir2text(dir)] of you!") - if(32 to 127) - to_chat(user,"[target.real_name] is far away from you. They are to the [dir2text(dir)] of you!") - else - to_chat(user,"[target.real_name] is beyond our reach.") + + if(user.z != target.z) + to_chat(user,"[target.real_name] is beyond our reach.") + else + switch(dist) + if(0 to 15) + to_chat(user,"[target.real_name] is near you. They are to the [dir2text(dir)] of you!") + if(16 to 31) + to_chat(user,"[target.real_name] is somewhere in your vicinty. They are to the [dir2text(dir)] of you!") + if(32 to 127) + to_chat(user,"[target.real_name] is far away from you. They are to the [dir2text(dir)] of you!") + else + to_chat(user,"[target.real_name] is beyond our reach.") if(target.stat == DEAD) to_chat(user,"[target.real_name] is dead. Bring them onto a transmutation rune!") @@ -86,8 +89,8 @@ desc = "A crescent blade born from a fleshwarped creature. Keenly aware, it seeks to spread to others the excruciations it has endured from dead origins." icon_state = "flesh_blade" item_state = "flesh_blade" - wound_bonus = 5 - bare_wound_bonus = 15 + wound_bonus = 10 + bare_wound_bonus = 20 /obj/item/clothing/neck/eldritch_amulet name = "warm eldritch medallion" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm index 065844bedf..27868a3e3e 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm @@ -224,7 +224,7 @@ name = "Break of Dawn" desc = "Starts your journey in the mansus. Allows you to select a target using a living heart on a transmutation rune." gain_text = "Gates of Mansus open up to your mind." - next_knowledge = list(/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_flesh) + next_knowledge = list(/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/spell/silence) cost = 0 spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/mansus_grasp required_atoms = list(/obj/item/living_heart) @@ -301,3 +301,11 @@ required_atoms = list(/obj/item/shard,/obj/item/stack/rods) result_atoms = list(/obj/item/melee/sickly_blade) route = "Start" + +/datum/eldritch_knowledge/spell/silence + name = "Silence" + desc = "Allows you to use the power of the Mansus to force an individual's tongue to be held down for up to twenty seconds. They'll notice quickly, however." + gain_text = "They must hold their tongues, for they do not understand." + cost = 1 + spell_to_add = /obj/effect/proc_holder/spell/pointed/trigger/mute/eldritch + route = PATH_SIDE diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index d84a997e28..799667999e 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -43,8 +43,9 @@ /obj/item/melee/touch_attack/mansus_fist name = "Mansus Grasp" desc = "A sinister looking aura that distorts the flow of reality around it. Causes knockdown, major stamina damage aswell as some Brute. It gains additional beneficial effects with certain knowledges you can research." - icon_state = "disintegrate" - item_state = "disintegrate" + icon = 'icons/obj/eldritch.dmi' + icon_state = "mansus_grasp" + item_state = "mansus" catchphrase = "T'IESA SIE'KTI VISATA" /obj/item/melee/touch_attack/mansus_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters) @@ -118,6 +119,7 @@ /obj/item/melee/touch_attack/blood_siphon name = "Blood Siphon" desc = "A sinister looking aura that distorts the flow of reality around it." + color = RUNE_COLOR_RED icon_state = "disintegrate" item_state = "disintegrate" catchphrase = "SUN'AI'KINI'MAS" @@ -260,41 +262,82 @@ /obj/effect/proc_holder/spell/pointed/cleave/long charge_max = 650 -/obj/effect/proc_holder/spell/pointed/touch/mad_touch +/obj/effect/proc_holder/spell/targeted/touch/mad_touch name = "Touch of Madness" - desc = "Touch spell that drains your enemies sanity." - school = "transmutation" - charge_max = 150 + desc = "Touch spell that allows you to force the knowledge of the mansus upon your foes." + hand_path = /obj/item/melee/touch_attack/mad_touch + school = "evocation" + charge_max = 1800 clothes_req = FALSE - invocation_type = "none" - range = 2 action_icon = 'icons/mob/actions/actions_ecult.dmi' action_icon_state = "mad_touch" action_background_icon_state = "bg_ecult" -/obj/effect/proc_holder/spell/pointed/touch/mad_touch/can_target(atom/target, mob/user, silent) - . = ..() - if(!.) - return FALSE - if(!istype(target,/mob/living/carbon/human)) - if(!silent) - to_chat(user, "You are unable to touch [target]!") - return FALSE - return TRUE +/obj/item/melee/touch_attack/mad_touch + name = "Touch of Madness" + desc = "A sinister looking aura that shatters your enemies minds." + icon = 'icons/obj/eldritch.dmi' + icon_state = "mad_touch" + item_state = "madness" + catchphrase = "SUNA'IKINTI PROTA" -/obj/effect/proc_holder/spell/pointed/touch/mad_touch/cast(list/targets, mob/user) - . = ..() - for(var/mob/living/carbon/target in targets) - if(ishuman(targets)) - var/mob/living/carbon/human/tar = target - if(tar.anti_magic_check()) - tar.visible_message("Spell bounces off of [target]!","The spell bounces off of you!") - return - if(target.mind && !target.mind.has_antag_datum(/datum/antagonist/heretic)) - to_chat(user,"[target.name] has been cursed!") - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) +/obj/item/melee/touch_attack/mad_touch/afterattack(atom/target, mob/user, proximity_flag, click_parameters) -/obj/effect/proc_holder/spell/pointed/ash_final + if(!proximity_flag || target == user) + return + if(ishuman(target)) + var/mob/living/carbon/human/tar = target + if(tar.anti_magic_check()) + tar.visible_message("Spell bounces off of [target]!","The spell bounces off of you!") + return ..() + + if(iscarbon(target)) + playsound(user, 'sound/effects/curseattack.ogg', 75, TRUE) + var/mob/living/carbon/C = target + C.adjustOrganLoss(ORGAN_SLOT_BRAIN,35) + C.DefaultCombatKnockdown(50, override_stamdmg = 0) + C.gain_trauma(/datum/brain_trauma/mild/phobia) + to_chat(user,"[target.name] has been cursed!") + SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) + return ..() + +/obj/effect/proc_holder/spell/targeted/touch/grasp_of_decay + name = "Grasp of Decay" + desc = "A sinister looking touch that rots your foes from the inside out for twenty seconds." + hand_path = /obj/item/melee/touch_attack/grasp_of_decay + school = "evocation" + charge_max = 1200 + clothes_req = FALSE + action_icon = 'icons/mob/actions/actions_ecult.dmi' + action_icon_state = "mansus_grasp" + action_background_icon_state = "bg_ecult" + +/obj/item/melee/touch_attack/grasp_of_decay + name = "Grasp of Decay" + desc = "A sinister looking aura that rots your foes from the inside out." + icon = 'icons/obj/eldritch.dmi' + icon_state = "mansus_grasp" + item_state = "mansus" + catchphrase = "SKILI'EDUONIS" + +/obj/item/melee/touch_attack/grasp_of_decay/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + + if(!proximity_flag || target == user) + return + if(ishuman(target)) + var/mob/living/carbon/human/tar = target + if(tar.anti_magic_check()) + tar.visible_message("Spell bounces off of [target]!","The spell bounces off of you!") + return ..() + + if(iscarbon(target)) + playsound(user, 'sound/effects/curseattack.ogg', 75, TRUE) + var/mob/living/carbon/C = target + C.DefaultCombatKnockdown(50, override_stamdmg = 0) + C.apply_status_effect(/datum/status_effect/corrosion_curse/lesser) + return ..() + +/obj/effect/proc_holder/spell/pointed/nightwatchers_rite name = "Nightwatcher's Rite" desc = "Powerful spell that releases 5 streams of fire away from you." school = "transmutation" @@ -307,7 +350,7 @@ action_icon_state = "flames" action_background_icon_state = "bg_ecult" -/obj/effect/proc_holder/spell/pointed/ash_final/cast(list/targets, mob/user) +/obj/effect/proc_holder/spell/pointed/nightwatchers_rite/cast(list/targets, mob/user) for(var/X in targets) var/T T = line_target(-25, range, X, user) @@ -322,11 +365,12 @@ INVOKE_ASYNC(src, .proc/fire_line, user,T) return ..() -/obj/effect/proc_holder/spell/pointed/ash_final/proc/line_target(offset, range, atom/at , atom/user) +/obj/effect/proc_holder/spell/pointed/nightwatchers_rite/proc/line_target(offset, range, atom/at , atom/user) if(!at) return var/angle = ATAN2(at.x - user.x, at.y - user.y) + offset var/turf/T = get_turf(user) + playsound(user,'sound/magic/fireball.ogg', 200, 1) for(var/i in 1 to range) var/turf/check = locate(user.x + cos(angle) * i, user.y + sin(angle) * i, user.z) if(!check) @@ -334,7 +378,7 @@ T = check return (getline(user, T) - get_turf(user)) -/obj/effect/proc_holder/spell/pointed/ash_final/proc/fire_line(atom/source, list/turfs) +/obj/effect/proc_holder/spell/pointed/nightwatchers_rite/proc/fire_line(atom/source, list/turfs) var/list/hit_list = list() for(var/turf/T in turfs) if(istype(T, /turf/closed)) @@ -347,8 +391,8 @@ if(L in hit_list || L == source) continue hit_list += L - L.adjustFireLoss(20) - to_chat(L, "You're hit by [source]'s fire breath!") + L.adjustFireLoss(15) + to_chat(L, "You're hit by a blast of fire!") new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) @@ -368,7 +412,7 @@ possible_shapes = list(/mob/living/simple_animal/mouse,\ /mob/living/simple_animal/pet/dog/corgi,\ /mob/living/simple_animal/hostile/carp,\ - /mob/living/simple_animal/bot/secbot, \ + /mob/living/simple_animal/bot/secbot,\ /mob/living/simple_animal/pet/fox,\ /mob/living/simple_animal/pet/cat ) @@ -430,7 +474,7 @@ action_background_icon_state = "bg_ecult" range = -1 include_user = TRUE - charge_max = 700 + charge_max = 1200 action_icon = 'icons/mob/actions/actions_ecult.dmi' action_icon_state = "fire_ring" ///how long it lasts @@ -595,6 +639,39 @@ invocation = "AK'LIS" action_background_icon_state = "bg_ecult" +/obj/effect/proc_holder/spell/pointed/trigger/mute/eldritch + name = "Silence" + desc = "Using the power of the mansus, silences a selected unbeliever for twenty seconds." + school = "transmutation" + charge_max = 1800 + clothes_req = FALSE + invocation = "VIS'TIEK TAVO'LIZUVIS" + invocation_type = "whisper" + message = "It feels as if your tongue is being held down by an unseen force!" + starting_spells = list("/obj/effect/proc_holder/spell/targeted/genetic/mute") + ranged_mousepointer = 'icons/effects/mouse_pointers/mute_target.dmi' + action_background_icon_state = "bg_ecult" + action_icon = 'icons/mob/actions/actions_ecult.dmi' + action_icon_state = "mute" + active_msg = "You prepare to silence a target..." + +/obj/effect/proc_holder/spell/targeted/genetic/mute + mutations = list(MUT_MUTE) + duration = 200 + charge_max = 1200 // needs to be higher than the duration or it'll be permanent + sound = 'sound/magic/blind.ogg' + +/obj/effect/proc_holder/spell/pointed/trigger/mute/can_target(atom/target, mob/user, silent) + . = ..() + if(!.) + return FALSE + if(!isliving(target)) + if(!silent) + to_chat(user, "You can only silence living beings!") + return FALSE + return TRUE + + /obj/effect/temp_visual/dir_setting/entropic icon = 'icons/effects/160x160.dmi' icon_state = "entropic_plume" diff --git a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm index 8efd9837a9..425052de2a 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm @@ -95,7 +95,30 @@ desc = "Drains nearby alive people that are engulfed in flames. It heals 10 of each damage type per person. If a person is in critical condition it finishes them off." cost = 1 spell_to_add = /obj/effect/proc_holder/spell/targeted/fiery_rebirth - next_knowledge = list(/datum/eldritch_knowledge/spell/cleave,/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/final/ash_final) + next_knowledge = list(/datum/eldritch_knowledge/spell/cleave,/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/flame_immunity) + route = PATH_ASH + +/datum/eldritch_knowledge/flame_immunity + name = "Nightwatcher's Blessing" + gain_text = "The True Light will destroy and make something anew of any individual. If only they accepted it." + desc = "Becoming one with the ash, you become immune to fire and heat, allowing you to thrive in a more extreme environment.." + cost = 2 + next_knowledge = list(/datum/eldritch_knowledge/spell/nightwatchers_rite) + route = PATH_ASH + var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOFIRE) + +/datum/eldritch_knowledge/flame_immunity/on_gain(mob/living/user) + to_chat(user, "[gain_text]") + for(var/X in trait_list) + ADD_TRAIT(user,X,MAGIC_TRAIT) + +/datum/eldritch_knowledge/spell/nightwatchers_rite + name = "Nightwatcher's Rite" + gain_text = "When the Glory of the Lantern scorches and sears their skin, nothing will protect them from the ashes." + desc = "Fire off five streams of fire from your hand, each setting ablaze targets hit and scorching them upon contact." + cost = 2 + spell_to_add = /obj/effect/proc_holder/spell/pointed/nightwatchers_rite + next_knowledge = list(/datum/eldritch_knowledge/final/ash_final) route = PATH_ASH /datum/eldritch_knowledge/ash_blade_upgrade @@ -167,7 +190,7 @@ required_atoms = list(/mob/living/carbon/human) cost = 5 route = PATH_ASH - var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE) + var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE) /datum/eldritch_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/atoms, loc) priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the blaze, for Ashbringer [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/announcer/classic/spanomalies.ogg') diff --git a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm index 9684e1fa0c..5e32cf1b4e 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm @@ -70,7 +70,7 @@ desc = "Empowers your Mansus Grasp to be able to create a single ghoul out of a dead player. You cannot raise the same person twice. Ghouls have only 50 HP and look like husks." cost = 1 next_knowledge = list(/datum/eldritch_knowledge/flesh_ghoul) - var/ghoul_amt = 6 + var/ghoul_amt = 4 var/list/spooky_scaries route = PATH_FLESH @@ -177,7 +177,7 @@ cost = 1 required_atoms = list(/obj/item/kitchen/knife,/obj/item/reagent_containers/food/snacks/grown/poppy,/obj/item/pen,/obj/item/paper) mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker - next_knowledge = list(/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/summon/rusty,/datum/eldritch_knowledge/final/flesh_final) + next_knowledge = list(/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/summon/rusty,/datum/eldritch_knowledge/flesh_blade_upgrade_2) route = PATH_FLESH /datum/eldritch_knowledge/summon/ashy @@ -250,3 +250,28 @@ carbon_user.gib() return ..() + +/datum/eldritch_knowledge/flesh_blade_upgrade_2 + name = "Remembrance" + gain_text = "Pain isn't something easily forgotten." + desc = "Your blade remembers more, and remembers how easily bones broke just as its flesh did, guaranteeing dislocated, or broken bones." + cost = 2 + next_knowledge = list(/datum/eldritch_knowledge/spell/touch_of_madness) + route = PATH_FLESH + +/datum/eldritch_knowledge/flesh_blade_upgrade_2/on_eldritch_blade(target,user,proximity_flag,click_parameters) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts) + var/datum/wound/blunt/moderate/moderate_wound = new + moderate_wound.apply_wound(bodypart) + +/datum/eldritch_knowledge/spell/touch_of_madness + name = "Touch of Madness" + gain_text = "The ignorant mind that inhabits their feeble bodies will crumble when they acknowledge - willingly or not, the truth." + desc = "By forcing the knowledge of the Mansus upon my foes, I can show them things that would drive any normal man insane." + cost = 2 + spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/mad_touch + next_knowledge = list(/datum/eldritch_knowledge/final/flesh_final) + route = PATH_FLESH diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 74b3753b69..467ddeee39 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -27,10 +27,15 @@ if(E) E.on_effect() H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25) + else + for(var/X in user.mind.spell_list) + if(!istype(X,/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp)) + continue + var/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp/MG = X + MG.charge_counter = min(round(MG.charge_counter + MG.charge_max * 0.75),MG.charge_max) target.rust_heretic_act() target.emp_act(EMP_HEAVY) return TRUE - /datum/eldritch_knowledge/spell/area_conversion name = "Aggressive Spread" desc = "Spreads rust to nearby turfs. Destroys already rusted walls." @@ -43,7 +48,7 @@ /datum/eldritch_knowledge/spell/rust_wave name = "Patron's Reach" desc = "You can now send a bolt of rust that corrupts the immediate area, and poisons the first target hit." - gain_text = "Messengers of hope fear the rustbringer." + gain_text = "Messengers of hope fear the Rustbringer." cost = 1 spell_to_add = /obj/effect/proc_holder/spell/aimed/rust_wave route = PATH_RUST @@ -92,19 +97,20 @@ banned_knowledge = list(/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/flesh_blade_upgrade) route = PATH_RUST -/datum/eldritch_knowledge/rust_blade_upgrade/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/rust_blade_upgrade/on_eldritch_blade(mob/target,user,proximity_flag,click_parameters) . = ..() - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - carbon_target.reagents.add_reagent(/datum/reagent/eldritch, 5) + if(!IS_HERETIC(target)) + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + carbon_target.reagents.add_reagent(/datum/reagent/eldritch, 5) /datum/eldritch_knowledge/spell/entropic_plume name = "Entropic Plume" desc = "You can now send a befuddling plume that blinds, poisons and makes enemies strike each other, while also converting the immediate area into rust." - gain_text = "Messengers of hope fear the rustbringer." + gain_text = "If they knew, the truth would turn them against eachother." cost = 1 spell_to_add = /obj/effect/proc_holder/spell/cone/staggered/entropic_plume - next_knowledge = list(/datum/eldritch_knowledge/final/rust_final,/datum/eldritch_knowledge/spell/cleave,/datum/eldritch_knowledge/summon/rusty) + next_knowledge = list(/datum/eldritch_knowledge/rust_fist_upgrade,/datum/eldritch_knowledge/spell/cleave,/datum/eldritch_knowledge/summon/rusty) route = PATH_RUST /datum/eldritch_knowledge/armor @@ -119,12 +125,38 @@ /datum/eldritch_knowledge/essence name = "Priest's Ritual" desc = "You can now transmute a tank of water into a bottle of eldritch fluid." - gain_text = "This is an old recipe, i got it from an owl." + gain_text = "This is an old recipe, I got it from an owl." cost = 1 next_knowledge = list(/datum/eldritch_knowledge/rust_regen,/datum/eldritch_knowledge/spell/ashen_shift) required_atoms = list(/obj/structure/reagent_dispensers/watertank) result_atoms = list(/obj/item/reagent_containers/glass/beaker/eldritch) +/datum/eldritch_knowledge/rust_fist_upgrade + name = "Vile Grip" + desc = "Empowers your Mansus Grasp further, sickening your foes and making them vomit, while also strengthening the rate at which your hand decays objects." + gain_text = "A sickly diseased touch that was, yet, so welcoming." + cost = 2 + next_knowledge = list(/datum/eldritch_knowledge/spell/grasp_of_decay) + var/rust_force = 750 + var/static/list/blacklisted_turfs = typecacheof(list(/turf/closed,/turf/open/space,/turf/open/lava,/turf/open/chasm,/turf/open/floor/plating/rust)) + route = PATH_RUST + +/datum/eldritch_knowledge/rust_fist_upgrade/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.set_disgust(75) + return TRUE + +/datum/eldritch_knowledge/spell/grasp_of_decay + name = "Grasp of Decay" + desc = "Applying your knowledge of rust to the human body, a knowledge that could decay your foes from the inside out, resulting in organ failure, vomiting, or eventual death through peeling flesh." + gain_text = "Decay, similar to Rust, yet so much more terribly uninviting." + cost = 2 + spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/grasp_of_decay + next_knowledge = list(/datum/eldritch_knowledge/final/rust_final) + route = PATH_RUST + /datum/eldritch_knowledge/final/rust_final name = "Rustbringer's Oath" desc = "Bring three corpses onto a transmutation rune. After you finish the ritual, rust will now automatically spread from the rune. Your healing on rust is also tripled, while you become more resilient overall." diff --git a/icons/effects/mouse_pointers/mute_target.dmi b/icons/effects/mouse_pointers/mute_target.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8e3c278d3b6bfc05f7349f03783e2c1364e373f2 GIT binary patch literal 539 zcmV+$0_6RPP)Fc7WRu(f|KcVMgO{!p!E2x#xw4 zHn;Rrk{%8K0Pr2+$&b`!(>6`36v_Q-M0H6V^|{lA>`@Atm*{(y4%PR|5~cWL%fQ1p zvUA2+>xSGYAx@{eebc!hQH-YsSZmF`Gw0TZKyubW^6wI^UI_0sy<1p|-!q7`Pbt@M z$ug3EA=vh8IzQbbmj5RHDDm24?%xTdU002ovPDHLkV1g#j>e2uJ literal 0 HcmV?d00001 diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index 0a130f006e281f5cbc0ec4a519199808d7fa95cc..d083206454f860dcb60fca10a33daaad90d2d63b 100644 GIT binary patch delta 10427 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 delta 10067 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 diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 315ca5e924aa2257ef408fe1016d949d3211b693..0a828459102f03799a25aaeac8d7975b8e7e0c29 100644 GIT binary patch literal 22383 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 VQ=n{Le4w+}L09X(W--(@_}>TF1AYJi diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 6af883f2e8542305905222eabddba892247f5050..abfbb18f84a040e40ad9bc4fdbcf4728488ca571 100644 GIT binary patch literal 24537 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 literal 24751 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

M${B+DI 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 D8Vs5$ literal 7557 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 SLW2KS1r%jfWvZl1L;eSz-K*dL From 578f078a2d23f4ddbb985f36894765b262e5336f Mon Sep 17 00:00:00 2001 From: kiwedespars <47008095+kiwedespars@users.noreply.github.com> Date: Fri, 28 Aug 2020 16:46:55 -0700 Subject: [PATCH 69/85] whoops i forgot to make it not emp --- code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 467ddeee39..f5c54dd7bf 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -34,8 +34,8 @@ var/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp/MG = X MG.charge_counter = min(round(MG.charge_counter + MG.charge_max * 0.75),MG.charge_max) target.rust_heretic_act() - target.emp_act(EMP_HEAVY) return TRUE + /datum/eldritch_knowledge/spell/area_conversion name = "Aggressive Spread" desc = "Spreads rust to nearby turfs. Destroys already rusted walls." From f223c9eeb57668752b5ea217dab40ac93e9d37b8 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sat, 29 Aug 2020 18:38:17 +1000 Subject: [PATCH 70/85] eee --- code/modules/smithing/anvil.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index f873b62dd8..3f96622f03 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -112,10 +112,10 @@ var/list/shapingsteps = list("weak hit", "strong hit", "heavy hit", "fold", "draw", "shrink", "bend", "punch", "upset") //weak/strong/heavy hit affect strength. All the other steps shape. workpiece_state = WORKPIECE_INPROGRESS var/stepdone = input(user, "How would you like to work the metal?") in shapingsteps - var/steptime = 100 + var/steptime = 50 if(user.mind.skill_holder) var/skillmod = user.mind.get_skill_level(/datum/skill/level/dorfy/blacksmithing)/10 + 1 - steptime = 100 / skillmod + steptime = 50 / skillmod playsound(src, 'sound/effects/clang2.ogg',40, 2) if(!do_after(user, steptime, target = src)) return FALSE From 400391e8d8347b891bce18ff5351b5cb27a3c8cf Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 1 Sep 2020 10:37:56 +1000 Subject: [PATCH 71/85] Bronze anvil tweaks, clarity. --- code/modules/smithing/anvil.dm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 3f96622f03..6843bd02d2 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -198,6 +198,17 @@ finisheditem.artifact = TRUE else finisheditem.quality = min(currentquality, itemqualitymax) + switch(finisheditem.quality) + if(-1000 to -8) + finisheditem.desc = "It looks to be the most awfully made object you've ever seen." + if(-8) + finisheditem.desc = "It looks to be the second most awfully made object you've ever seen." + if(-8 to 0) + finisheditem.desc = "It looks to be barely passable as... whatever it's trying to pass for." + if(0) + finisheditem.desc = "It looks to be totally average." + if(0 to INFINITY) + finisheditem.desc = "It looks to be better than average." workpiece_state = FALSE finisheditem.set_custom_materials(workpiece_material) currentquality = anvilquality @@ -245,8 +256,8 @@ desc = "A big block of bronze. Useable as an anvil." custom_materials = list(/datum/material/bronze=8000) icon_state = "ratvaranvil" - anvilquality = -1 - itemqualitymax = 1 + anvilquality = -0.5 + itemqualitymax = 2 /obj/structure/anvil/obtainable/sandstone name = "sandstone brick anvil" From 4d6fb10dff73f2e59d97a4c7043d6578392ec50c Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 1 Sep 2020 10:55:55 +1000 Subject: [PATCH 72/85] Nyoops. --- code/modules/smithing/anvil.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm index 6843bd02d2..88711aec37 100644 --- a/code/modules/smithing/anvil.dm +++ b/code/modules/smithing/anvil.dm @@ -200,15 +200,15 @@ finisheditem.quality = min(currentquality, itemqualitymax) switch(finisheditem.quality) if(-1000 to -8) - finisheditem.desc = "It looks to be the most awfully made object you've ever seen." + finisheditem.desc = "It looks to be the most awfully made object you've ever seen." if(-8) - finisheditem.desc = "It looks to be the second most awfully made object you've ever seen." + finisheditem.desc = "It looks to be the second most awfully made object you've ever seen." if(-8 to 0) - finisheditem.desc = "It looks to be barely passable as... whatever it's trying to pass for." + finisheditem.desc = "It looks to be barely passable as... whatever it's trying to pass for." if(0) - finisheditem.desc = "It looks to be totally average." + finisheditem.desc = "It looks to be totally average." if(0 to INFINITY) - finisheditem.desc = "It looks to be better than average." + finisheditem.desc = "It looks to be better than average." workpiece_state = FALSE finisheditem.set_custom_materials(workpiece_material) currentquality = anvilquality From 1b52ceb63aab9a5aeac916ff56c2ac4693e334a3 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Tue, 1 Sep 2020 11:43:01 +1000 Subject: [PATCH 73/85] Various changes. --- code/modules/smithing/finished_items.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 4ea5c441cf..5db6b09452 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -33,7 +33,7 @@ item_flags = NEEDS_PERMIT //it's a bigass sword/spear. beepsky is going to give you shit for it. sharpness = SHARP_EDGED material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS - force = 5 + force = 10 wielded_mult = 1.75 w_class = WEIGHT_CLASS_BULKY @@ -116,6 +116,7 @@ w_class = WEIGHT_CLASS_HUGE overlay_state = "spearhandle" slot_flags = ITEM_SLOT_BACK + wielded_mult = 2.5 /obj/item/melee/smith/twohand/halberd/ComponentInitialize() . = ..() @@ -139,6 +140,7 @@ icon_state = "glaive" overlay_state = "longhandle" slot_flags = ITEM_SLOT_BACK + wielded_mult = 2 /obj/item/melee/smith/twohand/glaive/ComponentInitialize() . = ..() @@ -217,7 +219,6 @@ name = "broadsword" icon_state = "broadsword" overlay_state = "broadhilt" - force = 9 wielded_mult = 1.8 /obj/item/melee/smith/twohand/zweihander From 4ef4220c8892126efa7317bdd607a10db46c43f6 Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 3 Sep 2020 16:38:16 -0700 Subject: [PATCH 75/85] Completely decouples events from dynamic. --- code/game/gamemodes/dynamic/dynamic.dm | 33 +- .../dynamic/dynamic_rulesets_events.dm | 454 ------------------ .../gamemodes/dynamic/dynamic_storytellers.dm | 45 +- .../antagonists/disease/disease_event.dm | 1 - .../revenant/revenant_spawn_event.dm | 1 - .../antagonists/swarmer/swarmer_event.dm | 1 - code/modules/events/anomaly_bluespace.dm | 1 - code/modules/events/anomaly_flux.dm | 1 - code/modules/events/anomaly_grav.dm | 1 - code/modules/events/anomaly_pyro.dm | 1 - code/modules/events/anomaly_vortex.dm | 1 - code/modules/events/brand_intelligence.dm | 1 - code/modules/events/carp_migration.dm | 1 - .../modules/events/communications_blackout.dm | 1 - code/modules/events/dust.dm | 3 +- code/modules/events/electrical_storm.dm | 1 - code/modules/events/heart_attack.dm | 3 +- code/modules/events/ion_storm.dm | 1 - code/modules/events/major_dust.dm | 1 - code/modules/events/meteor_wave.dm | 1 - code/modules/events/nightmare.dm | 1 - code/modules/events/pirates.dm | 2 +- code/modules/events/portal_storm.dm | 1 - code/modules/events/processor_overload.dm | 1 - code/modules/events/radiation_storm.dm | 1 - code/modules/events/spider_infestation.dm | 1 - code/modules/events/vent_clog.dm | 1 - code/modules/events/wormholes.dm | 1 - tgstation.dme | 1 - 29 files changed, 5 insertions(+), 558 deletions(-) delete mode 100644 code/game/gamemodes/dynamic/dynamic_rulesets_events.dm diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 659d50c077..378405bafc 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -6,10 +6,6 @@ GLOBAL_VAR_INIT(dynamic_latejoin_delay_max, (30 MINUTES)) GLOBAL_VAR_INIT(dynamic_midround_delay_min, (10 MINUTES)) GLOBAL_VAR_INIT(dynamic_midround_delay_max, (30 MINUTES)) -GLOBAL_VAR_INIT(dynamic_event_delay_min, (10 MINUTES)) -GLOBAL_VAR_INIT(dynamic_event_delay_max, (30 MINUTES)) // this is on top of regular events, so can't be quite as often - - // -- Roundstart injection delays GLOBAL_VAR_INIT(dynamic_first_latejoin_delay_min, (2 MINUTES)) GLOBAL_VAR_INIT(dynamic_first_latejoin_delay_max, (30 MINUTES)) @@ -58,7 +54,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) // Threat logging vars /// Starting threat level, for things that increase it but can bring it back down. var/initial_threat_level = 0 - /// Target threat level right now. Events and antags will try to keep the round at this level. + /// Target threat level right now. Antags will try to keep the round at this level. var/threat_level = 0 /// The current antag threat. Recalculated every time a ruletype starts or ends. var/threat = 0 @@ -80,8 +76,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) var/list/latejoin_rules = list() /// List of midround rules used for selecting the rules. var/list/midround_rules = list() - /// List of events used for reducing threat without causing antag injection (necessarily). - var/list/events = list() /** # Pop range per requirement. * If the value is five the range is: * 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+ @@ -119,8 +113,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) var/latejoin_injection_cooldown = 0 /// When world.time is over this number the mode tries to inject a midround ruleset. var/midround_injection_cooldown = 0 - /// When wor.dtime is over this number the mode tries to do an event. - var/event_injection_cooldown = 0 /// When TRUE GetInjectionChance returns 100. var/forced_injection = FALSE /// Forced ruleset to be executed for the next latejoin. @@ -184,7 +176,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) dat += "
Injection Timers: ([storyteller.get_injection_chance(TRUE)]% chance)
" dat += "Latejoin: [(latejoin_injection_cooldown-world.time)>60*10 ? "[round((latejoin_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(latejoin_injection_cooldown-world.time)/10] seconds"] \[Now!\]
" dat += "Midround: [(midround_injection_cooldown-world.time)>60*10 ? "[round((midround_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(midround_injection_cooldown-world.time)/10] seconds"] \[Now!\]
" - dat += "Event: [(event_injection_cooldown-world.time)>60*10 ? "[round((event_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(event_injection_cooldown-world.time)/10] seconds"] \[Now!\]
" usr << browse(dat.Join(), "window=gamemode_panel;size=500x500") /datum/game_mode/dynamic/Topic(href, href_list) @@ -216,10 +207,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) midround_injection_cooldown = 0 forced_injection = TRUE message_admins("[key_name(usr)] forced a midround injection.", 1) - else if (href_list["forceevent"]) - event_injection_cooldown = 0 - // events always happen anyway - message_admins("[key_name(usr)] forced an event.", 1) else if (href_list["threatlog"]) show_threatlog(usr) else if (href_list["stacking_limit"]) @@ -377,8 +364,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) generate_threat() storyteller.start_injection_cooldowns() - SSevents.frequency_lower = storyteller.event_frequency_lower // 6 minutes by default - SSevents.frequency_upper = storyteller.event_frequency_upper // 20 minutes by default log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") initial_threat_level = threat_level return TRUE @@ -397,9 +382,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) if ("Midround") if (ruleset.weight) midround_rules += ruleset - if("Event") - if(ruleset.weight) - events += ruleset for(var/mob/dead/new_player/player in GLOB.player_list) if(player.ready == PLAYER_READY_TO_PLAY && player.mind) roundstart_pop_ready++ @@ -596,8 +578,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) latejoin_rules = remove_from_list(latejoin_rules, rule.type) else if(rule.ruletype == "Midround") midround_rules = remove_from_list(midround_rules, rule.type) - else if(rule.ruletype == "Event") - events = remove_from_list(events,rule.type) addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_midround_latejoin_rule, rule), rule.delay) return TRUE @@ -706,17 +686,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) picking_midround_latejoin_rule(drafted_rules) // get_injection_chance can do things on fail - if(event_injection_cooldown < world.time) - SSblackbox.record_feedback("tally","dynamic",1,"Attempted event injections") - event_injection_cooldown = storyteller.get_event_cooldown() + world.time - message_admins("DYNAMIC: Doing event injection.") - log_game("DYNAMIC: Doing event injection.") - update_playercounts() - var/list/drafted_rules = storyteller.event_draft() - if(drafted_rules.len > 0) - SSblackbox.record_feedback("tally","dynamic",1,"Successful event injections") - picking_midround_latejoin_rule(drafted_rules) - /// Updates current_players. /datum/game_mode/dynamic/proc/update_playercounts() current_players[CURRENT_LIVING_PLAYERS] = list() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm deleted file mode 100644 index 1ee226875b..0000000000 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm +++ /dev/null @@ -1,454 +0,0 @@ -/datum/dynamic_ruleset/event - ruletype = "Event" - var/typepath // typepath of the event - var/triggering - var/earliest_start = 20 MINUTES - -/datum/dynamic_ruleset/event/get_blackbox_info() - var/list/ruleset_data = list() - ruleset_data["name"] = name - ruleset_data["rule_type"] = ruletype - ruleset_data["cost"] = total_cost - ruleset_data["weight"] = weight - ruleset_data["scaled_times"] = scaled_times - ruleset_data["event_type"] = typepath - ruleset_data["population_tier"] = indice_pop - return ruleset_data - -/datum/dynamic_ruleset/event/execute() - var/datum/round_event/E = new typepath() - E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) - // E.control = src // can't be done! we just don't use events that require these, those can be from_ghost almost always - - testing("[time2text(world.time, "hh:mm:ss")] [E.type]") - deadchat_broadcast("[name] has just been triggered by dynamic!") - log_game("Random Event triggering: [name] ([typepath])") - - return E - -/datum/dynamic_ruleset/event/ready(forced = FALSE) - if (!forced) - if(earliest_start >= world.time-SSticker.round_start_time) - return FALSE - var/job_check = 0 - if (enemy_roles.len > 0) - for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS]) - if (M.stat == DEAD) - continue // Dead players cannot count as opponents - if (M.mind && M.mind.assigned_role && (M.mind.assigned_role in enemy_roles)) - job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it - - var/threat = round(mode.threat_level/10) - if (job_check < required_enemies[threat]) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough enemy roles") - return FALSE - return TRUE - -////////////////////////////////////////////// -// // -// PIRATES // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/event/pirates - name = "Space Pirates" - config_tag = "pirates" - typepath = /datum/round_event/pirates - antag_flag = ROLE_TRAITOR - enemy_roles = list("AI","Security Officer","Head of Security","Captain") - required_enemies = list(2,2,1,1,0,0,0,0,0,0) - weight = 5 - cost = 10 - earliest_start = 30 MINUTES - blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear) - requirements = list(70,60,50,50,40,40,40,30,20,15) - property_weights = list("story_potential" = 1, "trust" = 1, "chaos" = 1) - high_population_requirement = 15 - -/datum/dynamic_ruleset/event/pirates/ready(forced = FALSE) - if (!SSmapping.empty_space) - return FALSE - return ..() - -////////////////////////////////////////////// -// // -// SPIDERS // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/event/spiders - name = "Spider Infestation" - config_tag = "spiders" - typepath = /datum/round_event/spider_infestation - enemy_roles = list("AI","Security Officer","Head of Security","Captain") - required_enemies = list(2,2,1,1,0,0,0,0,0,0) - weight = 5 - cost = 10 - requirements = list(70,60,50,50,40,40,40,30,20,15) - high_population_requirement = 15 - property_weights = list("chaos" = 1, "valid" = 1) - -////////////////////////////////////////////// -// // -// CLOGGED VENTS // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/event/ventclog - name = "Clogged Vents" - config_tag = "ventclog" - typepath = /datum/round_event/vent_clog - enemy_roles = list("Chemist","Medical Doctor","Chief Medical Officer") - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - cost = 2 - weight = 4 - repeatable_weight_decrease = 3 - requirements = list(5,5,5,5,5,5,5,5,5,5) // yes, can happen on fake-extended - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("chaos" = 1, "extended" = 2) - -/datum/dynamic_ruleset/event/ventclog/ready() - if(mode.threat_level > 30 && mode.threat >= 5 && prob(20)) - name = "Clogged Vents: Threatening" - cost = 5 - required_enemies = list(3,3,3,2,2,2,1,1,1,1) - typepath = /datum/round_event/vent_clog/threatening - else if(mode.threat_level > 15 && mode.threat > 15 && prob(30)) - name = "Clogged Vents: Catastrophic" - cost = 15 - required_enemies = list(2,2,1,1,1,1,0,0,0,0) - typepath = /datum/round_event/vent_clog/catastrophic - else - cost = 2 - name = "Clogged Vents: Normal" - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - typepath = /datum/round_event/vent_clog - return ..() - -////////////////////////////////////////////// -// // -// ION STORM // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/event/ion_storm - name = "Ion Storm" - config_tag = "ion_storm" - typepath = /datum/round_event/ion_storm - enemy_roles = list("Research Director","Captain","Chief Engineer") - required_enemies = list(1,1,0,0,0,0,0,0,0,0) - weight = 4 - // no repeatable weight decrease. too variable to be unfun multiple times in one round - cost = 1 - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("story_potential" = 1, "extended" = 1) - always_max_weight = TRUE - -////////////////////////////////////////////// -// // -// METEORS // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/event/meteor_wave - name = "Meteor Wave" - config_tag = "meteor_wave" - typepath = /datum/round_event/meteor_wave - enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Captain","Cyborg") - required_enemies = list(3,3,3,3,3,3,3,3,3,3) - cost = 15 - weight = 3 - earliest_start = 25 MINUTES - repeatable_weight_decrease = 2 - requirements = list(60,50,40,30,30,30,30,30,30,30) - high_population_requirement = 30 - property_weights = list("extended" = -2) - -/datum/dynamic_ruleset/event/meteor_wave/ready() - if(world.time-SSticker.round_start_time > 35 MINUTES && mode.threat_level > 40 && mode.threat >= 25 && prob(30)) - name = "Meteor Wave: Threatening" - cost = 25 - typepath = /datum/round_event/meteor_wave/threatening - else if(world.time-SSticker.round_start_time > 45 MINUTES && mode.threat_level > 50 && mode.threat >= 40 && prob(30)) - name = "Meteor Wave: Catastrophic" - cost = 40 - typepath = /datum/round_event/meteor_wave/catastrophic - else - name = "Meteor Wave: Normal" - cost = 15 - typepath = /datum/round_event/meteor_wave - return ..() - -////////////////////////////////////////////// -// // -// ANOMALIES // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/event/anomaly_bluespace - name = "Anomaly: Bluespace" - config_tag = "anomaly_bluespace" - typepath = /datum/round_event/anomaly/anomaly_bluespace - enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain") - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - weight = 2 - repeatable_weight_decrease = 1 - cost = 3 - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/anomaly_flux - name = "Anomaly: Hyper-Energetic Flux" - config_tag = "anomaly_flux" - typepath = /datum/round_event/anomaly/anomaly_flux - enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain") - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - weight = 2 - repeatable_weight_decrease = 1 - cost = 5 - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 10 - repeatable = TRUE - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/anomaly_gravitational - name = "Anomaly: Gravitational" - config_tag = "anomaly_gravitational" - typepath = /datum/round_event/anomaly/anomaly_grav - weight = 2 - repeatable_weight_decrease = 1 - cost = 3 - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/anomaly_pyroclastic - name = "Anomaly: Pyroclastic" - config_tag = "anomaly_pyroclastic" - typepath = /datum/round_event/anomaly/anomaly_pyro - weight = 2 - repeatable_weight_decrease = 1 - cost = 5 - enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg") - required_enemies = list(1,1,1,1,1,1,1,1,1,1) - requirements = list(10,10,10,10,10,10,10,10,10,10) - high_population_requirement = 10 - repeatable = TRUE - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/anomaly_vortex - name = "Anomaly: Vortex" - config_tag = "anomaly_vortex" - typepath = /datum/round_event/anomaly/anomaly_vortex - weight = 2 - repeatable_weight_decrease = 1 - cost = 5 - enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg") - required_enemies = list(1,1,1,1,1,1,1,1,1,1) - requirements = list(10,10,10,10,10,10,10,10,10,10) - high_population_requirement = 10 - repeatable = TRUE - property_weights = list("extended" = 1) - -////////////////////////////////////////////// -// // -// WOW THAT'S A LOT OF EVENTS // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/event/brand_intelligence - name = "Brand Intelligence" - config_tag = "brand_intelligence" - typepath = /datum/round_event/brand_intelligence - weight = 1 - repeatable_weight_decrease = 1 - cost = 2 - enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain","Cyborg") - required_enemies = list(1,1,1,1,0,0,0,0,0,0) - requirements = list(10,10,10,10,10,10,10,10,10,10) - high_population_requirement = 10 - repeatable = TRUE - property_weights = list("extended" = -1, "chaos" = 1) - -/datum/dynamic_ruleset/event/carp_migration - name = "Carp Migration" - config_tag = "carp_migration" - typepath = /datum/round_event/carp_migration - weight = 7 - repeatable_weight_decrease = 3 - cost = 4 - requirements = list(10,10,10,10,10,10,10,10,10,10) - high_population_requirement = 10 - earliest_start = 10 MINUTES - repeatable = TRUE - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/communications_blackout - name = "Communications Blackout" - config_tag = "communications_blackout" - typepath = /datum/round_event/communications_blackout - cost = 4 - weight = 2 - repeatable_weight_decrease = 3 - enemy_roles = list("Chief Engineer","Station Engineer") - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("extended" = 1, "chaos" = 1) - -/datum/dynamic_ruleset/event/processor_overload - name = "Processor Overload" - config_tag = "processor_overload" - typepath = /datum/round_event/processor_overload - cost = 4 - weight = 2 - repeatable_weight_decrease = 3 - enemy_roles = list("Chief Engineer","Station Engineer") - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("extended" = 1, "chaos" = 1) - always_max_weight = TRUE - -/datum/dynamic_ruleset/event/space_dust - name = "Minor Space Dust" - config_tag = "space_dust" - typepath = /datum/round_event/space_dust - cost = 2 - weight = 2 - repeatable_weight_decrease = 1 - enemy_roles = list("Chief Engineer","Station Engineer") - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - earliest_start = 0 MINUTES - property_weights = list("extended" = 1) - always_max_weight = TRUE - -/datum/dynamic_ruleset/event/major_dust - name = "Major Space Dust" - config_tag = "major_dust" - typepath = /datum/round_event/meteor_wave/major_dust - cost = 4 - weight = 2 - repeatable_weight_decrease = 1 - enemy_roles = list("Chief Engineer","Station Engineer") - required_enemies = list(2,2,2,2,2,2,2,2,2,2) - requirements = list(10,10,10,10,10,10,10,10,10,10) - high_population_requirement = 10 - repeatable = TRUE - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/electrical_storm - name = "Electrical Storm" - config_tag = "electrical_storm" - typepath = /datum/round_event/electrical_storm - cost = 1 - weight = 2 - repeatable_weight_decrease = 1 - enemy_roles = list("Chief Engineer","Station Engineer") - required_enemies = list(1,1,1,0,0,0,0,0,0,0) - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/heart_attack - name = "Random Heart Attack" - config_tag = "heart_attack" - typepath = /datum/round_event/heart_attack - cost = 3 - weight = 2 - repeatable_weight_decrease = 1 - enemy_roles = list("Medical Doctor","Chief Medical Officer") - required_enemies = list(2,2,2,2,2,2,2,2,2,2) - requirements = list(101,101,101,5,5,5,5,5,5,5) - high_population_requirement = 5 - repeatable = TRUE - property_weights = list("extended" = 1) - always_max_weight = TRUE - -/datum/dynamic_ruleset/event/radiation_storm - name = "Radiation Storm" - config_tag = "radiation_storm" - typepath = /datum/round_event/radiation_storm - cost = 3 - weight = 1 - enemy_roles = list("Chemist","Chief Medical Officer","Geneticist","Medical Doctor","AI","Captain") - required_enemies = list(1,1,1,1,1,1,1,1,1,1) - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - property_weights = list("extended" = 1,"chaos" = 1) - -/datum/dynamic_ruleset/event/portal_storm_syndicate - name = "Portal Storm" - config_tag = "portal_storm" - typepath = /datum/round_event/portal_storm/syndicate_shocktroop - cost = 10 - weight = 1 - enemy_roles = list("Head of Security","Security Officer","AI","Captain","Shaft Miner") - required_enemies = list(2,2,2,2,2,2,2,2,2,2) - requirements = list(101,101,101,30,30,30,30,30,30,30) - high_population_requirement = 30 - earliest_start = 30 MINUTES - property_weights = list("teamwork" = 1,"chaos" = 1, "extended" = -1) - -/datum/dynamic_ruleset/event/wormholes - name = "Wormholes" - config_tag = "wormhole" - typepath = /datum/round_event/wormholes - cost = 3 - weight = 4 - enemy_roles = list("AI","Medical Doctor","Station Engineer","Head of Personnel","Captain") - required_enemies = list(2,2,2,2,2,2,2,2,2,2) - requirements = list(5,5,5,5,5,5,5,5,5,5) - high_population_requirement = 5 - property_weights = list("extended" = 1) - -/datum/dynamic_ruleset/event/swarmers - name = "Swarmers" - config_tag = "swarmer" - typepath = /datum/round_event/spawn_swarmer - cost = 10 - weight = 1 - earliest_start = 30 MINUTES - enemy_roles = list("AI","Security Officer","Head of Security","Captain","Station Engineer","Atmos Technician","Chief Engineer") - required_enemies = list(4,4,4,4,3,3,2,2,1,1) - requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 5 - property_weights = list("extended" = -2) - -/datum/dynamic_ruleset/event/sentient_disease - name = "Sentient Disease" - config_tag = "sentient_disease" - typepath = /datum/round_event/ghost_role/sentient_disease - enemy_roles = list("Virologist","Chief Medical Officer","Captain","Chemist") - required_enemies = list(2,1,1,1,0,0,0,0,0,0) - required_candidates = 1 - weight = 4 - cost = 5 - requirements = list(30,30,20,20,15,10,10,10,10,5) // yes, it can even happen in "extended"! - property_weights = list("story_potential" = 1, "extended" = 1, "valid" = -2) - high_population_requirement = 5 - -/datum/dynamic_ruleset/event/revenant - name = "Revenant" - config_tag = "revenant" - typepath = /datum/round_event/ghost_role/revenant - enemy_roles = list("Chief Engineer","Station Engineer","Captain","Chaplain","AI") - required_enemies = list(2,1,1,1,0,0,0,0,0,0) - required_candidates = 1 - weight = 4 - cost = 5 - requirements = list(30,30,30,30,20,15,15,15,15,15) - high_population_requirement = 15 - property_weights = list("story_potential" = -2, "extended" = -1) diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index dd281c456f..ed6cb0ba88 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -39,9 +39,6 @@ Property weights are added to the config weight of the ruleset. They are: var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_midround_delay_min + GLOB.dynamic_first_midround_delay_max) mode.midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time - var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) - mode.event_injection_cooldown = (round(clamp(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) - /datum/dynamic_storyteller/proc/calculate_threat() var/threat = 0 for(var/datum/antagonist/A in GLOB.antagonists) @@ -99,10 +96,6 @@ Property weights are added to the config weight of the ruleset. They are: var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) return round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) -/datum/dynamic_storyteller/proc/get_event_cooldown() - var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) - return round(clamp(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) - /datum/dynamic_storyteller/proc/get_latejoin_cooldown() var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) return round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) @@ -195,20 +188,6 @@ Property weights are added to the config weight of the ruleset. They are: drafted_rules[rule] = calced_weight return drafted_rules -/datum/dynamic_storyteller/proc/event_draft() - var/list/drafted_rules = list() - for(var/datum/dynamic_ruleset/event/rule in mode.events) - if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && (mode.threat_level + 20 - mode.threat) >= rule.cost && rule.ready()) - var/property_weight = 0 - for(var/property in property_weights) - if(property in rule.property_weights) - property_weight += rule.property_weights[property] * property_weights[property] - var/calced_weight = (rule.get_weight() + property_weight) * rule.weight_mult - if(calced_weight > 0) - drafted_rules[rule] = calced_weight - return drafted_rules - - /datum/dynamic_storyteller/chaotic name = "Chaotic" config_tag = "chaotic" @@ -271,9 +250,6 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/random/get_midround_cooldown() return rand(GLOB.dynamic_midround_delay_min/2, GLOB.dynamic_midround_delay_max*2) -/datum/dynamic_storyteller/random/get_event_cooldown() - return rand(GLOB.dynamic_event_delay_min/2, GLOB.dynamic_event_delay_max*2) - /datum/dynamic_storyteller/random/get_latejoin_cooldown() return rand(GLOB.dynamic_latejoin_delay_min/2, GLOB.dynamic_latejoin_delay_max*2) @@ -319,13 +295,6 @@ Property weights are added to the config weight of the ruleset. They are: drafted_rules[rule] = 1 return drafted_rules -/datum/dynamic_storyteller/random/event_draft() - var/list/drafted_rules = list() - for(var/datum/dynamic_ruleset/event/rule in mode.events) - if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && rule.ready()) - drafted_rules[rule] = 1 - return drafted_rules - /datum/dynamic_storyteller/story name = "Story" config_tag = "story" @@ -365,7 +334,7 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/no_antag name = "Extended" config_tag = "semiextended" - desc = "No standard antags. Threatening events may still spawn." + desc = "No standard antags." curve_centre = -5 curve_width = 0.5 flags = NO_ASSASSIN | FORCE_IF_WON @@ -377,15 +346,3 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/no_antag/get_injection_chance(dry_run) return 0 - -/datum/dynamic_storyteller/extended - name = "Super Extended" - config_tag = "extended" - desc = "No antags. No dangerous events." - curve_centre = -20 - weight = 0 - curve_width = 0.5 - -/datum/dynamic_storyteller/extended/on_start() - ..() - GLOB.dynamic_forced_extended = TRUE diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm index 4365fd7538..385cee998b 100644 --- a/code/modules/antagonists/disease/disease_event.dm +++ b/code/modules/antagonists/disease/disease_event.dm @@ -3,7 +3,6 @@ name = "Spawn Sentient Disease" typepath = /datum/round_event/ghost_role/sentient_disease weight = 7 - gamemode_blacklist = list("dynamic") max_occurrences = 1 min_players = 5 diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm index 7bb7f1aa76..cb534b6613 100644 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm @@ -4,7 +4,6 @@ name = "Spawn Revenant" // Did you mean 'griefghost'? typepath = /datum/round_event/ghost_role/revenant weight = 7 - gamemode_blacklist = list("dynamic") max_occurrences = 1 min_players = 5 diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm index c626799a53..43ac07cba9 100644 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ b/code/modules/antagonists/swarmer/swarmer_event.dm @@ -5,7 +5,6 @@ max_occurrences = 1 //Only once okay fam earliest_start = 30 MINUTES min_players = 35 - gamemode_blacklist = list("dynamic") /datum/round_event/spawn_swarmer diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 395b3b88a5..7f0dedaab6 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -4,7 +4,6 @@ max_occurrences = 1 weight = 5 - gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_bluespace startWhen = 3 diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index a9a7ed50b9..8047976330 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -5,7 +5,6 @@ min_players = 10 max_occurrences = 5 weight = 20 - gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_flux startWhen = 10 diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index cabd7face8..7d2bb33889 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -4,7 +4,6 @@ max_occurrences = 5 weight = 20 - gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_grav diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 8c8fbd6d36..350c8fc946 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -4,7 +4,6 @@ max_occurrences = 5 weight = 20 - gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_pyro startWhen = 3 diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index 96d084873d..e2a4ceadf3 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -5,7 +5,6 @@ min_players = 20 max_occurrences = 2 weight = 5 - gamemode_blacklist = list("dynamic") /datum/round_event/anomaly/anomaly_vortex startWhen = 10 diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 1c88e68377..f0e4bd4a53 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -5,7 +5,6 @@ min_players = 15 max_occurrences = 1 - gamemode_blacklist = list("dynamic") /datum/round_event/brand_intelligence announceWhen = 21 diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 2c553fc8a7..d08e6267a0 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -5,7 +5,6 @@ min_players = 2 earliest_start = 10 MINUTES max_occurrences = 6 - gamemode_blacklist = list("dynamic") /datum/round_event/carp_migration announceWhen = 3 diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 45fa1c8a01..cb62e0df22 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -2,7 +2,6 @@ name = "Communications Blackout" typepath = /datum/round_event/communications_blackout weight = 30 - gamemode_blacklist = list("dynamic") /datum/round_event/communications_blackout announceWhen = 1 diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 860685c787..eb7edcafbf 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -5,7 +5,6 @@ max_occurrences = 1000 earliest_start = 0 MINUTES alert_observers = FALSE - gamemode_blacklist = list("dynamic") /datum/round_event/space_dust startWhen = 1 @@ -29,4 +28,4 @@ fakeable = FALSE /datum/round_event/sandstorm/tick() - spawn_meteors(10, GLOB.meteorsC) \ No newline at end of file + spawn_meteors(10, GLOB.meteorsC) diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 5e5e318e3c..b850b4db62 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -5,7 +5,6 @@ min_players = 5 weight = 40 alert_observers = FALSE - gamemode_blacklist = list("dynamic") /datum/round_event/electrical_storm var/lightsoutAmount = 1 diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index b3bc571a4a..8c33e69107 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -4,7 +4,6 @@ weight = 20 max_occurrences = 2 min_players = 40 // To avoid shafting lowpop - gamemode_blacklist = list("dynamic") /datum/round_event/heart_attack/start() var/list/heart_attack_contestants = list() @@ -20,4 +19,4 @@ var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants) var/datum/disease/D = new /datum/disease/heart_failure() winner.ForceContractDisease(D, FALSE, TRUE) - announce_to_ghosts(winner) \ No newline at end of file + announce_to_ghosts(winner) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index b15e9d1f99..c75aff0c4a 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -3,7 +3,6 @@ /datum/round_event_control/ion_storm name = "Ion Storm" typepath = /datum/round_event/ion_storm - gamemode_blacklist = list("dynamic") weight = 15 min_players = 2 diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index c594d7b3c0..d7d8f1aec8 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -2,7 +2,6 @@ name = "Major Space Dust" typepath = /datum/round_event/meteor_wave/major_dust weight = 8 - gamemode_blacklist = list("dynamic") /datum/round_event/meteor_wave/major_dust wave_name = "space dust" diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 7763f9950d..515e0fe1b3 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -10,7 +10,6 @@ min_players = 15 max_occurrences = 3 earliest_start = 25 MINUTES - gamemode_blacklist = list("dynamic") /datum/round_event/meteor_wave startWhen = 6 diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 6e5512a617..698f5130f1 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -2,7 +2,6 @@ name = "Spawn Nightmare" typepath = /datum/round_event/ghost_role/nightmare max_occurrences = 1 - gamemode_blacklist = list("dynamic") min_players = 20 /datum/round_event/ghost_role/nightmare diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 9ab5e8d517..4cbfb8ae9a 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -5,7 +5,7 @@ max_occurrences = 1 min_players = 10 earliest_start = 30 MINUTES - gamemode_blacklist = list("nuclear","dynamic") + gamemode_blacklist = list("nuclear") /datum/round_event_control/pirates/preRunEvent() if (!SSmapping.empty_space) diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 457b5bd4ec..5ef30d0030 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -4,7 +4,6 @@ weight = 2 min_players = 15 earliest_start = 30 MINUTES - gamemode_blacklist = list("dynamic") /datum/round_event/portal_storm/syndicate_shocktroop boss_types = list(/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper = 2) diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index 22e475a8ef..6bedce6b4b 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -3,7 +3,6 @@ typepath = /datum/round_event/processor_overload weight = 15 min_players = 20 - gamemode_blacklist = list("dynamic") /datum/round_event/processor_overload announceWhen = 1 diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 0a5bedb464..36e16bb2c9 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,7 +2,6 @@ name = "Radiation Storm" typepath = /datum/round_event/radiation_storm max_occurrences = 1 - gamemode_blacklist = list("dynamic") /datum/round_event/radiation_storm diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index d1c327e0f7..23ce6ce730 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -2,7 +2,6 @@ name = "Spider Infestation" typepath = /datum/round_event/spider_infestation weight = 5 - gamemode_blacklist = list("dynamic") max_occurrences = 1 min_players = 15 diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index dc672cec45..cd7b23a577 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -3,7 +3,6 @@ typepath = /datum/round_event/vent_clog weight = 10 max_occurrences = 3 - gamemode_blacklist = list("dynamic") min_players = 25 /datum/round_event/vent_clog diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 1b4716b407..0920c9ccb6 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -4,7 +4,6 @@ max_occurrences = 3 weight = 2 min_players = 2 - gamemode_blacklist = list("dynamic") /datum/round_event/wormholes diff --git a/tgstation.dme b/tgstation.dme index e742498527..9ecd9bebfb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -735,7 +735,6 @@ #include "code\game\gamemodes\devil\devil agent\devil_agent.dm" #include "code\game\gamemodes\dynamic\dynamic.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_events.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" From c48dd86e6e7c59d1ef981fbe716d8349e61fdd2b Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 3 Sep 2020 18:03:11 -0700 Subject: [PATCH 76/85] Makes brain trauma not roll lobotomy-resist and only happen when there's doctors. --- code/modules/events/brain_trauma.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 0a07e2a693..171a3696d3 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -3,6 +3,13 @@ typepath = /datum/round_event/brain_trauma weight = 25 +/datum/round_event_control/brain_trauma/canSpawnEvent(var/players_amt, var/gamemode) + var/list/enemy_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") + for (var/mob/M in GLOB.alive_mob_list) + if(M.stat != DEAD && M.mind?.assigned_role in enemy_roles) + return TRUE + return FALSE + /datum/round_event/brain_trauma fakeable = FALSE @@ -22,8 +29,7 @@ /datum/round_event/brain_trauma/proc/traumatize(mob/living/carbon/human/H) var/resistance = pick( 65;TRAUMA_RESILIENCE_BASIC, - 30;TRAUMA_RESILIENCE_SURGERY, - 5;TRAUMA_RESILIENCE_LOBOTOMY) + 35;TRAUMA_RESILIENCE_SURGERY) var/trauma_type = pickweight(list( BRAIN_TRAUMA_MILD = 60, From bb9374a3f06357b45de27fc05424400e6da875fb Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 3 Sep 2020 18:15:58 -0700 Subject: [PATCH 77/85] Significantly reduced chance of severe trauma, too. --- code/modules/events/brain_trauma.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 171a3696d3..75c514774c 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -6,7 +6,7 @@ /datum/round_event_control/brain_trauma/canSpawnEvent(var/players_amt, var/gamemode) var/list/enemy_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") for (var/mob/M in GLOB.alive_mob_list) - if(M.stat != DEAD && M.mind?.assigned_role in enemy_roles) + if(M.stat != DEAD && (M.mind?.assigned_role in enemy_roles)) return TRUE return FALSE @@ -23,6 +23,8 @@ continue if(HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS)) continue + if(!is_station_level(H.z)) + continue traumatize(H) break @@ -32,8 +34,8 @@ 35;TRAUMA_RESILIENCE_SURGERY) var/trauma_type = pickweight(list( - BRAIN_TRAUMA_MILD = 60, - BRAIN_TRAUMA_SEVERE = 30, + BRAIN_TRAUMA_MILD = 80, + BRAIN_TRAUMA_SEVERE = 10, BRAIN_TRAUMA_SPECIAL = 10 )) From 4c8983f006049bb4ac45d8166bab01e9110594c3 Mon Sep 17 00:00:00 2001 From: raspy-on-osu Date: Fri, 4 Sep 2020 22:13:56 -0400 Subject: [PATCH 78/85] init --- code/game/objects/items/circuitboards/machine_circuitboards.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 37d19783b5..806aed92ed 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -390,7 +390,7 @@ /obj/item/circuitboard/machine/thermomachine/examine() . = ..() - . += "It is set to layer [pipe_layer]." + . += "It is set to layer [pipe_layer]. Use a Multitool on the circuit to change this." /obj/item/circuitboard/machine/thermomachine/heater name = "Heater (Machine Board)" From c0917de446d4f6d6f15fa51b2fb3332e5218785e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 5 Sep 2020 04:11:43 -0500 Subject: [PATCH 79/85] Automatic changelog generation for PR #13341 [ci skip] --- html/changelogs/AutoChangeLog-pr-13341.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13341.yml diff --git a/html/changelogs/AutoChangeLog-pr-13341.yml b/html/changelogs/AutoChangeLog-pr-13341.yml new file mode 100644 index 0000000000..ff06d19bb9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13341.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - balance: "Made spontaneous brain trauma a good deal less annoying." From 545212520f6abf3efbd3412e42f265531786339f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 5 Sep 2020 04:12:04 -0500 Subject: [PATCH 80/85] Automatic changelog generation for PR #13339 [ci skip] --- html/changelogs/AutoChangeLog-pr-13339.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13339.yml diff --git a/html/changelogs/AutoChangeLog-pr-13339.yml b/html/changelogs/AutoChangeLog-pr-13339.yml new file mode 100644 index 0000000000..360b528911 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13339.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscdel: "Dynamic no longer pushes events." From 4776059233b0d84dce2f32cca2ed72e8132f6962 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 5 Sep 2020 04:16:20 -0500 Subject: [PATCH 81/85] Automatic changelog generation for PR #13348 [ci skip] --- html/changelogs/AutoChangeLog-pr-13348.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13348.yml diff --git a/html/changelogs/AutoChangeLog-pr-13348.yml b/html/changelogs/AutoChangeLog-pr-13348.yml new file mode 100644 index 0000000000..f804025be6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13348.yml @@ -0,0 +1,4 @@ +author: "raspy-on-osu" +delete-after: True +changes: + - tweak: "thermomachine examine text" From 3e7b8eb78cf11cae813b9495e5c340a8e2b18de9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 5 Sep 2020 04:20:14 -0500 Subject: [PATCH 82/85] Automatic changelog generation for PR #13244 [ci skip] --- html/changelogs/AutoChangeLog-pr-13244.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13244.yml diff --git a/html/changelogs/AutoChangeLog-pr-13244.yml b/html/changelogs/AutoChangeLog-pr-13244.yml new file mode 100644 index 0000000000..305d5f3584 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13244.yml @@ -0,0 +1,5 @@ +author: "lolman360, NecromancerAnne" +delete-after: True +changes: + - rscadd: "The ancient art of blacksmithing, now in pixels." + - imageadd: "cool swords and shit (thanks anne)" From 93501e2d3d51dc500e163a50839188fe8f81ff8a Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 5 Sep 2020 16:24:58 +0100 Subject: [PATCH 83/85] sorry ipcs --- code/datums/accents.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/datums/accents.dm b/code/datums/accents.dm index 9baba90c32..92b24fe945 100644 --- a/code/datums/accents.dm +++ b/code/datums/accents.dm @@ -78,23 +78,22 @@ speech_args[SPEECH_MESSAGE] = lowertext(message) return speech_args -/datum/accent/bone +/datum/accent/span var/span_flag -/datum/accent/bone/modify_speech(list/speech_args) +/datum/accent/span/modify_speech(list/speech_args) speech_args[SPEECH_SPANS] = span_flag return speech_args //bone tongues either have the sans accent or the papyrus accent -/datum/accent/bone/sans +/datum/accent/span/sans span_flag = SPAN_SANS -/datum/accent/bone/papyrus +/datum/accent/span/papyrus span_flag = SPAN_PAPYRUS -/datum/accent/robot/modify_speech(list/speech_args) - speech_args[SPEECH_SPANS] = SPAN_ROBOT - return speech_args +/datum/accent/span/robot + span_flag = SPAN_ROBOT /datum/accent/dullahan/modify_speech(list/speech_args, datum/source, mob/living/carbon/owner) if(owner) From c690e59085a8be12be9f4e5abd480170a78d3914 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 5 Sep 2020 16:26:55 +0100 Subject: [PATCH 84/85] change accent names --- code/modules/surgery/organs/tongue.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 33d143d400..09e6f0ef42 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -163,7 +163,7 @@ maxHealth = 75 //Take brute damage instead var/chattering = FALSE var/phomeme_type = "sans" - var/list/phomeme_types = list(/datum/accent/bone/sans, /datum/accent/bone/papyrus) + var/list/phomeme_types = list(/datum/accent/span/sans, /datum/accent/span/papyrus) /obj/item/organ/tongue/bone/Initialize() . = ..() @@ -197,7 +197,7 @@ icon_state = "tonguerobot" say_mod = "states" attack_verb = list("beeped", "booped") - initial_accents = list(/datum/accent/robot) + initial_accents = list(/datum/accent/span/robot) taste_sensitivity = 25 // not as good as an organic tongue maxHealth = 100 //RoboTongue! var/electronics_magic = TRUE From f9bb245acccd622dfec68b1055693c02a8508f70 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 5 Sep 2020 16:32:41 +0100 Subject: [PATCH 85/85] DONT MAKE THE SAME MISTAKE --- code/datums/accents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/accents.dm b/code/datums/accents.dm index 92b24fe945..ce32aa0884 100644 --- a/code/datums/accents.dm +++ b/code/datums/accents.dm @@ -82,7 +82,7 @@ var/span_flag /datum/accent/span/modify_speech(list/speech_args) - speech_args[SPEECH_SPANS] = span_flag + speech_args[SPEECH_SPANS] |= span_flag return speech_args //bone tongues either have the sans accent or the papyrus accent