Blacksmithing 2 (#20004)

* more dorf stuff - Chains, hammers, chainmail

* blacksmithing start

* A little more TLC

* Moves the anvil into the blacksmithing folder. Adds a function to override whether a mob can push an atom/movable (used in anvil)

* Adds pickaxe and hammer heads to iron recipes, and misc item handles to wood recipes

Changes the hammer sprite to something a bit more aesthetically pleasing than my usual noisebombs

* forge time

* more forge stuff

* Removes copypasting

Adds dorfify proc, requiring a /datum/material as its argument.

* Fixes res_amount not working for things that aren't a sheet subtype

* chainmail added
This commit is contained in:
MadmanMartian
2018-11-02 20:07:55 +00:00
committed by jknpj
parent c201d349f0
commit 5d4b43a8d8
31 changed files with 469 additions and 65 deletions

View File

@@ -132,6 +132,8 @@
#define iswelder(A) istype(A, /obj/item/weapon/weldingtool)
#define ishammer(A) is_type_in_list(A, list(/obj/item/weapon/hammer, /obj/item/weapon/storage/toolbox))
#define iscablecoil(A) istype(A, /obj/item/stack/cable_coil)
#define iscoin(A) is_type_in_list(A, list(/obj/item/weapon/coin, /obj/item/weapon/reagent_containers/food/snacks/chococoin))
@@ -241,6 +243,7 @@
#define isERT(H) (H.mind && H.mind.GetRole(RESPONDER))
#define hasanvil(H) (isturf(H) && (locate(/obj/item/anvil) in H))

View File

@@ -37,9 +37,17 @@
#define MELTPOINT_GLASS (1500+T0C)
#define MELTPOINT_STEEL (1510+T0C)
#define MELTPOINT_PLASMA (MELTPOINT_STEEL+500)
#define MELTPOINT_SILICON 1687 // KELVIN
#define MELTPOINT_PLASTIC (180+T0C)
#define MELTPOINT_SNOW 304.15 //about 30°C
#define MELTPOINT_CARBON (T0C+3550)
#define MELTPOINT_GOLD (T0C+1064)
#define MELTPOINT_SILVER (T0C+961.8)
#define MELTPOINT_URANIUM (T0C+1132)
#define MELTPOINT_POTASSIUM (T0C+63.5)
#define MELTPOINT_BRASS (T0C+940)
#define MELTPOINT_MITHRIL (T0C+893) //Using sterling silver (because silver steel) as base
// The highest number supported is a signed 32-bit floating point number.
// Integers beyond the 24 bit range are represented as single-precision floating points, and thus will lose accuracy beyond the range of +/- 16777216

View File

@@ -399,6 +399,7 @@
#define TEMPERATURE_FLAME 700
#define TEMPERATURE_WELDER 3480
#define TEMPERATURE_PLASMA 4500
#define TEMPERATURE_ETHANOL (T0C+1560)
#define HEAT_TRANSFER_MULTIPLIER 7 //Multiplies the numbers above when heating a reagent container. A truly magical number.
// By defining the effect multiplier this way, it'll exactly adjust

View File

@@ -1,6 +1,6 @@
/** Anvil
Is treated as an item that can not be picked up, unless you are incredibly strong.
Is treated as an item that can not be picked up, pushed, or pulled, unless you are incredibly strong.
Can place blacksmithing placeholders onto it like a table. Necessary to actually hammer them into shape.
**/
/obj/item/anvil
@@ -10,6 +10,7 @@
icon = 'icons/obj/blacksmithing.dmi'
icon_state = "anvil"
impactsound = 'sound/misc/clang.ogg'
layer = TABLE_LAYER
flags = FPRINT | TWOHANDABLE | MUSTTWOHAND
density = 1
throwforce = 40
@@ -31,3 +32,12 @@
if(n > 1000)
return TRUE
return FALSE
/obj/item/anvil/can_be_pushed(mob/living/user)
return user.get_strength() >= 2
/obj/item/anvil/attackby(obj/item/W, mob/user, params)
if(user.drop_item(W, src.loc))
if(W.loc == src.loc && params)
W.setPixelOffsetsFromParams(params, user)
return 1

View File

@@ -0,0 +1,125 @@
/**
Put /obj/smithing_placeholder into a heatsource that is 90% of the melting temperature of that material to heat it up temporarily (spawn 10 seconds)
If struck by a blunt object (preferably a hammer, but a toolbox can work) enough times before it cools, it will make the object.
Can then choose to keep striking it to potentially increase its quality, but each time doubles the chance of failure per swing.
**/
/obj/item/smithing_placeholder
name = "placeholder"
desc = "An incomplete object, that requires forging and striking."
var/obj/result
var/malleable = FALSE
var/strikes_required
var/strikes
/obj/item/smithing_placeholder/Destroy()
result = null
..()
/obj/item/smithing_placeholder/New(loc, var/obj/item/stack/S, var/obj/R, var/required_strikes)
..()
if(istype(S, /obj/item/stack/sheet/))
var/obj/item/stack/sheet/SS = S
var/datum/materials/materials_list = new
material_type = materials_list.getMaterial(SS.mat_type)
qdel(materials_list)
else if(S.material_type)
material_type = S.material_type
result = R
R.forceMove(null)
var/obj/item/stack/sheet/mineral/M = material_type.sheettype
appearance = initial(M.appearance)
desc = initial(desc)
strikes_required = required_strikes
/obj/item/smithing_placeholder/examine(mob/user)
..()
to_chat(user, "<span class = 'notice'>[strikes?"It looks like it has been struck [strikes] times.":"It has not been struck yet."]<br>It is [malleable?"malleable":"not malleable"].[strikes_required<strikes?"<br>It looks to be finished, and just needs quenching.":""]")
/obj/item/smithing_placeholder/afterattack(atom/A, mob/user, proximity_flag, click_parameters)
if(!proximity_flag)
return
if(isobj(A))
var/obj/O = A
if(O.is_hot())
heat(O.is_hot(), O, user)
if(O.is_open_container() && O.reagents.has_reagent(WATER, 60))
quench(O, user)
if(istype(A, /mob/living/simple_animal/hostile/asteroid/magmaw)) //Until we have flameslimes, lavalizards, crimson pyromancers, or flaming skeletons, this will be hardcoded
var/mob/living/simple_animal/hostile/asteroid/magmaw/M = A
if(M.isDead())
return
var/temperature
switch(M.fire_extremity)
if(0)
temperature = MELTPOINT_GOLD
if(1)
temperature = MELTPOINT_STEEL
if(2)
temperature = MELTPOINT_MITHRIL
heat(temperature, M, user)
/obj/item/smithing_placeholder/attackby(obj/item/I, mob/user)
if(ishammer(I))
strike(I, user)
user.delayNextAttack(1 SECONDS)
else if (I.is_hot())
heat(I.is_hot(), I, user)
/obj/item/smithing_placeholder/attempt_heating(var/atom/A, mob/user)
if(user)
to_chat(user, "<span class = 'notice'>You attempt to heat \the [src] with \the [A].</span>")
heat(A.is_hot(), A, user)
/obj/item/smithing_placeholder/proc/heat(var/temperature, var/atom/A, mob/user)
if(malleable)
return
if(temperature < ((material_type.melt_temperature/10)*9))
if(user)
to_chat(user, "<span class = 'warning'>\The [A] is not hot enough.</span>")
return
if(!do_after(user, A, 4 SECONDS))
return
if(user)
to_chat(user, "<span class = 'notice'>You heat \the [src].</span>")
malleable = TRUE
/obj/item/smithing_placeholder/proc/strike(atom/A, mob/user)
if(!malleable)
to_chat(user, "<span class = 'warning'>\The [src] has gone cool. It can not be manipulated in this state.</span>")
return
if(!hasanvil(loc))
to_chat(user, "<span class = 'warning'>There is no anvil to shape \the [src] over.</span>")
return
playsound(loc, 'sound/items/hammer_strike.ogg', 50, 1)
if(istype(A,/obj/item/weapon/hammer))
strikes++
else if(istype(A,/obj/item/weapon/storage/toolbox))
strikes+=0.25
if(strikes == strikes_required)
to_chat(user, "<span class = 'notice'>\The [src] seems to have taken shape nicely.</span>")
if(strikes > strikes_required)
if(prob(5*(strikes/strikes_required)))
to_chat(user, "<span class = 'warning'>\The [src] becomes brittle and unmalleable.</span>")
var/obj/item/weapon/ore/slag/S = new /obj/item/weapon/ore/slag(get_turf(src))
recycle(S.mats)
result.recycle(S.mats)
qdel(result)
qdel(src)
/obj/item/smithing_placeholder/proc/quench(obj/O, mob/user)
if(strikes < strikes_required)
to_chat(user, "<span class = 'warning'>\The [src] is not finished yet!</span>")
return 0
playsound(loc, 'sound/machines/hiss.ogg', 50, 1)
O.reagents.remove_reagent(WATER, 20)
var/datum/material/mat = material_type
if(mat)
result.dorfify(mat)
result.forceMove(get_turf(src))
qdel(src)

View File

@@ -0,0 +1,111 @@
/**
Blacksmithing forge
Takes chunks of plasma ore, or plasma sheets, to generate high temperatures for molding or melting metal.
**/
/obj/structure/forge
name = "forge"
desc = "A fire contained within heat-proof stone. This lets the internal temperature develop enough to make metal malleable or liquid."
icon = 'icons/obj/blacksmithing.dmi'
icon_state = "furnace_off"
anchored = TRUE
density = TRUE
var/status = FALSE //Whether the forge is lit
var/obj/item/heating //What is contained within the forge, and is being heated
var/fuel_time //How long is left, in deciseconds
var/current_temp
var/current_thermal_energy
/obj/structure/forge/update_icon()
if(status)
icon_state = "furnace_on"
else
icon_state = "furnace_off"
/obj/structure/forge/Destroy()
processing_objects.Remove(src)
heating.forceMove(get_turf(src))
heating = null
for(var/obj/I in contents)
qdel(I)
..()
/obj/structure/forge/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/sheet/mineral/plasma))
var/obj/item/stack/sheet/mineral/plasma/P = I
if(P.use(1))
to_chat(user, "<span class = 'notice'>You toss a sheet of \the [I] into \the [src].</span>")
if(current_temp < TEMPERATURE_PLASMA)
current_temp = TEMPERATURE_PLASMA
fuel_time+= 60 SECONDS
return
else if(istype(I, /obj/item/weapon/ore/plasma))
to_chat(user, "<span class = 'notice'>You toss \the [I] into \the [src].</span>")
user.drop_item(I)
qdel(I)
if(current_temp < MELTPOINT_STEEL)
current_temp = MELTPOINT_STEEL
fuel_time += 20 SECONDS
return
else if(I.is_hot() && status == FALSE)
to_chat(user, "<span class = 'notice'>You attempt to light \the [src] with \the [I].</span>")
if(do_after(user, I, 3 SECONDS))
if(!has_fuel())
to_chat(user, "<span class = 'warning'>\The [src] does not light.</span>")
return
toggle_lit()
else if(!heating)
if(user.drop_item(I, src))
to_chat(user, "<span class = 'notice'>You place \the [I] into \the [src].</span>")
heating = I
return
..()
/obj/structure/forge/proc/toggle_lit()
switch(status)
if(TRUE) //turning it off
status = FALSE
processing_objects.Remove(src)
if(FALSE)//turning it on
status = TRUE
processing_objects.Add(src)
on_fire = status
update_icon()
return status
/obj/structure/forge/attack_hand(mob/user)
if(heating)
to_chat(user, "<span class = 'notice'>You retrieve \the [heating] from \the [src].</span>")
user.put_in_hands(heating)
heating = null
/obj/structure/forge/examine(mob/user)
..()
if(heating)
to_chat(user, "<span class = 'notice'>There is currently \a [heating] in \the [src].</span>")
to_chat(user, "<span class = 'notice'>\The [src] is [status?"lit":"unlit"][fuel_time>1?" and has fuel.":""]</span>")
/obj/structure/forge/process()
if(!has_fuel())
return
if(heating)
heating.attempt_heating(src, null)
//Prefer to burn through sheets over ores
/obj/structure/forge/proc/has_fuel()
fuel_time = max(0, fuel_time-1)
if(fuel_time <= 0 && status)
toggle_lit()
return fuel_time
/obj/structure/forge/is_hot()
return current_temp
/obj/structure/forge/thermal_energy_transfer()
return current_thermal_energy
/obj/structure/forge/extinguish()
if(status)
toggle_lit()

