diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c8ba2b49c40..2455aefad5e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -84,14 +84,14 @@ if(istype(A, /datum/reagent)) if(!reagents) reagents = new() - reagents.reagent_list.Add(A) - reagents.conditional_update() + reagents.reagent_list.Add(A) + reagents.conditional_update() else if(istype(A, /atom/movable)) var/atom/movable/M = A if(istype(M.loc, /mob/living)) var/mob/living/L = M.loc L.unEquip(M) - M.loc = src + M.loc = src /atom/proc/assume_air(datum/gas_mixture/giver) qdel(giver) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index ae299d78a90..c0ecd475f5e 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -361,10 +361,9 @@ Class Procs: return ..() -/obj/machinery/CheckParts() +/obj/machinery/CheckParts(list/parts_list) ..() RefreshParts() - return /obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames. return diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 017583b7336..111f7c4dc33 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,3 +1,5 @@ +var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.dmi', "icon_state" = "fire") + /obj/item name = "item" icon = 'icons/obj/items.dmi' diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 416608b77f7..7cad42a216c 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -105,4 +105,28 @@ desc = "Damn son, where'd you find this?" icon_state = "air_horn" honk_sound = 'sound/items/AirHorn2.ogg' - cooldowntime = 50 \ No newline at end of file + cooldowntime = 50 + +/obj/item/weapon/bikehorn/golden + name = "golden bike horn" + desc = "Golden? Clearly, its made with bananium! Honk!" + icon_state = "gold_horn" + item_state = "gold_horn" + +/obj/item/weapon/bikehorn/golden/attack() + flip_mobs() + return ..() + +/obj/item/weapon/bikehorn/golden/attack_self(mob/user) + flip_mobs() + ..() + +/obj/item/weapon/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user) + if (!spam_flag) + var/turf/T = get_turf(src) + for(M in ohearers(7, T)) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf) + continue + M.emote("flip") \ No newline at end of file diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 9ccff568b87..d14c48a761e 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -69,7 +69,7 @@ ratio = Ceiling(ratio*4) * 25 overlays += "[icon_state]-charge[ratio]" -/obj/item/weapon/defibrillator/CheckParts() +/obj/item/weapon/defibrillator/CheckParts(list/parts_list) ..() bcell = locate(/obj/item/weapon/stock_parts/cell) in contents update_icon() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index c3a23b2ba7d..e595ab33afc 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -164,10 +164,13 @@ update_icon() return -/obj/item/weapon/flamethrower/CheckParts() +/obj/item/weapon/flamethrower/CheckParts(list/parts_list) ..() weldtool = locate(/obj/item/weapon/weldingtool) in contents igniter = locate(/obj/item/device/assembly/igniter) in contents + weldtool.status = 0 + igniter.secured = 0 + status = 1 update_icon() //Called from turf.dm turf/dblclick diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index cad1b7630e3..745afd967ee 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -93,7 +93,7 @@ else range = pick(2,2,2,3,3,3,4) -/obj/item/weapon/grenade/iedcasing/CheckParts() +/obj/item/weapon/grenade/iedcasing/CheckParts(list/parts_list) ..() var/obj/item/weapon/reagent_containers/food/drinks/cans/can = locate() in contents if(can) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 8348bef8bb1..9c27c8cc5ec 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -705,3 +705,72 @@ new /obj/item/weapon/lipstick/green(src) new /obj/item/weapon/lipstick/blue(src) new /obj/item/weapon/lipstick/white(src) + +#define NODESIGN "None" +#define NANOTRASEN "NanotrasenStandard" +#define SYNDI "SyndiSnacks" +#define HEART "Heart" +#define SMILE "SmileyFace" + +/obj/item/weapon/storage/box/papersack + name = "paper sack" + desc = "A sack neatly crafted out of paper." + icon_state = "paperbag_None" + item_state = "paperbag_None" + foldable = null + var/design = NODESIGN + +/obj/item/weapon/storage/box/papersack/update_icon() + if(contents.len == 0) + icon_state = "[item_state]" + else icon_state = "[item_state]_closed" + +/obj/item/weapon/storage/box/papersack/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/pen)) + //if a pen is used on the sack, dialogue to change its design appears + if(contents.len) + to_chat(user, "You can't modify this [src] with items still inside!") + return + var/list/designs = list(NODESIGN, NANOTRASEN, SYNDI, HEART, SMILE, "Cancel") + var/switchDesign = input("Select a Design:", "Paper Sack Design", designs[1]) in designs + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away!") + return + var/choice = designs.Find(switchDesign) + if(design == designs[choice] || designs[choice] == "Cancel") + return 0 + to_chat(usr, "You make some modifications to the [src] using your pen.") + design = designs[choice] + icon_state = "paperbag_[design]" + item_state = "paperbag_[design]" + switch(designs[choice]) + if(NODESIGN) + desc = "A sack neatly crafted out of paper." + if(NANOTRASEN) + desc = "A standard Nanotrasen paper lunch sack for loyal employees on the go." + if(SYNDI) + desc = "The design on this paper sack is a remnant of the notorious 'SyndieSnacks' program." + if(HEART) + desc = "A paper sack with a heart etched onto the side." + if(SMILE) + desc = "A paper sack with a crude smile etched onto the side." + return 0 + else if(is_sharp(W)) + if(!contents.len) + if(item_state == "paperbag_None") + to_chat(user, "You cut eyeholes into the [src].") + new /obj/item/clothing/head/papersack(user.loc) + qdel(src) + return 0 + else if(item_state == "paperbag_SmileyFace") + to_chat(user, "You cut eyeholes into the [src] and modify the design.") + new /obj/item/clothing/head/papersack/smiley(user.loc) + qdel(src) + return 0 + return ..() + +#undef NODESIGN +#undef NANOTRASEN +#undef SYNDI +#undef HEART +#undef SMILE \ No newline at end of file diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 305befe2ecb..017f2250e2c 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -23,7 +23,7 @@ update_icon() return -/obj/item/weapon/melee/baton/CheckParts() +/obj/item/weapon/melee/baton/CheckParts(list/parts_list) ..() bcell = locate(/obj/item/weapon/stock_parts/cell) in contents update_icon() diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 7ecbef740cd..174108a3a87 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -283,20 +283,90 @@ w_class = 4 slot_flags = SLOT_BACK force_unwielded = 10 - force_wielded = 18 // Was 13, Buffed - RR + force_wielded = 18 throwforce = 20 - throw_speed = 3 + throw_speed = 4 armour_penetration = 10 - no_spin_thrown = 1 // Thrown spears that spin look dumb. -Fox + materials = list(MAT_METAL=1150, MAT_GLASS=2075) + hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") + sharp = 1 + edge = 1 + no_spin_thrown = 1 + var/obj/item/weapon/grenade/explosive = null + var/war_cry = "AAAAARGH!!!" /obj/item/weapon/twohanded/spear/update_icon() - icon_state = "spearglass[wielded]" - return + if(explosive) + icon_state = "spearbomb[wielded]" + else + icon_state = "spearglass[wielded]" -/obj/item/weapon/twohanded/spear/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return ..() +/obj/item/weapon/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity) + if(!proximity) + return + if(isturf(AM)) //So you can actually melee with it + return + if(explosive && wielded) + user.say("[war_cry]") + explosive.loc = AM + explosive.prime() + qdel(src) + +/obj/item/weapon/twohanded/spear/throw_impact(atom/target) + . = ..() + if(explosive) + explosive.prime() + qdel(src) + +/obj/item/weapon/twohanded/spear/AltClick() + ..() + if(!explosive) + return + if(ismob(loc)) + var/mob/M = loc + var/input = stripped_input(M, "What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50) + if(input) + war_cry = input + +/obj/item/weapon/twohanded/spear/CheckParts(list/parts_list) + ..() + if(explosive) + explosive.loc = get_turf(src.loc) + explosive = null + var/obj/item/weapon/grenade/G = locate() in contents + if(G) + explosive = G + name = "explosive lance" + desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!" + return + update_icon() + +//GREY TIDE +/obj/item/weapon/twohanded/spear/grey_tide + icon_state = "spearglass0" + name = "\improper Grey Tide" + desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces." + force_unwielded = 15 + force_wielded = 25 + throwforce = 20 + throw_speed = 4 + attack_verb = list("gored") + +/obj/item/weapon/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) + ..() + if(!proximity) + return + user.faction |= "greytide(\ref[user])" + if(isliving(AM)) + var/mob/living/L = AM + if(istype (L, /mob/living/simple_animal/hostile/illusion)) + return + if(!L.stat && prob(50)) + var/mob/living/simple_animal/hostile/illusion/M = new(user.loc) + M.faction = user.faction.Copy() + M.Copy_Parent(user, 100, user.health/2.5, 12, 30) + M.GiveTarget(L) //Putting heads on spears /obj/item/organ/external/head/attackby(var/obj/item/weapon/W, var/mob/living/user, params) @@ -348,6 +418,53 @@ name = "Kidan spear" desc = "A spear brought over from the Kidan homeworld." +// DIY CHAINSAW +/obj/item/weapon/twohanded/required/chainsaw + name = "chainsaw" + desc = "A versatile power tool. Useful for limbing trees and delimbing humans." + icon_state = "gchainsaw_off" + flags = CONDUCT + force = 13 + w_class = 5 + throwforce = 13 + throw_speed = 2 + throw_range = 4 + materials = list(MAT_METAL=13000) + origin_tech = "materials=3;engineering=4;combat=2" + attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") + hitsound = "swing_hit" + sharp = 1 + edge = 1 + actions_types = list(/datum/action/item_action/startchainsaw) + var/on = 0 + +/obj/item/weapon/twohanded/required/chainsaw/attack_self(mob/user) + on = !on + to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]") + if(on) + playsound(loc, 'sound/weapons/chainsawstart.ogg', 50, 1) + force = on ? 21 : 13 + throwforce = on ? 21 : 13 + icon_state = "gchainsaw_[on ? "on" : "off"]" + + if(hitsound == "swing_hit") + hitsound = 'sound/weapons/chainsaw.ogg' + else + hitsound = "swing_hit" + + if(src == user.get_active_hand()) //update inhands + user.update_inv_l_hand() + user.update_inv_r_hand() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/weapon/twohanded/required/chainsaw/doomslayer + name = "OOOH BABY" + desc = "VRRRRRRR!!!" + armour_penetration = 100 + + ///CHAINSAW/// /obj/item/weapon/twohanded/chainsaw icon_state = "chainsaw0" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f7253a82cdf..6e53e8a9b04 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -372,3 +372,17 @@ desc = "A horribly bloated and mismatched human head." icon_state = "lingspacehelmet" item_state = "lingspacehelmet" + +/obj/item/clothing/head/papersack + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." + icon_state = "papersack" + flags = BLOCKHAIR + flags_inv = HIDEFACE|HIDEEARS + +/obj/item/clothing/head/papersack/smiley + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." + icon_state = "papersack_smile" + flags = BLOCKHAIR + flags_inv = HIDEFACE|HIDEEARS diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 4a059158e2f..6f946146aa4 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -26,6 +26,24 @@ time = 15 category = CAT_WEAPON +/datum/crafting_recipe/lance + name = "explosive lance (grenade)" + result = /obj/item/weapon/twohanded/spear + reqs = list(/obj/item/weapon/twohanded/spear = 1, + /obj/item/weapon/grenade = 1) + parts = list(/obj/item/weapon/grenade = 1) + time = 15 + category = CAT_WEAPON + +/datum/crafting_recipe/molotov + name = "Molotov" + result = /obj/item/weapon/reagent_containers/food/drinks/bottle/molotov + reqs = list(/obj/item/weapon/reagent_containers/glass/rag = 1, + /obj/item/weapon/reagent_containers/food/drinks/bottle = 1) + parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle = 1) + time = 40 + category = CAT_WEAPON + /datum/crafting_recipe/stunprod name = "Stunprod" result = /obj/item/weapon/melee/baton/cattleprod @@ -109,7 +127,9 @@ result = /obj/item/weapon/flamethrower reqs = list(/obj/item/weapon/weldingtool = 1, /obj/item/device/assembly/igniter = 1, - /obj/item/stack/rods = 2) + /obj/item/stack/rods = 1) + parts = list(/obj/item/device/assembly/igniter = 1, + /obj/item/weapon/weldingtool = 1) tools = list(/obj/item/weapon/screwdriver) time = 10 category = CAT_WEAPON @@ -206,6 +226,16 @@ time = 100 category = CAT_WEAPON +/datum/crafting_recipe/chainsaw + name = "Chainsaw" + result = /obj/item/weapon/twohanded/required/chainsaw + reqs = list(/obj/item/weapon/circular_saw = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/stack/sheet/plasteel = 1) + tools = list(/obj/item/weapon/weldingtool) + time = 50 + category = CAT_WEAPON + /datum/crafting_recipe/spear name = "Spear" result = /obj/item/weapon/twohanded/spear @@ -223,6 +253,13 @@ /datum/reagent/holywater = 10) parts = list(/obj/item/device/camera = 1) +/datum/crafting_recipe/papersack + name = "Paper Sack" + result = /obj/item/weapon/storage/box/papersack + time = 10 + reqs = list(/obj/item/weapon/paper = 5) + category = CAT_MISC + /datum/crafting_recipe/notreallysoap name = "Homemade Soap" result = /obj/item/weapon/soap/ducttape @@ -264,4 +301,12 @@ result = /obj/item/latexballon time = 15 reqs = list(/obj/item/clothing/gloves/color/latex = 1, - /obj/item/stack/cable_coil = 5) \ No newline at end of file + /obj/item/stack/cable_coil = 5) + +/datum/crafting_recipe/gold_horn + name = "Golden bike horn" + result = /obj/item/weapon/bikehorn/golden + time = 20 + reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, + /obj/item/weapon/bikehorn) + category = CAT_MISC \ No newline at end of file diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 0863302f5a0..93d80552de6 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -277,3 +277,70 @@ item_state = "carton" isGlass = 0 list_reagents = list("limejuice" = 100) + +////////////////////////// MOLOTOV /////////////////////// +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov + name = "molotov cocktail" + desc = "A throwing weapon used to ignite things, typically filled with an accelerant. Recommended highly by rioters and revolutionaries. Light and toss." + icon_state = "vodkabottle" + list_reagents = list() + var/list/accelerants = list(/datum/reagent/ethanol,/datum/reagent/fuel,/datum/reagent/clf3,/datum/reagent/phlogiston, + /datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/plasma,/datum/reagent/plasma_dust) + var/active = 0 + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/CheckParts(list/parts_list) + ..() + var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = locate() in contents + if(B) + icon_state = B.icon_state + B.reagents.copy_to(src, 100) + if(!B.isGlass) + desc += " You're not sure if making this out of a carton was the brightest idea." + isGlass = 0 + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/throw_impact(atom/target,mob/thrower) + var/firestarter = 0 + for(var/datum/reagent/R in reagents.reagent_list) + for(var/A in accelerants) + if(istype(R, A)) + firestarter = 1 + break + SplashReagents(target) + if(firestarter && active) + target.fire_act() + new /obj/effect/hotspot(get_turf(target)) + ..() + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) + if(is_hot(I) && !active) + active = 1 + var/turf/bombturf = get_turf(src) + var/area/bombarea = get_area(bombturf) + message_admins("[key_name(user)]? has primed a [name] for detonation at [bombarea] (JMP).") + log_game("[key_name(user)] has primed a [name] for detonation at [bombarea] ([bombturf.x],[bombturf.y],[bombturf.z]).") + + to_chat(user, "You light [src] on fire.") + overlays += fire_overlay + if(!isGlass) + spawn(50) + if(active) + var/counter + var/target = loc + for(counter = 0, counter < 2, counter++) + if(istype(target, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = target + target = S.loc + if(istype(target, /atom)) + var/atom/A = target + SplashReagents(A) + A.fire_act() + qdel(src) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attack_self(mob/user) + if(active) + if(!isGlass) + to_chat(user, "The flame's spread too far on it!") + return + to_chat(user, "You snuff out the flame on \the [src].") + overlays -= fire_overlay + active = 0 \ No newline at end of file diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 689799680ec..a09589f22ee 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -153,7 +153,7 @@ var/see_ghosts = 0 //for the spoop of it -/obj/item/device/camera/spooky/CheckParts() +/obj/item/device/camera/spooky/CheckParts(list/parts_list) ..() var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents if(C) diff --git a/icons/goonstation/effects/fire.dmi b/icons/goonstation/effects/fire.dmi new file mode 100644 index 00000000000..48a1f9b90e6 Binary files /dev/null and b/icons/goonstation/effects/fire.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 7553227171c..fec4fdce7a1 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 2a5ac2889c2..076449fa8ad 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index f950b2bdf74..428b3d40998 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 21205081639..25ec0162866 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 40ef753fb6f..f81f4ab555a 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 9c90b468860..d21263adf0f 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 2c9a230d1df..4b3bb90082d 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