You can light a match on the heel of your boot (#88690)

## About The Pull Request

- Matches can be ignited with boots.
- Matches have a rare chance of failing to ignite (prompting you to try
again) or an even rarer chance of snapping (wasting it).
- Also makes ignition span use mostly-consistent (using rose span for
the "cooler" ignition effects).

## Why It's Good For The Game

You may be thinking "hey, matches won't light on just friction unless
they're from the 1800s", and you'd be right. But it's a cool movie
trope, which means it should be possible, I don't make the rules.

## Changelog

🆑 Melbert
add: You can light matches on the heel of your boots - Just don't do it
too hard.
/🆑
This commit is contained in:
MrMelbert
2025-01-06 03:16:59 +01:00
committed by GitHub
parent b8f53bcd54
commit 586710e0d4
18 changed files with 114 additions and 36 deletions
+39
View File
@@ -0,0 +1,39 @@
/// Ignites matches swiped over it.
/datum/element/ignites_matches
/datum/element/ignites_matches/Attach(datum/target)
. = ..()
RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_interact))
/datum/element/ignites_matches/Detach(datum/source)
UnregisterSignal(source, COMSIG_ATOM_ITEM_INTERACTION)
return ..()
/datum/element/ignites_matches/proc/on_interact(atom/source, mob/living/user, obj/item/match/match, ...)
SIGNAL_HANDLER
if(!istype(match) || match.lit || match.burnt || match.broken)
return NONE
if(SHOULD_SKIP_INTERACTION(source, match, user))
return NONE
var/over_what_tp = source.loc == user ? "[user.p_their()] [source.name]" : source
var/over_what_fp = source.loc == user ? "your [source.name]" : source
if(prob(10))
user.visible_message(
span_warning("[user] swipes [match] over [over_what_tp], but nothing happens."),
span_warning("You swipe [match] over [over_what_fp], but it fails to ignite."),
)
return ITEM_INTERACT_SUCCESS
if(prob((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_HULK)) ? 33 : 2))
user.visible_message(
span_warning("[user] swipes [match] over [over_what_tp], accidentally snapping it."),
span_warning("You swipe [match] over [over_what_fp] too fast, snapping it in half."),
)
match.snap()
return ITEM_INTERACT_SUCCESS
user.visible_message(
span_rose("[user] swipes [match] over [over_what_tp], igniting it."),
span_rose("You swipe [match] over [over_what_fp], igniting it."),
)
match.matchignite()
return ITEM_INTERACT_SUCCESS
+55 -9
View File
@@ -18,6 +18,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "A simple match stick, used for lighting fine smokables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "match_unlit"
inhand_icon_state = "cigoff"
base_icon_state = "match"
w_class = WEIGHT_CLASS_TINY
heat = 1000
grind_results = list(/datum/reagent/phosphorus = 2)
@@ -27,6 +29,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/burnt = FALSE
/// How long the match lasts in seconds
var/smoketime = 10 SECONDS
/// If the match is broken
var/broken = FALSE
/obj/item/match/process(seconds_per_tick)
smoketime -= seconds_per_tick * (1 SECONDS)
@@ -36,21 +40,66 @@ CIGARETTE PACKETS ARE IN FANCY.DM
open_flame(heat)
/obj/item/match/fire_act(exposed_temperature, exposed_volume)
. = ..()
matchignite()
/obj/item/match/update_name(updates)
. = ..()
if(lit)
name = "lit [initial(name)]"
else if(burnt)
name = "burnt [initial(name)]"
else if(broken)
name = "broken [initial(name)]"
else
name = "[initial(name)]"
/obj/item/match/update_desc(updates)
. = ..()
if(lit)
desc = "[initial(desc)]. This one is lit."
else if(burnt)
desc = "[initial(desc)]. This one has seen better days."
else if(broken)
desc = "[initial(desc)]. This one is broken."
else
desc = initial(desc)
/obj/item/match/update_icon_state()
. = ..()
inhand_icon_state = "cigoff"
if(lit)
icon_state = "[base_icon_state]_lit"
inhand_icon_state = "cigon"
else if(burnt)
icon_state = "[base_icon_state]_burnt"
else if(broken)
icon_state = "[base_icon_state]_broken"
else
icon_state = "[base_icon_state]_unlit"
/obj/item/match/proc/snap()
if(broken)
return
if(lit)
matchburnout()
playsound(src, 'sound/effects/snap.ogg', 15, TRUE)
broken = TRUE
attack_verb_continuous = string_list(list("flicks"))
attack_verb_simple = string_list(list("flick"))
STOP_PROCESSING(SSobj, src)
update_appearance()
/obj/item/match/proc/matchignite()
if(lit || burnt)
if(lit || burnt || broken)
return
playsound(src, 'sound/items/match_strike.ogg', 15, TRUE)
lit = TRUE
icon_state = "match_lit"
damtype = BURN
force = 3
hitsound = 'sound/items/tools/welder.ogg'
inhand_icon_state = "cigon"
name = "lit [initial(name)]"
desc = "A [initial(name)]. This one is lit."
attack_verb_continuous = string_list(list("burns", "singes"))
attack_verb_simple = string_list(list("burn", "singe"))
if(isliving(loc))
@@ -68,13 +117,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
burnt = TRUE
damtype = BRUTE
force = initial(force)
icon_state = "match_burnt"
inhand_icon_state = "cigoff"
name = "burnt [initial(name)]"
desc = "A [initial(name)]. This one has seen better days."
attack_verb_continuous = string_list(list("flicks"))
attack_verb_simple = string_list(list("flick"))
STOP_PROCESSING(SSobj, src)
update_appearance()
/obj/item/match/extinguish()
. = ..()
+1 -1
View File
@@ -188,7 +188,7 @@
var/mob/living/carbon/C = user
if(C.wear_mask)
in_mouth = ", barely missing [user.p_their()] nose"
. = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_They()] light[user.p_s()] [A.loc == user ? "[user.p_their()] [A.name]" : A] in the process.")
. = span_rose("[user] swings [user.p_their()] [name][in_mouth]. [user.p_They()] light[user.p_s()] [A.loc == user ? "[user.p_their()] [A.name]" : A] in the process.")
playsound(loc, hitsound, get_clamped_volume(), TRUE, -1)
add_fingerprint(user)
// Light your candles while spinning around the room
+1 -1
View File
@@ -88,7 +88,7 @@
var/mob/living/carbon/carbon_user = user
if(carbon_user.wear_mask)
in_mouth = ", barely missing [carbon_user.p_their()] nose"
. = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_They()] light[user.p_s()] [user.p_their()] [atom.name] in the process.")
. = span_rose("[user] swings [user.p_their()] [name][in_mouth]. [user.p_They()] light[user.p_s()] [user.p_their()] [atom.name] in the process.")
playsound(loc, hitsound, get_clamped_volume(), TRUE, -1)
add_fingerprint(user)
@@ -91,13 +91,7 @@
. = ..()
atom_storage.max_slots = 10
atom_storage.set_holdable(/obj/item/match)
/obj/item/storage/box/matches/tool_act(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/match))
var/obj/item/match/match = tool
match.matchignite()
return ITEM_INTERACT_SUCCESS
return ..()
AddElement(/datum/element/ignites_matches)
/obj/item/storage/box/matches/PopulateContents()
for(var/i in 1 to 10)
+1 -1
View File
@@ -317,7 +317,7 @@
/obj/item/weldingtool/ignition_effect(atom/ignitable_atom, mob/user)
if(use_tool(ignitable_atom, user, 0))
return span_notice("[user] casually lights [ignitable_atom] with [src], what a badass.")
return span_rose("[user] casually lights [ignitable_atom] with [src], what a badass.")
else
return ""
@@ -107,7 +107,7 @@
remove_hand_with_no_refund(user)
/obj/item/melee/touch_attack/mansus_fist/ignition_effect(atom/to_light, mob/user)
. = span_notice("[user] effortlessly snaps [user.p_their()] fingers near [to_light], igniting it with eldritch energies. Fucking badass!")
. = span_rose("[user] effortlessly snaps [user.p_their()] fingers near [to_light], igniting it with eldritch energies. Fucking badass!")
remove_hand_with_no_refund(user)
/obj/item/melee/touch_attack/mansus_fist/suicide_act(mob/living/user)
@@ -92,7 +92,7 @@
remove_hand_with_no_refund(user)
/obj/item/melee/touch_attack/star_touch/ignition_effect(atom/to_light, mob/user)
. = span_notice("[user] effortlessly snaps [user.p_their()] fingers near [to_light], igniting it with cosmic energies. Fucking badass!")
. = span_rose("[user] effortlessly snaps [user.p_their()] fingers near [to_light], igniting it with cosmic energies. Fucking badass!")
remove_hand_with_no_refund(user)
/obj/item/melee/touch_attack/star_touch/attack_self(mob/living/user)
+5 -5
View File
@@ -22,8 +22,8 @@
/obj/item/clothing/shoes/combat/Initialize(mapload)
. = ..()
create_storage(storage_type = /datum/storage/pockets/shoes)
AddElement(/datum/element/ignites_matches)
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
name = "\improper SWAT boots"
@@ -59,8 +59,8 @@
/obj/item/clothing/shoes/jackboots/Initialize(mapload)
. = ..()
create_storage(storage_type = /datum/storage/pockets/shoes)
AddElement(/datum/element/ignites_matches)
/obj/item/clothing/shoes/jackboots/fast
slowdown = -1
@@ -97,8 +97,8 @@
/obj/item/clothing/shoes/winterboots/Initialize(mapload)
. = ..()
create_storage(storage_type = /datum/storage/pockets/shoes)
AddElement(/datum/element/ignites_matches)
/obj/item/clothing/shoes/winterboots/ice_boots
name = "ice hiking boots"
@@ -145,8 +145,8 @@
/obj/item/clothing/shoes/workboots/Initialize(mapload)
. = ..()
create_storage(storage_type = /datum/storage/pockets/shoes)
AddElement(/datum/element/ignites_matches)
/obj/item/clothing/shoes/workboots/mining
name = "mining boots"
@@ -164,8 +164,8 @@
/obj/item/clothing/shoes/russian/Initialize(mapload)
. = ..()
create_storage(storage_type = /datum/storage/pockets/shoes)
AddElement(/datum/element/ignites_matches)
/obj/item/clothing/shoes/discoshoes
name = "green lizardskin shoes"
+1
View File
@@ -16,6 +16,7 @@
LoadComponent(/datum/component/squeak, squeak_sound, 50, falloff_exponent = 20) //die off quick please
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0)
AddComponent(/datum/component/adjust_fishing_difficulty, 3) //Goofy
AddElement(/datum/element/ignites_matches)
/obj/item/clothing/shoes/clown_shoes/equipped(mob/living/user, slot)
. = ..()
+2 -6
View File
@@ -18,16 +18,12 @@
/obj/item/clothing/shoes/cowboy/Initialize(mapload)
. = ..()
create_storage(storage_type = /datum/storage/pockets/shoes)
if(prob(2))
//There's a snake in my boot
if(prob(2)) //There's a snake in my boot
new /mob/living/basic/snake(src)
if(has_spurs)
LoadComponent(/datum/component/squeak, spur_sound, 50, falloff_exponent = 20)
AddElement(/datum/element/ignites_matches)
/obj/item/clothing/shoes/cowboy/equipped(mob/living/carbon/user, slot)
. = ..()
@@ -103,7 +103,7 @@
/obj/item/gun/ballistic/revolver/ignition_effect(atom/A, mob/user)
if(last_fire && last_fire + 15 SECONDS > world.time)
. = span_notice("[user] touches the end of [src] to \the [A], using the residual heat to ignite it in a puff of smoke. What a badass.")
return span_rose("[user] touches the end of [src] to \the [A], using the residual heat to ignite it in a puff of smoke. What a badass.")
/obj/item/gun/ballistic/revolver/c38
name = "\improper .38 revolver"
+1 -1
View File
@@ -336,7 +336,7 @@
playsound(user, E.fire_sound, 50, TRUE)
playsound(user, loaded_projectile.hitsound, 50, TRUE)
cell.use(E.e_cost)
. = span_danger("[user] casually lights [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src]. Damn.")
. = span_rose("[user] casually lights [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src]. Damn.")
/obj/item/gun/energy/proc/instant_recharge()
SIGNAL_HANDLER
+1 -1
View File
@@ -85,7 +85,7 @@
return surgical_tray_overlay
/obj/item/cautery/ignition_effect(atom/ignitable_atom, mob/user)
. = span_notice("[user] touches the end of [src] to \the [ignitable_atom], igniting it with a puff of smoke.")
return span_rose("[user] touches the end of [src] to \the [ignitable_atom], igniting it with a puff of smoke.")
/obj/item/cautery/augment
desc = "A heated element that cauterizes wounds."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 22 KiB