View File

@@ -0,0 +1,37 @@
/obj/item/item_head
icon = 'icons/obj/misc_components.dmi'
var/obj/item/result
/obj/item/item_head/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/item_handle))
to_chat(user, "<span class = 'notice'>You begin to attach \the [I] to \the [src].</span>")
if(do_after(user, src, 4 SECONDS))
user.drop_item(I)
user.drop_item(src)
result = new result
var/datum/material/mat = material_type
if(mat)
result.dorfify(mat)
qdel(I)
qdel(src)
user.put_in_hands(result)
return
..()
/obj/item/item_head/hammer_head
name = "hammer head"
icon_state = "hammer_head"
desc = "unlike the shark, this one lacks bite."
result = /obj/item/weapon/hammer
/obj/item/item_head/pickaxe_head
name = "pickaxe head"
icon_state = "pickaxe_head"
desc = "To strike the earth, you will need a handle on the situation"
result = /obj/item/weapon/pickaxe
/obj/item/item_handle
name = "item handle"
icon = 'icons/obj/misc_components.dmi'
icon_state = "item_handle"
desc = "a generic handle, with no purpose."

View File

@@ -938,3 +938,9 @@ its easier to just keep the beam vertical.
to_chat(user, "<span class='warning'>\The [src] is full.</span>")
return INJECTION_RESULT_FAIL
return INJECTION_RESULT_SUCCESS
/atom/proc/is_hot()
return
/atom/proc/thermal_energy_transfer()
return

