Adds a new black market item, the V8 Engine. (#70393)

This PR adds a new item to the black market uplink, the V8 Engine. The V8 engine is a classic, vintage engine, kept perserved for hundreds of years by black market smugglers, and they'll only ship it to you for an exceptional cost.
This commit is contained in:
ArcaneMusic
2022-10-31 12:04:09 +01:00
committed by GitHub
parent 535ca7dcb9
commit a9451f4d22
10 changed files with 165 additions and 0 deletions
@@ -500,3 +500,13 @@
if(!learned_recipes)
learned_recipes = list()
learned_recipes |= R
/datum/mind/proc/has_crafting_recipe(mob/user, potential_recipe)
if(!learned_recipes)
return FALSE
if(!istype(potential_recipe, /datum/crafting_recipe))
CRASH("Non-crafting recipe passed to has_crafting_recipe")
for(var/recipe in user.mind.learned_recipes)
if(recipe == potential_recipe)
return TRUE
return FALSE
@@ -1839,5 +1839,23 @@
qdel(toilet)
to_chat(user, span_notice("[user] attaches the flamethrower to the repurposed toilet."))
/datum/crafting_recipe/house_edge
name = "House Edge"
result = /obj/item/house_edge
always_available = FALSE
tool_behaviors = list(TOOL_WRENCH, TOOL_SCREWDRIVER, TOOL_WELDER)
reqs = list(
/obj/item/v8_engine = 1,
/obj/item/weaponcrafting/receiver = 1,
/obj/item/assembly/igniter = 1,
/obj/item/stack/sheet/iron = 2,
/obj/item/knife = 1,
/obj/item/weldingtool = 1,
/obj/item/roulette_wheel_beacon = 1,
)
time = 10 SECONDS
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
#undef CRAFTING_MACHINERY_CONSUME
#undef CRAFTING_MACHINERY_USE
+117
View File
@@ -0,0 +1,117 @@
#define ENGINE_COOLDOWN 5 SECONDS
#define DASH_COOLDOWN 2.5 SECONDS
#define HOUSE_EDGE_ICONS_MAX 3
#define HOUSE_EDGE_ICONS_MIN 0
/obj/item/v8_engine
name = "ancient engine"
desc = "An extremely well perserved, massive V8 engine from the early 2000s. It seems to be missing the rest of the vehicle. There's a tiny label on the side."
icon = 'icons/obj/weapons/items_and_weapons.dmi'
icon_state = "v8_engine"
w_class = WEIGHT_CLASS_HUGE
force = 5
throwforce = 15
throw_range = 1
throw_speed = 1
COOLDOWN_DECLARE(engine_sound_cooldown)
/obj/item/v8_engine/Initialize(mapload)
. = ..()
AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=5, force_wielded=5)
/obj/item/v8_engine/attack_self(mob/user, modifiers)
. = ..()
if (!COOLDOWN_FINISHED(src, engine_sound_cooldown))
return
playsound(src, 'sound/items/car_engine_start.ogg', vol = 75, vary = FALSE, extrarange = 3)
Shake(7, 7, ENGINE_COOLDOWN)
to_chat(user, span_notice("Darn thing... it's too old to keep on without retrofitting it! Without modifications, it works like it's junk."))
COOLDOWN_START(src, engine_sound_cooldown, ENGINE_COOLDOWN)
/obj/item/v8_engine/examine_more(mob/user)
. = ..()
INVOKE_ASYNC(src, .proc/start_learning_recipe, user)
/obj/item/v8_engine/proc/start_learning_recipe(mob/user)
var/datum/crafting_recipe/house_edge/edge
if(!user.mind)
return
if(user.mind.has_crafting_recipe(user = user, potential_recipe = edge))
return
to_chat(user, span_notice("You peer at the label on the side, reading about some unique modifications that could be made to the engine..."))
if(do_after(user, 15 SECONDS, src))
user.mind.teach_crafting_recipe(edge)
to_chat(user, span_notice("You learned how to make the House Edge."))
/obj/item/house_edge
name = "House Edge"
desc = "Dangerous. Loud. Sleek. It has a built in roulette wheel. This thing could easily rip your arm off if you're not careful."
icon = 'icons/obj/weapons/items_and_weapons.dmi'
icon_state = "house_edge0"
inhand_icon_state = "house_edge0"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
sharpness = SHARP_EDGED
force = 12
throwforce = 10
throw_range = 5
throw_speed = 1
hitsound = 'sound/items/car_engine_start.ogg'
/// The number of charges the house edge has accrued through 2-handed hits, to charge a more powerful charge attack.
var/fire_charges = 0
///Sound played when wielded.
var/active_hitsound = 'sound/items/house_edge_hit.ogg'
///Datum that tracks weapon dashing for the fire_charge system
var/datum/action/innate/dash/charge
COOLDOWN_DECLARE(fire_charge_cooldown)
/obj/item/house_edge/Initialize(mapload)
. = ..()
AddComponent(/datum/component/two_handed, force_unwielded = 12, force_wielded = 22, attacksound = active_hitsound)
RegisterSignal(src, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_PRE_THROW, COMSIG_ITEM_ATTACK_SELF), .proc/reset_charges)
/obj/item/house_edge/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!ismob(target))
return
if(HAS_TRAIT(src, TRAIT_WIELDED))
//Add a fire charge to a max of 3, updates icon_state.
fire_charges = clamp((fire_charges + 1), HOUSE_EDGE_ICONS_MIN, HOUSE_EDGE_ICONS_MAX)
icon_state = "house_edge[fire_charges]"
COOLDOWN_RESET(src, fire_charge_cooldown)
else
//Lose a fire charge to a min of 0, updates icon_state.
fire_charges = clamp((fire_charges - 1), HOUSE_EDGE_ICONS_MIN, HOUSE_EDGE_ICONS_MAX)
icon_state = "house_edge[fire_charges]"
do_sparks(number = 0, cardinal_only = TRUE, source = src)
/obj/item/house_edge/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters)
if(!COOLDOWN_FINISHED(src, fire_charge_cooldown))
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
if(fire_charges <= 0)
balloon_alert(user, "no fire charges!")
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
user.throw_at(target = get_turf(target), range = 2 * fire_charges, speed = 5, thrower = user, spin = FALSE, gentle = FALSE, quickstart = TRUE)
COOLDOWN_START(src, fire_charge_cooldown, DASH_COOLDOWN)
reset_charges(on_dash = TRUE)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/item/house_edge/update_icon_state()
inhand_icon_state = HAS_TRAIT(src, TRAIT_WIELDED) ? "house_edge1" : "house_edge0"
return ..()
/obj/item/house_edge/proc/reset_charges(on_dash = FALSE)
if(!COOLDOWN_FINISHED(src, fire_charge_cooldown) && !on_dash)
return
if(fire_charges)
balloon_alert_to_viewers("charges lost!")
fire_charges = 0
icon_state = "house_edge[fire_charges]"
update_icon()
#undef ENGINE_COOLDOWN
#undef DASH_COOLDOWN
#undef HOUSE_EDGE_ICONS_MAX
#undef HOUSE_EDGE_ICONS_MIN
@@ -76,3 +76,22 @@
price_max = CARGO_CRATE_VALUE * 5
stock_max = 2
availability_prob = 30
/datum/market_item/misc/roulette
name = "Roulette Beacon"
desc = "Start your own underground casino, wherever you go. One use only. No refunds."
item = /obj/item/roulette_wheel_beacon
price_min = CARGO_CRATE_VALUE * 1
price_max = CARGO_CRATE_VALUE * 2.5
stock_max = 3
availability_prob = 50
/datum/market_item/misc/v8_engine
name = "Genuine V8 Engine (Perserved)"
desc = "Hey greasemonkeys, you ready to start those engines? Want to start racing through the halls and making some tighter turns on the interstellar beltway? Then you need this classic engine."
item = /obj/item/v8_engine
price_min = CARGO_CRATE_VALUE * 4
price_max = CARGO_CRATE_VALUE * 6
stock_max = 1
availability_prob = 15
Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.
Binary file not shown.
+1
View File
@@ -1657,6 +1657,7 @@
#include "code\game\objects\items\toy_mechs.dm"
#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
#include "code\game\objects\items\v8_engine.dm"
#include "code\game\objects\items\vending_items.dm"
#include "code\game\objects\items\virgin_mary.dm"
#include "code\game\objects\items\wall_mounted.dm"