+2
View File
@@ -2,6 +2,7 @@ As an Engineer, the Supermatter shard is an extremely dangerous piece of equipme
As the Captain, you can use a whetstone to sharpen your fancy fountain pen for extra robustness.
As the Lawyer, you are the last bastion of roleplay-focused jobs. Even the curator got a whip to go fight people with, that sellout!
Ask and you shall receive.
Bitrunning is a crime.
Blobs are weak to fire! Use a flame thrower for maximum damage!
Cleanbot.
Completing your objectives is good practice, but the best antagonists will strive to do more than the bare minimum to really leave an impression.
@@ -35,6 +36,7 @@ This game is older than most of the people playing it.
This is a game that is constantly being developed for. Expect things to be added, removed, fixed, and broken on a daily basis.
To defeat the slaughter demon, shoot at it until it dies.
When a round ends nearly everything about it is lost forever, leave your salt behind with it.
You can light a match with the heel of your boot. ...What's that? Friction matches went out of style in the 19th century? That's nonsense!
You can win a pulse rifle from the arcade machine. Honest.
Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style.
Gorillas can be killed by land mines placed along forest paths.
-1
View File
@@ -291,7 +291,6 @@ Modular computers are compatible with integrated circuits, but most of the progr
You don't need to destroy a Spacecoin machine to make your funds stop draining. Swiping your ID on it will stop the withdrawal.
As a Bitrunner, upgrading your quantum server will increase rewards and reduce downtime.
As a Bitrunner, your avatar has a domain info ability which will give you clues to help complete virtual domains.
Bitrunning is a crime.
You can right click someone with wire cutters, jaws of life, and box cutters to instantly snap cablecuffs or zipties. The jaws can even instantly break handcuffs!
You can alt-click tank transfer valves to remove a tank from them.
You can use a multitool in your hand to track the area's local APC.
+1
View File
@@ -1513,6 +1513,7 @@
#include "code\datums\elements\honkspam.dm"
#include "code\datums\elements\hostile_machine.dm"
#include "code\datums\elements\human_biter.dm"
#include "code\datums\elements\ignites_matches.dm"
#include "code\datums\elements\immerse.dm"
#include "code\datums\elements\inverted_movement.dm"
#include "code\datums\elements\item_fov.dm"