View File

@@ -1020,3 +1020,6 @@
if(Lag > 0)
set_glide_size(DELAY2GLIDESIZE(Lag))
walk_to(src,Trg,Min,Lag,Speed)
/atom/movable/proc/can_be_pushed(mob/user)
return 1

View File

@@ -1297,3 +1297,17 @@ var/global/list/image/blood_overlays = list()
/obj/item/proc/pre_throw()
return
/**
Attempt to heat this object from a presumed heat source.
@args:
A: Atom: The source of the heat
user: mob: Whomever may be trying to heat this object
@return:
TRUE if succesful
FALSE if not succesful
NULL if override not defined
**/
/obj/item/proc/attempt_heating(atom/A, mob/user)
return

View File

@@ -143,3 +143,24 @@
to_chat(user, "<span class='notice'>You assembled a grille!</span>")
Grille.add_fingerprint(user)
use(2)
/obj/item/stack/chains
name = "chain"
desc = "link by link, my chain got longer."
icon_state = "chains"
max_amount = 20
/obj/item/stack/chains/can_stack_with(var/obj/item/other_stack)
if(!ispath(other_stack) && istype(other_stack) && other_stack.material_type == material_type)
return ..()
return 0
/obj/item/stack/chains/New(var/loc, var/amount=null)
recipes = chain_recipes
..()
var/list/datum/stack_recipe/chain_recipes = list (
new/datum/stack_recipe/blacksmithing("Suit of Chainmail", /obj/item/clothing/suit/armor/vest/chainmail, 10, time = 100,required_strikes = 15),
new/datum/stack_recipe/blacksmithing("Chainmail Coif", /obj/item/clothing/head/helmet/chainmail, 5, time = 100,required_strikes = 15),
)

