From f682d8d5bf4aedc395632e1531dd241ecc54d94b Mon Sep 17 00:00:00 2001 From: DGamerL <108773801+DGamerL@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:45:23 +0100 Subject: [PATCH] New fire colors (#27911) --- .../chemical_flamethrower.dm | 14 ++++++++++++- .../chemical_flamethrower/fire_effect.dm | 19 +++++++++++++++--- .../chemistry/reagents/pyrotechnic.dm | 4 ++++ .../reagents/chemistry/reagents_datum.dm | 2 ++ icons/effects/chemical_fire.dmi | Bin 2090 -> 11134 bytes 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm b/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm index 9e57dc47933..21a830842d9 100644 --- a/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm +++ b/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm @@ -29,6 +29,8 @@ var/canister_burn_duration = 10 SECONDS /// How many firestacks will our reagent apply var/canister_fire_applications = 1 + /// Does our chemical have any special color? + var/canister_fire_color /// How much ammo do we use per tile? var/ammo_usage = 1 /// Is this a syndicate flamethrower @@ -90,12 +92,14 @@ canister_burn_temp = null canister_burn_duration = null canister_fire_applications = null + canister_fire_color = null return var/burn_temp var/burn_duration var/fire_applications var/how_many_canisters = length(canisters) + var/list/colors = list() for(var/obj/item/chemical_canister/canister as anything in canisters) if(!canister.ammo) @@ -103,10 +107,13 @@ burn_temp += canister.chem_burn_temp burn_duration += canister.chem_burn_duration fire_applications += canister.fire_applications + colors += canister.chem_color canister_burn_temp = round(burn_temp / how_many_canisters, 1) canister_burn_duration = round(burn_duration / how_many_canisters, 1) canister_fire_applications = round(fire_applications / how_many_canisters, 1) + if(length(colors)) + canister_fire_color = pick(colors) update_icon(UPDATE_OVERLAYS) /obj/item/chemical_flamethrower/afterattack__legacy__attackchain(atom/target, mob/user, flag) @@ -159,7 +166,8 @@ previousturf = T /obj/item/chemical_flamethrower/proc/make_flame(turf/spawn_turf) - new /obj/effect/fire(spawn_turf, canister_burn_temp, (canister_burn_duration + rand(1, 3) SECONDS), canister_fire_applications) // For that spicy randomness (and to save your ears from all fires extinguishing at the same time) + // For that spicy randomness (and to save your ears from all fires extinguishing at the same time) + new /obj/effect/fire(spawn_turf, canister_burn_temp, (canister_burn_duration + rand(1, 3) SECONDS), canister_fire_applications, canister_fire_color) /* * Uses `amount` ammo from the flamethrower. @@ -232,6 +240,8 @@ var/first_time_silent = FALSE // The reason for this is so we can have canisters that spawn with reagents but don't announce it on `Initialize()` /// What chemical do we have? This will be the chemical ID, so a string var/stored_chemical + /// What color will our fire burn + var/chem_color /obj/item/chemical_canister/Initialize(mapload) . = ..() @@ -273,6 +283,8 @@ chem_burn_duration = reagent_to_burn.burn_duration chem_burn_temp = reagent_to_burn.burn_temperature fire_applications = reagent_to_burn.fire_stack_applications + if(reagent_to_burn.burn_color) + chem_color = reagent_to_burn.burn_color ammo = initial(ammo) has_filled_reagent = TRUE reagents.clear_reagents() diff --git a/code/game/objects/items/weapons/chemical_flamethrower/fire_effect.dm b/code/game/objects/items/weapons/chemical_flamethrower/fire_effect.dm index 1cdf4e1630b..158816ca4cc 100644 --- a/code/game/objects/items/weapons/chemical_flamethrower/fire_effect.dm +++ b/code/game/objects/items/weapons/chemical_flamethrower/fire_effect.dm @@ -5,8 +5,8 @@ GLOBAL_LIST_EMPTY(flame_effects) name = "fire" desc = "You don't think you should touch this." icon = 'icons/effects/chemical_fire.dmi' - icon_state = "fire1" - + icon_state = "red_small" + base_icon_state = "red" /// How hot is our fire? var/temperature /// How long will our fire last @@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(flame_effects) /// How many firestacks does the fire give to mobs var/application_stacks = 1 -/obj/effect/fire/Initialize(mapload, reagent_temperature, reagent_duration, fire_applications) +/obj/effect/fire/Initialize(mapload, reagent_temperature, reagent_duration, fire_applications, color) . = ..() if(reagent_duration < 0 || reagent_temperature <= 0) // There is no reason for this thing to exist @@ -24,6 +24,9 @@ GLOBAL_LIST_EMPTY(flame_effects) duration = reagent_duration temperature = reagent_temperature application_stacks = max(application_stacks, fire_applications) + if(color) + base_icon_state = color + update_icon() for(var/obj/effect/fire/flame in get_turf(src)) if(!istype(flame) || flame == src) @@ -48,6 +51,7 @@ GLOBAL_LIST_EMPTY(flame_effects) fizzle() return duration -= 2 SECONDS + update_icon(UPDATE_ICON_STATE) for(var/atom/movable/thing_to_burn in get_turf(src)) if(isliving(thing_to_burn)) @@ -68,6 +72,14 @@ GLOBAL_LIST_EMPTY(flame_effects) var/datum/milla_safe/fire_heat_air/milla = new() milla.invoke_async(src, location) +/obj/effect/fire/update_icon_state() + var/suffix = "small" + if(duration >= 30 SECONDS) + suffix = "big" + else if(duration >= 10 SECONDS) + suffix = "medium" + icon_state = "[base_icon_state]_[suffix]" + /datum/milla_safe/fire_heat_air /datum/milla_safe/fire_heat_air/on_run(obj/effect/fire/fire, turf/T) @@ -79,6 +91,7 @@ GLOBAL_LIST_EMPTY(flame_effects) duration -= 10 SECONDS if(duration <= 0) fizzle() + update_icon(UPDATE_ICON_STATE) /obj/effect/fire/proc/on_atom_entered(datum/source, atom/movable/entered, old_loc) SIGNAL_HANDLER // COMSIG_ATOM_ENTERED diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index ec1b87f2da3..a7f4361161d 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -8,6 +8,7 @@ taste_description = "burning" burn_temperature = T0C + 500 burn_duration = 20 SECONDS + burn_color = "white" var/temp_fire = 4000 var/temp_deviance = 1000 var/size_divisor = 40 @@ -46,6 +47,7 @@ size_divisor = 80 mob_burning = 3 // 15 burn_temperature = T0C + 700 + burn_color = "white" /datum/reagent/napalm name = "Napalm" @@ -198,6 +200,7 @@ taste_description = "rust" burn_temperature = T0C + 1500 // hahahahHAHAHAHAH LET IT BURN burn_duration = 5 SECONDS // Not for long though + burn_color = "blue" // too hot! /datum/reagent/thermite/reaction_mob(mob/living/M, method= REAGENT_TOUCH, volume) if(method == REAGENT_TOUCH) @@ -253,6 +256,7 @@ burn_temperature = T0C + 700 burn_duration = 15 SECONDS fire_stack_applications = 3 + burn_color = "green" /datum/reagent/clf3/on_mob_life(mob/living/M) if(M.on_fire) diff --git a/code/modules/reagents/chemistry/reagents_datum.dm b/code/modules/reagents/chemistry/reagents_datum.dm index e51056cbbea..b2affb2821a 100644 --- a/code/modules/reagents/chemistry/reagents_datum.dm +++ b/code/modules/reagents/chemistry/reagents_datum.dm @@ -51,6 +51,8 @@ var/burn_duration = 30 SECONDS /// How many firestacks will the reagent apply when it is burning? Currently only used for chemical flamethrowers var/fire_stack_applications = 1 + /// If we burn in a fire, what color do we have? + var/burn_color /datum/reagent/Destroy() . = ..() diff --git a/icons/effects/chemical_fire.dmi b/icons/effects/chemical_fire.dmi index 9b9118cfc154ee0ad87080da3b9b9b58ae2eafae..c36026c1464a76a850ae8303cfa3bcb4eba6c4be 100644 GIT binary patch literal 11134 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 literal 2090 zcmWku2|Uz!6#xCt8KaU^N(!rTjXN636&*S^Y@>fKA(4eKcDx$pZDJ9eO{)Y@5b3QJsJRDw)ZBl?P~A- zL#c?`UVW523;=w^Z%e>>fj}TMhw821S~E~@3DsFZ@^DCC0z_7DojD}3hU@5%&!D@_CUwDv4q`+aMpj`& zD#|xODvaSrFd%q<6v9d#EDHw`d!%VKsyKkoq@zR{+Tehc8^dHB)UZn35+bpI8|)Aw z4G~+xA{$s@3s+L0*MU&8Bl?&MRbtTe4-&Xa0~T3AvT%rxLQgbdJ`5^xNSOkZsW2%~ z&kM;y)lj`mm=pme52)?~J^~3=fLb$%6oVFLOcnu4*JAA+c)L5^>WmfZf(ifzSg_a@ zkw?JOJV?od>MWrrbhLIA-m#w2v4N`OAp{RmrXnM3Dk*{*jPVy6sG}UJ;vhE2LWop| zNK+32k1^1h3~HMjK5~dcq~SHTSeq+OR^rMu%1k+2Y?uOUe;muCy$1pG)jSsMpdPhn!-JEF>3^zQ`vlm z{dW5fd!}K2e@=Z)fT6#cWtnNGUuKs5in2S48diVk-(taR@xlJ}IezP|Q|1N3eM^m( z8p^f@u_t4oHwe%XFO~LeJkbmQTIKEK5%6&vWNJHzxTpT1EgF>{uA;7@w=8}<#n zY(FB(?x!!j6lIa;9h_$sd|7An{=A)+h{FD%TNFLqDIFb(4(1G%-iq|8BCW5! zcNZ{@w9C6Y#^UF+y_9WObQ=(f5ub1GO0T_!ZlCpE2{ ztp?o12jlZQ3|0NMrmQ9?my^iO%*Wj!+V^Ab+ZKsyw$3^o!Ci4y=YGKaVp-C)gax?| zlKpOVLRT5D5T5q0@uk8}W<5sxvyD{Wt~vI(y0PVvBrV`Sf#(UV3%oJ3eivOWxi4I}&Q0Ca0e??r|Ce{b7ZN zU-9o%{4&)0xHYkN@-Jp!>r!xINy&)Ae!EfMzuSgBkNb+NOLOAbAy$S_GplZqUwUggLSbEgKt@mz1@6X&tcurxqmH~j8p1X z3iHL4WqHQ_e|}rFjo-f~uB@?(Uv*cHwe6YkWA3nJp&&^=m>t#iQnBAV?cs{KeoMxp z9viS0YvoESv8<~G3qdrLEiW&}Ee!np(c}~@{C4(lOTmJ)Z4)lE^}C`bt#t1GJ1=#C zN9;SifJN(Q8gyBAZDZ8s>iJLO4BozeU9qco*14bzs%BxN_o21218XJ*=&0Dnay%(> zrL*(L7f+?qjAhZBKS%UJ<58o{C7QaNGnf&*OS`77(Q0&}aK&7s(PjJc@&cD-iI`mO zTJr~+-qYpFq`X6MhhLR*H$T&d zU0dt*^^YkA-?iJf;gKnQ$8=mKdOoj-+S{eLr`S_)N;xoa=PaV^%Bm}{cKGm<@Sf+K zjpYe9ChAYLe403NX7;6iSKD*aLpmz1<>BfHMU;+-R^3$A`{PL9sZ-o@CVQ{<+&DiT zVO9{u$He{q{{HV{?R0Z>jfxJdmT*McLBHoEbR^B?1qh4Ucb;CpCFhMz;Bey6`(q<< z=N0f>rqISYz@xahtXlb&wd*GHZ*9)5QXbhDGFIhUa&bQH8v1Z|*oK<>acstyXOc>D z<~fC@=b--g-67W#oM*b_Z*N{nCg6~9@m=eugkq>YH%I6>8eqWu%4Wy__xd$5JUm?1 zvSX}b9BJN#=6>FW+`wnsU+0CJ!a-pLP6cty^78%(EJjl(d@;pIg3noPI&| zlQNl2J}5CL>7VwH5xN{lvFc2s;d#|>%49z>YlM%HU_Wti-dfD$zIOCZYRAEA?~Iju}Hv=5%e%KSwq=c{0mit3N65 NUhnHwyzbYO{{fvL%8>v7