View File

@@ -88,8 +88,8 @@ var/list/datum/stack_recipe/sandstone_recipes = list ( \
var/list/datum/stack_recipe/diamond_recipes = list ( \
new/datum/stack_recipe("diamond floor tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20), \
new/datum/stack_recipe("diamond door", /obj/machinery/door/mineral/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE)
)
/obj/item/stack/sheet/mineral/diamond/New(var/loc, var/amount=null)
@@ -118,8 +118,8 @@ var/list/datum/stack_recipe/diamond_recipes = list ( \
var/list/datum/stack_recipe/uranium_recipes = list ( \
new/datum/stack_recipe("uranium floor tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20), \
new/datum/stack_recipe("uranium door", /obj/machinery/door/mineral/uranium, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE)
)
/obj/item/stack/sheet/mineral/uranium/New(var/loc, var/amount=null)
@@ -148,8 +148,8 @@ var/list/datum/stack_recipe/uranium_recipes = list ( \
var/list/datum/stack_recipe/plasma_recipes = list ( \
new/datum/stack_recipe("plasma floor tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \
new/datum/stack_recipe("plasma door", /obj/machinery/door/mineral/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE)
)
/obj/item/stack/sheet/mineral/plasma/New(var/loc, var/amount=null)
@@ -225,8 +225,9 @@ var/list/datum/stack_recipe/gold_recipes = list ( \
new/datum/stack_recipe("golden floor tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20), \
new/datum/stack_recipe("golden door", /obj/machinery/door/mineral/gold, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("gold tooth", /obj/item/stack/teeth/gold, 1, 1, 20), \
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20,one_per_turf = 1, on_floor = 1, inherit_material = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20,one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe/dorf("chain", /obj/item/stack/chains, 2, 1, 20, 5, inherit_material = TRUE)
)
/obj/item/stack/sheet/mineral/gold/New(var/loc, var/amount=null)
@@ -238,8 +239,8 @@ var/list/datum/stack_recipe/gold_recipes = list ( \
*/
var/list/datum/stack_recipe/phazon_recipes = list( \
new/datum/stack_recipe("phazon floor tile", /obj/item/stack/tile/mineral/phazon, 1, 40, 20), \
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20,one_per_turf = 1, on_floor = 1, inherit_material = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20,one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE)
)
/obj/item/stack/sheet/mineral/phazon
@@ -283,8 +284,9 @@ var/list/datum/stack_recipe/phazon_recipes = list( \
var/list/datum/stack_recipe/silver_recipes = list ( \
new/datum/stack_recipe("silver floor tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20), \
new/datum/stack_recipe("silver door", /obj/machinery/door/mineral/silver, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20,one_per_turf = 1, on_floor = 1, inherit_material = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20,one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe/dorf("chain", /obj/item/stack/chains, 2, 1, 20, 5, inherit_material = TRUE)
)
/obj/item/stack/sheet/mineral/silver/New(var/loc, var/amount=null)
@@ -311,8 +313,8 @@ var/list/datum/stack_recipe/silver_recipes = list ( \
var/list/datum/stack_recipe/clown_recipes = list ( \
new/datum/stack_recipe("bananium floor tile", /obj/item/stack/tile/mineral/clown, 1, 40, 20), \
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("dorf chair",/obj/structure/bed/chair, 20, one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),\
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 12, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE)
)
/obj/item/stack/sheet/mineral/clown/New(var/loc, var/amount=null)

View File

@@ -210,13 +210,14 @@
var/obj/item/stack/S = O
S.update_materials()
else
O = new R.result_type( usr.loc )
for(var/i = 1 to (R.max_res_amount>1 ? R.res_amount*multiplier : 1))
O = new R.result_type( usr.loc )
O.dir = usr.dir
if(R.start_unanchored)
var/obj/A = O
A.anchored = 0
R.finish_building(usr, src, O)
var/put_in_hand = R.finish_building(usr, src, O)
//if (R.max_res_amount>1)
// var/obj/item/stack/new_item = O
@@ -231,7 +232,7 @@
//src = null //dont kill proc after del()
usr.before_take_item(oldsrc)
returnToPool(oldsrc)
if (istype(O,/obj/item))
if (put_in_hand && istype(O,/obj/item))
usr.put_in_hands(O)
O.add_fingerprint(usr)
//BubbleWrap - so newly formed boxes are empty //This is pretty shitcode but I'm not fixing it because even if sloth is a sin I am already going to hell anyways

View File

@@ -35,7 +35,7 @@
return 1
/datum/stack_recipe/proc/finish_building(var/mob/usr, var/obj/item/stack/S, var/R) //This will be called after the recipe is done building, useful for doing something to the result if you want.
return
return 1
//Recipe list datum
/datum/stack_recipe_list
@@ -86,34 +86,31 @@
if(istype(S, /obj/item/stack/sheet/))
var/obj/item/stack/sheet/SS = S
mat = materials_list.getMaterial(SS.mat_type)
if(mat)
var/icon/original = icon(R.icon, R.icon_state)
if(mat.color)
original.ColorTone(mat.color)
var/obj/item/I = R
if(istype(I))
var/icon/t_state
for(var/hand in list("left_hand", "right_hand"))
t_state = icon(I.inhand_states[hand], I.item_state)
t_state.ColorTone(mat.color)
I.inhand_states[hand] = t_state
else if(mat.color_matrix)
R.color = mat.color_matrix
R.icon = original
R.alpha = mat.alpha
R.material_type = mat
R.sheet_type = mat.sheettype
//if(gen_quality)
R.gen_quality()
if(R.quality > SUPERIOR)
R.gen_description()
if(!findtext(lowertext(R.name), lowertext(mat.name)))
R.name = "[R.quality == NORMAL ? "": "[lowertext(qualityByString[R.quality])] "][lowertext(mat.name)] [R.name]"
else if(S.material_type)
mat = S.material_type
R.dorfify(mat)
return 1
/datum/stack_recipe/blacksmithing
var/req_strikes = 15
/datum/stack_recipe/blacksmithing/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, start_unanchored = 0, other_reqs = list(), inherit_material = FALSE, gen_quality = FALSE, required_strikes = 0)
..()
src.req_strikes = required_strikes
/datum/stack_recipe/blacksmithing/finish_building(mob/usr, var/obj/item/stack/S, var/obj/R)
//Yeah nah let's put you in a blacksmith_placeholder
var/obj/item/I = new /obj/item/smithing_placeholder(usr.loc,S, R, req_strikes)
I.name = "unforged [R.name]"
return 0
var/list/datum/stack_recipe/metal_recipes = list (
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 60),
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60),
new/datum/stack_recipe("conveyor belt", /obj/item/stack/conveyor_assembly, 2, 1, 20),
new/datum/stack_recipe/dorf("chain", /obj/item/stack/chains, 2, 1, 20, 5, inherit_material = TRUE),
null,
new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1 ),
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1),
@@ -135,7 +132,7 @@ var/list/datum/stack_recipe/metal_recipes = list (
new/datum/stack_recipe/chair("chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe/chair("folding chair", /obj/structure/bed/chair/folding, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, inherit_material = TRUE),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
)),
new/datum/stack_recipe_list("couch parts", list(
new/datum/stack_recipe/chair("beige couch left end", /obj/structure/bed/chair/comfy/couch/left/beige, 2, one_per_turf = 1, on_floor = 1),
@@ -227,7 +224,11 @@ var/list/datum/stack_recipe/metal_recipes = list (
null,
new/datum/stack_recipe("iron door", /obj/machinery/door/mineral/iron, 20, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("stove", /obj/machinery/space_heater/campfire/stove, 5, time = 25, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = 1, inherit_material = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
null,
new/datum/stack_recipe/blacksmithing("hammer head", /obj/item/item_head/hammer_head, 4, time = 5 SECONDS, required_strikes = 6),
new/datum/stack_recipe/blacksmithing("pickaxe head", /obj/item/item_head/pickaxe_head, 4, time = 5 SECONDS, required_strikes = 8),
new/datum/stack_recipe/blacksmithing("sword blade", /obj/item/weapon/metal_blade, 8, time = 8 SECONDS, required_strikes = 13),
)
/* ========================================================================
@@ -243,7 +244,7 @@ var/list/datum/stack_recipe/plasteel_recipes = list (
new/datum/stack_recipe("Fireaxe cabinet", /obj/item/mounted/frame/fireaxe_cabinet_frame, 2, time = 50 ),
null,
new/datum/stack_recipe("Vault Door assembly", /obj/structure/door_assembly/door_assembly_vault, 8, time = 50, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, inherit_material = TRUE),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
)
/* ====================================================================
@@ -257,7 +258,7 @@ var/list/datum/stack_recipe/wood_recipes = list (
null,
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/wood, 2 ),
new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood/normal, 1, time = 10, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, inherit_material = TRUE),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe("throne", /obj/structure/bed/chair/wood/throne, 40, time = 100, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1),
@@ -280,8 +281,9 @@ var/list/datum/stack_recipe/wood_recipes = list (
null,
new/datum/stack_recipe("boomerang", /obj/item/weapon/boomerang, 6, time = 50 ),
new/datum/stack_recipe("buckler", /obj/item/weapon/shield/riot/buckler, 5, time = 50 ),
new/datum/stack_recipe("item handle", /obj/item/item_handle, 1,2,20, time = 2 SECONDS ),
new/datum/stack_recipe("wooden paddle", /obj/item/weapon/macuahuitl, 1, time = 50 ),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = 1, inherit_material = TRUE)
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = 1, inherit_material = TRUE, gen_quality = TRUE)
)
/* =========================================================================
@@ -316,6 +318,7 @@ var/list/datum/stack_recipe/cardboard_recipes = list (
R.name = "[L.source_string ? "[L.source_string]" : ""] [R.name]"
else
R.name = "[L.source_string ? "[L.source_string] leather " : ""] [R.name]"
return 1
var/list/datum/stack_recipe/leather_recipes = list (
new/datum/stack_recipe/leather("Bullwhip", /obj/item/weapon/bullwhip, 10, time = 100,),
@@ -337,8 +340,8 @@ var/list/datum/stack_recipe/brass_recipes = list (
new/datum/stack_recipe("brass full window", /obj/structure/window/full/reinforced/clockwork, 4, time = 20, one_per_turf = TRUE, on_floor = TRUE, other_reqs = list(/obj/item/stack/sheet/ralloy = 1)),
new/datum/stack_recipe("brass table parts", /obj/item/weapon/table_parts/clockwork, 4),
new/datum/stack_recipe("clockwork girders", /obj/structure/girder/clockwork, 3, time = 70, one_per_turf = TRUE, on_floor = TRUE, other_reqs = list(/obj/item/stack/sheet/ralloy = 3)),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = TRUE, on_floor = TRUE, inherit_material = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = TRUE, inherit_material = TRUE),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = TRUE, on_floor = TRUE, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = TRUE, inherit_material = TRUE, gen_quality = TRUE),
)
/* ========================================================================
@@ -347,6 +350,6 @@ var/list/datum/stack_recipe/brass_recipes = list (
var/list/datum/stack_recipe/ralloy_recipes = list (
new/datum/stack_recipe("replicant grille", /obj/structure/grille/replicant, 2, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = TRUE, on_floor = TRUE, inherit_material = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = TRUE, inherit_material = TRUE),
new/datum/stack_recipe/dorf("dorf chair", /obj/structure/bed/chair, one_per_turf = TRUE, on_floor = TRUE, inherit_material = TRUE, gen_quality = TRUE),
new/datum/stack_recipe/dorf("training sword", /obj/item/weapon/melee/training_sword, 4, time = 12, on_floor = TRUE, inherit_material = TRUE, gen_quality = TRUE),
)

View File

@@ -466,3 +466,11 @@ obj/item/weapon/banhammer/admin
// base_overlay.appearance = appearance
// base_overlay.plane = FLOAT_PLANE
// overlays += base_overlay
/obj/item/weapon/hammer
name = "smithing hammer"
desc = "for those with a predeliction for applying concussive maintenance"
icon_state = "hammer"
force = 8
hitsound = 'sound/weapons/toolbox.ogg'

View File

@@ -223,10 +223,10 @@ var/global/list/reagents_to_log = list(FUEL, PLASMA, PACID, SACID, AMUTATIONTOXI
/obj/proc/is_sharp()
return sharpness
/obj/proc/is_hot() //This returns the temperature of the object if possible
/obj/is_hot() //This returns the temperature of the object if possible
return source_temperature
/obj/proc/thermal_energy_transfer()
/obj/thermal_energy_transfer()
if(is_hot())
return heat_production
return 0
@@ -634,7 +634,7 @@ a {
var/mob/M = loc
M.regenerate_icons()
/obj/proc/gen_quality()
/obj/proc/gen_quality(var/modifier = 0)
var/material_mod = material_type ? material_type.quality_mod : 1
var/turf/T = get_turf(src)
var/surrounding_mod = 1
@@ -642,7 +642,7 @@ a {
for(var/obj/I in get_step(T, dir))
if(I.quality > NORMAL || I.quality < NORMAL)
surrounding_mod *= I.quality/rand(1,3)
var/initial_quality = round((rand(1,3)*surrounding_mod)*material_mod)
var/initial_quality = round(((rand(1,3)*surrounding_mod)*material_mod)+modifier)
quality = Clamp(initial_quality, AWFUL, LEGENDARY)
/obj/proc/gen_description(mob/user)
@@ -670,5 +670,29 @@ a {
if(additional_description)
desc = "[initial(desc)] \n [additional_description]"
/obj/proc/dorfify(var/datum/material/mat)
if(mat)
var/icon/original = icon(icon, icon_state)
if(mat.color)
original.ColorTone(mat.color)
var/obj/item/I = src
if(istype(I))
var/icon/t_state
for(var/hand in list("left_hand", "right_hand"))
t_state = icon(I.inhand_states[hand], I.item_state)
t_state.ColorTone(mat.color)
I.inhand_states[hand] = t_state
else if(mat.color_matrix)
color = mat.color_matrix
icon = original
alpha = mat.alpha
material_type = mat
sheet_type = mat.sheettype
gen_quality()
if(quality > SUPERIOR)
gen_description()
if(!findtext(lowertext(name), lowertext(mat.name)))
name = "[quality == NORMAL ? "": "[lowertext(qualityByString[quality])] "][lowertext(mat.name)] [name]"
/obj/proc/check_uplink_validity()
return TRUE

View File

@@ -265,3 +265,12 @@
icon_state = "police_helmet"
item_state = "police_helmet"
body_parts_covered = HEAD
/obj/item/clothing/head/helmet/chainmail
name = "chainmail coif"
desc = "chains fashioned together to be a hood to wear over your head"
icon_state = "chainmail_head"
item_state = "chainmail_head"
armor = list(melee = 10, bullet = 15, laser = 2,energy = 2, bomb = 2, bio = 2, rad = 0)
flags = FPRINT
siemens_coefficient = 1

View File

@@ -50,6 +50,13 @@
icon_state = "nr_vest"
item_state = "nr_vest"
/obj/item/clothing/suit/armor/vest/chainmail
name = "chainmail"
desc = "A series of chains linked together in a way to look like a suit."
icon_state = "chainmail_torso"
item_state = "chainmail_torso"
armor = list(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/riot
name = "Riot Suit"
desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement."

View File

@@ -136,6 +136,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
var/brunt_damage_mod = 1
var/sharpness_mod = 1
var/quality_mod = 1
var/melt_temperature
/datum/material/New()
if(processed_name=="")
@@ -159,6 +160,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
brunt_damage_mod = 1.1
sharpness_mod = 0.8
quality_mod = 1.1
melt_temperature = MELTPOINT_STEEL
/datum/material/glass
name="Sand"
@@ -172,6 +174,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
alpha = 122
brunt_damage_mod = 0.7
sharpness_mod = 1.4
melt_temperature = MELTPOINT_GLASS
/datum/material/glass/on_use(obj/source)
if(!..())
@@ -195,6 +198,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
brunt_damage_mod = 1.4
sharpness_mod = 1.6
quality_mod = 2
melt_temperature = MELTPOINT_CARBON
/datum/material/plasma
name="Plasma"
@@ -226,6 +230,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
brunt_damage_mod = 0.5
sharpness_mod = 0.5
quality_mod = 1.7
melt_temperature = MELTPOINT_GOLD
/datum/material/silver
name="Silver"
@@ -238,6 +243,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
brunt_damage_mod = 0.7
sharpness_mod = 0.7
quality_mod = 1.5
melt_temperature = MELTPOINT_SILVER
/datum/material/uranium
@@ -251,6 +257,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
brunt_damage_mod = 1.8
sharpness_mod = 0.2
quality_mod = 1.4
melt_temperature = MELTPOINT_URANIUM
/datum/material/uranium/on_use(obj/source, atom/target, mob/user)
@@ -267,6 +274,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
oretype=/obj/item/weapon/ore/clown
sheettype=/obj/item/stack/sheet/mineral/clown
cointype=/obj/item/weapon/coin/clown
melt_temperature = MELTPOINT_POTASSIUM
/datum/material/clown/New()
if(!..())
@@ -352,6 +360,7 @@ var/global/list/initial_materials //Stores all the matids = 0 in helping New
cointype = null
cc_per_sheet = CC_PER_SHEET_METAL
color = "#A97F1B"
melt_temperature = MELTPOINT_BRASS
/datum/material/ralloy
name = "Replicant Alloy"

View File

@@ -1321,7 +1321,7 @@ Thanks.
if (!now_pushing)
now_pushing = 1
if (!AM.anchored)
if (!AM.anchored && AM.can_be_pushed(src))
var/t = get_dir(src, AM)
if(AM.flow_flags & ON_BORDER && !t)
t = AM.dir

View File

@@ -374,9 +374,8 @@ var/list/LOGGED_SPLASH_REAGENTS = list(FUEL, THERMITE)
..()
attempt_heating(I, user)
/obj/item/weapon/reagent_containers/proc/attempt_heating(obj/item/I, mob/user)
var/temperature = I.is_hot()
var/thermal_energy = I.thermal_energy_transfer()
/obj/item/weapon/reagent_containers/attempt_heating(atom/A, mob/user)
var/temperature = A.is_hot()
if(temperature && reagents)
reagents.heating(thermal_energy, temperature)
to_chat(user, "<span class='notice'>You heat [src] with [I].</span>")
reagents.heating(A.thermal_energy_transfer(), temperature)
to_chat(user, "<span class='notice'>You heat \the [src] with \the [A].</span>")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 504 KiB

After

Width:  |  Height:  |  Size: 505 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 378 B

After

Width:  |  Height:  |  Size: 998 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

View File

@@ -728,7 +728,6 @@
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\items\airbag.dm"
#include "code\game\objects\items\anvil.dm"
#include "code\game\objects\items\ashtray.dm"
#include "code\game\objects\items\beacon.dm"
#include "code\game\objects\items\blueprints.dm"
@@ -2381,6 +2380,10 @@
#include "code\WorkInProgress\Cib\MedicalSideEffects.dm"
#include "code\WorkInProgress\Cutelilduck\human_resources.dm"
#include "code\WorkInProgress\kilakk\fax.dm"
#include "code\WorkInProgress\MadmanMartian\blacksmithing\anvil.dm"
#include "code\WorkInProgress\MadmanMartian\blacksmithing\blacksmithing.dm"
#include "code\WorkInProgress\MadmanMartian\blacksmithing\forge.dm"
#include "code\WorkInProgress\MadmanMartian\blacksmithing\misc_components.dm"
#include "code\WorkInProgress\Mini\ATM.dm"
#include "code\WorkInProgress\Mini\atmos_control.dm"
#include "code\WorkInProgress\pomf\spacepods\actions.dm"