"
return ""
-
+//WS Begin
+/datum/controller/subsystem/ticker/proc/mouse_report()
+ if(GLOB.mouse_food_eaten)
+ var/list/parts = list()
+ parts += "Mouse stats:"
+ parts += "Mouse Born: [GLOB.mouse_spawned]"
+ parts += "Mouse Killed: [GLOB.mouse_killed]"
+ parts += "Trash Eaten: [GLOB.mouse_food_eaten]"
+ return "
[parts.Join(" ")]
"
+ return ""
+//WS End
/datum/controller/subsystem/ticker/proc/antag_report()
var/list/result = list()
var/list/all_teams = list()
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 185c6c595b80..c8c7b63d0a09 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -295,7 +295,7 @@ Turf and target are separate in case you want to teleport some distance from a t
return "[pick("!","@","#","$","%","^","&")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]"
//Returns a list of all items of interest with their name
-/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE, only_realname = FALSE)
+/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE)
var/list/mobs = sortmobs()
var/list/namecounts = list()
var/list/pois = list()
@@ -305,11 +305,7 @@ Turf and target are separate in case you want to teleport some distance from a t
continue
if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
continue
- var/name = ""
- if(only_realname)
- name = avoid_assoc_duplicate_keys(M.real_name, namecounts)
- else
- name = avoid_assoc_duplicate_keys(M.name, namecounts) + M.get_realname_string()
+ var/name = avoid_assoc_duplicate_keys(M.name, namecounts) + M.get_realname_string()
if(M.stat == DEAD && specify_dead_role)
if(isobserver(M))
@@ -325,7 +321,6 @@ Turf and target are separate in case you want to teleport some distance from a t
pois[avoid_assoc_duplicate_keys(A.name, namecounts)] = A
return pois
-
//Orders mobs by type then by name
/proc/sortmobs()
var/list/moblist = list()
@@ -1425,15 +1420,10 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
REMOVE_TRAIT(the_atom2,trait,source)
/proc/get_random_food()
- var/static/list/allowed_food = list()
-
- if(!LAZYLEN(allowed_food)) //it's static so we only ever do this once
- var/list/blocked = list(
- /obj/item/food/spaghetti,
- /obj/item/food/bread,
- /obj/item/food/breadslice,
- /obj/item/food/cake,
- /obj/item/food/cakeslice,
+ var/list/blocked = list(/obj/item/reagent_containers/food/snacks/store/bread,
+ /obj/item/reagent_containers/food/snacks/breadslice,
+ /obj/item/reagent_containers/food/snacks/store/cake,
+ /obj/item/reagent_containers/food/snacks/cakeslice,
/obj/item/reagent_containers/food/snacks/store,
/obj/item/reagent_containers/food/snacks/pie,
/obj/item/reagent_containers/food/snacks/kebab,
@@ -1445,21 +1435,15 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/reagent_containers/food/snacks/soup,
/obj/item/reagent_containers/food/snacks/grown,
/obj/item/reagent_containers/food/snacks/grown/mushroom,
- /obj/item/food/deepfryholder,
+ /obj/item/reagent_containers/food/snacks/deepfryholder,
/obj/item/reagent_containers/food/snacks/clothing,
/obj/item/reagent_containers/food/snacks/grown/shell, //base types
- /obj/item/food/bread,
+ /obj/item/reagent_containers/food/snacks/store/bread,
/obj/item/reagent_containers/food/snacks/grown/nettle
)
- blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
-
- var/list/unfiltered_allowed_food = subtypesof(/obj/item/food) - blocked
- for(var/obj/item/food/food as anything in unfiltered_allowed_food)
- if(!initial(food.icon_state)) //food with no icon_state should probably not be spawned
- continue
- allowed_food.Add(food)
+ blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
- return pick(allowed_food)
+ return pick(subtypesof(/obj/item/reagent_containers/food/snacks) - blocked)
/proc/get_random_drink()
var/list/blocked = list(/obj/item/reagent_containers/food/drinks/soda_cans,
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 532ed3f888d7..59f25efe9823 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -212,7 +212,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items
) = 1,
list(//drinks
/obj/item/reagent_containers/food/drinks/bottle/vodka = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/crosstalk = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1,
) = 1,
list(//sprayers
/obj/item/reagent_containers/spray = 1,
diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm
index fe657d56284d..888def7a7182 100644
--- a/code/_globalvars/lists/names.dm
+++ b/code/_globalvars/lists/names.dm
@@ -11,7 +11,6 @@ GLOBAL_LIST_INIT(first_names_female, world.file2list("strings/names/first_female
GLOBAL_LIST_INIT(last_names, world.file2list("strings/names/last.txt"))
GLOBAL_LIST_INIT(lizard_names_male, world.file2list("strings/names/lizard_male.txt"))
GLOBAL_LIST_INIT(lizard_names_female, world.file2list("strings/names/lizard_female.txt"))
-GLOBAL_LIST_INIT(kepori_names, world.file2list("strings/names/kepori_names.txt"))
GLOBAL_LIST_INIT(clown_names, world.file2list("strings/names/clown.txt"))
GLOBAL_LIST_INIT(mime_names, world.file2list("strings/names/mime.txt"))
GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt"))
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index d6c720380f46..3386e9952eeb 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -11,9 +11,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
-GLOBAL_VAR_INIT(total_merits_exchanged, 0)
-GLOBAL_VAR_INIT(hydrogen_stored, 0) // can be -/+, + meaning surplus
-
GLOBAL_LIST_EMPTY(powernets)
GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index a6f81d8ca4f1..993026c0d5e0 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -366,7 +366,7 @@
return
/atom/proc/CtrlShiftClick(mob/user)
- SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user)
+ SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT)
return
/*
diff --git a/code/datums/achievements/boss_achievements.dm b/code/datums/achievements/boss_achievements.dm
index 39b355318f0c..ca45d5939eec 100644
--- a/code/datums/achievements/boss_achievements.dm
+++ b/code/datums/achievements/boss_achievements.dm
@@ -2,10 +2,10 @@
category = "Bosses"
icon = "baseboss"
-/datum/award/achievement/boss/nest_exterminator
- name = "Nest Exterminator"
+/datum/award/achievement/boss/tendril_exterminator
+ name = "Tendril Exterminator"
desc = "Watch your step"
- database_id = BOSS_MEDAL_NEST
+ database_id = BOSS_MEDAL_TENDRIL
icon = "tendril"
/datum/award/achievement/boss/boss_killer
@@ -55,11 +55,23 @@
database_id = BOSS_MEDAL_LEGION
icon = "legion"
+/datum/award/achievement/boss/swarmer_beacon_kill
+ name = "Swarm Beacon Killer"
+ desc = "GET THEM OFF OF ME!"
+ database_id = BOSS_MEDAL_SWARMERS
+ icon = "swarmer"
+
/datum/award/achievement/boss/wendigo_kill
name = "Wendigo Killer"
desc = "You've now ruined years of mythical storytelling."
database_id = BOSS_MEDAL_WENDIGO
+/datum/award/achievement/boss/king_goat_kill
+ name = "King Goat Killer"
+ desc = "The king is dead, long live the king!"
+ database_id = BOSS_MEDAL_KINGGOAT
+ icon = "goatboss"
+
/datum/award/achievement/boss/blood_miner_crusher
name = "Blood-drunk Miner Crusher"
desc = "I guess he couldn't handle his drink that well."
@@ -100,7 +112,18 @@
desc = "We were many... now we are none."
database_id = BOSS_MEDAL_LEGION_CRUSHER
+/datum/award/achievement/boss/swarmer_beacon_crusher
+ name = "Swarm Beacon Crusher"
+ desc = "GET THEM OFF OF ME!"
+ database_id = BOSS_MEDAL_SWARMERS_CRUSHER
+
/datum/award/achievement/boss/wendigo_crusher
name = "Wendigo Crusher"
desc = "You've now ruined years of mythical storytelling."
database_id = BOSS_MEDAL_WENDIGO_CRUSHER
+
+/datum/award/achievement/boss/king_goat_crusher
+ name = "King Goat Crusher"
+ desc = "The king is dead, long live the king!"
+ database_id = BOSS_MEDAL_KINGGOAT_CRUSHER
+ icon = "goatboss"
diff --git a/code/datums/achievements/boss_scores.dm b/code/datums/achievements/boss_scores.dm
index c0135e6c68a1..7cf2fa886183 100644
--- a/code/datums/achievements/boss_scores.dm
+++ b/code/datums/achievements/boss_scores.dm
@@ -1,7 +1,7 @@
-/datum/award/score/nest_score
- name = "Nest Score"
+/datum/award/score/tendril_score
+ name = "Tendril Score"
desc = "Watch your step"
- database_id = NEST_CLEAR_SCORE
+ database_id = TENDRIL_CLEAR_SCORE
/datum/award/score/boss_score
name = "Bosses Killed"
@@ -43,6 +43,11 @@
desc = "You've killed HOW many?"
database_id = LEGION_SCORE
+/datum/award/score/swarmer_beacon_score
+ name = "Swarmer Beacons Killed"
+ desc = "You've killed HOW many?"
+ database_id = SWARMER_BEACON_SCORE
+
/datum/award/score/wendigo_score
name = "Wendigos Killed"
desc = "You've killed HOW many?"
diff --git a/code/datums/action.dm b/code/datums/action.dm
index cdca8729984f..de13fc002dde 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -86,10 +86,9 @@
if(owner)
UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
owner = null
- if(button)
- button.moved = FALSE //so the button appears in its normal position when given to another owner.
- button.locked = FALSE
- button.id = null
+ button.moved = FALSE //so the button appears in its normal position when given to another owner.
+ button.locked = FALSE
+ button.id = null
/datum/action/proc/Trigger()
if(!IsAvailable())
diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm
index 9c10c6f1fd7d..069d89f0e7e7 100644
--- a/code/datums/brain_damage/mild.dm
+++ b/code/datums/brain_damage/mild.dm
@@ -50,6 +50,8 @@
owner.derpspeech = min(owner.derpspeech + 5, 25)
if(prob(3))
owner.emote("drool")
+ else if(owner.stat == CONSCIOUS && prob(3))
+ owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"), forced = "brain damage")
..()
/datum/brain_trauma/mild/dumbness/on_lose()
diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm
deleted file mode 100644
index 01e3abedd80b..000000000000
--- a/code/datums/components/attachment.dm
+++ /dev/null
@@ -1,182 +0,0 @@
-/datum/component/attachment
- ///Slot the attachment goes on, also used in descriptions so should be player readable
- var/slot
- ///various yes no flags associated with attachments. See defines for these: [_DEFINES/guns.dm]
- var/attach_features_flags
- ///Unused so far, should probally handle it in the parent unless you have a specific reason
- var/list/valid_parent_types
- var/datum/callback/on_attach
- var/datum/callback/on_detach
- var/datum/callback/on_toggle
- ///Called on the parents preattack
- var/datum/callback/on_preattack
- ///Unused...Also a little broken..
- var/list/datum/action/actions
- ///Generated if the attachment can toggle, sends COMSIG_ATTACHMENT_TOGGLE
- var/datum/action/attachment/attachment_toggle_action
-
-/datum/component/attachment/Initialize(
- slot = ATTACHMENT_SLOT_RAIL,
- attach_features_flags = ATTACH_REMOVABLE_HAND,
- valid_parent_types = list(/obj/item/gun),
- datum/callback/on_attach = null,
- datum/callback/on_detach = null,
- datum/callback/on_toggle = null,
- datum/callback/on_preattack = null,
- list/signals = null
- )
-
- if(!isitem(parent))
- return COMPONENT_INCOMPATIBLE
-
- src.slot = slot
- src.attach_features_flags = attach_features_flags
- src.valid_parent_types = valid_parent_types
- src.on_attach = on_attach
- src.on_detach = on_detach
- src.on_toggle = on_toggle
- src.on_preattack = on_preattack
-
- ADD_TRAIT(parent, TRAIT_ATTACHABLE, "attachable")
- RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, PROC_REF(try_attach))
- RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach))
- RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE, PROC_REF(handle_examine))
- RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE_MORE, PROC_REF(handle_examine_more))
- if(attach_features_flags & ATTACH_TOGGLE)
- RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle))
- attachment_toggle_action = new /datum/action/attachment(parent)
- RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, PROC_REF(relay_pre_attack))
- RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, PROC_REF(update_overlays))
- RegisterSignal(parent, COMSIG_ATTACHMENT_GET_SLOT, PROC_REF(send_slot))
-
- for(var/signal in signals)
- RegisterSignal(parent, signal, signals[signal])
-
-/datum/component/attachment/Destroy(force, silent)
- REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable")
- if(actions && length(actions))
- var/obj/item/gun/parent = src.parent
- parent.actions -= actions
- QDEL_LIST(actions)
- qdel(attachment_toggle_action)
- return ..()
-
-/datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user)
- SIGNAL_HANDLER
- if(attach_features_flags & ATTACH_TOGGLE)
- INVOKE_ASYNC(src, PROC_REF(do_toggle), parent, holder, user)
- holder.update_icon()
- attachment_toggle_action.UpdateButtonIcon()
-
-/datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user)
- if(on_toggle)
- on_toggle.Invoke(holder, user)
- return TRUE
-
- parent.attack_self(user)
- return TRUE
-
-/datum/component/attachment/proc/update_overlays(obj/item/parent, list/overlays, list/offset)
- if(!(attach_features_flags & ATTACH_NO_SPRITE))
- overlays += mutable_appearance(parent.icon, "[parent.icon_state]-attached")
-
-/datum/component/attachment/proc/try_attach(obj/item/parent, obj/item/holder, mob/user, bypass_checks)
- SIGNAL_HANDLER
-
- if(!bypass_checks)
- if(!parent.Adjacent(user) || (length(valid_parent_types) && (holder.type in valid_parent_types)))
- return FALSE
-
- if(on_attach && !on_attach.Invoke(holder, user))
- return FALSE
-
- parent.forceMove(holder)
-
- if(attach_features_flags & ATTACH_TOGGLE)
- holder.actions += list(attachment_toggle_action)
- attachment_toggle_action.gun = holder
- attachment_toggle_action.Grant(user)
-
- return TRUE
-
-/datum/component/attachment/proc/try_detach(obj/item/parent, obj/item/holder, mob/user)
- SIGNAL_HANDLER
-
- if(!parent.Adjacent(user) || (valid_parent_types && (holder.type in valid_parent_types)))
- return FALSE
-
- if(on_attach && !on_detach.Invoke(holder, user))
- return FALSE
-
- if(attach_features_flags & ATTACH_TOGGLE)
- holder.actions -= list(attachment_toggle_action)
- attachment_toggle_action.gun = null
- attachment_toggle_action.Remove(user)
-
- if(user.can_put_in_hand(parent))
- user.put_in_hand(parent)
- return TRUE
-
- parent.forceMove(holder.drop_location())
- return TRUE
-
-/datum/component/attachment/proc/handle_examine(obj/item/parent, mob/user, list/examine_list)
- SIGNAL_HANDLER
-
-/datum/component/attachment/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list)
- SIGNAL_HANDLER
-
-/datum/component/attachment/proc/relay_pre_attack(obj/item/parent, obj/item/gun, atom/target_atom, mob/user, params)
- SIGNAL_HANDLER_DOES_SLEEP
-
- if(on_preattack)
- return on_preattack.Invoke(gun, target_atom, user, params)
-
-/datum/component/attachment/proc/send_slot(obj/item/parent)
- SIGNAL_HANDLER
- return attachment_slot_to_bflag(slot)
-
-/datum/action/attachment
- name = "Toggle Attachment"
- check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS
- button_icon_state = null
- ///Decides where we send our toggle signal for when pressed
- var/obj/item/gun/gun = null
-
-/datum/action/attachment/New(Target)
- ..()
- name = "Toggle [target.name]"
- button.name = name
- icon_icon = target.icon
- button_icon_state = target.icon_state
-
-/datum/action/attachment/Destroy()
- . = ..()
- gun = null
-
-/datum/action/attachment/Trigger()
- ..()
- SEND_SIGNAL(target, COMSIG_ATTACHMENT_TOGGLE, gun, owner)
-
-/datum/action/attachment/UpdateButtonIcon()
- icon_icon = target.icon
- button_icon_state = target.icon_state
- ..()
-
-//Copied from item action..
-/datum/action/attachment/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force)
- if(button_icon && button_icon_state)
- // If set, use the custom icon that we set instead
- // of the item appearence
- ..()
- else if((target && current_button.appearance_cache != target.appearance) || force) //replace with /ref comparison if this is not valid.
- var/obj/item/I = target
- var/old_layer = I.layer
- var/old_plane = I.plane
- I.layer = FLOAT_LAYER //AAAH
- I.plane = FLOAT_PLANE //^ what that guy said
- current_button.cut_overlays()
- current_button.add_overlay(I)
- I.layer = old_layer
- I.plane = old_plane
- current_button.appearance_cache = I.appearance
diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm
deleted file mode 100644
index 82968a17604b..000000000000
--- a/code/datums/components/attachment_holder.dm
+++ /dev/null
@@ -1,188 +0,0 @@
-/datum/component/attachment_holder
- dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
-
- ///List of things you can attach to the parent
- var/list/valid_types = null
- ///How many slots a parent can hold of any one slot
- var/list/slot_room = null
- ///Icon offsets, should match the sprite itself so just find the position where it should attach
- var/list/slot_offsets = null
- var/list/obj/item/attachments = list()
-
-/datum/component/attachment_holder/Initialize(
- list/slot_room = null,
- list/valid_types = null,
- list/slot_offsets = null,
- list/default_attachments = null
- )
-
- if(!isgun(parent))
- return COMPONENT_INCOMPATIBLE
- var/obj/item/gun/parent_gun = parent
-
- src.slot_room = slot_room
- src.valid_types = valid_types
- src.slot_offsets = slot_offsets
-
- RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(handle_attack))
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(handle_examine))
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, PROC_REF(handle_examine_more))
- RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(handle_qdel))
- RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(handle_item_pre_attack))
- RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, PROC_REF(handle_ctrl_shift_click))
- RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(handle_alt_click))
- RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays))
-
- if(length(default_attachments))
- for(var/attachment in default_attachments)
- var/obj/item/attachment/new_attachment = new attachment(parent_gun.loc)
- INVOKE_ASYNC(src, PROC_REF(do_attach), new_attachment, null, TRUE)
-
-/datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays)
- SIGNAL_HANDLER
-
- for(var/obj/item/attachment/attach as anything in attachments)
- var/slot = SEND_SIGNAL(attach, COMSIG_ATTACHMENT_GET_SLOT)
- slot = attachment_slot_from_bflag(slot)
- var/list/attach_overlays = list()
- SEND_SIGNAL(attach, COMSIG_ATTACHMENT_UPDATE_OVERLAY, attach_overlays)
- for(var/mutable_appearance/overlay as anything in attach_overlays)
- if(slot_offsets && slot_offsets[slot])
- var/matrix/overlay_matrix = new
- overlay_matrix.Translate(slot_offsets[slot]["x"] - attach.pixel_shift_x, slot_offsets[slot]["y"] - attach.pixel_shift_y)
- overlay.transform = overlay_matrix
- overlays += overlay
-
-/datum/component/attachment_holder/proc/handle_qdel()
- SIGNAL_HANDLER
- qdel(src)
-
-/datum/component/attachment_holder/Destroy(force, silent)
- QDEL_LIST(attachments)
- attachments = null
- return ..()
-
-/datum/component/attachment_holder/proc/attachments_to_list(only_toggles = FALSE)
- . = list()
- for(var/obj/item/attachment/attach as anything in attachments)
- if(attach.name in .)
- stack_trace("two attachments with same name; this shouldn't happen and will cause failures")
- continue
- if(only_toggles && !(attach.attach_features_flags & ATTACH_TOGGLE))
- continue
- .[attach.name] = attach
-
-/datum/component/attachment_holder/proc/handle_ctrl_shift_click(obj/item/parent, mob/user)
- SIGNAL_HANDLER
-
- INVOKE_ASYNC(src, PROC_REF(do_attachment_radial), parent, user)
-
-/datum/component/attachment_holder/proc/handle_alt_click(obj/item/parent, mob/user)
- SIGNAL_HANDLER
-
- INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, user)
-
-/datum/component/attachment_holder/proc/do_attachment_radial(obj/item/parent, mob/user)
- var/list/attachments_as_list = attachments_to_list(TRUE)
- var/selection = show_radial_menu(user, parent, attachments_as_list)
- var/obj/item/attach = attachments_as_list[selection]
- if(!attach)
- return
- SEND_SIGNAL(attach, COMSIG_ATTACHMENT_TOGGLE, parent, user)
-
-/datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list)
- if(length(attachments))
- examine_list += span_notice("It has [length(attachments)] attachment\s.")
- for(var/obj/item/attach as anything in attachments)
- SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list)
-
-/datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list)
- for(var/key in slot_room)
- if(slot_room[key])
- examine_list += span_notice("It has [slot_room[key]] slot\s free for [key] attachments.")
- if(length(attachments))
- examine_list += span_notice("It has the following attachments:")
- for(var/obj/item/attach as anything in attachments)
- examine_list += span_notice("\t- [attach.name]")
- if(length(valid_types))
- examine_list += span_notice("It can accept:")
- for(var/obj/attach_type as anything in valid_types)
- examine_list += span_notice("\t- [initial(attach_type.name)]")
- for(var/obj/item/attach as anything in attachments)
- SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE_MORE, user, examine_list)
-
-/datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user, bypass_checks)
- var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT)
- slot = attachment_slot_from_bflag(slot)
- if(!(attachment.type in valid_types))
- to_chat(user, span_notice("[attachment] is not a valid attachment for this [parent]!"))
- return
- if(!slot_room[slot])
- to_chat(user, span_notice("[parent] does not contain room for [attachment]!"))
- return
- slot_room[slot]--
- . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user, bypass_checks)
- if(.)
- attachments += attachment
- var/atom/parent = src.parent
- parent.update_icon()
-
-/datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user)
- var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT)
- slot = attachment_slot_from_bflag(slot)
- if(slot in slot_room)
- slot_room[slot]++
- . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_DETACH, parent, user)
- if(.)
- attachments -= attachment
- var/atom/parent = src.parent
- parent.update_icon()
-
-/datum/component/attachment_holder/proc/handle_detach(obj/item/parent, mob/user, obj/item/tool)
- var/list/tool_list = list()
- var/list/hand_list = list()
- for(var/obj/item/attachment/attach as anything in attachments)
- if(attach.attach_features_flags & ATTACH_REMOVABLE_TOOL)
- tool_list[attach.name] = attach
- if(attach.attach_features_flags & ATTACH_REMOVABLE_HAND)
- hand_list[attach.name] = attach
- if(tool)
- if(!length(tool_list))
- return
- var/selected = tgui_input_list(user, "Select Attachment", "Detach", tool_list)
- if(!parent.Adjacent(user) || !selected || !tool || !tool.use_tool(parent, user, 2 SECONDS * tool.toolspeed))
- return
- do_detach(tool_list[selected], user)
- else
- if(!length(hand_list))
- return
- var/selected = tgui_input_list(user, "Select Attachment", "Detach", hand_list)
- if(do_after(user, 2 SECONDS, parent))
- do_detach(hand_list[selected], user)
-
-
-/datum/component/attachment_holder/proc/handle_attack(obj/item/parent, obj/item/item, mob/user)
- SIGNAL_HANDLER
-
- if(!user.Adjacent(parent))
- return
-
- if(item.tool_behaviour == TOOL_CROWBAR && length(attachments))
- INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, user, item)
- return TRUE
-
- if(HAS_TRAIT(item, TRAIT_ATTACHABLE))
- INVOKE_ASYNC(src, PROC_REF(do_attach), item, user)
- return TRUE
-
- for(var/obj/item/attach as anything in attachments)
- if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_ATTACK, parent, item, user))
- parent.update_icon()
- return TRUE
-
-/datum/component/attachment_holder/proc/handle_item_pre_attack(obj/item/parent, atom/target_atom, mob/user, params)
- SIGNAL_HANDLER
-
- for(var/obj/item/attach as anything in attachments)
- if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target_atom, user, params))
- return TRUE
diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm
index 728a3bd44b86..f18002a05bd3 100644
--- a/code/datums/components/chasm.dm
+++ b/code/datums/components/chasm.dm
@@ -18,6 +18,8 @@
/obj/effect/hotspot,
/obj/effect/landmark,
/obj/effect/temp_visual,
+ /obj/effect/light_emitter/tendril,
+ /obj/effect/collapse,
/obj/effect/particle_effect/ion_trails,
/obj/effect/dummy/phased_mob,
/obj/effect/mapping_helpers,
diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm
index 95bbae56a904..ab7a2d4315d7 100644
--- a/code/datums/components/crafting/recipes.dm
+++ b/code/datums/components/crafting/recipes.dm
@@ -16,7 +16,6 @@
if(!(result in reqs))
blacklist += result
-
/**
* Run custom pre-craft checks for this recipe
*
diff --git a/code/datums/components/crafting/recipes/tribal.dm b/code/datums/components/crafting/recipes/tribal.dm
index c831b85d7878..83e5c03722bc 100644
--- a/code/datums/components/crafting/recipes/tribal.dm
+++ b/code/datums/components/crafting/recipes/tribal.dm
@@ -1,16 +1,18 @@
-/datum/crafting_recipe/bonearmlet
- name = "Bone Armlet"
- result = /obj/item/clothing/accessory/bonearmlet
+/datum/crafting_recipe/bonetalisman
+ name = "Bone Talisman"
+ result = /obj/item/clothing/accessory/talisman
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
-/datum/crafting_recipe/fangnecklace
- name = "Wolf Fang Necklace"
- result = /obj/item/clothing/neck/fangnecklace
- time = 20
- reqs = list(/obj/item/stack/sheet/sinew = 2,
+/datum/crafting_recipe/bonenecklace
+ name = "Hunter's Necklace"
+ result = /obj/item/clothing/accessory/wolftalisman
+ time = 35
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 3,
+ /obj/item/mob_trophy/wolf_ear = 2,
/obj/item/mob_trophy/fang = 1)
category = CAT_PRIMAL
diff --git a/code/datums/components/crafting/recipes/weapon.dm b/code/datums/components/crafting/recipes/weapon.dm
index c1dde04b3650..10f63bede5ce 100644
--- a/code/datums/components/crafting/recipes/weapon.dm
+++ b/code/datums/components/crafting/recipes/weapon.dm
@@ -125,10 +125,8 @@
name = "Pulse Slug Shell"
result = /obj/item/ammo_casing/shotgun/pulseslug
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor = 3,
- /obj/item/stock_parts/micro_laser = 1,
- /obj/item/stock_parts/cell = 1,
- /datum/reagent/lithium = 5)
+ /obj/item/stock_parts/capacitor/adv = 2,
+ /obj/item/stock_parts/micro_laser/ultra = 1)
tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
@@ -137,7 +135,7 @@
/datum/crafting_recipe/dragonsbreath
name = "Dragonsbreath Shell"
result = /obj/item/ammo_casing/shotgun/dragonsbreath
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 10)
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5)
tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
@@ -159,11 +157,8 @@
name = "Ion Scatter Shell"
result = /obj/item/ammo_casing/shotgun/ion
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/micro_laser = 2,
- /obj/item/stock_parts/capacitor = 2,
- /obj/item/stock_parts/scanning_module = 1,
- /datum/reagent/iron = 5,
- /datum/reagent/uranium = 5)
+ /obj/item/stock_parts/micro_laser/ultra = 1,
+ /obj/item/stock_parts/subspace/crystal = 1)
tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
@@ -184,10 +179,8 @@
name = "Scatter Laser Shell"
result = /obj/item/ammo_casing/shotgun/laserscatter
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor = 1,
- /obj/item/stock_parts/micro_laser = 3,
- /obj/item/stock_parts/cell = 1,
- /datum/reagent/lithium = 5)
+ /obj/item/stock_parts/capacitor/adv = 1,
+ /obj/item/stock_parts/micro_laser/high = 1)
tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm
new file mode 100644
index 000000000000..cf0199d05e18
--- /dev/null
+++ b/code/datums/components/edible.dm
@@ -0,0 +1,256 @@
+/*!
+
+This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items).
+These items take a specific time to eat, and can do most of the things our original food items could.
+
+Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else:
+ Components:
+ Drying component (jerky etc)
+ Customizable component (custom pizzas etc)
+ Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.)
+ Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents)
+
+ Misc:
+ Something for cakes (You can store things inside)
+
+*/
+/datum/component/edible
+ ///Amount of reagents taken per bite
+ var/bite_consumption = 2
+ ///Amount of bites taken so far
+ var/bitecount = 0
+ ///Flags for food
+ var/food_flags = NONE
+ ///Bitfield of the types of this food
+ var/foodtypes = NONE
+ ///Amount of seconds it takes to eat this food
+ var/eat_time = 30
+ ///Defines how much it lowers someones satiety (Need to eat, essentialy)
+ var/junkiness = 0
+ ///Message to send when eating
+ var/list/eatverbs
+ ///Callback to be ran for when you take a bite of something
+ var/datum/callback/after_eat
+ ///Last time we checked for food likes
+ var/last_check_time
+
+/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, datum/callback/after_eat)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal))
+ if(isitem(parent))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(UseFromHand))
+ else if(isturf(parent))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(TryToEatTurf))
+
+ src.bite_consumption = bite_consumption
+ src.food_flags = food_flags
+ src.foodtypes = foodtypes
+ src.eat_time = eat_time
+ src.eatverbs = eatverbs
+ src.junkiness = junkiness
+ src.after_eat = after_eat
+
+ var/atom/owner = parent
+
+ owner.create_reagents(volume, INJECTABLE)
+
+ if(initial_reagents)
+ for(var/rid in initial_reagents)
+ var/amount = initial_reagents[rid]
+ if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin))
+ owner.reagents.add_reagent(rid, amount, tastes.Copy())
+ else
+ owner.reagents.add_reagent(rid, amount)
+
+/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ if(!(food_flags & FOOD_IN_CONTAINER))
+ switch (bitecount)
+ if (0)
+ return
+ if(1)
+ examine_list += "[parent] was bitten by someone!"
+ if(2,3)
+ examine_list += "[parent] was bitten [bitecount] times!"
+ else
+ examine_list += "[parent] was bitten multiple times!"
+
+/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user)
+ SIGNAL_HANDLER
+
+ return TryToEat(M, user)
+
+/datum/component/edible/proc/TryToEatTurf(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ return TryToEat(user, user)
+
+///All the checks for the act of eating itself and
+/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder)
+
+ set waitfor = FALSE
+
+ var/atom/owner = parent
+
+ if(feeder.a_intent == INTENT_HARM)
+ return
+ if(!owner.reagents.total_volume)//Shouldn't be needed but it checks to see if it has anything left in it.
+ to_chat(feeder, "None of [owner] left, oh no!")
+ if(isturf(parent))
+ var/turf/T = parent
+ T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
+ else
+ qdel(parent)
+ return
+ if(!CanConsume(eater, feeder))
+ return
+ var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
+ for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
+ fullness += C.nutriment_factor * C.volume / C.metabolization_rate
+
+ . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose
+
+ if(eater == feeder)//If you're eating it yourself.
+ if(!do_after(feeder, eat_time, eater)) //Gotta pass the minimal eat time
+ return
+ var/eatverb = pick(eatverbs)
+ if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
+ to_chat(eater, "You don't feel like eating any more junk food at the moment!")
+ return
+ else if(fullness <= 50)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
+ else if(fullness > 50 && fullness < 150)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
+ else if(fullness > 150 && fullness < 500)
+ eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
+ else if(fullness > 500 && fullness < 600)
+ eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
+ else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
+ eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
+ return
+ else //If you're feeding it to someone else.
+ if(isbrain(eater))
+ to_chat(feeder, "[eater] doesn't seem to have a mouth!")
+ return
+ if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
+ eater.visible_message("[feeder] attempts to feed [eater] [parent].", \
+ "[feeder] attempts to feed you [parent].")
+ else
+ eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \
+ "[feeder] cannot force any more of [parent] down your throat!")
+ return
+ if(!do_after(feeder, target = eater)) //Wait 3 seconds before you can feed
+ return
+
+ log_combat(feeder, eater, "fed", owner.reagents.log_list())
+ eater.visible_message("[feeder] forces [eater] to eat [parent]!", \
+ "[feeder] forces you to eat [parent]!")
+
+ TakeBite(eater, feeder)
+
+///This function lets the eater take a bite and transfers the reagents to the eater.
+/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder)
+
+ var/atom/owner = parent
+
+ if(!owner?.reagents)
+ return FALSE
+ if(eater.satiety > -200)
+ eater.satiety -= junkiness
+ playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ if(owner.reagents.total_volume)
+ SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder)
+ var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
+ owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST)
+ bitecount++
+ On_Consume(eater)
+ checkLiked(fraction, eater)
+
+ //Invoke our after eat callback if it is valid
+ if(after_eat)
+ after_eat.Invoke(eater, feeder)
+
+ return TRUE
+
+///Checks whether or not the eater can actually consume the food
+/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder)
+ if(!iscarbon(eater))
+ return FALSE
+ var/mob/living/carbon/C = eater
+ var/covered = ""
+ if(C.is_mouth_covered(head_only = 1))
+ covered = "headgear"
+ else if(C.is_mouth_covered(mask_only = 1))
+ covered = "mask"
+ if(covered)
+ var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]"
+ to_chat(feeder, "You have to remove [who] [covered] first!")
+ return FALSE
+ return TRUE
+
+///Check foodtypes to see if we should send a moodlet
+/datum/component/edible/proc/checkLiked(fraction, mob/M)
+ if(last_check_time + 50 > world.time)
+ return FALSE
+ if(!ishuman(M))
+ return FALSE
+ var/mob/living/carbon/human/H = M
+ if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food)
+ to_chat(H, "You don't feel so good...")
+ H.adjust_disgust(25 + 30 * fraction)
+ else
+ if(foodtypes & H.dna.species.toxic_food)
+ to_chat(H,"What the hell was that thing?!")
+ H.adjust_disgust(25 + 30 * fraction)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
+ else if(foodtypes & H.dna.species.disliked_food)
+ to_chat(H,"That didn't taste very good...")
+ H.adjust_disgust(11 + 15 * fraction)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
+ else if(foodtypes & H.dna.species.liked_food)
+ to_chat(H,"I love this taste!")
+ H.adjust_disgust(-5 + -2.5 * fraction)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
+ if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
+ last_check_time = world.time
+
+///Delete the item when it is fully eaten
+/datum/component/edible/proc/On_Consume(mob/living/eater)
+
+ var/atom/owner = parent
+
+ if(!eater)
+ return
+ if(!owner.reagents.total_volume)
+ if(isturf(parent))
+ var/turf/T = parent
+ T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
+ else
+ qdel(parent)
+
+///Ability to feed food to puppers
+/datum/component/edible/proc/UseByAnimal(datum/source, mob/user)
+
+ SIGNAL_HANDLER
+
+
+ var/atom/owner = parent
+
+ if(!isdog(user))
+ return
+ var/mob/living/L = user
+ if(bitecount == 0 || prob(50))
+ L.manual_emote("nibbles away at \the [parent]")
+ bitecount++
+ . = COMPONENT_ITEM_NO_ATTACK
+ L.taste(owner.reagents) // why should carbons get all the fun?
+ if(bitecount >= 5)
+ var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was")
+ if(sattisfaction_text)
+ L.manual_emote(sattisfaction_text)
+ qdel(parent)
diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm
deleted file mode 100644
index cde77f969911..000000000000
--- a/code/datums/components/food/edible.dm
+++ /dev/null
@@ -1,494 +0,0 @@
-/*!
-
-This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items).
-These items take a specific time to eat, and can do most of the things our original food items could.
-
-Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else:
- Components:
- Drying component (jerky etc)
- Customizable component (custom pizzas etc)
- Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.)
- Microwavability component
- Frying component
-
- Misc:
- Something for cakes (You can store things inside)
-
-*/
-/datum/component/edible
- dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
- ///Amount of reagents taken per bite
- var/bite_consumption = 2
- ///Amount of bites taken so far
- var/bitecount = 0
- ///Flags for food
- var/food_flags = NONE
- ///Bitfield of the types of this food
- var/foodtypes = NONE
- ///Amount of seconds it takes to eat this food
- var/eat_time = 30
- ///Defines how much it lowers someones satiety (Need to eat, essentialy)
- var/junkiness = 0
- ///Message to send when eating
- var/list/eatverbs
- ///Callback to be ran before you eat something, so you can check if someone *can* eat it.
- var/datum/callback/pre_eat
- ///Callback to be ran before composting something, in case you don't want a piece of food to be compostable for some reason.
- var/datum/callback/on_compost
- ///Callback to be ran for when you take a bite of something
- var/datum/callback/after_eat
- ///Callback to be ran for when you finish eating something
- var/datum/callback/on_consume
- ///Last time we checked for food likes
- var/last_check_time
- ///The initial reagents of this food when it is made
- var/list/initial_reagents
- ///The initial volume of the foods reagents
- var/volume
- ///The flavortext for taste
- var/list/tastes
- ///The type of atom this creates when the object is microwaved.
- var/microwaved_type
-
- //TEMP VAR, filling is nonfunctional because newfood isnt customizable yet
- var/filling_color
-
-/datum/component/edible/Initialize(list/initial_reagents,
- food_flags = NONE,
- foodtypes = NONE,
- volume = 50,
- eat_time = 10,
- list/tastes,
- list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
- bite_consumption = 2,
- microwaved_type,
- junkiness,
- filling_color = null, //Temp var
- datum/callback/pre_eat,
- datum/callback/on_compost,
- datum/callback/after_eat,
- datum/callback/on_consume
-)
- if(!isatom(parent))
- return COMPONENT_INCOMPATIBLE
-
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
- RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(use_by_animal))
- RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(on_craft))
- RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(on_processed))
- RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_COOKED, PROC_REF(on_microwave_cooked))
- RegisterSignal(parent, COMSIG_EDIBLE_ON_COMPOST, PROC_REF(compost))
-
- if(isitem(parent))
- RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(use_from_hand))
- RegisterSignal(parent, COMSIG_ITEM_FRIED, PROC_REF(on_fried))
- RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_ACT, PROC_REF(on_microwaved))
-
- var/obj/item/item = parent
- if (!item.grind_results)
- item.grind_results = list() //If this doesn't already exist, add it as an empty list. This is needed for the grinder to accept it.
-
- src.bite_consumption = bite_consumption
- src.food_flags = food_flags
- src.foodtypes = foodtypes
- src.eat_time = eat_time
- src.eatverbs = string_list(eatverbs)
- src.junkiness = junkiness
- src.pre_eat = pre_eat
- src.on_compost = on_compost
- src.after_eat = after_eat
- src.on_consume = on_consume
- src.initial_reagents = string_assoc_list(initial_reagents)
- src.tastes = string_assoc_list(tastes)
- src.microwaved_type = microwaved_type
-
- var/atom/owner = parent
-
- owner.create_reagents(volume, INJECTABLE)
-
- for(var/rid in initial_reagents)
- var/amount = initial_reagents[rid]
- if(length(tastes) && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin))
- owner.reagents.add_reagent(rid, amount, tastes.Copy())
- else
- owner.reagents.add_reagent(rid, amount)
-
-/datum/component/edible/InheritComponent(datum/component/C,
- i_am_original,
- list/initial_reagents,
- food_flags = NONE,
- foodtypes = NONE,
- volume = 50,
- eat_time = 30,
- list/tastes,
- list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
- bite_consumption = 2,
- filling_color = null, //Temp var
- datum/callback/pre_eat,
- datum/callback/on_compost,
- datum/callback/after_eat,
- datum/callback/on_consume
- )
-
- . = ..()
- src.bite_consumption = bite_consumption
- src.food_flags = food_flags
- src.foodtypes = foodtypes
- src.eat_time = eat_time
- src.eatverbs = eatverbs
- src.junkiness = junkiness
- src.pre_eat = pre_eat
- src.on_compost = on_compost
- src.after_eat = after_eat
- src.on_consume = on_consume
-
-/datum/component/edible/Destroy(force, silent)
- QDEL_NULL(pre_eat)
- QDEL_NULL(on_compost)
- QDEL_NULL(after_eat)
- QDEL_NULL(on_consume)
- return ..()
-
-/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list)
- SIGNAL_HANDLER
-
- if(!(food_flags & FOOD_IN_CONTAINER))
- switch (bitecount)
- if (0)
- return
- if(1)
- examine_list += "[parent] was bitten by someone!"
- if(2,3)
- examine_list += "[parent] was bitten [bitecount] times!"
- else
- examine_list += "[parent] was bitten multiple times!"
-
-/datum/component/edible/proc/use_from_hand(obj/item/source, mob/living/M, mob/living/user)
- SIGNAL_HANDLER
-
- return TryToEat(M, user)
-
-/datum/component/edible/proc/on_fried(fry_object)
- SIGNAL_HANDLER
- var/atom/our_atom = parent
- our_atom.reagents.trans_to(fry_object, our_atom.reagents.total_volume)
- qdel(our_atom)
- return COMSIG_FRYING_HANDLED
-
-///Called when food is created through processing (Usually this means it was sliced). We use this to pass the OG items reagents.
-/datum/component/edible/proc/on_processed(datum/source, atom/original_atom, list/chosen_processing_option)
- SIGNAL_HANDLER
-
- if(!original_atom.reagents)
- return
-
- var/atom/this_food = parent
- var/reagents_for_slice = chosen_processing_option[TOOL_PROCESSING_AMOUNT]
-
- this_food.create_reagents(volume) //Make sure we have a reagent container
-
- original_atom.reagents.trans_to(this_food, reagents_for_slice)
-
- if(original_atom.name != initial(original_atom.name))
- this_food.name = "slice of [original_atom.name]"
- if(original_atom.desc != initial(original_atom.desc))
- this_food.desc = "[original_atom.desc]"
-
-///Called when food is crafted through a crafting recipe datum.
-/datum/component/edible/proc/on_craft(datum/source, list/parts_list, datum/crafting_recipe/food/recipe)
- SIGNAL_HANDLER
-
- var/atom/this_food = parent
-
- this_food.reagents.clear_reagents()
-
- for(var/obj/item/crafted_part in this_food.contents)
- crafted_part.reagents?.trans_to(this_food.reagents, crafted_part.reagents.maximum_volume, CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER)
-
- var/list/objects_to_delete = list()
-
- // Remove all non recipe objects from the contents
- for(var/content_object in this_food.contents)
- for(var/recipe_object in recipe.real_parts)
- if(istype(content_object, recipe_object))
- continue
- objects_to_delete += content_object
-
- QDEL_LIST(objects_to_delete)
-
- for(var/r_id in initial_reagents)
- var/amount = initial_reagents[r_id] * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
- if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
- this_food.reagents.add_reagent(r_id, amount, tastes)
- else
- this_food.reagents.add_reagent(r_id, amount)
-
- SSblackbox.record_feedback("tally", "food_made", 1, type)
-
-/datum/component/edible/proc/on_microwaved(datum/source, obj/machinery/microwave/used_microwave)
- SIGNAL_HANDLER
-
- var/turf/parent_turf = get_turf(parent)
-
- if(!microwaved_type)
- new /obj/item/reagent_containers/food/snacks/badrecipe(parent_turf)
- qdel(parent)
- return
-
- var/obj/item/result
-
- result = new microwaved_type(parent_turf)
-
- var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1
-
- SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, parent, efficiency)
-
- SSblackbox.record_feedback("tally", "food_made", 1, result.type)
- qdel(parent)
- return COMPONENT_SUCCESFUL_MICROWAVE
-
-///Corrects the reagents on the newly cooked food
-/datum/component/edible/proc/on_microwave_cooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
- SIGNAL_HANDLER
-
- var/atom/this_food = parent
-
- this_food.reagents.clear_reagents()
-
- source_item.reagents?.trans_to(this_food, source_item.reagents.total_volume)
-
- for(var/r_id in initial_reagents)
- var/amount = initial_reagents[r_id] * cooking_efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
- if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
- this_food.reagents.add_reagent(r_id, amount, tastes)
- else
- this_food.reagents.add_reagent(r_id, amount)
-
-///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles
-/datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder)
- if(QDELETED(owner)|| !(IS_EDIBLE(owner)))
- return TRUE
- if(owner.reagents.total_volume)
- return FALSE
- return TRUE
-
-/// Normal time to forcefeed someone something
-#define EAT_TIME_FORCE_FEED (3 SECONDS)
-
-///All the checks for the act of eating itself and
-/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder)
-
- set waitfor = FALSE // We might end up sleeping here, so we don't want to hold up anything
-
- var/atom/owner = parent
-
- if(feeder.a_intent == INTENT_HARM)
- return
-
- . = COMPONENT_CANCEL_ATTACK_CHAIN //Point of no return I suppose
-
- if(IsFoodGone(owner, feeder))
- return
-
- if(!CanConsume(eater, feeder))
- return
- var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
-
- var/time_to_eat = (eater = feeder) ? eat_time : EAT_TIME_FORCE_FEED
-
- if(eater == feeder)//If you're eating it yourself.
- if(eat_time && !do_after(feeder, time_to_eat, eater, timed_action_flags = food_flags & FOOD_FINGER_FOOD ? IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE : NONE)) //Gotta pass the minimal eat time
- return
- if(IsFoodGone(owner, feeder))
- return
- var/eatverb = pick(eatverbs)
-
- if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
- to_chat(eater, "You don't feel like eating any more junk food at the moment!")
- return
- else if(fullness <= 50)
- eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
- else if(fullness > 50 && fullness < 150)
- eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
- else if(fullness > 150 && fullness < 500)
- eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
- else if(fullness > 500 && fullness < 600)
- eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
- else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
- eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
- return
-
-
-
-
-
- else //If you're feeding it to someone else.
- if(isbrain(eater))
- to_chat(feeder, "[eater] doesn't seem to have a mouth!")
- return
- if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
- eater.visible_message(
- "[feeder] attempts to feed [eater] [parent].", \
- "[feeder] attempts to feed you [parent]."
- )
- if(eater.is_blind())
- to_chat(eater, "You feel someone trying to feed you something!")
- else
- eater.visible_message(
- "[feeder] cannot force any more of [parent] down [eater]'s throat!", \
- "[feeder] cannot force any more of [parent] down your throat!"
- )
- if(eater.is_blind())
- to_chat(eater, "You're too full to eat what's being fed to you!")
- return
- if(!do_after(feeder, delay = time_to_eat, target = eater)) //Wait 3 seconds before you can feed
- return
- if(IsFoodGone(owner, feeder))
- return
- log_combat(feeder, eater, "fed", owner.reagents.log_list())
- eater.visible_message(
- "[feeder] forces [eater] to eat [parent]!", \
- "[feeder] forces you to eat [parent]!"
- )
- if(eater.is_blind())
- to_chat(eater, "You're forced to eat something!")
-
- TakeBite(eater, feeder)
-
- //If we're not force-feeding, try take another bite
- if(eater == feeder && eat_time)
- INVOKE_ASYNC(src, PROC_REF(TryToEat), eater, feeder)
-
-#undef EAT_TIME_FORCE_FEED
-
-///This function lets the eater take a bite and transfers the reagents to the eater.
-/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder)
-
- var/atom/owner = parent
-
- if(!owner?.reagents)
- return FALSE
- if(eater.satiety > -200)
- eater.satiety -= junkiness
- playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
- if(!owner.reagents.total_volume)
- return
- SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder, bitecount, bite_consumption)
- var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
- owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST)
- bitecount++
- check_liked(fraction, eater)
- if(!owner.reagents.total_volume)
- on_consume(eater, feeder)
-
- //Invoke our after eat callback if it is valid
- if(after_eat)
- after_eat.Invoke(eater, feeder, bitecount)
-
- return TRUE
-
-///Checks if we can compost something, and handles it
-/datum/component/edible/proc/compost(mob/living/user)
- SIGNAL_HANDLER
- if(on_compost && !on_compost.Invoke(user))
- return COMPONENT_EDIBLE_BLOCK_COMPOST
-
-///Checks whether or not the eater can actually consume the food
-/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder)
- if(!iscarbon(eater))
- return FALSE
- if(pre_eat && !pre_eat.Invoke(eater, feeder))
- return FALSE
- var/mob/living/carbon/C = eater
- var/covered = ""
- if(C.is_mouth_covered(head_only = 1))
- covered = "headgear"
- else if(C.is_mouth_covered(mask_only = 1))
- covered = "mask"
- if(covered)
- var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]"
- to_chat(feeder, "You have to remove [who] [covered] first!")
- return FALSE
- return TRUE
-
-///Check foodtypes to see if we should send a moodlet
-/datum/component/edible/proc/check_liked(fraction, mob/eater)
- if(last_check_time + 50 > world.time)
- return FALSE
- if(!ishuman(eater))
- return FALSE
- var/mob/living/carbon/human/human_eater = eater
- if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
- if(HAS_TRAIT(human_eater, TRAIT_AGEUSIA))
- if(foodtypes & human_eater.dna.species.toxic_food)
- to_chat(human_eater, "You don't feel so good...")
- human_eater.adjust_disgust(25 + 30 * fraction)
- else
- if(foodtypes & human_eater.dna.species.toxic_food)
- to_chat(human_eater,"What the hell was that thing?!")
- human_eater.adjust_disgust(25 + 30 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
- else if(foodtypes & human_eater.dna.species.disliked_food)
- to_chat(human_eater,"That didn't taste very good...")
- human_eater.adjust_disgust(11 + 15 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
- else if(foodtypes & human_eater.dna.species.liked_food)
- to_chat(human_eater,"I love this taste!")
- human_eater.adjust_disgust(-5 + -2.5 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
- last_check_time = world.time
-
- /* Should shiptest ever want to move taste to tongues as Beestation & later TGstation did, rather than on species
- var/obj/item/organ/tongue/tongue = human_eater.getorganslot(ORGAN_SLOT_TONGUE)
- if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
- if(HAS_TRAIT(human_eater, TRAIT_AGEUSIA))
- if(foodtypes & tongue.toxic_food)
- to_chat(human_eater, "You don't feel so good...")
- human_eater.adjust_disgust(25 + 30 * fraction)
- else
- if(foodtypes & tongue.toxic_food)
- to_chat(human_eater,"What the hell was that thing?!")
- human_eater.adjust_disgust(25 + 30 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
- else if(foodtypes & tongue.disliked_food)
- to_chat(human_eater,"That didn't taste very good...")
- human_eater.adjust_disgust(11 + 15 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
- else if(foodtypes & tongue.liked_food)
- to_chat(human_eater,"I love this taste!")
- human_eater.adjust_disgust(-5 + -2.5 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
- last_check_time = world.time
- */
-
-///Delete the item when it is fully eaten
-/datum/component/edible/proc/on_consume(mob/living/eater, mob/living/feeder)
- SEND_SIGNAL(parent, COMSIG_FOOD_CONSUMED, eater, feeder)
-
- on_consume?.Invoke(eater, feeder)
-
- if(isturf(parent))
- var/turf/T = parent
- T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
- else
- qdel(parent)
-
-///Ability to feed food to puppers
-/datum/component/edible/proc/use_by_animal(datum/source, mob/user)
- SIGNAL_HANDLER
- var/atom/owner = parent
-
- if(!isdog(user))
- return
- var/mob/living/L = user
- if(bitecount == 0 || prob(50))
- L.manual_emote("nibbles away at \the [parent].")
- bitecount++
- . = COMPONENT_CANCEL_ATTACK_CHAIN
- L.taste(owner.reagents) // why should carbons get all the fun?
- if(bitecount >= 5)
- var/satisfaction_text = pick("burps from enjoyment.", "yaps for more!", "woofs twice.", "looks at the area where \the [parent] was.")
- L.manual_emote(satisfaction_text)
- qdel(parent)
diff --git a/code/datums/components/food/food_storage.dm b/code/datums/components/food/food_storage.dm
deleted file mode 100644
index 259ef4a8b6c6..000000000000
--- a/code/datums/components/food/food_storage.dm
+++ /dev/null
@@ -1,204 +0,0 @@
-/// --Food storage component--
-/// This component lets you slide one item into large foods, such as bread, cheese wheels, or cakes.
-/// Consuming food storages with an item inside can cause unique interactions, such as eating glass shards.
-
-/datum/component/food_storage
- /// Reference to what we have in our food.
- var/obj/item/stored_item
- /// The amount of volume the food has on creation - Used for probabilities
- var/initial_volume = 10
- /// Minimum size items that can be inserted
- var/minimum_weight_class = WEIGHT_CLASS_SMALL
- /// What are the odds we bite into the stored item?
- var/bad_chance_of_discovery = 0
- /// What are the odds we see the stored item before we bite it?
- var/good_chance_of_discovery = 100
- /// The stored item was found out somehow.
- var/discovered = FALSE
-
-/datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100)
-
- RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(try_inserting_item))
- RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(try_removing_item))
- RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage))
-
- var/atom/food = parent
- initial_volume = food.reagents.total_volume
-
- minimum_weight_class = _minimum_weight_class
- bad_chance_of_discovery = _bad_chance
- good_chance_of_discovery = _good_chance
-
-/datum/component/food_storage/Destroy(force, silent)
- if(stored_item)
- stored_item.forceMove(stored_item.drop_location())
- stored_item.dropped()
- stored_item = null
- . = ..()
-
-/** Begins the process of inserted an item.
- *
- * Clicking on the food storage with an item will begin a do_after, which if successful inserts the item.
- *
- * Arguments
- * inserted_item - the item being placed into the food
- * user - the person inserting the item
- */
-/datum/component/food_storage/proc/try_inserting_item(datum/source, obj/item/inserted_item, mob/user, params)
- SIGNAL_HANDLER
-
- // No matryoshka-ing food storage
- if(istype(inserted_item, /obj/item/storage) || IS_EDIBLE(inserted_item))
- return
-
- //Harm intent will bypass inserting for injecting food with syringes and such
- if(user.a_intent == INTENT_HARM)
- return
-
- if(inserted_item.w_class > minimum_weight_class)
- to_chat(user, "\The [inserted_item.name] won't fit in \the [parent].")
- return
-
- if(!QDELETED(stored_item))
- to_chat(user, "There's something in \the [parent].")
- return
-
- if(HAS_TRAIT(inserted_item, TRAIT_NODROP))
- to_chat(user, "\the [inserted_item] is stuck to your hand, you can't put into \the [parent]!")
- return
-
- user.visible_message("[user.name] begins inserting [inserted_item.name] into \the [parent].", \
- "You start to insert the [inserted_item.name] into \the [parent].")
-
- INVOKE_ASYNC(src, PROC_REF(insert_item), inserted_item, user)
- return COMPONENT_CANCEL_ATTACK_CHAIN
-
-/** Begins the process of attempting to remove the stored item.
- *
- * Clicking on food storage on grab intent will begin a do_after, which if successful removes the stored_item.
- *
- * Arguments
- * user - the person removing the item.
- */
-/datum/component/food_storage/proc/try_removing_item(datum/source, mob/user)
- SIGNAL_HANDLER
-
- var/atom/food = parent
-
- if(user.a_intent != INTENT_GRAB)
- return
-
- if(QDELETED(stored_item))
- return
-
- if(!food.can_interact(user))
- return
-
- user.visible_message("[user.name] begins tearing at \the [parent].", \
- "You start to rip into \the [parent].")
-
- INVOKE_ASYNC(src, PROC_REF(begin_remove_item), user)
- return COMPONENT_CANCEL_ATTACK_CHAIN
-
-/** Inserts the item into the food, after a do_after.
- *
- * Arguments
- * inserted_item - The item being inserted.
- * user - the person inserting the item.
- */
-/datum/component/food_storage/proc/insert_item(obj/item/inserted_item, mob/user)
- if(do_after(user, 1.5 SECONDS, target = parent))
- var/atom/food = parent
- to_chat(user, "You slip [inserted_item.name] inside \the [parent].")
- inserted_item.forceMove(food)
- user.log_message("[key_name(user)] inserted [inserted_item] into [parent] at [AREACOORD(user)]", LOG_ATTACK)
- food.add_fingerprint(user)
- inserted_item.add_fingerprint(user)
-
- stored_item = inserted_item
-
-/** Removes the item from the food, after a do_after.
- *
- * Arguments
- * user - person removing the item.
- */
-/datum/component/food_storage/proc/begin_remove_item(mob/user)
- if(do_after(user, 10 SECONDS, target = parent))
- remove_item(user)
-
-/**
- * Removes the stored item, putting it in user's hands or on the ground, then updates the reference.
- */
-/datum/component/food_storage/proc/remove_item(mob/user)
- if(user.put_in_hands(stored_item))
- user.visible_message("[user.name] slowly pulls [stored_item.name] out of \the [parent].", \
- "You slowly pull [stored_item.name] out of \the [parent].")
- else
- stored_item.dropped()
- stored_item.visible_message("[stored_item.name] falls out of \the [parent].")
-
- update_stored_item()
-
-/** Checks for stored items when the food is eaten.
- *
- * If the food is eaten while an item is stored in it, calculates the odds that the item will be found.
- * Then, if the item is found before being bitten, the item is removed.
- * If the item is found by biting into it, calls on_accidental_consumption on the stored item.
- * Afterwards, removes the item from the food if it was discovered.
- *
- * Arguments
- * target - person doing the eating (can be the same as user)
- * user - person causing the eating to happen
- * bitecount - how many times the current food has been bitten
- * bitesize - how large bties are for this food
- */
-/datum/component/food_storage/proc/consume_food_storage(datum/source, mob/living/target, mob/living/user, bitecount, bitesize)
- SIGNAL_HANDLER
-
- if(QDELETED(stored_item)) //if the stored item was deleted/null...
- if(!update_stored_item()) //check if there's a replacement item
- return
-
- /// Chance of biting the held item = amount of bites / (intitial reagents / reagents per bite) * 100
- bad_chance_of_discovery = (bitecount / (initial_volume / bitesize))*100
- /// Chance of finding the held item = bad chance - 50
- good_chance_of_discovery = bad_chance_of_discovery - 50
-
- if(prob(good_chance_of_discovery)) //finding the item, without biting it
- discovered = TRUE
- to_chat(target, "It feels like there's something in \the [parent]...!")
-
- else if(prob(bad_chance_of_discovery)) //finding the item, BY biting it
- user.log_message("[key_name(user)] just fed [key_name(target)] a/an [stored_item] which was hidden in [parent] at [AREACOORD(target)]", LOG_ATTACK)
- discovered = stored_item.on_accidental_consumption(target, user, parent)
- update_stored_item() //make sure if the item was changed, the reference changes as well
-
- if(!QDELETED(stored_item) && discovered)
- INVOKE_ASYNC(src, PROC_REF(remove_item), user)
-
-/** Updates the reference of the stored item.
- *
- * Checks the food's contents for if an alternate item was placed into the food.
- * If there is an alternate item, updates the reference to the new item.
- * If there isn't, updates the reference to null.
- *
- * Returns FALSE if the ref is nulled, or TRUE is another item replaced it.
- */
-/datum/component/food_storage/proc/update_stored_item()
- var/atom/food = parent
- if(!food?.contents.len) //if there's no items in the food or food is deleted somehow
- stored_item = null
- return FALSE
-
- for(var/obj/item/i in food.contents) //search the food's contents for a replacement item
- if(IS_EDIBLE(i))
- continue
- if(QDELETED(i))
- continue
-
- stored_item = i //we found something to replace it
- return TRUE
-
- //if there's nothing else in the food, or we found nothing valid
- stored_item = null
- return FALSE
diff --git a/code/modules/mob_spawner/spawner_componet.dm b/code/datums/components/spawner.dm
similarity index 99%
rename from code/modules/mob_spawner/spawner_componet.dm
rename to code/datums/components/spawner.dm
index 8a904a5504c4..aab5bb6ea08a 100644
--- a/code/modules/mob_spawner/spawner_componet.dm
+++ b/code/datums/components/spawner.dm
@@ -14,6 +14,7 @@
var/wave_timer
var/current_timerid
+
/datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs, _spawn_sound, _spawn_distance_min, _spawn_distance_max, _wave_length, _wave_downtime)
if(_spawn_time)
spawn_time=_spawn_time
diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm
index 32a74c843b01..ce224d44e4e5 100644
--- a/code/datums/components/storage/concrete/pockets.dm
+++ b/code/datums/components/storage/concrete/pockets.dm
@@ -143,7 +143,7 @@
original_parent = parent
. = ..()
can_hold = typecacheof(list(
- /obj/item/gun/ballistic/automatic/pistol/syndicate,
+ /obj/item/gun/ballistic/automatic/pistol,
/obj/item/gun/ballistic/revolver,
/obj/item/gun/energy/e_gun/mini,
/obj/item/gun/energy/disabler,
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 89831dafab72..5724d4327bee 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -258,7 +258,7 @@
return
var/datum/progressbar/progress = new(M, len, I.loc)
var/list/rejections = list()
- while(do_after(M, 10, parent, TRUE, FALSE, CALLBACK(src, PROC_REF(handle_mass_pickup), things, I.loc, rejections, progress)))
+ while(do_after(M, 10, TRUE, parent, FALSE, CALLBACK(src, PROC_REF(handle_mass_pickup), things, I.loc, rejections, progress)))
stoplag(1)
progress.end_progress()
to_chat(M, "You put everything you could [insert_preposition] [parent].")
diff --git a/code/datums/diseases/legionvirus.dm b/code/datums/diseases/legionvirus.dm
index a6e1bdadcdd2..22144a7b2a14 100644
--- a/code/datums/diseases/legionvirus.dm
+++ b/code/datums/diseases/legionvirus.dm
@@ -1,29 +1,28 @@
-/datum/disease/transformation/legionvirus //Diseases are a quick way to exposit a bunch of information onto players, most of the effects here are handled by the legion skull organ from /mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
- name = "Legion Infection"
+/datum/disease/transformation/legionvirus
+ name = "Soulus Saturation"
max_stages = 5
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
- cure_text = "Surgically removing the skull from the patient's chest; applications of spaceacillin or synaptizine can delay onset of the infection."
- agent = "Legion skull"
+ cure_text = "System Cleaner"
+ cures = list(/datum/reagent/medicine/system_cleaner)
+ agent = "Soulus Dust"
viable_mobtypes = list(/mob/living/carbon/human)
visibility_flags = 0
- stage_prob = 0 // WOOOOOO SNOWFLAKE!!!!!!! WOOOOOO!!!!
- desc = "If left untreated, the skull will slowly overtake its host's body, eventually growing into a legion."
+ stage_prob = 5
+ cure_chance = 20
+ desc = "If left untreated, this disease will cause the infected to transform into a legion."
severity = DISEASE_SEVERITY_HARMFUL
- disease_flags = NONE
- visibility_flags = HIDDEN_PANDEMIC
+ disease_flags = CURABLE
bypasses_immunity = TRUE
- stage1 = list(span_notice("You feel a dull pain in your chest."))
- stage2 = list(span_notice("Your head begins to ache."))
- stage3 = list(span_notice("Something moves underneath your skin."))
- stage4 = list(span_warning("You feel something pressing against your skin!"))
- stage5 = list(span_warning("Your skin begins to tear apart-!"))
+ stage1 = list("Your joints itch.")
+ stage2 = list("Your head begins to ache.")
+ stage3 = list("Ash begins to flake off your skin.")
+ stage4 = list("You feel like your head is splitting in two!")
+ stage5 = list("You feel something growing inside your chest!")
new_form = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
/datum/disease/transformation/legionvirus/do_disease_transformation(mob/living/H)
- if(stage5)
- to_chat(affected_mob, pick(stage5))
- H.visible_message(span_warning("[H] suddenly collapses, a pallid grey mass bursting from their body!"))
+ H.visible_message("[H] transforms into a legion!")
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
@@ -33,3 +32,4 @@
H.adjustBruteLoss(1000)
L.stored_mob = H
H.forceMove(L)
+ qdel(src)
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 1fc6d09cb2cb..6d3959753a9e 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -226,3 +226,43 @@
new_form = /mob/living/simple_animal/hostile/morph
infectable_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD //magic!
transformed_antag_datum = /datum/antagonist/morph
+
+/datum/disease/transformation/gondola
+ name = "Gondola Transformation"
+ cure_text = "Condensed Capsaicin, ingested or injected." //getting pepper sprayed doesn't help
+ cures = list(/datum/reagent/consumable/condensedcapsaicin) //beats the hippie crap right out of your system
+ cure_chance = 80
+ stage_prob = 5
+ agent = "Tranquility"
+ desc = "Consuming the flesh of a Gondola comes at a terrible price."
+ severity = DISEASE_SEVERITY_BIOHAZARD
+ visibility_flags = 0
+ stage1 = list("You seem a little lighter in your step.")
+ stage2 = list("You catch yourself smiling for no reason.")
+ stage3 = list("A cruel sense of calm overcomes you.", "You can't feel your arms!", "You let go of the urge to hurt clowns.")
+ stage4 = list("You can't feel your arms. It does not bother you anymore.", "You forgive the clown for hurting you.")
+ stage5 = list("You have become a Gondola.")
+ new_form = /mob/living/simple_animal/pet/gondola
+
+/datum/disease/transformation/gondola/stage_act()
+ ..()
+ switch(stage)
+ if(2)
+ if (prob(5))
+ affected_mob.emote("smile")
+ if (prob(20))
+ affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
+ if(3)
+ if (prob(5))
+ affected_mob.emote("smile")
+ if (prob(20))
+ affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
+ if(4)
+ if (prob(5))
+ affected_mob.emote("smile")
+ if (prob(20))
+ affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
+ if (prob(2))
+ to_chat(affected_mob, "You let go of what you were holding.")
+ var/obj/item/I = affected_mob.get_active_held_item()
+ affected_mob.dropItemToGround(I)
diff --git a/code/datums/elements/food/dunkable.dm b/code/datums/elements/dunkable.dm
similarity index 99%
rename from code/datums/elements/food/dunkable.dm
rename to code/datums/elements/dunkable.dm
index 80661d5c4ac0..1eaee1d8cbbc 100644
--- a/code/datums/elements/food/dunkable.dm
+++ b/code/datums/elements/dunkable.dm
@@ -17,6 +17,8 @@
UnregisterSignal(target, COMSIG_ITEM_AFTERATTACK)
/datum/element/dunkable/proc/get_dunked(datum/source, atom/target, mob/user, proximity_flag)
+ SIGNAL_HANDLER
+
if(!proximity_flag) // if the user is not adjacent to the container
return
var/obj/item/reagent_containers/container = target // the container we're trying to dunk into
diff --git a/code/datums/elements/food/edible.dm b/code/datums/elements/food/edible.dm
deleted file mode 100644
index a06a5ec28b79..000000000000
--- a/code/datums/elements/food/edible.dm
+++ /dev/null
@@ -1,471 +0,0 @@
-/*!
-
-This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items).
-These items take a specific time to eat, and can do most of the things our original food items could.
-
-Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else:
- Components:
- Drying component (jerky etc)
- Customizable component (custom pizzas etc)
- Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.)
- Microwavability component
- Frying component
-
- Misc:
- Something for cakes (You can store things inside)
-
-*/
-/datum/component/edible
- dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
- ///Amount of reagents taken per bite
- var/bite_consumption = 2
- ///Amount of bites taken so far
- var/bitecount = 0
- ///Flags for food
- var/food_flags = NONE
- ///Bitfield of the types of this food
- var/foodtypes = NONE
- ///Amount of seconds it takes to eat this food
- var/eat_time = 30
- ///Defines how much it lowers someones satiety (Need to eat, essentialy)
- var/junkiness = 0
- ///Message to send when eating
- var/list/eatverbs
- ///Callback to be ran before you eat something, so you can check if someone *can* eat it.
- var/datum/callback/pre_eat
- ///Callback to be ran before composting something, in case you don't want a piece of food to be compostable for some reason.
- var/datum/callback/on_compost
- ///Callback to be ran for when you take a bite of something
- var/datum/callback/after_eat
- ///Callback to be ran for when you finish eating something
- var/datum/callback/on_consume
- ///Last time we checked for food likes
- var/last_check_time
- ///The initial reagents of this food when it is made
- var/list/initial_reagents
- ///The initial volume of the foods reagents
- var/volume
- ///The flavortext for taste
- var/list/tastes
- ///The type of atom this creates when the object is microwaved.
- var/microwaved_type
-
- //TEMP VAR. To be phased out
- var/filling_color = null
-
-
-/datum/component/edible/Initialize(list/initial_reagents,
- food_flags = NONE,
- foodtypes = NONE,
- volume = 50,
- eat_time = 10,
- list/tastes,
- list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
- bite_consumption = 2,
- microwaved_type,
- junkiness,
- datum/callback/pre_eat,
- datum/callback/on_compost,
- datum/callback/after_eat,
- datum/callback/on_consume
-)
- if(!isatom(parent))
- return COMPONENT_INCOMPATIBLE
-
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
- RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(use_by_animal))
- RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(on_craft))
- RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(on_processed))
- RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_COOKED, PROC_REF(on_microwave_cooked))
- RegisterSignal(parent, COMSIG_EDIBLE_ON_COMPOST, PROC_REF(compost))
-
- if(isitem(parent))
- RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(use_from_hand))
- RegisterSignal(parent, COMSIG_ITEM_FRIED, PROC_REF(on_fried))
- RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_ACT, PROC_REF(on_microwaved))
-
- var/obj/item/item = parent
- if (!item.grind_results)
- item.grind_results = list() //If this doesn't already exist, add it as an empty list. This is needed for the grinder to accept it.
-
- src.bite_consumption = bite_consumption
- src.food_flags = food_flags
- src.foodtypes = foodtypes
- src.initial_reagents = initial_reagents
- src.tastes = tastes
- src.eat_time = eat_time
- src.eatverbs = string_list(eatverbs)
- src.junkiness = junkiness
- src.pre_eat = pre_eat
- src.on_compost = on_compost
- src.after_eat = after_eat
- src.on_consume = on_consume
- src.initial_reagents = string_assoc_list(initial_reagents)
- src.tastes = string_assoc_list(tastes)
- src.microwaved_type = microwaved_type
-
- var/atom/owner = parent
-
- owner.create_reagents(volume, INJECTABLE)
-
- for(var/rid in initial_reagents)
- var/amount = initial_reagents[rid]
- if(length(tastes) && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin))
- owner.reagents.add_reagent(rid, amount, tastes.Copy())
- else
- owner.reagents.add_reagent(rid, amount)
-
-/datum/component/edible/InheritComponent(datum/component/C,
- i_am_original,
- list/initial_reagents,
- food_flags = NONE,
- foodtypes = NONE,
- volume = 50,
- eat_time = 30,
- list/tastes,
- list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
- bite_consumption = 2,
- datum/callback/pre_eat,
- datum/callback/on_compost,
- datum/callback/after_eat,
- datum/callback/on_consume
- )
-
- . = ..()
- src.bite_consumption = bite_consumption
- src.food_flags = food_flags
- src.foodtypes = foodtypes
- src.eat_time = eat_time
- src.eatverbs = eatverbs
- src.junkiness = junkiness
- src.pre_eat = pre_eat
- src.on_compost = on_compost
- src.after_eat = after_eat
- src.on_consume = on_consume
-
-/datum/component/edible/Destroy(force, silent)
- QDEL_NULL(pre_eat)
- QDEL_NULL(on_compost)
- QDEL_NULL(after_eat)
- QDEL_NULL(on_consume)
- return ..()
-
-/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list)
- SIGNAL_HANDLER
-
- if(!(food_flags & FOOD_IN_CONTAINER))
- switch (bitecount)
- if (0)
- return
- if(1)
- examine_list += "[parent] was bitten by someone!"
- if(2,3)
- examine_list += "[parent] was bitten [bitecount] times!"
- else
- examine_list += "[parent] was bitten multiple times!"
-
-/datum/component/edible/proc/use_from_hand(obj/item/source, mob/living/M, mob/living/user)
- SIGNAL_HANDLER
-
- return TryToEat(M, user)
-
-/datum/component/edible/proc/on_fried(fry_object)
- SIGNAL_HANDLER
- var/atom/our_atom = parent
- our_atom.reagents.trans_to(fry_object, our_atom.reagents.total_volume)
- qdel(our_atom)
- return COMSIG_FRYING_HANDLED
-
-///Called when food is created through processing (Usually this means it was sliced). We use this to pass the OG items reagents.
-/datum/component/edible/proc/on_processed(datum/source, atom/original_atom, list/chosen_processing_option)
- SIGNAL_HANDLER
-
- if(!original_atom.reagents)
- return
-
- var/atom/this_food = parent
- var/reagents_for_slice = chosen_processing_option[TOOL_PROCESSING_AMOUNT]
-
- this_food.create_reagents(volume) //Make sure we have a reagent container
-
- original_atom.reagents.trans_to(this_food, reagents_for_slice)
-
- if(original_atom.name != initial(original_atom.name))
- this_food.name = "slice of [original_atom.name]"
- if(original_atom.desc != initial(original_atom.desc))
- this_food.desc = "[original_atom.desc]"
-
-///Called when food is crafted through a crafting recipe datum.
-/datum/component/edible/proc/on_craft(datum/source, list/parts_list, datum/crafting_recipe/food/recipe)
- SIGNAL_HANDLER
-
- var/atom/this_food = parent
-
- this_food.reagents.clear_reagents()
-
- for(var/obj/item/crafted_part in this_food.contents)
- crafted_part.reagents?.trans_to(this_food.reagents, crafted_part.reagents.maximum_volume, CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER)
-
- var/list/objects_to_delete = list()
-
- // Remove all non recipe objects from the contents
- for(var/content_object in this_food.contents)
- for(var/recipe_object in recipe.real_parts)
- if(istype(content_object, recipe_object))
- continue
- objects_to_delete += content_object
-
- QDEL_LIST(objects_to_delete)
-
- for(var/r_id in initial_reagents)
- var/amount = initial_reagents[r_id] * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
- if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
- this_food.reagents.add_reagent(r_id, amount, tastes)
- else
- this_food.reagents.add_reagent(r_id, amount)
-
- SSblackbox.record_feedback("tally", "food_made", 1, type)
-
-/datum/component/edible/proc/on_microwaved(datum/source, obj/machinery/microwave/used_microwave)
- SIGNAL_HANDLER
-
- var/turf/parent_turf = get_turf(parent)
-
- if(!microwaved_type)
- new /obj/item/reagent_containers/food/snacks/badrecipe(parent_turf)
- qdel(src)
- return
-
-
- var/obj/item/result
-
- result = new microwaved_type(parent_turf)
-
- var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1
-
- SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, parent, efficiency)
-
- SSblackbox.record_feedback("tally", "food_made", 1, result.type)
-
-///Corrects the reagents on the newly cooked food
-/datum/component/edible/proc/on_microwave_cooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
- SIGNAL_HANDLER
-
- var/atom/this_food = parent
-
- this_food.reagents.clear_reagents()
-
- source_item.reagents?.trans_to(this_food, source_item.reagents.total_volume)
-
- for(var/r_id in initial_reagents)
- var/amount = initial_reagents[r_id] * cooking_efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
- if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
- this_food.reagents.add_reagent(r_id, amount, tastes)
- else
- this_food.reagents.add_reagent(r_id, amount)
-
-///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles
-/datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder)
- if(QDELETED(owner)|| !(IS_EDIBLE(owner)))
- return TRUE
- if(owner.reagents.total_volume)
- return FALSE
- return TRUE
-
-/// Normal time to forcefeed someone something
-#define EAT_TIME_FORCE_FEED (3 SECONDS)
-
-///All the checks for the act of eating itself and
-/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder)
-
- set waitfor = FALSE // We might end up sleeping here, so we don't want to hold up anything
-
- var/atom/owner = parent
-
- if(feeder.a_intent == INTENT_HARM)
- return
-
- . = COMPONENT_CANCEL_ATTACK_CHAIN //Point of no return I suppose
-
- if(IsFoodGone(owner, feeder))
- return
-
- if(!CanConsume(eater, feeder))
- return
- var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
-
- var/time_to_eat = (eater = feeder) ? eat_time : EAT_TIME_FORCE_FEED
-
- if(eater == feeder)//If you're eating it yourself.
- if(eat_time && !do_after(feeder, time_to_eat, eater, timed_action_flags = food_flags & FOOD_FINGER_FOOD ? IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE : NONE)) //Gotta pass the minimal eat time
- return
- if(IsFoodGone(owner, feeder))
- return
- var/eatverb = pick(eatverbs)
-
- if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
- to_chat(eater, "You don't feel like eating any more junk food at the moment!")
- return
- else if(fullness <= 50)
- eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
- else if(fullness > 50 && fullness < 150)
- eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
- else if(fullness > 150 && fullness < 500)
- eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
- else if(fullness > 500 && fullness < 600)
- eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
- else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
- eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
- return
-
-
-
-
-
- else //If you're feeding it to someone else.
- if(isbrain(eater))
- to_chat(feeder, "[eater] doesn't seem to have a mouth!")
- return
- if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
- eater.visible_message(
- "[feeder] attempts to feed [eater] [parent].", \
- "[feeder] attempts to feed you [parent]."
- )
- if(eater.is_blind())
- to_chat(eater, "You feel someone trying to feed you something!")
- else
- eater.visible_message(
- "[feeder] cannot force any more of [parent] down [eater]'s throat!", \
- "[feeder] cannot force any more of [parent] down your throat!"
- )
- if(eater.is_blind())
- to_chat(eater, "You're too full to eat what's being fed to you!")
- return
- if(!do_after(feeder, delay = time_to_eat, target = eater)) //Wait 3 seconds before you can feed
- return
- if(IsFoodGone(owner, feeder))
- return
- log_combat(feeder, eater, "fed", owner.reagents.log_list())
- eater.visible_message(
- "[feeder] forces [eater] to eat [parent]!", \
- "[feeder] forces you to eat [parent]!"
- )
- if(eater.is_blind())
- to_chat(eater, "You're forced to eat something!")
-
- TakeBite(eater, feeder)
-
- //If we're not force-feeding, try take another bite
- if(eater == feeder && eat_time)
- INVOKE_ASYNC(src, PROC_REF(TryToEat), eater, feeder)
-
-#undef EAT_TIME_FORCE_FEED
-
-///This function lets the eater take a bite and transfers the reagents to the eater.
-/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder)
-
- var/atom/owner = parent
-
- if(!owner?.reagents)
- return FALSE
- if(eater.satiety > -200)
- eater.satiety -= junkiness
- playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
- if(!owner.reagents.total_volume)
- return
- SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder, bitecount, bite_consumption)
- var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
- owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST)
- bitecount++
- check_liked(fraction, eater)
- if(!owner.reagents.total_volume)
- on_consume(eater, feeder)
-
- //Invoke our after eat callback if it is valid
- if(after_eat)
- after_eat.Invoke(eater, feeder, bitecount)
-
- return TRUE
-
-///Checks if we can compost something, and handles it
-/datum/component/edible/proc/compost(mob/living/user)
- SIGNAL_HANDLER
- if(on_compost && !on_compost.Invoke(user))
- return COMPONENT_EDIBLE_BLOCK_COMPOST
-
-///Checks whether or not the eater can actually consume the food
-/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder)
- if(!iscarbon(eater))
- return FALSE
- if(pre_eat && !pre_eat.Invoke(eater, feeder))
- return FALSE
- var/mob/living/carbon/C = eater
- var/covered = ""
- if(C.is_mouth_covered(head_only = 1))
- covered = "headgear"
- else if(C.is_mouth_covered(mask_only = 1))
- covered = "mask"
- if(covered)
- var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]"
- to_chat(feeder, "You have to remove [who] [covered] first!")
- return FALSE
- return TRUE
-
-///Check foodtypes to see if we should send a moodlet
-/datum/component/edible/proc/check_liked(fraction, mob/eater)
- if(last_check_time + 50 > world.time)
- return FALSE
- if(!ishuman(eater))
- return FALSE
- var/mob/living/carbon/human/human_eater = eater
- var/obj/item/organ/tongue/tongue = human_eater.getorganslot(ORGAN_SLOT_TONGUE)
- if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
- if(HAS_TRAIT(human_eater, TRAIT_AGEUSIA))
- if(foodtypes & tongue.toxic_food)
- to_chat(human_eater, "You don't feel so good...")
- human_eater.adjust_disgust(25 + 30 * fraction)
- else
- if(foodtypes & tongue.toxic_food)
- to_chat(human_eater,"What the hell was that thing?!")
- human_eater.adjust_disgust(25 + 30 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
- else if(foodtypes & tongue.disliked_food)
- to_chat(human_eater,"That didn't taste very good...")
- human_eater.adjust_disgust(11 + 15 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
- else if(foodtypes & tongue.liked_food)
- to_chat(human_eater,"I love this taste!")
- human_eater.adjust_disgust(-5 + -2.5 * fraction)
- SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
- last_check_time = world.time
-
-///Delete the item when it is fully eaten
-/datum/component/edible/proc/on_consume(mob/living/eater, mob/living/feeder)
- SEND_SIGNAL(parent, COMSIG_FOOD_CONSUMED, eater, feeder)
-
- on_consume?.Invoke(eater, feeder)
-
- if(isturf(parent))
- var/turf/T = parent
- T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
- else
- qdel(parent)
-
-///Ability to feed food to puppers
-/datum/component/edible/proc/use_by_animal(datum/source, mob/user)
- SIGNAL_HANDLER
- var/atom/owner = parent
-
- if(!isdog(user))
- return
- var/mob/living/L = user
- if(bitecount == 0 || prob(50))
- L.manual_emote("nibbles away at \the [parent].")
- bitecount++
- . = COMPONENT_CANCEL_ATTACK_CHAIN
- L.taste(owner.reagents) // why should carbons get all the fun?
- if(bitecount >= 5)
- var/satisfaction_text = pick("burps from enjoyment.", "yaps for more!", "woofs twice.", "looks at the area where \the [parent] was.")
- L.manual_emote(satisfaction_text)
- qdel(parent)
diff --git a/code/datums/elements/food/food_trash.dm b/code/datums/elements/food/food_trash.dm
deleted file mode 100644
index 6c484c414a07..000000000000
--- a/code/datums/elements/food/food_trash.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-// If an item has the food_trash element it will drop an item when it is consumed.
-/datum/element/food_trash
- element_flags = ELEMENT_BESPOKE
- id_arg_index = 2
- /// The type of trash that is spawned by this element
- var/trash
- ///Flags of the trash element that change its behavior UNUSED UNTIL PART 2
- //var/flags
- ///Generate trash proc path
- var/generate_trash_procpath
-
-/datum/element/food_trash/Attach(datum/target, atom/trash, flags, generate_trash_proc)
- . = ..()
- if(!isatom(target))
- return ELEMENT_INCOMPATIBLE
- src.trash = trash
- //src.flags = flags
- RegisterSignal(target, COMSIG_FOOD_CONSUMED, PROC_REF(generate_trash))
- if(!generate_trash_procpath && generate_trash_proc)
- generate_trash_procpath = generate_trash_proc
-
-/datum/element/food_trash/Detach(datum/target)
- . = ..()
- UnregisterSignal(target, COMSIG_FOOD_CONSUMED)
-
-/datum/element/food_trash/proc/generate_trash(datum/source, mob/living/eater, mob/living/feeder)
- SIGNAL_HANDLER
-
- ///cringy signal_handler shouldnt be needed if you dont want to return but oh well
- INVOKE_ASYNC(src, PROC_REF(async_generate_trash), source)
-
-/datum/element/food_trash/proc/async_generate_trash(datum/source)
- var/atom/edible_object = source
-
- var/obj/item/trash_item = generate_trash_procpath ? call(source, generate_trash_procpath)() : new trash(edible_object.drop_location())
-
- if(isliving(edible_object.loc))
- var/mob/living/food_holding_mob = edible_object.loc
- food_holding_mob.dropItemToGround(edible_object)
- food_holding_mob.put_in_hands(trash_item)
diff --git a/code/datums/elements/food/processable.dm b/code/datums/elements/food/processable.dm
deleted file mode 100644
index 503e5169c877..000000000000
--- a/code/datums/elements/food/processable.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-// If an item has the processable item, it can be processed into another item with a specific tool. This adds generic behavior for those actions to make it easier to set-up generically.
-/datum/element/processable
- element_flags = ELEMENT_BESPOKE
- id_arg_index = 2
- ///The type of atom this creates when the processing recipe is used.
- var/result_atom_type
- ///The tool behaviour for this processing recipe
- var/tool_behaviour
- ///Time to process the atom
- var/time_to_process
- ///Amount of the resulting actor this will create
- var/amount_created
- ///Whether or not the atom being processed has to be on a table or tray to process it
- var/table_required
-
-/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 20, table_required = FALSE)
- . = ..()
- if(!isatom(target))
- return ELEMENT_INCOMPATIBLE
-
- src.tool_behaviour = tool_behaviour
- src.amount_created = amount_created
- src.time_to_process = time_to_process
- src.result_atom_type = result_atom_type
- src.table_required = table_required
-
- RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(tool_behaviour), PROC_REF(try_process))
-
-/datum/element/processable/Detach(datum/target)
- . = ..()
- UnregisterSignal(target, COMSIG_ATOM_TOOL_ACT(tool_behaviour))
-
-/datum/element/processable/proc/try_process(datum/source, mob/living/user, obj/item/I, list/mutable_recipes)
- SIGNAL_HANDLER
-
- if(table_required)
- var/obj/item/found_item = source
- var/found_location = found_item.loc
- var/found_turf = isturf(found_location)
- var/found_table = locate(/obj/structure/table) in found_location
- var/found_tray = locate(/obj/item/storage/bag/tray) in found_location
- if(!found_turf && !istype(found_location, /obj/item/storage/bag/tray) || found_turf && !(found_table || found_tray))
- to_chat(user, "You cannot make that here! You need a table or at least a tray.")
- return
-
- mutable_recipes += list(list(TOOL_PROCESSING_RESULT = result_atom_type, TOOL_PROCESSING_AMOUNT = amount_created, TOOL_PROCESSING_TIME = time_to_process))
- return COMPONENT_NO_AFTERATTACK
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index 0c5227e41074..ff11057704c4 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -257,16 +257,10 @@
/datum/ert/frontier/assault
leader_role = /datum/antagonist/ert/frontier/leader
- roles = list(/datum/antagonist/ert/frontier/better, /datum/antagonist/ert/frontier/medic, /datum/antagonist/ert/frontier/engineer)
+ roles = list(/datum/antagonist/ert/frontier, /datum/antagonist/ert/frontier/medic, /datum/antagonist/ert/frontier/engineer)
rename_team = "Assault Frontiersmen Team"
polldesc = "a well armed squad of pirates"
-/datum/ert/frontier/unarmed //use for finer control of pirate's armaments
- leader_role = /datum/antagonist/ert/frontier/leader/unnarmed
- roles = list(/datum/antagonist/ert/frontier/unnarmed)
- rename_team = "Unnarmed Frontiersmen Team"
- polldesc = "a custom squad of pirates"
-
/datum/ert/independent
teamsize = 3
opendoors = FALSE
diff --git a/code/datums/mapgen/planetary/AsteroidGenerator.dm b/code/datums/mapgen/planetary/AsteroidGenerator.dm
index dc5c27ac79e7..737194b5ee28 100644
--- a/code/datums/mapgen/planetary/AsteroidGenerator.dm
+++ b/code/datums/mapgen/planetary/AsteroidGenerator.dm
@@ -111,8 +111,10 @@
)
feature_spawn_list = list(
- /obj/structure/spawner/burrow/asteroid = 3,
/obj/structure/geyser/random = 1,
+ /obj/structure/spawner/mining/goliath = 1,
+ /obj/structure/spawner/mining = 1,
+ /obj/structure/spawner/mining/hivelord = 1,
/obj/structure/vein/asteroid = 5,
/obj/structure/vein/classtwo/asteroid = 10,
/obj/structure/vein/classthree/asteroid = 5
@@ -159,7 +161,7 @@
feature_spawn_list = list(
/obj/structure/geyser/random = 5,
- /obj/structure/spawner/carp = 5,
+ /obj/structure/spawner/mining/carp = 5,
/obj/structure/vein/asteroid = 10,
/obj/structure/vein/classtwo/asteroid = 15,
/obj/structure/vein/classthree/asteroid = 12
diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm
index 077065c8e44e..45ae4a7120cc 100644
--- a/code/datums/mapgen/planetary/JungleGenerator.dm
+++ b/code/datums/mapgen/planetary/JungleGenerator.dm
@@ -180,7 +180,7 @@
feature_spawn_chance = 0.5
feature_spawn_list = list(
/obj/item/pickaxe/rusted = 1,
- /obj/structure/spawner/burrow/jungle_planet = 1,
+ /obj/structure/spawner/ice_moon = 1,
/obj/effect/spawner/lootdrop/anomaly/jungle = 1
)
diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm
index bca54d019397..ef66cca1103f 100644
--- a/code/datums/mapgen/planetary/LavaGenerator.dm
+++ b/code/datums/mapgen/planetary/LavaGenerator.dm
@@ -120,7 +120,9 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/crystal = 1,
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/forgotten = 1,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/crystal = 1,
- /obj/structure/spawner/burrow/lava_planet = 10
+ /obj/structure/spawner/lavaland/low_threat = 8,
+ /obj/structure/spawner/lavaland/medium_threat = 3,
+ /obj/structure/spawner/lavaland/high_threat = 1,
)
/datum/biome/lavaland/forest
@@ -240,7 +242,10 @@
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30,
/mob/living/simple_animal/hostile/asteroid/goldgrub = 10,
- /obj/structure/spawner/burrow/lava_planet = 10
+ /obj/structure/spawner/lavaland/low_threat = 8,
+ /obj/structure/spawner/lavaland/medium_threat = 3,
+ /obj/structure/spawner/lavaland/high_threat = 2,
+ /obj/structure/spawner/lavaland/extreme_threat = 1
)
flora_spawn_chance = 1
flora_spawn_list = list(
diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm
index 30349a2ea53b..c675c87714f5 100644
--- a/code/datums/mapgen/planetary/RockGenerator.dm
+++ b/code/datums/mapgen/planetary/RockGenerator.dm
@@ -160,8 +160,8 @@
/obj/structure/vein/classtwo = 2,
/obj/structure/elite_tumor = 1,
/obj/structure/vein/classthree = 1,
- /obj/structure/spawner/burrow/rock_plant = 4,
/obj/effect/spawner/minefield = 1,
+ /obj/structure/spawner/ice_moon/rockplanet = 4,
/obj/effect/spawner/lootdrop/anomaly/rock/cave = 1,
)
mob_spawn_chance = 6
diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm
index 1431ab53c6b9..91fad1430a47 100644
--- a/code/datums/mapgen/planetary/SandGenerator.dm
+++ b/code/datums/mapgen/planetary/SandGenerator.dm
@@ -217,7 +217,9 @@
/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30,
/mob/living/simple_animal/hostile/asteroid/goldgrub = 20,
- /obj/structure/spawner/burrow/sand_planet = 25
+ /obj/structure/spawner/lavaland/sand_world/low_threat = 14,
+ /obj/structure/spawner/lavaland/sand_world/medium_threat = 8,
+ /obj/structure/spawner/lavaland/sand_world/high_threat = 2,
)
/datum/biome/cave/sand/volcanic
diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm
index 7fddcd176c66..8489cbb970ba 100644
--- a/code/datums/mapgen/planetary/SnowGenerator.dm
+++ b/code/datums/mapgen/planetary/SnowGenerator.dm
@@ -102,7 +102,8 @@
mob_spawn_chance = 1
mob_spawn_list = list(
/mob/living/simple_animal/hostile/asteroid/wolf/random = 30,
- /obj/structure/spawner/burrow/ice_planet = 4,
+ /obj/structure/spawner/ice_moon = 2,
+ /obj/structure/spawner/ice_moon/polarbear = 2,
/mob/living/simple_animal/hostile/asteroid/polarbear/random = 30,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50,
/mob/living/simple_animal/hostile/asteroid/goldgrub = 10,
@@ -114,7 +115,9 @@
feature_spawn_list = list(
/obj/effect/spawner/lootdrop/anomaly/ice = 12,
/obj/effect/spawner/lootdrop/anomaly/big = 1,
- /obj/structure/spawner/burrow/ice_planet = 80,
+ /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 25,
+ /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50,
+ /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 13,
/obj/structure/vein/ice = 25,
/obj/effect/spawner/minefield = 2,
/obj/structure/vein/ice/classtwo = 50,
@@ -168,7 +171,8 @@
)
feature_spawn_chance = 0.1
feature_spawn_list = list(
- /obj/structure/spawner/burrow/ice_planet = 4,
+ /obj/structure/spawner/ice_moon = 2,
+ /obj/structure/spawner/ice_moon/polarbear = 2,
/obj/structure/statue/snow/snowman = 3,
/obj/structure/statue/snow/snowlegion = 1,
/obj/structure/vein/ice = 3,
@@ -177,7 +181,8 @@
)
mob_spawn_list = list(
/mob/living/simple_animal/hostile/asteroid/wolf/random = 30,
- /obj/structure/spawner/burrow/ice_planet = 2,
+ /obj/structure/spawner/ice_moon = 2,
+ /obj/structure/spawner/ice_moon/polarbear = 2,
/mob/living/simple_animal/hostile/asteroid/polarbear/random = 30,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50,
/mob/living/simple_animal/hostile/asteroid/goldgrub = 10,
@@ -214,7 +219,10 @@
feature_spawn_list = list(
/obj/effect/spawner/lootdrop/anomaly/ice = 100,
/obj/effect/spawner/lootdrop/anomaly/big = 1,
- /obj/structure/spawner/burrow/ice_planet/hard = 600,
+ /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 200,
+ /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 400,
+ /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 40,
+ /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 1,
/obj/structure/vein/ice = 300,
/obj/structure/vein/ice/classtwo = 500,
/obj/structure/vein/ice/classthree = 50,
@@ -256,7 +264,8 @@
mob_spawn_chance = 2
mob_spawn_list = list(
/mob/living/simple_animal/hostile/asteroid/wolf/random = 30,
- /obj/structure/spawner/burrow/ice_planet = 4,
+ /obj/structure/spawner/ice_moon = 2,
+ /obj/structure/spawner/ice_moon/polarbear = 2,
/mob/living/simple_animal/hostile/asteroid/polarbear/random = 30,
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50,
/mob/living/simple_animal/hostile/asteroid/goldgrub = 10,
@@ -266,8 +275,12 @@
)
feature_spawn_chance = 0.2
feature_spawn_list = list(
- /obj/structure/spawner/burrow/ice_planet = 60,
- /obj/structure/spawner/burrow/ice_planet = 40,
+ /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 20,
+ /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 40,
+ /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 5,
+ /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 1,
+ /obj/structure/spawner/ice_moon = 20,
+ /obj/structure/spawner/ice_moon/polarbear = 20,
/obj/effect/spawner/lootdrop/anomaly/ice/cave = 10,
/obj/structure/vein/ice = 30,
/obj/structure/vein/ice/classtwo = 50,
diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm
index 9b100412a391..c6e1244be129 100644
--- a/code/datums/mapgen/planetary/WasteGenerator.dm
+++ b/code/datums/mapgen/planetary/WasteGenerator.dm
@@ -263,7 +263,10 @@
/mob/living/simple_animal/bot/secbot/ed209/rockplanet = 3,
/mob/living/simple_animal/hostile/abandoned_minebot = 15,
/mob/living/simple_animal/bot/floorbot/rockplanet = 15,
- /obj/structure/spawner/hivebot = 35
+ /obj/structure/spawner/wasteplanet/hivebot/low_threat = 20,
+ /obj/structure/spawner/wasteplanet/hivebot/medium_threat = 10,
+ /obj/structure/spawner/wasteplanet/hivebot/high_threat = 5,
+ /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2
)
/datum/biome/waste/metal/rust
@@ -418,7 +421,10 @@
/mob/living/simple_animal/bot/secbot/ed209/rockplanet = 3,
/mob/living/simple_animal/hostile/abandoned_minebot = 15,
/mob/living/simple_animal/bot/floorbot/rockplanet = 15,
- /obj/structure/spawner/hivebot = 20
+ /obj/structure/spawner/wasteplanet/hivebot/low_threat = 20,
+ /obj/structure/spawner/wasteplanet/hivebot/medium_threat = 10,
+ /obj/structure/spawner/wasteplanet/hivebot/high_threat = 5,
+ /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2
)
/datum/biome/cave/waste/metal/hivebot
@@ -442,11 +448,15 @@
mob_spawn_list = list( //Whoops! All hivebots!
/mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 80,
/mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged = 50,
- /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 50
+ /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 50,
+
)
mob_spawn_chance = 30
feature_spawn_list = list(
- /obj/structure/spawner/hivebot = 1,
+ /obj/structure/spawner/wasteplanet/hivebot/low_threat = 20,
+ /obj/structure/spawner/wasteplanet/hivebot/medium_threat = 10,
+ /obj/structure/spawner/wasteplanet/hivebot/high_threat = 5,
+ /obj/structure/spawner/wasteplanet/hivebot/extreme_threat = 2,
/obj/effect/spawner/minefield/manhack = 2
)
feature_spawn_chance = 2 //hivebot biomes should have their dongles
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index 1b05f7d7ef95..4f505cb2a3e7 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -79,16 +79,6 @@ Simple datum which is instanced once per type and is used for every object of sa
/atom/proc/mat_update_desc(/datum/material/mat)
return
-
-/**
- * This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption.
- * Arguments
- * * M - person consuming the mat
- * * S - (optional) item the mat is contained in (NOT the item with the mat itself)
- */
-/datum/material/proc/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S)
- return FALSE
-
///This proc is called when the material is added to an object specifically.
/datum/material/proc/on_applied_obj(obj/o, amount, material_flags)
if(material_flags & MATERIAL_AFFECT_STATISTICS)
diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm
index 62479d90e0d3..aed6577a5af9 100644
--- a/code/datums/materials/pizza.dm
+++ b/code/datums/materials/pizza.dm
@@ -28,4 +28,4 @@
/datum/material/pizza/proc/make_edible(atom/source, amount, material_flags)
var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT)
var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT)
- source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat"), filling_color = COLOR_YELLOW)
+ source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat"))
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 96ca4b12d8b4..36ec4a1b5ae6 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -55,6 +55,7 @@
var/damnation_type = 0
var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
var/hasSoul = TRUE // If false, renders the character unable to sell their soul.
+ var/holy_role = NONE //is this person a chaplain or admin role allowed to use bibles, Any rank besides 'NONE' allows for this.
var/mob/living/enslaved_to //If this mind's master is another mob
var/datum/language_holder/language_holder
diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm
index afd4e83cfe34..5545c4efde53 100644
--- a/code/datums/mutations/speech.dm
+++ b/code/datums/mutations/speech.dm
@@ -68,6 +68,129 @@
return
REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, GENETIC_MUTATION)
+/datum/mutation/human/swedish
+ name = "Swedish"
+ desc = "A horrible mutation originating from the distant past. Thought to be eradicated after the incident in 2037."
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "You feel Swedish, however that works."
+ text_lose_indication = "The feeling of Swedishness passes."
+
+/datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner)
+ if(..())
+ return
+ RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+
+/datum/mutation/human/swedish/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ UnregisterSignal(owner, COMSIG_MOB_SAY)
+
+/datum/mutation/human/swedish/proc/handle_speech(datum/source, list/speech_args)
+ SIGNAL_HANDLER
+
+ var/message = speech_args[SPEECH_MESSAGE]
+ if(message)
+ message = replacetext(message,"w","v")
+ message = replacetext(message,"j","y")
+ message = replacetext(message,"a",pick("å","ä","æ","a"))
+ message = replacetext(message,"bo","bjo")
+ message = replacetext(message,"o",pick("ö","ø","o"))
+ if(prob(30))
+ message += " Bork[pick("",", bork",", bork, bork")]!"
+ speech_args[SPEECH_MESSAGE] = trim(message)
+
+/datum/mutation/human/chav
+ name = "Chav"
+ desc = "Unknown"
+ quality = MINOR_NEGATIVE
+ text_gain_indication = "Ye feel like a reet prat like, innit?"
+ text_lose_indication = "You no longer feel like being rude and sassy."
+
+/datum/mutation/human/chav/on_acquiring(mob/living/carbon/human/owner)
+ if(..())
+ return
+ RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+
+/datum/mutation/human/chav/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ UnregisterSignal(owner, COMSIG_MOB_SAY)
+
+/datum/mutation/human/chav/proc/handle_speech(datum/source, list/speech_args)
+ var/message = speech_args[SPEECH_MESSAGE]
+ if(message)
+ message = " [message] "
+ message = replacetext(message," looking at "," gawpin' at ")
+ message = replacetext(message," great "," bangin' ")
+ message = replacetext(message," man "," mate ")
+ message = replacetext(message," friend ",pick(" mate "," bruv "," bledrin "))
+ message = replacetext(message," what "," wot ")
+ message = replacetext(message," drink "," wet ")
+ message = replacetext(message," get "," giz ")
+ message = replacetext(message," what "," wot ")
+ message = replacetext(message," no thanks "," wuddent fukken do one ")
+ message = replacetext(message," i don't know "," wot mate ")
+ message = replacetext(message," no "," naw ")
+ message = replacetext(message," robust "," chin ")
+ message = replacetext(message," hi "," how what how ")
+ message = replacetext(message," hello "," sup bruv ")
+ message = replacetext(message," kill "," bang ")
+ message = replacetext(message," murder "," bang ")
+ message = replacetext(message," windows "," windies ")
+ message = replacetext(message," window "," windy ")
+ message = replacetext(message," break "," do ")
+ message = replacetext(message," your "," yer ")
+ message = replacetext(message," security "," coppers ")
+ speech_args[SPEECH_MESSAGE] = trim(message)
+
+
+/datum/mutation/human/elvis
+ name = "Elvis"
+ desc = "A terrifying mutation named after its 'patient-zero'."
+ quality = MINOR_NEGATIVE
+ locked = TRUE
+ text_gain_indication = "You feel pretty good, honeydoll."
+ text_lose_indication = "You feel a little less conversation would be great."
+
+/datum/mutation/human/elvis/on_life()
+ switch(pick(1,2))
+ if(1)
+ if(prob(15))
+ var/list/dancetypes = list("swinging", "fancy", "stylish", "20'th century", "jivin'", "rock and roller", "cool", "salacious", "bashing", "smashing")
+ var/dancemoves = pick(dancetypes)
+ owner.visible_message("[owner] busts out some [dancemoves] moves!")
+ if(2)
+ if(prob(15))
+ owner.visible_message("[owner] [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!")
+
+/datum/mutation/human/elvis/on_acquiring(mob/living/carbon/human/owner)
+ if(..())
+ return
+ RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+
+/datum/mutation/human/elvis/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ UnregisterSignal(owner, COMSIG_MOB_SAY)
+
+/datum/mutation/human/elvis/proc/handle_speech(datum/source, list/speech_args)
+ SIGNAL_HANDLER
+
+ var/message = speech_args[SPEECH_MESSAGE]
+ if(message)
+ message = " [message] "
+ message = replacetext(message," i'm not "," I aint ")
+ message = replacetext(message," girl ",pick(" honey "," baby "," baby doll "))
+ message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo "))
+ message = replacetext(message," out of "," outta ")
+ message = replacetext(message," thank you "," thank you, thank you very much ")
+ message = replacetext(message," thanks "," thank you, thank you very much ")
+ message = replacetext(message," what are you "," whatcha ")
+ message = replacetext(message," yes ",pick(" sure", "yea "))
+ message = replacetext(message," muh valids "," my kicks ")
+ speech_args[SPEECH_MESSAGE] = trim(message)
+
+
/datum/mutation/human/stoner
name = "Stoner"
desc = "A common mutation that severely decreases intelligence."
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 15a580a89328..34771af91ed2 100644
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -50,13 +50,9 @@
/// Type path of item to go in the glasses slot
var/glasses = null
- var/wallet = null
-
/// Type path of item to go in the idcard slot
var/id = null
- var/bank_card = null
-
/// Type path of item for left pocket slot
var/l_pocket = null
@@ -184,13 +180,8 @@
H.equip_to_slot_or_del(new ears(H),ITEM_SLOT_EARS, TRUE)
if(glasses)
H.equip_to_slot_or_del(new glasses(H),ITEM_SLOT_EYES, TRUE)
- if(!visualsOnly)
- if(wallet)
- H.equip_to_slot_or_del(new wallet(H),ITEM_SLOT_ID, TRUE)
- if(id)
- H.equip_to_slot_or_del(new id(H),ITEM_SLOT_ID, TRUE)
- if(bank_card)
- H.equip_to_slot_or_del(new bank_card(H),ITEM_SLOT_ID, TRUE)
+ if(id)
+ H.equip_to_slot_or_del(new id(H),ITEM_SLOT_ID, TRUE)
if(suit_store)
H.equip_to_slot_or_del(new suit_store(H),ITEM_SLOT_SUITSTORE, TRUE)
diff --git a/code/datums/ruins/beachplanet.dm b/code/datums/ruins/beachplanet.dm
index b258ef45f0e8..dae334aefae1 100644
--- a/code/datums/ruins/beachplanet.dm
+++ b/code/datums/ruins/beachplanet.dm
@@ -2,6 +2,8 @@
/datum/map_template/ruin/beachplanet
prefix = "_maps/RandomRuins/BeachRuins/"
+ allow_duplicates = FALSE
+ cost = 5
ruin_type = RUINTYPE_BEACH
/datum/map_template/ruin/beachplanet/fishinghut
@@ -16,6 +18,12 @@
description = "As you draw near the ancient wall, a sense of foreboding overcomes you. You aren't sure why, but you feel this dusty structure may contain great dangers."
suffix = "beach_ancient_ruin.dmm"
+/datum/map_template/ruin/beachplanet/colony
+ name = "Abandoned Beachside Colony"
+ id = "beach_colony"
+ description = "A abandoned colony. It seems that this colony was abandoned, for a reason or another"
+ suffix = "beach_colony.dmm"
+
/datum/map_template/ruin/beachplanet/town
name = "Beachside Town"
id = "beach_town"
@@ -28,6 +36,18 @@
description = "A small pirate outpost formed from the remains of a wrecked shuttle."
suffix = "beach_pirate_crash.dmm"
+/datum/map_template/ruin/beachplanet/fallenstar
+ name = "Crashed Starwalker"
+ id = "crashed_star"
+ description = "A Crashed Starwalker Class Pirate Ship. It's Crew is Long-Dead."
+ suffix = "beach_crashed_starwalker.dmm"
+
+/datum/map_template/ruin/beachplanet/knight
+ name = "Knight's Rest"
+ id = "knights_rest"
+ description = "An small castle holding the grave of a renowned warrior"
+ suffix = "beach_knights_rest.dmm"
+
/datum/map_template/ruin/beachplanet/treasurecove
name = "Treasure Cove"
id = "beach_treasure_cove"
diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm
index 60304e86f6f0..a447a5b6f465 100644
--- a/code/datums/ruins/icemoon.dm
+++ b/code/datums/ruins/icemoon.dm
@@ -2,20 +2,57 @@
/datum/map_template/ruin/icemoon
prefix = "_maps/RandomRuins/IceRuins/"
+ allow_duplicates = FALSE
+ cost = 5
ruin_type = RUINTYPE_ICE
-/datum/map_template/ruin/icemoon/hydroponicslab
+// above ground only
+
+/datum/map_template/ruin/icemoon/engioutpost
+ name = "Engineer Outpost"
+ id = "engioutpost"
+ description = "Blown up by an unfortunate accident."
+ suffix = "icemoon_surface_engioutpost.dmm"
+
+
+/datum/map_template/ruin/icemoon/hydroponicslab //Shiptest edit
name = "Hydroponics Lab"
id = "hydroponicslab"
description = "An abandoned hydroponics research facility containing hostile plant fauna."
suffix = "icemoon_hydroponics_lab.dmm"
+// above and below ground together
+
+
+// below ground only
+
+/datum/map_template/ruin/icemoon
+ name = "underground ruin"
+
/datum/map_template/ruin/icemoon/abandonedvillage
name = "Abandoned Village"
id = "abandonedvillage"
description = "Who knows what lies within?"
suffix = "icemoon_underground_abandoned_village.dmm"
+/datum/map_template/ruin/icemoon/corpreject
+ name = "NT Security Solutions Site Gamma"
+ id = "corpreject"
+ description = "Nanotrasen Corporate Security Solutions vault site Gamma."
+ suffix = "icemoon_surface_corporate_rejects.dmm"
+
+/datum/map_template/ruin/icemoon/syndicate_outpost
+ name = "Abandoned Syndicate Outpost"
+ id = "syndicate-outpost-icemoon"
+ description = "A outpost that used to be a staging area for nuclear operatives. The Syndicate have moved to another location, but this still remains."
+ suffix = "icemoon_underground_abandoned_newcops.dmm"
+
+/datum/map_template/ruin/icemoon/drakelair
+ name = "Dragon's Lair"
+ id = "drake-lair"
+ description = "\"First the creature's Flame breathed from beneath the stone, Hot battle-fumes, and the earth rumbled.\""
+ suffix = "icemoon_underground_drakelair.dmm"
+
/datum/map_template/ruin/icemoon/brazillian_lab
name = "Barricaded Compound"
id = "brazillian-lab"
diff --git a/code/datums/ruins/jungle.dm b/code/datums/ruins/jungle.dm
index f1e2e16bfec8..5642e7aadacd 100644
--- a/code/datums/ruins/jungle.dm
+++ b/code/datums/ruins/jungle.dm
@@ -4,12 +4,92 @@
prefix = "_maps/RandomRuins/JungleRuins/"
ruin_type = RUINTYPE_JUNGLE
+/datum/map_template/ruin/jungle/jungle_botany_ruin
+ id = "jungle_botany-ruin"
+ suffix = "jungle_botany.dmm"
+ name = "Ruined Botany Research Facility"
+ description = "A research facility of great botany discoveries. Long since abandoned, willingly or not..."
+
+/datum/map_template/ruin/jungle/ai_ikea
+ name = "Space Ikea AI Shipment"
+ id = "ikea-ai"
+ description = "A Space Ikea Brand AI Core and Necessities Crate, it seems to have missed its intended target."
+ suffix = "jungle_surface_ikea_ai.dmm"
+
+/datum/map_template/ruin/jungle/coffinpirate
+ name = "Coffin-Shaped Pirate Hut"
+ id = "coffinpirate"
+ description = "An odd coffin shaped pirate hut that the inhabitant of died in."
+ suffix = "jungle_surface_coffinpirate.dmm"
+
+//far more tasteful than its predecessor...
+/datum/map_template/ruin/jungle/lessonintrickery
+ name = "Bombmaker's Cabin"
+ id = "bombmakers-cabin"
+ description = "Playing with bombs again, are we?"
+ suffix = "jungle_surface_bombmakers_cabin.dmm"
+
+/datum/map_template/ruin/jungle/weedshack
+ name = "Stoner's Cabin"
+ id = "weed-shack"
+ description = "The Industrial Revolution and its consequences have been a disaster for the human race."
+ suffix = "jungle_surface_weed_shack.dmm"
+
+//vae's jungle ruins from bungalowstation
+/datum/map_template/ruin/jungle/pizzawave
+ name = "Jungle Pizzawave"
+ id = "pizzawave"
+ description = "Get some pizza my dude."
+ suffix = "jungle_pizzawave.dmm"
+
+/datum/map_template/ruin/jungle/nest
+ name = "Jungle Xenonest"
+ id = "xenonestjungle"
+ description = "A Xeno nest crammed into the Jungle."
+ suffix = "jungle_nest.dmm"
+
+/datum/map_template/ruin/jungle/seedling
+ name = "Seedling ruin"
+ id = "seedling"
+ description = "A rare seedling plant."
+ suffix = "jungle_seedling.dmm"
+
+/datum/map_template/ruin/jungle/hangar
+ name = "Abandoned Hangar"
+ id = "hangar"
+ description = "An abandoned hangar containing exosuits."
+ suffix = "jungle_hangar.dmm"
+
+/datum/map_template/ruin/jungle/pirate
+ name = "Jungle Pirates"
+ id = "piratejungle"
+ description = "A group of pirates on a small ship in the jungle."
+ suffix = "jungle_pirate.dmm"
+
/datum/map_template/ruin/jungle/syndicate
name = "Jungle Syndicate Bunker"
id = "syndicatebunkerjungle"
description = "A small bunker owned by the Syndicate."
suffix = "jungle_syndicate.dmm"
+/datum/map_template/ruin/jungle/village
+ name = "Monkey Village"
+ id = "monkeyvillage"
+ description = "A small village of monkeys."
+ suffix = "jungle_village.dmm"
+
+/datum/map_template/ruin/jungle/roommates
+ name = "Roommates"
+ id = "roommates"
+ description = "A shack once inhabited by a clown and a mime... and they were roommates."
+ suffix = "jungle_surface_roommates.dmm"
+
+/datum/map_template/ruin/jungle/ninjashrine
+ name = "Ninja Shrine"
+ id = "ninjashrine"
+ description = "A ninja shrine."
+ suffix = "jungle_surface_ninjashrine.dmm"
+
/datum/map_template/ruin/jungle/interceptor
name = "Old Crashed Interceptor"
id = "crashedcondor"
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 6f57fe8adb82..bb4bcf74b31c 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -11,6 +11,64 @@
This one seems to simulate the wintery climate of the northern provinces, including a sauna!"
suffix = "lavaland_surface_biodome_winter.dmm"
+/datum/map_template/ruin/lavaland/sin
+ cost = 10
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/sin/sloth
+ name = "Ruin of Sloth"
+ id = "sloth"
+ description = "..."
+ suffix = "lavaland_surface_sloth.dmm"
+ // Generates nothing but atmos runtimes and salt
+ cost = 0
+
+/datum/map_template/ruin/lavaland/hierophant
+ name = "Hierophant's Arena"
+ id = "hierophant"
+ description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares."
+ suffix = "lavaland_surface_hierophant.dmm"
+ allow_duplicates = FALSE
+
+/datum/map_template/ruin/lavaland/xeno_nest
+ name = "Xenomorph Nest"
+ id = "xeno-nest"
+ description = "These xenomorphs got bored of horrifically slaughtering people on space stations, and have settled down on a nice lava-filled hellscape to focus on what's really important in life. \
+ Quality memes."
+ suffix = "lavaland_surface_xeno_nest.dmm"
+ cost = 20
+
+/datum/map_template/ruin/lavaland/survivalcapsule
+ name = "Survival Capsule Ruins"
+ id = "survivalcapsule"
+ description = "What was once sanctuary to the common miner, is now their tomb."
+ suffix = "lavaland_surface_survivalpod.dmm"
+ cost = 5
+
+/datum/map_template/ruin/lavaland/pizza
+ name = "Ruined Pizza Party"
+ id = "pizza"
+ description = "Little Timmy's birthday pizza bash took a turn for the worse when a bluespace anomaly passed by."
+ suffix = "lavaland_surface_pizzaparty.dmm"
+ allow_duplicates = FALSE
+ cost = 5
+
+/datum/map_template/ruin/lavaland/hermit
+ name = "Makeshift Shelter"
+ id = "hermitcave"
+ description = "A place of shelter for a lone hermit, scraping by to live another day."
+ suffix = "lavaland_surface_hermit.dmm"
+ allow_duplicates = FALSE
+ cost = 10
+
+/datum/map_template/ruin/lavaland/miningripley
+ name = "Ripley"
+ id = "ripley"
+ description = "A heavily-damaged mining ripley, property of a very unfortunate miner. You might have to do a bit of work to fix this thing up."
+ suffix = "lavaland_surface_random_ripley.dmm"
+ allow_duplicates = FALSE
+ cost = 5
+
/datum/map_template/ruin/lavaland/elephant_graveyard
name = "Elephant Graveyard"
id = "Graveyard"
@@ -19,32 +77,47 @@
allow_duplicates = FALSE
cost = 10
+/datum/map_template/ruin/lavaland/comm_outpost
+ name = "Syndicate Comm Outpost"
+ id = "commoutpost"
+ description = "A forgotten outpost home to only a tragic tale."
+ suffix = "lavaland_surface_comm_outpost.dmm"
+ allow_duplicates = FALSE
+ cost = 5
+
+/datum/map_template/ruin/lavaland/dwarffortress
+ name = "Legion infested Dwarf Fortress"
+ id = "dwarffortress"
+ description = "A forgotten fortress home to only a tragic tale and infested corpses."
+ suffix = "lavaland_surface_dwarffortress.dmm"
+ allow_duplicates = FALSE
+
/datum/map_template/ruin/lavaland/buried_shrine
name = "Buried Shrine"
id = "buried_shrine"
description = "An ancient temple belonging to some long-gone inhabitants, wrecked and buried by the volcanic activity of it's home planet."
suffix = "lavaland_surface_buried_shrine.dmm"
+/datum/map_template/ruin/lavaland/spookycrash
+ name = "Spooky Crash"
+ id = "spooky_crash"
+ description = "A spooky looking crash."
+ suffix = "lavaland_surface_SPOOKYCRASH.dmm"
+
+/datum/map_template/ruin/lavaland/crashedpinnance
+ name = "Crashed Research Pinnance"
+ id = "crashed_pinnance"
+ description = "A crashed shuttlecraft, looks like the pilot didn't make it."
+ suffix = "lavaland_surface_crashed_pinnance.dmm"
+
+/datum/map_template/ruin/lavaland/codelab
+ name = "Nanotrasen Genetic Research Facility"
+ id = "codelab"
+ description = "A Nanotrasen genetic research facility, abandoned and ripe for looting. Whats that goo over there?"
+ suffix = "lavaland_surface_codelab.dmm"
+
/datum/map_template/ruin/lavaland/lava_canyon
name = "Lava Canyon"
id = "lava_canyon"
description = "Tectonic activity has gouged a large fissure into the surface of the planet here. Tucked in the crevasse, the remains of an ashwalker village lay in ashes."
suffix = "lavaland_surface_lava_canyon.dmm"
-
-/datum/map_template/ruin/lavaland/wrecked_factory
- name = "Wrecked Factory"
- id = "wreck_factory"
- description = "A Nanotrasen processing facility, assaulted by a pirate raid that has killed most of the staff. The offices however, remain unbreached for now."
- suffix = "lavaland_surface_wrecked_factory.dmm"
-
-/datum/map_template/ruin/lavaland/fallenstar
- name = "Crashed Starwalker"
- id = "crashed_star"
- description = "A crashed pirate ship. It would seem that it's crew died a while ago."
- suffix = "lavaland_crashed_starwalker.dmm"
-
-/datum/map_template/ruin/lavaland/abandonedlisteningpost
- name = "Abandoned Listening Post"
- id = "abandonedlistening"
- description = "An abandoned Cybersun listening post. Seems like the Ramzi Clique has an interest in the site."
- suffix = "lavaland_abandonedlisteningpost.dmm"
diff --git a/code/datums/ruins/rockplanet.dm b/code/datums/ruins/rockplanet.dm
index ac9e2ffc4081..966694c400f7 100644
--- a/code/datums/ruins/rockplanet.dm
+++ b/code/datums/ruins/rockplanet.dm
@@ -2,9 +2,65 @@
/datum/map_template/ruin/rockplanet
prefix = "_maps/RandomRuins/RockRuins/"
-
+ allow_duplicates = FALSE
+ cost = 5
ruin_type = RUINTYPE_ROCK
+/datum/map_template/ruin/rockplanet/heirophant
+ name = "Ancient Heirophant"
+ id = "rockheiro"
+ description = "something dangerous"
+ suffix = "rockplanet_heirophant.dmm"
+
+/* TODO: GREEBLE
+/datum/map_template/ruin/rockplanet/dangerpod
+ name = "Dangerous pod"
+ id = "dangerpod"
+ description = "A pod holding a dangerous threat."
+ suffix = "wasteplanet_dangerpod.dmm"
+*/
+
+/* //TODO: MAKE THIS A MINOR RUIN
+/datum/map_template/ruin/rockplanet/pioneer
+ name = "Krusty Krab Pizza"
+ id = "pioneer"
+ description = "The pioneers used to ride these babies for miles!"
+ suffix = "rockplanet_pioneer.dmm"
+*/
+
+/*greeble
+/datum/map_template/ruin/rockplanet/house
+ name = "baracaded house"
+ id = "house"
+ description = "Some sort of house, baracaded in. It must be baracaded for a reason.."
+ suffix = "rockplanet_house.dmm"
+*/
+
+/datum/map_template/ruin/rockplanet/mining_expedition
+ name = "Mining Expedition"
+ id = "expedition"
+ description = "A mining operation gone wrong."
+ suffix = "rockplanet_miningexpedition.dmm"
+
+
+/datum/map_template/ruin/rockplanet/boxsci
+ name = "Abandoned science wing"
+ id = "abandonedscience"
+ description = "A chunk of a station that broke off.."
+ suffix = "rockplanet_boxsci.dmm"
+
+/datum/map_template/ruin/rockplanet/crash_cult
+ name = "Crashed Exploration Clipper"
+ description = "A crashed exploration vessel. Hivebots are taking this ship apart for scrap."
+ id = "crash_cult"
+ suffix = "rockplanet_crash.dmm"
+
+/datum/map_template/ruin/rockplanet/saloon
+ name = "Abandoned saloon"
+ description = "For whatever reason, someone decided to make a colony with a indie style."
+ id = "rockplanet_saloon"
+ suffix = "rockplanet_saloon.dmm"
+
/datum/map_template/ruin/rockplanet/harmfactory
name = "Harm Factory"
description = "A factory made for HARM and AGONY."
@@ -17,6 +73,7 @@
id = "rockplanet_budgetcuts"
suffix = "rockplanet_budgetcuts.dmm"
+
/datum/map_template/ruin/rockplanet/shippingdock
name = "Abandoned Shipping Dock"
description = "An abandoned shipping dock used by small cargo freighters and smugglers alike. Some malicious group seems to have trapped the place to eliminate scavengers."
@@ -29,8 +86,3 @@
id = "rockplanet_nomadcrash"
suffix = "rockplanet_nomadcrash.dmm"
-/datum/map_template/ruin/rockplanet/distillery
- name = "Frontiersman Distillery"
- description = "A former pre-ICW era Nanotrasen outpost converted into a moonshine distillery by Frontiersman bootleggers."
- id = "rockplanet_distillery"
- suffix = "rockplanet_distillery.dmm"
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 1aedb0b9be82..fefb250a1208 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -12,6 +12,12 @@
name = "Corporate Mining Module"
description = "An old and rusty mining facility, with big ore potential."
+/datum/map_template/ruin/space/excavator_DK
+ id = "Excavator-DK"
+ suffix = "excavator_DK.dmm"
+ name = "Excavator DK Class"
+ description = "A heavily damaged DK class excavator"
+
/datum/map_template/ruin/space/bigderelict1
id = "bigderelict1"
suffix = "bigderelict1.dmm"
@@ -25,6 +31,58 @@
name = "DK Excavator 453"
description = "Formerly a thriving planetary mining outpost, now a bit of an exploded mess. One has to wonder how it got here"
+/* shiptest: Replaced with dark_glade ruin
+/datum/map_template/ruin/space/way_home
+ id = "way-home"
+ suffix = "way_home.dmm"
+ name = "Salvation"
+ description = "In the darkest times, we will find our way home."
+*/
+
+/datum/map_template/ruin/space/crashedship
+ id = "crashedship"
+ suffix = "crashedship.dmm"
+ name = "Crashed Ship"
+ description = "Among civilian vessels the most common cause of tragedy is lack of food. \
+ This ship was outfitted with a multitude of food-generating features, then summarily ran into an asteroid shortly after takeoff."
+
+/datum/map_template/ruin/space/vaporwave
+ id = "vaporwave"
+ suffix = "vaporwave.dmm"
+ name = "Aesthetic Outpost"
+ description = "Pause and remember-- You are unique.You are special. Every mistake, trial, and hardship has helped to sculpt your real beauty. \
+ Stop hating yourself and start appreciating and loving yourself!"
+
+/datum/map_template/ruin/space/hellfactory
+ id = "hellfactory"
+ suffix = "hellfactory.dmm"
+ name = "Heck Brewery"
+ description = "An abandoned warehouse and brewing facility, which has been recently rediscovered. Reports claim that the security system entered an ultra-hard lockdown, but these reports are inconclusive."
+
+/datum/map_template/ruin/space/cryocontainment
+ id = "cryocontainment"
+ suffix = "cryocontainment.dmm"
+ name = "Cryogenic Containment Facility"
+ description = "Some old facility where they stored something in a cryotube to experiement on, obviously it got out and now the only thing it contains is Space Carps."
+
+/datum/map_template/ruin/space/dangerous_research
+ id = "dangerous_research"
+ suffix = "dangerous_research.dmm"
+ name = "Occult Research Station"
+ description = "This station was deemed unsuitable for continued experiments, and quickly abandoned."
+
+/datum/map_template/ruin/space/macspace
+ id = "fast_food"
+ suffix = "Fast_Food.dmm"
+ name = "Mac Space Restaurant"
+ description = "A fast food reataurant in space."
+
+/datum/map_template/ruin/space/scav_mining
+ id = "mining_asteroid"
+ suffix = "scav_mining.dmm"
+ name = "Mining asteroid"
+ description = "An abandoned mining operation on an asteroid that now has new ocupants that is not happy to se you"
+
/datum/map_template/ruin/space/power_puzzle
id = "power_puzzle"
suffix = "power_puzzle.dmm"
@@ -32,12 +90,42 @@
description = "an abandoned secure storage location. there is no power left in the batteries and the former ocupants locked it pretty tight before leaving.\
You will have to power areas to raise the bolts on the doors. look out for secrets."
+/datum/map_template/ruin/space/transport18
+ id = "transport18"
+ suffix = "transport18.dmm"
+ name = "Booze Cruise"
+ description = "A freighter, damaged beyond repair and surrounded by a cloud of aluminium and... beer foam?"
+
+/datum/map_template/ruin/space/fueldepot
+ id = "fueldepot"
+ suffix = "fueldepot.dmm"
+ name = "Fuel Depot"
+ description = "An orbital refueling station with the remains of a ship lodged among the debris."
+
+/datum/map_template/ruin/space/ntfacility
+ id = "ntfacility"
+ suffix = "ntfacility.dmm"
+ name = "Abandoned Facility"
+ description = "A NT research station. Something has gone horribly wrong here."
+
/datum/map_template/ruin/space/astraeus
id = "astraeus"
suffix = "astraeus.dmm"
name = "Astraeus Ruin"
description = "This vessel served a lengthy period in the Nanotrasen fleet, before an accident in the munitions bay caused to to be destroyed while in active combat."
+/datum/map_template/ruin/space/glade
+ id = "dark_glade"
+ suffix = "dark_glade.dmm"
+ name = "Dark Glade"
+ description = "It's always dark in the ancient glade."
+
+/datum/map_template/ruin/space/syndicircle
+ id = "provinggrounds"
+ suffix = "provinggrounds.dmm"
+ name = "Syndicate Battle Sphere"
+ description = "The Syndicate Battle Sphere, complete with guns!"
+
/datum/map_template/ruin/space/singularitylab
id = "singularitylab"
suffix = "singularity_lab.dmm"
diff --git a/code/datums/ruins/wasteplanet.dm b/code/datums/ruins/wasteplanet.dm
index 8083567a7c68..80bf701526be 100644
--- a/code/datums/ruins/wasteplanet.dm
+++ b/code/datums/ruins/wasteplanet.dm
@@ -2,26 +2,66 @@
/datum/map_template/ruin/wasteplanet
prefix = "_maps/RandomRuins/WasteRuins/"
+ allow_duplicates = FALSE
+ cost = 5
ruin_type = RUINTYPE_WASTE
+/datum/map_template/ruin/wasteplanet/fortress
+ name = "Fortress of Solitide"
+ id = "solitude"
+ description = "A fortress, although one you are probably more familiar with."
+ suffix = "wasteplanet_fortress_of_solitide.dmm"
+
/datum/map_template/ruin/wasteplanet/weaponstest
name = "Weapons testing facility"
id = "guntested"
description = "A abandoned Nanotrasen weapons facility, presumably the place where the X-01 was manufactured."
suffix = "wasteplanet_lab.dmm"
+/datum/map_template/ruin/wasteplanet/oreprocess
+ name = "Ore Processing Facility"
+ id = "oreprocess"
+ description = "A fortress, although one you are probably more familiar with.."
+ suffix = "wasteplanet_ore_proccessing_facility.dmm"
+
/datum/map_template/ruin/wasteplanet/pandora
id = "pandora_arena"
suffix = "wasteplanet_pandora.dmm"
name = "Pandora Arena"
description = "Some... thing has settled here."
+/* Greeble
+/datum/map_template/ruin/wasteplanet/pod
+ name = "Derelict pod"
+ id = "oldpod"
+ description = "A large, old pod."
+ suffix = "wasteplanet_pod.dmm"
+*/
+
+/datum/map_template/ruin/wasteplanet/crash_kitchen
+ name = "Crashed Kitchen"
+ description = "A crashed part of some unlucky ship."
+ id = "crash_kitchen"
+ suffix = "wasteplanet_crash_kitchen.dmm"
+
/datum/map_template/ruin/wasteplanet/radiation
name = "Honorable deeds storage"
id = "wasteplanet_radiation"
description = "A dumping ground for nuclear waste."
suffix = "wasteplanet_unhonorable.dmm"
+/datum/map_template/ruin/wasteplanet/tradepost
+ name = "Tradepost"
+ id = "oldpod"
+ description = "An abandoned tradepost."
+ suffix = "wasteplanet_tradepost.dmm"
+
+/datum/map_template/ruin/wasteplanet/tarpit
+ name = "Tar pit"
+ id = "tarpit"
+ description = "A facility once constructed over a asphalt deposit."
+ suffix = "wasteplanet_tarpit.dmm"
+
/datum/map_template/ruin/wasteplanet/abandoned_mechbay
name = "Abandoned Mech Bay"
description = "A military base formerly used for staging 4 mechs and crew. God knows what's in it now."
diff --git a/code/datums/ruins/whitesands.dm b/code/datums/ruins/whitesands.dm
index b3e0cb13adcc..8e34f7cf379c 100644
--- a/code/datums/ruins/whitesands.dm
+++ b/code/datums/ruins/whitesands.dm
@@ -4,12 +4,43 @@
prefix = "_maps/RandomRuins/SandRuins/"
ruin_type = RUINTYPE_SAND
+/datum/map_template/ruin/whitesands/starfury_crash
+ name = "Starfury Crash"
+ id = "starfurycrash"
+ description = "The remains of an unidentified syndicate battleship has crashed here."
+ suffix = "whitesands_surface_starfurycrash.dmm"
+ allow_duplicates = FALSE
+
/datum/map_template/ruin/whitesands/medipen_plant
name = "Abandoned Medipen Factory"
id = "medipenplant"
description = "A once prosperous autoinjector manufacturing plant."
suffix = "whitesands_surface_medipen_plant.dmm"
+/datum/map_template/ruin/whitesands/assaultpodcrash
+ name = "Crashed Syndicate Assault Drop Pod"
+ id = "ws-assaultpodcrash"
+ description = "The fauna of desert planets can be deadly even to equipped Syndicate Operatives."
+ suffix = "whitesands_surface_assaultpodcrash.dmm"
+
+/datum/map_template/ruin/whitesands/conveniencestore
+ name = "Conveniently Abandoned Convenience Store"
+ id = "ws-conveniencestore"
+ description = "Pretty convenient that they have a convenience store out here, huh?"
+ suffix = "whitesands_surface_conveniencestore.dmm"
+
+/datum/map_template/ruin/whitesands/onlyaspoonful
+ name = "Abandoned Spoon Factory"
+ id = "ws-onlyaspoonful"
+ description = "Literally a fucking spoon factory"
+ suffix = "whitesands_surface_onlyaspoonful.dmm"
+
+/datum/map_template/ruin/whitesands/chokepoint
+ name = "Chokepoint"
+ id = "ws-chokepoint"
+ description = "Some sort of survivors, brandishing old nanotrasen security gear."
+ suffix = "whitesands_surface_chokepoint.dmm"
+
/datum/map_template/ruin/whitesands/pubbyslopcrash
name = "Pubby Slop Crash"
id = "ws-pubbyslopcrash"
@@ -17,13 +48,19 @@
suffix = "whitesands_surface_pubbyslopcrash.dmm"
//////////OUTSIDE SETTLEMENTS/RUINS//////////
+/datum/map_template/ruin/whitesands/survivors/drugstore
+ name = "Abandoned Store"
+ id = "ws-drugstore"
+ description = "A store that once sold a variety of items and equipment."
+ suffix = "whitesands_surface_camp_drugstore.dmm"
+
/datum/map_template/ruin/whitesands/survivors/saloon
name = "Hermit Saloon"
id = "ws-saloon"
description = "A western style saloon, most popular spot for the hermits to gather planetside"
suffix = "whitesands_surface_camp_saloon.dmm"
-/datum/map_template/ruin/whitesands/survivors/combination //combined extra large ruin of several other whitesands survivor ruins
+/datum/map_template/ruin/whitesands/survivors/combination //combined extra large ruin of several other whitesands survivor ruins (excludes the drugstore)
name = "Wasteland Survivor Village"
id = "ws-combination"
description = "A small encampment of nomadic survivors of the First Colony, and their descendants. By all accounts, feral and without allegance to anyone but themselves."
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 31a5e9165d3c..d7b60476d977 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -358,7 +358,7 @@
name = "Sugarcube Transport"
prefix = "ISV"
-//your subshuttle here //why is my subshuttle here
+//your subshuttle here
/datum/map_template/shuttle/subshuttles/heron
file_name = "nanotrasen_falcon"
name = "Falcon Dropship"
@@ -402,11 +402,6 @@
name = "Nail-class Boarding Vessel"
prefix = "PGF"
-/datum/map_template/shuttle/subshuttles/tanto
- file_name = "independent_tanto"
- name = "Tanto-class Drop Pod"
- prefix = "SV"
-
/datum/map_template/shuttle/subshuttles/brawler
file_name = "frontiersmen_brawler"
name = "Brawler-class Dropship"
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 873729866a40..d1a8fd6acaa5 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -105,7 +105,7 @@
if("Clown")
heirloom_type = /obj/item/bikehorn/golden
if("Mime")
- heirloom_type = /obj/item/food/baguette
+ heirloom_type = /obj/item/reagent_containers/food/snacks/baguette
if("Janitor")
heirloom_type = pick(/obj/item/mop, /obj/item/clothing/suit/caution, /obj/item/reagent_containers/glass/bucket, /obj/item/paper/fluff/stations/soap)
if("Cook")
@@ -464,7 +464,7 @@
to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.")
dumb_thing = FALSE //only once per life
if(prob(1))
- new/obj/item/food/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code
+ new/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code
// small chance to make eye contact with inanimate objects/mindless mobs because of nerves
/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A)
diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm
index 91e0ac816189..4c856cf99d3f 100644
--- a/code/datums/wires/mines.dm
+++ b/code/datums/wires/mines.dm
@@ -28,7 +28,7 @@
if(WIRE_PIN)
if(ourmine.clicked == TRUE)
holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] click softly."))
- playsound(ourmine, SOUND_EMPTY_MAG, 30, TRUE)
+ playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE)
ourmine.clicked = FALSE
else
holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad shifts slightly. Nothing happens."))
@@ -61,7 +61,7 @@
ourmine.dud = TRUE
if(ourmine.clicked == TRUE)
holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] shift out of place."))
- playsound(ourmine, SOUND_EMPTY_MAG, 30, TRUE)
+ playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE)
ourmine.clicked = FALSE
else
holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad goes loose."))
diff --git a/code/game/MapData/shuttles/srm_elder.dm b/code/game/MapData/shuttles/srm_elder.dm
index 97805731ec2f..db6561b6550c 100644
--- a/code/game/MapData/shuttles/srm_elder.dm
+++ b/code/game/MapData/shuttles/srm_elder.dm
@@ -20,38 +20,15 @@
name = "shadow's locker"
desc = "The closet of equipment and attire for the aspiring shadow."
icon_state = "cabinet"
- open_sound = 'sound/machines/wooden_closet_open.ogg'
- close_sound = 'sound/machines/wooden_closet_close.ogg'
-
-/obj/structure/closet/secure_closet/flamebearer
- name = "flamebearer's locker"
- desc = "The closet of equipment an ascetic Flamebearer would require."
- icon_state = "cabinet"
- open_sound = 'sound/machines/wooden_closet_open.ogg'
- close_sound = 'sound/machines/wooden_closet_close.ogg'
/obj/structure/closet/secure_closet/hunter
name = "hunter's locker"
desc = "Everything a hunter will need, held in one secure closet."
icon_state = "cabinet"
req_access = list(ACCESS_SECURITY)
- open_sound = 'sound/machines/wooden_closet_open.ogg'
- close_sound = 'sound/machines/wooden_closet_close.ogg'
-
-/obj/structure/closet/secure_closet/machinist
- name = "machinist's Locker"
- desc = "The personal closet with tools of a Machinist."
- req_access = list(ACCESS_ENGINE)
- icon_state = "eng_secure"
-
-/obj/structure/closet/secure_closet/collignes
- name = "\proper hunter colligne's locker"
- desc = "The posessions of the Hunter Colligne aboard the vessel."
- req_access = list(ACCESS_HOP)
- icon_state = "hop"
/obj/structure/closet/secure_closet/montagnes
- name = "\proper hunter montagne's locker"
+ name = "\proper Hunter Montagnes Locker"
desc = "The posessions of the owning Hunter Montagnes."
req_access = list(ACCESS_HOS)
icon_state = "hos"
diff --git a/code/game/area/areas/ruins/beachplanet.dm b/code/game/area/areas/ruins/beachplanet.dm
index d33825e0087e..919d2602a3d3 100644
--- a/code/game/area/areas/ruins/beachplanet.dm
+++ b/code/game/area/areas/ruins/beachplanet.dm
@@ -1,3 +1,4 @@
+
//tropical ruins here
//Beachside Town
@@ -23,6 +24,12 @@
/area/ruin/beach/oceantown/house
+//Knight's Rest
+
+/area/ruin/beachplanet/knight
+ name = "Knight's Rest"
+ icon_state = "dkyellow"
+
//Ancient Complex
/area/ruin/beach/complex //seems quite simple to me
@@ -51,6 +58,12 @@
/area/ruin/beach/piratecrash/storage
name = "Scrap Hut"
+//beach_crashed_starwalker
+
+/area/ruin/beach/starwalker
+ name = "Crashed Pirate Ship"
+ icon_state = "green"
+
//beach_treasure_cove, the beeginning
/area/ruin/beach/treasure_cove
diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm
index 8e614c8a0e79..d2c8d1ca61f6 100644
--- a/code/game/area/areas/ruins/icemoon.dm
+++ b/code/game/area/areas/ruins/icemoon.dm
@@ -1,5 +1,21 @@
// Icemoon Ruins
+//Buried Library
+
+/area/ruin/unpowered/buried_library
+ name = "Buried Library"
+ icon_state = "dk_yellow"
+
+//Bathhouse
+
+/area/ruin/powered/bathhouse
+ name = "Bath House"
+ icon_state = "dk_yellow"
+ mood_bonus = 10
+ mood_message = "I wish I could stay here forever.\n"
+
+//corporate rejects
+
//Corporate Rejects
/area/ruin/unpowered/corprejectrooms
diff --git a/code/game/area/areas/ruins/jungle.dm b/code/game/area/areas/ruins/jungle.dm
index 2d2fc76f97b1..09d0e95f2f36 100644
--- a/code/game/area/areas/ruins/jungle.dm
+++ b/code/game/area/areas/ruins/jungle.dm
@@ -1,3 +1,10 @@
+//Thneed Factory
+
+/area/ruin/jungle/onceler/main
+ requires_power = FALSE
+ name = "Thneed Factory"
+ icon_state = "engine"
+
//Interceptor Crash Site
/area/ruin/jungle/interceptor/crashsite
@@ -82,6 +89,10 @@
name = "cargo dump"
icon_state = "dk_yellow"
+/area/ruin/jungle/roommates/shack
+ name = "clown and mime hideout"
+ icon_state = "crew_quarters"
+
// Bombed Syndicate Starport
/area/ruin/jungle/starport
name = "Bombed Air Base"
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index 317fd67a67b8..c4d3f75f8fb7 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -1,5 +1,10 @@
//Lavaland Ruins
+// Beach
+
+/area/ruin/powered/beach
+ icon_state = "dk_yellow"
+
// Winter Biodome
/area/ruin/unpowered/winter_biodome
@@ -21,6 +26,17 @@
/area/ruin/unpowered/winter_biodome/sauna
name = "Biodome Sauna"
+//Gluttony
+
+/area/ruin/powered/gluttony
+ icon_state = "dk_yellow"
+
+//Golem Ship
+
+/area/ruin/powered/golem_ship
+ name = "Free Golem Ship"
+ icon_state = "dk_yellow"
+
//Hierophant Arena
/area/ruin/unpowered/hierophant
@@ -38,71 +54,66 @@
name = "Elephant Graveyard"
icon_state = "green"
-//Lava Canyon
+//Syndicate Comms Outpost
-/area/ruin/unpowered/scorched_hut
- name = "Scorched Hut"
- icon_state = "red"
+/area/ruin/unpowered/syndicate_outpost
+ name = "Syndicate Comm Outpost"
+ icon_state = "dk_yellow"
-// Wrecked Factory
-/area/ruin/lavaland/factory/warehouse
- name = "Factory Warehouse"
- icon_state = "cargo_warehouse"
- requires_power = FALSE
+//Xeno Nest
-/area/ruin/lavaland/factory/foreman_office
- name = "Foreman's Office"
- icon_state = "purple"
- requires_power = FALSE
+/area/ruin/unpowered/xenonest
+ name = "The Hive"
+ always_unpowered = TRUE
+ power_environ = FALSE
+ power_equip = FALSE
+ power_light = FALSE
+ poweralm = FALSE
-/area/ruin/lavaland/factory/adminstrative
- name = "Adminstrative Wing"
- icon_state = "bridge_hallway"
- requires_power = FALSE
+// Crashed Pinnance
-/area/ruin/lavaland/factory/manager_office
- name ="Manager's Office"
- icon_state = "bridge"
- requires_power = FALSE
+/area/ruin/unpowered/crashsite
+ name = "Crash Site"
+ icon_state = "green"
+
+/area/ruin/unpowered/crashsite/pinnance
+ name = "Pinnace Wreckage"
+ icon_state = "dk_yellow"
+ always_unpowered = TRUE
-/area/ruin/lavaland/factory/lobby
- name ="Lobby"
- icon_state = "hallC"
- requires_power = FALSE
+/area/ruin/unpowered/codelab
+ name = "Nanotrasen Genetic Research Facility"
+ icon_state = "bluenew"
-/area/ruin/lavaland/factory/dorms
- name ="Dormitory"
- icon_state = "crew_quarters"
- requires_power = FALSE
-//Buried Shrine
+/area/ruin/unpowered/codelab/exterior
+ name = "Nanotrasen Genetic Research Facility Exterior"
-/area/ruin/unpowered/buried_shrine
- name = "Buried Shrine"
- icon_state = "red"
+/area/ruin/unpowered/codelab/reception
+ name = "Nanotrasen Genetic Research Reception"
+ icon_state = "green"
-//Crashed Starwalker
+/area/ruin/unpowered/codelab/subjectrooms
+ name = "Nanotrasen Genetic Research Test Subject Storage"
+ icon_state = "Sleep"
-/area/ruin/unpowered/crashed_starwalker
- name = "Crashed Pirate Ship"
-// Abandoned Listening Post
+/area/ruin/unpowered/codelab/storage
+ name = "Nanotrasen Genetic Research Storage"
+ icon_state = "cargo_bay"
-/area/ruin/unpowered/listening_post
- name = "Listening Post Lobby"
- icon_state = "yellow"
+/area/ruin/unpowered/codelab/laboratory
+ name = "Nanotrasen Genetic Research Laboratory"
+ icon_state = "bridge"
-/area/ruin/unpowered/listening_post/commons
- name = "Listening Post Commons"
- icon_state = "green"
+/area/ruin/unpowered/codelab/maintenance
+ name = "Nanotrasen Genetic Research Maintenance"
+ icon_state = "dk_yellow"
-/area/ruin/unpowered/listening_post/canteen
- name = "Listening Post Canteen"
- icon_state = "purple"
+/area/ruin/unpowered/scorched_hut
+ name = "Scorched Hut"
+ icon_state = "red"
-/area/ruin/unpowered/listening_post/operations
- name = "Listening Post Operations"
- icon_state = "hallC"
+/area/ruin/unpowered/buried_shrine
+ name = "Buried Shrine"
+ icon_state = "red"
-/area/ruin/unpowered/listening_post/engineering
- name = "Listening Post Engineering"
- icon_state = "dk_yellow"
diff --git a/code/game/area/areas/ruins/rockplanet.dm b/code/game/area/areas/ruins/rockplanet.dm
index 1b9f89a46ff8..ddbe80529771 100644
--- a/code/game/area/areas/ruins/rockplanet.dm
+++ b/code/game/area/areas/ruins/rockplanet.dm
@@ -2,6 +2,11 @@
/area/ruin/rockplanet
icon_state = "red"
+//syndicate
+/area/ruin/rockplanet/syndicate
+ name = "Abandoned Syndicate Mining Facility"
+ icon_state = "green"
+
//budgetcuts
/area/ruin/rockplanet/nanotrasen
name = "Abandoned Research Facility"
@@ -32,29 +37,3 @@
name = "Abandoned Crash Site"
always_unpowered = FALSE
icon_state = "red"
-
-//distillery
-
-/area/ruin/rockplanet/distillery
- name = "Distillery"
- icon_state = "red"
-
-/area/ruin/rockplanet/distillery/saloon
- name = "Saloon"
- icon_state = "bar"
-
-/area/ruin/rockplanet/distillery/shuttle
- name = "Frontiersman Pod"
- icon_state = "shuttle"
-
-/area/ruin/rockplanet/distillery/crew
- name = "Crew Area"
- icon_state = "crew_quarters"
-
-/area/ruin/rockplanet/distillery/engineering
- name = "Engineering"
- icon_state = "engine"
-
-/area/ruin/rockplanet/distillery/office
- name = "Office"
- icon_state = "vacant_office"
diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm
index 45a9113d86ba..de546d164c96 100644
--- a/code/game/area/areas/ruins/space.dm
+++ b/code/game/area/areas/ruins/space.dm
@@ -11,12 +11,29 @@
requires_power = FALSE
/////////////
+
+/area/ruin/space/way_home
+ name = "\improper Salvation"
+ icon_state = "away"
+ always_unpowered = FALSE
+
// Onehalf Ruin
/area/ruin/space/has_grav/onehalf
name = "Station Fragment"
icon_state = "away"
+//Dinner For Two
+
+/area/ruin/space/has_grav/powered/dinner_for_two
+ name = "Dinner for Two"
+
+//Aesthetic
+
+/area/ruin/space/has_grav/powered/aesthetic
+ name = "Aesthetic"
+ ambientsounds = list('sound/ambience/ambivapor1.ogg')
+
//Ruin of Derelict Oupost
/area/ruin/space/has_grav/derelictoutpost
@@ -39,6 +56,210 @@
name = "Derelict Outpost Docked Ship"
icon_state = "red"
+//Ruin of Deep Storage
+
+/area/ruin/space/has_grav/deepstorage
+ name = "Deep Storage"
+ icon_state = "storage"
+
+/area/ruin/space/has_grav/deepstorage/airlock
+ name = "Deep Storage Airlock"
+ icon_state = "quart"
+
+/area/ruin/space/has_grav/deepstorage/power
+ name = "Deep Storage Power and Atmospherics Room"
+ icon_state = "engi_storage"
+
+/area/ruin/space/has_grav/deepstorage/hydroponics
+ name = "Deep Storage Hydroponics"
+ icon_state = "garden"
+
+/area/ruin/space/has_grav/deepstorage/armory
+ name = "Deep Storage Secure Storage"
+ icon_state = "armory"
+
+/area/ruin/space/has_grav/deepstorage/storage
+ name = "Deep Storage Storage"
+ icon_state = "storage_wing"
+
+/area/ruin/space/has_grav/deepstorage/dorm
+ name = "Deep Storage Dormitory"
+ icon_state = "crew_quarters"
+
+/area/ruin/space/has_grav/deepstorage/kitchen
+ name = "Deep Storage Kitchen"
+ icon_state = "kitchen"
+
+/area/ruin/space/has_grav/deepstorage/crusher
+ name = "Deep Storage Recycler"
+ icon_state = "storage"
+
+//DERELICT
+
+/area/ruin/space/derelict
+ name = "Derelict Station"
+ icon_state = "storage"
+
+/area/ruin/space/derelict/hallway/primary
+ name = "Derelict Primary Hallway"
+ icon_state = "hallP"
+
+/area/ruin/space/derelict/hallway/secondary
+ name = "Derelict Secondary Hallway"
+ icon_state = "hallS"
+
+/area/ruin/space/derelict/hallway/primary/port
+ name = "Derelict Port Hallway"
+ icon_state = "hallFP"
+
+/area/ruin/space/derelict/arrival
+ name = "Derelict Arrival Centre"
+ icon_state = "yellow"
+
+/area/ruin/space/derelict/storage/equipment
+ name = "Derelict Equipment Storage"
+
+/area/ruin/space/derelict/bridge
+ name = "Derelict Control Room"
+ icon_state = "bridge"
+
+/area/ruin/space/derelict/bridge/access
+ name = "Derelict Control Room Access"
+ icon_state = "auxstorage"
+
+/area/ruin/space/derelict/bridge/ai_upload
+ name = "Derelict Computer Core"
+ icon_state = "ai"
+
+/area/ruin/space/derelict/solar_control
+ name = "Derelict Solar Control"
+ icon_state = "engine"
+
+/area/ruin/space/derelict/se_solar
+ name = "South East Solars"
+ icon_state = "engine"
+
+/area/ruin/space/derelict/medical
+ name = "Derelict Medbay"
+ icon_state = "medbay"
+
+/area/ruin/space/derelict/medical/chapel
+ name = "Derelict Chapel"
+ icon_state = "chapel"
+
+/area/solar/derelict_starboard
+ name = "Derelict Starboard Solar Array"
+ icon_state = "panelsS"
+
+/area/solar/derelict_aft
+ name = "Derelict Aft Solar Array"
+ icon_state = "yellow"
+
+/area/ruin/space/derelict/singularity_engine
+ name = "Derelict Singularity Engine"
+ icon_state = "engine"
+
+/area/ruin/space/derelict/gravity_generator
+ name = "Derelict Gravity Generator Room"
+ icon_state = "red"
+
+/area/ruin/space/derelict/atmospherics
+ name = "Derelict Atmospherics"
+ icon_state = "red"
+
+//OLD AI SAT
+
+/area/tcommsat/oldaisat
+ name = "Abandoned Satellite"
+ icon_state = "tcomsatcham"
+
+//ABANDONED BOX WHITESHIP
+
+/area/ruin/space/has_grav/whiteship/box
+
+ name = "Abandoned Ship"
+ icon_state = "red"
+
+
+//SYNDICATE LISTENING POST STATION
+
+/area/ruin/space/has_grav/listeningstation
+ name = "Listening Post"
+ icon_state = "yellow"
+
+/area/ruin/space/has_grav/powered/ancient_shuttle
+ name = "Ancient Shuttle"
+ icon_state = "yellow"
+
+//HELL'S FACTORY OPERATING FACILITY
+
+/area/ruin/space/has_grav/hellfactory
+ name = "Hell Factory"
+ icon_state = "yellow"
+
+/area/ruin/space/has_grav/hellfactoryoffice
+ name = "Hell Factory Office"
+ icon_state = "red"
+ area_flags = VALID_TERRITORY | BLOBS_ALLOWED | NOTELEPORT
+
+//Ruin of Transport 18
+
+/area/ruin/space/has_grav/transport18fore
+ name = "Booze Cruise Fore"
+ icon_state = "crew_quarters"
+
+/area/ruin/space/has_grav/transport18mid
+ name = "Booze Cruise Hold"
+ icon_state = "cargo_bay"
+
+/area/ruin/space/transport18aft
+ name = "Booze Cruise Aft"
+ icon_state = "engine"
+
+//Ruin of the rad ship. It's pretty rad.
+
+/area/ruin/space/has_grav/radship/Cargo1
+ name = "Cargo Bay 1"
+ icon_state = "cargo_bay"
+
+/area/ruin/space/has_grav/radship/Cargo2
+ name = "Cargo Bay 2"
+ icon_state = "cargo_bay"
+
+/area/ruin/space/has_grav/radship/Cargo3
+ name = "Cargo Bay 3"
+ icon_state = "cargo_bay"
+
+/area/ruin/space/has_grav/radship/Cargo4
+ name = "Cargo Bay 4"
+ icon_state = "cargo_bay"
+
+/area/ruin/space/has_grav/radship/EngineRoom
+ name = "Engine Room"
+ icon_state = "yellow"
+
+/area/ruin/space/has_grav/radship/Engineering
+ name = "Engineering"
+ icon_state = "engine"
+
+/area/ruin/space/has_grav/radship/MethLab
+ name = "Storage"
+ icon_state = "red"
+
+/area/ruin/space/has_grav/radship/CrewQuarters
+ name = "Crew Quarters"
+ icon_state = "green"
+
+/area/ruin/space/has_grav/radship/Hallway
+ name = "Hallway"
+ icon_state = "away"
+
+//MACSPACE
+
+/area/ruin/space/has_grav/powered/macspace
+ name = "Mac Space Restaurant"
+ icon_state = "yellow"
+
//POWER PUZZLE
/area/ruin/space/has_grav/powerpuzzle
@@ -53,6 +274,20 @@
name = "Engineering Wing"
icon_state = "yellow"
+//scav_mining
+
+/area/ruin/space/has_grav/scav_mining/entrance
+ name = "Asteroid mine entrance"
+ icon_state = "red"
+
+/area/ruin/space/has_grav/scav_mining/core
+ name = "Asteroid mine core"
+ icon_state = "yellow"
+
+/area/ruin/space/has_grav/scav_mining/dorm
+ name = "Asteroid mine dorm"
+ icon_state = "blue"
+
//astraeus
/area/ruin/space/has_grav/astraeus/hallway
@@ -79,6 +314,44 @@
name = "Custodial Closet"
icon_state = "green"
+/area/ruin/space/has_grav/glade
+ name = "\improper Dark Glade"
+ icon_state = "away"
+ always_unpowered = FALSE
+
+//Syndie battle sphere
+
+/area/ruin/space/has_grav/syndicircle/halls
+ name = "Syndicate Battle Sphere Primary Hallway"
+ icon_state = "dk_yellow"
+ color = "#a5131388"
+
+/area/ruin/space/has_grav/syndicircle/spacewalk
+ name = "Syndicate Battle Sphere Shuttle Launch Site"
+ icon_state = "dk_yellow"
+ color = "#663cb488"
+
+/area/ruin/space/has_grav/syndicircle/research
+ name = "Syndicate Battle Sphere Laboratory"
+ icon_state = "dk_yellow"
+ color = "#228a2b88"
+
+/area/ruin/space/has_grav/syndicircle/escape
+ name = "Syndicate Battle Sphere Escape Shuttle"
+ icon_state = "dk_yellow"
+ color = "#92bb3388"
+
+/area/ruin/space/has_grav/syndicircle/winter
+ name = "Syndicate Battle Sphere Snow Outpost"
+ icon_state = "dk_yellow"
+ color = "#4341c488"
+
+/area/ruin/space/has_grav/syndicircle/training
+ name = "Syndicate Battle Sphere Training Grounds"
+ icon_state = "dk_yellow"
+ color = "#26773a88"
+
+
//Singularity Lab
/area/ruin/space/has_grav/singularitylab
diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm
index 6060367ca51b..a9d7220bd3ca 100644
--- a/code/game/area/areas/shuttles.dm
+++ b/code/game/area/areas/shuttles.dm
@@ -189,3 +189,27 @@
/area/shuttle/syndicate_scout
name = "Syndicate Scout"
+
+/area/shuttle/caravan
+ requires_power = TRUE
+
+/area/shuttle/caravan/syndicate1
+ name = "Syndicate Fighter"
+
+/area/shuttle/caravan/syndicate2
+ name = "Syndicate Fighter"
+
+/area/shuttle/caravan/syndicate3
+ name = "Syndicate Drop Ship"
+
+/area/shuttle/caravan/pirate
+ name = "Pirate Cutter"
+
+/area/shuttle/caravan/freighter1
+ name = "Small Freighter"
+
+/area/shuttle/caravan/freighter2
+ name = "Tiny Freighter"
+
+/area/shuttle/caravan/freighter3
+ name = "Tiny Freighter"
diff --git a/code/game/area/ship_areas.dm b/code/game/area/ship_areas.dm
index 9732893523b7..5f4e75b71d4d 100644
--- a/code/game/area/ship_areas.dm
+++ b/code/game/area/ship_areas.dm
@@ -171,19 +171,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/ship/crew/dorm/dormfive
name = "Dormitory 5"
-/area/ship/crew/dorm/captain
- name = "Captain's Quarters"
-
/area/ship/crew/toilet
name = "Restroom"
icon_state = "toilet"
-/area/ship/crew/toilet/two
- name = "Restroom 2"
-
-/area/ship/crew/toilet/three
- name = "Restroom 3"
-
/area/ship/crew/canteen
name = "Canteen"
icon_state = "cafeteria"
@@ -207,7 +198,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Chapel Office"
icon_state = "chapeloffice"
sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
-
/area/ship/crew/library
name = "Library"
icon_state = "library"
@@ -230,13 +220,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "vacant_office"
sound_environment = SOUND_AREA_WOODFLOOR
-/area/ship/crew/office/lobby
- name = "Lobby"
-
-/area/ship/crew/ccommons
- name = "Commons"
- icon_state = "vacant_office"
-
/area/ship/crew/janitor
name = "Custodial Closet"
icon_state = "janitor"
@@ -261,9 +244,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "morgue"
ambientsounds = SPOOKY
-/area/ship/medical/psych
- name = "Psych's Office"
-
/// Science Lab ///
/area/ship/science
name = "Science Lab"
@@ -464,12 +444,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "storage"
sound_environment = SOUND_AREA_STANDARD_STATION
-/area/ship/storage/port
- name = "Port Storage Bay"
-
-/area/ship/storage/starboard
- name = "Starboard Storage Bay"
-
/area/ship/storage/eva
name = "EVA Storage"
icon_state = "eva"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 80db6272f2fd..7ffa3255ada1 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1265,71 +1265,25 @@
* Must return parent proc ..() in the end if overridden
*/
/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type)
- var/signal_result
-
- var/list/processing_recipes = list() //List of recipes that can be mutated by sending the signal
- signal_result = SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(tool_type), user, I, processing_recipes)
- if(processing_recipes.len)
- process_recipes(user, I, processing_recipes)
- if(QDELETED(I))
- return TRUE
switch(tool_type)
if(TOOL_CROWBAR)
- . = crowbar_act(user, I)
+ . |= crowbar_act(user, I)
if(TOOL_MULTITOOL)
- . = multitool_act(user, I)
+ . |= multitool_act(user, I)
if(TOOL_SCREWDRIVER)
- . = screwdriver_act(user, I)
+ . |= screwdriver_act(user, I)
if(TOOL_WRENCH)
- . = wrench_act(user, I)
+ . |= wrench_act(user, I)
if(TOOL_WIRECUTTER)
- . = wirecutter_act(user, I)
+ . |= wirecutter_act(user, I)
if(TOOL_WELDER)
- . = welder_act(user, I)
+ . |= welder_act(user, I)
if(TOOL_ANALYZER)
- . = analyzer_act(user, I)
- if(. || signal_result & COMPONENT_BLOCK_TOOL_ATTACK) //Either the proc or the signal handled the tool's events in some way.
+ . |= analyzer_act(user, I)
+ if(. & COMPONENT_BLOCK_TOOL_ATTACK)
return TRUE
-/atom/proc/process_recipes(mob/living/user, obj/item/I, list/processing_recipes)
- //Only one recipe? use the first
- if(processing_recipes.len == 1)
- StartProcessingAtom(user, I, processing_recipes[1])
- return
- //Otherwise, select one with a radial
- ShowProcessingGui(user, I, processing_recipes)
-
-///Creates the radial and processes the selected option
-/atom/proc/ShowProcessingGui(mob/living/user, obj/item/I, list/possible_options)
- var/list/choices_to_options = list() //Dict of object name | dict of object processing settings
- var/list/choices = list()
-
- for(var/i in possible_options)
- var/list/current_option = i
- var/atom/current_option_type = current_option[TOOL_PROCESSING_RESULT]
- choices_to_options[initial(current_option_type.name)] = current_option
- var/image/option_image = image(icon = initial(current_option_type.icon), icon_state = initial(current_option_type.icon_state))
- choices += list("[initial(current_option_type.name)]" = option_image)
-
- var/pick = show_radial_menu(user, src, choices, radius = 36, require_near = TRUE)
-
- StartProcessingAtom(user, I, choices_to_options[pick])
-
-
-/atom/proc/StartProcessingAtom(mob/living/user, obj/item/I, list/chosen_option)
- to_chat(user, "You start working on [src]")
- if(I.use_tool(src, user, chosen_option[TOOL_PROCESSING_TIME], volume=50))
- var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT]
- for(var/i = 1 to chosen_option[TOOL_PROCESSING_AMOUNT])
- new atom_to_create(loc)
- to_chat(user, "You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.name)] from [src]")
- qdel(src)
- return
-
-/atom/proc/OnCreatedFromProcessing(mob/living/user, obj/item/I, list/chosen_option, atom/original_atom)
- return
-
-//! Tool-specific behavior procs.
+//! Tool-specific behavior procs. They send signals, so try to call ..()
///
///Crowbar act
@@ -1633,15 +1587,6 @@
if(istype(ship))
var/obj/docking_port/mobile/shuttle = ship.mobile_port
if(shuttle)
- if(istype(shuttle.docked, /obj/docking_port/stationary))
- var/obj/docking_port/stationary/shipfinder = shuttle.docked
- if(shipfinder.owner_ship)
- for(var/datum/weakref/weakref as anything in shipfinder.owner_ship.gravgen_list)
- var/obj/machinery/power/ship_gravity/SG = weakref.resolve()
- if(!SG)
- shipfinder.owner_ship.gravgen_list -= weakref
- continue
- max_grav = max(SG.active,max_grav)
for(var/datum/weakref/weakref as anything in shuttle.gravgen_list)
var/obj/machinery/power/ship_gravity/SG = weakref.resolve()
if(!SG)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index f7ce7b036eb5..e6f4f882a401 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -16,6 +16,8 @@
if(!istype(M))
return FALSE
if(M.mind)
+ if(ishuman(M) && (M.mind.holy_role))
+ return FALSE
if(specific_cult && specific_cult.is_sacrifice_target(M.mind))
return FALSE
if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to))
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 85ab6ee64a14..992f97ba700b 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -118,7 +118,7 @@
ears = /obj/item/radio/headset/syndicate/alt
l_pocket = /obj/item/modular_computer/tablet/nukeops
id = /obj/item/card/id/syndicate
- belt = /obj/item/gun/ballistic/automatic/pistol/syndicate
+ belt = /obj/item/gun/ballistic/automatic/pistol
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
/obj/item/kitchen/knife/combat/survival)
@@ -168,7 +168,7 @@
r_hand = /obj/item/gun/ballistic/shotgun/bulldog
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
/obj/item/tank/jetpack/oxygen/harness=1,\
- /obj/item/gun/ballistic/automatic/pistol/syndicate=1,\
+ /obj/item/gun/ballistic/automatic/pistol=1,\
/obj/item/kitchen/knife/combat/survival)
diff --git a/code/game/machinery/beacon.dm b/code/game/machinery/Beacon.dm
similarity index 100%
rename from code/game/machinery/beacon.dm
rename to code/game/machinery/Beacon.dm
diff --git a/code/game/machinery/sleeper.dm b/code/game/machinery/Sleeper.dm
similarity index 100%
rename from code/game/machinery/sleeper.dm
rename to code/game/machinery/Sleeper.dm
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 3e3939620f3c..4cddf93b2478 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -436,7 +436,6 @@ Class Procs:
for(var/obj/item/I in component_parts)
I.forceMove(loc)
component_parts.Cut()
- SEND_SIGNAL(src, COMSIG_OBJ_DECONSTRUCT, disassembled)
qdel(src)
/**
diff --git a/code/game/machinery/bounty_board.dm b/code/game/machinery/bounty_board.dm
index 4cc3413fe9d9..b0991110e80d 100644
--- a/code/game/machinery/bounty_board.dm
+++ b/code/game/machinery/bounty_board.dm
@@ -33,8 +33,8 @@ GLOBAL_LIST_EMPTY(request_list)
/obj/machinery/bounty_board/attackby(obj/item/I, mob/living/user, params)
. = ..()
- if(istype(I,/obj/item/card/bank))
- var/obj/item/card/bank/current_card = I
+ if(istype(I,/obj/item/card/id))
+ var/obj/item/card/id/current_card = I
if(current_card.registered_account)
current_user = current_card.registered_account
return TRUE
@@ -72,9 +72,9 @@ GLOBAL_LIST_EMPTY(request_list)
if(request.applicants)
for(var/datum/bank_account/j in request.applicants)
formatted_applicants += list(list("name" = j.account_holder, "request_id" = request.owner_account.account_id, "requestee_id" = j.account_id))
- var/obj/item/card/bank/bank_card = user.get_bankcard()
- if(bank_card?.registered_account)
- current_user = bank_card.registered_account
+ var/obj/item/card/id/id_card = user.get_idcard()
+ if(id_card?.registered_account)
+ current_user = id_card.registered_account
if(current_user)
data["accountName"] = current_user.account_holder
data["requests"] = formatted_requests
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 3916ad0d4b00..0fe059653d5c 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -534,7 +534,9 @@
if(ishuman(mob_occupant))
dna = C.has_dna()
- has_bank_account = C.get_bank_account()
+ var/obj/item/card/id/I = C.get_idcard(TRUE)
+ if(I)
+ has_bank_account = I.registered_account
if(isbrain(mob_occupant))
dna = B.stored_dna
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 1ab88896accb..81cb1908ce89 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -104,7 +104,7 @@
if(!welded && !operating && !(machine_stat & NOPOWER) && (!density || allow_hand_open(user)))
user.visible_message("[user] tries to open \the [src] manually.",
"You operate the manual lever on \the [src].")
- if (!do_after(user, 30, src))
+ if (!do_after(user, 30, TRUE, src))
return FALSE
add_fingerprint(user)
if(density)
@@ -174,7 +174,7 @@
if(is_holding_pressure())
// tell the user that this is a bad idea, and have a do_after as well
to_chat(user, "As you begin crowbarring \the [src] a gush of air blows in your face... maybe you should reconsider?")
- if(!do_after(user, 20, src)) // give them a few seconds to reconsider their decision.
+ if(!do_after(user, 20, TRUE, src)) // give them a few seconds to reconsider their decision.
return
log_game("[key_name(user)] has opened a firelock with a pressure difference at [AREACOORD(loc)]")
user.log_message("has opened a firelock with a pressure difference at [AREACOORD(loc)]", LOG_ATTACK)
diff --git a/code/game/machinery/drone_dispenser.dm b/code/game/machinery/droneDispenser.dm
similarity index 100%
rename from code/game/machinery/drone_dispenser.dm
rename to code/game/machinery/droneDispenser.dm
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 0e6bc6ed6a6d..60ded054842a 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -451,7 +451,11 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/proc/SetLightsAndPower()
var/total_users = LAZYLEN(masters) + LAZYLEN(holo_calls)
- //active_power_usage = initial(active_power_usage) * total_users
+ if(total_users > 0)
+ set_active_power()
+ else
+ set_idle_power()
+ active_power_usage = initial(active_power_usage) * total_users
if(total_users || replay_mode)
set_light(2)
else
diff --git a/code/game/machinery/outpost_electrolyzer.dm b/code/game/machinery/outpost_electrolyzer.dm
deleted file mode 100644
index 29a37c4f95e8..000000000000
--- a/code/game/machinery/outpost_electrolyzer.dm
+++ /dev/null
@@ -1,536 +0,0 @@
-//allows production of hydrogen from ice chunks
-#define MOLS_PER_ICE 50 //1 ice = 50 mols
-#define MOLS_PER_MERIT 10 //10 mols = 1 merit
-#define MERITS_PER_ICE MOLS_PER_ICE / MOLS_PER_MERIT //1 ice = 5 merits
-#define MERITS_USED_PER_TICK 2
-#define H2_PUMP_SHUTOFF_PRESSURE 4000
-#define CREDITS_TO_MERITS 4 // currently 2:5 credits to mols hydrogen. # of credits per merit
-#define OUTPOST_HYDROGEN_CUT 0.8
-#define HYDROGEN_IDEAL 45000 //used for high and low end of merit multiplier
-#define MERIT_EXPONENT 0.95 //used for diminishing returns, values closer to 1 increase returns, lower decrease.
-
-/obj/machinery/mineral/electrolyzer_unloader
- name = "ice unloading machine"
- icon = 'icons/obj/machines/mining_machines.dmi'
- icon_state = "unloader"
- density = TRUE
- input_dir = WEST
- output_dir = EAST
- needs_item_input = TRUE
- processing_flags = START_PROCESSING_MANUALLY
-
-/obj/machinery/mineral/electrolyzer_unloader/pickup_item(datum/source, atom/movable/target, atom/oldLoc)
- if(istype(target, /obj/structure/ore_box))
- var/obj/structure/ore_box/box = target
- for(var/obj/item/stack/ore/ice/chunk in box)
- unload_mineral(chunk)
- else if(istype(target, /obj/item/stack/ore/ice))
- var/obj/item/stack/ore/chunk = target
- unload_mineral(chunk)
-
-// electrolyzer + console
-
-/obj/machinery/computer/electrolyzer_console
- name = "electrolyzer console"
- desc = "Deposits hydrogen merits, with 20% going to outpost upkeep."
- icon = 'icons/obj/machines/mining_machines.dmi'
- icon_state = "console"
-
- var/obj/machinery/mineral/electrolyzer/linked_electrolyzer
-
-/obj/machinery/computer/electrolyzer_console/Initialize()
- . = ..()
- find_electrolyzer()
-
-/obj/machinery/computer/electrolyzer_console/proc/find_electrolyzer()
- for(var/obj/machinery/mineral/electrolyzer/potential in oview(3,src))
- if(linked_electrolyzer == null)
- linked_electrolyzer = potential
- potential.linked_console = src
-
-/obj/machinery/computer/electrolyzer_console/proc/electrolyze_item(obj/item/I)
- var/obj/item/stack/ore/ice/S = I
- var/meritval = round(S.get_amount() * MERITS_PER_ICE * OUTPOST_HYDROGEN_CUT,1) // causes a bit of surplus in the "outpost" supply, even if they use all of these merits for hydrogen.
- GLOB.hydrogen_stored += S.get_amount() * MOLS_PER_ICE
- new /obj/item/merit/bundle(drop_location(), meritval)
- qdel(I)
- playsound(src, 'sound/items/poster_being_created.ogg', 20, FALSE)
-
-/obj/machinery/computer/electrolyzer_console/attackby(item,mob/user)
- if(istype(item, /obj/item/multitool))
- var/obj/item/multitool/multi = item
- if(istype(multi.buffer, /obj/machinery/mineral/electrolyzer))
- linked_electrolyzer = multi.buffer
- visible_message("Linked to [linked_electrolyzer]!")
- return
- return ..()
-
-/obj/machinery/mineral/electrolyzer
- name = "ice crusher"
- desc = "Breaks down ice into hydrogen and oxygen."
- icon = 'icons/obj/recycling.dmi'
- icon_state = "grinder-o1"
- input_dir = WEST
- density = TRUE
- use_power = IDLE_POWER_USE
- idle_power_usage = 50
- active_power_usage = 1000
- max_integrity = 500
- var/crush_damage = 1000
- var/obj/machinery/computer/electrolyzer_console/linked_console
- var/datum/weakref/attached_output
-
-/obj/machinery/mineral/electrolyzer/Initialize()
- . = ..()
- update_appearance()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/machinery/computer/electrolyzer_console/attackby(item,mob/user)
- if(istype(item, /obj/item/multitool))
- var/obj/item/multitool/multi = item
- multi.buffer = src
- to_chat(user, "[src] stored in [multi].")
- return
- return ..()
-
-/obj/machinery/mineral/electrolyzer/CanAllowThrough(atom/movable/mover, border_dir)
- . = ..()
- if(!anchored)
- return
- if(border_dir == input_dir)
- return TRUE
-
-/obj/machinery/mineral/electrolyzer/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- INVOKE_ASYNC(src, PROC_REF(electrolyze), AM)
-
-/obj/machinery/mineral/electrolyzer/proc/electrolyze(atom/movable/electrolyze_target, sound=TRUE)
- if(istype(electrolyze_target, /obj/effect) || !linked_console || !isturf(electrolyze_target.loc) || (machine_stat & (BROKEN|NOPOWER)))
- return
- if(!istype(electrolyze_target, /obj/item/stack/ore/ice))
- playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE, 1)
- if(isliving(electrolyze_target))
- crush_living(electrolyze_target)
- return
- if(!ismob(electrolyze_target)) //MULCH IT IF IT AINT ICE
- qdel(electrolyze_target)
- return
- else
- linked_console.electrolyze_item(electrolyze_target)
-
-/obj/machinery/mineral/electrolyzer/proc/crush_living(mob/living/L)
-
- L.forceMove(loc)
-
- if(issilicon(L))
- playsound(src, 'sound/items/welder.ogg', 50, TRUE)
- else
- playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
-
- if(iscarbon(L) && L.stat == CONSCIOUS)
- L.emote("scream")
-
- // Instantly lie down, also go unconscious from the pain, before you die.
- L.Unconscious(100)
- L.adjustBruteLoss(crush_damage)
-
-//Hydrogen pump stuff
-
-/obj/machinery/atmospherics/components/unary/hydrogen_pump
- name = "hydrogen pump"
- desc = "Lets you use merits to buy hydrogen."
- icon = 'icons/obj/atmos.dmi'
- icon_state = "hydrogen_pump"
-
- use_power = IDLE_POWER_USE
- idle_power_usage = 50
- active_power_usage = 1000
-
- density = TRUE
- max_integrity = 400
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30)
- layer = OBJ_LAYER
- showpipe = TRUE
- pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
- var/not_processing_bug = TRUE//remove when fixed
- var/merit
-
-/obj/machinery/atmospherics/components/unary/hydrogen_pump/examine(mob/user)
- . = ..()
- if(merit)
- . += "[src] has [merit] merits, equaling [merit * MOLS_PER_MERIT] mols of hydrogen."
- else
- . += "[src] has no merits, get some from the electrolyzer or buy them to get hydrogen!"
- . += "[src] is currently [on ? "on" : "off"], and shuts off above [H2_PUMP_SHUTOFF_PRESSURE] kPa."
- . += "[src] can be Alt-Clicked to eject merits."
- if(not_processing_bug == TRUE)
- . += "[src] is temporarily disabled. Check back later!"
-
-/obj/machinery/atmospherics/components/unary/hydrogen_pump/process_atmos()
- ..()
- var/datum/gas_mixture/air = airs[1] //hydrogen out
- not_processing_bug = FALSE
- if(!on)
- return
- if(!merit || air.return_pressure() > H2_PUMP_SHUTOFF_PRESSURE)
- on = FALSE
- visible_message("[src] shuts off!")
- playsound(src, 'sound/machines/switch2.ogg', 10, FALSE)
- return
- var/meritused
- if(merit >= MERITS_USED_PER_TICK)
- merit -= MERITS_USED_PER_TICK
- meritused = MERITS_USED_PER_TICK
- else
- meritused = merit
- merit = 0
- on = FALSE
- air.adjust_moles(GAS_HYDROGEN, meritused * MOLS_PER_MERIT)
- GLOB.hydrogen_stored -= meritused * MOLS_PER_MERIT
- air.set_temperature(T20C) //hydrogen from adjust_mols takes the temp of the container, and if the container is empty it defaults to 0K. this works for now
-
-/obj/machinery/atmospherics/components/unary/hydrogen_pump/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/merit/bundle))
- var/obj/item/merit/bundle/C = I
- merit += C.value
- to_chat(user, "You deposit [I], for a total of [merit] merits.")
- qdel(I)
- return
- return ..()
-
-/obj/machinery/atmospherics/components/unary/hydrogen_pump/attack_hand(mob/user)
- if(..())
- return
- on = !on
- if(on)
- SSair.start_processing_machine(src)
- playsound(src, 'sound/machines/switch3.ogg', 10, FALSE)
- to_chat(user, "You toggle the pump [on ? "on" : "off"].")
- investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS)
- update_appearance()
-
-/obj/machinery/atmospherics/components/unary/hydrogen_pump/AltClick(mob/user)
- if(merit)
- new /obj/item/merit/bundle(drop_location(), merit)
- merit = FALSE
- playsound(src, 'sound/items/poster_being_created.ogg', 10, FALSE)
- to_chat(user, "You retrieve the hydrogen merits.")
- else
- to_chat(user, "There were no merits left to retrieve.")
-
-
-//Hydrogen exchange
-
-/obj/machinery/computer/hydrogen_exchange
- name = "Hydrogen Exchange"
- desc = "Credits to Merits at reasonable rates!"
- icon_screen = "exchange"
- icon_keyboard = "power_key"
-
- //GLOB.total_merits_exchanged starts at 0
- var/merits = NONE
- var/credits = NONE
-
-/obj/machinery/computer/hydrogen_exchange/attackby(obj/item/I, mob/user)
- var/value = 0
- if(istype(I, /obj/item/spacecash/bundle))
- var/obj/item/spacecash/bundle/C = I
- value = C.value
- else if(istype(I, /obj/item/holochip))
- var/obj/item/holochip/H = I
- value = H.credits
- if(value)
- credits += value
- to_chat(user, "You deposit [I], for a total of [credits] credits.")
- qdel(I)
- return
- if(istype(I, /obj/item/merit/bundle))
- var/obj/item/merit/bundle/C = I
- merits += C.value
- to_chat(user, "You deposit [I], for a total of [merits] merits.")
- qdel(I)
- return
- return ..()
-
-/obj/machinery/computer/hydrogen_exchange/proc/meritmultiplier()
- var/extra = clamp(((GLOB.hydrogen_stored / HYDROGEN_IDEAL) + 1), 0, 2) * 0.3 //results in a number between 0 and .6
- var/actual = round((0.4 + extra), 0.01) //.4 on low end, 1 on high end
- return actual
-
-/obj/machinery/computer/hydrogen_exchange/proc/dispense_funds()
- var/makenoise
- if(merits)
- new /obj/item/merit/bundle(drop_location(), merits)
- merits = 0
- makenoise = TRUE
- if(credits)
- new /obj/item/spacecash/bundle(drop_location(), credits)
- credits = 0
- makenoise = TRUE
- if(makenoise)
- playsound(src, 'sound/machines/coindrop.ogg', 20, FALSE)
-
-/obj/machinery/computer/hydrogen_exchange/proc/resetmerits() //debug proc
- GLOB.total_merits_exchanged = 0
-
-/obj/machinery/computer/hydrogen_exchange/proc/convert_to_credits()
- if(merits)
- playsound(src, 'sound/machines/pda_button1.ogg', 20, FALSE)
- var/oldtotal = GLOB.total_merits_exchanged ** MERIT_EXPONENT
- var/newtotal = (GLOB.total_merits_exchanged + merits) ** MERIT_EXPONENT
- var/reducedmerits = newtotal - oldtotal
- GLOB.total_merits_exchanged += merits
- credits += round(reducedmerits * CREDITS_TO_MERITS, 1)
- merits = 0
- else
- playsound(src, 'sound/machines/buzz-sigh.ogg', 20, FALSE)
-
-/obj/machinery/computer/hydrogen_exchange/proc/convert_to_merits()
- if(credits)
- playsound(src, 'sound/machines/pda_button1.ogg', 20, FALSE)
- merits += round(credits * meritmultiplier() / CREDITS_TO_MERITS, 1)
- credits = 0
- else
- playsound(src, 'sound/machines/buzz-sigh.ogg', 20, FALSE)
-
-/obj/machinery/computer/hydrogen_exchange/AltClick(mob/user)
- dispense_funds()
- to_chat(user, "You force the credits and merits out of the machine.")
-
-/obj/machinery/computer/hydrogen_exchange/ui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "HydrogenExchange", name)
- ui.open()
-
-/obj/machinery/computer/hydrogen_exchange/ui_data(mob/user)
- var/next_merit_rate
- if(GLOB.total_merits_exchanged)
- next_merit_rate = round((GLOB.total_merits_exchanged ** MERIT_EXPONENT) / GLOB.total_merits_exchanged * CREDITS_TO_MERITS, 0.01)
- else
- next_merit_rate = CREDITS_TO_MERITS
- var/list/data = list()
- data["credits"] = credits
- data["merits"] = merits
- data["next_merit_rate"] = next_merit_rate
- data["credits_to_merits"] = CREDITS_TO_MERITS
- data["credit_tax"] = (1 - meritmultiplier()) * 100
- return data
-
-/obj/machinery/computer/hydrogen_exchange/ui_act(action, params)
- . = ..()
- if(.)
- return
-
- switch(action)
- if("convert_to_credits")
- convert_to_credits()
- . = TRUE
- if("convert_to_merits")
- convert_to_merits()
- . = TRUE
- if("dispense")
- dispense_funds()
- . = TRUE
-
-//SCRIP!
-
-/obj/item/merit
- name = "hydrogen?"
- desc = "If you can see this, please make a bug report. If you're a mapper, use the bundle subtype!"
- icon = 'icons/obj/economy.dmi'
- icon_state = "merit0"
- throwforce = 1
- throw_speed = 2
- throw_range = 2
- w_class = WEIGHT_CLASS_TINY
- var/value = 0
- grind_results = list(/datum/reagent/iron = 10)
-
-/obj/item/merit/Initialize(mapload, amount)
- . = ..()
- if(amount)
- value = amount
- update_appearance()
-
-/obj/item/merit/attackby(obj/item/I, mob/user)
- if(!istype(I, /obj/item/merit))
- return
- var/obj/item/merit/bundle/bundle
- if(istype(I, /obj/item/merit/bundle))
- bundle = I
- else
- var/obj/item/merit/cash = I
- bundle = new (loc)
- bundle.value = cash.value
- user.dropItemToGround(cash)
- qdel(cash)
-
- bundle.value += value
- bundle.update_appearance()
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.dropItemToGround(src)
- H.dropItemToGround(bundle)
- H.put_in_hands(bundle)
- to_chat(user, "You add [value] merits worth of money to the bundle. It now holds [bundle.value] merits.")
- qdel(src)
-
-/obj/item/merit/Destroy()
- . = ..()
- value = 0 // Prevents money from be duplicated anytime.//I'll trust eris on this one
-
-/obj/item/merit/bundle
- icon_state = "merit16"
-
-/obj/item/merit/bundle/Initialize()
- . = ..()
- update_appearance()
-
-/obj/item/merit/bundle/update_appearance()
- icon_state = "nothing"
- cut_overlays()
- var/remaining_value = value
- var/iteration = 0
- var/coins_only = TRUE
- var/list/coin_denominations = list(16, 4, 1)
- var/list/banknote_denominations = list(4096, 1024, 256, 64)
- for(var/i in banknote_denominations)
- while(remaining_value >= i && iteration < 50)
- remaining_value -= i
- iteration++
- var/image/banknote = image('icons/obj/economy.dmi', "merit[i]")
- var/matrix/M = matrix()
- M.Translate(rand(-6, 6), rand(-4, 8))
- banknote.transform = M
- overlays += banknote
- coins_only = FALSE
-
- if(remaining_value)
- for(var/i in coin_denominations)
- while(remaining_value >= i && iteration < 50)
- remaining_value -= i
- iteration++
- var/image/coin = image('icons/obj/economy.dmi', "merit[i]")
- var/matrix/M = matrix()
- M.Translate(rand(-6, 6), rand(-4, 8))
- coin.transform = M
- overlays += coin
-
- if(coins_only)
- if(value == 1)
- name = "one hydrogen merit"
- desc = "Heavier then it looks."
- drop_sound = 'sound/items/handling/coin_drop.ogg'
- pickup_sound = 'sound/items/handling/coin_pickup.ogg'
- else
- name = "[value] hydrogen merits"
- desc = "Heavier than they look."
- gender = PLURAL
- drop_sound = 'sound/items/handling/coin_drop.ogg'
- pickup_sound = 'sound/items/handling/coin_pickup.ogg'
- else
- if(value <= 3000)
- name = "[value] hydrogen merits"
- gender = NEUTER
- desc = "Some cold, hard cash."
- drop_sound = 'sound/items/handling/dosh_drop.ogg'
- pickup_sound = 'sound/items/handling/dosh_pickup.ogg'
- else
- name = "[value] hydrogen merit"
- gender = NEUTER
- desc = "That's a lot of dosh."
- drop_sound = 'sound/items/handling/dosh_drop.ogg'
- pickup_sound = 'sound/items/handling/dosh_pickup.ogg'
- return ..()
-
-/obj/item/merit/bundle/attack_self(mob/user)
- var/cashamount = input(user, "How many merits do you want to take? (0 to [value])", "Take Merits", 20) as num
- cashamount = round(clamp(cashamount, 0, value))
- if(!cashamount)
- return
-
- if(!Adjacent(user))
- to_chat(user, "You need to be in arm's reach for that!")
- return
-
- value -= cashamount
- if(!value)
- user.dropItemToGround(src)
- qdel(src)
-
- var/obj/item/merit/bundle/bundle = new (user.loc)
- bundle.value = cashamount
- update_appearance()
-
-/obj/item/merit/bundle/AltClick(mob/living/user)
- var/cashamount = input(user, "How many merits do you want to take? (0 to [value])", "Take Merits", 20) as num
- cashamount = round(clamp(cashamount, 0, value))
- if(!cashamount)
- return
-
- else if(!Adjacent(user))
- to_chat(user, "You need to be in arm's reach for that!")
- return
-
- value -= cashamount
- if(!value)
- user.dropItemToGround(src)
- qdel(src)
-
- var/obj/item/merit/bundle/bundle = new (user.loc)
- bundle.value = cashamount
- bundle.update_appearance()
- user.put_in_hands(bundle)
- update_appearance()
-
-/obj/item/merit/bundle/attack_hand(mob/user)
- if(user.get_inactive_held_item() != src)
- return ..()
- if(value == 0)//may prevent any edge case duping
- qdel(src)
- return
- value--
- user.put_in_hands(new /obj/item/merit/bundle(loc, 1))
- update_appearance()
-
-//bundles for mapping + testing
-
-/obj/item/merit/bundle/m1
- value = 1
- icon_state = "merit1"
-
-/obj/item/merit/bundle/m4
- value = 4
- icon_state = "merit4"
-
-/obj/item/merit/bundle/m16
- value = 16
- icon_state = "merit16"
-
-/obj/item/merit/bundle/m64
- value = 64
- icon_state = "merit64"
-
-/obj/item/merit/bundle/m256
- value = 256
- icon_state = "merit256"
-
-/obj/item/merit/bundle/m1024
- value = 1024
- icon_state = "merit1024"
-
-/obj/item/merit/bundle/m4096
- value = 4096
- icon_state = "merit4096"
-
-#undef MOLS_PER_ICE
-#undef MOLS_PER_MERIT
-#undef MERITS_PER_ICE
-#undef MERITS_USED_PER_TICK
-#undef H2_PUMP_SHUTOFF_PRESSURE
-#undef CREDITS_TO_MERITS
-#undef MERIT_EXPONENT
diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm
index a36bf79a41b3..351f1c42ae5e 100644
--- a/code/game/machinery/roulette_machine.dm
+++ b/code/game/machinery/roulette_machine.dm
@@ -39,7 +39,7 @@
var/chosen_bet_type = "0"
var/last_anti_spam = 0
var/anti_spam_cooldown = 20
- var/obj/item/card/bank/my_card
+ var/obj/item/card/id/my_card
var/playing = FALSE
var/locked = FALSE
var/drop_dir = SOUTH
@@ -81,7 +81,7 @@
data["Spinning"] = playing
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/obj/item/card/bank/C = H.get_bankcard()
+ var/obj/item/card/id/C = H.get_idcard(TRUE)
if(C)
data["AccountBalance"] = C.registered_account.account_balance
else
@@ -114,7 +114,7 @@
return
if(playing)
return ..()
- if(istype(W, /obj/item/card/bank))
+ if(istype(W, /obj/item/card/id))
playsound(src, 'sound/machines/card_slide.ogg', 50, TRUE)
if(machine_stat & MAINT || !on || locked)
@@ -122,7 +122,7 @@
return FALSE
if(my_card)
- var/obj/item/card/bank/player_card = W
+ var/obj/item/card/id/player_card = W
if(player_card.registered_account.account_balance < chosen_bet_amount) //Does the player have enough funds
audible_message("You do not have the funds to play! Lower your bet or get more money.")
playsound(src, 'sound/machines/buzz-two.ogg', 30, TRUE)
@@ -167,7 +167,7 @@
addtimer(CALLBACK(src, PROC_REF(play), user, player_card, chosen_bet_type, chosen_bet_amount, potential_payout), 4) //Animation first
return TRUE
else
- var/obj/item/card/bank/new_card = W
+ var/obj/item/card/id/new_card = W
if(new_card.registered_account)
var/msg = stripped_input(user, "Name of your roulette wheel:", "Roulette Naming", "Roulette Machine")
if(!msg)
@@ -181,7 +181,7 @@
return ..()
///Proc called when player is going to try and play
-/obj/machinery/roulette/proc/play(mob/user, obj/item/card/bank/player_id, bet_type, bet_amount, potential_payout)
+/obj/machinery/roulette/proc/play(mob/user, obj/item/card/id/player_id, bet_type, bet_amount, potential_payout)
var/payout = potential_payout
@@ -203,7 +203,7 @@
playsound(src, 'sound/machines/piston_lower.ogg', 70)
///Ran after a while to check if the player won or not.
-/obj/machinery/roulette/proc/finish_play(obj/item/card/bank/player_id, bet_type, bet_amount, potential_payout, rolled_number)
+/obj/machinery/roulette/proc/finish_play(obj/item/card/id/player_id, bet_type, bet_amount, potential_payout, rolled_number)
last_spin = rolled_number
var/is_winner = check_win(bet_type, bet_amount, rolled_number) //Predetermine if we won
diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm
index d816b16ca7ff..c4fd424d4076 100644
--- a/code/game/machinery/shuttle/shuttle_engine.dm
+++ b/code/game/machinery/shuttle/shuttle_engine.dm
@@ -8,7 +8,6 @@
desc = "A thruster for shuttles."
circuit = /obj/item/circuitboard/machine/shuttle/engine
CanAtmosPass = FALSE //so people can actually tend to their engines
- dir = EAST //most ships face east
///Whether or not the engine is enabled and can be used. Controlled from helm consoles and by hitting with a multitool.
var/enabled = TRUE
///How much thrust this engine generates when burned fully.
diff --git a/code/game/machinery/shuttle/shuttle_engine_types.dm b/code/game/machinery/shuttle/shuttle_engine_types.dm
index 47711bdda3bc..de9992e106d1 100644
--- a/code/game/machinery/shuttle/shuttle_engine_types.dm
+++ b/code/game/machinery/shuttle/shuttle_engine_types.dm
@@ -82,16 +82,9 @@
if(!found.anchored)
continue
attached_heater = WEAKREF(found)
- var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater?.resolve()
- RegisterSignal(resolved_heater, COMSIG_OBJ_DECONSTRUCT, PROC_REF(remove_heater))
update_icon_state()
return TRUE
-/obj/machinery/power/shuttle/engine/fueled/proc/remove_heater(datum/source, disassembled)
- SIGNAL_HANDLER
-
- attached_heater = null
-
/obj/machinery/power/shuttle/engine/fueled/plasma
name = "plasma thruster"
desc = "A thruster that burns plasma from an adjacent heater to create thrust."
@@ -108,90 +101,6 @@
thrust = 15
//All fuel code already handled
-/**
- * ### Combustion/Fire engines
- * Engines that use oxidizer and fuel to output thrust. Theoretically works with any mix of fuels and oxiders. Wish me luck.
-*/
-
-/obj/machinery/power/shuttle/engine/fire
- name = "combustion thruster"
- desc = "A thruster that burns fuel with oxider that is stored in an adjacent heater."
- icon_state = "burst_plasma"
- icon_state_off = "burst_plasma_off"
- circuit = /obj/item/circuitboard/machine/shuttle/engine/fire
-
- idle_power_usage = 0
- ///what portion of the mols in the attached heater to "burn"
- var/fuel_consumption = 0.0125
- //multiplier for thrust
- thrust = 3
- //used by stockparts, efficiency_multiplier
- var/consumption_multiplier = 1
- //If this engine should create heat when burned.
- var/heat_creation = FALSE
- //A weakref of the connected engine heater with fuel.
- var/datum/weakref/attached_heater
-
-
-/obj/machinery/power/shuttle/engine/fire/burn_engine(percentage = 100, deltatime)
- . = ..()
- var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
- if(!resolved_heater)
- return
- if(heat_creation)
- heat_engine()
- var/actual_consumption = fuel_consumption * (percentage / 100) * deltatime * consumption_multiplier
- return resolved_heater.consume_fuel(actual_consumption) * thrust //this proc returns the min of the fuel/oxy possible burns, multiply by our thrust value
-
-/obj/machinery/power/shuttle/engine/fire/return_fuel()
- . = ..()
- var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
- return resolved_heater?.return_gas()
-
-/obj/machinery/power/shuttle/engine/fire/return_fuel_cap()
- . = ..()
- var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
- return resolved_heater?.return_gas_capacity()
-
-/obj/machinery/power/shuttle/engine/fire/screwdriver_act(mob/living/user, obj/item/I)
- . = ..()
- update_icon_state()
-
-/obj/machinery/power/shuttle/engine/fire/update_engine()
- if(!..())
- return
- if(!attached_heater && !set_heater())
- thruster_active = FALSE
- return FALSE
-
-/obj/machinery/power/shuttle/engine/fire/proc/set_heater()
- for(var/direction in GLOB.cardinals)
- for(var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/found in get_step(get_turf(src), direction))
- if(found.dir != dir)
- continue
- if(found.panel_open)
- continue
- if(!found.anchored)
- continue
- attached_heater = WEAKREF(found)
- var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
- RegisterSignal(resolved_heater, COMSIG_OBJ_DECONSTRUCT, PROC_REF(remove_heater))
- update_icon_state()
- return TRUE
-
-/obj/machinery/power/shuttle/engine/fire/proc/remove_heater(datum/source, disassembled)
- SIGNAL_HANDLER
-
- var/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/resolved_heater = attached_heater?.resolve()
- UnregisterSignal(resolved_heater, COMSIG_OBJ_DECONSTRUCT)
- attached_heater = null
-
-/obj/machinery/power/shuttle/engine/fire/RefreshParts()
- var/laz = 0
- for(var/obj/item/stock_parts/micro_laser/L in component_parts)
- laz += L.rating
- consumption_multiplier = laz
-
/**
* ### Ion Engines
* Engines that convert electricity to thrust. Yes, I know that's not how it works, it needs a propellant, but this is a video game.
@@ -224,7 +133,6 @@
name = "electric engine precharger"
desc = "A medium-capacity, high transfer superconducting magnetic energy storage unit specially made for use with shuttle engines."
icon = 'icons/obj/shuttle.dmi'
- dir = EAST
input_level = 5000
input_level_max = 50000
output_level = 50000
diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm
index 2b440f926c32..8578e3fb5a23 100644
--- a/code/game/machinery/shuttle/shuttle_heater.dm
+++ b/code/game/machinery/shuttle/shuttle_heater.dm
@@ -4,32 +4,11 @@
//but instead of changing temp, it stores plasma and uses
//it for the engine.
//-----------------------------------------------
-
-#define O2_OXIDATION_VALUE 1
-#define NITRYL_OXIDATION_VALUE 1
-#define NITROUS_OXIDATION_VALUE 3
-
-#define PLASMA_THRUSTER_VALUE 1
-#define TRITRIUM_THRUSTER_VALUE 3
-#define HYDROGEN_THRUSTER_VALUE 0.5
-
-#define NITROUS_COOLING_MULTIPIER 500
-#define NITROUS_COOLING_MIN 173
-
-#define DAMAGE_NONE 0
-#define DAMAGE_LOW 1
-#define DAMAGE_MED 2
-#define DAMAGE_HIGH 3
-
-#define PRESSURE_LIMIT 1010 //in kpa
-#define PRESSURE_DAMAGE_MAX 1200 //gives 10 minutes per stage at the pressure limit
-
/obj/machinery/atmospherics/components/unary/shuttle
name = "shuttle atmospherics device"
desc = "This does something to do with shuttle atmospherics"
icon_state = "heater"
icon = 'icons/obj/shuttle.dmi'
- dir = EAST
/obj/machinery/atmospherics/components/unary/shuttle/heater
name = "engine heater"
@@ -201,262 +180,3 @@
. = ..()
fuel_tank = new /obj/item/tank/internals/plasma/full(src)
use_tank = TRUE
-
-//combustion heater
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater
- name = "combustion engine heater"
- desc = "Directs fuel mix into an attached combustion thruster."
- icon_state = "heater_pipe"
- var/icon_state_closed = "heater_pipe"
- var/icon_state_open = "heater_pipe_open"
- var/gas_amount = 0 //amount of gas used in calculations
- var/gas_capacity = 0
- var/efficiency_multiplier = 1
- var/pressure_damage = 0
- var/damage_state = 0
- var/metal_repair = FALSE //used to see if metal's been added during repair step
- idle_power_usage = 50
- circuit = /obj/item/circuitboard/machine/shuttle/fire_heater
-
- density = TRUE
- max_integrity = 400
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 30)
- layer = OBJ_LAYER
- showpipe = TRUE
-
- pipe_flags = PIPING_ONE_PER_TURF
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/on_construction(obj_color, set_layer)
- var/obj/item/circuitboard/machine/shuttle/fire_heater/board = circuit
- if(board)
- piping_layer = board.pipe_layer
- set_layer = piping_layer
- ..()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/New()
- . = ..()
- SetInitDirections()
- update_adjacent_engines()
- update_gas_stats()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/Destroy()
- . = ..()
- update_adjacent_engines()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/on_construction()
- ..(dir, dir)
- SetInitDirections()
- update_adjacent_engines()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/process_atmos()
- var/datum/gas_mixture/air_contents = airs[1]
- var/pressure = air_contents.return_pressure()
- if(pressure > PRESSURE_LIMIT)
- pressure_damage += pressure / PRESSURE_LIMIT //always more than 1
- if(rand(1, 48) == 48) //process_atmos() calls around twice a second, so this'll go off on average every 24 seconds.
- playsound(loc, "hull_creaking", 60, TRUE, 20, pressure_affected = FALSE) // the ship is Not happy
- if(pressure_damage >= PRESSURE_DAMAGE_MAX)
- damage_state += 1 //damage state starts at 0, 1 causes temp leak, 2 causes gas leak, 3 causes explosion
- pressure_damage = 0 // reset our counter here
- playsound(loc, 'sound/effects/bang.ogg', 240, TRUE, 5)
- if(damage_state >= DAMAGE_LOW)
- var/loc_air = loc.return_air()
- air_contents.temperature_share(loc_air, 0.4) //equalizes temp with its turf
- if(damage_state >= DAMAGE_MED)
- assume_air_ratio(air_contents, 0.01) //leaks a bit of its tank
- if(damage_state >= DAMAGE_HIGH)
- var/epicenter = loc
- explosion(epicenter, 2, 2, 3, 3, TRUE, TRUE) //boom
- update_parents()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/default_change_direction_wrench(mob/user, obj/item/I)
- if(!..())
- return FALSE
- SetInitDirections()
- var/obj/machinery/atmospherics/node = nodes[1]
- if(node)
- node.disconnect(src)
- nodes[1] = null
- if(!parents[1])
- return
- nullifyPipenet(parents[1])
-
- atmosinit()
- node = nodes[1]
- if(node)
- node.atmosinit()
- node.addMember(src)
- SSair.add_to_rebuild_queue(src)
- return TRUE
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/RefreshParts()
- var/cap = 0
- var/eff = 0
- for(var/obj/item/stock_parts/matter_bin/M in component_parts)
- cap += M.rating
- for(var/obj/item/stock_parts/micro_laser/L in component_parts)
- eff += L.rating
- gas_capacity = 5000 * ((cap - 1) ** 2) + 1000
- efficiency_multiplier = round(sqrt(eff), 0.1)
- update_gas_stats()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/examine(mob/user)
- . = ..()
- . += "The engine heater's gas dial reads [return_gas()] kPa."
- . += "A lightly burnt hazard sticker reports a safe pressure of [PRESSURE_LIMIT] kPa. "
- if(damage_state == DAMAGE_MED && metal_repair == FALSE)
- . += "The engine heater's plating could be repaired with metal."
- if(damage_state == DAMAGE_MED && metal_repair == TRUE)
- . += "The engine heater's plating is ready to be bolted down."
- if(damage_state == DAMAGE_LOW)
- . += "The engine heater's insulation layer could be pried back into place."
- if(damage_state == DAMAGE_NONE && pressure_damage >= PRESSURE_DAMAGE_MAX / 2)
- . += "The engine heater's screws seem loose."
- if(damage_state == DAMAGE_NONE && pressure_damage < PRESSURE_DAMAGE_MAX / 2)
- . += "The engine heater is in good condition."
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/return_gas()
- var/datum/gas_mixture/air_contents = airs[1]
- return air_contents?.return_pressure()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/return_gas_capacity()
- var/datum/gas_mixture/air_contents = airs[1]
- return air_contents?.return_volume()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/update_gas_stats()
- var/datum/gas_mixture/air_contents = airs[1]
- if(!air_contents)
- return
- air_contents.set_volume(gas_capacity)
- air_contents.set_temperature(T20C)
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/has_fuel(required, datum/gas/gas_type)
- var/datum/gas_mixture/air_contents = airs[1]
- if(!air_contents)
- return
- return air_contents.get_moles(gas_type) >= required
-
-/**
- * consumes a portion of the mols and checks how much could combust to make thrust.
- * oxidation_power is the total value of all the oxidizers
- * fuel_power is ^ but for fuel
- */
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/consume_fuel(gas_consumed)
- var/datum/gas_mixture/air_contents = airs[1]
- if(!air_contents)
- return
-
- else
- var/oxidation_power = 0
- var/fuel_power = 0
- var/thrust_power = 0
- var/gas_amount = 0
-
- for(var/id in air_contents.get_gases())
- gas_amount = air_contents.get_moles(id) * gas_consumed //this takes a percent (set by gas_consumed) and multiplies it by the total gas to get the amount of gas used by the calculation.
-
- switch(id)
- // adds each oxidizer's power to the total oxidation max
- if(GAS_O2)
- oxidation_power += O2_OXIDATION_VALUE * gas_amount
- if(GAS_NITRYL)
- oxidation_power += NITRYL_OXIDATION_VALUE * gas_amount
- if(GAS_NITROUS) //burning nitrous cools down the heater's main tank, just like it cools the intake on real cars.
- oxidation_power += NITROUS_OXIDATION_VALUE * gas_amount
- var/heat_capacity = gas_amount * NITROUS_COOLING_MULTIPIER
- var/air_heat_capacity = air_contents.heat_capacity()
- var/combined_heat_capacity = heat_capacity + air_heat_capacity
- if(combined_heat_capacity > 0)
- var/combined_energy = heat_capacity * NITROUS_COOLING_MIN + air_heat_capacity * air_contents.return_temperature()
- air_contents.set_temperature(combined_energy / combined_heat_capacity)
- // adds each fuel gas's power to the fuel max (air.get_fuel_amount is busted, and trit should be Better anyways.)
- if(GAS_PLASMA)
- fuel_power += PLASMA_THRUSTER_VALUE * gas_amount
- if(GAS_TRITIUM)
- fuel_power += TRITRIUM_THRUSTER_VALUE * gas_amount
- if(GAS_HYDROGEN)
- fuel_power += HYDROGEN_THRUSTER_VALUE * gas_amount
-
- air_contents.adjust_moles(id, -gas_amount)
- thrust_power = min(oxidation_power, fuel_power) * efficiency_multiplier //"simulates" how much possible thrust either oxidizer or fuel could make, and takes the min
- return thrust_power
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/attackby(obj/item/I, mob/living/user, params)
- update_adjacent_engines()
- if(damage_state == DAMAGE_MED && istype(I, /obj/item/stack/sheet/metal) && metal_repair == FALSE) //fix med damage with metal
- var/obj/item/stack/sheet/metal/S = I
- if(S.get_amount() < 2)
- to_chat(user, "You need at least 2 metal sheets to repair [src].")
- return
- to_chat(user, "You start adding new plating.")
- if(do_after(user, 40, src, TRUE))
- if(!I.use(2))
- return
- to_chat(user, "You add new plating.")
- I.use(1, FALSE, TRUE)
- metal_repair = TRUE
- pressure_damage = 0 //lets be nice and not let them explode while fixing this
- playsound(loc, 'sound/items/deconstruct.ogg', 50)
- return
- return
-
- if(damage_state == DAMAGE_MED && I.tool_behaviour == TOOL_WRENCH && metal_repair == TRUE)
- to_chat(user, "You start wrenching down the new plating.")
- if(I.use_tool(src, user, 60, volume=75))
- metal_repair = FALSE
- damage_state = DAMAGE_LOW
- pressure_damage = 0
- to_chat(user, "You secure the new plating.")
- return
- return
-
- if(damage_state == DAMAGE_LOW && I.tool_behaviour == TOOL_CROWBAR) //fix low damage with screwdriver
- to_chat(user, "You start prying in the insulation layer.")
- if(I.use_tool(src, user, 60, volume=75))
- damage_state = DAMAGE_NONE
- pressure_damage = 0
- to_chat(user, "You secure the insulation layer.")
- return
- return
-
- if(damage_state == DAMAGE_NONE && I.tool_behaviour == TOOL_SCREWDRIVER && pressure_damage >= PRESSURE_DAMAGE_MAX / 2) //lets you fix pressure damage before it increases damage state
- to_chat(user, "You start tightening loose screws.")
- if(I.use_tool(src, user, 60, volume=75))
- pressure_damage = 0
- to_chat(user, "You tighten the screws.")
- return
- return
-
- if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_closed, I))
- return
- if(default_pry_open(I))
- return
- if(panel_open)
- if(default_change_direction_wrench(user, I))
- return
- if(default_deconstruction_crowbar(I))
- return
- return ..()
-
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater/proc/update_adjacent_engines()
- var/engine_turf = get_step(src, dir)
- if(!isturf(engine_turf))
- return
- for(var/obj/machinery/power/shuttle/engine/E in engine_turf)
- E.update_icon_state()
-
-/obj/item/paper/guides/jobs/engi/combustion_thruster
- name = "paper- 'Combustion Thruster Safety Instructions'"
- default_raw_text = {"
Combustion Thruster Basics
-
Firstly, combustion thrusters are delicate machines due to their unique function, and therefore come with certain limits to said function.
- The specific limit to remember is 1000 kPa, above which your warranty will expire and the combustion heater will begin to take damage, with catastrophic failure inevitable after long periods of high pressure.
- The second thing to keep in mind is the fuel mix you are using. If you put in the wrong ratio, the thruster will waste the excess and you'll get less thrust.
- The most notable mixes are a 2:1 ratio of hydrogen to oxygen and a 1:1 ratio of plasma to oxygen.
- Additionally, nitrous oxide has been known to provide beneficial properties on top of being a potent oxidizer.
-
-
It's making scary noises and leaking!
-
Set your internals, pull a fire alarm, grab a fire suit, and continue with the following steps. Ensure you disable all sources of ignition!
-
Place two metal sheets over the leak in the heater.
-
Wrench the new sheets of metal into place to stop the leak.
-
Pry the insulation layer into place with a crowbar to stop the heat transfer.
-
For minor damages, tighten loosened screws.
"}
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 63d308f69558..3882fe8d5a6f 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -101,13 +101,13 @@
chassis.use_power(energy_drain)
addtimer(CALLBACK(src, PROC_REF(set_ready_state), 1), equip_cooldown)
-/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target)
+/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user, interaction_key)
if(!chassis)
return
var/C = chassis.loc
set_ready_state(0)
chassis.use_power(energy_drain)
- . = do_after(chassis.occupant, equip_cooldown, target=target)
+ . = do_after(user, equip_cooldown, target=target, interaction_key = interaction_key)
set_ready_state(1)
if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir))
return 0
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index b0b40ea0877e..4a16a6f9b249 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -6,7 +6,7 @@
var/fire_sound
var/projectiles_per_shot = 1
var/variance = 0
- var/randomspread = FALSE //use random spread for machineguns, instead of shotgun scatter
+ var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter
var/projectile_delay = 0
var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired.
var/kickback = TRUE //Will using this weapon in no grav push mecha back.
@@ -137,8 +137,8 @@
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles."
icon_state = "mecha_plasmacutter"
item_state = "plasmacutter"
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
energy_drain = 30
projectile = /obj/projectile/plasma/adv/mech
fire_sound = 'sound/weapons/plasma_cutter.ogg'
@@ -347,7 +347,7 @@
projectiles_cache_max = 1200
projectiles_per_shot = 3
variance = 6
- randomspread = TRUE
+ randomspread = 1
projectile_delay = 2
harmful = TRUE
ammo_type = "lmg"
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 48cc0388b508..88c2ca721da2 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -158,7 +158,7 @@
return cell
/obj/mecha/Destroy()
- if(occupant && iscarbon(occupant))
+ if(occupant)
occupant.SetSleeping(destruction_sleep_duration)
go_out()
var/mob/living/silicon/ai/AI
diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm
index 4a85f9321154..e62b1e52f7b3 100644
--- a/code/game/objects/effects/anomalies/_anomalies.dm
+++ b/code/game/objects/effects/anomalies/_anomalies.dm
@@ -133,7 +133,7 @@
/obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params)
if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal)
to_chat(user, span_notice("You start analyzing [src]."))
- if(do_after(user, 20, src, hidden = TRUE))
+ if(do_after(user, 20, TRUE, src))
to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code]."))
if(bSignal)
to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is highly unstable." ))
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index 4177d8957965..ccfd89363482 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -875,10 +875,10 @@
desc = "Terra, or Earth as it's called by inhabitants, the third planet in the Sol system. Home to the only life as humans knew it, until contact with the outside universe. This poster in particular is trying to attract tourists to Terra, listing attractions like the Grand Orrery and Neue Waldstätte."
icon_state = "poster-solgov-terra"
-/obj/structure/sign/poster/solgov/mars
- name = "Mars"
- desc = "Mars, fourth planet in the Sol system. While evidence suggests that Venus and Mars may have once had life, Terra was the only one that kept it. This poster in particular is trying to attract tourists to Mars, listing attractions like skiing resorts and ancient robot exhibits."
- icon_state = "poster-solgov-mars"
+/obj/structure/sign/poster/solgov/ares
+ name = "Ares"
+ desc = "Ares, fourth planet in the Sol system. While evidence suggests that Aphrodite and Ares may have once had life, Terra was the only one that kept it. This poster in particular is trying to attract tourists to Ares, listing attractions like skiing resorts and ancient robot exhibits."
+ icon_state = "poster-solgov-ares"
/obj/structure/sign/poster/solgov/luna
name = "Luna"
@@ -892,7 +892,7 @@
/obj/structure/sign/poster/solgov/skiing
name = "Lo-Fly Skiing Advert"
- desc = "An advertisement for some low-gravity skiing resort on Mars. \"Popular with SUNS groups!\""
+ desc = "An advertisement for some low-gravity skiing resort on Ares. \"Popular with SUNS groups!\""
icon_state = "poster-solgov-loskiing"
/obj/structure/sign/poster/solgov/recyle
diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm
index 2dfea3173feb..975f94102ecf 100644
--- a/code/game/objects/effects/decals/decal.dm
+++ b/code/game/objects/effects/decals/decal.dm
@@ -39,7 +39,7 @@
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/obj/effect/turf_decal
- icon = 'icons/turf/decals/decals.dmi'
+ icon = 'icons/turf/decals.dmi'
icon_state = "warningfulltile"
plane = FLOOR_PLANE
layer = TURF_DECAL_LAYER
diff --git a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
index fc23ed89c278..eb9fb026e958 100644
--- a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
+++ b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
@@ -418,6 +418,7 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/plaque
name = "plaque"
icon_state = "plaque"
+ icon = 'icons/turf/decals.dmi'
/obj/effect/turf_decal/chapel
name = "chapel"
@@ -800,404 +801,6 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/solgov/all/bottom_right
icon_state = "bottom-right-all"
-// suns
-
-/obj/effect/turf_decal/suns
- icon = 'icons/turf/decals/suns_floor.dmi'
- icon_state = "suns-columm1-bottom"
-
-/obj/effect/turf_decal/suns/capital_s
- icon_state = "capital-s"
-
-/obj/effect/turf_decal/suns/capital_u
- icon_state = "capital-u"
-
-/obj/effect/turf_decal/suns/capital_n
- icon_state = "capital-n"
-
-/obj/effect/turf_decal/suns/capital_s/fancy
- icon_state = "capitalfancy-s"
-
-/obj/effect/turf_decal/suns/capital_u/fancy
- icon_state = "capitalfancy-u"
-
-/obj/effect/turf_decal/suns/capital_n/fancy
- icon_state = "capitalfancy-n"
-
-/obj/effect/turf_decal/suns/capital_s/marble
- icon_state = "capitalmarble-s"
-
-/obj/effect/turf_decal/suns/capital_u/marble
- icon_state = "capitalmarble-u"
-
-/obj/effect/turf_decal/suns/capital_n/marble
- icon_state = "capitalmarble-n"
-
-// borders
-
-/obj/effect/turf_decal/suns/line
- icon_state = "suns-border"
-
-/obj/effect/turf_decal/suns/line/corner
- icon_state = "suns-bordercorner"
-
-/obj/effect/turf_decal/suns/line/end
- icon_state = "suns-borderend"
-
-/obj/effect/turf_decal/suns/line/fill
- icon_state = "suns-fill"
-
-/obj/effect/turf_decal/suns/line/fill/corner
- icon_state = "suns-fillcorner"
-
-/obj/effect/turf_decal/suns/line/fill/end
- icon_state = "suns-fillend"
-
-/obj/effect/turf_decal/suns/line/fancy
- icon_state = "sunsfancy-border"
-
-/obj/effect/turf_decal/suns/line/fancy/corner
- icon_state = "sunsfancy-bordercorner"
-
-/obj/effect/turf_decal/suns/line/fancy/end
- icon_state = "sunsfancy-borderend"
-
-/obj/effect/turf_decal/suns/line/fancy/fill
- icon_state = "sunsfancy-fill"
-
-/obj/effect/turf_decal/suns/line/fancy/fill/corner
- icon_state = "sunsfancy-fillcorner"
-
-/obj/effect/turf_decal/suns/line/fancy/fill/end
- icon_state = "sunsfancy-fillend"
-
-/obj/effect/turf_decal/suns/line/marble
- icon_state = "sunsmarble-border"
-
-/obj/effect/turf_decal/suns/line/marble/corner
- icon_state = "sunsmarble-bordercorner"
-
-/obj/effect/turf_decal/suns/line/marble/end
- icon_state = "sunsmarble-borderend"
-
-/obj/effect/turf_decal/suns/line/marble/fill
- icon_state = "sunsmarble-fill"
-
-/obj/effect/turf_decal/suns/line/marble/fill/corner
- icon_state = "sunsmarble-fillcorner"
-
-/obj/effect/turf_decal/suns/line/marble/fill/end
- icon_state = "sunsmarble-fillend"
-
-// suns 3x6 decal
-
-/obj/effect/turf_decal/suns/columm1
- icon_state = "suns-columm1-bottom"
-
-/obj/effect/turf_decal/suns/columm1/middle
- icon_state = "suns-columm1-middle"
-
-/obj/effect/turf_decal/suns/columm1/top
- icon_state = "suns-columm1-top"
-
-/obj/effect/turf_decal/suns/columm2
- icon_state = "suns-columm2-bottom"
-
-/obj/effect/turf_decal/suns/columm2/middle
- icon_state = "suns-columm2-middle"
-
-/obj/effect/turf_decal/suns/columm2/top
- icon_state = "suns-columm2-top"
-
-/obj/effect/turf_decal/suns/columm3
- icon_state = "suns-columm3-bottom"
-
-/obj/effect/turf_decal/suns/columm3/middle
- icon_state = "suns-columm3-middle"
-
-/obj/effect/turf_decal/suns/columm3/top
- icon_state = "suns-columm3-top"
-
-/obj/effect/turf_decal/suns/columm4
- icon_state = "suns-columm4-middle"
-
-/obj/effect/turf_decal/suns/columm4/top
- icon_state = "suns-columm4-top"
-
-/obj/effect/turf_decal/suns/columm5
- icon_state = "suns-columm5-middle"
-
-/obj/effect/turf_decal/suns/columm5/top
- icon_state = "suns-columm5-top"
-
-/obj/effect/turf_decal/suns/columm6
- icon_state = "suns-columm6-middle"
-
-/obj/effect/turf_decal/suns/columm6/top
- icon_state = "suns-columm6-top"
-
-/obj/effect/turf_decal/suns/marble/columm1
- icon_state = "sunsmarble-columm1-bottom"
-
-/obj/effect/turf_decal/suns/marble/columm1/middle
- icon_state = "sunsmarble-columm1-middle"
-
-/obj/effect/turf_decal/suns/marble/columm1/top
- icon_state = "sunsmarble-columm1-top"
-
-/obj/effect/turf_decal/suns/marble/columm2
- icon_state = "sunsmarble-columm2-bottom"
-
-/obj/effect/turf_decal/suns/marble/columm2/middle
- icon_state = "sunsmarble-columm2-middle"
-
-/obj/effect/turf_decal/suns/marble/columm2/top
- icon_state = "sunsmarble-columm2-top"
-
-/obj/effect/turf_decal/suns/marble/columm3
- icon_state = "sunsmarble-columm3-bottom"
-
-/obj/effect/turf_decal/suns/marble/columm3/middle
- icon_state = "sunsmarble-columm3-middle"
-
-/obj/effect/turf_decal/suns/marble/columm3/top
- icon_state = "sunsmarble-columm3-top"
-
-/obj/effect/turf_decal/suns/marble/columm4
- icon_state = "sunsmarble-columm4-middle"
-
-/obj/effect/turf_decal/suns/marble/columm4/top
- icon_state = "sunsmarble-columm4-top"
-
-/obj/effect/turf_decal/suns/marble/columm5
- icon_state = "sunsmarble-columm5-middle"
-
-/obj/effect/turf_decal/suns/marble/columm5/top
- icon_state = "sunsmarble-columm5-top"
-
-/obj/effect/turf_decal/suns/marble/columm6
- icon_state = "sunsmarble-columm6-middle"
-
-/obj/effect/turf_decal/suns/marble/columm6/top
- icon_state = "sunsmarble-columm6-top"
-
-/obj/effect/turf_decal/suns/fancy/columm1
- icon_state = "sunsfancy-columm1-bottom"
-
-/obj/effect/turf_decal/suns/fancy/columm1/middle
- icon_state = "sunsfancy-columm1-middle"
-
-/obj/effect/turf_decal/suns/fancy/columm1/top
- icon_state = "sunsfancy-columm1-top"
-
-/obj/effect/turf_decal/suns/fancy/columm2
- icon_state = "sunsfancy-columm2-bottom"
-
-/obj/effect/turf_decal/suns/fancy/columm2/middle
- icon_state = "sunsfancy-columm2-middle"
-
-/obj/effect/turf_decal/suns/fancy/columm2/top
- icon_state = "sunsfancy-columm2-top"
-
-/obj/effect/turf_decal/suns/fancy/columm3
- icon_state = "sunsfancy-columm3-bottom"
-
-/obj/effect/turf_decal/suns/fancy/columm3/middle
- icon_state = "sunsfancy-columm3-middle"
-
-/obj/effect/turf_decal/suns/fancy/columm3/top
- icon_state = "sunsfancy-columm3-top"
-
-/obj/effect/turf_decal/suns/fancy/columm4
- icon_state = "sunsfancy-columm4-middle"
-
-/obj/effect/turf_decal/suns/fancy/columm4/top
- icon_state = "sunsfancy-columm4-top"
-
-/obj/effect/turf_decal/suns/fancy/columm5
- icon_state = "sunsfancy-columm5-middle"
-
-/obj/effect/turf_decal/suns/fancy/columm5/top
- icon_state = "sunsfancy-columm5-top"
-
-/obj/effect/turf_decal/suns/fancy/columm6
- icon_state = "sunsfancy-columm6-middle"
-
-/obj/effect/turf_decal/suns/fancy/columm6/top
- icon_state = "sunsfancy-columm6-top"
-
-
-// suns alt decal
-
-/obj/effect/turf_decal/suns/alt
- icon_state = "sunsalt-top-left"
-
-/obj/effect/turf_decal/suns/alt/top_left
- icon_state = "sunsalt-top-left"
-
-/obj/effect/turf_decal/suns/alt/top_center
- icon_state = "sunsalt-top-center"
-
-/obj/effect/turf_decal/suns/alt/top_right
- icon_state = "sunsalt-top-right"
-
-/obj/effect/turf_decal/suns/alt/middle_left
- icon_state = "sunsalt-middle-left"
-
-/obj/effect/turf_decal/suns/alt/middle_center
- icon_state = "sunsalt-middle-center"
-
-/obj/effect/turf_decal/suns/alt/middle_right
- icon_state = "sunsalt-middle-right"
-
-/obj/effect/turf_decal/suns/alt/bottom_left
- icon_state = "sunsalt-bottom-left"
-
-/obj/effect/turf_decal/suns/alt/bottom_center
- icon_state = "sunsalt-bottom-center"
-
-/obj/effect/turf_decal/suns/alt/bottom_right
- icon_state = "sunsalt-bottom-right"
-
-/obj/effect/turf_decal/suns/alt/fancy
- icon_state = "sunsaltfancy-top-left"
-
-/obj/effect/turf_decal/suns/alt/fancy/top_left
- icon_state = "sunsaltfancy-top-left"
-
-/obj/effect/turf_decal/suns/alt/fancy/top_center
- icon_state = "sunsaltfancy-top-center"
-
-/obj/effect/turf_decal/suns/alt/fancy/top_right
- icon_state = "sunsaltfancy-top-right"
-
-/obj/effect/turf_decal/suns/alt/fancy/middle_left
- icon_state = "sunsaltfancy-middle-left"
-
-/obj/effect/turf_decal/suns/alt/fancy/middle_center
- icon_state = "sunsaltfancy-middle-center"
-
-/obj/effect/turf_decal/suns/alt/fancy/middle_right
- icon_state = "sunsaltfancy-middle-right"
-
-/obj/effect/turf_decal/suns/alt/fancy/bottom_left
- icon_state = "sunsaltfancy-bottom-left"
-
-/obj/effect/turf_decal/suns/alt/fancy/bottom_center
- icon_state = "sunsaltfancy-bottom-center"
-
-/obj/effect/turf_decal/suns/alt/fancy/bottom_right
- icon_state = "sunsaltfancy-bottom-right"
-
-/obj/effect/turf_decal/suns/alt/marble
- icon_state = "sunsaltmarble-top-left"
-
-/obj/effect/turf_decal/suns/alt/marble/top_left
- icon_state = "sunsaltmarble-top-left"
-
-/obj/effect/turf_decal/suns/alt/marble/top_center
- icon_state = "sunsaltmarble-top-center"
-
-/obj/effect/turf_decal/suns/alt/marble/top_right
- icon_state = "sunsaltmarble-top-right"
-
-/obj/effect/turf_decal/suns/alt/marble/middle_left
- icon_state = "sunsaltmarble-middle-left"
-
-/obj/effect/turf_decal/suns/alt/marble/middle_center
- icon_state = "sunsaltmarble-middle-center"
-
-/obj/effect/turf_decal/suns/alt/marble/middle_right
- icon_state = "sunsaltmarble-middle-right"
-
-/obj/effect/turf_decal/suns/alt/marble/bottom_left
- icon_state = "sunsaltmarble-bottom-left"
-
-/obj/effect/turf_decal/suns/alt/marble/bottom_center
- icon_state = "sunsaltmarble-bottom-center"
-
-/obj/effect/turf_decal/suns/alt/marble/bottom_right
- icon_state = "sunsaltmarble-bottom-right"
-
-/obj/effect/turf_decal/suns/alt/transparent
- icon_state = "sunsalttrans-top-left"
-
-/obj/effect/turf_decal/suns/alt/transparent/top_left
- icon_state = "sunsalttrans-top-left"
-
-/obj/effect/turf_decal/suns/alt/transparent/top_center
- icon_state = "sunsalttrans-top-center"
-
-/obj/effect/turf_decal/suns/alt/transparent/top_right
- icon_state = "sunsalttrans-top-right"
-
-/obj/effect/turf_decal/suns/alt/transparent/middle_left
- icon_state = "sunsalttrans-middle-left"
-
-/obj/effect/turf_decal/suns/alt/transparent/middle_center
- icon_state = "sunsalttrans-middle-center"
-
-/obj/effect/turf_decal/suns/alt/transparent/middle_right
- icon_state = "sunsalttrans-middle-right"
-
-/obj/effect/turf_decal/suns/alt/transparent/bottom_left
- icon_state = "sunsalttrans-bottom-left"
-
-/obj/effect/turf_decal/suns/alt/transparent/bottom_center
- icon_state = "sunsalttrans-bottom-center"
-
-/obj/effect/turf_decal/suns/alt/transparent/bottom_right
- icon_state = "sunsalttrans-bottom-right"
-
-// suns 3x6 decal transparent
-
-/obj/effect/turf_decal/suns/transparent/columm1
- icon_state = "sunstrans-columm1-bottom"
-
-/obj/effect/turf_decal/suns/transparent/columm1/middle
- icon_state = "sunstrans-columm1-middle"
-
-/obj/effect/turf_decal/suns/transparent/columm1/top
- icon_state = "sunstrans-columm1-top"
-
-/obj/effect/turf_decal/suns/transparent/columm2
- icon_state = "sunstrans-columm2-bottom"
-
-/obj/effect/turf_decal/suns/transparent/columm2/middle
- icon_state = "sunstrans-columm2-middle"
-
-/obj/effect/turf_decal/suns/transparent/columm2/top
- icon_state = "sunstrans-columm2-top"
-
-/obj/effect/turf_decal/suns/transparent/columm3
- icon_state = "sunstrans-columm3-bottom"
-
-/obj/effect/turf_decal/suns/transparent/columm3/middle
- icon_state = "sunstrans-columm3-middle"
-
-/obj/effect/turf_decal/suns/transparent/columm3/top
- icon_state = "sunstrans-columm3-top"
-
-/obj/effect/turf_decal/suns/transparent/columm4
- icon_state = "sunstrans-columm4-middle"
-
-/obj/effect/turf_decal/suns/transparent/columm4/top
- icon_state = "sunstrans-columm4-top"
-
-/obj/effect/turf_decal/suns/transparent/columm5
- icon_state = "sunstrans-columm5-middle"
-
-/obj/effect/turf_decal/suns/transparent/columm5/top
- icon_state = "sunstrans-columm5-top"
-
-/obj/effect/turf_decal/suns/transparent/columm6
- icon_state = "sunstrans-columm6-middle"
-
-/obj/effect/turf_decal/suns/transparent/columm6/top
- icon_state = "sunstrans-columm6-top"
-
-// nanotrasen
-
/obj/effect/turf_decal/nanotrasen //placeholder for sorting these together, add 3x3 NT and Vigilitas logos later
icon = 'icons/obj/nanotrasen_floor.dmi'
icon_state = "NS-2x2" //also placeholder
diff --git a/code/game/objects/effects/decals/turfdecal/markings.dm b/code/game/objects/effects/decals/turfdecal/markings.dm
index 860f8f0bd2b2..e0a0746f5a2d 100644
--- a/code/game/objects/effects/decals/turfdecal/markings.dm
+++ b/code/game/objects/effects/decals/turfdecal/markings.dm
@@ -229,28 +229,32 @@
/obj/effect/turf_decal/syndicateemblem/top/right
icon_state = "s3,3"
-/obj/effect/turf_decal/atmos
- icon = 'icons/turf/decals/decals.dmi'
-
/obj/effect/turf_decal/atmos/oxygen
+ icon = 'icons/turf/decals.dmi'
icon_state = "oxygen"
/obj/effect/turf_decal/atmos/carbon_dioxide
+ icon = 'icons/turf/decals.dmi'
icon_state = "carbon_dioxide"
/obj/effect/turf_decal/atmos/nitrogen
+ icon = 'icons/turf/decals.dmi'
icon_state = "nitrogen"
/obj/effect/turf_decal/atmos/air
+ icon = 'icons/turf/decals.dmi'
icon_state = "air"
/obj/effect/turf_decal/atmos/nitrous_oxide
+ icon = 'icons/turf/decals.dmi'
icon_state = "nitrous_oxide"
/obj/effect/turf_decal/atmos/plasma
+ icon = 'icons/turf/decals.dmi'
icon_state = "plasma"
/obj/effect/turf_decal/atmos/mix
+ icon = 'icons/turf/decals.dmi'
icon_state = "mix"
/**
@@ -335,129 +339,169 @@
// centered number decals
-
/obj/effect/turf_decal/number/one
+ icon = 'icons/turf/decals.dmi'
icon_state = "1"
/obj/effect/turf_decal/number/two
+ icon = 'icons/turf/decals.dmi'
icon_state = "2"
/obj/effect/turf_decal/number/three
+ icon = 'icons/turf/decals.dmi'
icon_state = "3"
/obj/effect/turf_decal/number/four
+ icon = 'icons/turf/decals.dmi'
icon_state = "4"
/obj/effect/turf_decal/number/five
+ icon = 'icons/turf/decals.dmi'
icon_state = "5"
/obj/effect/turf_decal/number/six
+ icon = 'icons/turf/decals.dmi'
icon_state = "6"
/obj/effect/turf_decal/number/seven
+ icon = 'icons/turf/decals.dmi'
icon_state = "7"
/obj/effect/turf_decal/number/eight
+ icon = 'icons/turf/decals.dmi'
icon_state = "8"
/obj/effect/turf_decal/number/nine
+ icon = 'icons/turf/decals.dmi'
icon_state = "9"
/obj/effect/turf_decal/number/zero
+ icon = 'icons/turf/decals.dmi'
icon_state = "0"
// right-shifted number decals (1s digit)
/obj/effect/turf_decal/number/right_one
+ icon = 'icons/turf/decals.dmi'
icon_state = "-1"
/obj/effect/turf_decal/number/right_two
+ icon = 'icons/turf/decals.dmi'
icon_state = "-2"
/obj/effect/turf_decal/number/right_three
+ icon = 'icons/turf/decals.dmi'
icon_state = "-3"
/obj/effect/turf_decal/number/right_four
+ icon = 'icons/turf/decals.dmi'
icon_state = "-4"
/obj/effect/turf_decal/number/right_five
+ icon = 'icons/turf/decals.dmi'
icon_state = "-5"
/obj/effect/turf_decal/number/right_six
+ icon = 'icons/turf/decals.dmi'
icon_state = "-6"
/obj/effect/turf_decal/number/right_seven
+ icon = 'icons/turf/decals.dmi'
icon_state = "-7"
/obj/effect/turf_decal/number/right_eight
+ icon = 'icons/turf/decals.dmi'
icon_state = "-8"
/obj/effect/turf_decal/number/right_nine
+ icon = 'icons/turf/decals.dmi'
icon_state = "-9"
/obj/effect/turf_decal/number/right_zero
+ icon = 'icons/turf/decals.dmi'
icon_state = "-0"
// left-shifted number decals (10s digit)
/obj/effect/turf_decal/number/left_one
+ icon = 'icons/turf/decals.dmi'
icon_state = "1-"
/obj/effect/turf_decal/number/left_two
+ icon = 'icons/turf/decals.dmi'
icon_state = "2-"
/obj/effect/turf_decal/number/left_three
+ icon = 'icons/turf/decals.dmi'
icon_state = "3-"
/obj/effect/turf_decal/number/left_four
+ icon = 'icons/turf/decals.dmi'
icon_state = "4-"
/obj/effect/turf_decal/number/left_five
+ icon = 'icons/turf/decals.dmi'
icon_state = "5-"
/obj/effect/turf_decal/number/left_six
+ icon = 'icons/turf/decals.dmi'
icon_state = "6-"
/obj/effect/turf_decal/number/left_seven
+ icon = 'icons/turf/decals.dmi'
icon_state = "7-"
/obj/effect/turf_decal/number/left_eight
+ icon = 'icons/turf/decals.dmi'
icon_state = "8-"
/obj/effect/turf_decal/number/left_nine
+ icon = 'icons/turf/decals.dmi'
icon_state = "9-"
/obj/effect/turf_decal/number/left_zero
+ icon = 'icons/turf/decals.dmi'
icon_state = "0-"
/obj/effect/turf_decal/dept/hop
+ icon = 'icons/turf/decals.dmi'
icon_state = "hop"
/obj/effect/turf_decal/dept/bar
+ icon = 'icons/turf/decals.dmi'
icon_state = "bar"
/obj/effect/turf_decal/dept/cargo
+ icon = 'icons/turf/decals.dmi'
icon_state = "cargo"
/obj/effect/turf_decal/dept/medical
+ icon = 'icons/turf/decals.dmi'
icon_state = "med"
/obj/effect/turf_decal/dept/science
+ icon = 'icons/turf/decals.dmi'
icon_state = "sci"
/obj/effect/turf_decal/dept/security
+ icon = 'icons/turf/decals.dmi'
icon_state = "sec"
/obj/effect/turf_decal/dept/mining
+ icon = 'icons/turf/decals.dmi'
icon_state = "mine"
/obj/effect/turf_decal/zoo
+ icon = 'icons/turf/decals.dmi'
icon_state = "zoo"
/obj/effect/turf_decal/no
+ icon = 'icons/turf/decals.dmi'
icon_state = "no"
/obj/effect/turf_decal/radiation
+ icon = 'icons/turf/decals.dmi'
icon_state = "radiation"
/obj/effect/turf_decal/radiation/white
+ icon = 'icons/turf/decals.dmi'
icon_state = "radiation-w"
diff --git a/code/game/objects/effects/decals/turfdecal/weather.dm b/code/game/objects/effects/decals/turfdecal/weather.dm
index 0c8284b53f8c..04dcf807314a 100644
--- a/code/game/objects/effects/decals/turfdecal/weather.dm
+++ b/code/game/objects/effects/decals/turfdecal/weather.dm
@@ -13,10 +13,12 @@
/obj/effect/turf_decal/weather/dirt
name = "dirt siding"
+ icon = 'icons/turf/decals.dmi'
icon_state = "dirt_side"
/obj/effect/turf_decal/weather/dirt/corner
name = "corner"
+ icon = 'icons/turf/decals.dmi'
icon_state = "dirt_side_corner"
/obj/effect/turf_decal/weather/sand
@@ -34,24 +36,30 @@
/obj/effect/turf_decal/weather/asteroid
name = "asteroid siding"
+ icon = 'icons/turf/decals.dmi'
icon_state = "asteroid_side"
/obj/effect/turf_decal/weather/asteroid/corner
name = "corner"
+ icon = 'icons/turf/decals.dmi'
icon_state = "asteroid_side_corner"
/obj/effect/turf_decal/weather/whitesands
name = "salted sand siding"
+ icon = 'icons/turf/decals.dmi'
icon_state = "ws_side"
/obj/effect/turf_decal/weather/whitesands/corner
name = "corner"
+ icon = 'icons/turf/decals.dmi'
icon_state = "ws_side_corner"
/obj/effect/turf_decal/weather/rock
name = "rock siding"
+ icon = 'icons/turf/decals.dmi'
icon_state = "rock_side"
/obj/effect/turf_decal/weather/rock/corner
name = "corner"
+ icon = 'icons/turf/decals.dmi'
icon_state = "rock_side_corner"
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index db99d0c4e4d8..d763c46e84e9 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -50,14 +50,14 @@
lootdoubles = FALSE
loot = list(
- /obj/item/gun/ballistic/automatic/pistol/syndicate = 8,
+ /obj/item/gun/ballistic/automatic/pistol = 8,
/obj/item/gun/ballistic/shotgun/automatic/combat = 5,
/obj/item/gun/ballistic/automatic/pistol/deagle,
/obj/item/gun/ballistic/revolver/mateba
)
/obj/effect/spawner/lootdrop/armory_contraband/metastation
- loot = list(/obj/item/gun/ballistic/automatic/pistol/syndicate = 5,
+ loot = list(/obj/item/gun/ballistic/automatic/pistol = 5,
/obj/item/gun/ballistic/shotgun/automatic/combat = 5,
/obj/item/gun/ballistic/automatic/pistol/deagle,
/obj/item/storage/box/syndie_kit/throwing_weapons = 3,
@@ -115,6 +115,7 @@
/obj/effect/spawner/lootdrop/gambling
name = "gambling valuables spawner"
loot = list(
+ /obj/item/gun/ballistic/revolver/russian = 5,
/obj/item/clothing/head/trapper = 3,
/obj/item/storage/box/syndie_kit/throwing_weapons,
/obj/item/coin/gold,
@@ -467,18 +468,12 @@
/obj/structure/salvageable/destructive_analyzer
)
-/obj/effect/spawner/lootdrop/ripley
- name = "25% mech 75% wreckage ripley spawner"
- loot = list(/obj/mecha/working/ripley/mining = 1,
- /obj/structure/mecha_wreckage/ripley = 5)
- lootdoubles = FALSE
-
/obj/effect/spawner/lootdrop/salvage_50
name = "50% salvage spawner"
loot = list(
/obj/effect/spawner/lootdrop/maintenance = 13,
/obj/effect/spawner/lootdrop/salvage_machine = 12,
- /obj/effect/spawner/lootdrop/ripley = 12,
+ /obj/effect/spawner/lootdrop/whiteship_cere_ripley = 12,
/obj/structure/closet/crate/secure/loot = 13,
"" = 50
)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 88c5df2262da..033307e5472f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -817,8 +817,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
..()
/obj/item/proc/microwave_act(obj/machinery/microwave/M)
- if(SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M) & COMPONENT_SUCCESFUL_MICROWAVE)
- return
+ SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M)
if(istype(M) && M.dirty < 100)
M.dirty++
@@ -1127,95 +1126,3 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
*/
/obj/item/proc/get_writing_implement_details()
return null
-
-/// How many different types of mats will be counted in a bite?
-#define MAX_MATS_PER_BITE 2
-
-/*
- * On accidental consumption: when you somehow end up eating an item accidentally (currently, this is used for when items are hidden in food like bread or cake)
- *
- * The base proc will check if the item is sharp and has a decent force.
- * Then, it checks the item's mat datums for the effects it applies afterwards.
- * Then, it checks tiny items.
- * After all that, it returns TRUE if the item is set to be discovered. Otherwise, it returns FALSE.
- *
- * This works similarily to /suicide_act: if you want an item to have a unique interaction, go to that item
- * and give it an /on_accidental_consumption proc override. For a simple example of this, check out the nuke disk.
- *
- * Arguments
- * * M - the mob accidentally consuming the item
- * * user - the mob feeding M the item - usually, it's the same as M
- * * source_item - the item that held the item being consumed - bread, cake, etc
- * * discover_after - if the item will be discovered after being chomped (FALSE will usually mean it was swallowed, TRUE will usually mean it was bitten into and discovered)
- */
-/obj/item/proc/on_accidental_consumption(mob/living/carbon/victim, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE)
- if(get_sharpness() && force >= 5) //if we've got something sharp with a decent force (ie, not plastic)
- INVOKE_ASYNC(victim, TYPE_PROC_REF(/mob, emote), "scream")
- victim.visible_message("[victim] looks like [victim.p_theyve()] just bit something they shouldn't have!", \
- "OH GOD! Was that a crunch? That didn't feel good at all!!")
-
- victim.apply_damage(max(15, force), BRUTE, BODY_ZONE_HEAD)
- victim.losebreath += 2
- if(tryEmbed(victim.get_bodypart(BODY_ZONE_CHEST), forced = TRUE)) //and if it embeds successfully in their chest, cause a lot of pain
- victim.apply_damage(max(25, force*1.5), BRUTE, BODY_ZONE_CHEST)
- victim.losebreath += 6
- discover_after = FALSE
- if(QDELETED(src)) // in case trying to embed it caused its deletion (say, if it's DROPDEL)
- return
- source_item?.reagents?.add_reagent(/datum/reagent/blood, 2)
-
- else if(custom_materials?.len) //if we've got materials, lets see whats in it
- /// How many mats have we found? You can only be affected by two material datums by default
- var/found_mats = 0
- /// How much of each material is in it? Used to determine if the glass should break
- var/total_material_amount = 0
-
- for(var/mats in custom_materials)
- total_material_amount += custom_materials[mats]
- if(found_mats >= MAX_MATS_PER_BITE)
- continue //continue instead of break so we can finish adding up all the mats to the total
-
- var/datum/material/discovered_mat = mats
- if(discovered_mat.on_accidental_mat_consumption(victim, source_item))
- found_mats++
-
- //if there's glass in it and the glass is more than 60% of the item, then we can shatter it
- if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)] >= total_material_amount * 0.60)
- if(prob(66)) //66% chance to break it
- /// The glass shard that is spawned into the source item
- var/obj/item/shard/broken_glass = new /obj/item/shard(loc)
- broken_glass.name = "broken [name]"
- broken_glass.desc = "This used to be \a [name], but it sure isn't anymore."
- playsound(victim, "shatter", 25, TRUE)
- qdel(src)
- if(QDELETED(source_item))
- broken_glass.on_accidental_consumption(victim, user)
- else //33% chance to just "crack" it (play a sound) and leave it in the bread
- playsound(victim, "shatter", 15, TRUE)
- discover_after = FALSE
-
- victim.adjust_disgust(33)
- victim.visible_message(
- "[victim] looks like [victim.p_theyve()] just bitten into something hard.", \
- "Eugh! Did I just bite into something?")
-
- else if(w_class == WEIGHT_CLASS_TINY) //small items like soap or toys that don't have mat datums
- /// victim's chest (for cavity implanting the item)
- var/obj/item/bodypart/chest/victim_cavity = victim.get_bodypart(BODY_ZONE_CHEST)
- if(victim_cavity.cavity_item)
- victim.vomit(5, FALSE, FALSE, distance = 0)
- forceMove(drop_location())
- to_chat(victim, "You vomit up a [name]! [source_item? "Was that in \the [source_item]?" : ""]")
- else
- victim.transferItemToLoc(src, victim, TRUE)
- victim.losebreath += 2
- victim_cavity.cavity_item = src
- to_chat(victim, "You swallow hard. [source_item? "Something small was in \the [source_item]..." : ""]")
- discover_after = FALSE
-
- else
- to_chat(victim, "[source_item? "Something strange was in the \the [source_item]..." : "I just bit something strange..."] ")
-
- return discover_after
-
-#undef MAX_MATS_PER_BITE
diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm
deleted file mode 100644
index dbb7a111355e..000000000000
--- a/code/game/objects/items/attachments/_attachment.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-///Most of the logic of attachments is held within the component which allows you to add other items as attachments in theory
-/obj/item/attachment
- name = "broken attachment"
- desc = "alert coders"
- icon = 'icons/obj/guns/attachments.dmi'
- w_class = WEIGHT_CLASS_SMALL
-
- //Slot the attachment goes on, also used in descriptions so should be player readable
- var/slot = ATTACHMENT_SLOT_RAIL
- ///various yes no flags associated with attachments. See defines for these: [_DEFINES/guns.dm]
- var/attach_features_flags = ATTACH_REMOVABLE_HAND
- ///See attachment component
- var/list/valid_parents = list()
- ///Unused.. but could hold extra callbacks I assume?
- var/list/signals = list()
- ///Component that handles most of the logic of attachments
- var/datum/component/attachment/attachment_comp
-
- ///If the attachment is on or off
- var/toggled = FALSE
- var/toggle_on_sound = 'sound/items/flashlight_on.ogg'
- var/toggle_off_sound = 'sound/items/flashlight_off.ogg'
-
- ///Determines the amount of pixels to move the icon state for the overlay. in the x direction
- var/pixel_shift_x = 16
- ///Determines the amount of pixels to move the icon state for the overlay. in the y direction
- var/pixel_shift_y = 16
-
- //Toggle modifers are handled seperatly
- ///Modifier applied to the parent
- var/spread_mod = 0
- ///Modifier applied to the parent
- var/spread_unwielded_mod = 0
- ///Modifier applied to the parent, deciseconds
- var/wield_delay = 0
- ///Modifier applied to the parent
- var/size_mod = 0
-
-/obj/item/attachment/Initialize()
- . = ..()
- attachment_comp = AddComponent( \
- /datum/component/attachment, \
- slot, \
- attach_features_flags, \
- valid_parents, \
- CALLBACK(src, PROC_REF(apply_attachment)), \
- CALLBACK(src, PROC_REF(remove_attachment)), \
- CALLBACK(src, PROC_REF(toggle_attachment)), \
- CALLBACK(src, PROC_REF(on_preattack)), \
- signals)
-
-/obj/item/attachment/Destroy()
- qdel(attachment_comp)
- attachment_comp = null
- . = ..()
-
-/obj/item/attachment/proc/toggle_attachment(obj/item/gun/gun, mob/user)
- SHOULD_CALL_PARENT(TRUE)
-
- playsound(user, toggled ? toggle_on_sound : toggle_off_sound, 40, TRUE)
- toggled = !toggled
- icon_state = "[initial(icon_state)][toggled ? "-on" : ""]"
-
-/// Checks if a user should be allowed to attach this attachment to the given parent
-/obj/item/attachment/proc/apply_attachment(obj/item/gun/gun, mob/user)
- SHOULD_CALL_PARENT(TRUE)
-
- if(toggled)
- to_chat(user, span_warning("You cannot attach [src] while it is active!"))
- return FALSE
-
- apply_modifiers(gun, user, TRUE)
- playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1)
- return TRUE
-
-/obj/item/attachment/proc/remove_attachment(obj/item/gun/gun, mob/user)
- SHOULD_CALL_PARENT(TRUE)
-
- if(toggled)
- toggle_attachment(gun, user)
-
- apply_modifiers(gun, user, FALSE)
- playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1)
- return TRUE
-
-/obj/item/attachment/proc/on_preattack(obj/item/gun/gun, atom/target, mob/user, list/params)
- return FALSE
-
-///Handles the modifiers to the parent gun
-/obj/item/attachment/proc/apply_modifiers(obj/item/gun/gun, mob/user, attaching)
- if(attaching)
- gun.spread += spread_mod
- gun.spread_unwielded += spread_unwielded_mod
- gun.wield_delay += wield_delay
- gun.w_class += size_mod
- else
- gun.spread -= spread_mod
- gun.spread_unwielded -= spread_unwielded_mod
- gun.wield_delay -= wield_delay
- gun.w_class -= size_mod
diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm
deleted file mode 100644
index 6b1961f4b693..000000000000
--- a/code/game/objects/items/attachments/bayonet.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/obj/item/attachment/bayonet
- name = "bayonet"
- desc = "Stabby-Stabby"
- icon_state = "bayonet"
- force = 15
- throwforce = 10
- pickup_sound = 'sound/items/handling/knife1_pickup.ogg'
- drop_sound = 'sound/items/handling/knife3_drop.ogg'
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- sharpness = IS_SHARP_ACCURATE
-
- pixel_shift_x = 1
- pixel_shift_y = 4
- spread_mod = 1
- wield_delay = 0.1 SECONDS
-
-/obj/item/attachment/bayonet/on_preattack(obj/item/gun/gun, atom/target, mob/living/user, list/params)
- if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE))
- melee_attack_chain(user, target, params)
- return COMPONENT_NO_ATTACK
-
diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm
deleted file mode 100644
index 082da1153de5..000000000000
--- a/code/game/objects/items/attachments/laser_sight.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/obj/item/attachment/laser_sight
- name = "laser sight"
- desc = "Designed to be rail-mounted on a compatible firearm to provide increased accuracy and decreased spread."
- icon_state = "laserpointer"
-
- attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE
- pixel_shift_x = 1
- pixel_shift_y = 4
- wield_delay = 0.1 SECONDS
-
-/obj/item/attachment/laser_sight/toggle_attachment(obj/item/gun/gun, mob/user)
- . = ..()
-
- if(toggled)
- gun.spread -= 3
- gun.spread_unwielded -= 3
- gun.wield_delay -= 0.3 SECONDS
- else
- gun.spread += 3
- gun.spread_unwielded += 3
- gun.wield_delay += 0.3 SECONDS
-
- playsound(user, toggled ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE)
diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm
deleted file mode 100644
index 0cfbe9661e9e..000000000000
--- a/code/game/objects/items/attachments/rail_light.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/obj/item/attachment/rail_light
- name = "rail light"
- desc = "A flashlight made to be mounted on a firearm."
- icon_state = "raillight"
- light_color = COLOR_LIGHT_ORANGE
- light_system = MOVABLE_LIGHT_DIRECTIONAL
- light_range = 4
- light_power = 0.8
- light_on = FALSE
-
- attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE
- pixel_shift_x = 1
- pixel_shift_y = 4
- wield_delay = 0.1 SECONDS
-
-/obj/item/attachment/rail_light/toggle_attachment(obj/item/gun/gun, mob/user)
- . = ..()
- set_light_on(toggled)
- update_icon()
-
-/obj/item/attachment/rail_light/apply_attachment(obj/item/gun/gun, mob/user)
- . = ..()
- if(!.)
- return
-
- set_light_flags(light_flags | LIGHT_ATTACHED)
-
-/obj/item/attachment/rail_light/remove_attachment(obj/item/gun/gun, mob/user)
- . = ..()
- if(!.)
- return
-
- set_light_flags(light_flags & ~LIGHT_ATTACHED)
diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm
deleted file mode 100644
index 31cf3fc15b36..000000000000
--- a/code/game/objects/items/attachments/silencer.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/obj/item/attachment/silencer
- name = "suppressor"
- desc = "An attachment for the barrel of a firearm. Muffles the gunshot and muzzle flash."
- icon_state = "silencer"
-
- slot = ATTACHMENT_SLOT_MUZZLE
- pixel_shift_x = 1
- pixel_shift_y = 2
- spread_mod = -1
- size_mod = 1
-
-/obj/item/attachment/silencer/apply_attachment(obj/item/gun/gun, mob/user)
- . = ..()
- gun.suppressed = TRUE
-
-/obj/item/attachment/silencer/remove_attachment(obj/item/gun/gun, mob/user)
- . = ..()
- gun.suppressed = FALSE
- return TRUE
diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm
deleted file mode 100644
index 1fe286c14296..000000000000
--- a/code/game/objects/items/attachments/stock.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/obj/item/attachment/foldable_stock
- name = "folding stock"
- desc = "A folding stock that can be attached to certain weapons to improve stability and decreases recoil."
- icon_state = "skm-carbine-stock"
- slot = ATTACHMENT_SLOT_STOCK
- attach_features_flags = ATTACH_TOGGLE
-
- pixel_shift_x = 17
- pixel_shift_y = 18
-
- var/toggled_slowdown = 0.10
- var/toggled_wield_delay = -0.4 SECONDS
- var/toggled_recoil_bonus = -2
- var/toggled_spread_bonus = -5
-
-/obj/item/attachment/foldable_stock/toggle_attachment(obj/item/gun/gun, mob/user)
- . = ..()
-
- if(toggled)
- to_chat(user, span_notice("You unfold the stock on the [src]."))
- gun.w_class += 1
- gun.wield_delay += toggled_wield_delay
- gun.wield_slowdown += toggled_slowdown
- gun.recoil += toggled_recoil_bonus
- gun.spread += toggled_spread_bonus
- else
- to_chat(user, span_notice("You fold the stock on the [src]."))
- gun.w_class -= 1
- gun.wield_delay -= toggled_wield_delay
- gun.wield_slowdown -= toggled_slowdown
- gun.recoil -= toggled_recoil_bonus
- gun.spread -= toggled_spread_bonus
-
- if(gun.wielded)
- user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = gun.wield_slowdown)
-
- playsound(src, SOUND_EMPTY_MAG, 100, 1)
-
-/obj/item/attachment/foldable_stock/inteq
- icon_state = "skm-inteqsmg-stock"
diff --git a/code/game/objects/items/bank_card.dm b/code/game/objects/items/bank_card.dm
deleted file mode 100644
index 4a7f2f9d2f21..000000000000
--- a/code/game/objects/items/bank_card.dm
+++ /dev/null
@@ -1,160 +0,0 @@
-/obj/item/card/bank
- name = "cash card"
- desc = "Managed by a bank outside the sector."
- icon_state = "data_1"
- var/mining_points = 0 //For redeeming at mining equipment vendors
-
- var/registered_name = null // The name registered_name on the card
- var/datum/bank_account/registered_account
- var/obj/machinery/paystand/my_store
-
-/obj/item/card/bank/Destroy()
- if (registered_account)
- registered_account.bank_cards -= src
- if (my_store && my_store.my_card == src)
- my_store.my_card = null
- return ..()
-
-/obj/item/card/bank/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/holochip))
- insert_money(W, user)
- return
- else if(istype(W, /obj/item/spacecash/bundle))
- insert_money(W, user, TRUE)
- return
- else if(istype(W, /obj/item/coin))
- insert_money(W, user, TRUE)
- return
- else if(istype(W, /obj/item/storage/bag/money))
- var/obj/item/storage/bag/money/money_bag = W
- var/list/money_contained = money_bag.contents
-
- var/money_added = mass_insert_money(money_contained, user)
-
- if (money_added)
- to_chat(user, "You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")
- return
- else
- return ..()
-
-/obj/item/card/bank/proc/insert_money(obj/item/I, mob/user, physical_currency)
- var/cash_money = I.get_item_credit_value()
- if(!cash_money)
- to_chat(user, "[I] doesn't seem to be worth anything!")
- return
-
- if(!registered_account)
- to_chat(user, "[src] doesn't have a linked account to deposit [I] into!")
- return
-
- registered_account.adjust_money(cash_money)
- SSblackbox.record_feedback("amount", "credits_inserted", cash_money)
- log_econ("[cash_money] credits were inserted into [src] owned by [src.registered_name]")
- if(physical_currency)
- to_chat(user, "You stuff [I] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.")
- else
- to_chat(user, "You insert [I] into [src], adding [cash_money] credits to the linked account.")
-
- to_chat(user, "The linked account now reports a balance of [registered_account.account_balance] cr.")
- qdel(I)
-
-/obj/item/card/bank/proc/mass_insert_money(list/money, mob/user)
- if (!money || !money.len)
- return FALSE
-
- var/total = 0
-
- for (var/obj/item/physical_money in money)
- var/cash_money = physical_money.get_item_credit_value()
-
- total += cash_money
-
- registered_account.adjust_money(cash_money)
- SSblackbox.record_feedback("amount", "credits_inserted", total)
- log_econ("[total] credits were inserted into [src] owned by [src.registered_name]")
- QDEL_LIST(money)
-
- return total
-
-/obj/item/card/bank/proc/alt_click_can_use_id(mob/living/user)
- if(!isliving(user))
- return
- if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
- return
-
- return TRUE
-
-// Returns true if new account was set.
-/obj/item/card/bank/proc/set_new_account(mob/living/user)
- . = FALSE
- var/datum/bank_account/old_account = registered_account
-
- var/new_bank_id = input(user, "Enter your account ID number.", "Account Reclamation", 111111) as num | null
-
- if (isnull(new_bank_id))
- return
-
- if(!alt_click_can_use_id(user))
- return
- if(!new_bank_id || new_bank_id < 111111 || new_bank_id > 999999)
- to_chat(user, "The account ID number needs to be between 111111 and 999999.")
- return
- if (registered_account && registered_account.account_id == new_bank_id)
- to_chat(user, "The account ID was already assigned to this card.")
- return
-
- for(var/A in SSeconomy.bank_accounts)
- var/datum/bank_account/B = A
- if(B.account_id == new_bank_id)
- if (old_account)
- old_account.bank_cards -= src
-
- B.bank_cards += src
- registered_account = B
- to_chat(user, "The provided account has been linked to this ID card.")
-
- return TRUE
-
- to_chat(user, "The account ID number provided is invalid.")
- return
-
-/obj/item/card/bank/AltClick(mob/living/user)
- if(!alt_click_can_use_id(user))
- return
-
- if(!registered_account)
- set_new_account(user)
- return
-
- var/amount_to_remove = FLOOR(input(user, "How much do you want to withdraw? Current Balance: [registered_account.account_balance]", "Withdraw Funds", 5) as num|null, 1)
-
- if(!amount_to_remove || amount_to_remove < 0)
- return
- if(!alt_click_can_use_id(user))
- return
- if(registered_account.adjust_money(-amount_to_remove))
- var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove)
- user.put_in_hands(holochip)
- to_chat(user, "You withdraw [amount_to_remove] credits into a holochip.")
- SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove)
- log_econ("[amount_to_remove] credits were removed from [src] owned by [registered_account.account_holder]")
- return
- else
- var/difference = amount_to_remove - registered_account.account_balance
- registered_account.bank_card_talk("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.", TRUE)
-
-/obj/item/card/bank/examine(mob/user)
- . = ..()
- if(registered_account)
- . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
- . += "The card indicates that the holder is [registered_account.holder_age] years old. [(registered_account.holder_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
- . += "Alt-Click the ID to pull money from the linked account in the form of holochips."
- . += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID."
- . += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number."
- else
- . += "There is no registered account linked to this card. Alt-Click to add one."
- if(mining_points)
- . += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
-
-/obj/item/card/bank/GetBankCard()
- return src
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index fb79cc447ab9..9d5623498733 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -149,12 +149,14 @@
slot_flags = ITEM_SLOT_ID
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
+ var/mining_points = 0 //For redeeming at mining equipment vendors
var/list/access = list()
var/list/ship_access = list()
var/registered_name = null // The name registered_name on the card
var/assignment = null
var/access_txt // mapping aid
- //var/datum/bank_account/registered_account
+ var/datum/bank_account/registered_account
+ var/obj/machinery/paystand/my_store
var/uses_overlays = TRUE
var/icon/cached_flat_icon
var/registered_age = 18 // default age for ss13 players
@@ -165,11 +167,17 @@
. = ..()
if(mapload && access_txt)
access = text2access(access_txt)
- SEND_SIGNAL(src, COSMIG_ACCESS_UPDATED)
update_label()
update_appearance()
RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, PROC_REF(update_in_wallet))
+/obj/item/card/id/Destroy()
+ if (registered_account)
+ registered_account.bank_cards -= src
+ if (my_store && my_store.my_card == src)
+ my_store.my_card = null
+ return ..()
+
/obj/item/card/id/attack_self(mob/user)
if(Adjacent(user))
var/id_message = "\the [initial(name)] "
@@ -193,29 +201,173 @@
if(NAMEOF(src, assignment),NAMEOF(src, registered_name),NAMEOF(src, registered_age))
update_label()
+/obj/item/card/id/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/holochip))
+ insert_money(W, user)
+ return
+ else if(istype(W, /obj/item/spacecash/bundle))
+ insert_money(W, user, TRUE)
+ return
+ else if(istype(W, /obj/item/coin))
+ insert_money(W, user, TRUE)
+ return
+ else if(istype(W, /obj/item/storage/bag/money))
+ var/obj/item/storage/bag/money/money_bag = W
+ var/list/money_contained = money_bag.contents
+
+ var/money_added = mass_insert_money(money_contained, user)
+
+ if (money_added)
+ to_chat(user, "You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")
+ return
+ else
+ return ..()
+
+/obj/item/card/id/proc/insert_money(obj/item/I, mob/user, physical_currency)
+ var/cash_money = I.get_item_credit_value()
+ if(!cash_money)
+ to_chat(user, "[I] doesn't seem to be worth anything!")
+ return
+
+ if(!registered_account)
+ to_chat(user, "[src] doesn't have a linked account to deposit [I] into!")
+ return
+
+ registered_account.adjust_money(cash_money)
+ SSblackbox.record_feedback("amount", "credits_inserted", cash_money)
+ log_econ("[cash_money] credits were inserted into [src] owned by [src.registered_name]")
+ if(physical_currency)
+ to_chat(user, "You stuff [I] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.")
+ else
+ to_chat(user, "You insert [I] into [src], adding [cash_money] credits to the linked account.")
+
+ to_chat(user, "The linked account now reports a balance of [registered_account.account_balance] cr.")
+ qdel(I)
+
+/obj/item/card/id/proc/mass_insert_money(list/money, mob/user)
+ if (!money || !money.len)
+ return FALSE
+
+ var/total = 0
+
+ for (var/obj/item/physical_money in money)
+ var/cash_money = physical_money.get_item_credit_value()
+
+ total += cash_money
+
+ registered_account.adjust_money(cash_money)
+ SSblackbox.record_feedback("amount", "credits_inserted", total)
+ log_econ("[total] credits were inserted into [src] owned by [src.registered_name]")
+ QDEL_LIST(money)
+
+ return total
+
+/obj/item/card/id/proc/alt_click_can_use_id(mob/living/user)
+ if(!isliving(user))
+ return
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+
+ return TRUE
+
+// Returns true if new account was set.
+/obj/item/card/id/proc/set_new_account(mob/living/user)
+ . = FALSE
+ var/datum/bank_account/old_account = registered_account
+
+ var/new_bank_id = input(user, "Enter your account ID number.", "Account Reclamation", 111111) as num | null
+
+ if (isnull(new_bank_id))
+ return
+
+ if(!alt_click_can_use_id(user))
+ return
+ if(!new_bank_id || new_bank_id < 111111 || new_bank_id > 999999)
+ to_chat(user, "The account ID number needs to be between 111111 and 999999.")
+ return
+ if (registered_account && registered_account.account_id == new_bank_id)
+ to_chat(user, "The account ID was already assigned to this card.")
+ return
+
+ for(var/A in SSeconomy.bank_accounts)
+ var/datum/bank_account/B = A
+ if(B.account_id == new_bank_id)
+ if (old_account)
+ old_account.bank_cards -= src
+
+ B.bank_cards += src
+ registered_account = B
+ to_chat(user, "The provided account has been linked to this ID card.")
+
+ return TRUE
+
+ to_chat(user, "The account ID number provided is invalid.")
+ return
+
+/obj/item/card/id/AltClick(mob/living/user)
+ if(!alt_click_can_use_id(user))
+ return
+
+ if(!registered_account)
+ set_new_account(user)
+ return
+
+ var/amount_to_remove = FLOOR(input(user, "How much do you want to withdraw? Current Balance: [registered_account.account_balance]", "Withdraw Funds", 5) as num|null, 1)
+
+ if(!amount_to_remove || amount_to_remove < 0)
+ return
+ if(!alt_click_can_use_id(user))
+ return
+ if(registered_account.adjust_money(-amount_to_remove))
+ var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove)
+ user.put_in_hands(holochip)
+ to_chat(user, "You withdraw [amount_to_remove] credits into a holochip.")
+ SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove)
+ log_econ("[amount_to_remove] credits were removed from [src] owned by [src.registered_name]")
+ return
+ else
+ var/difference = amount_to_remove - registered_account.account_balance
+ registered_account.bank_card_talk("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal.", TRUE)
+
/obj/item/card/id/examine(mob/user)
. = ..()
- . += " CARD INFO:"
+ . += "There's more information below, you can look again to take a closer look..."
+
+/obj/item/card/id/examine_more(mob/user)
+ var/list/msg = list("You examine [src] closer, and note the following...")
+
if(registered_name)
- . += "NAME:"
- . += "[registered_name]"
+ msg += "NAME:"
+ msg += "[registered_name]"
if(registered_age)
- . += "AGE:"
- . += "[registered_age] years old [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
+ msg += "AGE:"
+ msg += "[registered_age] years old [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]"
if(length(ship_access))
- . += "SHIP ACCESS:"
+ msg += "SHIP ACCESS:"
var/list/ship_factions = list()
for(var/datum/overmap/ship/controlled/ship in ship_access)
var/faction = ship.get_faction()
if(!(faction in ship_factions))
ship_factions += faction
- . += "[ship_factions.Join(", ")]"
+ msg += "[ship_factions.Join(", ")]"
var/list/ship_names = list()
for(var/datum/overmap/ship/controlled/ship in ship_access)
ship_names += ship.name
- . += "[ship_names.Join(", ")]"
+ msg += "[ship_names.Join(", ")]"
+
+ if(registered_account)
+ msg += "ACCOUNT:"
+ msg += "LINKED ACCOUNT HOLDER: '[registered_account.account_holder]'"
+ msg += "BALANCE: [registered_account.account_balance] cr."
+ msg += "Alt-click the ID to pull money from the account in the form of holochips."
+ msg += "You can insert credits into the account by pressing holochips, cash, or coins against the ID."
+ if(registered_account.account_holder == user.real_name)
+ msg += "If you lose this ID card, you can reclaim your account by Alt-click a blank ID card and entering your account ID number."
+ else
+ msg += "There is no registered account. Alt-click to add one."
+ return msg
/obj/item/card/id/GetAccess()
return access
@@ -260,13 +412,11 @@
/obj/item/card/id/proc/add_ship_access(datum/overmap/ship/controlled/ship)
if (ship)
ship_access += ship
- SEND_SIGNAL(src, COSMIG_ACCESS_UPDATED)
// Removes the referenced ship from the card
/obj/item/card/id/proc/remove_ship_access(datum/overmap/ship/controlled/ship)
if (ship)
ship_access -= ship
- SEND_SIGNAL(src, COSMIG_ACCESS_UPDATED)
// Finds the referenced ship in the list
/obj/item/card/id/proc/has_ship_access(datum/overmap/ship/controlled/ship)
@@ -333,7 +483,7 @@ update_label()
else
return ..()
- var/popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset")
+ var/popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset", "Change Account ID")
if(user.incapacitated())
return
if(popup_input == "Forge/Reset" && !forged)
@@ -363,6 +513,17 @@ update_label()
to_chat(user, "You successfully forge the ID card.")
log_game("[key_name(user)] has forged \the [initial(name)] with name \"[registered_name]\" and occupation \"[assignment]\".")
+ // First time use automatically sets the account id to the user.
+ if (first_use && !registered_account)
+ if(ishuman(user))
+ var/mob/living/carbon/human/accountowner = user
+
+ for(var/bank_account in SSeconomy.bank_accounts)
+ var/datum/bank_account/account = bank_account
+ if(account.account_id == accountowner.account_id)
+ account.bank_cards += src
+ registered_account = account
+ to_chat(user, "Your account number has been automatically assigned.")
return
else if (popup_input == "Forge/Reset" && forged)
registered_name = initial(registered_name)
@@ -374,6 +535,9 @@ update_label()
forged = FALSE
to_chat(user, "You successfully reset the ID card.")
return
+ else if (popup_input == "Change Account ID")
+ set_new_account(user)
+ return
return ..()
/obj/item/card/id/syndicate/anyone
@@ -388,6 +552,7 @@ update_label()
icon_state = "syndie"
access = list(ACCESS_SYNDICATE)
uses_overlays = FALSE
+ registered_age = null
/obj/item/card/id/syndicate_command/crew_id
assignment = "Operative"
@@ -575,6 +740,11 @@ update_label()
registered_name = "Prisoner #13-007"
icon_state = "prisoner_007"
+/obj/item/card/id/mining
+ name = "mining ID"
+ access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MECH_MINING, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
+ custom_price = 250
+
/obj/item/card/id/away
name = "\proper a perfectly generic identification card"
desc = "A perfectly generic identification card. Looks like it could use some flavor."
@@ -596,26 +766,13 @@ update_label()
name = "bunker access ID"
/obj/item/card/id/solgov
- name = "\improper SolGov keycard"
- desc = "A SolGov keycard with no proper access to speak of."
+ name = "\improper SolGov ID"
+ desc = "A SolGov ID with no proper access to speak of."
assignment = "Officer"
icon_state = "solgov"
uses_overlays = FALSE
/obj/item/card/id/solgov/commander
- name = "\improper SolGov commander keycard"
- desc = "A SolGov keycard with no proper access to speak of. This one indicates a Commander."
+ name = "\improper SolGov ID"
+ desc = "A SolGov ID with no proper access to speak of. This one indicates a Commander."
assignment = "Commander"
-
-/obj/item/card/id/suns
- name = "\improper SUNS keycard"
- desc = "A keycard belonging to the Student-Union Association of Naturalistic Sciences."
- assignment = "Student"
- icon_state = "suns"
- uses_overlays = FALSE
-
-/obj/item/card/id/suns/command
- name = "\improper SUNS command keycard"
- desc = "A keycard belonging to the Student-Union Association of Naturalistic Sciences. This one has a gold stripe, indicating a command member."
- assignment = "Academic Staff"
- icon_state = "sunscommand"
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 47739ded1551..54dcfb36c131 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -362,7 +362,7 @@
build_path = /obj/machinery/computer/bounty
/obj/item/circuitboard/computer/cargo
- name = "Outpost Comms Console (Computer Board)"
+ name = "Supply Console (Computer Board)"
icon_state = "supply"
build_path = /obj/machinery/computer/cargo
var/contraband = FALSE
@@ -381,6 +381,16 @@
obj_flags |= EMAGGED
to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
+/obj/item/circuitboard/computer/cargo/express
+ name = "Outpost Comms Console (Computer Board)"
+ build_path = /obj/machinery/computer/cargo/express
+
+/obj/item/circuitboard/computer/cargo/express/multitool_act(mob/living/user)
+ return
+
+/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user)
+ return
+
/obj/item/circuitboard/computer/mining
name = "Outpost Status Display (Computer Board)"
icon_state = "supply"
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 0a3a6f14d097..4fbe06343ae5 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1442,15 +1442,6 @@
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/micro_laser = 1)
-/obj/item/circuitboard/machine/shuttle/engine/fire
- name = "Combustion Thruster (Machine Board)"
- build_path = /obj/machinery/power/shuttle/engine/fire
- req_components = list(
- /obj/item/stock_parts/micro_laser = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/stack/sheet/plasteel = 2
- )
-
/obj/item/circuitboard/machine/shuttle/engine/electric
name = "Ion Thruster (Machine Board)"
build_path = /obj/machinery/power/shuttle/engine/electric
@@ -1506,26 +1497,6 @@
. = ..()
. += "It is set to layer [pipe_layer]."
-/obj/item/circuitboard/machine/shuttle/fire_heater
- name = "Combustion Engine Heater (Machine Board)"
- desc = "You can use mulitool to switch pipe layers"
- var/pipe_layer = PIPING_LAYER_DEFAULT
- build_path = /obj/machinery/atmospherics/components/unary/shuttle/fire_heater
- req_components = list(
- /obj/item/stock_parts/micro_laser = 1,
- /obj/item/stock_parts/matter_bin = 1
- )
-
-/obj/item/circuitboard/machine/shuttle/fire_heater/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_MULTITOOL)
- pipe_layer = (pipe_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (pipe_layer + 1)
- to_chat(user, "You change the circuitboard to layer [pipe_layer].")
- return
-
-/obj/item/circuitboard/machine/shuttle/fire_heater/examine()
- . = ..()
- . += "It is set to layer [pipe_layer]."
-
/obj/item/circuitboard/machine/shuttle/smes
name = "Electric Engine Precharger (Machine Board)"
build_path = /obj/machinery/power/smes/shuttle
diff --git a/code/game/objects/items/decal_painter.dm b/code/game/objects/items/decal_painter.dm
index 7b12190ba581..e6043d584a84 100644
--- a/code/game/objects/items/decal_painter.dm
+++ b/code/game/objects/items/decal_painter.dm
@@ -201,9 +201,9 @@
to_chat(user, "\The [src] can only be used on flooring.")
return
if(color_disallowed.Find(decal_state))
- F.AddElement(/datum/element/decal, 'icons/turf/decals/decals.dmi', decal_state, decal_dir, FALSE, color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', decal_state, decal_dir, FALSE, color, null, null, alpha)
else
- F.AddElement(/datum/element/decal, 'icons/turf/decals/decals.dmi', decal_state, decal_dir, FALSE, decal_color, null, null, alpha)
+ F.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', decal_state, decal_dir, FALSE, decal_color, null, null, alpha)
playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE)
/obj/item/decal_painter/attack_self(mob/user)
@@ -215,7 +215,7 @@
/obj/item/decal_painter/interact(mob/user as mob) //TODO: Make TGUI for this because ouch
if(!decal_icon)
- decal_icon = icon('icons/turf/decals/decals.dmi', decal_state, decal_dir)
+ decal_icon = icon('icons/turf/decals.dmi', decal_state, decal_dir)
user << browse_rsc(decal_icon, "floor.png")
var/dat = {"
@@ -288,7 +288,7 @@
decal_color = chosen_colour
- decal_icon = icon('icons/turf/decals/decals.dmi', decal_state, decal_dir)
+ decal_icon = icon('icons/turf/decals.dmi', decal_state, decal_dir)
if(usr)
attack_self(usr)
diff --git a/code/game/objects/items/desk_flags.dm b/code/game/objects/items/desk_flags.dm
index c1af9cfe6c3f..3e7c299fc3bd 100644
--- a/code/game/objects/items/desk_flags.dm
+++ b/code/game/objects/items/desk_flags.dm
@@ -1,6 +1,6 @@
/obj/item/desk_flag
name = "blank desk flag"
- desc = "Show your patriotism with desk flags!"
+ desc = "Show your patriotism with WaffleCo. brand desk flags!"
icon = 'icons/obj/deskflags.dmi'
icon_state = "flag"
force = 3
@@ -30,8 +30,3 @@
name = "gezenan desk flag"
desc = "A small banner on a pole depicting the sigil of the Pan-Gezenan Federation."
icon_state = "gezena"
-
-/obj/item/desk_flag/suns
- name = "SUNS desk flag"
- desc = "A little desk decoration in the gold and purple color palette of SUNS."
- icon_state = "suns"
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index c8a918732a9d..37613679e628 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -239,8 +239,3 @@
name = "brig physician PDA"
default_cartridge = /obj/item/cartridge/medical
icon_state = "pda-brig_phys"
-
-/obj/item/pda/suns
- name = "SUNS PDA"
- default_cartridge = /obj/item/cartridge/medical
- icon_state = "pda-suns"
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 204371ca0e51..dca088c1be2e 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -28,7 +28,7 @@
custom_materials = list(/datum/material/iron=50, /datum/material/glass=20)
custom_premium_price = 450
toolspeed = 1
- usesound = SOUND_EMPTY_MAG
+ usesound = 'sound/weapons/empty.ogg'
var/obj/machinery/buffer // simple machine buffer for device linkage
var/mode = 0
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index f8ced22c54be..73cae6b853bc 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -88,11 +88,6 @@
icon_state = "solgov_cypherkey"
channels = list(RADIO_CHANNEL_SOLGOV = 1)
-// /obj/item/encryptionkey/suns
-// name = "\improper SUNS encryption key"
-// icon_state = "suns_cypherkey"
-// channels = list(RADIO_CHANNEL_SUNS = 1)
-
/obj/item/encryptionkey/wideband
name = "wideband encryption key"
icon = 'icons/obj/radio.dmi'
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 0f0081c90454..3afd539d4c97 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -118,26 +118,6 @@ GLOBAL_LIST_INIT(channel_tokens, list(
name = "team leader headset"
command = TRUE
-/obj/item/radio/headset/syndicate/suns
- name = "SUNS headset"
- icon_state = "suns_headset"
- desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere."
-
-/obj/item/radio/headset/syndicate/suns/command
- name = "SUNS command headset"
- desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere. This one is worn by command staff."
- command = TRUE
-
-/obj/item/radio/headset/syndicate/alt/suns
- name = "SUNS bowman headset"
- icon_state = "suns_headset_alt"
- desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere. Protects ears from distractions during exams."
-
-/obj/item/radio/headset/syndicate/alt/suns/command
- name = "SUNS bowman command headset"
- desc = "A headset worn by staff and students of SUNS, both in the frontier and elsewhere. This one is worn by command staff. Protects ears from distractions during exams."
- command = TRUE
-
//nanotrasen
/obj/item/radio/headset/nanotrasen
name = "nanotrasen radio headset"
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 113a72fb8d8d..a11539595805 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -247,6 +247,30 @@
name = "\improper DNA injector (Anti-Unintelligible)"
remove_mutations = list(UNINTELLIGIBLE)
+/obj/item/dnainjector/swedishmut
+ name = "\improper DNA injector (Swedish)"
+ add_mutations = list(SWEDISH)
+
+/obj/item/dnainjector/antiswedish
+ name = "\improper DNA injector (Anti-Swedish)"
+ remove_mutations = list(SWEDISH)
+
+/obj/item/dnainjector/chavmut
+ name = "\improper DNA injector (Chav)"
+ add_mutations = list(CHAV)
+
+/obj/item/dnainjector/antichav
+ name = "\improper DNA injector (Anti-Chav)"
+ remove_mutations = list(CHAV)
+
+/obj/item/dnainjector/elvismut
+ name = "\improper DNA injector (Elvis)"
+ add_mutations = list(ELVIS)
+
+/obj/item/dnainjector/antielvis
+ name = "\improper DNA injector (Anti-Elvis)"
+ remove_mutations = list(ELVIS)
+
/obj/item/dnainjector/lasereyesmut
name = "\improper DNA injector (Laser Eyes)"
add_mutations = list(LASEREYES)
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index 813e53111f61..6a1e439422a4 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -183,9 +183,9 @@
update_appearance()
#define REQUIRED_POWER_TO_FIRE_FLAMETHROWER 10
-#define FLAMETHROWER_POWER_MULTIPLIER 0.8
-#define FLAMETHROWER_RANGE 5
-#define FLAMETHROWER_RELEASE_AMOUNT 5
+#define FLAMETHROWER_POWER_MULTIPLIER 0.5
+#define FLAMETHROWER_RANGE 4
+#define FLAMETHROWER_RELEASE_AMOUNT 8
/obj/item/flamethrower/proc/flame_turf(target)
if(!beaker)
diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm
deleted file mode 100644
index b8233e0ecc76..000000000000
--- a/code/game/objects/items/food/_food.dm
+++ /dev/null
@@ -1,67 +0,0 @@
-///Abstract class to allow us to easily create all the generic "normal" food without too much copy pasta of adding more components
-/obj/item/food
- name = "food"
- desc = "you eat this"
- resistance_flags = FLAMMABLE
- w_class = WEIGHT_CLASS_SMALL
- icon = 'icons/obj/food/food.dmi'
- icon_state = null
- lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
- ///List of reagents this food gets on creation
- var/list/food_reagents
- ///Extra flags for things such as if the food is in a container or not
- var/food_flags
- ///Bitflag of the types of food this food is
- var/foodtypes
- ///Amount of volume the food can contain
- var/max_volume
- ///How long it will take to eat this food without any other modifiers
- var/eat_time
- ///Tastes to describe this food
- var/list/tastes
- ///Verbs used when eating this food in the to_chat messages
- var/list/eatverbs
- ///How much reagents per bite
- var/bite_consumption
- ///What you get if you microwave the food, this should be replaced once I fully re-work cooking.
- var/microwaved_type
- ///Type of atom thats spawned after eating this item
- var/trash_type
-
-/obj/item/food/Initialize()
- . = ..()
- if(food_reagents)
- food_reagents = string_assoc_list(food_reagents)
- if(tastes)
- tastes = string_assoc_list(tastes)
- if(eatverbs)
- eatverbs = string_list(eatverbs)
- make_edible()
- make_processable()
- make_leave_trash()
-
-///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks.
-/obj/item/food/proc/make_edible()
- AddComponent(/datum/component/edible,\
- initial_reagents = food_reagents,\
- food_flags = food_flags,\
- foodtypes = foodtypes,\
- volume = max_volume,\
- eat_time = eat_time,\
- tastes = tastes,\
- eatverbs = eatverbs,\
- bite_consumption = bite_consumption,\
- microwaved_type = microwaved_type,\
- )
-
-
-///This proc handles processable elements, overwrite this if you want to add behavior such as slicing, forking, spooning, whatever, to turn the item into something else
-/obj/item/food/proc/make_processable()
- return
-
-///This proc handles trash components, overwrite this if you want the object to spawn trash
-/obj/item/food/proc/make_leave_trash()
- if(trash_type)
- AddElement(/datum/element/food_trash, trash_type)
- return
diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm
deleted file mode 100644
index 609315a9ea12..000000000000
--- a/code/game/objects/items/food/bread.dm
+++ /dev/null
@@ -1,378 +0,0 @@
-
-/obj/item/food/bread
- name = "bread?"
- desc = "This shouldn't exist, report to codermonkeys"
- icon = 'icons/obj/food/burgerbread.dmi'
- max_volume = 80
- tastes = list("bread" = 10)
- foodtypes = GRAIN
- eat_time = 3 SECONDS
- /// type is spawned 5 at a time and replaces this bread loaf when processed by cutting tool
- var/obj/item/food/breadslice/slice_type
- /// so that the yield can change if it isnt 5
- var/yield = 5
-
-/obj/item/food/bread/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/dunkable, 10)
- AddComponent(/datum/component/food_storage)
-
-/obj/item/food/bread/make_processable()
- if (slice_type)
- AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE)
- AddElement(/datum/element/processable, TOOL_SAW, slice_type, yield, 4 SECONDS, table_required = TRUE)
-
-/obj/item/food/breadslice
- name = "breadslice?"
- desc = "This shouldn't exist, report to codermonkeys"
- icon = 'icons/obj/food/burgerbread.dmi'
- foodtypes = GRAIN
- food_flags = FOOD_FINGER_FOOD
- eat_time = 0.5 SECONDS
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/breadslice/Initialize()
- . = ..()
- AddElement(/datum/element/dunkable, 10)
-
-/obj/item/food/bread/plain
- name = "bread"
- desc = "Some plain old earthen bread."
- icon_state = "bread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 10
- )
- tastes = list("bread" = 10)
- foodtypes = GRAIN
- w_class = WEIGHT_CLASS_SMALL
- slice_type = /obj/item/food/breadslice/plain
-
-/obj/item/food/breadslice/plain
- name = "bread slice"
- desc = "A slice of home."
- icon_state = "breadslice"
- foodtypes = GRAIN
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 2
- )
-
-/obj/item/food/breadslice/moldy
- name = "moldy bread slice"
- desc = "Entire stations have been ripped apart over arguing whether this is still good to eat."
- icon_state = "moldybreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 2,
- /datum/reagent/consumable/mold = 10,
- )
- tastes = list("decaying fungus" = 1)
- foodtypes = GROSS
-
-/obj/item/food/bread/meat
- name = "meatbread loaf"
- desc = "The culinary base of every self-respecting eloquen/tg/entleman."
- icon_state = "meatbread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("bread" = 10, "meat" = 10)
- foodtypes = GRAIN | MEAT
- slice_type = /obj/item/food/breadslice/meat
-
-/obj/item/food/breadslice/meat
- name = "meatbread slice"
- desc = "A slice of delicious meatbread."
- icon_state = "meatbreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 2
- )
- tastes = list("bread" = 1, "meat" = 1)
- foodtypes = GRAIN | MEAT
-
-/obj/item/food/bread/xenomeat
- name = "xenomeatbread loaf"
- desc = "Extra Heretical."
- icon_state = "xenomeatbread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("bread" = 10, "acid" = 10)
- foodtypes = GRAIN | MEAT
- slice_type = /obj/item/food/breadslice/xenomeat
-
-/obj/item/food/breadslice/xenomeat
- name = "xenomeatbread slice"
- desc = "A slice of delicious meatbread. Extra Heretical."
- icon_state = "xenobreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 2
- )
- tastes = list("bread" = 10, "acid" = 10)
- foodtypes = GRAIN | MEAT
-
-/obj/item/food/bread/spidermeat
- name = "spider meat loaf"
- desc = "Reassuringly green meatloaf made from spider meat."
- icon_state = "spidermeatbread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/toxin = 15,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("bread" = 10, "cobwebs" = 5)
- foodtypes = GRAIN | MEAT | TOXIC
- slice_type = /obj/item/food/breadslice/spidermeat
-
-/obj/item/food/breadslice/spidermeat
- name = "spider meat bread slice"
- desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
- icon_state = "xenobreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 3,
- /datum/reagent/toxin = 3,
- /datum/reagent/consumable/nutriment/vitamin = 1
- )
- tastes = list("bread" = 10, "cobwebs" = 5)
- foodtypes = GRAIN | MEAT | TOXIC
-
-/obj/item/food/bread/banana
- name = "banana-nut bread"
- desc = "A heavenly and filling treat."
- icon_state = "bananabread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/banana = 20
- )
- tastes = list("bread" = 10) // bananjuice will also flavour
- foodtypes = GRAIN | FRUIT
- slice_type = /obj/item/food/breadslice/banana
-
-/obj/item/food/breadslice/banana
- name = "banana-nut bread slice"
- desc = "A slice of delicious banana bread."
- icon_state = "bananabreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/banana = 4
- )
- tastes = list("bread" = 10)
- foodtypes = GRAIN | FRUIT
-
-/obj/item/food/bread/tofu
- name = "Tofubread"
- desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
- icon_state = "tofubread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("bread" = 10, "tofu" = 10)
- foodtypes = GRAIN | VEGETABLES
- slice_type = /obj/item/food/breadslice/tofu
-
-/obj/item/food/breadslice/tofu
- name = "tofubread slice"
- desc = "A slice of delicious tofubread."
- icon_state = "tofubreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 2
- )
- tastes = list("bread" = 10, "tofu" = 10)
- foodtypes = GRAIN | VEGETABLES
-
-/obj/item/food/bread/creamcheese
- name = "cream cheese bread"
- desc = "Just a schmear."
- icon_state = "creamcheesebread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("bread" = 10, "cheese" = 10)
- foodtypes = GRAIN | DAIRY
- slice_type = /obj/item/food/breadslice/creamcheese
-
-/obj/item/food/breadslice/creamcheese
- name = "cream cheese bread slice"
- desc = "A slice of Brotherly love!"
- icon_state = "creamcheesebreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 3,
- /datum/reagent/consumable/nutriment/vitamin = 2
- )
- tastes = list("bread" = 10, "cheese" = 10)
- foodtypes = GRAIN | DAIRY
-
-/obj/item/food/bread/mimana
- name = "mimana bread"
- desc = "Best eaten in silence."
- icon_state = "mimanabread"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/toxin/mutetoxin = 10,
- /datum/reagent/consumable/nothing = 10,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("bread" = 10, "silence" = 10)
- foodtypes = GRAIN | FRUIT
- slice_type = /obj/item/food/breadslice/mimana
-
-/obj/item/food/breadslice/mimana
- name = "mimana bread slice"
- desc = "A slice of silence!"
- icon_state = "mimanabreadslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/toxin/mutetoxin = 2,
- /datum/reagent/consumable/nothing = 2,
- /datum/reagent/consumable/nutriment/vitamin = 2
- )
- foodtypes = GRAIN | FRUIT
-
-/obj/item/food/breadslice/custom
- name = "bread slice"
- icon_state = "tofubreadslice"
- foodtypes = GRAIN
-
-/obj/item/food/baguette
- name = "baguette"
- desc = "Bon appetit!"
- icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "baguette"
- item_state = null
- mob_overlay_state = "baguette"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 8,
- /datum/reagent/consumable/nutriment/vitamin = 3
- )
- bite_consumption = 3
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
- attack_verb = list("touche")
- tastes = list("bread" = 1)
- foodtypes = GRAIN
-
-/obj/item/food/garlicbread
- name = "garlic bread"
- desc = "Alas, it is limited."
- icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "garlicbread"
- item_state = null
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 10,
- /datum/reagent/consumable/nutriment/vitamin = 6,
- /datum/reagent/consumable/garlic = 2
- )
- bite_consumption = 3
- tastes = list("bread" = 1, "garlic" = 1, "butter" = 1)
- foodtypes = GRAIN
-
-/obj/item/food/deepfryholder
- name = "Deep Fried Foods Holder Obj"
- desc = "If you can see this description the code for the deep fryer fucked up."
- icon = 'icons/obj/food/food.dmi'
- icon_state = ""
- bite_consumption = 2
-
-/obj/item/food/deepfryholder/make_edible()
- AddComponent(/datum/component/edible,\
- initial_reagents = food_reagents,\
- food_flags = food_flags,\
- foodtypes = foodtypes,\
- volume = max_volume,\
- eat_time = eat_time,\
- tastes = tastes,\
- eatverbs = eatverbs,\
- bite_consumption = bite_consumption,\
- on_consume = CALLBACK(src, PROC_REF(On_Consume)))
-
-
-/obj/item/food/deepfryholder/Initialize(mapload, obj/item/fried)
- . = ..()
- name = fried.name //We'll determine the other stuff when it's actually removed
- appearance = fried.appearance
- layer = initial(layer)
- plane = initial(plane)
- lefthand_file = fried.lefthand_file
- righthand_file = fried.righthand_file
- mob_overlay_state = fried.mob_overlay_state
- desc = fried.desc
- w_class = fried.w_class
- slowdown = fried.slowdown
- equip_delay_self = fried.equip_delay_self
- equip_delay_other = fried.equip_delay_other
- strip_delay = fried.strip_delay
- species_exception = fried.species_exception
- item_flags = fried.item_flags
- obj_flags = fried.obj_flags
- inhand_x_dimension = fried.inhand_x_dimension
- inhand_y_dimension = fried.inhand_y_dimension
-
- if(!(SEND_SIGNAL(fried, COMSIG_ITEM_FRIED, src) & COMSIG_FRYING_HANDLED)) //If frying is handled by signal don't do the defaault behavior.
- fried.forceMove(src)
-
-
-/obj/item/food/deepfryholder/Destroy()
- if(contents)
- QDEL_LIST(contents)
- return ..()
-
-/obj/item/food/deepfryholder/proc/On_Consume(eater, feeder)
- if(contents)
- QDEL_LIST(contents)
-
-
-/obj/item/food/deepfryholder/proc/fry(cook_time = 30)
- switch(cook_time)
- if(0 to 15)
- add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
- name = "lightly-fried [name]"
- desc = "[desc] It's been lightly fried in a deep fryer."
- if(16 to 49)
- add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
- name = "fried [name]"
- desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%."
- if(50 to 59)
- add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
- name = "deep-fried [name]"
- desc = "[desc] Deep-fried to perfection."
- if(60 to INFINITY)
- add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
- name = "\proper the physical manifestation of the very concept of fried foods"
- desc = "A heavily-fried... something. Who can tell anymore?"
- foodtypes |= FRIED
-
-/obj/item/food/butterbiscuit
- name = "butter biscuit"
- desc = "Well butter my biscuit!"
- icon = 'icons/obj/food/food.dmi'
- icon_state = "butterbiscuit"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 6,
- /datum/reagent/consumable/nutriment/vitamin = 1
- )
- tastes = list("butter" = 1, "biscuit" = 1)
- foodtypes = GRAIN | BREAKFAST
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/butterdog
- name = "butterdog"
- desc = "Made from exotic butters."
- icon = 'icons/obj/food/food.dmi'
- icon_state = "butterdog"
- bite_consumption = 1
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 6,
- /datum/reagent/consumable/nutriment/vitamin = 1
- )
- tastes = list("butter" = 1, "exotic butter" = 1)
- foodtypes = GRAIN | DAIRY
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/butterdog/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/slippery, 8 SECONDS)
diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm
deleted file mode 100644
index d6299a24d524..000000000000
--- a/code/game/objects/items/food/cake.dm
+++ /dev/null
@@ -1,538 +0,0 @@
-/obj/item/food/cake
- icon = 'icons/obj/food/piecake.dmi'
- bite_consumption = 3
- max_volume = 80
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 5
- )
- tastes = list("cake" = 1)
- foodtypes = GRAIN | DAIRY
- /// type is spawned 5 at a time and replaces this cake when processed by cutting tool
- var/obj/item/food/cakeslice/slice_type
- /// changes yield of sliced cake, default for cake is 5
- var/yield = 5
-
-/obj/item/food/cake/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/food_storage)
-
-/obj/item/food/cake/make_processable()
- if (slice_type)
- AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE)
-
-/obj/item/food/cakeslice
- icon = 'icons/obj/food/piecake.dmi'
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 1
- )
- tastes = list("cake" = 1)
- foodtypes = GRAIN | DAIRY
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/food/cake/plain
- name = "plain cake"
- desc = "A plain cake, not a lie." //Many of the cakes seem to follow this desc scheme, so I am going to try and put either a hint about its contents, or a fun fact. Lets try to follow this.
- icon_state = "plaincake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 30,
- /datum/reagent/consumable/nutriment/vitamin = 7
- )
- tastes = list("sweetness" = 2, "cake" = 5)
- foodtypes = GRAIN | DAIRY | SUGAR
- slice_type = /obj/item/food/cakeslice/plain
-
-/obj/item/food/cakeslice/plain
- name = "plain cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "plaincake_slice"
- tastes = list("sweetness" = 2,"cake" = 5)
- foodtypes = GRAIN | DAIRY | SUGAR
-
-/obj/item/food/cake/carrot
- name = "carrot cake"
- desc = "Scientifically proven to improve eyesight! Not a lie."
- icon_state = "carrotcake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/medicine/oculine = 10,
- /datum/reagent/consumable/nutriment/vitamin = 5
- )
- tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
- foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
- slice_type = /obj/item/food/cakeslice/carrot
-
-/obj/item/food/cakeslice/carrot
- name = "carrot cake slice"
- desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie."
- icon_state = "carrotcake_slice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/medicine/oculine = 2,
- /datum/reagent/consumable/nutriment/vitamin = 1
- )
- tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
- foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
-
-/obj/item/food/cake/brain
- name = "brain cake"
- desc = "Yeah... its actually made out of brain. I wish it were a lie."
- icon_state = "braincake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 15,
- /datum/reagent/medicine/mannitol = 10,
- /datum/reagent/consumable/nutriment/vitamin = 5
- )
- tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
- foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR
- slice_type = /obj/item/food/cakeslice/brain
-
-/obj/item/food/cakeslice/brain
- name = "brain cake slice"
- desc = "Lemme tell you something about prions. THEY'RE DELICIOUS. A terrifying not-lie."
- icon_state = "braincakeslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/medicine/mannitol = 2,
- /datum/reagent/consumable/nutriment/vitamin = 1
- )
- tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
- foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR
-
-/obj/item/food/cake/cheese
- name = "cheese cake"
- desc = "DANGEROUSLY cheesy."
- icon_state = "cheesecake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 8
- )
- tastes = list("cake" = 4, "cream cheese" = 3)
- foodtypes = GRAIN | DAIRY
- slice_type = /obj/item/food/cakeslice/cheese
-
-/obj/item/food/cakeslice/cheese
- name = "cheese cake slice"
- desc = "Slice of pure cheestisfaction."
- icon_state = "cheesecake_slice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 1.3
- )
- tastes = list("cake" = 4, "cream cheese" = 3)
- foodtypes = GRAIN | DAIRY
-
-/obj/item/food/cake/orange
- name = "orange cake"
- desc = "A cake with added orange."
- icon_state = "orangecake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
- slice_type = /obj/item/food/cakeslice/orange
-
-/obj/item/food/cakeslice/orange
- name = "orange cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "orangecake_slice"
- tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/food/cake/lime
- name = "lime cake"
- desc = "A cake with added lime."
- icon_state = "limecake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
- slice_type = /obj/item/food/cakeslice/lime
-
-/obj/item/food/cakeslice/lime
- name = "lime cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "limecake_slice"
- tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/food/cake/lemon
- name = "lemon cake"
- desc = "A cake with added lemon."
- icon_state = "lemoncake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("cake" = 5, "sweetness" = 3, "sourness" = 1) //lemon cake is never as sour as it is sweet, have you ever actually eaten it?
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
- slice_type = /obj/item/food/cakeslice/lemon
-
-/obj/item/food/cakeslice/lemon
- name = "lemon cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "lemoncake_slice"
- tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/food/cake/chocolate
- name = "chocolate cake"
- desc = "A cake with added chocolate."
- icon_state = "chocolatecake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
- foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
- slice_type = /obj/item/food/cakeslice/chocolate
-
-/obj/item/food/cakeslice/chocolate
- name = "chocolate cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "chocolatecake_slice"
- tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
- foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
-/obj/item/food/cake/birthday
- name = "birthday cake"
- desc = "Happy Birthday little clown..."
- icon_state = "birthdaycake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/sprinkles = 10,
- /datum/reagent/consumable/nutriment/vitamin = 5
- )
- tastes = list("cake" = 5, "sweetness" = 1)
- foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
- slice_type = /obj/item/food/cakeslice/birthday
-
-/obj/item/food/cake/birthday/microwave_act(obj/machinery/microwave/M) //super sekrit club
- new /obj/item/clothing/head/hardhat/cakehat(get_turf(src))
- qdel(src)
-
-/obj/item/food/cakeslice/birthday
- name = "birthday cake slice"
- desc = "A slice of your birthday."
- icon_state = "birthdaycakeslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/sprinkles = 2,
- /datum/reagent/consumable/nutriment/vitamin = 1
- )
- tastes = list("cake" = 5, "sweetness" = 1)
- foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
-/obj/item/food/cake/birthday/energy
- name = "energy cake"
- desc = "Just enough calories for a whole nuclear operative squad."
- icon_state = "energycake"
- force = 5
- hitsound = 'sound/weapons/blade1.ogg'
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 10,
- /datum/reagent/consumable/sprinkles = 10,
- /datum/reagent/consumable/nutriment/vitamin = 5,
- /datum/reagent/consumable/pacfuel = 10,
- /datum/reagent/consumable/liquidelectricity = 10
- )
- tastes = list("cake" = 3, "a Vlad's Salad" = 1)
- slice_type = /obj/item/food/cakeslice/birthday/energy
-
-/obj/item/food/cake/birthday/energy/microwave_act(obj/machinery/microwave/M) //super sekriter club
- new /obj/item/clothing/head/hardhat/cakehat/energycake(get_turf(src))
- qdel(src)
-
-/obj/item/food/cake/birthday/energy/proc/energy_bite(mob/living/user)
- to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!")
- user.apply_damage(30, BURN, BODY_ZONE_HEAD) // ITs an ENERGY sword, so it burns, duh
- playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
-
-/obj/item/food/cake/birthday/energy/attack(mob/living/target_mob, mob/living/user)
- . = ..()
- if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly
- return
- energy_bite(target_mob, user)
-
-/obj/item/food/cakeslice/birthday/energy
- name = "energy cake slice"
- desc = "For the traitor on the go."
- icon_state = "energycakeslice"
- force = 2
- hitsound = 'sound/weapons/blade1.ogg'
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/sprinkles = 2,
- /datum/reagent/consumable/nutriment/vitamin = 1,
- /datum/reagent/consumable/pacfuel = 2,
- /datum/reagent/consumable/liquidelectricity = 2
- )
- tastes = list("cake" = 3, "a Vlad's Salad" = 1)
-
-/obj/item/food/cakeslice/birthday/energy/proc/energy_bite(mob/living/user)
- to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!")
- user.apply_damage(18, BURN, BODY_ZONE_HEAD)
- playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
-
-/obj/item/food/cakeslice/birthday/energy/attack(mob/living/target_mob, mob/living/user)
- . = ..()
- if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly
- return
- energy_bite(target_mob, user)
-
-/obj/item/food/cake/apple
- name = "apple cake"
- desc = "A cake centred with Apple."
- icon_state = "applecake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 10
- )
- tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
- slice_type = /obj/item/food/cakeslice/apple
-
-/obj/item/food/cakeslice/apple
- name = "apple cake slice"
- desc = "A slice of heavenly cake."
- icon_state = "applecakeslice"
- tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/food/cake/slimecake
- name = "Slime cake"
- desc = "A cake made of slimes. Probably not electrified."
- icon_state = "slimecake"
- tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR
- slice_type = /obj/item/food/cakeslice/slimecake
-
-/obj/item/food/cakeslice/slimecake
- name = "slime cake slice"
- desc = "A slice of slime cake."
- icon_state = "slimecake_slice"
- tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR
-
-/obj/item/food/cake/pumpkinspice
- name = "pumpkin spice cake"
- desc = "A hollow cake with real pumpkin."
- icon_state = "pumpkinspicecake"
- tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
- foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
- slice_type = /obj/item/food/cakeslice/pumpkinspice
-
-/obj/item/food/cakeslice/pumpkinspice
- name = "pumpkin spice cake slice"
- desc = "A spicy slice of pumpkin goodness."
- icon_state = "pumpkinspicecakeslice"
- tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
- foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
-
-/obj/item/food/cake/bsvc // blackberry strawberries vanilla cake
- name = "blackberry and strawberry vanilla cake"
- desc = "A plain cake, filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_vanilla_cake"
- tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
- slice_type = /obj/item/food/cakeslice/bsvc
-
-/obj/item/food/cakeslice/bsvc
- name = "blackberry and strawberry vanilla cake slice"
- desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_vanilla_slice"
- tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/food/cake/bscc // blackbarry strawberries chocolate cake
- name = "blackberry and strawberry chocolate cake"
- desc = "A chocolate cake, filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_coco_cake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 5,
- /datum/reagent/consumable/coco = 5
- )
- tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 4, "sweetness" = 2,"cake" = 3)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
- slice_type = /obj/item/food/cakeslice/bscc
-
-/obj/item/food/cakeslice/bscc
- name = "blackberry and strawberry chocolate cake slice"
- desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_coco_slice"
- tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 4, "sweetness" = 2,"cake" = 3)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/food/cake/holy_cake
- name = "angel food cake"
- desc = "A cake made for angels and chaplains alike! Contains holy water."
- icon_state = "holy_cake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 1,
- /datum/reagent/consumable/nutriment/vitamin = 3,
- /datum/reagent/water/holywater = 10
- )
- tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR
- slice_type = /obj/item/food/cakeslice/holy_cake_slice
-
-/obj/item/food/cakeslice/holy_cake_slice
- name = "angel food cake slice"
- desc = "A slice of heavenly cake."
- icon_state = "holy_cake_slice"
- tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR
-
-/obj/item/food/cake/pound_cake
- name = "pound cake"
- desc = "A condensed cake made for filling people up quickly."
- icon_state = "pound_cake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 60,
- /datum/reagent/consumable/nutriment/vitamin = 5
- )
- tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD
- slice_type = /obj/item/food/cakeslice/pound_cake_slice
- yield = 10 //cause its so damn THICC (seriously these things are fucking huge a pound of each ingredient are you kidding)
-
-/obj/item/food/cakeslice/pound_cake_slice
- name = "pound cake slice"
- desc = "A slice of condensed cake made for filling people up quickly."
- icon_state = "pound_cake_slice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 9,
- /datum/reagent/consumable/nutriment/vitamin = 0.5
- )
- tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD
-
-/obj/item/food/cake/hardware_cake
- name = "hardware cake"
- desc = "A quote on quote cake that is made with electronic boards and leaks acid..."
- icon_state = "hardware_cake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 5,
- /datum/reagent/toxin/acid = 15,
- /datum/reagent/fuel/oil = 15
- )
- tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
- foodtypes = GRAIN | GROSS
- slice_type = /obj/item/food/cakeslice/hardware_cake_slice
-
-/obj/item/food/cakeslice/hardware_cake_slice
- name = "hardware cake slice"
- desc = "A slice of electronic boards and some acid."
- icon_state = "hardware_cake_slice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 1,
- /datum/reagent/toxin/acid = 3,
- /datum/reagent/fuel/oil = 3
- )
- tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
- foodtypes = GRAIN | GROSS
-
-/obj/item/food/cake/vanilla_cake
- name = "vanilla cake"
- desc = "A vanilla frosted cake."
- icon_state = "vanillacake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 5,
- /datum/reagent/consumable/sugar = 15,
- /datum/reagent/consumable/vanilla = 15
- )
- tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
- foodtypes = GRAIN | SUGAR | DAIRY
- slice_type = /obj/item/food/cakeslice/vanilla_slice
-
-/obj/item/food/cakeslice/vanilla_slice
- name = "vanilla cake slice"
- desc = "A slice of vanilla frosted cake."
- icon_state = "vanillacake_slice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 1,
- /datum/reagent/consumable/sugar = 3,
- /datum/reagent/consumable/vanilla = 3
- )
- tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
- foodtypes = GRAIN | SUGAR | DAIRY
-
-/obj/item/food/cake/clown_cake
- name = "clown cake"
- desc = "A funny cake with a clown face on it."
- icon_state = "clowncake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 5,
- /datum/reagent/consumable/banana = 15
- )
- tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
- foodtypes = GRAIN | SUGAR | DAIRY
- slice_type = /obj/item/food/cakeslice/clown_slice
-
-/obj/item/food/cakeslice/clown_slice
- name = "clown cake slice"
- desc = "A slice of bad jokes, and silly props."
- icon_state = "clowncake_slice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 1,
- /datum/reagent/consumable/banana = 3
- )
- tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
- foodtypes = GRAIN | SUGAR | DAIRY
-
-/obj/item/food/cake/trumpet
- name = "spaceman's cake"
- desc = "A spaceman's trumpet frosted cake."
- icon_state = "trumpetcake"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 20,
- /datum/reagent/consumable/nutriment/vitamin = 5,
- /datum/reagent/medicine/polypyr = 15,
- /datum/reagent/consumable/cream = 5,
- /datum/reagent/consumable/nutriment/vitamin = 5,
- /datum/reagent/consumable/berryjuice = 5
- )
- tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
- slice_type = /obj/item/food/cakeslice/trumpet
-
-/obj/item/food/cakeslice/trumpet
- name = "spaceman's cake"
- desc = "A spaceman's trumpet frosted cake."
- icon_state = "trumpetcakeslice"
- food_reagents = list(
- /datum/reagent/consumable/nutriment = 4,
- /datum/reagent/consumable/nutriment/vitamin = 1,
- /datum/reagent/medicine/polypyr = 3,
- /datum/reagent/consumable/cream = 1,
- /datum/reagent/consumable/nutriment/vitamin = 1,
- /datum/reagent/consumable/berryjuice = 1
- )
- tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
- foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/food/cake/brioche
- name = "brioche cake"
- desc = "A ring of sweet, glazed buns."
- icon_state = "briochecake"
- tastes = list("cake" = 4, "butter" = 2, "cream" = 1)
- foodtypes = GRAIN | DAIRY | SUGAR
- slice_type = /obj/item/food/cakeslice/brioche
- yield = 6
-
-/obj/item/food/cakeslice/brioche
- name = "brioche cake slice"
- desc = "Delicious sweet-bread. Who needs anything else?"
- icon_state = "briochecake_slice"
diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm
deleted file mode 100644
index a6c5394e0647..000000000000
--- a/code/game/objects/items/food/spaghetti.dm
+++ /dev/null
@@ -1,98 +0,0 @@
-
-/obj/item/food/spaghetti
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
- food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- foodtypes = GRAIN
-
-/obj/item/food/spaghetti/Initialize()
- . = ..()
- if(!microwaved_type) // This isn't cooked, why would you put uncooked spaghetti in your pocket?
- var/list/display_message = list(
- "Something wet falls out of their pocket and hits the ground. Is that... [name]?",
- "Oh shit! All your pocket [name] fell out!")
- AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg')
-
-/obj/item/food/spaghetti/raw
- name = "spaghetti"
- desc = "Now that's a nic'e pasta!"
- icon_state = "spaghetti"
- tastes = list("pasta" = 1)
- microwaved_type = /obj/item/food/spaghetti/boiledspaghetti
-
-/obj/item/food/spaghetti/boiledspaghetti
- name = "boiled spaghetti"
- desc = "A plain dish of noodles, this needs more ingredients."
- icon_state = "spaghettiboiled"
- trash_type = /obj/item/trash/plate
- food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
- microwaved_type = null
-
-/obj/item/food/spaghetti/pastatomato
- name = "spaghetti"
- desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
- icon_state = "pastatomato"
- trash_type = /obj/item/trash/plate
- bite_consumption = 4
- food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4)
- microwaved_type = null
- tastes = list("pasta" = 1, "tomato" = 1)
- foodtypes = GRAIN | VEGETABLES
-
-/obj/item/food/spaghetti/copypasta
- name = "copypasta"
- desc = "You probably shouldn't try this, you always hear people talking about how bad it is..."
- icon_state = "copypasta"
- trash_type = /obj/item/trash/plate
- bite_consumption = 4
- food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/tomatojuice = 20, /datum/reagent/consumable/nutriment/vitamin = 8)
- microwaved_type = null
- tastes = list("pasta" = 1, "tomato" = 1)
- foodtypes = GRAIN | VEGETABLES
-
-/obj/item/food/spaghetti/meatballspaghetti
- name = "spaghetti and meatballs"
- desc = "Now that's a nic'e meatball!"
- icon_state = "meatballspaghetti"
- trash_type = /obj/item/trash/plate
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
- microwaved_type = null
- tastes = list("pasta" = 1, "meat" = 1)
- foodtypes = GRAIN | MEAT
-
-/obj/item/food/spaghetti/spesslaw
- name = "spesslaw"
- desc = "A lawyers favourite."
- icon_state = "spesslaw"
- trash_type = /obj/item/trash/plate
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 3)
- microwaved_type = null
- tastes = list("pasta" = 1, "meat" = 1)
-
-/obj/item/food/spaghetti/chowmein
- name = "chow mein"
- desc = "A nice mix of noodles and fried vegetables."
- icon_state = "chowmein"
- trash_type = /obj/item/trash/plate
- food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
- microwaved_type = null
- tastes = list("noodle" = 1, "tomato" = 1)
-
-/obj/item/food/spaghetti/beefnoodle
- name = "beef noodle"
- desc = "Nutritious, beefy and noodly."
- icon_state = "beefnoodle"
- trash_type = /obj/item/reagent_containers/glass/bowl
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3)
- microwaved_type = null
- tastes = list("noodle" = 1, "meat" = 1)
- foodtypes = GRAIN | MEAT
-
-/obj/item/food/spaghetti/butternoodles
- name = "butter noodles"
- desc = "Noodles covered in savory butter. Simple and slippery, but delicious."
- icon_state = "butternoodles"
- trash_type = /obj/item/trash/plate
- food_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/consumable/nutriment/vitamin = 2)
- microwaved_type = null
- tastes = list("noodle" = 1, "butter" = 1)
- foodtypes = GRAIN | DAIRY
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 50da920b06f1..f3cdfb068944 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -12,7 +12,7 @@
/obj/item/book/granter/proc/turn_page(mob/user)
playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, TRUE)
- if(do_after(user, 50, src, hidden = TRUE))
+ if(do_after(user, 50, TRUE, src))
if(remarks.len)
to_chat(user, "[pick(remarks)]")
else
@@ -57,7 +57,7 @@
on_reading_stopped()
reading = FALSE
return
- if(do_after(user, 50, src, hidden = TRUE))
+ if(do_after(user, 50, TRUE, src))
on_reading_finished(user)
reading = FALSE
return TRUE
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 0affcd107af0..872d81323cf3 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -1,12 +1,150 @@
// CHAPLAIN CUSTOM ARMORS //
+/obj/item/clothing/head/helmet/chaplain
+ name = "crusader helmet"
+ desc = "Deus Vult."
+ icon_state = "knight_templar"
+ item_state = "knight_templar"
+ armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ strip_delay = 80
+ dog_fashion = null
+
+/obj/item/clothing/suit/armor/riot/chaplain
+ name = "crusader armour"
+ desc = "God wills it!"
+ icon_state = "chaplain_templar"
+ item_state = "knight_templar"
+ allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ slowdown = 0
+ clothing_flags = NONE
+
+/obj/item/choice_beacon/holy
+ name = "armaments beacon"
+ desc = "Contains a set of armaments for the chaplain."
+
+/obj/item/choice_beacon/holy/canUseBeacon(mob/living/user)
+ if(user.mind && user.mind.holy_role)
+ return ..()
+ else
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE)
+ return FALSE
+
+/obj/item/choice_beacon/holy/generate_display_names()
+ var/static/list/holy_item_list
+ if(!holy_item_list)
+ holy_item_list = list()
+ var/list/templist = typesof(/obj/item/storage/box/holy)
+ for(var/V in templist)
+ var/atom/A = V
+ holy_item_list[initial(A.name)] = A
+ return holy_item_list
+
+/obj/item/choice_beacon/holy/spawn_option(obj/choice,mob/living/M)
+ if(!GLOB.holy_armor_type)
+ ..()
+ playsound(src, 'sound/effects/pray_chaplain.ogg', 40, TRUE)
+ SSblackbox.record_feedback("tally", "chaplain_armor", 1, "[choice]")
+ GLOB.holy_armor_type = choice
+ else
+ to_chat(M, "A selection has already been made. Self-Destructing...")
+ return
+
+
/obj/item/storage/box/holy
- name = "Witchhunter Kit"
+ name = "Templar Kit"
/obj/item/storage/box/holy/PopulateContents()
- new /obj/item/clothing/head/witchunter(src)
- new /obj/item/clothing/suit/armor/witchhunter(src)
+ new /obj/item/clothing/head/helmet/chaplain(src)
+ new /obj/item/clothing/suit/armor/riot/chaplain(src)
+
+/obj/item/storage/box/holy/student
+ name = "Profane Scholar Kit"
+
+/obj/item/storage/box/holy/student/PopulateContents()
+ new /obj/item/clothing/suit/armor/riot/chaplain/studentuni(src)
+ new /obj/item/clothing/head/helmet/chaplain/cage(src)
+
+/obj/item/clothing/suit/armor/riot/chaplain/studentuni
+ name = "student robe"
+ desc = "The uniform of a bygone institute of learning."
+ icon_state = "chaplain_studentuni"
+ item_state = "studentuni"
+ body_parts_covered = ARMS|CHEST
+ allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+
+/obj/item/clothing/head/helmet/chaplain/cage
+ name = "cage"
+ desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is."
+ flags_inv = HIDEHAIR //bald
+ mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
+ icon_state = "cage"
+ item_state = "cage"
+ worn_x_dimension = 64
+ worn_y_dimension = 64
+
+/obj/item/storage/box/holy/sentinel
+ name = "Stone Sentinel Kit"
+
+/obj/item/storage/box/holy/sentinel/PopulateContents()
+ new /obj/item/clothing/suit/armor/riot/chaplain/ancient(src)
+ new /obj/item/clothing/head/helmet/chaplain/ancient(src)
+
+/obj/item/clothing/head/helmet/chaplain/ancient
+ name = "ancient helmet"
+ desc = "None may pass!"
+ icon_state = "knight_ancient"
+ item_state = "knight_ancient"
+
+/obj/item/clothing/suit/armor/riot/chaplain/ancient
+ name = "ancient armour"
+ desc = "Defend the treasure..."
+ icon_state = "chaplain_ancient"
+ item_state = "knight_ancient"
+
+/obj/item/storage/box/holy/witchhunter
+ name = "Witchhunter Kit"
+/obj/item/storage/box/holy/witchhunter/PopulateContents()
+ new /obj/item/clothing/suit/armor/riot/chaplain/witchhunter(src)
+ new /obj/item/clothing/head/helmet/chaplain/witchunter_hat(src)
+
+/obj/item/clothing/suit/armor/riot/chaplain/witchhunter
+ name = "witchunter garb"
+ desc = "This worn outfit saw much use back in the day."
+ icon_state = "chaplain_witchhunter"
+ item_state = "witchhunter"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+
+/obj/item/clothing/head/helmet/chaplain/witchunter_hat
+ name = "witchunter hat"
+ desc = "This hat saw much use back in the day."
+ icon_state = "witchhunterhat"
+ item_state = "witchhunterhat"
+ flags_cover = HEADCOVERSEYES
+ flags_inv = HIDEEYES|HIDEHAIR
+
+/obj/item/storage/box/holy/adept
+ name = "Divine Adept Kit"
+
+/obj/item/storage/box/holy/adept/PopulateContents()
+ new /obj/item/clothing/suit/armor/riot/chaplain/adept(src)
+ new /obj/item/clothing/head/helmet/chaplain/adept(src)
+
+/obj/item/clothing/head/helmet/chaplain/adept
+ name = "adept hood"
+ desc = "Its only heretical when others do it."
+ icon_state = "crusader"
+ item_state = "crusader"
+ flags_cover = HEADCOVERSEYES
+ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+
+/obj/item/clothing/suit/armor/riot/chaplain/adept
+ name = "adept robes"
+ desc = "The ideal outfit for burning the unfaithful."
+ icon_state = "chaplain_crusader"
+ item_state = "crusader"
/obj/item/storage/box/holy/follower
name = "Followers of the Chaplain Kit"
@@ -65,6 +203,62 @@
var/reskinned = FALSE
var/chaplain_spawnable = TRUE
+/obj/item/nullrod/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
+
+/obj/item/nullrod/attack_self(mob/user)
+ if(user.mind && (user.mind.holy_role) && !reskinned)
+ reskin_holy_weapon(user)
+
+/**
+ * reskin_holy_weapon: Shows a user a list of all available nullrod reskins and based on his choice replaces the nullrod with the reskinned version
+ *
+ * Arguments:
+ * * M The mob choosing a nullrod reskin
+ */
+/obj/item/nullrod/proc/reskin_holy_weapon(mob/M)
+ if(GLOB.holy_weapon_type)
+ return
+ var/list/display_names = list()
+ var/list/nullrod_icons = list()
+ for(var/V in typesof(/obj/item/nullrod))
+ var/obj/item/nullrod/rodtype = V
+ if(initial(rodtype.chaplain_spawnable))
+ display_names[initial(rodtype.name)] = rodtype
+ nullrod_icons += list(initial(rodtype.name) = image(icon = initial(rodtype.icon), icon_state = initial(rodtype.icon_state)))
+
+ nullrod_icons = sortList(nullrod_icons)
+ var/choice = show_radial_menu(M, src , nullrod_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), M), radius = 42, require_near = TRUE)
+ if(!choice || !check_menu(M))
+ return
+
+ var/A = display_names[choice] // This needs to be on a separate var as list member access is not allowed for new
+ var/obj/item/nullrod/holy_weapon = new A
+ GLOB.holy_weapon_type = holy_weapon.type
+
+ SSblackbox.record_feedback("tally", "chaplain_weapon", 1, "[choice]")
+
+ if(holy_weapon)
+ holy_weapon.reskinned = TRUE
+ qdel(src)
+ M.put_in_active_hand(holy_weapon)
+
+/**
+ * check_menu: Checks if we are allowed to interact with a radial menu
+ *
+ * Arguments:
+ * * user The mob interacting with a menu
+ */
+/obj/item/nullrod/proc/check_menu(mob/user)
+ if(!istype(user))
+ return FALSE
+ if(QDELETED(src) || reskinned)
+ return FALSE
+ if(user.incapacitated() || !user.is_holding(src))
+ return FALSE
+ return TRUE
+
/obj/item/nullrod/godhand
icon_state = "disintegrate"
item_state = "disintegrate"
@@ -454,6 +648,13 @@
hitsound = 'sound/weapons/bite.ogg'
var/used_blessing = FALSE
+/obj/item/nullrod/carp/attack_self(mob/living/user)
+ if(used_blessing)
+ else if(user.mind && (user.mind.holy_role))
+ to_chat(user, "You are blessed by Carp-Sie. Wild space carp will no longer attack you.")
+ user.faction |= "carp"
+ used_blessing = TRUE
+
/obj/item/nullrod/claymore/bostaff //May as well make it a "claymore" and inherit the blocking
name = "monk's staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, it is now used to harass the clown."
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 4186e500ab98..e386420462d6 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -88,7 +88,6 @@
item_flags = EYE_STAB
var/bayonet = FALSE //Can this be attached to a gun?
custom_price = 250
- tool_behaviour = TOOL_KNIFE
/obj/item/kitchen/knife/ComponentInitialize()
. = ..()
@@ -178,42 +177,6 @@
/obj/item/kitchen/knife/hunting/set_butchering()
AddComponent(/datum/component/butchering, 80 - force, 100, force + 10)
-/obj/item/kitchen/knife/switchblade
- name = "switchblade"
- icon_state = "switchblade"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- desc = "A sharp, concealable, spring-loaded knife."
- flags_1 = CONDUCT_1
- force = 3
- w_class = WEIGHT_CLASS_SMALL
- throwforce = 5
- custom_materials = list(/datum/material/iron=12000)
- hitsound = 'sound/weapons/genhit.ogg'
- attack_verb = list("stubbed", "poked")
- resistance_flags = FIRE_PROOF
- var/extended = 0
-
-/obj/item/kitchen/knife/switchblade/attack_self(mob/user)
- extended = !extended
- playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE)
- if(extended)
- force = 20
- w_class = WEIGHT_CLASS_NORMAL
- throwforce = 23
- icon_state = "switchblade_ext"
- attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- else
- force = 3
- w_class = WEIGHT_CLASS_SMALL
- throwforce = 5
- icon_state = "switchblade"
- attack_verb = list("stubbed", "poked")
- hitsound = 'sound/weapons/genhit.ogg'
- sharpness = IS_BLUNT
-
/obj/item/kitchen/knife/combat
name = "combat knife"
icon = 'icons/obj/world/melee.dmi'
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 9d90a1a43373..f4fbd42be38b 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -646,6 +646,31 @@
held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]."
update_appearance()
+/obj/item/melee/cleric_mace
+ name = "cleric mace"
+ desc = "The grandson of the club, yet the grandfather of the baseball bat. Most notably used by holy orders in days past."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "mace_greyscale"
+ item_state = "mace_greyscale"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
+ custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
+ slot_flags = ITEM_SLOT_BELT
+ force = 14
+ w_class = WEIGHT_CLASS_BULKY
+ throwforce = 8
+ armour_penetration = 50
+ attack_verb = list("smacked", "struck", "cracked", "beaten")
+ var/overlay_state = "mace_handle"
+ var/mutable_appearance/overlay
+
+/obj/item/melee/cleric_mace/Initialize()
+ . = ..()
+ overlay = mutable_appearance(icon, overlay_state)
+ overlay.appearance_flags = RESET_COLOR
+ add_overlay(overlay)
+
/obj/item/melee/greykingsword
name = "blade of the grey-king"
desc = "A legendary sword made with 3 replica katanas nailed together and dipped in heavy narcotics."
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index 619ebf3eb0e9..0f5d79f13b37 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -13,10 +13,11 @@
attack_verb = list("warned", "cautioned", "smashed")
/obj/item/choice_beacon
- name = "choice box"
- desc = "A box containing items to choose."
- icon = 'icons/obj/storage.dmi'
- icon_state = "deliverypackage3"
+ name = "choice beacon"
+ desc = "Hey, why are you viewing this?!! Please let CentCom know about this odd occurrence."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "gangtool-blue"
+ item_state = "radio"
var/uses = 1
/obj/item/choice_beacon/attack_self(mob/user)
@@ -30,31 +31,41 @@
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return TRUE
else
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE)
return FALSE
/obj/item/choice_beacon/proc/generate_options(mob/living/M)
var/list/display_names = generate_display_names()
if(!display_names.len)
return
- var/choice = input(M,"Which item would you like to pick?","Select an Item") as null|anything in sortList(display_names)
+ var/choice = input(M,"Which item would you like to order?","Select an Item") as null|anything in sortList(display_names)
if(!choice || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
spawn_option(display_names[choice],M)
uses--
if(!uses)
- new /obj/effect/decal/cleanable/wrapping(get_turf(M))
qdel(src)
else
to_chat(M, "[uses] use[uses > 1 ? "s" : ""] remaining on the [src].")
/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M)
- new choice(get_turf(M))
- playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, TRUE)
+ var/obj/new_item = new choice()
+ var/obj/structure/closet/supplypod/bluespacepod/pod = new()
+ pod.explosionSize = list(0,0,0,0)
+ new_item.forceMove(pod)
+ var/msg = "After making your selection, you notice a strange target on the ground. It might be best to step back!"
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.ears, /obj/item/radio/headset))
+ msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: Item request received. Your package is inbound, please stand back from the landing site. Message ends.\""
+ to_chat(M, msg)
+
+ new /obj/effect/pod_landingzone(get_turf(src), pod)
/obj/item/choice_beacon/hero
- name = "heroic box"
- desc = "To become heroes from the past to protect the future."
+ name = "heroic beacon"
+ desc = "To summon heroes from the past to protect the future."
/obj/item/choice_beacon/hero/generate_display_names()
var/static/list/hero_item_list
@@ -126,8 +137,8 @@
new /obj/item/grenade/chem_grenade/ghostbuster(src)
/obj/item/choice_beacon/augments
- name = "augment box"
- desc = "Contains augmentations. Can be used 3 times!"
+ name = "augment beacon"
+ desc = "Summons augmentations. Can be used 3 times!"
uses = 3
/obj/item/choice_beacon/augments/generate_display_names()
@@ -146,6 +157,10 @@
augment_list[initial(A.name)] = A
return augment_list
+/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M)
+ new choice(get_turf(M))
+ to_chat(M, "You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"")
+
/obj/item/skub
desc = "It's skub."
name = "skub"
@@ -202,10 +217,8 @@
#undef NICKNAME_CAP
/obj/item/choice_beacon/ouija
- name = "spirit board box"
+ name = "spirit board delivery beacon"
desc = "Ghost communication on demand! It is unclear how this thing is still operational."
- icon_state = "deliverybox"
- w_class = WEIGHT_CLASS_BULKY
/obj/item/choice_beacon/ouija/generate_display_names()
var/static/list/ouija_spaghetti_list
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index 5108a8713633..060e59f0f5de 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -11,8 +11,8 @@
icon = 'icons/obj/pneumaticCannon.dmi'
icon_state = "pneumaticCannon"
item_state = "bulldog"
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50)
var/maxWeightClass = 20 //The max weight of items that can fit into the cannon
var/loadedWeightClass = 0 //The weight of items currently in the cannon
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index 9f937312b561..473bcd945c58 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -21,35 +21,50 @@
color = "#f0da12"
puzzle_id = "cheese"
-/obj/item/keycard/harmfactory
- name = "factory keycard"
- desc = "A keycard opening a door within the world's worst factory"
- color = "#727a7c"
- puzzle_id = "factory"
-
-/obj/item/keycard/harmfactory/stockroom
- name = "stockroom keycard"
- desc = "A keycard opening a door within the world's worst factory"
- color = "#cf2323"
- puzzle_id = "stockroom"
-
-/obj/item/keycard/harmfactory/office
- name = "office keycard"
- desc = "A keycard opening a door within the world's worst factory"
- color = "#1dac22"
- puzzle_id = "office"
-
-/obj/item/keycard/harmfactory/entry
- name = "entry keycard"
- desc = "A keycard opening a door within the world's worst factory"
- color = "#1a27e7"
- puzzle_id = "entry"
-
-
+/obj/item/keycard/swordfish
+ name = "titanic keycard"
+ desc = "Smells like it was at the bottom of a harbor."
+ color = "#3bbbdb"
+ puzzle_id = "swordfish"
/obj/item/keycard/gatedrop
icon_state = "golden_key"
+/obj/item/keycard/gatedrop/drakelair
+ name = "Drake's Key"
+ desc = "A dull, golden key originally kept by a menacing ash drake."
+ puzzle_id = "drakelairkey"
+
+/obj/item/keycard/gatedrop/disciple
+ name = "Altar Key"
+ desc = "A key held dear by the late Disciple of The Priest. Only by shutting themselves in with their stone idol were they able to spare those they love most from their madness and obsession."
+ puzzle_id = "disciplekey"
+
+/obj/item/keycard/gatedrop/guard
+ name = "Armory Key"
+ desc = "A golden key entrusted to the Captain of the Holy Guard of The Priest. Entrusted by His Holiness to guard the greatest weapon in His arsenal"
+ puzzle_id = "guardcap"
+
+/obj/item/keycard/gatedrop/heathen
+ name = "Heathen's Key"
+ desc = "And thus the Heathen stole away with the key to the forbidden gates. Hiding with his sect of followers until death cometh."
+ puzzle_id = "heathen"
+
+/obj/item/keycard/gatedrop/gatekeeper
+ name = "GateKeeper's Key"
+ desc = "Only by slaying the keeper of the gates may one path through into the depths of The Priest's holiest sanctums."
+ puzzle_id = "gatekeeper"
+
+/obj/item/keycard/gatedrop/bishop
+ name = "Key of the lost"
+ desc = "A key held only by the warring Bishop, forever lost to the Golden City of old."
+ puzzle_id = "bishopkey"
+
+/obj/item/keycard/gatedrop/priest
+ name = "The Priest's Key"
+ desc = "A key belonging to a once peaceful scholar, brought to death and ruin through means of violence by savage outsider."
+ puzzle_id = "priestkey"
+
/obj/item/keycard/gatedrop/lavacanyon
name = "Vault Key"
desc = "A dusty key, smudged with dried blood."
@@ -113,26 +128,6 @@
desc = "If nautical nonsense be something you wish."
puzzle_id = "swordfish"
-/obj/machinery/door/keycard/harmfactory
- name = "keycard locked door"
- desc = "Seems to have a scanner for the factory keycard"
- puzzle_id = "factory"
-
-/obj/machinery/door/keycard/harmfactory/stockroom
- name = "keycard locked door"
- desc = "Seems to have a scanner for the stockroom keycard"
- puzzle_id = "stockroom"
-
-/obj/machinery/door/keycard/harmfactory/office
- name = "keycard locked door"
- desc = "Seems to have a scanner for the office keycard"
- puzzle_id = "office"
-
-/obj/machinery/door/keycard/harmfactory/entry
- name = "keycard locked door"
- desc = "Seems to have a scanner for the entry keycard"
- puzzle_id = "entry"
-
/obj/machinery/door/keycard/gates
gender = PLURAL
name = "locked gates"
@@ -160,6 +155,39 @@
. = ..()
icon_state = density ? "closed" : "open"
+/obj/machinery/door/keycard/gates/drakelair
+ puzzle_id = "drakelairkey"
+
+/obj/machinery/door/keycard/gates/disciple
+ name = "Tithe Gates"
+ desc = "Gates protecting the ritual tithe collected by The Priest and his Disciples."
+ puzzle_id = "disciplekey"
+
+/obj/machinery/door/keycard/gates/guard
+ name = "Armory Gates"
+ desc = "Gates protecting the most versatile and dangerous of The Priest's armory."
+ puzzle_id = "guardcap"
+
+/obj/machinery/door/keycard/gates/heathen
+ name = "Sect Gates"
+ desc = "Gates guarding the forbidden treasures stolen away by the Heathen. Bloody in nature, and hidden from sight."
+ puzzle_id = "heathen"
+
+/obj/machinery/door/keycard/gates/gatekeeper
+ name = "Sanctum Gates"
+ desc = "The Gatekeeper holds the key, only through bloodshed can they be opened."
+ puzzle_id = "gatekeeper"
+
+/obj/machinery/door/keycard/gates/bishop
+ name = "Lost Golden City Gates"
+ desc = "He took their lives and locked their culture and heritage behind indestructible gates of virtue. The Bishop spread conversion through death and swallowed the key."
+ puzzle_id = "bishopkey"
+
+/obj/machinery/door/keycard/gates/priest
+ name = "The Priest's Treasury"
+ desc = "Gates holding The Priest's eternal hoarde. Drakeborn, incapable of avoiding the grand desire to collect and learn."
+ puzzle_id = "priestkey"
+
/obj/machinery/door/keycard/gates/lavacanyon
puzzle_id = "lavacanyonkey"
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 243b84b7e1ec..a0e5865e1528 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -176,7 +176,7 @@
return
to_chat(user, "You connect to [M]'s power line...")
- while(do_after(user, 15, target = M, progress = TRUE))
+ while(do_after(user, 15, target = M, progress = 0))
if(!user || !user.cell || mode != "draw")
return
@@ -210,7 +210,7 @@
to_chat(user, "You connect to [target]'s power port...")
- while(do_after(user, 15, target = target, progress = TRUE))
+ while(do_after(user, 15, target = target, progress = 0))
if(!user || !user.cell || mode != "draw")
return
@@ -248,7 +248,7 @@
to_chat(user, "You connect to [target]'s power port...")
- while(do_after(user, 15, target = target, progress = TRUE))
+ while(do_after(user, 15, target = target, progress = 0))
if(!user || !user.cell || mode != "charge")
return
diff --git a/code/game/objects/items/stacks/tiles/tiles_suns.dm b/code/game/objects/items/stacks/tiles/tiles_suns.dm
deleted file mode 100644
index fd9d85ff4bf1..000000000000
--- a/code/game/objects/items/stacks/tiles/tiles_suns.dm
+++ /dev/null
@@ -1,64 +0,0 @@
-/obj/item/stack/tile/suns
- name = "white marble tile"
- singular_name = "white marble floor tile"
- icon_state = "tile_suns_light"
- turf_type = /turf/open/floor/suns
- tile_reskin_types = list(
- /obj/item/stack/tile/suns/plain,
- /obj/item/stack/tile/suns/pattern,
- /obj/item/stack/tile/suns/hatch,
- /obj/item/stack/tile/suns/diagonal,
- /obj/item/stack/tile/suns/grid,
- /obj/item/stack/tile/suns/dark,
- /obj/item/stack/tile/suns/dark/plain,
- /obj/item/stack/tile/suns/dark/pattern)
-
-/obj/item/stack/tile/suns/plain
- name = "white plain marble tile"
- singular_name = "white plain marble floor tile"
- icon_state = "tile_suns_lightplain"
- turf_type = /turf/open/floor/suns/plain
-
-/obj/item/stack/tile/suns/pattern
- name = "patterned white marble tile"
- singular_name = "patterned white marble floor tile"
- icon_state = "tile_suns_lightpattern"
- turf_type = /turf/open/floor/suns/pattern
-
-/obj/item/stack/tile/suns/hatch
- name = "hatched wood tile"
- singular_name = "hatched wood floor tile"
- icon_state = "tile_suns_lighthatched"
- turf_type = /turf/open/floor/suns/hatch
-
-/obj/item/stack/tile/suns/diagonal
- name = "diagonal wooden tile"
- singular_name = "diagonal wooden floor tile"
- icon_state = "tile_suns_lightdiag"
- turf_type = /turf/open/floor/suns/diagonal
-
-/obj/item/stack/tile/suns/grid
- name = "dark grid tile"
- singular_name = "dark grid floor floor tile"
- icon_state = "tile_suns_darkchunky"
- turf_type = /turf/open/floor/suns/grid
-
-/obj/item/stack/tile/suns/dark
- name = "black marble tile"
- singular_name = "black marble floor tile"
- icon_state = "tile_suns_dark"
- turf_type = /turf/open/floor/suns/dark
-
-/obj/item/stack/tile/suns/dark/plain
- name = "black plain marble tile"
- singular_name = "black plain marble floor tile"
- icon_state = "tile_suns_darkplain"
- turf_type = /turf/open/floor/suns/dark/plain
-
-/obj/item/stack/tile/suns/dark/pattern
- name = "patterned black marble tile"
- singular_name = "patterned black marble floor tile"
- icon_state = "tile_suns_darkpattern"
- turf_type = /turf/open/floor/suns/dark/pattern
-
-
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 92123969a4cd..5d87b42b78e5 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -624,7 +624,7 @@
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/gun/ballistic/automatic/smg/c20r(src)
- new /obj/item/attachment/silencer(src)
+ new /obj/item/suppressor/specialoffer(src)
/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle
desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses."
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index cfa4a16f2073..0e2a945de0be 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -248,16 +248,6 @@
new /obj/item/hypospray/mkii(src)
update_appearance()
-/obj/item/storage/belt/medical/webbing/surgery/PopulateContents()
- new /obj/item/scalpel(src)
- new /obj/item/circular_saw(src)
- new /obj/item/surgicaldrill(src)
- new /obj/item/retractor(src)
- new /obj/item/cautery(src)
- new /obj/item/hemostat(src)
- new /obj/item/hypospray/mkii(src)
- update_appearance()
-
/obj/item/storage/belt/security
name = "security belt"
desc = "Can hold security gear like handcuffs and flashes."
@@ -520,16 +510,17 @@
/obj/item/reagent_containers/food/snacks/cheesynachos,
/obj/item/reagent_containers/food/snacks/cubannachos,
/obj/item/reagent_containers/food/snacks/nugget,
- /obj/item/food/spaghetti/pastatomato,
+ /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato,
/obj/item/reagent_containers/food/snacks/rofflewaffles,
/obj/item/reagent_containers/food/snacks/donkpocket,
/obj/item/reagent_containers/food/drinks/soda_cans/cola,
- /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail,
- /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx,
- /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind,
+ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb,
+ /obj/item/reagent_containers/food/drinks/soda_cans/starkist,
/obj/item/reagent_containers/food/drinks/soda_cans/space_up,
- /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel,
- /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda
+ /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime,
+ /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola
))
new rig_snacks(src)
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index 67dba503642d..45fee1d67660 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -1,10 +1,3 @@
-//need to refactor this.
-GLOBAL_LIST_INIT(biblenames, list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon", "Insulationism", "Guru Granth Sahib"))
-//If you get these two lists not matching in size, there will be runtimes and I will hurt you in ways you couldn't even begin to imagine
-// if your bible has no custom itemstate, use one of the existing ones
-GLOBAL_LIST_INIT(biblestates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "insuls", "gurugranthsahib"))
-GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "kingyellow", "gurugranthsahib"))
-
/obj/item/storage/book
name = "hollowed book"
desc = "I guess someone didn't like it."
@@ -24,6 +17,18 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
/obj/item/storage/book/attack_self(mob/user)
to_chat(user, "The pages of [title] have been cut out!")
+GLOBAL_LIST_INIT(biblenames, list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon", "Insulationism", "Guru Granth Sahib"))
+//If you get these two lists not matching in size, there will be runtimes and I will hurt you in ways you couldn't even begin to imagine
+// if your bible has no custom itemstate, use one of the existing ones
+GLOBAL_LIST_INIT(biblestates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "insuls", "gurugranthsahib"))
+GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon", "kingyellow", "gurugranthsahib"))
+
+/mob/proc/bible_check() //The bible, if held, might protect against certain things
+ var/obj/item/storage/book/bible/B = locate() in src
+ if(is_holding(B))
+ return B
+ return 0
+
/obj/item/storage/book/bible
name = "bible"
desc = "Apply to head repeatedly."
@@ -36,6 +41,205 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
var/deity_name = "Christ"
force_string = "holy"
+/obj/item/storage/book/bible/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, FALSE, TRUE)
+
+/obj/item/storage/book/bible/attack_self(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+ if(!H.can_read(src))
+ return FALSE
+ // If H is the Chaplain, we can set the icon_state of the bible (but only once!)
+ if(!GLOB.bible_icon_state && H.mind.holy_role == HOLY_ROLE_HIGHPRIEST)
+ var/dat = "Pick Bible Style
Pick a bible style
"
+ for(var/i in 1 to GLOB.biblestates.len)
+ var/icon/bibleicon = icon('icons/obj/storage.dmi', GLOB.biblestates[i])
+ var/nicename = GLOB.biblenames[i]
+ H << browse_rsc(bibleicon, nicename)
+ dat += {"
"
+ H << browse(dat, "window=editicon;can_close=0;can_minimize=0;size=250x650")
+
+/obj/item/storage/book/bible/Topic(href, href_list)
+ if(!usr.canUseTopic(src, BE_CLOSE))
+ return
+ if(href_list["seticon"] && !GLOB.bible_icon_state)
+ var/iconi = text2num(href_list["seticon"])
+ var/biblename = GLOB.biblenames[iconi]
+ icon_state = GLOB.biblestates[iconi]
+ item_state = GLOB.bibleitemstates[iconi]
+
+ if(icon_state == "honk1" || icon_state == "honk2")
+ var/mob/living/carbon/human/H = usr
+ H.dna.add_mutation(CLOWNMUT)
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), ITEM_SLOT_MASK)
+ if(icon_state == "insuls")
+ var/mob/living/carbon/human/H =usr
+ var/obj/item/clothing/gloves/color/fyellow/insuls = new
+ insuls.name = "insuls"
+ insuls.desc = "A mere copy of the true insuls."
+ insuls.siemens_coefficient = 0.99999
+ H.equip_to_slot(insuls, ITEM_SLOT_GLOVES)
+ GLOB.bible_icon_state = icon_state
+ GLOB.bible_item_state = item_state
+
+ SSblackbox.record_feedback("text", "religion_book", 1, "[biblename]")
+ usr << browse(null, "window=editicon")
+
+/obj/item/storage/book/bible/proc/bless(mob/living/L, mob/living/user)
+ if(GLOB.religious_sect)
+ return GLOB.religious_sect.sect_bless(L,user)
+ if(!ishuman(L))
+ return
+ var/mob/living/carbon/human/H = L
+ for(var/X in H.bodyparts)
+ var/obj/item/bodypart/BP = X
+ if(!IS_ORGANIC_LIMB(BP))
+ to_chat(user, "[src.deity_name] refuses to heal this metallic taint!")
+ return 0
+
+ var/heal_amt = 10
+ var/list/hurt_limbs = H.get_damaged_bodyparts(1, 1, null, BODYTYPE_ORGANIC)
+
+ if(hurt_limbs.len)
+ for(var/X in hurt_limbs)
+ var/obj/item/bodypart/affecting = X
+ if(affecting.heal_damage(heal_amt, heal_amt, null, BODYTYPE_ORGANIC))
+ H.update_damage_overlays()
+ H.visible_message("[user] heals [H] with the power of [deity_name]!")
+ to_chat(H, "May the power of [deity_name] compel you to be healed!")
+ playsound(src.loc, "punch", 25, TRUE, -1)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing)
+ return 1
+
+/obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
+
+ if (!user.IsAdvancedToolUser())
+ to_chat(user, "You don't have the dexterity to do this!")
+ return
+
+ if (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
+ to_chat(user, "[src] slips out of your hand and hits your head.")
+ user.take_bodypart_damage(10)
+ user.Unconscious(400)
+ return
+
+ var/chaplain = 0
+ if(user.mind && (user.mind.holy_role))
+ chaplain = 1
+
+ if(!chaplain)
+ to_chat(user, "The book sizzles in your hands.")
+ user.take_bodypart_damage(0,10)
+ return
+
+ if (!heal_mode)
+ return ..()
+
+ var/smack = 1
+
+ if (M.stat != DEAD)
+ if(chaplain && user == M)
+ to_chat(user, "You can't heal yourself!")
+ return
+
+ if(prob(60) && bless(M, user))
+ smack = 0
+ else if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!istype(C.head, /obj/item/clothing/head/helmet))
+ C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 60)
+ to_chat(C, "You feel dumber.")
+
+ if(smack)
+ M.visible_message("[user] beats [M] over the head with [src]!", \
+ "[user] beats [M] over the head with [src]!")
+ playsound(src.loc, "punch", 25, TRUE, -1)
+ log_combat(user, M, "attacked", src)
+
+ else
+ M.visible_message("[user] smacks [M]'s lifeless corpse with [src].")
+ playsound(src.loc, "punch", 25, TRUE, -1)
+
+/obj/item/storage/book/bible/afterattack(atom/A, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(isfloorturf(A))
+ to_chat(user, "You hit the floor with the bible.")
+ if(user.mind && (user.mind.holy_role))
+ for(var/obj/effect/rune/R in orange(2,user))
+ R.invisibility = 0
+ if(user?.mind?.holy_role)
+ if(A.reagents && A.reagents.has_reagent(/datum/reagent/water)) // blesses all the water in the holder
+ to_chat(user, "You bless [A].")
+ var/water2holy = A.reagents.get_reagent_amount(/datum/reagent/water)
+ A.reagents.del_reagent(/datum/reagent/water)
+ A.reagents.add_reagent(/datum/reagent/water/holywater,water2holy)
+ if(A.reagents && A.reagents.has_reagent(/datum/reagent/fuel/unholywater)) // yeah yeah, copy pasted code - sue me
+ to_chat(user, "You purify [A].")
+ var/unholy2clean = A.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater)
+ A.reagents.del_reagent(/datum/reagent/fuel/unholywater)
+ A.reagents.add_reagent(/datum/reagent/water/holywater,unholy2clean)
+ if(istype(A, /obj/item/storage/book/bible) && !istype(A, /obj/item/storage/book/bible/syndicate))
+ to_chat(user, "You purify [A], conforming it to your belief.")
+ var/obj/item/storage/book/bible/B = A
+ B.name = name
+ B.icon_state = icon_state
+ B.item_state = item_state
+ if(istype(A, /obj/item/cult_bastard) && !iscultist(user))
+ var/obj/item/cult_bastard/sword = A
+ to_chat(user, "You begin to exorcise [sword].")
+ playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE)
+ if(do_after(user, 40, target = sword))
+ playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE)
+ for(var/obj/item/soulstone/SS in sword.contents)
+ SS.usability = TRUE
+ for(var/mob/living/simple_animal/shade/EX in SS)
+ SSticker.mode.remove_cultist(EX.mind, 1, 0)
+ EX.icon_state = "ghost1"
+ EX.name = "Purified [EX.name]"
+ SS.release_shades(user)
+ qdel(SS)
+ new /obj/item/nullrod/claymore(get_turf(sword))
+ user.visible_message("[user] purifies [sword]!")
+ qdel(sword)
+ else if(istype(A, /obj/item/soulstone) && !iscultist(user))
+ var/obj/item/soulstone/SS = A
+ if(SS.purified)
+ return
+ to_chat(user, "You begin to exorcise [SS].")
+ playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE)
+ if(do_after(user, 40, target = SS))
+ playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE)
+ SS.usability = TRUE
+ SS.purified = TRUE
+ SS.icon_state = "purified_soulstone"
+ for(var/mob/M in SS.contents)
+ if(M.mind)
+ SS.icon_state = "purified_soulstone2"
+ if(iscultist(M))
+ SSticker.mode.remove_cultist(M.mind, FALSE, FALSE)
+ for(var/mob/living/simple_animal/shade/EX in SS)
+ EX.icon_state = "ghost1"
+ EX.name = "Purified [initial(EX.name)]"
+ user.visible_message("[user] purifies [SS]!")
+ else if(istype(A, /obj/item/nullrod/scythe/talking))
+ var/obj/item/nullrod/scythe/talking/sword = A
+ to_chat(user, "You begin to exorcise [sword]...")
+ playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE)
+ if(do_after(user, 40, target = sword))
+ playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE)
+ for(var/mob/living/simple_animal/shade/S in sword.contents)
+ to_chat(S, "You were destroyed by the exorcism!")
+ qdel(S)
+ sword.possessed = FALSE //allows the chaplain (or someone else) to reroll a new spirit for their sword
+ sword.name = initial(sword.name)
+ REMOVE_TRAIT(sword, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) //in case the "sword" is a possessed dummy
+ user.visible_message("[user] exorcises [sword]!", \
+ "You successfully exorcise [sword]!")
+
/obj/item/storage/book/bible/koran
name = "Koran"
icon_state = "koran"
@@ -49,6 +253,34 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
new /obj/item/reagent_containers/food/drinks/bottle/whiskey(src)
/obj/item/storage/book/bible/syndicate
- name = "Syndicate Tome"
icon_state ="ebook"
deity_name = "The Syndicate"
+ throw_speed = 2
+ throwforce = 18
+ throw_range = 7
+ force = 18
+ hitsound = 'sound/weapons/sear.ogg'
+ damtype = BURN
+ name = "Syndicate Tome"
+ attack_verb = list("attacked", "burned", "blessed", "damned", "scorched")
+ var/uses = 1
+
+/obj/item/storage/book/bible/syndicate/attack_self(mob/living/carbon/human/H)
+ if (uses)
+ H.mind.holy_role = HOLY_ROLE_PRIEST
+ uses -= 1
+ to_chat(H, "You try to open the book AND IT BITES YOU!")
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, TRUE)
+ H.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ to_chat(H, "Your name appears on the inside cover, in blood.")
+ var/ownername = H.real_name
+ desc += "The name [ownername] is written in blood inside the cover."
+
+/obj/item/storage/book/bible/syndicate/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
+ if (user.a_intent == INTENT_HELP)
+ return ..()
+ else
+ return ..(M,user,heal_mode = FALSE)
+
+/obj/item/storage/book/bible/syndicate/add_blood_DNA(list/blood_dna)
+ return FALSE
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 8aa7b1d9c478..5b817cbba675 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -124,12 +124,8 @@
var/radio_type = /obj/item/radio
/obj/item/storage/box/survival/PopulateContents()
- if(!isnull(mask_type))
- new mask_type(src)
-
- if(!isnull(radio_type))
- new radio_type(src)
-
+ new mask_type(src)
+ new radio_type(src)
if(!isnull(medipen_type))
new medipen_type(src)
@@ -169,11 +165,9 @@
/obj/item/storage/box/survival/clip/balaclava
mask_type = /obj/item/clothing/mask/gas/sechailer/balaclava
- internal_type = /obj/item/tank/internals/emergency_oxygen/double
-/obj/item/storage/box/survival/frontier
- mask_type = null // we spawn in gas masks in frontiersmen bags alongside this, so it isn't nessary
- internal_type = /obj/item/tank/internals/emergency_oxygen //frontiersmen dont
+/obj/item/storage/box/survival/clip/balaclava
+ internal_type = /obj/item/tank/internals/emergency_oxygen/double
/obj/item/storage/box/gloves
name = "box of latex gloves"
@@ -856,16 +850,6 @@
for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/buckshot(src)
-/obj/item/storage/box/techshot
- name = "box of unloaded shotgun tech shells"
- desc = "A box full of unloaded tech shells, capable of producing a variety of effects once loaded."
- icon_state = "techshot_box"
- illustration = null
-
-/obj/item/storage/box/techshot/PopulateContents()
- for(var/i in 1 to 7)
- new /obj/item/ammo_casing/shotgun/techshell(src)
-
/obj/item/storage/box/beanbag
name = "box of beanbags"
desc = "A box full of beanbag shells."
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index 64a3a11cf327..895b94acf574 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -42,10 +42,10 @@
/obj/item/storage/briefcase/sniperbundle/PopulateContents()
..() // in case you need any paperwork done after your rampage
- new /obj/item/gun/ballistic/automatic/marksman/sniper_rifle(src)
+ new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src)
new /obj/item/clothing/neck/tie/red(src)
new /obj/item/clothing/under/syndicate/sniper(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
- new /obj/item/attachment/silencer(src)
+ new /obj/item/suppressor/specialoffer(src)
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index d6edfb29461a..01307d92a0f8 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -133,29 +133,6 @@
STR.max_items = 12
STR.set_holdable(list(/obj/item/reagent_containers/food/snacks/egg))
-/obj/item/storage/fancy/egg_box/update_icon_state()
- . = ..()
- icon_state = "[base_icon_state][is_open ? "_open" : null]"
-
-/obj/item/storage/fancy/egg_box/update_overlays()
- . = ..()
- cut_overlays()
- if(!is_open)
- return
- var/egg_count = 0
- for(var/obj/item/reagent_containers/food/snacks/egg as anything in contents)
- egg_count++
- if(!egg)
- return
- var/image/current_huevo = image(icon = icon, icon_state = "eggbox_eggoverlay")
- if(egg_count <= 6) //less than 6 eggs
- current_huevo.pixel_x = (3*(egg_count-1))
- else //if more than 6, make an extra row
- current_huevo.pixel_x = (3*(egg_count-7)) //-7 to 'reset' it
- current_huevo.pixel_y = -3
- add_overlay(current_huevo)
-
-
/*
* Candle Box
*/
diff --git a/code/game/objects/items/storage/guncases.dm b/code/game/objects/items/storage/guncases.dm
deleted file mode 100644
index 9cda5ac27a39..000000000000
--- a/code/game/objects/items/storage/guncases.dm
+++ /dev/null
@@ -1,200 +0,0 @@
-/obj/item/storage/guncase
- name = "gun case"
- desc = "A large box designed for holding firearms and magazines safely."
- icon = 'icons/obj/guncase_48x32.dmi'
- icon_state = "riflecase"
- item_state = "infiltrator_case"
- force = 12
- throwforce = 12
- throw_speed = 2
- throw_range = 7
- w_class = WEIGHT_CLASS_BULKY
- attack_verb = list("robusted")
- hitsound = 'sound/weapons/smash.ogg'
- drop_sound = 'sound/items/handling/toolbox_drop.ogg'
- pickup_sound = 'sound/items/handling/toolbox_pickup.ogg'
-
-
-/obj/item/storage/guncase/ComponentInitialize()
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 10
- STR.max_w_class = WEIGHT_CLASS_BULKY
- STR.set_holdable(list(
- /obj/item/gun,
- /obj/item/ammo_box,
- /obj/item/stock_parts/cell/gun
- ))
-
-/obj/item/storage/guncase/winchester
-/obj/item/storage/guncase/winchester/PopulateContents()
- new /obj/item/gun/ballistic/shotgun/flamingarrow/no_mag(src)
-
-/obj/item/storage/guncase/skm
-/obj/item/storage/guncase/skm/PopulateContents()
- new /obj/item/gun/ballistic/automatic/assault/skm/no_mag(src)
- new /obj/item/ammo_box/magazine/skm_762_40/empty(src)
- new /obj/item/ammo_box/magazine/skm_762_40/empty(src)
-
-/obj/item/storage/guncase/p16
-/obj/item/storage/guncase/p16/PopulateContents()
- new /obj/item/gun/ballistic/automatic/assault/p16/no_mag(src)
- new /obj/item/ammo_box/magazine/p16/empty(src)
- new /obj/item/ammo_box/magazine/p16/empty(src)
-
-/obj/item/storage/guncase/beacon
-/obj/item/storage/guncase/beacon/PopulateContents()
- new /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/no_mag(src)
-
-/obj/item/storage/guncase/scout
-/obj/item/storage/guncase/scout/PopulateContents()
- new /obj/item/gun/ballistic/rifle/scout/no_mag(src)
- new /obj/item/ammo_box/a300/empty(src)
- new /obj/item/ammo_box/a300/empty(src)
-
-/obj/item/storage/guncase/cobra
-/obj/item/storage/guncase/cobra/PopulateContents()
- new /obj/item/gun/ballistic/automatic/smg/c20r/cobra/no_mag(src)
- new /obj/item/ammo_box/magazine/smgm45/empty(src)
- new /obj/item/ammo_box/magazine/smgm45/empty(src)
-
-
-/obj/item/storage/guncase/hellfire
-/obj/item/storage/guncase/hellfire/PopulateContents()
- new /obj/item/gun/ballistic/shotgun/hellfire/no_mag(src)
-
-/obj/item/storage/guncase/doublebarrel
-/obj/item/storage/guncase/doublebarrel/PopulateContents()
- new /obj/item/gun/ballistic/shotgun/doublebarrel/no_mag(src)
-
-/obj/item/storage/guncase/brimstone
-/obj/item/storage/guncase/brimstone/PopulateContents()
- new /obj/item/gun/ballistic/shotgun/brimstone/no_mag(src)
-
-/obj/item/storage/guncase/illestren
-/obj/item/storage/guncase/illestren/PopulateContents()
- new /obj/item/gun/ballistic/rifle/illestren/empty(src)
- new /obj/item/ammo_box/magazine/illestren_a850r/empty(src)
- new /obj/item/ammo_box/magazine/illestren_a850r/empty(src)
-
-/obj/item/storage/guncase/wt550
-/obj/item/storage/guncase/wt550/PopulateContents()
- new /obj/item/gun/ballistic/automatic/smg/wt550/no_mag(src)
- new /obj/item/ammo_box/magazine/wt550m9/empty(src)
- new /obj/item/ammo_box/magazine/wt550m9/empty(src)
-
-/obj/item/storage/pistolcase
- name = "pistol case"
- desc = "A large box designed for holding pistols and magazines safely."
- icon = 'icons/obj/guncase.dmi'
- icon_state = "pistolcase"
- item_state = "infiltrator_case"
- force = 12
- throwforce = 12
- throw_speed = 2
- w_class = WEIGHT_CLASS_BULKY
- attack_verb = list("robusted")
- hitsound = 'sound/weapons/smash.ogg'
- drop_sound = 'sound/items/handling/toolbox_drop.ogg'
- pickup_sound = 'sound/items/handling/toolbox_pickup.ogg'
-
-/obj/item/storage/pistolcase/ComponentInitialize()
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_items = 8
- STR.max_w_class = WEIGHT_CLASS_NORMAL
- STR.set_holdable(list(
- /obj/item/gun,
- /obj/item/ammo_box/,
- /obj/item/stock_parts/cell/gun
- ))
-
-/obj/item/storage/pistolcase/modelh
-/obj/item/storage/pistolcase/modelh/PopulateContents()
- new /obj/item/gun/ballistic/automatic/powered/gauss/modelh/no_mag(src)
- new /obj/item/ammo_box/magazine/modelh/empty(src)
- new /obj/item/ammo_box/magazine/modelh/empty(src)
-
-/obj/item/storage/pistolcase/stechkin
-/obj/item/storage/pistolcase/stechkin/PopulateContents()
- new /obj/item/gun/ballistic/automatic/pistol/syndicate/no_mag(src)
- new /obj/item/ammo_box/magazine/m10mm/empty(src)
- new /obj/item/ammo_box/magazine/m10mm/empty(src)
-
-/obj/item/storage/pistolcase/candor
-/obj/item/storage/pistolcase/candor/PopulateContents()
- new /obj/item/gun/ballistic/automatic/pistol/candor/no_mag(src)
- new /obj/item/ammo_box/magazine/m45/empty(src)
- new /obj/item/ammo_box/magazine/m45/empty(src)
-
-/obj/item/storage/pistolcase/detective
-/obj/item/storage/pistolcase/detective/PopulateContents()
- new /obj/item/gun/ballistic/revolver/detective/no_mag(src)
- new /obj/item/ammo_box/c38/empty(src)
- new /obj/item/ammo_box/c38/empty(src)
-
-/obj/item/storage/pistolcase/shadow
-/obj/item/storage/pistolcase/shadow/PopulateContents()
- new /obj/item/gun/ballistic/revolver/shadow/no_mag(src)
-
-/obj/item/storage/pistolcase/commander
-/obj/item/storage/pistolcase/commander/PopulateContents()
- new /obj/item/gun/ballistic/automatic/pistol/commander/no_mag(src)
- new /obj/item/ammo_box/magazine/co9mm/empty(src)
- new /obj/item/ammo_box/magazine/co9mm/empty(src)
-
-/obj/item/storage/pistolcase/firebrand
-/obj/item/storage/pistolcase/firebrand/PopulateContents()
- new /obj/item/gun/ballistic/revolver/firebrand/no_mag(src)
-
-/obj/item/storage/pistolcase/derringer
-/obj/item/storage/pistolcase/derringer/PopulateContents()
- new /obj/item/gun/ballistic/derringer/no_mag(src)
-
-/obj/item/storage/pistolcase/a357
-/obj/item/storage/pistolcase/a357/PopulateContents()
- new /obj/item/gun/ballistic/revolver/syndicate/no_mag(src)
- new /obj/item/ammo_box/a357/empty(src)
- new /obj/item/ammo_box/a357/empty(src)
-
-/obj/item/storage/pistolcase/montagne
-/obj/item/storage/pistolcase/montagne/PopulateContents()
- new /obj/item/gun/ballistic/revolver/montagne/no_mag(src)
- new /obj/item/ammo_box/a44roum_speedloader/empty(src)
- new /obj/item/ammo_box/a44roum_speedloader/empty(src)
-
-
-/obj/item/storage/pistolcase/disposable
-/obj/item/storage/pistolcase/disposable/PopulateContents()
- new /obj/item/gun/ballistic/automatic/pistol/disposable(src)
- new /obj/item/gun/ballistic/automatic/pistol/disposable(src)
-
-/obj/item/storage/pistolcase/laser
-/obj/item/storage/pistolcase/laser/PopulateContents()
- new /obj/item/gun/energy/laser/empty_cell(src)
- new /obj/item/stock_parts/cell/gun(src)
-
-/obj/item/storage/pistolcase/egun
-/obj/item/storage/pistolcase/egun/PopulateContents()
- new /obj/item/gun/energy/laser/empty_cell(src)
- new /obj/item/stock_parts/cell/gun(src)
-
-/obj/item/storage/pistolcase/kalixpistol
-/obj/item/storage/pistolcase/kalixpistol/PopulateContents()
- new /obj/item/gun/energy/kalix/pistol/empty_cell(src)
- new /obj/item/stock_parts/cell/gun/kalix(src)
-
-/obj/item/storage/guncase/kalixrifle
-/obj/item/storage/guncase/kalixrifle/PopulateContents()
- new /obj/item/gun/energy/kalix/empty_cell(src)
- new /obj/item/stock_parts/cell/gun/kalix(src)
-
-/obj/item/storage/pistolcase/miniegun
-/obj/item/storage/pistolcase/miniegun/PopulateContents()
- new /obj/item/gun/energy/e_gun/empty_cell(src)
- new /obj/item/stock_parts/cell/gun/mini(src)
-
-/obj/item/storage/pistolcase/iongun
-/obj/item/storage/pistolcase/iongun/PopulateContents()
- new /obj/item/gun/energy/ionrifle/empty_cell(src)
- new /obj/item/stock_parts/cell/gun(src)
diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm
index 9000d5e4dbd0..35e4899b090b 100644
--- a/code/game/objects/items/storage/holsters.dm
+++ b/code/game/objects/items/storage/holsters.dm
@@ -24,7 +24,7 @@
STR.max_items = 1
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.set_holdable(list(
- /obj/item/gun/ballistic/automatic/pistol/syndicate,
+ /obj/item/gun/ballistic/automatic/pistol,
/obj/item/gun/ballistic/revolver,
/obj/item/gun/energy/e_gun/mini,
/obj/item/gun/energy/disabler,
@@ -90,7 +90,7 @@
STR.max_items = 2
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.set_holdable(list(
- /obj/item/gun/ballistic/automatic/pistol/syndicate,
+ /obj/item/gun/ballistic/automatic/pistol,
/obj/item/gun/ballistic/revolver,
/obj/item/gun/energy/e_gun/mini,
/obj/item/gun/energy/disabler,
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index 238e39ce9318..c1014716c323 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -200,14 +200,6 @@
/obj/item/storage/secure/safe/intel/stechkin/PopulateContents()
. = ..()
- new /obj/item/gun/ballistic/automatic/pistol/syndicate(src)
+ new /obj/item/gun/ballistic/automatic/pistol/suppressed(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
-
-/obj/item/storage/secure/safe/suns
- name = "Captain's Secure Safe"
- desc = "The most important part of a SUNS vessel is the spare dueling sword."
-
-/obj/item/storage/secure/safe/suns/PopulateContents()
- . = ..()
- new /obj/item/storage/belt/sabre/suns(src)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index 987aaa9933d5..87497a2a7562 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -299,7 +299,7 @@
/obj/item/clothing/gloves/color/latex/nitrile/infiltrator,
/obj/item/clothing/mask/infiltrator,
/obj/item/clothing/shoes/combat/sneakboots,
- /obj/item/gun/ballistic/automatic/pistol/syndicate,
+ /obj/item/gun/ballistic/automatic/pistol,
/obj/item/gun/ballistic/revolver,
/obj/item/ammo_box
))
@@ -312,18 +312,6 @@
new /obj/item/clothing/mask/infiltrator(src)
new /obj/item/clothing/shoes/combat/sneakboots(src)
-/obj/item/storage/toolbox/bounty
- name = "defused explosives case"
- desc = "Store defused landmines in here."
- icon_state = "infiltrator_case"
- item_state = "infiltrator_case"
-
-/obj/item/storage/toolbox/bounty/ComponentInitialize()
- . = ..()
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- STR.max_combined_w_class = 4
- STR.max_items = 2
-
//floorbot assembly
/obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params)
var/list/allowed_toolbox = list(/obj/item/storage/toolbox/emergency, //which toolboxes can be made into floorbots
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index f34aae9e6f82..d91fc622cd56 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -22,7 +22,7 @@
new /obj/item/multitool/ai_detect(src) // 1 tc
new /obj/item/encryptionkey/syndicate(src) // 2 tc
new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
- new /obj/item/kitchen/knife/switchblade(src) //I'll count this as 2 tc
+ new /obj/item/switchblade(src) //I'll count this as 2 tc
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
new /obj/item/flashlight/emp(src) // 2 tc
new /obj/item/chameleon(src) // 7 tc
@@ -38,7 +38,7 @@
new /obj/item/jammer(src)
if("guns")
- new /obj/item/gun/ballistic/revolver/syndicate(src)
+ new /obj/item/gun/ballistic/revolver(src)
new /obj/item/ammo_box/a357(src)
new /obj/item/ammo_box/a357(src)
new /obj/item/card/emag(src)
@@ -99,7 +99,7 @@
new /obj/item/storage/box/syndie_kit/emp(src)
if("sniper") //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks
- new /obj/item/gun/ballistic/automatic/marksman/sniper_rifle(src) // 12 tc
+ new /obj/item/gun/ballistic/automatic/sniper_rifle(src) // 12 tc
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src)
new /obj/item/clothing/glasses/thermal/syndi(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src)
@@ -119,8 +119,8 @@
/obj/item/storage/box/syndicate/bundle_B/PopulateContents()
switch (pickweight(list( "bond" = 2, "ninja" = 1, "darklord" = 1, "white_whale_holy_grail" = 2, "mad_scientist" = 2, "bee" = 1, "mr_freeze" = 2, "made_man"= 1)))
if("bond")
- new /obj/item/gun/ballistic/automatic/pistol/syndicate(src)
- new /obj/item/attachment/silencer(src)
+ new /obj/item/gun/ballistic/automatic/pistol(src)
+ new /obj/item/suppressor(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/clothing/under/chameleon(src)
@@ -195,7 +195,7 @@
if("made_man")
new /obj/effect/spawner/lootdrop/mafia_outfit(src) // 0 TC, just an outfit for the new 'don of this family
new /obj/item/gun/ballistic/automatic/smg/firestorm/pan(src) // 20 TC, a gun with 50 .45 bullets on a three round burst is kinda outstanding
- new /obj/item/kitchen/knife/switchblade(src) // 3 TC? It's nice, but it's really a stealth/oh fuck I'm out of ammo weapon
+ new /obj/item/switchblade(src) // 3 TC? It's nice, but it's really a stealth/oh fuck I'm out of ammo weapon
new /obj/item/reagent_containers/food/drinks/bottle/vodka (src) // 5 TC, free molotov assemblies
new /obj/item/reagent_containers/food/drinks/bottle/vodka (src)
new /obj/item/reagent_containers/food/drinks/bottle/vodka (src)
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 002b72633294..91f47f56cdd5 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -42,10 +42,9 @@
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
- UnregisterSignal(AM, COSMIG_ACCESS_UPDATED)
- refresh_id()
+ refreshID()
-/obj/item/storage/wallet/proc/refresh_id()
+/obj/item/storage/wallet/proc/refreshID()
LAZYCLEARLIST(combined_access)
if(!(front_id in src))
front_id = null
@@ -62,8 +61,7 @@
/obj/item/storage/wallet/Entered(atom/movable/AM)
. = ..()
- RegisterSignal(AM, COSMIG_ACCESS_UPDATED, PROC_REF(refresh_id))
- refresh_id()
+ refreshID()
/obj/item/storage/wallet/update_overlays()
. = ..()
@@ -119,11 +117,6 @@
else
return ..()
-/obj/item/storage/wallet/GetBankCard()
- for(var/obj/item/card/I in contents)
- if(istype(I, /obj/item/card/bank))
- return I
-
/obj/item/storage/wallet/random
icon_state = "random_wallet"
diff --git a/code/game/objects/items/survery_handheld.dm b/code/game/objects/items/survery_handheld.dm
index a10097031485..547bdc150237 100644
--- a/code/game/objects/items/survery_handheld.dm
+++ b/code/game/objects/items/survery_handheld.dm
@@ -51,7 +51,7 @@
src_turf.visible_message("Warning: unable to locate valuable information in current sector.")
break
- if(!do_after(user, survey_delay / penalty, src))
+ if(!do_after(user, list(src), survey_delay / penalty))
flick(icon_state + "-corrupted", src)
playsound(src, 'sound/machines/buzz-sigh.ogg', 20)
src_turf.visible_message("Warning: results corrupted. Please try again.")
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 5ce082d79dc9..b1dfb479b66c 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -187,8 +187,8 @@
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "revolver"
item_state = "gun"
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index a76334a0b7ea..9e8d1e3c17b9 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -350,6 +350,44 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
attack_verb = list("stabbed", "ripped", "gored", "impaled")
embedding = list("pain_mult" = 8, "embed_chance" = 100, "fall_chance" = 0, "impact_pain_mult" = 15) //55 damage+embed on hit
+/obj/item/switchblade
+ name = "switchblade"
+ icon_state = "switchblade"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ desc = "A sharp, concealable, spring-loaded knife."
+ flags_1 = CONDUCT_1
+ force = 3
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 6
+ custom_materials = list(/datum/material/iron=12000)
+ hitsound = 'sound/weapons/genhit.ogg'
+ attack_verb = list("stubbed", "poked")
+ resistance_flags = FIRE_PROOF
+ var/extended = 0
+
+/obj/item/switchblade/attack_self(mob/user)
+ extended = !extended
+ playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE)
+ if(extended)
+ force = 20
+ w_class = WEIGHT_CLASS_NORMAL
+ throwforce = 23
+ icon_state = "switchblade_ext"
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = IS_SHARP
+ else
+ force = 3
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 5
+ icon_state = "switchblade"
+ attack_verb = list("stubbed", "poked")
+ hitsound = 'sound/weapons/genhit.ogg'
+ sharpness = IS_BLUNT
+
/obj/item/phone
name = "red phone"
desc = "Should anything ever go wrong..."
@@ -737,6 +775,35 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
return 1
return 0
+/obj/item/legion_staff
+ icon_state = "legion_staff"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
+ name = "legionnaire staff"
+ desc = "The remnants of a legionnaire, reconstructed around a pole of bone. The skulls it produces are loyal to the wielder, seeming to recognize them as their host body."
+ icon = 'icons/obj/guns/magic.dmi'
+ block_chance = 20
+ force = 20
+ throwforce = 10
+ throw_speed = 4
+ attack_verb = list("bit", "gnawed", "chomped")
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT
+ hitsound = 'sound/weapons/bite.ogg'
+ var/next_use_time
+
+/obj/item/legion_staff/attack_self(mob/user)
+ if(next_use_time > world.time)
+ user.visible_message("[src] rattles in [user]'s hands, but nothing happens...")
+ to_chat(user, "You need to wait longer to use this again.")
+ return
+ user.visible_message("[user] raises the [src] and summons a legion skull!")
+ for(var/i in 1 to 3)
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff/LegionSkull = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff(user.loc)
+ LegionSkull.faction = user.faction.Copy()
+ LegionSkull.friends += user
+ next_use_time = world.time + 6 SECONDS
+
/obj/item/claymore/bone
name = "Bone Sword"
desc = "Jagged pieces of bone are tied to what looks like a goliaths femur."
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 6c5f46e94a3b..d81e8b8ba456 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -167,7 +167,7 @@
name = "dog bed"
icon_state = "dogbed"
desc = "A comfy-looking dog bed. You can even strap your pet in, in case the gravity turns off."
- anchored = TRUE
+ anchored = FALSE
buildstacktype = /obj/item/stack/sheet/mineral/wood
buildstackamount = 10
var/mob/living/owner = null
@@ -175,18 +175,22 @@
/obj/structure/bed/dogbed/ian
desc = "Ian's bed! Looks comfy."
name = "Ian's bed"
+ anchored = TRUE
/obj/structure/bed/dogbed/cayenne
desc = "Seems kind of... fishy."
name = "Cayenne's bed"
+ anchored = TRUE
/obj/structure/bed/dogbed/renault
desc = "Renault's bed! Looks comfy. A foxy person needs a foxy pet."
name = "Renault's bed"
+ anchored = TRUE
/obj/structure/bed/dogbed/runtime
desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off."
name = "Runtime's bed"
+ anchored = TRUE
/obj/structure/bed/dogbed/proc/update_owner(mob/living/M)
if(owner)
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index d57e31ce9514..35b7663ca05e 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -235,13 +235,6 @@ LINEN BINS
item_state = "sheetsolgov"
dream_messages = list("bureaucracy", "laws", "papers", "writing")
-/obj/item/bedsheet/suns
- name = "\improper SUNS bedsheet"
- desc = "A gold and purple bedsheet with the SUNS icon on it."
- icon_state = "sheetsuns"
- item_state = "sheetsuns"
- dream_messages = list("learning", "science", "geology", "studying a day before an exam")
-
/obj/item/bedsheet/ian
icon_state = "sheetian"
item_state = "sheetian"
@@ -363,13 +356,6 @@ LINEN BINS
dream_messages = list("bureaucracy", "laws", "papers", "writing")
desc = "It has the emblem of the Solar Confederation emblazoned upon it!"
-/obj/item/bedsheet/double/suns
- name = "double SUNS bedsheet"
- desc = "A large gold and purple bedsheet with the SUNS icon on it."
- icon_state = "double_sheetsuns"
- item_state = "double_sheetsuns"
- dream_messages = list("learning", "science", "geology", "studying a day before an exam")
-
/obj/item/bedsheet/random/Initialize()
..()
var/type = pick(typesof(/obj/item/bedsheet) - (typesof(/obj/item/bedsheet/double) + /obj/item/bedsheet/random))
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index dac919bb428c..0e65a5aeb760 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -98,7 +98,7 @@
icon_door = "black"
/obj/structure/closet/wardrobe/chaplain_black/PopulateContents()
- new /obj/item/storage/box/holy(src)
+ new /obj/item/choice_beacon/holy(src)
new /obj/item/clothing/accessory/pocketprotector/cosmetology(src)
new /obj/item/clothing/under/rank/civilian/chaplain(src)
new /obj/item/clothing/shoes/sneakers/black(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
index e05bd4524230..165dac720c04 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
@@ -65,7 +65,3 @@
new /obj/item/storage/box/smart_metal_foam(src)
for(var/i in 1 to 3)
new /obj/item/rcd_ammo/large(src)
-
-/obj/structure/closet/secure_closet/suns
- name = "SUNS locker"
- icon_state = "suns"
diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm
index 77d75164b185..cdd98f22196f 100644
--- a/code/game/objects/structures/crates_lockers/crates/secure.dm
+++ b/code/game/objects/structures/crates_lockers/crates/secure.dm
@@ -83,10 +83,10 @@
/obj/structure/closet/crate/secure/owned/togglelock(mob/living/user, silent)
if(privacy_lock)
if(!broken)
- var/obj/item/card/bank/bank_card = user.get_bankcard()
- if(bank_card)
- if(bank_card.registered_account)
- if(bank_card.registered_account == buyer_account)
+ var/obj/item/card/id/id_card = user.get_idcard(TRUE)
+ if(id_card)
+ if(id_card.registered_account)
+ if(id_card.registered_account == buyer_account)
if(iscarbon(user))
add_fingerprint(user)
locked = !locked
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 4e95b5558842..37c816335977 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -422,7 +422,7 @@
. = ..()
if(.)
return
- var/obj/item/card/bank/potential_acc = usr.get_bankcard()
+ var/obj/item/card/id/potential_acc = usr.get_idcard(hand_first = TRUE)
switch(action)
if("Buy")
if(!showpiece)
@@ -497,9 +497,9 @@
return TRUE
. = TRUE
/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params)
- if(isbankcard(I))
+ if(isidcard(I))
//Card Registration
- var/obj/item/card/bank/potential_acc = I
+ var/obj/item/card/id/potential_acc = I
if(!potential_acc.registered_account)
to_chat(user, "This ID card has no account registered!")
return
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index 32d6f02721c5..6a53024a81a0 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -258,13 +258,3 @@
/obj/structure/fluff/hedge/opaque //useful for mazes and such
opacity = TRUE
-
-/obj/structure/fluff/glowshroom
- name = "glowshroom"
- desc = "Mycena bregprox, a species of mushroom that glows in the dark."
- icon = 'icons/obj/lighting.dmi'
- icon_state = "glowshroom"
- layer = ABOVE_NORMAL_TURF_LAYER
- light_color = "#C3E381"
- light_range = 2
- light_power = 1
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index aed3ae724c59..112218650f85 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -211,3 +211,37 @@
/obj/effect/mob_spawn/human/pirate/gunner
rank = "Gunner"
+
+/datum/outfit/syndicatespace
+ name = "Syndicate Spacer"
+ uniform = /obj/item/clothing/under/syndicate/combat
+ mask = /obj/item/clothing/mask/gas/syndicate
+
+/datum/outfit/syndicatespace/syndicrew
+ name = "Syndicate Ship Crew Member"
+ glasses = /obj/item/clothing/glasses/night
+ ears = /obj/item/radio/headset/syndicate/alt
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/combat
+ back = /obj/item/storage/backpack
+ l_pocket = /obj/item/gun/ballistic/automatic/pistol
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ belt = /obj/item/storage/belt/military/assault
+ id = /obj/item/card/id/syndicate_command/crew_id
+ implants = list(/obj/item/implant/weapons_auth)
+
+/datum/outfit/syndicatespace/syndicaptain
+ name = "Syndicate Ship Captain"
+ suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
+ glasses = /obj/item/clothing/glasses/night
+ head = /obj/item/clothing/head/HoS/beret/syndicate
+ ears = /obj/item/radio/headset/syndicate/alt/captain
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/combat
+ back = /obj/item/storage/backpack
+ l_pocket = /obj/item/gun/ballistic/automatic/pistol/APS
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ belt = /obj/item/storage/belt/military/assault
+ id = /obj/item/card/id/syndicate_command/captain_id
+ backpack_contents = list(/obj/item/documents/syndicate/red, /obj/item/paper/fluff/ruins/forgottenship/password)
+ implants = list(/obj/item/implant/weapons_auth)
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
index ddcb59466deb..cf0d6957e69c 100644
--- a/code/game/objects/structures/guncase.dm
+++ b/code/game/objects/structures/guncase.dm
@@ -1,5 +1,5 @@
//GUNCASES//
-/obj/structure/guncloset
+/obj/structure/guncase
name = "gun locker"
desc = "A locker that holds guns."
icon = 'icons/obj/closet.dmi'
@@ -12,7 +12,7 @@
var/open = TRUE
var/capacity = 4
-/obj/structure/guncloset/Initialize(mapload)
+/obj/structure/guncase/Initialize(mapload)
. = ..()
if(mapload)
for(var/obj/item/I in loc.contents)
@@ -22,7 +22,7 @@
break
update_appearance()
-/obj/structure/guncloset/update_overlays()
+/obj/structure/guncase/update_overlays()
. = ..()
if(case_type && LAZYLEN(contents))
var/mutable_appearance/gun_overlay = mutable_appearance(icon, case_type)
@@ -31,7 +31,7 @@
. += new /mutable_appearance(gun_overlay)
. += "[icon_state]_[open ? "open" : "door"]"
-/obj/structure/guncloset/attackby(obj/item/I, mob/user, params)
+/obj/structure/guncase/attackby(obj/item/I, mob/user, params)
if(iscyborg(user) || isalien(user))
return
if(istype(I, gun_category) && open)
@@ -50,7 +50,7 @@
else
return ..()
-/obj/structure/guncloset/attack_hand(mob/user)
+/obj/structure/guncase/attack_hand(mob/user)
. = ..()
if(.)
return
@@ -68,7 +68,7 @@
* Arguments:
* * user The mob to which we are showing the radial menu
*/
-/obj/structure/guncloset/proc/show_menu(mob/user)
+/obj/structure/guncase/proc/show_menu(mob/user)
if(!LAZYLEN(contents))
return
@@ -100,7 +100,7 @@
* Arguments:
* * user The mob interacting with a menu
*/
-/obj/structure/guncloset/proc/check_menu(mob/living/carbon/human/user)
+/obj/structure/guncase/proc/check_menu(mob/living/carbon/human/user)
if(!open)
return FALSE
if(!istype(user))
@@ -109,10 +109,10 @@
return FALSE
return TRUE
-/obj/structure/guncloset/handle_atom_del(atom/A)
+/obj/structure/guncase/handle_atom_del(atom/A)
update_appearance()
-/obj/structure/guncloset/contents_explosion(severity, target)
+/obj/structure/guncase/contents_explosion(severity, target)
for(var/atom/A in contents)
switch(severity)
if(EXPLODE_DEVASTATE)
@@ -122,13 +122,13 @@
if(EXPLODE_LIGHT)
SSexplosions.lowobj += A
-/obj/structure/guncloset/shotgun
+/obj/structure/guncase/shotgun
name = "shotgun locker"
desc = "A locker that holds shotguns."
case_type = "shotgun"
gun_category = /obj/item/gun/ballistic/shotgun
-/obj/structure/guncloset/ecase
+/obj/structure/guncase/ecase
name = "energy gun locker"
desc = "A locker that holds energy guns."
icon_state = "ecase"
diff --git a/code/game/objects/structures/hivebot.dm b/code/game/objects/structures/hivebot.dm
new file mode 100644
index 000000000000..00124d781d80
--- /dev/null
+++ b/code/game/objects/structures/hivebot.dm
@@ -0,0 +1,112 @@
+/obj/structure/hivebot_beacon
+ name = "beacon"
+ desc = "Some odd beacon thing."
+ icon = 'icons/mob/hivebot.dmi'
+ icon_state = "def_radar-off"
+ anchored = TRUE
+ density = TRUE
+ var/bot_type = "norm"
+ var/bot_amt = 10
+ var/spawn_time_min
+ var/spawn_time_max
+
+/obj/structure/hivebot_beacon/Initialize()
+ . = ..()
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(2, loc)
+ smoke.start()
+ visible_message("[src] warps in!")
+ playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE)
+ addtimer(CALLBACK(src, PROC_REF(warpbots)), rand(spawn_time_min, spawn_time_max))
+
+/obj/structure/hivebot_beacon/proc/warpbots()
+ icon_state = "def_radar"
+ visible_message("[src] turns on!")
+ while(bot_amt > 0)
+ bot_amt--
+ switch(bot_type)
+ if("norm")
+ new /mob/living/simple_animal/hostile/hivebot(get_turf(src))
+ if("range")
+ new /mob/living/simple_animal/hostile/hivebot/range(get_turf(src))
+ if("rapid")
+ new /mob/living/simple_animal/hostile/hivebot/rapid(get_turf(src))
+
+ sleep(100)
+ visible_message("[src] warps out!")
+ playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE)
+ qdel(src)
+ return
+
+/obj/structure/spawner/wasteplanet/hivebot
+ name = "hivebot fabricator"
+ desc = "An active fabricator, creating hivebots out of resources from below the surface."
+
+ icon = 'icons/obj/machines/bsm.dmi'
+ icon_state = "bsm_on"
+
+ faction = list("mining")
+ max_mobs = 5
+ max_integrity = 250
+ mob_types = list(
+ /mob/living/simple_animal/hostile/hivebot/wasteplanet = 40,
+ /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged = 40,
+ /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 10,
+ /mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 5,
+ /mob/living/simple_animal/hostile/hivebot/mechanic = 5
+ )
+ spawn_text = "crawls out of"
+ spawn_sound = list('sound/effects/suitstep2.ogg')
+ move_resist = INFINITY
+ anchored = TRUE
+ resistance_flags = FIRE_PROOF | LAVA_PROOF
+ var/obj/effect/light_emitter/hivespawner/emitted_light
+
+/obj/structure/spawner/wasteplanet/hivebot/Initialize()
+ . = ..()
+ emitted_light = new(loc)
+
+/obj/structure/spawner/wasteplanet/hivebot/deconstruct(disassembled)
+ destroy_effect()
+ drop_loot()
+ return ..()
+
+/obj/structure/spawner/wasteplanet/hivebot/Destroy()
+ QDEL_NULL(emitted_light)
+ return ..()
+
+/obj/structure/spawner/wasteplanet/hivebot/proc/destroy_effect()
+ playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE)
+ visible_message("[src] begins to rattle and shake, sparks flying off of it!")
+
+
+/obj/structure/spawner/wasteplanet/hivebot/proc/drop_loot()
+ var/datum/effect_system/smoke_spread/smoke = new
+ smoke.set_up(2, loc)
+ smoke.start()
+ new /obj/effect/particle_effect/sparks(loc)
+ new /obj/effect/spawner/lootdrop/waste/hivebot/beacon(loc)
+
+/obj/effect/light_emitter/hivespawner
+ set_luminosity = 4
+ set_cap = 2.5
+ light_color = COLOR_RED_LIGHT
+
+
+/obj/structure/spawner/wasteplanet/hivebot/low_threat
+ max_mobs = 4
+ spawn_time = 300
+
+/obj/structure/spawner/wasteplanet/hivebot/medium_threat
+ max_mobs = 5
+ spawn_time = 250
+
+/obj/structure/spawner/wasteplanet/hivebot/high_threat
+ max_mobs = 7
+ spawn_time = 200
+
+/obj/structure/spawner/wasteplanet/hivebot/extreme_threat
+ max_mobs = 10
+ spawn_time = 150
+
+
diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm
new file mode 100644
index 000000000000..47ac972b1c20
--- /dev/null
+++ b/code/game/objects/structures/icemoon/cave_entrance.dm
@@ -0,0 +1,1056 @@
+GLOBAL_LIST_INIT(ore_probability, list(
+ /obj/item/stack/ore/uranium = 50,
+ /obj/item/stack/ore/iron = 50,
+ /obj/item/stack/ore/plasma = 75,
+ /obj/item/stack/ore/silver = 50,
+ /obj/item/stack/ore/gold = 50,
+ /obj/item/stack/ore/diamond = 25,
+ /obj/item/stack/ore/titanium = 75,
+ /obj/item/pickaxe/diamond = 15,
+ /obj/item/borg/upgrade/modkit/cooldown = 5,
+ /obj/item/borg/upgrade/modkit/damage = 5,
+ /obj/item/borg/upgrade/modkit/range = 5,
+ /obj/item/t_scanner/adv_mining_scanner/lesser = 15,
+ /obj/item/kinetic_crusher = 15,
+ /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
+ /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
+ /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
+ /obj/item/tank/jetpack/suit = 10,
+ /obj/item/survivalcapsule = 15,
+ /obj/item/reagent_containers/hypospray/medipen/survival = 15,
+ /obj/item/gps/mining = 10,
+ /obj/item/extraction_pack = 10,
+ /obj/item/reagent_containers/food/drinks/beer = 15,
+ ))
+
+/obj/structure/spawner/ice_moon
+ name = "cave entrance"
+ desc = "A hole in the ground, filled with monsters ready to defend it."
+ faction = list("mining")
+ max_mobs = 3
+ max_integrity = 250
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf)
+ move_resist = INFINITY
+ anchored = TRUE
+
+/obj/structure/spawner/ice_moon/Initialize()
+ . = ..()
+ clear_rock()
+
+/**
+ * Clears rocks around the spawner when it is created
+ *
+ */
+/obj/structure/spawner/ice_moon/proc/clear_rock()
+ for(var/turf/F in RANGE_TURFS(2, src))
+ if(abs(src.x - F.x) + abs(src.y - F.y) > 3)
+ continue
+ if(ismineralturf(F))
+ var/turf/closed/mineral/M = F
+ M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
+
+/obj/structure/spawner/ice_moon/deconstruct(disassembled)
+ destroy_effect()
+ drop_loot()
+ return ..()
+
+/**
+ * Effects and messages created when the spawner is destroyed
+ *
+ */
+/obj/structure/spawner/ice_moon/proc/destroy_effect()
+ playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE)
+ visible_message("[src] collapses, sealing everything inside!\nOres fall out of the cave as it is destroyed!")
+
+/**
+ * Drops items after the spawner is destroyed
+ *
+ */
+/obj/structure/spawner/ice_moon/proc/drop_loot()
+ for(var/type in GLOB.ore_probability)
+ var/chance = GLOB.ore_probability[type]
+ if(!prob(chance))
+ continue
+ new type(loc, rand(5, 10))
+
+/obj/structure/spawner/ice_moon/polarbear
+ max_mobs = 1
+ spawn_time = 60 SECONDS
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear)
+
+/obj/structure/spawner/ice_moon/polarbear/clear_rock()
+ for(var/turf/F in RANGE_TURFS(1, src))
+ if(ismineralturf(F))
+ var/turf/closed/mineral/M = F
+ M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
+
+/obj/structure/spawner/ice_moon/demonic_portal
+ name = "demonic portal"
+ desc = "A portal that goes to another world, normal creatures couldn't survive there. When it collapses, who knows where it will go?"
+ icon_state = "nether"
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon)
+ light_range = 1
+ light_color = COLOR_SOFT_RED
+ spawn_time = 300
+
+/obj/structure/spawner/ice_moon/demonic_portal/clear_rock()
+ for(var/turf/F in RANGE_TURFS(3, src))
+ if(abs(src.x - F.x) + abs(src.y - F.y) > 5)
+ continue
+ if(ismineralturf(F))
+ var/turf/closed/mineral/M = F
+ M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
+
+/obj/structure/spawner/ice_moon/demonic_portal/Initialize()
+ . = ..()
+
+/obj/structure/spawner/ice_moon/demonic_portal/destroy_effect()
+ new /obj/effect/collapsing_demonic_portal(loc)
+
+/obj/structure/spawner/ice_moon/demonic_portal/drop_loot()
+ return
+
+/obj/structure/spawner/ice_moon/rockplanet
+ name = "gruboid den"
+ desc = "Though gruboid are typically nomadic creatures, they gather in small surface caves to reproduce. They're unlikely to be happy about being disturbed."
+ max_mobs = 3
+ spawn_time = 60 SECONDS
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/rockplanet, /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/rockplanet)
+
+/obj/structure/spawner/ice_moon/rockplanet/clear_rock()
+ for(var/turf/F in RANGE_TURFS(1, src))
+ if(ismineralturf(F))
+ var/turf/closed/mineral/M = F
+ M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
+
+/obj/effect/collapsing_demonic_portal
+ name = "collapsing demonic portal"
+ desc = "It's slowly fading! Get ready to fight whatever comes through!"
+ layer = TABLE_LAYER
+ icon = 'icons/mob/nest.dmi'
+ icon_state = "nether"
+ anchored = TRUE
+ density = TRUE
+
+/obj/effect/collapsing_demonic_portal/Initialize()
+ . = ..()
+ playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE)
+ visible_message("[src] begins to collapse! As it fails, it connects to a random dimensional point and pulls through what it finds!")
+ animate(src, transform = matrix().Scale(0, 1), alpha = 50, time = 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(collapse)), 5 SECONDS)
+
+/**
+ * Handles portal deletion
+ *
+ */
+/obj/effect/collapsing_demonic_portal/proc/collapse()
+ drop_loot()
+ qdel(src)
+
+//portal types go here
+
+/obj/structure/spawner/ice_moon/demonic_portal/brimdemon
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/brimdemon)
+
+/obj/structure/spawner/ice_moon/demonic_portal/ice_whelp
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp)
+
+/obj/structure/spawner/ice_moon/demonic_portal/snowlegion
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril)
+
+/obj/structure/spawner/ice_moon/demonic_portal/low_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 35,
+ /mob/living/simple_animal/hostile/asteroid/ice_whelp = 15,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 35,
+ /mob/living/simple_animal/hostile/asteroid/ice_demon = 15
+ )
+ max_mobs = 5
+ spawn_time = 300
+
+/obj/structure/spawner/ice_moon/demonic_portal/medium_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 25,
+ /mob/living/simple_animal/hostile/asteroid/ice_whelp = 25,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 25,
+ /mob/living/simple_animal/hostile/asteroid/ice_demon = 25
+ )
+ max_mobs = 7
+ spawn_time = 300
+/obj/structure/spawner/ice_moon/demonic_portal/high_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 15,
+ /mob/living/simple_animal/hostile/asteroid/ice_whelp = 35,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 15,
+ /mob/living/simple_animal/hostile/asteroid/ice_demon = 35
+ )
+ max_mobs = 7
+ spawn_time = 200
+
+/obj/structure/spawner/ice_moon/demonic_portal/extreme_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 10,
+ /mob/living/simple_animal/hostile/asteroid/ice_whelp = 25,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 15,
+ /mob/living/simple_animal/hostile/asteroid/ice_demon = 50
+ )
+ max_mobs = 10
+ spawn_time = 200
+
+//I think there's room to make portal types drop loot/spawn monsters based on the loot list but that's out of scope for what I'm doing
+
+/**
+ * Drops loot from the portal. Uses variable difficulty based on drops- more valulable rewards will also add additional enemies to the attack wave.
+ * If you manage to win big and get a bunch of major rich loot, you will also be faced with a big mob of angries.
+ * Absolutely deranged use of probability code below, trigger warning
+ */
+/obj/effect/collapsing_demonic_portal/proc/drop_loot()
+ visible_message("Something slips out of [src]!")
+ var/loot = rand(1, 23)
+ switch(loot)
+ if(1)//Clown hell. God help you if you roll this.
+ visible_message("You can hear screaming and joyful honking.")//now THIS is what we call a critical failure
+ playsound(loc,'sound/spookoween/ghosty_wind.ogg', 100, FALSE, 50, TRUE, TRUE)
+ playsound(loc,'sound/spookoween/scary_horn3.ogg', 100, FALSE, 50, TRUE, TRUE)
+ if(prob(15))
+ new /mob/living/simple_animal/hostile/clown/clownhulk(loc)
+ new /mob/living/simple_animal/hostile/clown/longface(loc)
+ new /mob/living/simple_animal/hostile/clown/clownhulk/chlown(loc)
+ new /obj/item/shield/energy/bananium(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/clown/banana(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/clown/fleshclown(loc)
+ new /mob/living/simple_animal/hostile/clown/clownhulk/chlown
+ new /mob/living/simple_animal/hostile/clown/honkling(loc)
+ if(prob(25))
+ new /obj/item/grenade/spawnergrenade/clown(loc)
+ new /obj/item/grenade/spawnergrenade/clown(loc)
+ new /mob/living/simple_animal/hostile/clown/clownhulk(loc)
+ if(prob(10))
+ new /mob/living/simple_animal/hostile/clown/mutant/blob(loc)//oh god oh fuck
+ new /obj/machinery/syndicatebomb/badmin/clown(loc)
+ if(prob(35))
+ new /obj/item/storage/backpack/duffelbag/clown/syndie(loc)
+ new /mob/living/simple_animal/hostile/clown/fleshclown(loc)
+ new /mob/living/simple_animal/hostile/clown/honkling(loc)
+ else
+ new /obj/item/storage/backpack/duffelbag/clown/cream_pie(loc)
+ new /mob/living/simple_animal/hostile/clown/honkling(loc)
+ if(prob(25))
+ new /obj/item/borg/upgrade/transform/clown(loc)
+ new /mob/living/simple_animal/hostile/clown/stacked(loc)
+ if(prob(35))
+ new /obj/item/megaphone/clown(loc)
+ new /mob/living/simple_animal/hostile/clown/stacked(loc)
+ if(prob(25))
+ new /obj/item/reagent_containers/spray/waterflower/lube(loc)
+ new /mob/living/simple_animal/hostile/clown/fleshclown(loc)
+ new /mob/living/simple_animal/hostile/clown/fleshclown(loc)
+ if(prob(35))
+ new /obj/item/clothing/suit/space/hardsuit/clown(loc)
+ new /mob/living/simple_animal/hostile/clown/fleshclown(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/clown/fleshclown(loc)
+ if(prob(25))
+ new /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat(loc)
+ new /mob/living/simple_animal/hostile/clown/fleshclown(loc)
+ if(prob(25))//you lost
+ new /obj/item/circlegame(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone(loc)
+ if(2)//basic demonic incursion
+ visible_message("You glimpse an indescribable abyss in the portal. Horrifying monsters appear in a gout of flame.")
+ playsound(loc,'sound/hallucinations/wail.ogg', 200, FALSE, 50, TRUE, TRUE)
+ if(prob(35))
+ new /obj/item/clothing/glasses/godeye(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ if(prob(45))
+ new /obj/item/pickaxe/drill/jackhammer/demonic(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ if(prob(45))
+ new /obj/item/wisp_lantern(loc)
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ new /mob/living/simple_animal/hostile/netherworld(loc)
+ if(prob(25))
+ new /mob/living/simple_animal/hostile/netherworld(loc)
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ if(prob(5))
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ if(prob(45))
+ new /obj/item/nullrod/staff(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ if(prob(30))
+ new /obj/item/clothing/suit/space/hardsuit/quixote/dimensional(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ else
+ new /obj/item/immortality_talisman(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ if(prob(30))
+ new /obj/item/shared_storage/red(loc)
+ new /mob/living/simple_animal/hostile/netherworld(loc)
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ if(prob(30))
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ if(prob(30))
+ new /obj/item/book/granter/spell/traps(loc)
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ if(prob(30))
+ new /mob/living/simple_animal/hostile/netherworld/blankbody(loc)
+ new /mob/living/simple_animal/hostile/netherworld(loc)
+ new /mob/living/simple_animal/hostile/netherworld/migo(loc)
+ new /mob/living/simple_animal/hostile/netherworld(loc)
+ new /turf/open/indestructible/necropolis(loc)
+ if(3)//skeleton/religion association, now accepting YOUR BONES
+ visible_message("Bones rattle and strained voices chant a forgotten god's name.")
+ playsound(loc,'sound/ambience/ambiholy.ogg', 100, FALSE, 50, TRUE, TRUE)
+ if(prob(30))
+ new /obj/item/reagent_containers/glass/bottle/potion/flight(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ else
+ new /obj/item/clothing/neck/memento_mori(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ if(prob(35))
+ new /obj/item/storage/box/holy_grenades(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ if(prob(40))
+ new /obj/item/claymore(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ if(prob(45))
+ new /obj/item/gun/ballistic/bow(loc)
+ new /obj/item/storage/bag/quiver(loc)
+ new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
+ new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
+ new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
+ new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
+ new /obj/item/ammo_casing/caseless/arrow/bronze(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ if(prob(30))
+ new /obj/item/stack/sheet/mineral/wood/fifty(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ if(prob(35))
+ new /obj/item/staff/bostaff(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ if(prob(45))
+ new /obj/item/disk/design_disk/adv/cleric_mace(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ if(prob(25))
+ new /obj/item/shield/riot/roman(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ if(prob(55))
+ new /obj/item/clothing/suit/armor/riot/knight/blue(loc)
+ new /obj/item/clothing/head/helmet/knight/blue(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ if(prob(35))
+ new /obj/item/disk/design_disk/adv/knight_gear(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton(loc)
+ new /obj/item/instrument/trombone(loc)
+ new /obj/item/stack/sheet/bone(loc)
+ new /obj/item/stack/sheet/bone(loc)
+ new /obj/item/stack/sheet/bone(loc)
+ new /obj/item/stack/sheet/bone(loc)
+ new /mob/living/simple_animal/hostile/human/skeleton/templar(loc)
+ new /turf/open/floor/mineral/silver(loc)
+ if(4)//syndicate incursion. Again, high-quality loot at low chances, this time with excessive levels of danger
+ visible_message("Radio chatter echoes out from the portal. Red-garbed figures step through, weapons raised.")
+ playsound(loc,'sound/effects/radiohiss.ogg', 200, FALSE, 50, TRUE, TRUE)
+ playsound(loc,'sound/ambience/antag/tatoralert.ogg', 75, FALSE, 50, TRUE, TRUE)
+ if(prob(35))
+ if(prob(15))
+ new /obj/item/clothing/suit/space/hardsuit/syndi/elite(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ else
+ if(prob(50))
+ new /obj/item/clothing/suit/space/hardsuit/syndi(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ else
+ new /obj/item/clothing/suit/space/hardsuit/syndi(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ if(prob(25))//the real prize
+ new /obj/effect/spawner/lootdrop/donkpockets(loc)
+ new /obj/effect/spawner/lootdrop/donkpockets(loc)
+ new /obj/effect/spawner/lootdrop/donkpockets(loc)
+ if(prob(35))
+ new /obj/item/clothing/shoes/magboots/syndie(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ if(prob(25))
+ new /obj/item/gun/ballistic/automatic/pistol/suppressed(loc)
+ new /obj/item/ammo_box/magazine/
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
+ if(prob(25))
+ new /obj/item/gun/ballistic/automatic/pistol/tec9(loc)
+ new /obj/item/ammo_box/magazine/tec9(loc)
+ new /obj/item/ammo_box/magazine/tec9(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
+ if(prob(35))
+ new /obj/item/clothing/gloves/rapid(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ if(prob(35))
+ new /obj/item/wrench/combat(loc)
+ new /obj/item/storage/toolbox/syndicate(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
+ if(prob(35))
+ new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(loc)
+ if(prob(35))
+ new /obj/item/borg/upgrade/transform/assault(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
+ if(prob(25))
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ if(prob(25))
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ if(prob(25))
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
+ new /obj/item/storage/backpack/duffelbag/syndie/c4(loc)
+ if(prob(35))
+ new /obj/item/storage/belt/military(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
+ if(prob(35))
+ new /obj/item/kinetic_crusher/syndie_crusher(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ if(prob(25))
+ new /obj/item/card/id/syndicate/anyone(loc)
+ if(prob(35))
+ new /obj/item/clothing/glasses/thermal/syndi(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
+ if(prob(35))
+ new /obj/item/reagent_containers/hypospray(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
+ if(prob(25))
+ new /obj/item/card/emag(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc)
+ new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc)
+ new /turf/open/floor/mineral/plastitanium/red(loc)
+ if(5)//;HELP BLOB IN MEDICAL
+ visible_message("You hear a robotic voice saying something about a \"Delta-level biohazard\".")
+ playsound(loc,'sound/ai/outbreak5.ogg', 100, FALSE, 50, TRUE, TRUE)
+ playsound(loc,'sound/misc/bloblarm.ogg', 50, FALSE, 50, TRUE, TRUE)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/chem_dispenser(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(35))
+ new /obj/item/storage/box/hypospray/CMO(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(15))
+ new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(loc)
+ if(prob(45))
+ new /obj/item/defibrillator(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(45))
+ new /obj/item/circuitboard/machine/stasis(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(45))
+ new /obj/item/stack/medical/suture/medicated(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(45))
+ new /obj/item/stack/medical/mesh/advanced(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(35))
+ new /obj/item/gun/syringe/syndicate(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(25))
+ new /obj/item/healthanalyzer/advanced(loc)
+ if(prob(35))
+ new /obj/item/storage/firstaid/advanced(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(35))
+ new /obj/item/storage/firstaid/tactical(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(loc)
+ else
+ new /obj/item/storage/firstaid/regular(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(prob(35))
+ new /obj/effect/mob_spawn/human/corpse/solgov/sonnensoldner(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ else
+ new /obj/effect/mob_spawn/human/doctor(loc)
+ if(prob(35))
+ new /obj/effect/mob_spawn/human/corpse/solgov/sonnensoldner(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ else
+ new /obj/effect/mob_spawn/human/doctor(loc)
+ if(prob(35))
+ new /obj/effect/mob_spawn/human/corpse/solgov/sonnensoldner(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ else
+ new /obj/effect/mob_spawn/human/doctor(loc)
+ new /obj/item/healthanalyzer(loc)
+ new /turf/open/floor/carpet/nanoweave/beige(loc)
+ new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ new /mob/living/simple_animal/hostile/blob/blobspore/weak(loc)
+ if(6)//teleporty ice world. Incomplete.
+ visible_message("You glimpse a frozen, empty plane. Something stirs in the fractal abyss.")
+ playsound(loc,'sound/ambience/ambisin3.ogg', 150, FALSE, 50, TRUE, TRUE)
+ if(prob(45))
+ new /obj/item/warp_cube/red(loc)
+ new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc)
+ if(prob(45))
+ new /obj/item/clothing/suit/drfreeze_coat(loc)
+ new /obj/item/clothing/under/costume/drfreeze(loc)
+ new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc)
+ new /mob/living/simple_animal/hostile/bear/snow(loc)
+ if(prob(45))
+ new /obj/item/freeze_cube(loc)
+ new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc)
+ if(prob(55))
+ new /obj/item/clothing/shoes/winterboots/ice_boots(loc)
+ new /mob/living/simple_animal/hostile/bear/snow(loc)
+ new /obj/effect/decal/remains/human(loc)
+ new /mob/living/simple_animal/hostile/asteroid/ice_demon(loc)
+ new /turf/open/floor/plating/ice/smooth(loc)
+ if(7)//FUCK FUCK HELP SWARMERS IN VAULT
+ visible_message("Something beeps. Small, glowing forms spill out of the portal en masse!")
+ playsound(loc,'sound/ambience/ambitech.ogg', 150, FALSE, 50, TRUE, TRUE)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(45))
+ new /obj/item/construction/rcd/loaded(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(35))
+ new /obj/item/holosign_creator/atmos(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/vendor(loc)
+ new /obj/item/vending_refill/engivend(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(45))
+ new /obj/item/tank/jetpack/oxygen(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(25))
+ new /obj/item/stack/sheet/metal/fifty(loc)
+ new /obj/item/grenade/chem_grenade/smart_metal_foam(loc)
+ new /obj/item/grenade/chem_grenade/smart_metal_foam(loc)
+ new /obj/item/grenade/chem_grenade/smart_metal_foam(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(35))
+ new /obj/item/stack/sheet/metal/fifty(loc)
+ new /obj/item/clothing/glasses/meson/engine(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(25))
+ new /obj/item/stack/sheet/metal/twenty(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(25))
+ new /obj/item/storage/toolbox/infiltrator(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(25))
+ new /obj/machinery/portable_atmospherics/canister/oxygen(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ new /obj/item/clothing/gloves/color/latex/engineering(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/swarmer/ai(loc)
+ new /obj/item/clothing/gloves/color/latex/engineering(loc)
+ new /obj/effect/mob_spawn/human/engineer(loc)
+ new /turf/open/floor/circuit/telecomms(loc)
+ if(8)//Literally blood-drunk.
+ visible_message("Blood sprays from the portal. An ichor-drenched figure steps through!")
+ playsound(loc,'sound/magic/enter_blood.ogg', 150, FALSE, 50, TRUE, TRUE)
+ new /obj/effect/gibspawner/human(loc)
+ new /obj/effect/gibspawner/human(loc)
+ new /obj/effect/gibspawner/human(loc)
+ new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc)
+ if(prob(50))
+ new /obj/item/gem/bloodstone(loc)
+ if(prob(25))
+ new /obj/item/seeds/tomato/blood(loc)
+ new /turf/open/floor/plating/asteroid/basalt(loc)
+ if(9)//Now's your chance to be a [[BIG SHOT]]
+ visible_message("You hear the sound of big money and bigger avarice.")
+ playsound(loc,'sound/lavaland/cursed_slot_machine_jackpot.ogg', 150, FALSE, 50, TRUE, TRUE)
+ new /obj/structure/cursed_slot_machine(loc)
+ if(prob(35))
+ new /obj/item/spacecash/bundle/mediumrand(loc)
+ new /obj/item/spacecash/bundle/mediumrand(loc)
+ new /obj/item/coin/gold(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ if(prob(35))
+ new /obj/item/clothing/mask/spamton(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ if(prob(35))
+ new /obj/item/gem/fdiamond(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ else
+ new /obj/item/gem/rupee(loc)
+ if(prob(35))
+ new /obj/item/coin/gold(loc)
+ new /obj/item/coin/gold(loc)
+ new /obj/item/stack/sheet/mineral/gold/twenty(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ if(prob(35))
+ new /obj/item/storage/fancy/cigarettes/cigpack_robustgold(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ if(prob(35))
+ new /obj/item/clothing/head/collectable/petehat(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ new /mob/living/simple_animal/hostile/faithless(loc)
+ new /turf/open/floor/mineral/gold(loc)
+ if(10)//hivebot factory
+ visible_message("You catch a brief glimpse of a vast production complex. One of the assembly lines outputs through the portal!")
+ playsound(loc,'sound/ambience/antag/clockcultalr.ogg', 100, FALSE, 50, TRUE, TRUE)
+ if(prob(45))
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /mob/living/simple_animal/hostile/hivebot(loc)
+ if(prob(35))
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /mob/living/simple_animal/hostile/hivebot(loc)
+ if(prob(25))
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /mob/living/simple_animal/hostile/hivebot/strong(loc)
+ if(prob(35))
+ new /obj/item/stack/sheet/mineral/silver/twenty(loc)
+ new /obj/item/stack/sheet/mineral/titanium/twenty(loc)
+ new /obj/item/stack/sheet/mineral/gold/twenty(loc)
+ new /mob/living/simple_animal/hostile/hivebot/strong(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/computer/solar_control(loc)
+ new /obj/item/electronics/tracker(loc)
+ new /obj/item/solar_assembly(loc)
+ new /obj/item/solar_assembly(loc)
+ new /obj/item/solar_assembly(loc)
+ new /obj/item/solar_assembly(loc)
+ if(prob(45))
+ new /obj/item/stack/circuit_stack(loc)
+ new /mob/living/simple_animal/hostile/hivebot/mechanic(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/hivebot/range(loc)
+ if(prob(45))
+ new /obj/item/circuitboard/machine/dna_vault(loc)
+ new /mob/living/simple_animal/hostile/hivebot/mechanic(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/recycler(loc)
+ new /mob/living/simple_animal/hostile/hivebot/mechanic(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/recharger(loc)
+ new /mob/living/simple_animal/hostile/hivebot/mechanic(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/smoke_machine(loc)
+ new /mob/living/simple_animal/hostile/hivebot/mechanic(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/ore_silo(loc)
+ new /mob/living/simple_animal/hostile/hivebot/mechanic(loc)
+ if(prob(35))
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ new /mob/living/simple_animal/hostile/hivebot/strong(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/medipen_refiller(loc)
+ new /mob/living/simple_animal/hostile/hivebot(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/stasis(loc)
+ new /mob/living/simple_animal/hostile/hivebot(loc)
+ if(prob(50))
+ new /obj/item/stack/sheet/metal/fifty(loc)
+ new /obj/item/stack/sheet/glass/fifty(loc)
+ new /obj/item/stack/cable_coil/yellow(loc)
+ new /obj/item/storage/box/lights/bulbs(loc)
+ new /mob/living/simple_animal/hostile/hivebot(loc)
+ new /mob/living/simple_animal/hostile/hivebot(loc)
+ new /mob/living/simple_animal/hostile/hivebot/strong(loc)
+ new /obj/machinery/conveyor(loc)
+ new /turf/open/floor/circuit/red(loc)
+ if(11)//miner's last moments
+ visible_message("The familiar sound of an ash storm greets you. A miner steps through the portal, stumbles, and collapses.")
+ playsound(loc,'sound/weather/ashstorm/outside/weak_end.ogg', 150, FALSE, 50, TRUE, TRUE)
+ if(prob(35))
+ new /obj/item/disk/design_disk/modkit_disc/resonator_blast(loc)
+ if(prob(25))
+ new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(loc)
+ if(prob(25))
+ new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(loc)
+ if(prob(25))
+ new /obj/item/disk/design_disk/modkit_disc/bounty(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/vending/mining_equipment(loc)
+ if(prob(45))
+ new /obj/item/vending_refill/mining_equipment(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc)
+ if(prob(35))
+ new /obj/item/reagent_containers/hypospray/medipen/survival(loc)
+ if(prob(35))
+ new /obj/item/fulton_core(loc)
+ new /obj/item/extraction_pack(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc)
+ if(prob(45))
+ new /obj/item/t_scanner/adv_mining_scanner/lesser(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc)
+ if(prob(45))
+ new /obj/item/gibtonite(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc)
+ if(prob(45))
+ new /obj/item/clothing/glasses/meson/night(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc)
+ if(prob(50))
+ new /obj/item/kinetic_crusher(loc)
+ else
+ new /obj/item/gun/energy/kinetic_accelerator(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast(loc)
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc)
+ new /obj/effect/mob_spawn/human/miner(loc)
+ new /turf/open/floor/plating/asteroid/basalt(loc)
+ if(12)//sailing the ocean blue
+ visible_message("Water pours out of the portal, followed by a strange vessel. It's occupied.")
+ playsound(loc,'sound/ambience/shore.ogg', 150, FALSE, 50, TRUE, TRUE)
+ new /obj/vehicle/ridden/lavaboat/dragon(loc)
+ new /obj/item/oar(loc)
+ if(prob(50))
+ new /obj/item/clothing/under/costume/sailor(loc)
+ if(prob(50))
+ new /obj/item/pneumatic_cannon/speargun(loc)
+ new /obj/item/storage/backpack/magspear_quiver(loc)
+ new /obj/item/throwing_star/magspear(loc)
+ new /obj/item/throwing_star/magspear(loc)
+ new /obj/item/throwing_star/magspear(loc)
+ new /obj/item/throwing_star/magspear(loc)
+ new /obj/item/throwing_star/magspear(loc)
+ new /mob/living/simple_animal/hostile/carp(loc)
+ if(prob(45))
+ new /obj/item/clothing/suit/space/hardsuit/carp(loc)
+ new /mob/living/simple_animal/hostile/carp(loc)
+ if(prob(45))
+ new /mob/living/simple_animal/hostile/carp(loc)
+ if(prob(45))
+ new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc)
+ new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/carp/megacarp(loc)
+ if(prob(25))
+ new /obj/item/book/granter/martial/carp(loc)
+ new /mob/living/simple_animal/hostile/carp/megacarp(loc)
+ if(prob(35))
+ new /obj/item/grenade/spawnergrenade/spesscarp(loc)
+ new /mob/living/simple_animal/hostile/carp/megacarp(loc)
+ new /mob/living/simple_animal/hostile/carp/megacarp(loc)
+ new /mob/living/simple_animal/hostile/carp(loc)
+ new /turf/open/water(loc)
+ if(13)//hydroponics forest
+ visible_message("You catch a glimpse of a strange forest. Smells like weed and bad choices.")
+ playsound(loc,'sound/ambience/shore.ogg', 150, FALSE, 50, TRUE, TRUE)
+ if(prob(45))
+ new /obj/item/circuitboard/machine/biogenerator(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ if(prob(35))
+ new /obj/item/gun/energy/floragun(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/seed_extractor(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ if(prob(45))
+ new /obj/item/circuitboard/machine/plantgenes(loc)
+ else
+ new /obj/item/circuitboard/machine/hydroponics(loc)
+ if(prob(15))
+ new /obj/item/circuitboard/machine/hydroponics(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ if(prob(15))
+ new /obj/item/circuitboard/machine/hydroponics(loc)
+ if(prob(5))
+ new /obj/item/seeds/gatfruit(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ if(prob(45))
+ new /obj/item/seeds/random(loc)
+ if(prob(45))
+ new /obj/item/seeds/random(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ if(prob(45))
+ new /obj/item/seeds/random(loc)
+ if(prob(45))
+ new /obj/item/seeds/random(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ if(prob(50))
+ new /obj/item/seeds/random(loc)
+ if(prob(45))
+ new /obj/item/seeds/cannabis(loc)
+ new /obj/item/clothing/gloves/botanic_leather(loc)
+ new /obj/item/cultivator/rake(loc)
+ new /obj/structure/spacevine(loc)
+ new /mob/living/simple_animal/hostile/venus_human_trap(loc)
+ new /turf/open/floor/plating/grass(loc)
+ if(14)//fallout ss13
+ visible_message("You hear a geiger counter click and smell ash.")
+ playsound(loc,'sound/items/radiostatic.ogg', 100, FALSE, 50, TRUE, TRUE)
+ if(prob(50))
+ new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
+ new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
+ new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
+ new /mob/living/simple_animal/hostile/cockroach/glockroach(loc)
+ if(prob(50))
+ new /obj/structure/radioactive/stack(loc)
+ new /mob/living/simple_animal/hostile/cockroach/glockroach(loc)
+ if(prob(45))
+ new /obj/item/stack/sheet/mineral/uranium/twenty(loc)
+ new /mob/living/simple_animal/hostile/cockroach/glockroach(loc)
+ if(prob(35))
+ new /obj/item/clothing/head/radiation(loc)
+ new /obj/item/clothing/suit/radiation(loc)
+ if(prob(45))
+ new /obj/item/gun/energy/decloner(loc)
+ new /mob/living/simple_animal/hostile/cockroach/glockroach(loc)
+ new /obj/item/geiger_counter(loc)
+ new /mob/living/simple_animal/hostile/cockroach/glockroach(loc)
+ new /turf/open/floor/plating/dirt(loc)
+
+ if(15)//the cultists amoung us
+ visible_message("Chanting and a hateful red glow spill through the portal.")
+ playsound(loc,'sound/spookoween/ghost_whisper.ogg', 100, FALSE, 50, TRUE, TRUE)
+ if(prob(50))
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
+ if(prob(45))
+ new /obj/item/borg/upgrade/modkit/lifesteal(loc)
+ new /obj/item/bedsheet/cult(loc)
+ new /mob/living/simple_animal/hostile/construct/wraith/hostile(loc)
+ if(prob(50))
+ new /obj/item/stack/sheet/mineral/hidden/hellstone/ten(loc)
+ if(prob(35))
+ new /obj/item/sharpener/cult(loc)
+ new /mob/living/simple_animal/hostile/construct/artificer/hostile(loc)
+ if(prob(15))
+ new /obj/item/cult_bastard(loc)
+ new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(loc)
+ if(prob(35))
+ new /obj/item/cult_shift(loc)
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
+ if(prob(45))
+ new /obj/item/gem/bloodstone(loc)
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
+ if(prob(35))
+ new /obj/item/nullrod/scythe/talking/necro(loc)
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
+ if(prob(35))
+ new /obj/item/clothing/suit/space/hardsuit/cult/(loc)
+ new /mob/living/simple_animal/hostile/construct/artificer/hostile(loc)
+ new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(loc)
+ new /mob/living/simple_animal/hostile/construct/wraith/hostile(loc)
+ new /obj/structure/destructible/cult/pylon(loc)
+ new /turf/open/floor/plasteel/cult(loc)
+ if(16)//the backroom freezer
+ visible_message("The faint hallogen glow of a faraway kitchen greets you.")
+ if(prob(45))
+ new /obj/item/kitchen/knife/bloodletter(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(55))
+ new /obj/item/clothing/gloves/butchering(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(45))
+ new /obj/item/reagent_containers/food/snacks/store/bread/meat(loc)
+ new /obj/item/reagent_containers/food/snacks/store/bread/meat(loc)
+ new /obj/item/reagent_containers/food/snacks/store/bread/meat(loc)
+ if(prob(55))
+ new /obj/item/reagent_containers/food/snacks/store/cake/trumpet(loc)
+ if(prob(35))
+ new /obj/item/reagent_containers/food/snacks/pizza/dank(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(25))
+ new /obj/item/reagent_containers/food/snacks/meat/steak/gondola(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(35))
+ new /obj/item/reagent_containers/food/snacks/burger/roburgerbig(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(35))
+ new /obj/item/kitchen/knife/butcher(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(35))
+ new /obj/item/flamethrower/full(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(45))
+ new /obj/item/sharpener(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(25))
+ new /obj/item/sharpener/super(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/gibber(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/chem_master/condi(loc)
+ new /mob/living/simple_animal/hostile/killertomato(loc)
+ new /mob/living/simple_animal/hostile/alien/maid(loc)
+ new /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor(loc)
+ if(17)//legion miniboss
+ visible_message("The ground quakes. An immense figure reaches through the portal, crouching to squeeze through.")
+ playsound(loc,'sound/magic/knock.ogg', 100, FALSE, 50, TRUE, TRUE)
+ new /mob/living/simple_animal/hostile/big_legion(loc)
+ if(prob(75))
+ new /obj/structure/closet/crate/necropolis/tendril/greater(loc)
+ new /turf/open/indestructible/necropolis(loc)
+ if(18)//xenobiologist's hubris
+ visible_message("You catch a glimpse of a wobbling sea of slimy friends. An abused-looking keeper slips through the portal.")
+ playsound(loc,'sound/effects/footstep/slime1.ogg', 100, FALSE, 50, TRUE, TRUE)
+ if(prob(25))
+ new /obj/item/slime_extract/adamantine(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(35))
+ new /obj/item/slime_extract/gold(loc)
+ if(prob(25))
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(45))
+ new /obj/item/extinguisher/advanced(loc)
+ if(prob(25))
+ new /obj/item/slimepotion/slime/renaming(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(25))
+ new /obj/item/slimepotion/slime/sentience(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(25))
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(45))
+ new /obj/item/circuitboard/computer/xenobiology(loc)
+ new /obj/item/slime_extract/grey(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(45))
+ new /obj/item/circuitboard/machine/processor/slime(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(25))
+ new /obj/item/shield/adamantineshield(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(45))
+ new /obj/item/slime_cookie/purple(loc)
+ new /obj/item/slime_cookie/purple(loc)
+ new /obj/item/slime_cookie/purple(loc)
+ if(prob(45))
+ new /obj/item/storage/box/monkeycubes(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(35))
+ new /obj/item/slimepotion/speed(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(45))
+ new /obj/item/slimepotion/slime/slimeradio(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/pet/dog/corgi/puppy/slime(loc)
+ new /obj/effect/mob_spawn/human/scientist(loc)
+ new /turf/open/floor/mineral/titanium/purple(loc)
+ new /mob/living/simple_animal/slime/random(loc)
+ if(19)//hey, free elite tumor!
+ visible_message("A large, pulsating structure falls through the portal and crashes to the floor.")
+ playsound(loc,'sound/effects/break_stone.ogg', 100, FALSE, 50, TRUE, TRUE)
+ new /obj/structure/elite_tumor(loc)
+ new /turf/open/floor/plating/asteroid/basalt(loc)
+ if(20)//*you flush the toilet.*
+ visible_message("You hear the faint noise of a long flush.")
+ new /obj/structure/toilet(loc)
+ new /obj/effect/decal/remains(loc)
+ new /obj/item/newspaper(loc)
+ new /turf/open/floor/plastic(loc)
+ new /obj/item/clothing/head/papersack/smiley(loc) //welcome to the bathroom
+ if(21)//Research & Zombies
+ visible_message("Flashing lights and quarantine alarms echo through the portal. You smell rotting flesh and plasma.")
+ playsound(loc,'sound/misc/bloblarm.ogg', 120, FALSE, 50, TRUE, TRUE)
+ if(prob(35))
+ new /obj/item/storage/box/rndboards(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(35))
+ new /obj/item/storage/box/stockparts/deluxe(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(15))
+ new /obj/effect/spawner/lootdrop/stockparts(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(15))
+ new /obj/effect/spawner/lootdrop/stockparts(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(15))
+ new /obj/effect/spawner/lootdrop/stockparts(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(15))
+ new /obj/effect/spawner/lootdrop/stockparts(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(30))
+ new /obj/item/circuitboard/machine/rdserver(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(35))
+ new /obj/item/research_notes/loot/big(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ else
+ new /obj/item/research_notes/loot/medium(loc)
+ if(prob(35))
+ new /obj/item/research_notes/loot/medium(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ else
+ new /obj/item/research_notes/loot/small(loc)
+ if(prob(35))
+ new /obj/item/pneumatic_cannon(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(prob(45))
+ new /obj/item/research_notes/loot/medium(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ else
+ new /obj/item/research_notes/loot/small(loc)
+ new/turf/open/floor/mineral/titanium/purple(loc)
+ new /mob/living/simple_animal/hostile/human/zombie(loc)
+ if(22)//Silverback's locker room
+ visible_message("You catch a glimpse of verdant green. Smells like a locker room.")
+ playsound(loc,'sound/creatures/gorilla.ogg', 75, FALSE, 50, TRUE, TRUE)
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/machine/dnascanner(loc)
+ if(prob(35))
+ new /obj/item/circuitboard/computer/scan_consolenew(loc)
+ if(prob(25))
+ new /obj/item/reagent_containers/hypospray/medipen/magillitis(loc)
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ if(prob(35))
+ new /obj/item/dnainjector/thermal(loc)
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ if(prob(35))
+ new /obj/item/storage/box/gorillacubes(loc)
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ if(prob(35))
+ new /obj/item/dnainjector/hulkmut(loc)
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ if(prob(35))
+ new /obj/item/dnainjector/gigantism(loc)
+ if(prob(45))
+ new /obj/item/dnainjector/dwarf(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ if(prob(35))
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ new /obj/item/dnainjector/telemut/darkbundle(loc)
+ if(prob(35))
+ new /obj/item/dnainjector/insulated(loc)
+ new /mob/living/simple_animal/hostile/gorilla(loc)
+ new /obj/item/sequence_scanner(loc)
+ new /obj/structure/flora/grass/jungle(loc)
+ new /turf/open/floor/plating/grass/jungle(loc)
diff --git a/code/game/objects/structures/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm
similarity index 100%
rename from code/game/objects/structures/geyser.dm
rename to code/game/objects/structures/lavaland/geyser.dm
diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm
new file mode 100644
index 000000000000..b3c9a8cbf230
--- /dev/null
+++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm
@@ -0,0 +1,187 @@
+//Necropolis Tendrils, which spawn lavaland monsters and break into a chasm when killed
+/obj/structure/spawner/lavaland
+ name = "necropolis tendril"
+ desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it."
+
+ icon_state = "tendril"
+
+ faction = list("mining")
+ max_mobs = 5
+ max_integrity = 450
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril)
+
+ move_resist = INFINITY // just killing it tears a massive hole in the ground, let's not move it
+ anchored = TRUE
+ resistance_flags = FIRE_PROOF | LAVA_PROOF
+
+ hitsound_type = PROJECTILE_HITSOUND_FLESH
+
+ var/gps = null
+ var/obj/effect/light_emitter/tendril/emitted_light
+
+GLOBAL_LIST_INIT(tendrils, list())
+/obj/structure/spawner/lavaland/Initialize()
+ . = ..()
+ emitted_light = new(loc)
+ for(var/F in RANGE_TURFS(1, src))
+ if(ismineralturf(F))
+ var/turf/closed/mineral/M = F
+ M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
+ GLOB.tendrils += src
+
+/obj/structure/spawner/lavaland/deconstruct(disassembled)
+ new /obj/effect/collapse(loc)
+ new /obj/structure/closet/crate/necropolis/tendril(loc)
+ return ..()
+
+
+/obj/structure/spawner/lavaland/Destroy()
+ var/last_tendril = TRUE
+ if(GLOB.tendrils.len>1)
+ last_tendril = FALSE
+
+ if(last_tendril && !(flags_1 & ADMIN_SPAWNED_1))
+ if(SSachievements.achievements_enabled)
+ for(var/mob/living/L in view(7,src))
+ if(L.stat || !L.client)
+ continue
+ L.client.give_award(/datum/award/achievement/boss/tendril_exterminator, L)
+ L.client.give_award(/datum/award/score/tendril_score, L) //Progresses score by one
+ GLOB.tendrils -= src
+ QDEL_NULL(emitted_light)
+ return ..()
+
+/obj/effect/light_emitter/tendril
+ set_luminosity = 4
+ set_cap = 2.5
+ light_color = LIGHT_COLOR_LAVA
+
+/obj/effect/collapse
+ name = "collapsing necropolis tendril"
+ desc = "Get clear!"
+ layer = TABLE_LAYER
+ icon = 'icons/mob/nest.dmi'
+ icon_state = "tendril"
+ anchored = TRUE
+ density = TRUE
+ var/obj/effect/light_emitter/tendril/emitted_light
+
+/obj/effect/collapse/Initialize()
+ . = ..()
+ emitted_light = new(loc)
+ visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!")
+ visible_message("Something falls free of the tendril!")
+ playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE)
+ addtimer(CALLBACK(src, PROC_REF(collapse)), 50)
+
+/obj/effect/collapse/Destroy()
+ QDEL_NULL(emitted_light)
+ return ..()
+
+/obj/effect/collapse/proc/collapse()
+ for(var/mob/M in range(7,src))
+ shake_camera(M, 15, 1)
+ playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, TRUE)
+ visible_message("The tendril falls inward, the ground around it erupting into bubbling lava!") //WS edit.
+ for(var/turf/T in range(2,src))
+ if(!T.density)
+ T.TerraformTurf(/turf/open/lava/smooth/lava_land_surface, /turf/open/lava/smooth/lava_land_surface, flags = CHANGETURF_INHERIT_AIR) //WS edit, instead of chasms this produces lava instead.
+ qdel(src)
+
+ //these are good for mappers and already see use in some maps.
+
+/obj/structure/spawner/lavaland/goliath
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril)
+
+/obj/structure/spawner/lavaland/legion
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril)
+
+/obj/structure/spawner/lavaland/icewatcher
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing)
+
+/obj/structure/spawner/lavaland/whitesandsbasilisk
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands)
+
+ //these are ones that we want to see spawning on worlds.
+
+/obj/structure/spawner/lavaland/low_threat //this is the most common one, it shouldn't be a huge issue for most players.
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1,
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 20
+ )
+ max_mobs = 4
+ spawn_time = 300
+
+/obj/structure/spawner/lavaland/medium_threat //this is less common. It starts getting dangerous here.
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1,
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 20
+ )
+ max_mobs = 6
+ spawn_time = 200 //they spawn a little faster
+
+/obj/structure/spawner/lavaland/high_threat //this should be rare. People will have trouble with this.
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1,
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 20
+ )
+ max_mobs = 9
+ spawn_time = 200
+
+/obj/structure/spawner/lavaland/extreme_threat //extremely rare
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 27,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril = 26,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1,
+ /mob/living/simple_animal/hostile/asteroid/brimdemon = 20
+ )
+ max_mobs = 12
+ spawn_time = 150 //bring a friend and some automatic weapons
+
+//and sand world ones. More legions, no brimdemons, no icewings.
+
+/obj/structure/spawner/lavaland/sand_world/low_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40
+ )
+ max_mobs = 5
+ spawn_time = 300
+
+/obj/structure/spawner/lavaland/sand_world/medium_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40
+ )
+ max_mobs = 7
+ spawn_time = 200
+
+/obj/structure/spawner/lavaland/sand_world/high_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40
+ )
+ max_mobs = 10
+ spawn_time = 200
+
+/obj/structure/spawner/lavaland/sand_world/extreme_threat
+ mob_types = list(
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 20,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 40,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40
+ )
+ max_mobs = 12
+ spawn_time = 150
diff --git a/code/game/objects/structures/plaques/static_plaques.dm b/code/game/objects/structures/plaques/static_plaques.dm
index 00944c197415..1ac3ec7546da 100644
--- a/code/game/objects/structures/plaques/static_plaques.dm
+++ b/code/game/objects/structures/plaques/static_plaques.dm
@@ -47,11 +47,3 @@
name = "\improper Mr. Deempisi portrait"
desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"
icon_state = "monkey_painting"
-
-/obj/structure/plaque/listeningpost
- name = "Listening Post Commemoration Plaque"
- engraved = TRUE
-
-/obj/structure/plaque/listeningpost/Initialize()
- . = ..()
- desc = "Cybersun Virtual Solutions - Field Listening Post #[rand(107,356)]. Proudly built in [rand(478, 497)]."
diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm
index d373f8eb94a9..06d59e7390ea 100644
--- a/code/game/objects/structures/salvaging.dm
+++ b/code/game/objects/structures/salvaging.dm
@@ -578,7 +578,7 @@
/obj/effect/spawner/lootdrop/random_gun_protolathe_lootdrop
loot = list(
/obj/item/gun/energy/lasercannon = 1,
- /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/proto = 1,
+ /obj/item/gun/ballistic/automatic/smg/proto = 1,
/obj/item/gun/energy/temperature/security = 1,
)
/obj/effect/spawner/lootdrop/random_ammo_protolathe_lootdrop
@@ -673,7 +673,7 @@
/obj/effect/spawner/lootdrop/random_computer_circuit_rare
loot = list(
- /obj/item/circuitboard/computer/cargo = 5,
+ /obj/item/circuitboard/computer/cargo/express = 5,
/obj/item/circuitboard/computer/communications = 5,
/obj/item/circuitboard/computer/shuttle/helm = 5,
/obj/item/circuitboard/computer/med_data = 5,
@@ -683,7 +683,7 @@
/obj/effect/spawner/lootdrop/destructive_anal_loot //what do people usually put in these things anayways
loot = list(
/obj/item/storage/toolbox/syndicate/empty = 650,
- /obj/item/gun/ballistic/automatic/pistol/syndicate = 500,
+ /obj/item/gun/ballistic/automatic/pistol = 500,
/obj/item/camera_bug = 500,
/obj/item/clothing/gloves/combat = 200,
/obj/item/clothing/head/chameleon = 200,
diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm
index f96d11703943..35a55824c806 100644
--- a/code/game/objects/structures/signs/_signs.dm
+++ b/code/game/objects/structures/signs/_signs.dm
@@ -252,24 +252,18 @@
// some solgov stuff
/obj/structure/sign/solgov_seal
- name = "seal of the solarian government"
- desc = "A seal emblazened with a gold trim depicting Sol."
+ name = "Seal of the solarian government"
+ desc = "A seal emblazened with a gold trim depicting the star, sol."
icon = 'icons/obj/solgov_logos.dmi'
icon_state = "solgovseal"
pixel_y = 27
/obj/structure/sign/solgov_flag
name = "solgov banner"
- desc = "A large flag displaying the logo of solgov, the government of the Sol system."
+ desc = "A large flag displaying the logo of solgov, the local government of the sol system."
icon = 'icons/obj/solgov_logos.dmi'
icon_state = "solgovflag-left"
-// suns seal
-/obj/structure/sign/suns
- name = "emblem of the Student-Union Association of Naturalistic Sciences"
- desc = "A large emblem showcasing the icon of SUNS."
- icon_state = "suns"
-
// clip seal
/obj/structure/sign/clip
name = "Banner of the Confederated League of Independent Planets"
@@ -281,7 +275,7 @@
/obj/structure/sign/number
name = "zero"
desc = "A numeral sign."
- icon = 'icons/turf/decals/decals.dmi'
+ icon = 'icons/turf/decals.dmi'
icon_state = "0"
/obj/structure/sign/number/one
diff --git a/code/game/objects/structures/signs/signs_flags.dm b/code/game/objects/structures/signs/signs_flags.dm
index 415bce3bf6f5..a8652f130806 100644
--- a/code/game/objects/structures/signs/signs_flags.dm
+++ b/code/game/objects/structures/signs/signs_flags.dm
@@ -37,12 +37,6 @@
icon_state = "flag_gezena"
item_flag = /obj/item/sign/flag/gezena
-/obj/structure/sign/flag/suns
- name = "\improper SUNS flag"
- desc = "A flag featuring the iconography of the Student-Union Association of Naturalistic Sciences. Something about the flag reminds you of books."
- icon_state = "flag_suns"
- item_flag = /obj/item/sign/flag/suns
-
// ITEM FLAGS - THE THINGS YOU HOLD AND PLACE
/obj/item/sign/flag
@@ -57,9 +51,3 @@
desc = "A folded up Gezenan Flag. Something about this flag makes you think of plants."
icon_state = "folded_gezena"
sign_path = /obj/structure/sign/flag/gezena
-
-/obj/item/sign/flag/suns
- name = "folded SUNS flag"
- desc = "A folded up purple Flag. Something about this flag makes you think of chemistry."
- icon_state = "folded_suns"
- sign_path = /obj/structure/sign/flag/suns
diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm
new file mode 100644
index 000000000000..d44606a1a57b
--- /dev/null
+++ b/code/game/objects/structures/spawner.dm
@@ -0,0 +1,153 @@
+GLOBAL_LIST_INIT(astroloot, list(
+ /obj/item/stack/ore/uranium = 50,
+ /obj/item/stack/ore/iron = 50,
+ /obj/item/stack/ore/plasma = 75,
+ /obj/item/stack/ore/silver = 50,
+ /obj/item/stack/ore/gold = 50,
+ /obj/item/stack/ore/diamond = 25,
+ /obj/item/stack/ore/hellstone = 5,
+ /obj/item/stack/ore/titanium = 75,
+ /obj/item/pickaxe/diamond = 15,
+ /obj/item/borg/upgrade/modkit/cooldown = 5,
+ /obj/item/borg/upgrade/modkit/damage = 5,
+ /obj/item/borg/upgrade/modkit/range = 5,
+ /obj/item/t_scanner/adv_mining_scanner/lesser = 15,
+ /obj/item/kinetic_crusher = 15,
+ /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
+ /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
+ /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
+ /obj/item/tank/jetpack/suit = 10,
+ /obj/item/survivalcapsule = 15,
+ /obj/item/reagent_containers/hypospray/medipen/survival = 15,
+ /obj/item/gps/mining = 10,
+ /obj/item/extraction_pack = 10,
+ /obj/item/reagent_containers/food/drinks/beer = 15,
+ ))
+
+/obj/structure/spawner
+ name = "monster nest"
+ icon = 'icons/mob/nest.dmi'
+ icon_state = "hole"
+ max_integrity = 100
+
+ move_resist = MOVE_FORCE_EXTREMELY_STRONG
+ anchored = TRUE
+ density = TRUE
+
+ var/max_mobs = 5
+ var/spawn_time = 300 //30 seconds default
+ var/mob_types = list(/mob/living/simple_animal/hostile/carp)
+ var/spawn_text = "emerges from"
+ var/faction = list("hostile")
+ var/spawn_sound = list('sound/effects/break_stone.ogg')
+ var/spawner_type = /datum/component/spawner
+ var/spawn_distance_min = 1
+ var/spawn_distance_max = 1
+
+/obj/structure/spawner/Initialize()
+ . = ..()
+ AddComponent(spawner_type, mob_types, spawn_time, faction, spawn_text, max_mobs, spawn_sound, spawn_distance_min, spawn_distance_max)
+
+/obj/structure/spawner/attack_animal(mob/living/simple_animal/M)
+ if(faction_check(faction, M.faction, FALSE)&&!M.client)
+ return
+ ..()
+
+
+/obj/structure/spawner/syndicate
+ name = "warp beacon"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "syndbeacon"
+ spawn_text = "warps in from"
+ mob_types = list(/mob/living/simple_animal/hostile/human/syndicate/ranged)
+ faction = list(ROLE_SYNDICATE)
+
+/obj/structure/spawner/skeleton
+ name = "bone pit"
+ desc = "A pit full of bones, and some still seem to be moving..."
+ max_integrity = 150
+ max_mobs = 15
+ spawn_time = 150
+ mob_types = list(/mob/living/simple_animal/hostile/human/skeleton)
+ spawn_text = "climbs out of"
+ faction = list("skeleton")
+
+/obj/structure/spawner/clown
+ name = "Laughing Larry"
+ desc = "A laughing, jovial figure. Something seems stuck in his throat."
+ icon_state = "clownbeacon"
+ icon = 'icons/obj/device.dmi'
+ max_integrity = 200
+ max_mobs = 15
+ spawn_time = 150
+ mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube)
+ spawn_text = "climbs out of"
+ faction = list("clown")
+
+/obj/structure/spawner/carp
+ name = "carp spawn" //the non game spawn meaning
+ desc = "A puddle, which appears to be full of carp"
+ icon_state = "puddle"
+ icon = 'icons/obj/watercloset.dmi'
+ max_integrity = 150
+ max_mobs = 5
+ spawn_time = 1200
+ mob_types = list(/mob/living/simple_animal/hostile/carp)
+ spawn_text = "climbs out of"
+ faction = list("carp")
+
+/obj/structure/spawner/mining/proc/adestroy_effect()
+ playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE)
+ visible_message("[src] collapses, sealing everything inside!\nOres fall out of the cave as it is destroyed!")
+
+/obj/structure/spawner/mining
+ name = "monster den"
+ desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids."
+ max_mobs = 3
+ spawn_text = "crawls out of"
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu)
+ faction = list("mining")
+ density = 0
+
+/obj/structure/spawner/mining/deconstruct(disassembled)
+ adestroy_effect()
+ drop_astroloot()
+ return ..()
+
+/obj/structure/spawner/mining/proc/drop_astroloot()
+ for(var/type in GLOB.astroloot)
+ var/chance = GLOB.astroloot[type]
+ if(!prob(chance))
+ continue
+ new type(loc, rand(5, 17))
+
+/obj/structure/spawner/mining/goldgrub
+ name = "goldgrub den"
+ desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest."
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub)
+
+/obj/structure/spawner/mining/goliath
+ name = "goliath den"
+ desc = "A den housing a nest of goliaths, oh god why?"
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath)
+
+/obj/structure/spawner/mining/hivelord
+ name = "hivelord den"
+ desc = "A den housing a nest of hivelords."
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord)
+
+/obj/structure/spawner/mining/basilisk
+ name = "basilisk den"
+ desc = "A den housing a nest of basilisks, bring a coat."
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk)
+
+/obj/structure/spawner/mining/wumborian
+ name = "wumborian fugu den"
+ desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?"
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu)
+
+/obj/structure/spawner/mining/carp
+ name = "carp den"
+ desc = "A den housing a nest of space carp, seems fishy!"
+ mob_types = list(/mob/living/simple_animal/hostile/carp)
+ spawn_text = "emerges from"
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 4ebd416675b8..27c10f244c37 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -106,8 +106,6 @@
return TRUE
if(locate(/obj/structure/table) in get_turf(mover))
return TRUE
- if(mover.movement_type & FLOATING)
- return TRUE
/obj/structure/table/CanAStarPass(ID, dir, caller)
. = !density
@@ -374,7 +372,7 @@
check_break(M)
/obj/structure/table/glass/proc/check_break(mob/living/M)
- if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & (FLYING || FLOATING)))
+ if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING))
table_shatter(M)
/obj/structure/table/glass/proc/table_shatter(mob/living/L)
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index 4c6c3173cded..f56cfae9a5b8 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -144,3 +144,16 @@
/obj/structure/trap/ward/Initialize()
. = ..()
QDEL_IN(src, time_between_triggers)
+
+/obj/structure/trap/cult
+ name = "unholy trap"
+ desc = "A trap that rings with unholy energy. You think you hear... chittering?"
+ icon_state = "trap-cult"
+
+/obj/structure/trap/cult/trap_effect(mob/living/L)
+ to_chat(L, "With a crack, the hostile constructs come out of hiding, stunning you!")
+ L.electrocute_act(10, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
+ L.Paralyze(20)
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
+ QDEL_IN(src, 30)
diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm
index 2b7d93ae2590..4866dbfb3f60 100644
--- a/code/game/turfs/closed/_closed.dm
+++ b/code/game/turfs/closed/_closed.dm
@@ -77,16 +77,6 @@
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_AIRLOCK)
canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK)
-/turf/closed/indestructible/titanium
- name = "wall"
- desc = "A light-weight titanium wall used in shuttles. Effectively impervious to conventional methods of destruction."
- icon = 'icons/turf/walls/shuttle_wall.dmi'
- icon_state = "shuttle_wall-0"
- base_icon_state = "shuttle_wall"
- flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD
- smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
- smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS)
- canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE)
/turf/closed/indestructible/riveted
icon = 'icons/turf/walls/riveted.dmi'
diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index 33fcf315fc52..370afeaeedf2 100644
--- a/code/game/turfs/closed/minerals.dm
+++ b/code/game/turfs/closed/minerals.dm
@@ -208,6 +208,12 @@
/obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45,
/obj/item/stack/ore/silver = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal)
+/turf/closed/mineral/random/high_chance/volcanic/icecropolis
+ environment_type = "basalt"
+ turf_type = /turf/open/indestructible/necropolis/air
+ baseturfs = /turf/open/indestructible/necropolis/air
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+
/turf/closed/mineral/random/low_chance
mineralChance = 3
mineralSpawnChanceList = list(
@@ -232,6 +238,12 @@
/obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40,
/turf/closed/mineral/gibtonite/volcanic = 4, /obj/item/stack/ore/bluespace_crystal = 1)
+/turf/closed/mineral/random/volcanic/icecropolis
+ environment_type = "basalt"
+ turf_type = /turf/open/indestructible/necropolis/air
+ baseturfs = /turf/open/indestructible/necropolis/air
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+
/turf/closed/mineral/random/snow
name = "schist"
desc = "Say it fives times fast."
@@ -268,7 +280,6 @@
opacity = FALSE
light_range = 2
light_power = 1
- mineralType = /obj/item/stack/ore/ice
/turf/closed/mineral/random/snow/underground
baseturfs = /turf/open/floor/plating/asteroid/snow/icemoon
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index 53dbb9479f3b..89a00d04c142 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -226,6 +226,8 @@
icon_state = "wood_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS | SMOOTH_CONNECTORS
+/turf/closed/wall/mineral/wood/nonmetal/icecropolis
+ baseturfs = /turf/open/indestructible/necropolis/air
/turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user)
if(W.get_sharpness() && W.force)
@@ -264,6 +266,9 @@
icon_state = "iron_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+/turf/closed/wall/mineral/iron/icecropolis
+ baseturfs = /turf/open/indestructible/necropolis/air
+
/turf/closed/wall/mineral/snow
name = "packed snow wall"
desc = "A wall made of densely packed snow blocks."
diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm
index 7fbcab55504a..20fcb2cb9f57 100644
--- a/code/game/turfs/closed/wall/misc_walls.dm
+++ b/code/game/turfs/closed/wall/misc_walls.dm
@@ -63,6 +63,10 @@
icon_state = "rusty_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+/turf/closed/wall/rust/icecropolis
+ baseturfs = /turf/open/indestructible/necropolis/air
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+
/turf/closed/wall/r_wall/rust
name = "rusted reinforced wall"
desc = "A huge chunk of rusted reinforced metal."
diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm
index 44acbe06f6bf..27a3225dbb03 100644
--- a/code/game/turfs/open/_open.dm
+++ b/code/game/turfs/open/_open.dm
@@ -99,6 +99,9 @@
heavyfootstep = FOOTSTEP_LAVA
tiled_dirt = FALSE
+/turf/open/indestructible/necropolis/icecropolis
+ initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+
/turf/open/indestructible/necropolis/Initialize(mapload, inherited_virtual_z)
. = ..()
if(prob(12))
diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm
index 3a0184849450..37c369a3d8c9 100644
--- a/code/game/turfs/open/floor/fancy_floor.dm
+++ b/code/game/turfs/open/floor/fancy_floor.dm
@@ -41,6 +41,9 @@
/turf/open/floor/wood/yew
color = WOOD_COLOR_YELLOW
+/turf/open/floor/wood/icecropolis
+ baseturfs = /turf/open/indestructible/necropolis/air
+
/turf/open/floor/wood/examine(mob/user)
. = ..()
. += "There's a few screws and a small crack visible."
diff --git a/code/game/turfs/open/floor/plasteel_floor.dm b/code/game/turfs/open/floor/plasteel_floor.dm
index 61a90ff0da86..7ed16bc5631e 100644
--- a/code/game/turfs/open/floor/plasteel_floor.dm
+++ b/code/game/turfs/open/floor/plasteel_floor.dm
@@ -332,3 +332,6 @@
icon_state = "tiled_light"
base_icon_state = "tiled_light"
color = "#938170"
+
+/turf/open/floor/plasteel/icecropolis
+ baseturfs = /turf/open/indestructible/necropolis/air
diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm
index 996d122a4ac9..89f48aee49a1 100644
--- a/code/game/turfs/open/floor/plating/asteroid.dm
+++ b/code/game/turfs/open/floor/plating/asteroid.dm
@@ -101,7 +101,7 @@
to_chat(user, "There is already a grave there!")
return
to_chat(user, "You start piling the dirt...")
- if(do_after(user, 30, target = src))
+ if(do_after(user,30, target = src))
if(locate(/obj/structure/closet/crate/grave) in dest_turf)
return
if(istype(W, /obj/item/stack/sheet/mineral/wood))
diff --git a/code/game/turfs/open/floor/plating/lavaland.dm b/code/game/turfs/open/floor/plating/lavaland.dm
index 84e0173819b7..1dd8d49d746d 100644
--- a/code/game/turfs/open/floor/plating/lavaland.dm
+++ b/code/game/turfs/open/floor/plating/lavaland.dm
@@ -37,6 +37,15 @@
planetary_atmos = TRUE
baseturfs = /turf/open/lava/smooth/lava_land_surface
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface/icecropolis
+ initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+ baseturfs = /turf/open/indestructible/necropolis/icecropolis
+
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface/icecropolis/inside
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+ planetary_atmos = FALSE
+ baseturfs = /turf/open/indestructible/necropolis/air
+
/turf/open/floor/plating/asteroid/basalt/purple
icon = 'icons/turf/lavaland_purple.dmi'
baseturfs = /turf/open/floor/plating/asteroid/basalt/purple
@@ -93,39 +102,3 @@
light_range = 2
light_power = 0.6
light_color = LIGHT_COLOR_FIRE
-
-/turf/open/floor/concrete/lava
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- light_range = 2
- light_power = 0.6
- light_color = LIGHT_COLOR_FIRE
-
-/turf/open/floor/concrete/slab_1/lava
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- light_range = 2
- light_power = 0.6
- light_color = LIGHT_COLOR_FIRE
-
-/turf/open/floor/plating/lava
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- light_range = 2
- light_power = 0.6
- light_color = LIGHT_COLOR_FIRE
-
-/turf/open/floor/plating/rust/lava
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- light_range = 2
- light_power = 0.6
- light_color = LIGHT_COLOR_FIRE
-
-/turf/open/floor/plasteel/white/lava
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- light_range = 2
- light_power = 0.6
- light_color = LIGHT_COLOR_FIRE
-
-/turf/open/floor/plasteel/dark/lava
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- light_range = 2
- light_power = 0.6
- light_color = LIGHT_COLOR_FIRE
diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm
index 84a49d1a0038..e9b28fb4a613 100644
--- a/code/game/turfs/open/floor/plating/misc_plating.dm
+++ b/code/game/turfs/open/floor/plating/misc_plating.dm
@@ -11,6 +11,11 @@
icon_state = "plating"
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+/turf/open/floor/plating/icecropolis
+ icon_state = "plating"
+ baseturfs = /turf/open/indestructible/necropolis/air
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
+
/turf/open/floor/plating/abductor
name = "alien floor"
icon_state = "alienpod1"
diff --git a/code/game/turfs/open/floor/plating/rockplanet.dm b/code/game/turfs/open/floor/plating/rockplanet.dm
index b6324ebbb3d8..eb0caa6485b1 100644
--- a/code/game/turfs/open/floor/plating/rockplanet.dm
+++ b/code/game/turfs/open/floor/plating/rockplanet.dm
@@ -65,63 +65,15 @@
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
name = "exterior plating"
-/turf/open/floor/plating/rockplanet/lit
- light_range = 2
- light_power = 0.6
- light_color = COLOR_VERY_LIGHT_GRAY
/turf/open/floor/plasteel/stairs/rockplanet
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
name = "exterior stairs"
+
/turf/open/floor/engine/hull/rockplanet
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
/turf/open/floor/plasteel/rockplanet
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
name = "exterior floor"
-
-/turf/open/floor/plasteel/patterned/rockplanet
- initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
-
-/turf/open/floor/plasteel/patterned/rockplanet/lit
- light_range = 2
- light_power = 0.6
- light_color = COLOR_VERY_LIGHT_GRAY
- name = "exterior floor"
-
-/turf/open/floor/plasteel/patterned/brushed/rockplanet
- initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
-
-/turf/open/floor/plasteel/patterned/brushed/rockplanet/lit
- light_range = 2
- light_power = 0.6
- light_color = COLOR_VERY_LIGHT_GRAY
- name = "exterior floor"
-
-/turf/open/floor/plasteel/patterned/ridged/rockplanet
- initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
-
-/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit
- light_range = 2
- light_power = 0.6
- light_color = COLOR_VERY_LIGHT_GRAY
- name = "exterior floor"
-
-/turf/open/floor/plating/rust/rockplanet
- initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
-
-/turf/open/floor/plating/rust/rockplanet/lit
- light_range = 2
- light_power = 0.6
- light_color = COLOR_VERY_LIGHT_GRAY
- name = "exterior plating"
-
-/turf/open/floor/wood/rockplanet
- initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
-
-/turf/open/floor/pod/rockplanet
- initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
-
-/turf/open/floor/engine/hull/reinforced/rockplanet
- initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
diff --git a/code/game/turfs/open/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm
index 7fb94e541bda..a164b159d6f6 100644
--- a/code/game/turfs/open/floor/reinf_floor.dm
+++ b/code/game/turfs/open/floor/reinf_floor.dm
@@ -133,13 +133,6 @@
name = "fuel mix floor"
initial_gas_mix = ATMOS_TANK_FUEL
-/turf/open/floor/engine/hydrogen
- name = "\improper hydrogen floor"
- initial_gas_mix = ATMOS_TANK_HYDROGEN
-
-/turf/open/floor/engine/hydrogen_fuel
- name = "hydrogen mix floor"
- initial_gas_mix = ATMOS_TANK_HYDROGEN_FUEL
/turf/open/floor/engine/cult
name = "engraved floor"
diff --git a/code/game/turfs/open/floor/suns_floor.dm b/code/game/turfs/open/floor/suns_floor.dm
deleted file mode 100644
index efa1aa91a61a..000000000000
--- a/code/game/turfs/open/floor/suns_floor.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/turf/open/floor/suns
- name = "white marble floor"
- icon = 'icons/turf/floors/suns.dmi'
- icon_state = "light"
- floor_tile = /obj/item/stack/tile/suns
-
-/turf/open/floor/suns/plain
- name = "white plain marble floor"
- icon_state = "lightplain"
- floor_tile = /obj/item/stack/tile/suns/plain
-
-/turf/open/floor/suns/pattern
- name = "patterned white marble floor"
- icon_state = "lightpattern"
- floor_tile = /obj/item/stack/tile/suns/pattern
-
-/turf/open/floor/suns/hatch
- name = "hatched wooden floor"
- icon_state = "lighthatched"
- floor_tile = /obj/item/stack/tile/suns/hatch
-
-/turf/open/floor/suns/diagonal
- name = "diagonal wooden floor"
- icon_state = "lightdiag"
- floor_tile = /obj/item/stack/tile/suns/diagonal
-
-/turf/open/floor/suns/grid
- name = "dark grid floor"
- icon_state = "darkchunky"
- floor_tile = /obj/item/stack/tile/suns/grid
-
-/turf/open/floor/suns/dark
- name = "black marble floor"
- icon_state = "dark"
- floor_tile = /obj/item/stack/tile/suns/dark
-
-/turf/open/floor/suns/dark/plain
- name = "black plain marble floor"
- icon_state = "darkplain"
- floor_tile = /obj/item/stack/tile/suns/dark/plain
-
-/turf/open/floor/suns/dark/pattern
- name = "patterned black marble floor"
- icon_state = "darkpattern"
- floor_tile = /obj/item/stack/tile/suns/dark/pattern
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index e5cc9709559c..4ed4b47297a2 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -461,12 +461,12 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists)
return
if(length(src_object.contents()))
to_chat(usr, "You start dumping out the contents...")
- if(!do_after(usr, 20, target=src_object.parent))
+ if(!do_after(usr,20,target=src_object.parent))
return FALSE
var/list/things = src_object.contents()
var/datum/progressbar/progress = new(user, things.len, src)
- while (do_after(usr, 10, src, TRUE, FALSE, CALLBACK(src_object, TYPE_PROC_REF(/datum/component/storage, mass_remove_from_storage), src, things, progress)))
+ while (do_after(usr, 10, TRUE, src, FALSE, CALLBACK(src_object, TYPE_PROC_REF(/datum/component/storage, mass_remove_from_storage), src, things, progress)))
stoplag(1)
progress.end_progress()
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 82e75d63b30e..7b147385c556 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -731,7 +731,7 @@
/datum/admins/proc/podspawn_atom(object as text)
set category = "Event.Spawning"
set desc = "(atom path) Spawn an atom via supply drop"
- set name = "Podspawn"
+ set name = "Supply drop spawn"
if(!check_rights(R_SPAWN))
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 42193738319e..f4913b6be1e8 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -103,7 +103,6 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/cmd_admin_gib_self,
/client/proc/cmd_change_command_name,
/client/proc/cmd_admin_create_centcom_report,
- /client/proc/cmd_admin_distress_signal,
/client/proc/drop_bomb,
/client/proc/set_dynex_scale,
/client/proc/drop_dynex_bomb,
@@ -172,10 +171,13 @@ GLOBAL_PROTECT(admin_verbs_debug)
/client/proc/cmd_display_del_log,
/client/proc/cmd_display_init_log,
/client/proc/cmd_display_overlay_log,
+ /client/proc/cmd_admin_grantfullaccess,
+ /client/proc/cmd_assume_direct_control, //-errorage
+ /client/proc/cmd_give_direct_control,
/client/proc/getserverlogs, /*for accessing server logs*/
/client/proc/getcurrentlogs, /*for accessing server logs for the current round*/
/client/proc/restart_controller,
- /client/proc/enable_debug_verbs,
+ /client/proc/disable_debug_verbs,
/client/proc/callproc,
/client/proc/callproc_datum,
/client/proc/SDQL2_query,
@@ -212,6 +214,12 @@ GLOBAL_PROTECT(admin_verbs_debug)
/datum/admins/proc/overmap_view, /* Opens HTML overmap viewer UI */
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
/client/proc/toggle_cdn,
+ /client/proc/check_timer_sources,
+ /client/proc/air_status, //Air things
+ /client/proc/air_status_loc, //More air things
+ /client/proc/manipulate_organs,
+ /client/proc/set_server_fps, //allows you to set the ticklag.
+ /client/proc/start_singlo,
)
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
GLOBAL_PROTECT(admin_verbs_possess)
@@ -255,7 +263,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/cinematic,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_create_centcom_report,
- /client/proc/cmd_admin_distress_signal,
/client/proc/cmd_change_command_name,
/client/proc/object_say,
/client/proc/toggle_random_events,
@@ -273,7 +280,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/cmd_debug_make_powernets,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_debug_del_all,
- /client/proc/enable_debug_verbs,
+ /client/proc/disable_debug_verbs,
/proc/possess,
/proc/release,
/client/proc/reload_admins,
@@ -306,7 +313,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
if(rights & R_SERVER)
add_verb(src, GLOB.admin_verbs_server)
if(rights & R_DEBUG)
- add_verb(src, GLOB.admin_verbs_debug)
+ add_verb(src, list(GLOB.admin_verbs_debug, GLOB.admin_verbs_debug_extra))
if(rights & R_POSSESS)
add_verb(src, GLOB.admin_verbs_possess)
if(rights & R_PERMISSIONS)
@@ -340,7 +347,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
GLOB.admin_verbs_spawn,
/*Debug verbs added by "show debug verbs"*/
GLOB.admin_verbs_debug_extra,
- /client/proc/enable_debug_verbs,
+ /client/proc/disable_debug_verbs,
/client/proc/readmin
))
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 9a226bbcb617..ae039c216120 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -27,7 +27,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
*/
/client/proc/air_status_loc()
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Air Status in Location"
if(!mob)
return
@@ -185,7 +185,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Powernets") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_grantfullaccess(mob/M in GLOB.mob_list)
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Grant Full Access"
if(!SSticker.HasRoundStarted())
@@ -228,7 +228,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
message_admins("[key_name_admin(usr)] has granted [M.key] full access.")
/client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list)
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Assume direct control"
set desc = "Direct intervention"
@@ -249,7 +249,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_give_direct_control(mob/M in GLOB.mob_list)
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Give direct control"
if(!M)
@@ -530,7 +530,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return dresscode
/client/proc/start_singlo()
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Start Singularity"
set desc = "Sets up the singularity and all machines to get power flowing through the station"
@@ -797,7 +797,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/// A debug verb to check the sources of currently running timers
/client/proc/check_timer_sources()
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Check Timer Sources"
set desc = "Checks the sources of the running timers"
if (!check_rights(R_DEBUG))
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 469c0cda08f3..7e89d542eb2b 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -1,5 +1,5 @@
/client/proc/air_status(turf/target)
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Display Air Status"
if(!isturf(target))
diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm
index 8ac8d6b91d44..a3e7c5f5df0b 100644
--- a/code/modules/admin/verbs/fps.dm
+++ b/code/modules/admin/verbs/fps.dm
@@ -1,6 +1,6 @@
//replaces the old Ticklag verb, fps is easier to understand
/client/proc/set_server_fps()
- set category = "Debug.Debug"
+ set category = "Debug"
set name = "Set Server FPS"
set desc = "Sets game speed in frames-per-second. Can potentially break the game"
diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm
index 42873241b71b..0695777a6897 100644
--- a/code/modules/admin/verbs/manipulate_organs.dm
+++ b/code/modules/admin/verbs/manipulate_organs.dm
@@ -1,6 +1,6 @@
/client/proc/manipulate_organs(mob/living/carbon/C in world)
set name = "Manipulate Organs"
- set category = "Debug.Debug"
+ set category = "Debug"
var/operation = input("Select organ operation.", "Organ Manipulation", "cancel") as null|anything in list("add organ", "add implant", "drop organ/implant", "remove organ/implant", "cancel")
if (!operation)
return
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 8f1b69bc831d..6d8bac8adcfc 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -43,15 +43,6 @@ GLOBAL_LIST_INIT(admin_verbs_debug_extra, list(
/client/proc/show_line_profiling,
/client/proc/start_line_profiling,
/client/proc/stop_line_profiling,
- /client/proc/check_timer_sources,
- /client/proc/air_status, //Air things
- /client/proc/air_status_loc, //More air things
- /client/proc/manipulate_organs,
- /client/proc/set_server_fps, //allows you to set the ticklag.
- /client/proc/start_singlo,
- /client/proc/cmd_admin_grantfullaccess,
- /client/proc/cmd_assume_direct_control, //-errorage
- /client/proc/cmd_give_direct_control,
))
GLOBAL_PROTECT(admin_verbs_debug_extra)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 853d33e1b61b..f189fdf6106d 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -360,21 +360,6 @@
message_admins("[key_name_admin(src)] has changed Central Command's name to [input]")
log_admin("[key_name(src)] has changed the Central Command name to: [input]")
-/client/proc/cmd_admin_distress_signal()
- set category = "Event"
- set name = "Create Distress Signal"
-
- var/datum/overmap/ship/ship = SSshuttle.get_ship(usr)
- if(!ship)
- return
- var/confirm = alert(src, "Do you want to create a distress signal for [ship.name]", "Distress Signal", "Yes", "Cancel")
-
- switch(confirm)
- if("Yes")
- create_distress_beacon(ship)
- if("Cancel")
- return
-
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world)
set category = "Debug"
set name = "Delete"
diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm
index f158499d8b0f..6036ae1d00f6 100644
--- a/code/modules/antagonists/changeling/powers/linglink.dm
+++ b/code/modules/antagonists/changeling/powers/linglink.dm
@@ -67,7 +67,7 @@
to_chat(user, "We must keep holding on to [target] to sustain the link. ")
while(user.pulling && user.grab_state >= GRAB_NECK)
target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 0.5) // So they don't choke to death while you interrogate them
- do_after(user, 10 SECONDS, target, hidden = TRUE)
+ do_after(user, 10 SECONDS, target, TRUE)
changeling.islinking = 0
target.mind.linglink = 0
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 5058dc73f081..7355880e6da1 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -61,6 +61,10 @@ Runes can either be invoked by one's self or with many different cultists. Each
if(do_after(user, 15, target = src))
to_chat(user, "You carefully erase the [lowertext(cultist_name)] rune.")
qdel(src)
+ else if(istype(I, /obj/item/nullrod))
+ user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod")
+ to_chat(user, "You disrupt the magic of [src] with [I].")
+ qdel(src)
/obj/effect/rune/attack_hand(mob/living/user)
. = ..()
@@ -498,6 +502,9 @@ structure_check() searches for nearby cultist structures required for the invoca
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
log_game("Summon Narsie rune erased by [key_name(user)] with [I.name]")
message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with [I.name]")
+ else if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me.
+ log_game("Summon Narsie rune erased by [key_name(user)] using a null rod")
+ message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with a null rod")
else
..()
diff --git a/code/modules/antagonists/ert/frontiersmen.dm b/code/modules/antagonists/ert/frontiersmen.dm
index d6a1a5182cf0..3c76dcebed9c 100644
--- a/code/modules/antagonists/ert/frontiersmen.dm
+++ b/code/modules/antagonists/ert/frontiersmen.dm
@@ -26,9 +26,6 @@
outfit = /datum/outfit/job/frontiersmen/ert/leader
role = "Officer"
-/datum/antagonist/ert/frontier/leader/unnarmed
- outfit = /datum/outfit/job/frontiersmen/ert/leader/unnarmed
-
/datum/antagonist/ert/frontier/medic
name = "Frontiersmen Medic"
outfit = /datum/outfit/job/frontiersmen/ert/medic
@@ -38,11 +35,3 @@
name = "Frontiersmen Engineer"
outfit = /datum/outfit/job/frontiersmen/ert/engineer
role = "Sapper"
-
-/datum/antagonist/ert/frontier/better
- name = "Frontiersmen Grunt"
- outfit = /datum/outfit/job/frontiersmen/ert/grunt/skm
-
-/datum/antagonist/ert/frontier/unnarmed
- name = "Frontiersmen Grunt"
- outfit = /datum/outfit/job/frontiersmen/ert/grunt
diff --git a/code/modules/antagonists/ert/inteq.dm b/code/modules/antagonists/ert/inteq.dm
index f4636487da5f..591ad684cc1d 100644
--- a/code/modules/antagonists/ert/inteq.dm
+++ b/code/modules/antagonists/ert/inteq.dm
@@ -20,5 +20,5 @@
/datum/antagonist/ert/inteq/leader
name = "Inteq Mercenary Leader"
- outfit = /datum/outfit/job/inteq/captain/empty
+ outfit = /datum/outfit/job/inteq/captain
role = "Vanguard"
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 648803185661..f3d6bb31abf4 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -126,7 +126,7 @@
if(istype(I, /obj/item/nuke_core_container))
var/obj/item/nuke_core_container/core_box = I
to_chat(user, "You start loading the plutonium core into [core_box]...")
- if(do_after(user, 50, target = src, hidden = TRUE))
+ if(do_after(user,50,target=src, hidden = TRUE))
if(core_box.load(core, user))
to_chat(user, "You load the plutonium core into [core_box].")
deconstruction_state = NUKESTATE_CORE_REMOVED
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index 084176f4b8c4..76da8304df09 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -190,6 +190,17 @@
return BULLET_ACT_FORCE_PIERCE
return ..()
+//damage, gibbing, and dying
+/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
+ . = ..()
+ if(istype(W, /obj/item/nullrod))
+ visible_message("[src] violently flinches!", \
+ "As \the [W] passes through you, you feel your essence draining away!")
+ adjustBruteLoss(25) //hella effective
+ inhibited = TRUE
+ update_action_buttons_icon()
+ addtimer(CALLBACK(src, PROC_REF(reset_inhibit)), 30)
+
/mob/living/simple_animal/revenant/proc/reset_inhibit()
inhibited = FALSE
update_action_buttons_icon()
diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm
index d6bbba359303..a6edcb075361 100644
--- a/code/modules/antagonists/traitor/syndicate_contract.dm
+++ b/code/modules/antagonists/traitor/syndicate_contract.dm
@@ -143,10 +143,10 @@
// Pay contractor their portion of ransom
if (status == CONTRACT_STATUS_COMPLETE)
var/mob/living/carbon/human/H
- var/obj/item/card/bank/C
+ var/obj/item/card/id/C
if(ishuman(contract.owner.current))
H = contract.owner.current
- C = H.get_bankcard()
+ C = H.get_idcard(TRUE)
if(C && C.registered_account)
C.registered_account.adjust_money(ransom * 0.35, "syndicate_contract")
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index a20b905b590d..a95ef0d1b579 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -58,6 +58,14 @@
if(spawn_amt_left <= 0)
qdel(src)
+/obj/effect/rend/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/nullrod))
+ user.visible_message("[user] seals \the [src] with \the [I].")
+ qdel(src)
+ return
+ else
+ return ..()
+
/obj/effect/rend/singularity_pull()
return
diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm
index fb0d7026a6d1..e128623f9cb8 100644
--- a/code/modules/atmospherics/auxgm/gas_types.dm
+++ b/code/modules/atmospherics/auxgm/gas_types.dm
@@ -155,15 +155,3 @@
gas_overlay = "freon"
moles_visible = MOLES_GAS_VISIBLE *30
fusion_power = -5
-
-/datum/gas/hydrogen
- id = GAS_HYDROGEN
- specific_heat = 10
- name = "Hydrogen"
- flags = GAS_FLAG_DANGEROUS
- moles_visible = MOLES_GAS_VISIBLE
- color = "#ffe"
- fusion_power = 0
- fire_products = list(GAS_H2O = 1)
- fire_burn_rate = 2
- fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index e5a1be0294d6..895bfdc96cf4 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -121,8 +121,7 @@
GAS_STIMULUM = new/datum/tlv/dangerous,
GAS_NITRYL = new/datum/tlv/dangerous,
GAS_PLUOXIUM = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- GAS_FREON = new/datum/tlv/dangerous,
- GAS_HYDROGEN = new/datum/tlv/dangerous
+ GAS_FREON = new/datum/tlv/dangerous
)
/obj/machinery/airalarm/server // No checks here.
@@ -141,8 +140,7 @@
GAS_STIMULUM = new/datum/tlv/no_checks,
GAS_NITRYL = new/datum/tlv/no_checks,
GAS_PLUOXIUM = new/datum/tlv/no_checks,
- GAS_FREON = new/datum/tlv/no_checks,
- GAS_HYDROGEN = new/datum/tlv/no_checks
+ GAS_FREON = new/datum/tlv/no_checks
)
heating_manage = FALSE
@@ -162,8 +160,7 @@
GAS_STIMULUM = new/datum/tlv/dangerous,
GAS_NITRYL = new/datum/tlv/dangerous,
GAS_PLUOXIUM = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- GAS_FREON = new/datum/tlv/dangerous,
- GAS_HYDROGEN = new/datum/tlv/dangerous
+ GAS_FREON = new/datum/tlv/dangerous
)
heating_manage = FALSE
@@ -567,8 +564,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27)
GAS_BZ,
GAS_STIMULUM,
GAS_PLUOXIUM,
- GAS_FREON,
- GAS_HYDROGEN
+ GAS_FREON
),
"scrubbing" = 1,
"widenet" = 1
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 7416014ee463..c32a750848da 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -204,18 +204,18 @@
piping_layer = 2
icon_state = "volpump_map-2"
-/obj/machinery/atmospherics/components/binary/volume_pump/layer4
- piping_layer = 4
- icon_state = "volpump_map-4"
+/obj/machinery/atmospherics/components/binary/volume_pump/layer2
+ piping_layer = 2
+ icon_state = "volpump_map-2"
/obj/machinery/atmospherics/components/binary/volume_pump/on
on = TRUE
- icon_state = "volpump_on_map-3"
+ icon_state = "volpump_map-2"
/obj/machinery/atmospherics/components/binary/volume_pump/on/layer2
piping_layer = 2
- icon_state = "volpump_on_map-2"
+ icon_state = "volpump_map-2"
/obj/machinery/atmospherics/components/binary/volume_pump/on/layer4
piping_layer = 4
- icon_state = "volpump_on_map-4"
+ icon_state = "volpump_map-4"
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 5ff6b2e396b5..3705cb361d82 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -299,7 +299,7 @@
close_machine(target)
else
user.visible_message("[user] starts shoving [target] inside [src].", "You start shoving [target] inside [src].")
- if (do_after(user, 25, target = target))
+ if (do_after(user, 25, target=target))
close_machine(target)
/obj/machinery/atmospherics/components/unary/cryo_cell/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm
index 9f5a6a9aa6db..ca85e9cc5569 100644
--- a/code/modules/atmospherics/machinery/other/miner.dm
+++ b/code/modules/atmospherics/machinery/other/miner.dm
@@ -178,8 +178,3 @@
name = "\improper Water Vapor Gas Miner"
overlay_color = "#99928E"
spawn_id = GAS_H2O
-
-/obj/machinery/atmospherics/miner/hydrogen
- name = "\improper Hydrogen Gas Miner"
- overlay_color = "#ffffffda"
- spawn_id = GAS_HYDROGEN
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index f2e563c07b5e..6b0f025b6b89 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -52,9 +52,7 @@
"stimulum" = /obj/machinery/portable_atmospherics/canister/stimulum,
"pluoxium" = /obj/machinery/portable_atmospherics/canister/pluoxium,
"caution" = /obj/machinery/portable_atmospherics/canister,
- "freon" = /obj/machinery/portable_atmospherics/canister/freon,
- "hydrogen" = /obj/machinery/portable_atmospherics/canister/hydrogen,
- "fuel mix" = /obj/machinery/portable_atmospherics/canister/fuel
+ "freon" = /obj/machinery/portable_atmospherics/canister/freon
)
/obj/machinery/portable_atmospherics/canister/interact(mob/user)
@@ -149,27 +147,6 @@
gas_type = GAS_FREON
filled = 1
-/obj/machinery/portable_atmospherics/canister/hydrogen
- name = "hydrogen canister"
- desc = "Hydrogen. Used in thruster fuel."
- icon_state = "orangews"
- gas_type = GAS_HYDROGEN
-
-/obj/machinery/portable_atmospherics/canister/fuel
- name = "fuel canister"
- desc = "A highly volatile mix of hydrogen and oxygen."
- icon_state = "orangewshaz"
-
-/obj/machinery/portable_atmospherics/canister/fuel_test
- name = "test canister"
- desc = "Hydrogen. Used in thruster fuel."
- icon_state = "orangewshaz"
-
-/obj/machinery/portable_atmospherics/canister/fuel_test/create_gas()
- air_contents.set_moles(GAS_O2, 500)
- air_contents.set_moles(GAS_HYDROGEN, 1000)
- air_contents.set_temperature(T20C)
-
/obj/machinery/portable_atmospherics/canister/fusion_test
name = "fusion test canister"
desc = "Don't be a badmin."
@@ -239,11 +216,6 @@
air_contents.set_moles(GAS_O2, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
air_contents.set_moles(GAS_N2, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
-/obj/machinery/portable_atmospherics/canister/fuel/create_gas()
- air_contents.set_temperature(starter_temp)
- air_contents.set_moles(GAS_HYDROGEN, (2/3 * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
- air_contents.set_moles((GAS_O2), (1/3 * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature()))
-
/obj/machinery/portable_atmospherics/canister/update_icon_state()
if(machine_stat & BROKEN)
icon_state = "[icon_state]-1"
diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm
index 7505d2b8789e..8e71222ab4d4 100644
--- a/code/modules/atmospherics/machinery/portable/scrubber.dm
+++ b/code/modules/atmospherics/machinery/portable/scrubber.dm
@@ -8,7 +8,7 @@
var/volume_rate = 1000
var/overpressure_m = 80
var/use_overlays = TRUE
- var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O, GAS_FREON, GAS_HYDROGEN)
+ var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O, GAS_FREON)
/obj/machinery/portable_atmospherics/scrubber/Destroy()
var/turf/T = get_turf(src)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 0bf0b74c715a..11358938bd47 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -224,7 +224,7 @@
C.sensor_mode = NO_SENSORS
- var/obj/item/card/id/W = H.get_idcard()
+ var/obj/item/card/id/W = H.wear_id
if(W)
if(H.age)
W.registered_age = H.age
@@ -437,7 +437,7 @@
/datum/outfit/spacebartender/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
- var/obj/item/card/id/W = H.get_idcard()
+ var/obj/item/card/id/W = H.wear_id
if(H.age < AGE_MINOR)
W.registered_age = AGE_MINOR
to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index f2dbb91f3f0f..b64a2abf02de 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -579,7 +579,7 @@
uniform = /obj/item/clothing/under/syndicate/coldres
shoes = /obj/item/clothing/shoes/combat/coldres
ears = /obj/item/radio/headset/syndicate/alt
- r_pocket = /obj/item/gun/ballistic/automatic/pistol/syndicate
+ r_pocket = /obj/item/gun/ballistic/automatic/pistol
id = /obj/item/card/id/syndicate
implants = list(/obj/item/implant/exile)
diff --git a/code/modules/buildmode/submodes/lightmaker.dm b/code/modules/buildmode/submodes/lightmaker.dm
deleted file mode 100644
index 2b50343c641a..000000000000
--- a/code/modules/buildmode/submodes/lightmaker.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/datum/buildmode_mode/lightmaker
- key = "lightmaker"
-
- var/light_range = 3
- var/light_power = 1
- var/light_color = COLOR_WHITE
-
-/datum/buildmode_mode/lightmaker/show_help(client/target_client)
- to_chat(target_client, span_purple(examine_block(
- "[span_bold("Left Click")] -> Create light\n\
- [span_bold("Right Click")] -> Delete light\n\
- [span_bold("Right Click on Build Mode Button")] -> Change light properties"))
- )
-
-/datum/buildmode_mode/lightmaker/change_settings(client/target_client)
- var/choice = alert("Change the new light range, power or color?", "Light Maker", "Range", "Power", "Color", "Cancel")
- switch(choice)
- if("Range")
- light_range = input(target_client, "Range of light", text("Input")) as num|null
- if("Power")
- light_power = input(target_client, "Power of light", text("Input")) as num|null
- if("Color")
- light_color = input(target_client, "Light color", text("Input")) as color|null
-
-/datum/buildmode_mode/lightmaker/handle_click(client/target_client, params, obj/object)
- var/list/modifiers = params2list(params)
-
- if(LAZYACCESS(modifiers, LEFT_CLICK))
- object.set_light(light_range, light_power, light_color)
- if(LAZYACCESS(modifiers, RIGHT_CLICK))
- object.set_light(0,0,COLOR_WHITE)
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
index a4c4195beca0..951574fedfe2 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
@@ -160,7 +160,7 @@
/datum/blackmarket_item/clothing/ramzi_suit
name = "Rusted Red Hardsuit"
desc = "A vintage ICW Era Gorlex Maruader hardsuit. The previous owner said we could have it when we pried it off their cold dead hands. Dry cleaning not included."
- item = /obj/item/clothing/suit/space/hardsuit/syndi/ramzi
+ item = /obj/item/clothing/head/helmet/space/hardsuit/syndi/ramzi
price_min = 1500
price_max = 2500
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm
index e3a20e0e8905..6e6551b58e86 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm
@@ -161,10 +161,10 @@
availability_prob = 80
unlimited = TRUE
-/datum/blackmarket_item/consumable/vimukti
- name = "Can of Vimukti"
+/datum/blackmarket_item/consumable/thirteenloko
+ name = "Can of Thirteen Loko"
desc = "This product was quietly discontinued after multiple health related incidents. But you aren't a coward, are you?"
- item = /obj/item/reagent_containers/food/drinks/soda_cans/vimukti
+ item = /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko
price_min = 10
price_max = 50
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
index d24cbf68171d..0c86f608e51c 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
@@ -1,6 +1,46 @@
/datum/blackmarket_item/tool
category = "Tools"
+/datum/blackmarket_item/tool/caravan_wrench
+ name = "Experimental Wrench"
+ desc = "The extra fast and handy wrench you always wanted!"
+ item = /obj/item/wrench/caravan
+
+ price_min = 100
+ price_max = 200
+ stock_max = 3
+ availability_prob = 40
+
+/datum/blackmarket_item/tool/caravan_wirecutters
+ name = "Experimental Wirecutters"
+ desc = "The extra fast and handy wirecutters you always wanted!"
+ item = /obj/item/wirecutters/caravan
+
+ price_min = 100
+ price_max = 200
+ stock_max = 3
+ availability_prob = 40
+
+/datum/blackmarket_item/tool/caravan_screwdriver
+ name = "Experimental Screwdriver"
+ desc = "The extra fast and handy screwdriver you always wanted!"
+ item = /obj/item/screwdriver/caravan
+
+ price_min = 100
+ price_max = 200
+ stock_max = 3
+ availability_prob = 40
+
+/datum/blackmarket_item/tool/caravan_crowbar
+ name = "Experimental Crowbar"
+ desc = "The extra fast and handy crowbar you always wanted!"
+ item = /obj/item/crowbar/red/caravan
+
+ price_min = 100
+ price_max = 200
+ stock_max = 3
+ availability_prob = 40
+
/datum/blackmarket_item/tool/combat_wrench
name = "Combat Wrench"
desc = "Under fire while doing repairs? With this dual purpose wrench, never be caught unprepared again!"
@@ -125,7 +165,7 @@
/datum/blackmarket_item/tool/suppressor
name = "Suppressor"
desc = "A suppressor, for when you to keep your murder on the down low."
- item = /obj/item/attachment/silencer
+ item = /obj/item/suppressor
price_min = 100
price_max = 700
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
index 3d6b32a67569..83740509f2d7 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
@@ -38,7 +38,7 @@
/datum/blackmarket_item/weapon/switchblade
name = "Switchblade"
desc = "Extra shrap switchblades for intimidation AND style. Bandages not included if you cut yourself."
- item = /obj/item/kitchen/knife/switchblade
+ item = /obj/item/switchblade
price_min = 500
price_max = 700
@@ -150,7 +150,7 @@
/datum/blackmarket_item/weapon/saber_smg
name = "Saber 9mm SMG"
desc = "A prototype 9mm submachine gun. Most of these never got past the RND phase and into distribution. But we happen know a guy."
- item = /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/proto
+ item = /obj/item/gun/ballistic/automatic/smg/proto
pair_item = /datum/blackmarket_item/weapon/saber_mag
price_min = 2500
@@ -209,38 +209,6 @@
stock_max = 3
availability_prob = 30
-/datum/blackmarket_item/weapon/mecha_syringe_gun
- name = "Mounted Syringe Gun"
- desc = "We ripped this off an old Nanotrasen exosuit. It's a real advanced piece of equipment. Exosuit not included."
- item = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun
-
- price_min = 5000
- price_max = 7000
- stock = 1
- availability_prob = 15
-
-/datum/blackmarket_item/weapon/mecha_hades
- name = "Mounted FNX-99 Carbine"
- desc = "This so called \"Hades\" carbine is sure to burn brightly above the competition! Not to be confused with the \"Hades\" energy rifle. Exosuit not included."
- item = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
- pair_item = /datum/blackmarket_item/weapon/mecha_hades_ammo
-
- price_min = 2000
- price_max = 3000
- stock_max = 2
- availability_prob = 25
-
-/datum/blackmarket_item/weapon/mecha_hades_ammo
- name = "FNX-99 Incediary Ammo"
- desc = "A box of 24 incendiary shells for the FNX-99 mounted carbine."
- item = /obj/item/mecha_ammo/incendiary
-
- price_min = 250
- price_max = 350
- stock_min = 3
- stock_max = 5
- availability_prob = 0
-
/datum/blackmarket_item/weapon/model_h
name = "Model H"
desc = "A Model H slug pistol. The H stands for Hurt. Chambered in ferromagnetic slugs."
diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm
index 969a41601fbb..d0e946ba2a6e 100644
--- a/code/modules/cargo/bounties/chef.dm
+++ b/code/modules/cargo/bounties/chef.dm
@@ -2,7 +2,7 @@
name = "Birthday Cake"
description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!"
reward = 4000
- wanted_types = list(/obj/item/food/cake/birthday, /obj/item/food/cakeslice/birthday)
+ wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday)
/datum/bounty/item/chef/soup
name = "Soup"
@@ -43,7 +43,7 @@
name = "Bread"
description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions."
reward = 1000
- wanted_types = list(/obj/item/food/bread, /obj/item/food/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase)
+ wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase)
/datum/bounty/item/chef/pie
name = "Pie"
diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm
index 4eb48b09c7cb..b2df34d8f964 100644
--- a/code/modules/cargo/bounties/mining.dm
+++ b/code/modules/cargo/bounties/mining.dm
@@ -41,7 +41,7 @@
description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing."
reward = 7500
required_count = 3
- wanted_types = list(/obj/item/clothing/accessory/bonearmlet)
+ wanted_types = list(/obj/item/clothing/accessory/talisman)
/datum/bounty/item/mining/bone_dagger
name = "Bone Daggers"
diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm
index 0fcbbf4f1794..a3ece1cce8c6 100644
--- a/code/modules/cargo/bounties/reagent.dm
+++ b/code/modules/cargo/bounties/reagent.dm
@@ -71,7 +71,7 @@
/datum/reagent/consumable/ethanol/syndicatebomb,\
/datum/reagent/consumable/ethanol/tequila_sunrise,\
/datum/reagent/consumable/ethanol/manly_dorf,\
- /datum/reagent/consumable/ethanol/vimukti,\
+ /datum/reagent/consumable/ethanol/thirteenloko,\
/datum/reagent/consumable/triple_citrus,\
/datum/reagent/consumable/ethanol/vodkamartini,\
/datum/reagent/consumable/ethanol/whiskeysoda,\
@@ -100,7 +100,10 @@
/datum/reagent/consumable/ethanol/booger,\
/datum/reagent/consumable/ethanol/hippies_delight,\
/datum/reagent/consumable/ethanol/drunkenblumpkin,\
+ /datum/reagent/consumable/ethanol/fetching_fizz,\
/datum/reagent/consumable/ethanol/goldschlager,\
+ /datum/reagent/consumable/ethanol/manhattan_proj,\
+ /datum/reagent/consumable/ethanol/narsour,\
/datum/reagent/consumable/ethanol/neurotoxin,\
/datum/reagent/consumable/ethanol/patron,\
/datum/reagent/consumable/ethanol/quadruple_sec,\
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 82fd2c11d01a..143480b2bc71 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -1,57 +1,42 @@
-#define BEACON_COST 500
-#define SP_LINKED 1
-#define SP_READY 2
-#define SP_LAUNCH 3
-#define SP_UNLINK 4
-#define SP_UNREADY 5
-
/obj/machinery/computer/cargo
- name = "outpost communications console"
- desc = "This console allows the user to communicate with a nearby outpost to \
- purchase supplies and manage missions. Purchases are delivered near-instantly."
- icon_screen = "supply_express"
+ name = "supply console"
+ desc = "Used to order supplies, approve requests, and control the shuttle."
+ icon_screen = "supply"
circuit = /obj/item/circuitboard/computer/cargo
light_color = COLOR_BRIGHT_ORANGE
+ var/requestonly = FALSE
var/contraband = FALSE
var/self_paid = FALSE
var/safety_warning = "For safety reasons, the automated supply shuttle \
cannot transport live organisms, human remains, classified nuclear weaponry, \
homing beacons or machinery housing any form of artificial intelligence."
+ var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible."
+ /// radio used by the console to send messages on supply channel
+ var/obj/item/radio/headset/radio
/// var that tracks message cooldown
var/message_cooldown
- var/blockade_warning = "Bluespace instability detected. Delivery impossible."
- var/message
- /// Number of beacons printed. Used to determine beacon names.
- var/printed_beacons = 0
- var/list/supply_pack_data
- /// The currently linked supplypod beacon
- var/obj/item/supplypod_beacon/beacon
- /// Area instance that cargo pods are sent to
- var/area/landingzone
- /// The pod type used to deliver orders
- var/podType = /obj/structure/closet/supplypod/centcompod
- /// Cooldown to prevent printing supplypod beacon spam
- var/cooldown = 0
- /// Is the console in beacon mode? exists to let beacon know when a pod may come in
- var/use_beacon = FALSE
- /// The account to charge purchases to, defaults to the cargo budget
- var/datum/bank_account/charge_account
+
+/obj/machinery/computer/cargo/request
+ name = "supply request console"
+ desc = "Used to request supplies from cargo."
+ icon_screen = "request"
+ circuit = /obj/item/circuitboard/computer/cargo/request
+ requestonly = TRUE
/obj/machinery/computer/cargo/Initialize()
. = ..()
+ radio = new /obj/item/radio/headset/headset_cargo(src)
var/obj/item/circuitboard/computer/cargo/board = circuit
contraband = board.contraband
if (board.obj_flags & EMAGGED)
obj_flags |= EMAGGED
else
obj_flags &= ~EMAGGED
- generate_pack_data()
/obj/machinery/computer/cargo/Destroy()
- if(beacon)
- beacon.unlink_console()
+ QDEL_NULL(radio)
return ..()
/obj/machinery/computer/cargo/proc/get_export_categories()
@@ -80,68 +65,49 @@
/obj/machinery/computer/cargo/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "OutpostCommunications", name)
+ ui = new(user, src, "Cargo", name)
ui.open()
- if(!charge_account)
- reconnect()
-/obj/machinery/computer/cargo/ui_data(mob/user)
- var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
+/obj/machinery/computer/cargo/ui_data()
var/list/data = list()
-
- // not a big fan of get_containing_shuttle
- var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
- var/datum/overmap/ship/controlled/ship
- var/outpost_docked = FALSE
+ data["location"] = SSshuttle.supply.getStatusText()
+ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(D)
- ship = D.current_ship
- outpost_docked = istype(ship.docked_to, /datum/overmap/outpost)
-
- data["onShip"] = !isnull(ship)
- data["numMissions"] = ship ? LAZYLEN(ship.missions) : 0
- data["maxMissions"] = ship ? ship.max_missions : 0
- data["outpostDocked"] = outpost_docked
- data["points"] = charge_account ? charge_account.account_balance : 0
- data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user)
- data["beaconZone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
- data["usingBeacon"] = use_beacon //is the mode set to deliver to the beacon or the cargobay?
- data["canBeacon"] = !use_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
- data["canBuyBeacon"] = charge_account ? (cooldown <= 0 && charge_account.account_balance >= BEACON_COST) : FALSE
- data["beaconError"] = use_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
- data["hasBeacon"] = beacon != null//is there a linked beacon?
- data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
- data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
- data["supplies"] = list()
- message = "Sales are near-instantaneous - please choose carefully."
+ data["points"] = D.account_balance
+ data["away"] = SSshuttle.supply.get_docked() == SSshuttle.supply_away_port
+ data["self_paid"] = self_paid
+ data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE
+ var/message = "Remember to stamp and send back the supply manifests."
+ if(SSshuttle.centcom_message)
+ message = SSshuttle.centcom_message
if(SSshuttle.supplyBlocked)
message = blockade_warning
- if(use_beacon && !beacon)
- message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed
- else if (use_beacon && !canBeacon)
- message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf
data["message"] = message
- if(!supply_pack_data)
- generate_pack_data()
- stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]")
- data["supplies"] = supply_pack_data
- if (cooldown > 0)//cooldown used for printing beacons
- cooldown--
-
- data["shipMissions"] = list()
- data["outpostMissions"] = list()
+ data["cart"] = list()
+ for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
+ data["cart"] += list(list(
+ "object" = SO.pack.name,
+ "cost" = SO.pack.cost,
+ "id" = SO.id,
+ "orderer" = SO.orderer,
+ "paid" = !isnull(SO.paying_account) //paid by requester
+ ))
- if(ship)
- for(var/datum/mission/M as anything in ship.missions)
- data["shipMissions"] += list(M.get_tgui_info())
- if(outpost_docked)
- var/datum/overmap/outpost/out = ship.docked_to
- for(var/datum/mission/M as anything in out.missions)
- data["outpostMissions"] += list(M.get_tgui_info())
+ data["requests"] = list()
+ for(var/datum/supply_order/SO in SSshuttle.requestlist)
+ data["requests"] += list(list(
+ "object" = SO.pack.name,
+ "cost" = SO.pack.cost,
+ "orderer" = SO.orderer,
+ "reason" = SO.reason,
+ "id" = SO.id
+ ))
return data
/obj/machinery/computer/cargo/ui_static_data(mob/user)
var/list/data = list()
+ data["requestonly"] = requestonly
data["supplies"] = list()
for(var/pack in SSshuttle.supply_packs)
var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
@@ -150,7 +116,7 @@
"name" = P.group,
"packs" = list()
)
- if(P.hidden && !(obj_flags & EMAGGED))
+ if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)
continue
data["supplies"][P.group]["packs"] += list(list(
"name" = P.name,
@@ -158,6 +124,7 @@
"id" = pack,
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
"small_item" = P.small_item,
+ "access" = P.access
))
return data
@@ -166,154 +133,115 @@
if(.)
return
switch(action)
- if("withdrawCash")
- var/val = text2num(params["value"])
- // no giving yourself money
- if(!charge_account || !val || val <= 0)
+ if("send")
+ if(!SSshuttle.supply.canMove())
+ say(safety_warning)
return
- if(charge_account.adjust_money(-val))
- var/obj/item/holochip/cash_chip = new /obj/item/holochip(drop_location(), val)
- if(ishuman(usr))
- var/mob/living/carbon/human/user = usr
- user.put_in_hands(cash_chip)
- playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE)
- src.visible_message("[src] dispenses a holochip.")
- return TRUE
-
- if("LZCargo")
- use_beacon = FALSE
- if (beacon)
- beacon.update_status(SP_UNREADY) //ready light on beacon will turn off
- if("LZBeacon")
- use_beacon = TRUE
- if (beacon)
- beacon.update_status(SP_READY) //turns on the beacon's ready light
- if("printBeacon")
- if(charge_account?.adjust_money(-BEACON_COST))
- cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
- var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
- C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
- printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
- beacon.name = "Supply Pod Beacon #[printed_beacons]"
+ if(SSshuttle.supplyBlocked)
+ say(blockade_warning)
+ return
+ if(SSshuttle.supply.get_docked() == SSshuttle.supply_home_port)
+ SSshuttle.supply.export_categories = get_export_categories()
+ SSshuttle.moveShuttle(SSshuttle.supply, SSshuttle.supply_away_port, TRUE)
+ say("The supply shuttle is departing.")
+ investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO)
+ else
+ investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO)
+ say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.")
+ SSshuttle.moveShuttle(SSshuttle.supply, SSshuttle.supply_home_port, TRUE)
+ . = TRUE
if("add")
- var/area/ship/current_area = get_area(src)
- var/datum/supply_pack/pack = SSshuttle.supply_packs[text2path(params["id"])]
- if( \
- !pack || !charge_account?.has_money(pack.cost) || !istype(current_area) || \
- !istype(current_area.mobile_port.current_ship.docked_to, /datum/overmap/outpost) \
- )
+ if(istype(src, /obj/machinery/computer/cargo/express))
return
-
- var/turf/landing_turf
- if(!isnull(beacon) && use_beacon) // prioritize beacons over landing in cargobay
- landing_turf = get_turf(beacon)
- beacon.update_status(SP_LAUNCH)
- else if(!use_beacon)// find a suitable supplypod landing zone in cargobay
- var/list/empty_turfs = list()
- if(!landingzone)
- reconnect()
- if(!landingzone)
- WARNING("[src] couldnt find a Ship/Cargo (aka cargobay) area on a ship, and as such it has set the supplypod landingzone to the area it resides in.")
- landingzone = get_area(src)
- for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone
- if(T.is_blocked_turf())
- continue
- empty_turfs += T
- CHECK_TICK
- landing_turf = pick(empty_turfs)
-
- // note that, because of CHECK_TICK above, we aren't sure if we can
- // afford the pack, even though we checked earlier. luckily adjust_money
- // returns false if the account can't afford the price
- if(landing_turf && charge_account.adjust_money(-pack.cost))
- var/name = "*None Provided*"
- var/rank = "*None Provided*"
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- name = H.get_authentification_name()
- rank = H.get_assignment(hand_first = TRUE)
- else if(issilicon(usr))
- name = usr.real_name
- rank = "Silicon"
- var/datum/supply_order/SO = new(pack, name, rank, usr.ckey, "")
- new /obj/effect/pod_landingzone(landing_turf, podType, SO)
- update_appearance() // ??????????????????
- return TRUE
-
- if("mission-act")
- var/datum/mission/mission = locate(params["ref"])
- var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
- var/datum/overmap/ship/controlled/ship = D.current_ship
- var/datum/overmap/outpost/outpost = ship.docked_to
- if(!istype(outpost) || mission.source_outpost != outpost) // important to check these to prevent href fuckery
+ var/id = text2path(params["id"])
+ var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
+ if(!istype(pack))
return
- if(!mission.accepted)
- if(LAZYLEN(ship.missions) >= ship.max_missions)
+ if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly)
+ return
+
+ var/name = "*None Provided*"
+ var/rank = "*None Provided*"
+ var/ckey = usr.ckey
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ name = H.get_authentification_name()
+ rank = H.get_assignment(hand_first = TRUE)
+ else if(issilicon(usr))
+ name = usr.real_name
+ rank = "Silicon"
+
+ var/datum/bank_account/account
+ if(self_paid && ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/card/id/id_card = H.get_idcard(TRUE)
+ if(!istype(id_card))
+ say("No ID card detected.")
+ return
+ account = id_card.registered_account
+ if(!istype(account))
+ say("Invalid bank account.")
return
- mission.accept(ship, loc)
- return TRUE
- else if(mission.servant == ship)
- if(mission.can_complete())
- mission.turn_in()
- else
- mission.give_up()
- return TRUE
-/obj/machinery/computer/cargo/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
- . = ..()
- reconnect(port)
+ var/reason = ""
+ if(requestonly && !self_paid)
+ reason = stripped_input("Reason:", name, "")
+ if(isnull(reason) || ..())
+ return
-/obj/machinery/computer/cargo/proc/reconnect(obj/docking_port/mobile/port)
- if(!port)
- var/area/ship/current_area = get_area(src)
- if(!istype(current_area))
- return
- port = current_area.mobile_port
- if(!port)
- return
- charge_account = port.current_ship.ship_account
- landingzone = locate(/area/ship/cargo) in port.shuttle_areas
+ var/turf/T = get_turf(src)
+ var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
+ SO.generateRequisition(T)
+ if(requestonly && !self_paid)
+ SSshuttle.requestlist += SO
+ else
+ SSshuttle.shoppinglist += SO
+ if(self_paid)
+ say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.")
+ if(requestonly && message_cooldown < world.time)
+ radio.talk_into(src, "A new order has been requested.", RADIO_CHANNEL_COMMAND)
+ message_cooldown = world.time + 30 SECONDS
+ . = TRUE
+ if("remove")
+ var/id = text2num(params["id"])
+ for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
+ if(SO.id == id)
+ SSshuttle.shoppinglist -= SO
+ . = TRUE
+ break
+ if("clear")
+ SSshuttle.shoppinglist.Cut()
+ . = TRUE
+ if("approve")
+ var/id = text2num(params["id"])
+ for(var/datum/supply_order/SO in SSshuttle.requestlist)
+ if(SO.id == id)
+ SSshuttle.requestlist -= SO
+ SSshuttle.shoppinglist += SO
+ . = TRUE
+ break
+ if("deny")
+ var/id = text2num(params["id"])
+ for(var/datum/supply_order/SO in SSshuttle.requestlist)
+ if(SO.id == id)
+ SSshuttle.requestlist -= SO
+ . = TRUE
+ break
+ if("denyall")
+ SSshuttle.requestlist.Cut()
+ . = TRUE
+ if("toggleprivate")
+ self_paid = !self_paid
+ . = TRUE
+ if(.)
+ post_signal("supply")
-/obj/machinery/computer/cargo/attackby(obj/item/W, mob/living/user, params)
- var/value = W.get_item_credit_value()
- if(value && charge_account)
- charge_account.adjust_money(value)
- to_chat(user, "You deposit [W]. The Vessel Budget is now [charge_account.account_balance] cr.")
- qdel(W)
- return TRUE
- else if(istype(W, /obj/item/supplypod_beacon))
- var/obj/item/supplypod_beacon/sb = W
- if (sb.cargo_console != src)
- sb.link_console(src, user)
- return TRUE
- else
- to_chat(user, "[src] is already linked to [sb].")
- ..()
+/obj/machinery/computer/cargo/proc/post_signal(command)
-/obj/machinery/computer/cargo/proc/generate_pack_data()
- supply_pack_data = list()
- for(var/pack in SSshuttle.supply_packs)
- var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
- if(!supply_pack_data[P.group])
- supply_pack_data[P.group] = list(
- "name" = P.group,
- "packs" = list()
- )
- if((P.hidden))
- continue
- supply_pack_data[P.group]["packs"] += list(list(
- "name" = P.name,
- "cost" = P.cost,
- "id" = pack,
- "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
- ))
+ var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
-/obj/machinery/computer/cargo/retro
- icon = 'icons/obj/machines/retro_computer.dmi'
- icon_state = "computer-retro"
- deconpath = /obj/structure/frame/computer/retro
+ if(!frequency)
+ return
-/obj/machinery/computer/cargo/solgov
- icon = 'icons/obj/machines/retro_computer.dmi'
- icon_state = "computer-solgov"
- deconpath = /obj/structure/frame/computer/solgov
+ var/datum/signal/status_signal = new(list("command" = command))
+ frequency.post_signal(src, status_signal)
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
new file mode 100644
index 000000000000..81409d63d031
--- /dev/null
+++ b/code/modules/cargo/expressconsole.dm
@@ -0,0 +1,262 @@
+#define BEACON_COST 500
+#define SP_LINKED 1
+#define SP_READY 2
+#define SP_LAUNCH 3
+#define SP_UNLINK 4
+#define SP_UNREADY 5
+
+/obj/machinery/computer/cargo/express
+ name = "outpost communications console"
+ desc = "This console allows the user to communicate with a nearby outpost to \
+ purchase supplies and manage missions. Purchases are delivered near-instantly."
+ icon_screen = "supply_express"
+ circuit = /obj/item/circuitboard/computer/cargo/express
+ var/blockade_warning = "Bluespace instability detected. Delivery impossible."
+
+ var/message
+ /// Number of beacons printed. Used to determine beacon names.
+ var/printed_beacons = 0
+ var/list/meme_pack_data
+ /// The currently linked supplypod beacon
+ var/obj/item/supplypod_beacon/beacon
+ /// Area instance that cargo pods are sent to
+ var/area/landingzone
+ /// The pod type used to deliver orders
+ var/podType = /obj/structure/closet/supplypod/centcompod
+ /// Cooldown to prevent printing supplypod beacon spam
+ var/cooldown = 0
+ /// Is the console in beacon mode? exists to let beacon know when a pod may come in
+ var/use_beacon = FALSE
+ /// The account to charge purchases to, defaults to the cargo budget
+ var/datum/bank_account/charge_account
+
+/obj/machinery/computer/cargo/express/retro
+ icon = 'icons/obj/machines/retro_computer.dmi'
+ icon_state = "computer-retro"
+ deconpath = /obj/structure/frame/computer/retro
+
+/obj/machinery/computer/cargo/express/solgov
+ icon = 'icons/obj/machines/retro_computer.dmi'
+ icon_state = "computer-solgov"
+ deconpath = /obj/structure/frame/computer/solgov
+
+/obj/machinery/computer/cargo/express/Initialize()
+ . = ..()
+ packin_up()
+
+/obj/machinery/computer/cargo/express/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
+ . = ..()
+ reconnect(port)
+
+/obj/machinery/computer/cargo/express/proc/reconnect(obj/docking_port/mobile/port)
+ if(!port)
+ var/area/ship/current_area = get_area(src)
+ if(!istype(current_area))
+ return
+ port = current_area.mobile_port
+ if(!port)
+ return
+ charge_account = port.current_ship.ship_account
+ landingzone = locate(/area/ship/cargo) in port.shuttle_areas
+
+/obj/machinery/computer/cargo/express/Destroy()
+ if(beacon)
+ beacon.unlink_console()
+ return ..()
+
+/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params)
+ var/value = W.get_item_credit_value()
+ if(value && charge_account)
+ charge_account.adjust_money(value)
+ to_chat(user, "You deposit [W]. The Vessel Budget is now [charge_account.account_balance] cr.")
+ qdel(W)
+ return TRUE
+ else if(istype(W, /obj/item/supplypod_beacon))
+ var/obj/item/supplypod_beacon/sb = W
+ if (sb.express_console != src)
+ sb.link_console(src, user)
+ return TRUE
+ else
+ to_chat(user, "[src] is already linked to [sb].")
+ ..()
+
+/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
+ meme_pack_data = list() // sorry for what?
+ for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs
+ var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all
+ if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice
+ meme_pack_data[P.group] = list( // it gets cheaper when I return it
+ "name" = P.group, // mmhm
+ "packs" = list() // sometimes, I return it so much, I rip the manifest
+ ) // see, my quartermaster taught me a few things too
+ if((P.hidden)) // like, how not to rip the manifest
+ continue// by using someone else's crate
+ meme_pack_data[P.group]["packs"] += list(list(
+ "name" = P.name,
+ "cost" = P.cost,
+ "id" = pack,
+ "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
+ ))
+
+/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "OutpostCommunications", name)
+ ui.open()
+ if(!charge_account)
+ reconnect()
+
+/obj/machinery/computer/cargo/express/ui_data(mob/user)
+ var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
+ var/list/data = list()
+
+ // not a big fan of get_containing_shuttle
+ var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
+ var/datum/overmap/ship/controlled/ship
+ var/outpost_docked = FALSE
+ if(D)
+ ship = D.current_ship
+ outpost_docked = istype(ship.docked_to, /datum/overmap/outpost)
+
+ data["onShip"] = !isnull(ship)
+ data["numMissions"] = ship ? LAZYLEN(ship.missions) : 0
+ data["maxMissions"] = ship ? ship.max_missions : 0
+ data["outpostDocked"] = outpost_docked
+ data["points"] = charge_account ? charge_account.account_balance : 0
+ data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user)
+ data["beaconZone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
+ data["usingBeacon"] = use_beacon //is the mode set to deliver to the beacon or the cargobay?
+ data["canBeacon"] = !use_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
+ data["canBuyBeacon"] = charge_account ? (cooldown <= 0 && charge_account.account_balance >= BEACON_COST) : FALSE
+ data["beaconError"] = use_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
+ data["hasBeacon"] = beacon != null//is there a linked beacon?
+ data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
+ data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
+ data["supplies"] = list()
+ message = "Sales are near-instantaneous - please choose carefully."
+ if(SSshuttle.supplyBlocked)
+ message = blockade_warning
+ if(use_beacon && !beacon)
+ message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed
+ else if (use_beacon && !canBeacon)
+ message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf
+ data["message"] = message
+ if(!meme_pack_data)
+ packin_up()
+ stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]")
+ data["supplies"] = meme_pack_data
+ if (cooldown > 0)//cooldown used for printing beacons
+ cooldown--
+
+ data["shipMissions"] = list()
+ data["outpostMissions"] = list()
+
+ if(ship)
+ for(var/datum/mission/M as anything in ship.missions)
+ data["shipMissions"] += list(M.get_tgui_info())
+ if(outpost_docked)
+ var/datum/overmap/outpost/out = ship.docked_to
+ for(var/datum/mission/M as anything in out.missions)
+ data["outpostMissions"] += list(M.get_tgui_info())
+
+ return data
+
+/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("withdrawCash")
+ var/val = text2num(params["value"])
+ // no giving yourself money
+ if(!charge_account || !val || val <= 0)
+ return
+ if(charge_account.adjust_money(-val))
+ var/obj/item/holochip/cash_chip = new /obj/item/holochip(drop_location(), val)
+ if(ishuman(usr))
+ var/mob/living/carbon/human/user = usr
+ user.put_in_hands(cash_chip)
+ playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE)
+ src.visible_message("[src] dispenses a holochip.")
+ return TRUE
+
+ if("LZCargo")
+ use_beacon = FALSE
+ if (beacon)
+ beacon.update_status(SP_UNREADY) //ready light on beacon will turn off
+ if("LZBeacon")
+ use_beacon = TRUE
+ if (beacon)
+ beacon.update_status(SP_READY) //turns on the beacon's ready light
+ if("printBeacon")
+ if(charge_account?.adjust_money(-BEACON_COST))
+ cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
+ var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
+ C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
+ printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
+ beacon.name = "Supply Pod Beacon #[printed_beacons]"
+
+ if("add")
+ var/area/ship/current_area = get_area(src)
+ var/datum/supply_pack/pack = SSshuttle.supply_packs[text2path(params["id"])]
+ if( \
+ !pack || !charge_account?.has_money(pack.cost) || !istype(current_area) || \
+ !istype(current_area.mobile_port.current_ship.docked_to, /datum/overmap/outpost) \
+ )
+ return
+
+ var/turf/landing_turf
+ if(!isnull(beacon) && use_beacon) // prioritize beacons over landing in cargobay
+ landing_turf = get_turf(beacon)
+ beacon.update_status(SP_LAUNCH)
+ else if(!use_beacon)// find a suitable supplypod landing zone in cargobay
+ var/list/empty_turfs = list()
+ if(!landingzone)
+ reconnect()
+ if(!landingzone)
+ WARNING("[src] couldnt find a Ship/Cargo (aka cargobay) area on a ship, and as such it has set the supplypod landingzone to the area it resides in.")
+ landingzone = get_area(src)
+ for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone
+ if(T.is_blocked_turf())
+ continue
+ empty_turfs += T
+ CHECK_TICK
+ landing_turf = pick(empty_turfs)
+
+ // note that, because of CHECK_TICK above, we aren't sure if we can
+ // afford the pack, even though we checked earlier. luckily adjust_money
+ // returns false if the account can't afford the price
+ if(landing_turf && charge_account.adjust_money(-pack.cost))
+ var/name = "*None Provided*"
+ var/rank = "*None Provided*"
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ name = H.get_authentification_name()
+ rank = H.get_assignment(hand_first = TRUE)
+ else if(issilicon(usr))
+ name = usr.real_name
+ rank = "Silicon"
+ var/datum/supply_order/SO = new(pack, name, rank, usr.ckey, "")
+ new /obj/effect/pod_landingzone(landing_turf, podType, SO)
+ update_appearance() // ??????????????????
+ return TRUE
+
+ if("mission-act")
+ var/datum/mission/mission = locate(params["ref"])
+ var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
+ var/datum/overmap/ship/controlled/ship = D.current_ship
+ var/datum/overmap/outpost/outpost = ship.docked_to
+ if(!istype(outpost) || mission.source_outpost != outpost) // important to check these to prevent href fuckery
+ return
+ if(!mission.accepted)
+ if(LAZYLEN(ship.missions) >= ship.max_missions)
+ return
+ mission.accept(ship, loc)
+ return TRUE
+ else if(mission.servant == ship)
+ if(mission.can_complete())
+ mission.turn_in()
+ else
+ mission.give_up()
+ return TRUE
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index 82f2ab354665..ab521998f07c 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -9,7 +9,7 @@
/datum/supply_pack/ammo/co9mm_mag
name = "9mm Commander Magazine Crate"
desc = "Contains a 9mm magazine for the standard-issue Commander pistol, containing ten rounds."
- contains = list(/obj/item/ammo_box/magazine/co9mm)
+ contains = list(/obj/item/ammo_box/magazine/co9mm,)
cost = 500
/datum/supply_pack/ammo/m45_mag
@@ -18,17 +18,17 @@
contains = list(/obj/item/ammo_box/magazine/m45)
cost = 500
-/datum/supply_pack/ammo/a44roum_speedloader
- name = ".44 Roumain Speedloader Crate"
- desc = "Contains a .44 Roumain speedloader for the HP Montagne, containing six rounds."
- contains = list(/obj/item/ammo_box/a44roum_speedloader)
+/datum/supply_pack/ammo/m45_speedloader
+ name = ".45 ACP Speedloader Crate"
+ desc = "Contains a .45 ACP speedloader for the HP Montagne, containing six rounds."
+ contains = list(/obj/item/ammo_box/c45_speedloader)
cost = 400
/datum/supply_pack/ammo/c38_mag
name = ".38 Speedloader Crate"
desc = "Contains a .38 speedloader for revolvers, containing six rounds."
contains = list(/obj/item/ammo_box/c38)
- cost = 250
+ cost = 350
/datum/supply_pack/ammo/m10mm_mag
name = "10mm Stechkin Magazine Crate"
@@ -70,18 +70,12 @@
cost = 500
contains = list(/obj/item/ammo_box/a12g/slug)
-/datum/supply_pack/ammo/techshells
- name = "Unloaded Shotgun Technological Shells Crate"
- desc = "Contains a box of 7 versatile tech shells, capable of producing a variety of deadly effects for any situation. Some assembly required."
- cost = 210
- contains = list(/obj/item/storage/box/techshot)
-
/*
.38 ammo
*/
/datum/supply_pack/ammo/winchester_ammo
- name = ".38 Ammo Boxes Crate"
+ name = "Flaming Arrow and Detective Special .38 Ammo Boxes"
desc = "Contains two 50 round ammo boxes for refilling .38 weapons."
cost = 250
contains = list(/obj/item/ammo_box/c38_box,
@@ -213,7 +207,7 @@
name = "9mm Ammo Box Crate"
desc = "Contains a fifty-round 9mm box for pistols and SMGs such as the Commander or Saber."
contains = list(/obj/item/ammo_box/c9mm)
- cost = 200
+ cost = 250
/datum/supply_pack/ammo/a308_ammo_box
name = "308 Ammo Box Crate"
@@ -225,7 +219,7 @@
name = "9mm AP Ammo Box Crate"
desc = "Contains a fifty-round 9mm box loaded with armor piercing ammo."
contains = list(/obj/item/ammo_box/c9mm/ap)
- cost = 400
+ cost = 500
/datum/supply_pack/ammo/a357match_ammo_box
name = ".357 Match Ammo Box Crate"
@@ -255,7 +249,7 @@
name = "9mm HP Ammo Box Crate"
desc = "Contains a fifty-round 9mm box loaded with hollow point ammo, great against unarmored targets."
contains = list(/obj/item/ammo_box/c9mm/hp)
- cost = 400
+ cost = 500
/datum/supply_pack/ammo/a357hp_ammo_box
name = ".357 HP Ammo Box Crate"
@@ -284,7 +278,7 @@
name = "9mm Rubber Ammo Box Crate"
desc = "Contains a fifty-round 9mm box loaded with less-than-lethal rubber rounds."
contains = list(/obj/item/ammo_box/c9mm/rubbershot)
- cost = 200
+ cost = 250
/datum/supply_pack/ammo/c10mmrubber_ammo_box
name = "10mm Rubber Ammo Box Crate"
@@ -370,21 +364,3 @@
desc = "Contains a fifty-round box for high-powered gauss guns such as the GAR assault rifle."
contains = list(/obj/item/ammo_box/ferrolancebox)
cost = 250
-
-/datum/supply_pack/ammo/a44roum
- name = ".44 Roumain Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne."
- contains = list(/obj/item/ammo_box/a44roum)
- cost = 250
-
-/datum/supply_pack/ammo/a44roum_rubber
- name = ".44 Roumain Rubber Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/a44roum/rubber)
- cost = 250
-
-/datum/supply_pack/ammo/a44roum_hp
- name = ".44 Roumain Hollow Point Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/a44roum/hp)
- cost = 500
diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm
index fa63529b7955..5bce9871719a 100644
--- a/code/modules/cargo/packs/costumes_toys.dm
+++ b/code/modules/cargo/packs/costumes_toys.dm
@@ -115,7 +115,7 @@
if(prob(30)) //Not all mafioso have mustaches, some people also find this item annoying.
new /obj/item/clothing/mask/fakemoustache/italian(C)
if(prob(10)) //A little extra sugar every now and then to shake things up.
- new /obj/item/kitchen/knife/switchblade(C)
+ new /obj/item/switchblade(C)
/datum/supply_pack/costumes_toys/mech_suits
name = "Mech Pilot's Suit Crate"
diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm
index 9c366406af5c..bf16fb592e21 100644
--- a/code/modules/cargo/packs/food.dm
+++ b/code/modules/cargo/packs/food.dm
@@ -25,7 +25,7 @@
/datum/supply_pack/food/pizza
name = "Pizza Crate"
desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99.5% anomaly-free!"
- cost = 3000// Best prices this side of the galaxy.
+ cost = 6000 // Best prices this side of the galaxy.
contains = list(/obj/item/pizzabox/margherita,
/obj/item/pizzabox/mushroom,
/obj/item/pizzabox/meat,
@@ -163,10 +163,10 @@
name = "Bread Crate"
desc = "A crate full of various breads. Bready to either be eaten or made into delicious meals."
cost = 1000
- contains = list(/obj/item/food/bread/plain,
- /obj/item/food/breadslice/plain,
- /obj/item/food/breadslice/plain,
- /obj/item/food/breadslice/plain, //Weighted to be more common
+ contains = list(/obj/item/reagent_containers/food/snacks/store/bread/plain,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain, //Weighted to be more common
/obj/item/reagent_containers/food/snacks/bun,
/obj/item/reagent_containers/food/snacks/tortilla,
/obj/item/reagent_containers/food/snacks/pizzabread
@@ -184,7 +184,7 @@
cost = 5000
contains = list(/obj/item/stack/sheet/mineral/coal/five,
/obj/machinery/grill/unwrenched,
- /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy)
+ /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy)
crate_name = "grilling starter kit crate"
crate_type = /obj/structure/closet/crate/large
diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm
index 8a9bd51ccbc5..3424b48b941a 100644
--- a/code/modules/cargo/packs/gun.dm
+++ b/code/modules/cargo/packs/gun.dm
@@ -9,52 +9,52 @@
/datum/supply_pack/gun/disposable
name = "Disposable Gun Crate"
desc = "In some sectors, these disposable pistols are the only firearms that can be legally sold for less than 200cr. That price is still far too high."
- cost = 300
- contains = list(/obj/item/storage/pistolcase/disposable)
+ cost = 150
+ contains = list(/obj/item/gun/ballistic/automatic/pistol/disposable)
crate_name = "disposable gun crate"
/datum/supply_pack/gun/derringer
name = ".38 Derringer Crate"
desc = "A cheap, concealable pistol manufactured by the reputable Hunter's Pride. At least it's better than a disposable pistol. Chambered in .38 rounds."
cost = 350
- contains = list(/obj/item/storage/pistolcase/derringer)
+ contains = list(/obj/item/gun/ballistic/derringer)
crate_name = "derringer crate"
/datum/supply_pack/gun/commanders
name = "Commander Pistol Crate"
desc = "Contains a modified Candor 'Commander' pistol, produced by Nanotrasen and chambered in 9mm."
cost = 750
- contains = list(/obj/item/storage/pistolcase/commander)
+ contains = list(/obj/item/gun/ballistic/automatic/pistol/commander)
/datum/supply_pack/gun/makarovs
name = "Stechkin Pistol Crate"
desc = "Contains a concealable stechkin pistol, produced by Scarborough Arms and chambered in 10mm."
cost = 1000
- contains = list(/obj/item/storage/pistolcase/stechkin)
+ contains = list(/obj/item/gun/ballistic/automatic/pistol)
/datum/supply_pack/gun/candors
name = "Candor Pistol Crate"
desc = "Contains a Candor pistol, the trusty sidearm of any spacer, produced by Hunter's Pride and chambered in .45 ACP."
cost = 1000
- contains = list(/obj/item/storage/pistolcase/candor)
+ contains = list(/obj/item/gun/ballistic/automatic/pistol/candor)
/datum/supply_pack/gun/pepperbox
name = "HP Firebrand Pepperbox Revolver Crate"
desc = "Contains a concealable pepperbox revolver manufactured by the Saint Roumain Militia, chambered in .357."
cost = 1250
- contains = list(/obj/item/storage/pistolcase/firebrand)
+ contains = list(/obj/item/gun/ballistic/revolver/firebrand)
/datum/supply_pack/gun/detrevolver
name = "Hunter's Pride Detective Revolver Crate"
desc = "Contains a concealable revolver favored by police departments around the sector, chambered in .38."
cost = 600
- contains = list(/obj/item/storage/pistolcase/detective)
+ contains = list(/obj/item/gun/ballistic/revolver/detective)
/datum/supply_pack/gun/shadowrevolver
name = "Shadow Revolver Crate"
- desc = "Contains a concealable Shadow revolver, chambered in .44 Roumain."
+ desc = "Contains a concealable Shadow revolver, chambered in .45 ACP."
cost = 1000
- contains = list(/obj/item/storage/pistolcase/shadow)
+ contains = list(/obj/item/gun/ballistic/revolver/shadow)
/*
@@ -65,21 +65,21 @@
name = "Laser Gun Crate"
desc = "Contains a lethal, high-energy laser gun."
cost = 1000
- contains = list(/obj/item/storage/pistolcase/laser)
+ contains = list(/obj/item/gun/energy/laser)
crate_name = "laser crate"
/datum/supply_pack/gun/mini_energy
name = "Mini Energy Gun Crate"
desc = "Contains a small, versatile energy gun, capable of firing both nonlethal and lethal blasts, but with a limited power cell."
cost = 500
- contains = list(/obj/item/storage/pistolcase/miniegun)
+ contains = list(/obj/item/gun/energy/e_gun/mini)
crate_name = "laser crate"
/datum/supply_pack/gun/energy
name = "Energy Gun Crate"
desc = "Contains a versatile energy gun, capable of firing both nonlethal and lethal blasts of light."
cost = 1250
- contains = list(/obj/item/storage/pistolcase/egun)
+ contains = list(/obj/item/gun/energy/e_gun)
crate_name = "energy gun crate"
crate_type = /obj/structure/closet/crate/secure/plasma
@@ -87,7 +87,7 @@
name = "Ion Rifle Crate"
desc = "Contains a single Mk.I Ion Projector, a special anti-tank rifle designed to disable electronic threats at range."
cost = 10000
- contains = list(/obj/item/storage/pistolcase/iongun)
+ contains = list(/obj/item/gun/energy/ionrifle)
crate_name = "ion rifle crate"
crate_type = /obj/structure/closet/crate/secure/plasma
@@ -95,14 +95,14 @@
name = "Etherbor SG-8 Beam Pistol Crate"
desc = "Contains a single SG-8 Beam Pistol, a civilian-grade sidearm developed in the PGF, manufactured by Etherbor Industries."
cost = 1000
- contains = list(/obj/item/storage/pistolcase/kalixpistol)
+ contains = list(/obj/item/gun/energy/kalix/pistol)
crate_name = "beam pistol crate"
/datum/supply_pack/gun/laser/kalix
name = "Etherbor BG-12 Beam Rifle Crate"
desc = "Contains a single BG-12 Beam Rifle, a civilian-grade semi-automatic developed in the PGF, manufactured by Etherbor Industries."
cost = 3000
- contains = list(/obj/item/storage/guncase/kalixrifle)
+ contains = list(/obj/item/gun/energy/kalix)
crate_name = "beam rifle crate"
/*
@@ -113,21 +113,21 @@
name = "Double Barrel Shotgun Crate"
desc = "For when you need to deal with 2 drunkards the old-fashioned way. Contains a double-barreled shotgun, favored by Bartenders. Warranty voided if sawed off."
cost = 1000
- contains = list(/obj/item/storage/guncase/doublebarrel)
+ contains = list(/obj/item/gun/ballistic/shotgun/doublebarrel)
crate_name = "shotguns crate"
/datum/supply_pack/gun/hellfire_shotgun
name = "Hellfire Shotgun Crate"
desc = "For when you need to deal with 8 hooligans. Contains a pump shotgun, with a 8-round capacity."
cost = 2000
- contains = list(/obj/item/storage/guncase/hellfire)
+ contains = list(/obj/item/gun/ballistic/shotgun/hellfire)
crate_name = "shotgun crate"
/datum/supply_pack/gun/brimstone_shotgun
name = "Brimstone Shotgun Crate"
desc = "For when you need to deal with 5 hooligans, and QUICKLY. Contains a slamfire shotgun, with a 5-round capacity. Warranty voided if sawed off."
cost = 2000
- contains = list(/obj/item/storage/guncase/brimstone)
+ contains = list(/obj/item/gun/ballistic/shotgun/brimstone)
crate_name = "shotgun crate"
/*
@@ -138,82 +138,54 @@
name = "Flaming Arrow Lever Action Rifle Crate"
desc = "Contains an antiquated lever action rifle intended for hunting wildlife. Chambered in .38 rounds."
cost = 750
- contains = list(/obj/item/storage/guncase/winchester)
+ contains = list(/obj/item/gun/ballistic/shotgun/flamingarrow)
crate_name = "rifle crate"
/datum/supply_pack/gun/illestren
name = "Illestren Rifle Crate"
desc = "Contains an expertly made bolt action rifle intended for hunting wildlife. Chambered in 8x50mmR rounds."
cost = 1250
- contains = list(/obj/item/storage/guncase/illestren)
+ contains = list(/obj/item/gun/ballistic/rifle/illestren)
crate_name = "rifle crate"
/datum/supply_pack/gun/beacon
- name = "Beacon Break Action Rifle Crate"
+ name = "Contender Break Action Rifle Crate"
desc = "Contains a single shot break action rifle to hunt wildlife that annoys you in particular. Chambered in devastating .45-70 rounds. Warranty voided if sawed off."
cost = 2250
- contains = list(/obj/item/storage/guncase/beacon)
+ contains = list(/obj/item/gun/ballistic/shotgun/doublebarrel/beacon)
crate_name = "rifle crate"
/datum/supply_pack/gun/scout
name = "Scout Sniper Rifle Crate"
desc = "Contains a traditional scoped rifle to hunt wildlife and big game from a respectful distance. Chambered in powerful .300 Magnum."
cost = 5500
- contains = list(/obj/item/storage/guncase/scout)
+ contains = list(/obj/item/gun/ballistic/rifle/scout)
crate_name = "rifle crate"
/datum/supply_pack/gun/cobra20
name = "Cobra-20 SMG Crate"
desc = "Contains a .45 submachine gun, manufactured by Scaraborough Arms and chambered in .45"
cost = 3000
- contains = list(/obj/item/storage/guncase/cobra)
+ contains = list(/obj/item/gun/ballistic/automatic/smg/c20r/cobra)
crate_name = "SMG crate"
/datum/supply_pack/gun/wt550
name = "WT-550 Auto Rifle Crate"
desc = "Contains a high-powered, automatic personal defense weapon chambered in 4.6x30mm."
cost = 4000
- contains = list(/obj/item/storage/guncase/wt550)
+ contains = list(/obj/item/gun/ballistic/automatic/smg/wt550)
crate_name = "auto rifle crate"
/datum/supply_pack/gun/p16
name = "P16 Assault Rifle Crate"
desc = "Contains a high-powered, automatic rifle chambered in 5.56mm."
cost = 5000
- contains = list(/obj/item/storage/guncase/p16)
+ contains = list(/obj/item/gun/ballistic/automatic/assault/p16)
crate_name = "auto rifle crate"
/datum/supply_pack/gun/skm
name = "SKM-24 Rifle Crate"
desc = "Contains a high-powered, automatic rifle chambered in 7.62x40mm CLIP."
cost = 5000
- contains = list(/obj/item/storage/guncase/skm)
+ contains = list(/obj/item/gun/ballistic/automatic/assault/skm)
crate_name = "auto rifle crate"
-
-/datum/supply_pack/gun/attachment/rail_light
- name = "Tactical Rail Light Crate"
- desc = "Contains a single rail light to be mounted on a firearm."
- cost = 250
- contains = list(/obj/item/attachment/rail_light)
- crate_name = "rail light crate"
-
-/datum/supply_pack/gun/attachment/laser_sight
- name = "Laser Sight Crate"
- desc = "Contains a single rail light to be mounted on a firearm."
- cost = 250
- contains = list(/obj/item/attachment/laser_sight)
- crate_name = "laser sight crate"
-
-/datum/supply_pack/gun/attachment/bayonet
- name = "Bayonet Crate"
- desc = "Contains a single bayonet to be mounted on a firearm."
- cost = 250
- contains = list(/obj/item/attachment/bayonet)
- crate_name = "bayonet crate"
-
-/datum/supply_pack/gun/attachment/silencer
- name = "Suppressor Crate"
- desc = "Contains a single suppressor to be mounted on a firearm."
- cost = 250
- contains = list(/obj/item/attachment/silencer)
- crate_name = "silencer crate"
diff --git a/code/modules/cargo/packs/machinery.dm b/code/modules/cargo/packs/machinery.dm
index f25e4818329e..56ed7130738b 100644
--- a/code/modules/cargo/packs/machinery.dm
+++ b/code/modules/cargo/packs/machinery.dm
@@ -210,15 +210,6 @@
crate_name = "plasma thruster crate"
crate_type = /obj/structure/closet/crate/engineering
-/datum/supply_pack/machinery/combustion_thruster
- name = "Combustion Thruster Crate"
- desc = "A crate containing a combustion thruster and its heater's electronics. For when you need complicated thrust."
- cost = 2000
- contains = list(/obj/item/circuitboard/machine/shuttle/fire_heater,
- /obj/item/circuitboard/machine/shuttle/engine/fire)
- crate_name = "combustion thruster crate"
- crate_type = /obj/structure/closet/crate/engineering
-
/datum/supply_pack/machinery/drill_crate
name = "Heavy duty laser mining drill"
desc = "An experimental laser-based mining drill that Nanotrasen is kindly allowing YOU, the customer, to opt into testing of."
diff --git a/code/modules/cargo/packs/mechs.dm b/code/modules/cargo/packs/mechs.dm
index 937126a86361..376c22fc0db8 100644
--- a/code/modules/cargo/packs/mechs.dm
+++ b/code/modules/cargo/packs/mechs.dm
@@ -109,14 +109,6 @@ Mech Equipment
/obj/item/mecha_parts/mecha_equipment/drill
)
-/datum/supply_pack/mech/equipment/diamond_drill
- name = "Mech diamond drill kit"
- desc = "Contains mechanized diamond drill, for the enterprising prospector!"
- cost = 750
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill
- )
-
/datum/supply_pack/mech/equipment/scanner
name = "Mech scanner kit"
desc = "An electronic mining scanner, graded to interface with a mech."
@@ -133,22 +125,6 @@ Mech Equipment
/obj/item/mecha_parts/mecha_equipment/generator
)
-/datum/supply_pack/mech/equipment/nuclear_gen
- name = "Mech nuclear generator kit"
- desc = "Contains a uranium-fueled generator for a mech, ideal for polluting the environment."
- cost = 1250
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/generator/nuclear
- )
-
-/datum/supply_pack/mech/equipment/tesla_energy_relay
- name = "Mech tesla relay kit"
- desc = "Contains an advanced exosuit module which draws power from nearby APCs."
- cost = 1750
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
- )
-
/datum/supply_pack/mech/equipment/clamp
name = "Mech clamp kit"
desc = "Contains a clamp designed for mechanized freight hauling."
@@ -157,37 +133,6 @@ Mech Equipment
/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp
)
-/datum/supply_pack/mech/equipment/extinguisher
- name = "Mech extinguisher kit"
- desc = "Contains a heavy duty fire extinguisher, for heavy duty firefighting."
- cost = 250
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/extinguisher
- )
-
-/datum/supply_pack/mech/equipment/cable_layer
- name = "Mech RCL Kit"
- desc = "Contains a \"rapid cable layer\" for laying down long lengths of wire."
- cost = 250
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/cable_layer
- )
-
-/datum/supply_pack/mech/equipment/mech_sleeper
- name = "Mech Mounted Sleeper Kit"
- desc = "Contains a mounted sleeper device, used for retrieving and stabilizing patients."
- cost = 1000
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/medical/sleeper
- )
-
-/datum/supply_pack/mech/equipment/beam_gun
- name = "Mech Beam Gun Kit"
- desc = "Contains an advanced mounted medical beamgun, capable of alleviating wounds to targets."
- cost = 7000
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam
- )
/datum/supply_pack/mech/equipment/rcs
name = "Mech RCS kit"
desc = "A gas fueled RCS pack, ideal for mechanized space operation."
@@ -204,40 +149,19 @@ Mech Equipment
/obj/item/mecha_parts/mecha_equipment/conversion_kit/ripley
)
-/datum/supply_pack/mech/equipment/melee_armor_booster
- name = "Mech CCW armor kit"
- desc = "A \"close combat weaponry\" module designed to deflect melee attacks."
- cost = 750
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
- )
-
-/datum/supply_pack/mech/equipment/projectile_armor_booster
- name = "Mech projectile armor kit"
- desc = "A protective exosuit module designed to deflect ranged attacks."
- cost = 1000
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
- )
-
/*
weapons
*/
-/datum/supply_pack/mech/weapon
- name = "Mech weapons crate"
- crate_type = /obj/structure/closet/crate/secure/weapon
- crate_name = "mech weapon crate"
-
-/datum/supply_pack/mech/weapon/pka
+/datum/supply_pack/mech/equipment/pka
name = "Mech Mounted Proto-Kinetic Accelerator kit"
desc = "A ranged mining attachment for any mech."
- cost = 750
+ cost = 1500
contains = list(
/obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun
)
-/datum/supply_pack/mech/weapon/laser
+/datum/supply_pack/mech/equipment/laser
name = "Immolator kit"
desc = "A light laser cannon designed for combat usage."
cost = 1000
@@ -245,75 +169,10 @@ weapons
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
)
-/datum/supply_pack/mech/weapon/biglaser
+/datum/supply_pack/mech/equipment/biglaser
name = "Solaris kit"
desc = "A heavy laser cannon designed for combat usage."
cost = 2000
contains = list(
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
)
-
-/datum/supply_pack/mech/weapon/ion_cannon
- name = "MK4 ion cannon kit"
- desc = "Contains a heavy ion cannon for disabling technology in large blasts."
- cost = 3000
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
- )
-
-/datum/supply_pack/mech/weapon/scattershot
- name = "LBX AC 10 kit"
- desc = "Contains a \"Scattershot\" gun to mount on combat exosuits."
- cost = 1750
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
- )
-
-/datum/supply_pack/mech/weapon/lmg
- name = "Ultra AC 2 kit"
- desc = "Contains a mounted gun which fires in three round bursts."
- cost = 2250
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
- )
-
-/datum/supply_pack/mech/weapon/missile_rack
- name = "BRM-6 kit"
- desc = "Contains a low-explosive missile launcher, excellent for breaching through obstacles."
- cost = 3000
- contains = list(
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching
- )
-
-/*
-ammo
-*/
-
-/datum/supply_pack/mech/ammo
- name = "Mech ammo crate"
- crate_type = /obj/structure/closet/crate/secure/gear
- crate_name = "mech ammo crate"
-
-/datum/supply_pack/mech/ammo/scattershot_ammo
- name = "LBX AC 10 ammo box"
- desc = "Contains a fourty-round box of upscaled buckshot, to be loaded directly in a mounted LBX AC 10."
- cost = 500
- contains = list(
- /obj/item/mecha_ammo/scattershot
- )
-
-/datum/supply_pack/mech/ammo/lmg_ammo
- name = "Ultra AC 2 ammo box"
- desc = "Contains a three hundred-round box of heavy ammunition for the Ultra AC 2."
- cost = 750
- contains = list(
- /obj/item/mecha_ammo/lmg
- )
-
-/datum/supply_pack/mech/ammo/missile_rack_ammo
- name = "BRM-6 missile box"
- desc = "Contains a box of six breaching missiles designed to explode upon striking hard surfaces."
- cost = 1000
- contains = list(
- /obj/item/mecha_ammo/missiles_br
- )
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index 075c0cc40895..08b576937138 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -9,42 +9,42 @@
/datum/supply_pack/medical/firstaid_single
name = "First Aid Kit Single-Pack"
desc = "Contains one first aid kit for healing most types of wounds."
- cost = 400
+ cost = 750
small_item = TRUE
contains = list(/obj/item/storage/firstaid/regular)
/datum/supply_pack/medical/firstaidbruises_single
name = "Bruise Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on healing bruises and broken bones."
- cost = 700
+ cost = 1250
small_item = TRUE
contains = list(/obj/item/storage/firstaid/brute)
/datum/supply_pack/medical/firstaidburns_single
name = "Burn Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on healing severe burns."
- cost = 700
+ cost = 1250
small_item = TRUE
contains = list(/obj/item/storage/firstaid/fire)
/datum/supply_pack/medical/firstaidoxygen_single
name = "Oxygen Deprivation Kit Single-Pack"
desc = "Contains one first aid kit focused on helping oxygen deprivation victims."
- cost = 500
+ cost = 1250
small_item = TRUE
contains = list(/obj/item/storage/firstaid/o2)
/datum/supply_pack/medical/firstaidtoxins_single
name = "Toxin Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on healing damage dealt by heavy toxins."
- cost = 500
+ cost = 1250
small_item = TRUE
contains = list(/obj/item/storage/firstaid/toxin)
/datum/supply_pack/medical/firstaid_rad_single
name = "Radiation Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on reducing the damage done by radiation."
- cost = 500
+ cost = 1000
small_item = TRUE
contains = list(/obj/item/storage/firstaid/radiation)
diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm
index b9c41a29e11f..11fd10229e5e 100644
--- a/code/modules/cargo/supplypod_beacon.dm
+++ b/code/modules/cargo/supplypod_beacon.dm
@@ -7,7 +7,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
- var/obj/machinery/computer/cargo/cargo_console
+ var/obj/machinery/computer/cargo/express/express_console
var/linked = FALSE
var/ready = FALSE
var/launched = FALSE
@@ -49,39 +49,39 @@
/obj/item/supplypod_beacon/examine(user)
. = ..()
- if(!cargo_console)
+ if(!express_console)
. += "[src] is not currently linked to an Express Supply console."
else
. += "Alt-click to unlink it from the Express Supply console."
/obj/item/supplypod_beacon/Destroy()
- if(cargo_console)
- cargo_console.beacon = null
+ if(express_console)
+ express_console.beacon = null
return ..()
/obj/item/supplypod_beacon/proc/unlink_console()
- if(cargo_console)
- cargo_console.beacon = null
- cargo_console = null
+ if(express_console)
+ express_console.beacon = null
+ express_console = null
update_status(SP_UNLINK)
update_status(SP_UNREADY)
-/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/C, mob/living/user)
+/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user)
if (C.beacon)//if new console has a beacon, then...
C.beacon.unlink_console()//unlink the old beacon from new console
- if (cargo_console)//if this beacon has an express console
- cargo_console.beacon = null//remove the connection the expressconsole has from beacons
- cargo_console = C//set the linked console var to the console
- cargo_console.beacon = src//out with the old in with the news
+ if (express_console)//if this beacon has an express console
+ express_console.beacon = null//remove the connection the expressconsole has from beacons
+ express_console = C//set the linked console var to the console
+ express_console.beacon = src//out with the old in with the news
update_status(SP_LINKED)
- if (cargo_console.use_beacon)
+ if (express_console.use_beacon)
update_status(SP_READY)
to_chat(user, "[src] linked to [C].")
/obj/item/supplypod_beacon/AltClick(mob/user)
if (!user.canUseTopic(src, !issilicon(user)))
return
- if (cargo_console)
+ if (express_console)
unlink_console()
else
to_chat(user, "There is no linked console.")
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 87a33b0c989b..0fd922a2856a 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -107,9 +107,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
cmd_admin_pm(href_list["priv_msg"],null)
return
- if(href_list["commandbar_typing"])
- handle_commandbar_typing(href_list)
-
switch(href_list["_src_"])
if("holder")
hsrc = holder
@@ -229,8 +226,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
// Instantiate tgui panel
tgui_panel = new(src, "browseroutput")
- initialize_commandbar_spy()
-
GLOB.ahelp_tickets.client_login(src)
GLOB.interviews.client_login(src)
GLOB.requests.client_login(src)
diff --git a/code/modules/client/loadout/loadout_accessories.dm b/code/modules/client/loadout/loadout_accessories.dm
index c1e4d7a088a8..b81588c8e72e 100644
--- a/code/modules/client/loadout/loadout_accessories.dm
+++ b/code/modules/client/loadout/loadout_accessories.dm
@@ -50,16 +50,6 @@
display_name = "tie, recolorable"
path = /obj/item/clothing/neck/tie
-//Bone
-/datum/gear/accessory/fangnecklace
- display_name = "wolf fang necklace"
- path = /obj/item/clothing/neck/fangnecklace
-
-/datum/gear/accessory/bonearmlet
- display_name = "bone armlet"
- path = /obj/item/clothing/accessory/bonearmlet
- slot = null
-
//Misc
/datum/gear/accessory/waistcoat
@@ -72,6 +62,11 @@
path = /obj/item/clothing/neck/stethoscope
allowed_roles = list("Medical Doctor", "Chief Medical Officer")
+/datum/gear/accessory/collar
+ display_name = "pet collar"
+ description = "Only the truly insane would wear this around their neck."
+ path = /obj/item/clothing/neck/petcollar
+
/datum/gear/accessory/gloves/black
display_name = "black gloves"
description = "Standard hand coverings for everyday use."
@@ -92,3 +87,14 @@
description = "Excessively fancy elbow-length gloves."
path = /obj/item/clothing/gloves/color/evening
slot = ITEM_SLOT_GLOVES
+
+/datum/gear/accessory/tiki
+ display_name = "tiki mask"
+ description = "A wooden mask, simple, really."
+ path = /obj/item/clothing/mask/gas/tiki_mask
+ slot = ITEM_SLOT_MASK
+
+/datum/gear/accessory/joymask
+ display_name = "face with tears of joy mask"
+ path = /obj/item/clothing/mask/joy
+ slot = ITEM_SLOT_MASK
diff --git a/code/modules/client/loadout/loadout_general.dm b/code/modules/client/loadout/loadout_general.dm
index 8bb3ff3cb69d..4c081a67e92f 100644
--- a/code/modules/client/loadout/loadout_general.dm
+++ b/code/modules/client/loadout/loadout_general.dm
@@ -62,6 +62,10 @@
display_name = "toy, magic eight ball"
path = /obj/item/toy/eightball
+/datum/gear/wallet
+ display_name = "wallet"
+ path = /obj/item/storage/wallet
+
/datum/gear/pai
display_name = "personal AI device"
path = /obj/item/paicard
@@ -160,6 +164,14 @@
display_name = "tool, emergency crowbar"
path = /obj/item/crowbar/red
+/datum/gear/balloon
+ display_name = "toy, balloon"
+ path = /obj/item/toy/balloon
+
+/datum/gear/balloon/ian
+ display_name = "toy, ian balloon"
+ path = /obj/item/toy/balloon/corgi
+
/datum/gear/surgical_mask
display_name = "surgical mask"
path = /obj/item/clothing/mask/surgical
diff --git a/code/modules/client/loadout/loadout_hat.dm b/code/modules/client/loadout/loadout_hat.dm
index 23e34d7d19c3..d4ab1c858f26 100644
--- a/code/modules/client/loadout/loadout_hat.dm
+++ b/code/modules/client/loadout/loadout_hat.dm
@@ -92,6 +92,10 @@
display_name = "beanie"
path = /obj/item/clothing/head/beanie
+/datum/gear/hat/tinfoil
+ display_name = "tinfoil hat"
+ path = /obj/item/clothing/head/foilhat
+
/datum/gear/hat/wig
display_name = "wig"
path = /obj/item/clothing/head/wig
@@ -100,10 +104,20 @@
display_name = "cowboy hat"
path = /obj/item/clothing/head/cowboy
+/datum/gear/hat/catears
+ display_name = "cat ears"
+ path = /obj/item/clothing/head/kitty
+
+/datum/gear/hat/horse
+ display_name = "horse mask"
+ path = /obj/item/clothing/mask/horsehead
+ slot = ITEM_SLOT_MASK
+
+/datum/gear/hat/piratehat
+ display_name = "pirate hat"
+ description = "Yarr. Comes with one free pirate speak manual."
+ path = /obj/item/clothing/head/pirate
+
/datum/gear/hat/trapper
display_name = "trapper hat"
path = /obj/item/clothing/head/trapper
-
-/datum/gear/hat/flowers
- display_name = "plastic flower, pickable"
- path = /obj/item/clothing/head/plastic_flower
diff --git a/code/modules/client/loadout/loadout_suit.dm b/code/modules/client/loadout/loadout_suit.dm
index f8757bfa5b38..8c758145f71e 100644
--- a/code/modules/client/loadout/loadout_suit.dm
+++ b/code/modules/client/loadout/loadout_suit.dm
@@ -81,10 +81,6 @@
display_name = "hoodie, T4L1"
path = /obj/item/clothing/suit/hooded/hoodie/rilena
-/datum/gear/suit/jacket/hoodie_baw
- display_name = "hoodie, black w grey hood"
- path = /obj/item/clothing/suit/hooded/hoodie/blackwa
-
/datum/gear/suit/jacket/highvis
display_name = "industrial jacket"
path = /obj/item/clothing/suit/toggle/industrial
@@ -107,7 +103,7 @@
path = /obj/item/clothing/suit/toggle/labcoat
/datum/gear/suit/raincoat
- display_name = "translucent labcoat"
+ display_name = "Cybersun labcoat"
description = "Designer lab safety equipment. You're pretty sure this is just a raincoat."
path = /obj/item/clothing/suit/toggle/labcoat/raincoat
diff --git a/code/modules/client/loadout/loadout_uniform.dm b/code/modules/client/loadout/loadout_uniform.dm
index 96b4088b65bd..616c4308b437 100644
--- a/code/modules/client/loadout/loadout_uniform.dm
+++ b/code/modules/client/loadout/loadout_uniform.dm
@@ -160,6 +160,10 @@
display_name = "suit, charcoal"
path = /obj/item/clothing/under/suit/charcoal
+/datum/gear/uniform/suit/galaxy
+ display_name = "suit, galaxy"
+ path = /obj/item/clothing/under/rank/civilian/lawyer/galaxy
+
/datum/gear/uniform/suit/white_skirt
display_name = "suitskirt, white shirt"
path = /obj/item/clothing/under/suit/black/skirt
@@ -232,3 +236,8 @@
/datum/gear/uniform/dress/rilena
display_name = "red dress, Ri cosplay"
path = /obj/item/clothing/under/dress/rilena
+
+//Premium
+/datum/gear/uniform/tacticool
+ display_name = "tacticool turtleneck"
+ path = /obj/item/clothing/under/syndicate/tacticool
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 006074e74bcd..b9a4fb8f0ca3 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -879,19 +879,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
- // begin generic adjective
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
+ if(generic_adjective)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
- dat += "
Character Adjective
"
+ dat += "
Character Adjective
"
- dat += "[generic_adjective] "
+ dat += "[generic_adjective] "
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
- // end generic adjective
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
if("wings" in pref_species.default_features && GLOB.r_wings_list.len >1)
if(!mutant_category)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 71d968d16130..3c3040f03906 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -448,15 +448,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
READ_FILE(S["equipped_gear"], equipped_gear)
if(config) //This should *probably* always be there, but just in case.
if(length(equipped_gear) > CONFIG_GET(number/max_loadout_items))
- to_chat(parent, span_userdanger("Loadout maximum items exceeded in loaded slot, Your loadout has been cleared! You had [length(equipped_gear)]/[CONFIG_GET(number/max_loadout_items)] equipped items!"))
+ to_chat(parent, "Loadout maximum items exceeded in loaded slot, Your loadout has been cleared! You had [length(equipped_gear)]/[CONFIG_GET(number/max_loadout_items)] equipped items!")
equipped_gear = list()
- WRITE_FILE(S["equipped_gear"], equipped_gear)
-
- for(var/gear in equipped_gear)
- if(!(gear in GLOB.gear_datums))
- to_chat(parent, span_warning("Removing nonvalid loadout item [gear] from loadout"))
- equipped_gear -= gear //be GONE
- WRITE_FILE(S["equipped_gear"], equipped_gear)
+ WRITE_FILE(S["equipped_gear"] , equipped_gear)
READ_FILE(S["feature_human_tail"], features["tail_human"])
READ_FILE(S["feature_human_ears"], features["ears"])
diff --git a/code/modules/client/verbs/typing.dm b/code/modules/client/verbs/typing.dm
deleted file mode 100644
index 28abf10ee7e8..000000000000
--- a/code/modules/client/verbs/typing.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-#define IC_VERBS list("say", "me", "whisper")
-
-/client/var/commandbar_thinking = FALSE
-/client/var/commandbar_typing = FALSE
-
-/client/proc/initialize_commandbar_spy()
- src << output('html/typing_indicator.html', "commandbar_spy")
-
-/client/proc/handle_commandbar_typing(href_list)
- if (length(href_list["verb"]) < 1 || !(lowertext(href_list["verb"]) in IC_VERBS) || text2num(href_list["argument_length"]) < 1)
- if (commandbar_typing)
- commandbar_typing = FALSE
- stop_typing()
- return
-
- if (!commandbar_typing)
- commandbar_typing = TRUE
- start_typing()
-
-/client/proc/start_typing()
- mob.set_typing_indicator(TRUE)
-
-/client/proc/stop_typing()
- if(isnull(mob))
- return FALSE
- mob.set_typing_indicator(FALSE)
-
-#undef IC_VERBS
diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm
index ce87ea624d7a..97eed2728fb6 100644
--- a/code/modules/clothing/factions/clip.dm
+++ b/code/modules/clothing/factions/clip.dm
@@ -163,16 +163,6 @@
supports_variations = DIGITIGRADE_VARIATION_SAME_ICON_FILE
-/obj/item/clothing/suit/armor/vest/clip_correspondent
- name = "press armor vest"
- desc = "A slim Type I armored vest that provides decent protection against most types of damage. The white letters on the front read \"PRESS\" in CLIP Kalixcian."
-
- icon = 'icons/obj/clothing/faction/clip/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/clip/suits.dmi'
-
- icon_state = "armor_correspondant"
- item_state = "armor_correspondant"
-
//spacesuits
/obj/item/clothing/suit/space/hardsuit/clip_patroller
name = "\improper CM-410 'Patroller' EVA Hardsuit"
@@ -319,17 +309,6 @@
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_HEAD))
-/obj/item/clothing/head/helmet/bulletproof/m10/clip_correspondent
- name = "CLIP War Correspondant M10 Helmet"
- desc = "A light bulletproof helmet worn by War Correspondants of the CLIP."
-
- icon = 'icons/obj/clothing/faction/clip/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/clip/head.dmi'
- vox_override_icon = 'icons/mob/clothing/faction/clip/vox.dmi'
-
- icon_state = "clip_m10_correspondant"
- item_state = "clip_m10_correspondant"
-
/obj/item/clothing/head/helmet/riot/clip
name = "\improper Minutemen riot helmet"
desc = "Designed to protect against close range attacks. Mainly used by the CMM-BARD against hostile xenofauna, it also sees prolific use on some Minutemen member worlds."
diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm
deleted file mode 100644
index 9bac6c40a004..000000000000
--- a/code/modules/clothing/factions/frontiersmen.dm
+++ /dev/null
@@ -1,260 +0,0 @@
-//////////////
-//Jumpsuits//
-/////////////
-
-/obj/item/clothing/under/frontiersmen
- name = "\improper frontiersmen uniform"
- desc = "Fatigues worn by members of the Frontiersmen pirate fleet. Its poor-quality linen is very uncomfortable to move around in."
- icon_state = "frontier"
- item_state = "frontier"
- can_adjust = FALSE
- icon = 'icons/obj/clothing/faction/frontiersmen/uniforms.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/uniforms.dmi'
-
-/obj/item/clothing/under/frontiersmen/deckhand
- name = "\improper deckhand jumpsuit"
- desc = "A cheap olive-green jumpsuit used by the Frontiersmen on their vessels. It has an old smell permeating it."
- icon_state = "frontier_deckhand"
- item_state = "frontier_deckhand"
-
-/obj/item/clothing/under/frontiersmen/fireproof
- name = "\improper fireproof frontiersmen fatigues"
- desc = "An all-black set of fatigues worn by the flamethrower units of the Frontiersmen. It feels oddly itchy when worn..."
- icon_state = "frontier_fireproof"
- item_state = "frontier_fireproof"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/under/frontiersmen/officer
- name = "\improper Frontiersmen officer's uniform"
- desc = "Worn by officers of the Frontiersmen pirate fleet. It's less comfortable than it looks."
- icon_state = "frontier_officer"
-
-/obj/item/clothing/under/frontiersmen/admiral
- name = "\improper frontiersmen admiral uniform"
- desc = "Worn by admirals of the Frontiersmen pirate fleet, adorned with a tasteful amount of gold and completed with a very-stylish all-white aesthetic. Quite snobby for a bunch of pirates."
- icon_state = "frontier_admiral"
- item_state = "frontier_admiral"
-
-////////////////////
-//Unarmored suits//
-///////////////////
-
-/obj/item/clothing/suit/frontiersmen
- name = "frontiersmen smock"
- desc = "A basic white surgical apron worn by the Frontiersmen. It seems it could stain very easily..."
- icon_state = "frontier_surgery"
- icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
-
-//////////////////
-//Armored suits//
-/////////////////
-
-/obj/item/clothing/suit/armor/vest/bulletproof/frontier
- name = "\improper Frontiersmen bulletproof armor"
- desc = "A scrap piece of armor made of disused protective plates. This one was used to protect the squishy bits of a Frontiersman, once."
- icon_state = "frontier_armor"
- icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
- blood_overlay_type = "armor"
-
-/obj/item/clothing/suit/armor/vest/marine/frontier
- name = "light tactical armor vest"
- desc = "A bulky set of stamped plasteel armor plates, coated with the intimidating grey of the Frontiersmen. If you have the time to inspect this vest, either you are about to die, or you have killed the one who wore it originally."
- icon_state = "marine_frontier"
- item_state = "armor"
- icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
-
-/obj/item/clothing/suit/armor/frontier
- name = "reinforced fur coat"
- desc = "A stiff olive-green coat, meant for frigid conditions. Commonly worn by Frontiersmen command."
- icon_state = "frontier_coat"
- body_parts_covered = CHEST|GROIN|ARMS
- cold_protection = CHEST|GROIN|ARMS
- heat_protection = CHEST|GROIN|ARMS
- icon_state = "frontier_coat"
- item_state = "frontier_coat"
- blood_overlay_type = "coat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
-
-/obj/item/clothing/suit/armor/frontier/fireproof
- name = "frontiersmen fireproof coat"
- desc = "A stiff olive-green coat, used particularly by Frontiersmen flame troopers. It seems to be lined with asbestos, to provide maximum heat and fire deterrence... At the cost of comfort. And mesothelioma."
- icon_state = "frontier_fireproof_suit"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- w_class = WEIGHT_CLASS_BULKY
- gas_transfer_coefficient = 0.9
- permeability_coefficient = 0.5
- body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- slowdown = 0.5
- clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
- heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar)
-
-///////////////
-//Spacesuits//
-//////////////
-
-/obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
- name = "\improper Frontiersmen hardsuit helmet"
- desc = "An old hardsuit helmet based on a even older hardsuit helmet. Used prolifically by the Frontiersmen pirate fleet."
- icon_state = "hardsuit0-frontier"
- icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
- hardsuit_type = "frontier"
-
-/obj/item/clothing/suit/space/hardsuit/security/independent/frontier
- name = "\improper Frontiersmen hardsuit"
- desc = "An old hardsuit based on a even older hardsuit. Used prolifically by the Frontiersmen pirate fleet."
- icon_state = "hardsuit_frontier"
- hardsuit_type = "hardsuit_frontier"
- icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
-
-/////////
-//Hats//
-////////
-
-/obj/item/clothing/head/soft/frontiersmen
- name = "frontiersman cap"
- desc = "An olive-green and grey baseball hat, worn by cargo technicians working under the Frontiersmen. Even they have the rights for a cool cap!"
- icon_state = "frontiersoft"
- soft_type = "frontiersmen"
- icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
-
-/obj/item/clothing/head/beret/sec/frontier
- name = "\improper Frontiersmen beret"
- desc = "A scratchy olive green beret, worn by Frontiersmen who want to look good while intimidating freighter crew."
- icon_state = "frontier_beret"
- icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
-
-/obj/item/clothing/head/beret/sec/frontier/officer
- name = "\improper Frontiersmen officer beret"
- desc = "A scratchy olive green beret emblazoned with the Frontiersmen insignia, worn by Frontiersmen who want to look good while intimidating freighter captains."
- icon_state = "frontier_officer_beret"
- armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
-
-/obj/item/clothing/head/frontier
- name = "frontier surgical cap"
- desc = "A white surgical cap used by the quite uncommon doctors part of the Frontiersmen."
- icon_state = "frontier_surgery"
- icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
-
-/obj/item/clothing/head/hardhat/frontier
- name = "faded white hard hat"
- desc = "A grimy white hardhat used by the mechanics and engineers of the Frontiersmen fleet. Smells old."
- icon_state = "frontier_hardhat"
- icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
-
-/obj/item/clothing/head/frontier/peaked
- name = "\improper frontiersmen commander's cap"
- desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
- icon_state = "frontier_cap"
-
-/obj/item/clothing/head/frontier/admiral
- name = "\improper frontiersmen admiral's cap"
- desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
- icon_state = "frontier_admiral_cap"
-
-/obj/item/clothing/head/helmet/bulletproof/x11/frontier
- name = "\improper frontiersmen X-11 helmet"
- desc = "A heavily modified X-11 pattern helmet used by the Frontiersmen pirate fleet."
- icon_state = "x11helm_frontier"
- unique_reskin = null
-
-/obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof
- name = "\improper fireproof frontiersmen X-11 helmet"
- desc = "A subtly but helpful modifcation of the Frontiersmen X11 to make it fireproof."
- heat_protection = HEAD
- max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- cold_protection = HEAD
- min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
- resistance_flags = FIRE_PROOF
- armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
-
-/obj/item/clothing/head/helmet/marine/frontier
- name = "frontiersmen reinforced helmet"
- desc = "A reinforced Frontiersmen X-11. The front plate has a small window to let the user see."
- icon_state = "marine_frontier"
- icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi'
-
-////////////
-//Glasses//
-///////////
-
-//////////
-//Masks//
-/////////
-
-/obj/item/clothing/mask/gas/frontiersmen
- name = "sack gas mask"
- desc = "A gas mask that can be connected to an air supply. It's made out of sack, but still works just as good for protecting you."
- icon_state = "gasmask_frontier"
- icon = 'icons/obj/clothing/faction/frontiersmen/mask.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/mask.dmi'
- resistance_flags = FIRE_PROOF
-
-//////////
-//Neck//
-/////////
-
-//////////
-//Belts//
-/////////
-
-/obj/item/storage/belt/security/military/frontiersmen
- name = "leather bandolier"
- desc = "A rudimentary leather bandolier, utilized by both independents and frontiersmen alike. Usually slung diagonally, from the shoulder to the waist."
- icon_state = "frontierwebbing"
- item_state = "frontierwebbing"
- icon = 'icons/obj/clothing/faction/frontiersmen/belt.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/belt.dmi'
-
- unique_reskin = null
-
-/obj/item/storage/belt/medical/webbing/frontiersmen
- name = "leather medical bandolier"
- desc = "A rudimentary leather bandolier, utilized by both independents and frontiersmen alike. This one is painted white, usually to be worn by a medic."
- icon_state = "frontiermedicalwebbing"
- item_state = "frontiermedicalwebbing"
- icon = 'icons/obj/clothing/faction/frontiersmen/belt.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/belt.dmi'
-
-/obj/item/storage/belt/medical/webbing/frontiersmen/surgery/PopulateContents()
- new /obj/item/scalpel(src)
- new /obj/item/circular_saw(src)
- new /obj/item/surgicaldrill(src)
- new /obj/item/retractor(src)
- new /obj/item/cautery(src)
- new /obj/item/hemostat(src)
- new /obj/item/hypospray/mkii(src)
- update_appearance()
-
-
-/obj/item/storage/belt/security/military/frontiersmen/skm_ammo/PopulateContents()
- for(var/i in 1 to 4)
- new /obj/item/ammo_box/magazine/skm_762_40(src)
- new /obj/item/grenade/frag(src)
-
-/obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo/PopulateContents() //replace with spitter. remind me.
- for(var/i in 1 to 4)
- new /obj/item/ammo_box/magazine/pistolm9mm(src)
- new /obj/item/grenade/frag(src)
-
-/obj/item/storage/belt/security/military/frontiersmen/flamer/PopulateContents()
- for(var/i in 1 to 4)
- new /obj/item/reagent_containers/glass/beaker/large/napalm(src)
- new /obj/item/grenade/frag(src)
diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm
index 96c6eee3c734..fe6a6d9bdb6a 100644
--- a/code/modules/clothing/factions/gezena.dm
+++ b/code/modules/clothing/factions/gezena.dm
@@ -36,7 +36,7 @@
item_state = "bluecloth"
blood_overlay_type = "coat"
togglename = "zipper"
- body_parts_covered = CHEST
+ body_parts_covered = CHEST|ARMS
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
armor = list("melee" = 20, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
@@ -53,11 +53,20 @@
icon_state = "coat"
item_state = "bluecloth"
blood_overlay_type = "coat"
- body_parts_covered = CHEST|GROIN
+ body_parts_covered = CHEST|ARMS|GROIN|LEGS
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
armor = list("melee" = 35, "bullet" = 35, "laser" = 20, "energy" = 40, "bomb" = 20, "bio" = 20, "rad" = 0, "fire" = 50, "acid" = 50)
- allowed = null
+ allowed = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ /obj/item/radio,
+ /obj/item/gun/energy/kalix,
+ )
/obj/item/clothing/suit/armor/gezena/engi
name = "engineer navywear coat"
diff --git a/code/modules/clothing/factions/hardliners.dm b/code/modules/clothing/factions/hardliners.dm
deleted file mode 100644
index 5c3423f745c0..000000000000
--- a/code/modules/clothing/factions/hardliners.dm
+++ /dev/null
@@ -1,181 +0,0 @@
-//////////////
-//Jumpsuits//
-/////////////
-
-/obj/item/clothing/under/syndicate/hardliners
- name = "hardliners uniform"
- desc = "A crimson combat uniform, reminiscent of the Gorlex Marauders at the height of the Inter-Corporate Wars. It's oddly comfortable, and warm."
- icon_state = "hardliners"
- item_state = "hardliners"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
- can_adjust = FALSE
- icon = 'icons/obj/clothing/faction/hardliners/uniforms.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/uniforms.dmi'
-
-/obj/item/clothing/under/syndicate/hardliners/jumpsuit
- name = "hardliners jumpsuit"
- desc = "A black jumpsuit with white overalls, a scant reminder of the old miners of Gorlex VII."
- icon_state = "hl_jumpsuit"
- item_state = "hl_jumpsuit"
-
-/obj/item/clothing/under/syndicate/hardliners/officer
- name = "hardliners officer uniform"
- desc = "A button-up uniform with cargo pants, certainly more tactical than most officer uniforms."
- icon_state = "hl_officer"
- item_state = "hl_officer"
-
-////////////////////
-//Unarmored suits//
-///////////////////
-
-/obj/item/clothing/suit/hardliners
- name = "white smock"
- desc = "A plain-white surgical smock typically worn by both Hardliners and Cybersun staff. Even mercenaries need medical attention!"
- icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
- icon_state = "hl_apron"
- item_state = "whitecloth"
-
-/obj/item/clothing/suit/hazardvest/hardliners
- name = "blood-red hazard vest"
- desc = "A white high-visibility vest, worn by mechanics associated with Hardliners. Safety first!"
- icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
- icon_state = "hl_hazard"
- item_state = "whitecloth"
-
-//////////////////
-//Armored suits//
-/////////////////
-
-/obj/item/clothing/suit/armor/hardliners
- name = "hardliners armor vest"
- desc = "A slim Type I armored vest, painted in a classic white associated with the Hardliners. It would probably make bloodstains very obvious..."
- icon_state = "hl_vest"
- item_state = "armor"
- icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
- blood_overlay_type = "armor"
-
-/obj/item/clothing/suit/armor/hardliners/jacket
- name = "hardliners armored kutte"
- desc = "A leather Kutte with a slim Type I armored vest, painted in a classic white associated with the Hardliners. The patch of the Hardliner movement can be seen behind the leather kutte, a nostalgic callback to the leather outfits used by the civilians of Gorlex VII."
- icon_state = "hl_jacket"
- item_state = "armor"
- icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
- blood_overlay_type = "armor"
-
-/obj/item/clothing/suit/armor/hardliners/sergeant
- name = "hardliners sergeant jacket"
- desc = "An armored jacket typically worn by sergeant of the Hardliners. They're reminiscent of the garb worn by old Gorlex navymen, prior to its destruction."
- body_parts_covered = CHEST|GROIN|ARMS
- icon_state = "hl_sergeant"
- item_state = "hl_sergeant"
- blood_overlay_type = "coat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
-
-/obj/item/clothing/suit/toggle/armor/vest/hardliners
- name = "hardliners captain coat"
- desc = "An imposing armored coat worn by captains of Hardliner fleets, hand-designed by Cybersun tailors to provide maximum protection to its wearer."
- body_parts_covered = CHEST|GROIN|ARMS
- icon_state = "hl_captain"
- item_state = "hl_captain"
- icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
- blood_overlay_type = "coat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- togglename = "buttons"
-
-///////////////
-//Spacesuits//
-//////////////
-
-/obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
- name = "white-red hardsuit helmet"
- desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in EVA mode. Manufactured by Cybersun Biodynamics."
- alt_desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in combat mode. Manufactured by Cybersun Biodynamics."
- icon_state = "hardsuit1-hl"
- item_state = "hardsuit1-hl"
- icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
- hardsuit_type = "hl"
-
-/obj/item/clothing/suit/space/hardsuit/syndi/hl
- name = "white-red hardsuit"
- desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in EVA mode. Manufactured by Cybersun Biodynamics."
- alt_desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in combat mode. Manufactured by Cybersun Biodynamics."
- icon_state = "hardsuit1-hl"
- item_state = "hardsuit1-hl"
- hardsuit_type = "hl"
- icon = 'icons/obj/clothing/faction/hardliners/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/suits.dmi'
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
- lightweight = 1
- jetpack = null
-
-/////////
-//Hats//
-////////
-
-/obj/item/clothing/head/hardliners
- name = "white surgical cap"
- desc = "A surgical cap used by doctors of Hardliner fleets, matching their white smocks."
- icon_state = "hl_surgery"
- icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
-
-
-/obj/item/clothing/head/hardhat/hardliners
- name = "white-red hard hat"
- desc = "A white-red hardhat typically used by both miners and mechanics under the Hardliner fleets."
- icon_state = "hl_hardhat"
- icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
-
-/obj/item/clothing/head/hardliners/peaked
- name = "Hardliner peaked cap"
- desc = "A stylish peaked cap utilized by high-ranking officers of the Hardliner movement. Most who wear it are likely to have been a veteran of the ICW, still vying for revenge against Nanotrasen..."
- icon_state = "hl_officer"
- item_state = "hl_officer"
-
-/obj/item/clothing/head/helmet/hardliners
- name = "hardliners X-11 helmet"
- desc = "A well-armored helmet utilized by the Hardliners, though painted in their iconic white. Either it makes them stick out like a sore thumb, or it provides excellent camouflage in snow-covered planets."
- icon = 'icons/obj/clothing/faction/hardliners/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/head.dmi'
- armor = list("melee" = 40, "bullet" = 60, "laser" = 35, "energy" = 35, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) // The guys who specialize in ballistics would probably have better bullet armor. Maybe.
- icon_state = "hl_x11"
- item_state = "hl_x11"
-
-/obj/item/clothing/head/helmet/hardliners/swat
- name = "hardliners pilot helmet"
- desc = "A modified X-11 helmet utilized by regular pilots, as well as the feared mech pilots of the Hardliner movement. The attached visor helps protect against sudden flashes from explosions."
- flash_protect = FLASH_PROTECTION_WELDER
- icon_state = "hl_pilot"
- item_state = "hl_pilot"
-
-////////////
-//Glasses//
-///////////
-
-/obj/item/clothing/glasses/hud/security/sunglasses/hardliners
- name = "hardliners security goggles"
- desc = "Tinted-red flash-proof goggles used by Hardliners, with an integrated security HUD, courtesy of their partners, Cybersun."
- icon_state = "hl_goggles"
- item_state = "hl_goggles"
- icon = 'icons/obj/clothing/faction/hardliners/eyes.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/eyes.dmi'
- glass_colour_type = /datum/client_colour/glass_colour/red
-
-//////////
-//Belts//
-/////////
-
-/obj/item/storage/belt/security/webbing/hardliners
- name = "hardliners webbing"
- desc = "A set of tactical webbing for operators of the Hardliner movement, can hold security gear."
- icon_state = "hl_webbing"
- item_state = "hl_webbing"
- icon = 'icons/obj/clothing/faction/hardliners/belt.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/hardliners/belt.dmi'
diff --git a/code/modules/clothing/factions/srm.dm b/code/modules/clothing/factions/srm.dm
deleted file mode 100644
index cd901306b7a7..000000000000
--- a/code/modules/clothing/factions/srm.dm
+++ /dev/null
@@ -1,154 +0,0 @@
-//////////////
-//Jumpsuits//
-/////////////
-
-/obj/item/clothing/under/suit/roumain
- name = "saint-roumain's worksuit"
- desc = "A simple, hard-wearing suit designed for the hardworking hunters of the Saint-Roumain Militia."
- icon_state = "rouma_work"
- item_state = "rouma_work"
- can_adjust = FALSE
- icon = 'icons/obj/clothing/faction/srm/uniforms.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/srm/uniforms.dmi'
-
-//////////////////
-//Armored suits//
-/////////////////
-
-/obj/item/clothing/suit/armor/roumain
- name = "saint-roumain duster"
- desc = "A coat made from hard leather. Meant to withstand long hunts in harsh wilderness."
- icon_state = "armor_rouma"
- item_state = "rouma_coat"
- body_parts_covered = CHEST|GROIN|ARMS
- cold_protection = CHEST|GROIN|ARMS
- heat_protection = CHEST|GROIN|ARMS
- icon = 'icons/obj/clothing/faction/srm/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
-
-/obj/item/clothing/suit/armor/roumain/shadow
- name = "saint-roumain shadow duster"
- desc = "A coat made from hard leather. Its rough, barely-treated finish is typical of one of the Saint-Roumain Militia's trainees."
- icon_state = "armor_rouma_shadow"
- item_state = "rouma_shadow_coat"
-
-/obj/item/clothing/suit/toggle/labcoat/roumain_med
- name = "saint-roumain medical duster"
- desc = "A coat made from hard leather and further treated with exotic sterilizing oils and wax. The treatment and its more closed design offers much better protection against biological hazards."
- icon = 'icons/obj/clothing/faction/srm/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
- icon_state = "rouma_med_coat"
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
-
-/obj/item/clothing/suit/hazardvest/roumain
- name = "saint-roumain machinist leather vest"
- desc = "A modified Roumain leather duster with its large flaps and sleeves cut off to provide extra mobility when maintaining weapons and vessels belonging to the Church of Saint Roumain. Its specialty treatment grants it better protection against acid and fire."
- icon = 'icons/obj/clothing/faction/srm/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
- icon_state = "armor_rouma_machinist"
- item_state = "rouma_coat"
- armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 40, "bomb" = 35, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
-
-/obj/item/clothing/suit/armor/roumain/flamebearer
- name = "saint-roumain flamebearer robes"
- desc = "A set of ashy-grey robes made from hard leather, adorned with gold trims. Its rough finish after a near-char and application of aromatics is heavily favored for the ecclesiastical sect of the Church of Saint Roumain, a living reminder of the Ashen Huntsman himself."
- icon_state = "armor_rouma_flamebearer"
-
-/obj/item/clothing/suit/armor/roumain/colligne
- name = "saint-roumain colligne coat"
- desc = "A well-maintained hard leather coat typically worn to denote the rank of Colligne, a trainee Hunter Montagne. It is treated with bullet-resistant materials, and lined with the dark fur of Illestrian dire wolves."
- icon_state = "armor_rouma_colligne"
- item_state = "rouma_coat"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS
- cold_protection = CHEST|GROIN|LEGS|ARMS
- heat_protection = CHEST|GROIN|LEGS|ARMS
-
-/obj/item/clothing/suit/armor/roumain/montagne
- name = "saint-roumain montagne coat"
- desc = "A stylish red coat to indicate that you are, in fact, a Hunter Montagne. Made of extra hard exotic leather, treated with bullet-resistant materials, and lined with the fur of some unidentifiable creature."
- icon_state = "armor_rouma_montagne"
- item_state = "rouma_montagne_coat"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
- cold_protection = CHEST|GROIN|LEGS|ARMS
- heat_protection = CHEST|GROIN|LEGS|ARMS
-
-///////////////
-//Spacesuits//
-//////////////
-
-/obj/item/clothing/head/helmet/space/hardsuit/solgov/roumain
- name = "\improper roumain hardsuit helmet"
- desc = "An armored helmet with an unusual design that recalls both pre-industrial Solarian armor and iconography depicting the Ashen Huntsman. Though hand-made, it is surprisingly quite spaceworthy."
- icon = 'icons/obj/clothing/faction/srm/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/srm/head.dmi'
- icon_state = "hardsuit0-roumain"
- item_state = "hardsuit0-roumain"
- hardsuit_type = "roumain"
- worn_y_offset = 4
-
-/obj/item/clothing/suit/space/hardsuit/solgov/roumain
- name = "\improper roumain hardsuit"
- desc = "A hand-crafted suit of armor either modified from a set of normal plate armor or designed to resemble one. A powered exoskeleton has been cleverly integrated into the design and, surprisingly, it is completely vacuum-proof. Suits like this are a testament to what the master craftsmen of Hunter's Pride are capable of."
- icon = 'icons/obj/clothing/faction/srm/suits.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
- icon_state = "hardsuit-roumain"
- item_state = "hardsuit-roumain"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/solgov/roumain
- slowdown = 0.5
-
-/////////
-//Hats//
-////////
-
-/obj/item/clothing/head/cowboy/sec/roumain
- name = "hunter's hat"
- desc = "A fancy hat with a nice feather. The way it covers your eyes makes you feel like a badass."
- icon_state = "rouma_hat"
- icon = 'icons/obj/clothing/faction/srm/head.dmi'
- mob_overlay_icon = 'icons/mob/clothing/faction/srm/head.dmi'
-
-/obj/item/clothing/head/cowboy/sec/roumain/shadow
- name = "shadow's hat"
- desc = "A rough, simple hat. The way it covers your eyes makes you feel badass, but you just look like a wannabe hunter."
- icon_state = "rouma_shadow_hat"
-
-/obj/item/clothing/head/cowboy/sec/roumain/machinist
- name = "machinist's hat"
- desc = "A small, humble leather top hat. It gives you the gnawing urge to create classical gizmos and goobers, or alternatively repair any breaches within your vessel."
- icon_state = "rouma_machinist_hat"
-
-/obj/item/clothing/head/cowboy/sec/roumain/med
- name = "medical hunter's hat"
- desc = "A very wide-brimmed, round hat treated with oil and wax. Somehow manages to look stylish and creepy at the same time."
- icon_state = "rouma_med_hat"
-
-/obj/item/clothing/head/cowboy/sec/roumain/flamebearer
- name = "flamebearer's hat"
- desc = "A wide-brimmed, pointed hat with charred leather, granting it an ash-grey appearance. The design honors the one the Ashen Huntsman himself wore, according to legend."
- icon_state = "rouma_flamebearer_hat"
-
-/obj/item/clothing/head/cowboy/sec/roumain/colligne
- name = "colligne's hat"
- desc = "A fancy, pointy leather hat with a large feather plume to signal that you are, in fact... A Hunter Colligne. You still have some ways to go before you gain the title of Montagne."
- icon_state = "rouma_colligne_hat"
-
-/obj/item/clothing/head/cowboy/sec/roumain/montagne
- name = "montagne's hat"
- desc = "A very fancy hat with a large feather plume to signal that you are, in fact, a Hunter Montagne. The exotic fur lining is impeccably soft."
- icon_state = "rouma_montagne_hat"
-
-///////////////
-//Accessories//
-///////////////
-
-//These are stored in clothing/accessories.dmi instead of a factional variant due to accessory code being dogwater
-//Please transfer them over to a factional file if accessory code is ever fixed
-
-/obj/item/clothing/accessory/waistcoat/roumain
- name = "roumain waistcoat"
- desc = "A warm, red wool waistcoat, worn by any member of the Church of Saint Roumain, though heavily favored by Machinists for the added warmth given to their rather breezy outfit."
- icon_state = "rouma_waistcoat"
- icon = 'icons/obj/clothing/accessories.dmi'
- mob_overlay_icon = 'icons/mob/clothing/accessories.dmi'
- minimize_when_attached = TRUE
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 559816007b13..0698981207bf 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -259,7 +259,7 @@
desc = "A snazzy looking pair of ballistic goggles with an integrated security hud. The opaque visor provides flash protection."
icon_state = "inteq_goggles"
item_state = "inteq_goggles"
- supports_variations = KEPORI_VARIATION | VOX_VARIATION
+ supports_variations = KEPORI_VARIATION
glass_colour_type = /datum/client_colour/glass_colour/orange
/obj/item/clothing/glasses/hud/health/prescription
diff --git a/code/modules/clothing/head/berets.dm b/code/modules/clothing/head/berets.dm
index 9d3ca21ed4f0..8d6f97eb4bd2 100644
--- a/code/modules/clothing/head/berets.dm
+++ b/code/modules/clothing/head/berets.dm
@@ -214,6 +214,19 @@
desc = "A snow white beret with an air of distinction around it, emblazoned with the golden shield of the IRMG as the badge."
icon_state = "inteq_honorable_beret"
+// Frontier
+
+/obj/item/clothing/head/beret/sec/frontier
+ name = "\improper Frontiersmen beret"
+ desc = "A scratchy olive green beret, worn by Frontiersmen who want to look good while intimidating freighter crew."
+ icon_state = "frontier_beret"
+
+/obj/item/clothing/head/beret/sec/frontier/officer
+ name = "\improper Frontiersmen officer beret"
+ desc = "A scratchy olive green beret emblazoned with the Frontiersmen insignia, worn by Frontiersmen who want to look good while intimidating freighter captains."
+ icon_state = "frontier_officer_beret"
+
+
// CentCom
/obj/item/clothing/head/beret/centcom_formal
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index a6de8769642a..6648f6341196 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -230,11 +230,10 @@
/obj/item/clothing/head/helmet/marine
name = "tactical combat helmet"
- desc = "A tactical black helmet, sealed from outside hazards with a reinforced visor."
+ desc = "A tactical black helmet, sealed from outside hazards with a plate of reinforced glass."
icon_state = "marine_command"
item_state = "helmetalt"
- armor = list("melee" = 50, "bullet" = 75, "laser" = 55, "energy" = 25, "bomb" = 60, "bio" = 100, "fire" = 70, "acid" = 50)
- slowdown = 0.3
+ armor = list("melee" = 50, "bullet" = 50, "laser" = 30, "energy" = 25, "bomb" = 50, "bio" = 100, "fire" = 40, "acid" = 50)
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
clothing_flags = STOPSPRESSUREDAMAGE
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -501,7 +500,7 @@
icon_state = "inteq_swat"
item_state = "inteq_swat"
flags_inv = HIDEHAIR
- supports_variations = KEPORI_VARIATION | VOX_VARIATION
+ supports_variations = KEPORI_VARIATION
content_overlays = TRUE
/obj/item/clothing/head/helmet/inteq
@@ -510,7 +509,7 @@
icon_state = "inteq_helmet"
icon_state = "inteq_helmet"
can_flashlight = TRUE
- supports_variations = KEPORI_VARIATION | VOX_VARIATION
+ supports_variations = KEPORI_VARIATION
content_overlays = TRUE
/obj/item/clothing/head/solgov
@@ -589,3 +588,9 @@
"Snow" = "x11helm_snow",
"Urban" = "x11helm_urban",
)
+
+/obj/item/clothing/head/helmet/bulletproof/x11/frontier
+ name = "\improper Frontiersmen X11 Helmet"
+ desc = "A heavily modified X11 used by the Frontiersmen pirate fleet."
+ icon_state = "x11helm_frontier"
+ unique_reskin = null
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 3e04245e1a14..f81b5a8b8259 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -37,12 +37,12 @@
name = "captain's hat"
icon_state = "captain_nt"
-/obj/item/clothing/head/frontier/peaked
+/obj/item/clothing/head/caphat/frontier
name = "\improper Frontiersmen commander's cap"
desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
icon_state = "frontier_cap"
-/obj/item/clothing/head/frontier/peaked/admiral
+/obj/item/clothing/head/caphat/frontier/admiral
name = "\improper Frontiersmen admiral's cap"
desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
icon_state = "frontier_admiral_cap"
@@ -138,6 +138,26 @@
desc = "A robust stetson adorned with a deputy's badge. Its imitation leather is thick and worn."
icon_state = "cowboysec"
+/obj/item/clothing/head/cowboy/sec/roumain
+ name = "hunter's hat"
+ desc = "A fancy hat with a nice feather. The way it covers your eyes makes you feel like a badass."
+ icon_state = "rouma_hat"
+
+/obj/item/clothing/head/cowboy/sec/roumain/shadow
+ name = "shadow's hat"
+ desc = "A rough, simple hat. The way it covers your eyes makes you feel badass, but you just look like a wannabe hunter."
+ icon_state = "rouma_shadow_hat"
+
+/obj/item/clothing/head/cowboy/sec/roumain/med
+ name = "medical hunter's hat"
+ desc = "A very wide-brimmed, round hat treated with oil and wax. Somehow manages to look stylish and creepy at the same time."
+ icon_state = "rouma_med_hat"
+
+/obj/item/clothing/head/HoS/cowboy/montagne
+ name = "montagne's hat"
+ desc = "A very fancy hat with a large feather plume to signal that you are, in fact, a Hunter Montagne. The exotic fur lining is impeccably soft and bafflingly bulletproof."
+ icon_state = "rouma_montagne_hat"
+
/obj/item/clothing/head/HoS/syndicate
name = "syndicate cap"
desc = "A black cap fit for a high ranking syndicate officer."
@@ -252,12 +272,3 @@
#undef DRILL_SHOUTING
#undef DRILL_YELLING
#undef DRILL_CANADIAN
-
-/obj/item/clothing/head/witchunter
- name = "witchunter hat"
- desc = "This hat saw much use back in the day."
- icon_state = "witchhunterhat"
- item_state = "witchhunterhat"
- flags_cover = HEADCOVERSEYES
- flags_inv = HIDEEYES|HIDEHAIR
- armor = list("melee" = 30, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 24e2f95f03bd..b9e828ab3974 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -315,6 +315,13 @@
var/datum/brain_trauma/mild/phobia/conspiracies/paranoia
var/warped = FALSE
+/obj/item/clothing/head/foilhat/Initialize(mapload)
+ . = ..()
+ if(!warped)
+ AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, PROC_REF(warp_up)))
+ else
+ warp_up()
+
/obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot)
. = ..()
if(slot != ITEM_SLOT_HEAD || warped)
@@ -367,20 +374,3 @@
if(!warped)
warp_up()
-/obj/item/clothing/head/plastic_flower
- name = "plastic flower"
- desc = "A realistic imitation of a flower. Not edible though."
- icon = 'icons/obj/hydroponics/harvest.dmi'
- icon_state = "poppy"
- body_parts_covered = null
- unique_reskin = list(
- "Poppy" = "poppy",
- "Sunflower" = "sunflower",
- "Moonflower" = "moonflower",
- "Novaflower" = "novaflower",
- "Harebell" = "harebell",
- "Geranium" = "geranium",
- "Lily" = "lily"
- )
- custom_materials = (list(/datum/material/plastic = 1000))
-
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index d2b573711051..725764a10b04 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -154,6 +154,13 @@
clothing_flags = VOICEBOX_TOGGLABLE
modifies_speech = TRUE
+/obj/item/clothing/mask/frog/handle_speech(datum/source, list/speech_args) //whenever you speak
+ if(!(clothing_flags & VOICEBOX_DISABLED))
+ if(prob(5)) //sometimes, the angry spirit finds others words to speak.
+ speech_args[SPEECH_MESSAGE] = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!")
+ else
+ speech_args[SPEECH_MESSAGE] = pick("Ree!!", "Reee!!","REEE!!","REEEEE!!") //but its usually just angry gibberish,
+
/obj/item/clothing/mask/frog/cursed
clothing_flags = NONE
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 3f431df81ccb..8d5251e9e8c8 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -433,9 +433,3 @@
playsound(src,"shatter", 70)
new /obj/effect/decal/cleanable/glass/strange(get_turf(src))
return ..()
-
-/obj/item/clothing/neck/fangnecklace
- name = "wolf fang necklace"
- desc = "A necklace made out of a wolf's fang and some sinew. According to a common Frontier superstition, it brings good luck to its wearer."
- icon_state = "fang_necklace"
- cuttable = FALSE
diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
index 1ab6b3cf320e..f0fd3bb81eb2 100644
--- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
+++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
@@ -1,10 +1,11 @@
-/datum/outfit/job/frontiersmen/ert //most basic of grunts
+/datum/outfit/job/frontiersmen/ert
name = "ERT - Frontiersman Basic"
- head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier
+ head = /obj/item/clothing/head/beret/sec/frontier
+ mask = /obj/item/clothing/mask/gas/sechailer/balaclava
suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier
suit_store = /obj/item/gun/ballistic/rifle/illestren
- uniform = /obj/item/clothing/under/frontiersmen
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/color/black
ears = /obj/item/radio/headset/pirate/alt
@@ -12,10 +13,9 @@
l_pocket = /obj/item/flashlight/seclite
r_pocket = /obj/item/tank/internals/emergency_oxygen/double
- box = /obj/item/storage/box/survival/frontier
id = null // lol
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/ammo_box/magazine/illestren_a850r=5, /obj/item/grenade/frag=1)
+ backpack_contents = list(/obj/item/ammo_box/magazine/illestren_a850r=5, /obj/item/grenade/frag=1)
/datum/outfit/job/frontiersmen/ert/random
name = "ERT - Frontiersman Randomized"
@@ -48,7 +48,7 @@
if(prob(30))
mask = pickweight(list(
- /obj/item/clothing/mask/gas/frontiersmen = 5,
+ /obj/item/clothing/mask/gas = 5,
/obj/item/clothing/mask/gas/sechailer/balaclava = 5,
/obj/item/clothing/mask/breath = 5,
/obj/item/clothing/mask/whistle = 3))
@@ -59,9 +59,8 @@
/obj/item/storage/backpack/satchel = 20,
/obj/item/storage/backpack/messenger = 20,
/obj/item/melee/baton/cattleprod/loaded = 5,
- /obj/item/food/baguette = 2, // yes you can put this on your back
+ /obj/item/reagent_containers/food/snacks/baguette = 2, // yes you can put this on your back
/obj/item/deployable_turret_folded = 1,
- /obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended = 1,
))
if(prob(90))
@@ -75,8 +74,6 @@
if("Doctor")
backpack_contents += list(/obj/item/storage/firstaid/regular = 1)
gloves = /obj/item/clothing/gloves/color/latex
- suit = /obj/item/clothing/suit/frontiersmen
- head = /obj/item/clothing/head/frontier
if(prob(50))
belt = /obj/item/storage/belt/medical/surgery
if(prob(30))
@@ -86,16 +83,7 @@
if(prob(10))
belt = /obj/item/storage/belt/grenade/full
if("Ammo Carrier")
- var/loops = rand(1,3)
- for(var/i in 1 to loops)
- var/ammotype = pick(list(
- /obj/item/ammo_box/c8x50mm_box,
- /obj/item/ammo_box/c45,
- /obj/item/ammo_box/a357_box,
- /obj/item/ammo_box/c45,
- /obj/item/ammo_box/a4570,
- /obj/item/stock_parts/cell/gun/mini))
- backpack_contents += ammotype
+ backpack_contents += list(/obj/item/ammo_box/a762_40 = 1)
var/weapon = pick(list("Bolt-Action", "Pistol", "Melee"))
switch(weapon)
@@ -108,78 +96,50 @@
if("Pistol")
r_hand = pick(list(
/obj/item/gun/ballistic/automatic/pistol/disposable,
- /obj/item/gun/ballistic/automatic/pistol/candor,
+ /obj/item/gun/ballistic/automatic/pistol,
/obj/item/gun/ballistic/revolver/firebrand,
- /obj/item/gun/ballistic/revolver/shadow,
- /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn,
/obj/item/gun/energy/e_gun/mini))
if(prob(30))
l_hand = pick(list(
/obj/item/gun/ballistic/automatic/pistol/disposable,
- /obj/item/gun/ballistic/automatic/pistol/candor,
+ /obj/item/gun/ballistic/automatic/pistol,
/obj/item/gun/ballistic/revolver/firebrand,
- /obj/item/gun/ballistic/revolver/shadow,
- /obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn,
/obj/item/gun/energy/e_gun/mini))
if("Melee")
r_hand = pickweight(list(
- /obj/item/kitchen/knife/combat/survival = 15,
+ /obj/item/kitchen/knife = 15,
/obj/item/melee/baseball_bat = 10,
+ /obj/item/melee/cleric_mace = 7,
/obj/item/melee/roastingstick = 2,
/obj/item/kitchen/fork = 1,
/obj/item/melee/flyswatter = 1,
))
-/datum/outfit/job/frontiersmen/ert/grunt //better armed, use for quick creating pirate ships
- name = "ERT - Frontiersman Grunt (Unarmed)"
-
- suit_store = null
- belt = /obj/item/storage/belt/security/military/frontiersmen
-
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen)
-
-/datum/outfit/job/frontiersmen/ert/grunt/skm
- name = "ERT - Frontiersman Grunt (SKM-24)"
-
- suit_store = /obj/item/gun/ballistic/automatic/assault/skm
- belt = /obj/item/storage/belt/security/military/frontiersmen/skm_ammo
-
-/datum/outfit/job/frontiersmen/ert/grunt/aps_mp //remember. Remind me to replace this with the spitter.
- name = "ERT - Frontiersman Grunt (Stechkin APS)"
-
- suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
- belt = /obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo
/datum/outfit/job/frontiersmen/ert/leader
name = "ERT - Frontiersman Officer"
- uniform = /obj/item/clothing/under/frontiersmen/officer
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
head = /obj/item/clothing/head/beret/sec/frontier/officer
ears = /obj/item/radio/headset/pirate/alt/captain
back = /obj/item/storage/backpack/satchel/leather
suit = /obj/item/clothing/suit/armor/frontier
- suit_store = /obj/item/gun/ballistic/automatic/pistol/deagle
-
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/ammo_box/magazine/m50=2, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
-
-/datum/outfit/job/frontiersmen/ert/leader/unnarmed
- name = "ERT - Frontiersman Officer (Unnarmed)"
-
- suit_store = null
+ suit_store = /obj/item/gun/ballistic/revolver
+ belt = /obj/item/storage/belt/military/assault
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
+ backpack_contents = list(/obj/item/ammo_box/a357=3, /obj/item/binoculars=1, /obj/item/kitchen/knife/combat/survival)
/datum/outfit/job/frontiersmen/ert/medic
name = "ERT - Frontiersman Medic"
- head = /obj/item/clothing/head/frontier
back = /obj/item/storage/backpack/medic
mask = /obj/item/clothing/mask/surgical
gloves = /obj/item/clothing/gloves/color/latex/nitrile
- belt = /obj/item/storage/belt/medical/webbing/frontiersmen/surgery
- suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
+ belt = /obj/item/storage/belt/medical/surgery
+ suit = null
+ suit_store = null
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3, /obj/item/ammo_box/magazine/pistolm9mm=2)
+ backpack_contents = list(/obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3)
/datum/outfit/job/frontiersmen/ert/engineer
@@ -187,38 +147,8 @@
back = /obj/item/storage/backpack/industrial
belt = /obj/item/storage/belt/utility/full
- head = /obj/item/clothing/head/hardhat/frontier
- glasses = /obj/item/clothing/glasses/welding
+ head = /obj/item/clothing/head/hardhat/weldhat
suit_store = null
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/grenade/c4=3, /obj/item/crowbar/large=1)
-
-/datum/outfit/job/frontiersmen/ert/flamer
- name = "ERT - Frontiersman Flame Trooper"
-
- head = /obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof
- mask = /obj/item/clothing/mask/gas/frontiersmen
- suit = /obj/item/clothing/suit/armor/frontier/fireproof
- suit_store = /obj/item/tank/internals/oxygen/red
- uniform = /obj/item/clothing/under/frontiersmen/fireproof
- gloves = /obj/item/clothing/gloves/combat
- back = /obj/item/storage/backpack
- belt = /obj/item/storage/belt/security/military/frontiersmen/flamer
-
- l_hand = /obj/item/flamethrower/full/tank
-
- backpack_contents = list(/obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1,/obj/item/ammo_box/a12g=1,/obj/item/extinguisher=2,/obj/item/radio=1)
-
-
-/datum/outfit/job/frontiersmen/ert/sentry_lmg
- name = "ERT - Frontiersman Sentry (SKM-24v)"
-
- head = /obj/item/clothing/head/helmet/marine/frontier
- mask = /obj/item/clothing/mask/gas/sechailer/balaclava
- suit = /obj/item/clothing/suit/armor/vest/marine/frontier
- suit_store = /obj/item/gun/ballistic/automatic/hmg/skm_lmg/drum_mag
- gloves = /obj/item/clothing/gloves/combat
-
- belt = /obj/item/gun/ballistic/revolver/mateba
+ backpack_contents = list(/obj/item/grenade/c4=3, /obj/item/crowbar/large=1)
- backpack_contents = list(/obj/item/ammo_box/magazine/skm_762_40/drum=2,/obj/item/ammo_box/a357=2,/obj/item/grenade/frag=1,/obj/item/radio=1)
diff --git a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
index 4cec7ad56f8a..a541941208e2 100644
--- a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
+++ b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm
@@ -29,7 +29,7 @@
belt = /obj/item/storage/belt/security/full
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\
/obj/item/melee/baton/loaded=1)
- l_pocket = /obj/item/kitchen/knife/switchblade
+ l_pocket = /obj/item/switchblade
/datum/outfit/centcom/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
diff --git a/code/modules/clothing/outfits/ert/syndicate_ert.dm b/code/modules/clothing/outfits/ert/syndicate_ert.dm
index 29da95448ee4..472983e890db 100644
--- a/code/modules/clothing/outfits/ert/syndicate_ert.dm
+++ b/code/modules/clothing/outfits/ert/syndicate_ert.dm
@@ -27,7 +27,7 @@
head = /obj/item/clothing/head/HoS/beret/syndicate
ears = /obj/item/radio/headset/syndicate/captain
- backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/syndicate=1, /obj/item/ammo_box/magazine/m10mm=2, /obj/item/radio=1)
+ backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol=1, /obj/item/ammo_box/magazine/m10mm=2, /obj/item/radio=1)
// gorlex loyalist/2nd battlegroup
@@ -58,7 +58,7 @@
belt = /obj/item/storage/belt/medical/webbing/paramedic
glasses = /obj/item/clothing/glasses/hud/health/sunglasses
gloves = /obj/item/clothing/gloves/color/latex/nitrile/evil
- suit_store = /obj/item/gun/ballistic/automatic/pistol/syndicate
+ suit_store = /obj/item/gun/ballistic/automatic/pistol
l_pocket = /obj/item/radio
@@ -73,7 +73,7 @@
gloves = /obj/item/clothing/gloves/fingerless
suit = /obj/item/clothing/suit/armor/vest
belt = /obj/item/storage/belt/security
- suit_store = /obj/item/gun/ballistic/automatic/marksman/sniper_rifle
+ suit_store = /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate
r_pocket = /obj/item/kitchen/knife/combat/survival
l_pocket = /obj/item/binoculars
diff --git a/code/modules/clothing/outfits/factions/frontiersmen.dm b/code/modules/clothing/outfits/factions/frontiersmen.dm
index 7045f5182188..e8119ddffac4 100644
--- a/code/modules/clothing/outfits/factions/frontiersmen.dm
+++ b/code/modules/clothing/outfits/factions/frontiersmen.dm
@@ -3,7 +3,7 @@
// faction_icon = "bg_frontiersmen"
- uniform = /obj/item/clothing/under/frontiersmen
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier
r_pocket = /obj/item/radio
shoes = /obj/item/clothing/shoes/jackboots
ears = /obj/item/radio/headset/pirate
@@ -24,14 +24,13 @@
// Assistant
/datum/outfit/job/frontiersmen/assistant
- name = "Frontiersmen - Deckhand"
- id_assignment = "Deckhand"
+ name = "Frontiersmen - Rookie"
+ id_assignment = "Rookie"
job_icon = "assistant"
jobtype = /datum/job/assistant
- uniform = /obj/item/clothing/under/frontiersmen/deckhand
head = /obj/item/clothing/head/beret/sec/frontier
- shoes = /obj/item/clothing/shoes/workboots
+ shoes = /obj/item/clothing/shoes/sneakers/black // you do not get jackboots!!!! fuck you!!!!
// Atmospheric Technician
@@ -41,7 +40,7 @@
jobtype = /datum/job/atmos
accessory = /obj/item/clothing/accessory/armband/engine
- head = /obj/item/clothing/head/hardhat/frontier
+ head = /obj/item/clothing/head/hardhat
// Cargo Technician
@@ -51,8 +50,9 @@
jobtype = /datum/job/cargo_tech
accessory = /obj/item/clothing/accessory/armband/cargo
+ suit = /obj/item/clothing/suit/hazardvest
shoes = /obj/item/clothing/shoes/workboots
- head = /obj/item/clothing/head/soft/frontiersmen
+ head = /obj/item/clothing/head/soft
backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo)
// Captain
@@ -63,21 +63,21 @@
jobtype = /datum/job/captain
ears = /obj/item/radio/headset/pirate/alt/captain
- uniform = /obj/item/clothing/under/frontiersmen/officer
- head = /obj/item/clothing/head/frontier/peaked
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ head = /obj/item/clothing/head/caphat/frontier
suit = /obj/item/clothing/suit/armor/frontier
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/cowboy/black
gloves = /obj/item/clothing/gloves/combat
/datum/outfit/job/frontiersmen/captain/admiral
name = "Frontiersmen - Admiral"
id_assignment = "Admiral"
- uniform = /obj/item/clothing/under/frontiersmen/admiral
- head = /obj/item/clothing/head/frontier/peaked/admiral
- shoes = /obj/item/clothing/shoes/jackboots
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier/admiral
+ head = /obj/item/clothing/head/caphat/frontier/admiral
+ shoes = /obj/item/clothing/shoes/cowboy/white
ears = /obj/item/radio/headset/pirate/captain
- gloves = /obj/item/clothing/gloves/combat
+ gloves = /obj/item/clothing/gloves/color/evening
suit = null
// Chief Engineer
@@ -89,8 +89,8 @@
accessory = /obj/item/clothing/accessory/armband/engine
ears = /obj/item/radio/headset/pirate/captain
- uniform = /obj/item/clothing/under/frontiersmen/officer
- head = /obj/item/clothing/head/hardhat/frontier
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ head = /obj/item/clothing/head/hardhat/weldhat/white
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
belt = /obj/item/storage/belt/utility/full
@@ -103,8 +103,9 @@
jobtype = /datum/job/engineer
accessory = /obj/item/clothing/accessory/armband/engine
+ suit = /obj/item/clothing/suit/hazardvest
shoes = /obj/item/clothing/shoes/workboots
- head = /obj/item/clothing/head/hardhat/frontier
+ head = /obj/item/clothing/head/hardhat
r_pocket = /obj/item/analyzer
@@ -116,7 +117,7 @@
job_icon = "cook"
jobtype = /datum/job/cook
- uniform = /obj/item/clothing/under/frontiersmen
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier
head = /obj/item/clothing/head/chefhat
suit = /obj/item/clothing/suit/apron/chef
@@ -129,8 +130,8 @@
jobtype = /datum/job/head_of_personnel
ears = /obj/item/radio/headset/pirate/alt
- uniform = /obj/item/clothing/under/frontiersmen/officer
- shoes = /obj/item/clothing/shoes/jackboots
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
+ shoes = /obj/item/clothing/shoes/cowboy/black
head = /obj/item/clothing/head/beret/sec/frontier/officer
gloves = /obj/item/clothing/gloves/combat
r_pocket = /obj/item/kitchen/knife/combat/survival
@@ -143,12 +144,12 @@
jobtype = /datum/job/hos
accessory = /obj/item/clothing/accessory/armband
- uniform = /obj/item/clothing/under/frontiersmen/officer
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
head = /obj/item/clothing/head/beret/sec/frontier/officer
suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier
- shoes = /obj/item/clothing/shoes/jackboots
+ shoes = /obj/item/clothing/shoes/cowboy/black
gloves = /obj/item/clothing/gloves/combat
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/melee/baton/loaded=1)
+ backpack_contents = list(/obj/item/melee/baton/loaded=1)
suit_store = null
// Security Officer
@@ -160,19 +161,16 @@
jobtype = /datum/job/officer
accessory = /obj/item/clothing/accessory/armband
+ mask = /obj/item/clothing/mask/gas/sechailer/balaclava
suit = null
- uniform = /obj/item/clothing/under/frontiersmen
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/color/black
ears = /obj/item/radio/headset/pirate/alt
- box = /obj/item/storage/box/survival/frontier
-
l_pocket = /obj/item/flashlight/seclite
r_pocket = /obj/item/tank/internals/emergency_oxygen/double
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen)
-
// Medical Doctor
/datum/outfit/job/frontiersmen/doctor
@@ -182,9 +180,6 @@
jobtype = /datum/job/doctor
accessory = /obj/item/clothing/accessory/armband/med
- uniform = /obj/item/clothing/under/frontiersmen
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier
glasses = /obj/item/clothing/glasses/hud/health
r_pocket = /obj/item/kitchen/knife/combat/survival
- suit = /obj/item/clothing/suit/frontiersmen
- head = /obj/item/clothing/head/frontier
- belt = /obj/item/storage/belt/medical/webbing/frontiersmen
diff --git a/code/modules/clothing/outfits/factions/gezena.dm b/code/modules/clothing/outfits/factions/gezena.dm
index df7a5145e47f..ed32d8b698e7 100644
--- a/code/modules/clothing/outfits/factions/gezena.dm
+++ b/code/modules/clothing/outfits/factions/gezena.dm
@@ -7,7 +7,6 @@
if(visualsOnly)
return
H.faction |= list(FACTION_PLAYER_GEZENA)
- H.grant_language(/datum/language/draconic)
//Playable Roles (put in ships):
/datum/outfit/job/gezena/assistant
diff --git a/code/modules/clothing/outfits/factions/independent.dm b/code/modules/clothing/outfits/factions/independent.dm
index db227c2903c7..07be3d75d36b 100644
--- a/code/modules/clothing/outfits/factions/independent.dm
+++ b/code/modules/clothing/outfits/factions/independent.dm
@@ -6,6 +6,8 @@
box = /obj/item/storage/box/survival
id = /obj/item/card/id
+ r_pocket = /obj/item/storage/wallet
+
// Assistant
/datum/outfit/job/independent/assistant
@@ -17,21 +19,8 @@
/datum/outfit/job/independent/assistant/waiter
name = "Independent - Assistant (Waiter)"
-
uniform = /obj/item/clothing/under/suit/waiter
- alt_uniform = /obj/item/clothing/under/suit/waiter/syndicate
- gloves = /obj/item/clothing/gloves/color/evening
- ears = /obj/item/radio/headset/headset_srv
shoes = /obj/item/clothing/shoes/laceup
- l_pocket = /obj/item/lighter
- r_pocket = /obj/item/reagent_containers/glass/rag
-
-/datum/outfit/job/independent/assistant/waiter/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- ..()
- if(visualsOnly)
- return
- var/obj/item/card/id/W = H.wear_id
- W.access += list(ACCESS_KITCHEN)
/datum/outfit/job/independent/assistant/fancy
name = "Independent - Assistant (Formal Uniform)"
@@ -67,6 +56,14 @@
gloves = /obj/item/clothing/gloves/color/white
accessory = /obj/item/clothing/neck/scarf/darkblue
+/datum/outfit/job/independent/assistant/tenant
+ name = "Independent - Assistant (Tenant)"
+
+ uniform = /obj/item/clothing/under/misc/pj/red
+ alt_uniform = /obj/item/clothing/under/misc/pj/blue
+ dcoat = /obj/item/clothing/suit/nerdshirt
+
+
/datum/outfit/job/independent/assistant/pharma
name = "Independent - Assistant (Pharmacology Student)"
@@ -149,18 +146,6 @@
implants = list(/obj/item/implant/radio)
accessory = null
-/datum/outfit/job/independent/captain/manager
- name = "Independent - Captain (Manager)"
-
- id = /obj/item/card/id
- gloves = /obj/item/clothing/gloves/color/white
- uniform = /obj/item/clothing/under/suit/black_really
- alt_uniform = /obj/item/clothing/under/suit/blacktwopiece
- dcoat = null
- glasses = /obj/item/clothing/glasses/sunglasses
- head = null
- accessory = null
-
// Head of Personnel
/datum/outfit/job/independent/hop
@@ -312,6 +297,7 @@
jobtype = /datum/job/engineer
belt = /obj/item/storage/belt/utility/full/engi
+ l_pocket = /obj/item/storage/wallet
gloves = /obj/item/clothing/gloves/color/yellow
ears = /obj/item/radio/headset/headset_eng
uniform = /obj/item/clothing/under/rank/engineering/engineer
@@ -390,6 +376,7 @@
id = /obj/item/card/id/silver
belt = /obj/item/storage/belt/utility/chief/full
+ l_pocket = /obj/item/storage/wallet
ears = /obj/item/radio/headset/headset_com
uniform = /obj/item/clothing/under/rank/engineering/chief_engineer
dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
@@ -607,8 +594,7 @@
job_icon = "cook"
ears = /obj/item/radio/headset/headset_srv
- shoes = /obj/item/clothing/shoes/laceup
- uniform = /obj/item/clothing/under/rank/civilian/chef
+ uniform = /obj/item/clothing/under/rank/civilian/chef //WS Edit - Alt Uniforms
suit = /obj/item/clothing/suit/toggle/chef
alt_suit = /obj/item/clothing/suit/apron/chef
head = /obj/item/clothing/head/chefhat
@@ -623,6 +609,8 @@
var/chosen_box = pick(possible_boxes)
var/obj/item/storage/box/I = new chosen_box(src)
H.equip_to_slot_or_del(I,ITEM_SLOT_BACKPACK)
+ var/datum/martial_art/cqc/under_siege/justacook = new
+ justacook.teach(H)
// Bartender
@@ -637,14 +625,6 @@
suit = /obj/item/clothing/suit/armor/vest
backpack_contents = list(/obj/item/storage/box/beanbag=1)
shoes = /obj/item/clothing/shoes/laceup
- accessory = /obj/item/clothing/accessory/waistcoat
-
-/datum/outfit/job/independent/bartender/disarmed //No armor, no shotgun ammo.
- name = "Independent - Bartender (Disarmed)"
-
- suit = null
- alt_suit = null
- backpack_contents = null
/datum/outfit/job/independent/bartender/pharma
name = "Independent - Bartender (Mixologist)"
@@ -656,7 +636,6 @@
belt = /obj/item/storage/belt
gloves = /obj/item/clothing/gloves/color/latex/nitrile
uniform = /obj/item/clothing/under/suit/black
- accessory = null
// Lawyer
diff --git a/code/modules/clothing/outfits/factions/inteq.dm b/code/modules/clothing/outfits/factions/inteq.dm
index 6ad58203e2e6..75a36b1a3132 100644
--- a/code/modules/clothing/outfits/factions/inteq.dm
+++ b/code/modules/clothing/outfits/factions/inteq.dm
@@ -29,40 +29,31 @@
///captains
/datum/outfit/job/inteq/captain
- name = "IRMG - Vanguard"
+ name = "IRMG - Vanguard (Naked)"
id_assignment = "Vanguard"
jobtype = /datum/job/captain
job_icon = "captain"
- id = /obj/item/card/id/gold
- head = /obj/item/clothing/head/beret/sec/hos/inteq
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq
- mask = /obj/item/clothing/mask/gas/sechailer/balaclava/inteq
- suit = /obj/item/clothing/suit/armor/hos/inteq
- dcoat = /obj/item/clothing/suit/hooded/wintercoat/security/inteq
- belt = /obj/item/storage/belt/security/webbing/inteq
- gloves = /obj/item/clothing/gloves/combat
ears = /obj/item/radio/headset/inteq/alt/captain
shoes = /obj/item/clothing/shoes/combat
-
r_pocket = /obj/item/assembly/flash/handheld
l_pocket = /obj/item/restraints/handcuffs
+ jobtype = /datum/job/captain
+ id = /obj/item/card/id/gold
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
-/datum/outfit/job/inteq/captain/empty
- name = "IRMG - Vanguard (Naked)"
-
- head = null
- glasses = null
- mask = null
- belt = null
- suit = null
- dcoat = null
- gloves = null
+/datum/outfit/job/inteq/captain/geared
+ name = "IRMG - Vanguard"
- r_pocket = null
- l_pocket = null
+ head = /obj/item/clothing/head/beret/sec/hos/inteq
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq
+ mask = /obj/item/clothing/mask/gas/sechailer/balaclava/inteq
+ belt = /obj/item/storage/belt/security/webbing/inteq
+ suit = /obj/item/clothing/suit/armor/hos/inteq
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/security/inteq
+ gloves = /obj/item/clothing/gloves/combat
+ accessory = null
/datum/outfit/job/inteq/captain/honorable
name = "IRMG - Honorable Vanguard"
@@ -80,8 +71,8 @@
///Chief Engineer
/datum/outfit/job/inteq/ce
- name = "IRMG - Honorable Artificer"
- id_assignment = "Honorable Artificer"
+ name = "IRMG - Artificer Class II"
+ id_assignment = "Artificer Class II"
job_icon = "chiefengineer"
jobtype = /datum/job/chief_engineer
@@ -149,14 +140,6 @@
satchel = /obj/item/storage/backpack/messenger/inteq
courierbag = /obj/item/storage/backpack/messenger/inteq
-/datum/outfit/job/inteq/security/empty
- name = "IRMG - Enforcer (Naked)"
- head = null
- suit = null
- belt = null
- mask = null
- gloves = null
-
/datum/outfit/job/inteq/security/beluga
name = "IRMG - Enforcer (Beluga)"
@@ -173,6 +156,14 @@
satchel = /obj/item/storage/backpack/messenger/inteq
courierbag = /obj/item/storage/backpack/messenger/inteq
+/datum/outfit/job/inteq/security/empty
+ name = "IRMG - Enforcer (Naked)"
+ head = null
+ suit = null
+ belt = null
+ mask = null
+ gloves = null
+
///engineers
/datum/outfit/job/inteq/engineer
@@ -210,17 +201,6 @@
courierbag = /obj/item/storage/backpack/messenger/inteq
backpack_contents = list(/obj/item/melee/classic_baton=1)
-/datum/outfit/job/inteq/warden/pilot
- name = "IRMG - Shuttle Pilot"
- job_icon = "securityofficer"
- id_assignment = "Shuttle Pilot"
-
- head = /obj/item/clothing/head/soft/inteq
- suit = /obj/item/clothing/suit/armor/vest/alt
- belt = null
- mask = /obj/item/clothing/mask/breath
- gloves = /obj/item/clothing/gloves/fingerless
-
// cmo
/datum/outfit/job/inteq/cmo
diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm
index 5c038b05f181..a8ce0907a35a 100644
--- a/code/modules/clothing/outfits/factions/minutemen.dm
+++ b/code/modules/clothing/outfits/factions/minutemen.dm
@@ -246,21 +246,6 @@
r_pocket = /obj/item/radio
-/datum/outfit/job/clip/correspondant
- name = "CLIP - War Correspondent"
- job_icon = "curator"
- jobtype = /datum/job/curator
-
- head = /obj/item/clothing/head/helmet/bulletproof/m10/clip_correspondent
- uniform = /obj/item/clothing/under/clip/formal/with_shirt
- suit = /obj/item/clothing/suit/armor/vest/clip_correspondent
- shoes = /obj/item/clothing/shoes/laceup
-
- backpack = /obj/item/storage/backpack/satchel/leather
- satchel = /obj/item/storage/backpack/satchel/leather
-
- r_pocket = /obj/item/radio
-
// Colonial League Minutemen
/datum/outfit/job/clip/minutemen
@@ -560,7 +545,7 @@
/datum/outfit/job/clip/minutemen/grunt/dressed/armed/f4 //f4 is rename of GAL, don't wanna repath upon adding the clip guns though, if i forget to remove this during then, fucking yell at me
name = "CLIP Minutemen - Minuteman (Armed - CM-GAL)"
- suit_store = /obj/item/gun/ballistic/automatic/marksman/gal
+ suit_store = /obj/item/gun/ballistic/automatic/gal
belt = /obj/item/storage/belt/military/clip/gal
/datum/outfit/job/clip/minutemen/grunt/dressed/armed/cm5
diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm
index f03c91d51a11..93f1ee3a347c 100644
--- a/code/modules/clothing/outfits/factions/nanotrasen.dm
+++ b/code/modules/clothing/outfits/factions/nanotrasen.dm
@@ -53,13 +53,9 @@
head = /obj/item/clothing/head/nanotrasen/cap/supply
uniform = /obj/item/clothing/under/nanotrasen/supply/qm
- suit = null
- alt_suit = null
dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo
shoes = /obj/item/clothing/shoes/sneakers/brown
glasses = /obj/item/clothing/glasses/sunglasses
- gloves = null
- neck = null
l_hand = /obj/item/clipboard
chameleon_extras = /obj/item/stamp/qm
@@ -224,6 +220,7 @@
id = /obj/item/card/id/silver
belt = /obj/item/storage/belt/utility/chief/full
+ l_pocket = /obj/item/storage/wallet
ears = /obj/item/radio/headset/headset_com
uniform = /obj/item/clothing/under/nanotrasen/engineering/director
dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
diff --git a/code/modules/clothing/outfits/factions/roumain.dm b/code/modules/clothing/outfits/factions/roumain.dm
index fe31fddd9041..424827e69010 100644
--- a/code/modules/clothing/outfits/factions/roumain.dm
+++ b/code/modules/clothing/outfits/factions/roumain.dm
@@ -19,7 +19,7 @@
name = "Saint-Roumain Militia - Shadow"
id_assignment = "Shadow"
jobtype = /datum/job/assistant
- job_icon = "srm_shadow"
+ job_icon = "assistant"
uniform = /obj/item/clothing/under/suit/roumain
alt_uniform = null
@@ -33,40 +33,14 @@
/datum/outfit/job/roumain/captain
name = "Saint-Roumain Militia - Hunter Montagne"
id_assignment = "Hunter Montagne"
- job_icon = "srm_montagne"
+ job_icon = "captain"
jobtype = /datum/job/captain
- ears = /obj/item/radio/headset/headset_com/alt
- uniform = /obj/item/clothing/under/suit/roumain
- shoes = /obj/item/clothing/shoes/workboots/mining
- suit = /obj/item/clothing/suit/armor/roumain/montagne
- head = /obj/item/clothing/head/cowboy/sec/roumain/montagne
- id = /obj/item/card/id/gold
-
- duffelbag = /obj/item/storage/backpack/cultpack
- courierbag = /obj/item/storage/backpack/cultpack
- backpack = /obj/item/storage/backpack/cultpack
- satchel = /obj/item/storage/backpack/cultpack
-
- backpack_contents = list(/obj/item/book/manual/srmlore=1,
- /obj/item/stamp/chap = 1,
- /obj/item/melee/classic_baton/telescopic=1,
- )
- chameleon_extras = null
-
-// Second-In-Command
-
-/datum/outfit/job/roumain/hop
- name = "Saint-Roumain Militia - Hunter Colligne"
- id_assignment = "Hunter Colligne"
- job_icon = "srm_colligne"
- jobtype = /datum/job/head_of_personnel
-
ears = /obj/item/radio/headset/headset_com
uniform = /obj/item/clothing/under/suit/roumain
shoes = /obj/item/clothing/shoes/workboots/mining
- suit = /obj/item/clothing/suit/armor/roumain/colligne
- head = /obj/item/clothing/head/cowboy/sec/roumain/colligne
+ suit = /obj/item/clothing/suit/armor/hos/roumain/montagne
+ head = /obj/item/clothing/head/HoS/cowboy/montagne
id = /obj/item/card/id/silver
duffelbag = /obj/item/storage/backpack/cultpack
@@ -84,7 +58,7 @@
name = "Saint-Roumain Militia - Hunter"
id_assignment = "Hunter"
jobtype = /datum/job/officer
- job_icon = "hsrm_hunter"
+ job_icon = "securityofficer"
uniform = /obj/item/clothing/under/suit/roumain
alt_uniform = null
@@ -100,34 +74,12 @@
backpack_contents = null
-// engineer
-
-/datum/outfit/job/roumain/engineer
- name = "Saint-Roumain Militia - Machinist"
- id_assignment = "Machinist"
- job_icon = "srm_machinist"
- jobtype = /datum/job/engineer
-
- uniform = /obj/item/clothing/under/suit/roumain
- alt_uniform = null
- shoes = /obj/item/clothing/shoes/workboots/mining
- belt = /obj/item/storage/belt/utility/full/engi
- suit = /obj/item/clothing/suit/hazardvest/roumain
- head = /obj/item/clothing/head/cowboy/sec/roumain/machinist
- accessory = /obj/item/clothing/accessory/waistcoat/roumain
- gloves = null
-
- backpack = /obj/item/storage/backpack
- satchel = /obj/item/storage/backpack/satchel
- duffelbag = /obj/item/storage/backpack/duffelbag
- courierbag = /obj/item/storage/backpack/messenger
-
// Medical Doctor
/datum/outfit/job/roumain/doctor
name = "Saint-Roumain Militia - Hunter Doctor"
id_assignment = "Hunter Doctor"
- job_icon = "srm_doctor"
+ job_icon = "medicaldoctor"
jobtype = /datum/job/doctor
uniform = /obj/item/clothing/under/suit/roumain
@@ -142,27 +94,3 @@
satchel = /obj/item/storage/backpack/satchel
duffelbag = /obj/item/storage/backpack/duffelbag
courierbag = /obj/item/storage/backpack/messenger
-
-// Chaplain
-
-/datum/outfit/job/roumain/flamebearer
- name = "Saint-Roumain Militia - Flamebearer"
- id_assignment = "Flamebearer"
- job_icon = "srm_flamebearer"
- jobtype = /datum/job/chaplain
-
- uniform = /obj/item/clothing/under/suit/roumain
- alt_uniform = null
- shoes = /obj/item/clothing/shoes/workboots/mining
- suit = /obj/item/clothing/suit/armor/roumain/flamebearer
- head = /obj/item/clothing/head/cowboy/sec/roumain/flamebearer
- gloves = null
-
- duffelbag = /obj/item/storage/backpack/cultpack
- courierbag = /obj/item/storage/backpack/cultpack
- backpack = /obj/item/storage/backpack/cultpack
- satchel = /obj/item/storage/backpack/cultpack
-
- backpack_contents = list(/obj/item/book/manual/srmlore=1,
- /obj/item/stamp/chap = 1,
- )
diff --git a/code/modules/clothing/outfits/factions/syndicate.dm b/code/modules/clothing/outfits/factions/syndicate.dm
index 4dbbe0826e21..8f13554f4b00 100644
--- a/code/modules/clothing/outfits/factions/syndicate.dm
+++ b/code/modules/clothing/outfits/factions/syndicate.dm
@@ -22,11 +22,10 @@
//generates a codename and assigns syndicate access, used in the twinkleshine.
/datum/outfit/job/syndicate/proc/assign_codename(mob/living/carbon/human/H)
- var/obj/item/card/id/I = H.get_idcard()
- if(I)
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(1, 12)) // squidquest real
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
+ var/obj/item/card/id/I = H.wear_id
+ I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(1, 12)) // squidquest real
+ I.access |= list(ACCESS_SYNDICATE)
+ I.update_label()
//and now, for the Assistants
@@ -55,10 +54,10 @@
box = /obj/item/storage/box/survival/syndie
/datum/outfit/job/syndicate/assistant/gorlex
- name = "Syndicate - Junior Agent (Hardliner)"
+ name = "Syndicate - Junior Agent (Gorlex Marauders)"
- uniform = /obj/item/clothing/under/syndicate/hardliners
- alt_uniform = /obj/item/clothing/under/syndicate/hardliners/jumpsuit
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ alt_uniform = /obj/item/clothing/under/syndicate
/datum/outfit/job/syndicate/assistant/ngr
name = "Syndicate - Initiate (New Gorlex Republic)"
@@ -200,33 +199,11 @@
/datum/outfit/job/syndicate/bartender/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
- var/obj/item/card/id/W = H.get_idcard()
+ var/obj/item/card/id/W = H.wear_id
if(H.age < AGE_MINOR)
W.registered_age = AGE_MINOR
to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
-/datum/outfit/job/syndicate/bartender/suns
- name = "Syndicate - Student Mixologist (SUNS)"
- id_assignment = "Student Mixologist"
-
- uniform = /obj/item/clothing/under/syndicate/suns/uniform2
- alt_uniform = /obj/item/clothing/under/syndicate/suns/alt
- mask = /obj/item/clothing/mask/breath/suns
- suit = null
- belt = null
- head = null
- shoes = /obj/item/clothing/shoes/laceup/suns
- gloves = null
- ears = null
- accessory = /obj/item/clothing/accessory/waistcoat/suns/poof
-
- backpack = /obj/item/storage/backpack
- satchel = /obj/item/storage/backpack/satchel
- duffelbag = /obj/item/storage/backpack/duffelbag
- courierbag = /obj/item/storage/backpack/messenger
-
- backpack_contents = null
-
/datum/outfit/job/syndicate/bartender/twink
name = "Syndicate - Bartender (Twinkleshine, Donk)"
@@ -329,12 +306,11 @@
/datum/outfit/job/syndicate/captain/gorlex
- name = "Syndicate - Captain (Hardliner)"
- uniform = /obj/item/clothing/under/syndicate/hardliners/officer
+ name = "Syndicate - Captain (Gorlex Marauders)"
+ uniform = /obj/item/clothing/under/syndicate/ngr/officer
- head = /obj/item/clothing/head/hardliners/peaked
- suit = /obj/item/clothing/suit/toggle/armor/vest/hardliners
- shoes = /obj/item/clothing/shoes/combat
+ head = /obj/item/clothing/head/ngr/peaked
+ suit = /obj/item/clothing/suit/armor/ngr/captain
/datum/outfit/job/syndicate/captain/ngr
name = "Syndicate - Captain (New Gorlex Republic)"
@@ -452,6 +428,17 @@
id = /obj/item/card/id/syndicate_command/captain_id
gloves = /obj/item/clothing/gloves/combat
+/datum/outfit/job/syndicate/ce/gorlex
+ name = "Syndicate - Foreman (Gorlex Marauders)"
+
+ ears = /obj/item/radio/headset/syndicate/alt
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ alt_uniform = null
+ suit = /obj/item/clothing/suit/toggle/hazard
+ alt_suit = null
+ shoes = /obj/item/clothing/shoes/jackboots
+ gloves = /obj/item/clothing/gloves/combat
+
/datum/outfit/job/syndicate/ce/ngr
name = "Syndicate - Foreman (New Gorlex Republic)"
@@ -579,27 +566,24 @@
backpack_contents = list(/obj/item/melee/baton/loaded=1)
/datum/outfit/job/syndicate/hos/gorlex
- name = "Syndicate - Sergeant (Hardliner)"
+ name = "Syndicate - Sergeant (Gorlex)"
id_assignment = "Sergeant"
- uniform = /obj/item/clothing/under/syndicate/hardliners/officer
- head = /obj/item/clothing/head/hardliners/peaked
- suit = /obj/item/clothing/suit/armor/hardliners/sergeant
- id = /obj/item/card/id/syndicate_command/crew_id
- shoes = /obj/item/clothing/shoes/combat
- suit_store = /obj/item/gun/ballistic/automatic/pistol/syndicate
-
/datum/outfit/job/syndicate/hos/ngr
name = "Syndicate - Lieutenant (New Gorlex Republic)"
id_assignment = "Lieutenant"
+ ears = /obj/item/radio/headset/syndicate/alt
uniform = /obj/item/clothing/under/syndicate/ngr/officer
head = /obj/item/clothing/head/ngr/peaked
- suit = /obj/item/clothing/suit/armor/ngr/lieutenant
+ suit =/obj/item/clothing/suit/armor/ngr/lieutenant
id = /obj/item/card/id/syndicate_command/crew_id
shoes = /obj/item/clothing/shoes/combat
- suit_store = /obj/item/gun/ballistic/automatic/pistol/syndicate
-
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ suit_store = /obj/item/gun/ballistic/automatic/pistol
+ r_pocket = /obj/item/assembly/flash/handheld
+ l_pocket = /obj/item/restraints/handcuffs
+ backpack_contents = list(/obj/item/melee/baton/loaded=1)
/datum/outfit/job/syndicate/hos/twink
name = "Syndicate - Lieutenant (Twinkleshine, NGR)"
@@ -707,15 +691,13 @@
uniform = /obj/item/clothing/under/syndicate/medic
accessory = /obj/item/clothing/accessory/armband/medblue
- shoes = /obj/item/clothing/shoes/combat
+ shoes = /obj/item/clothing/shoes/jackboots
/datum/outfit/job/syndicate/doctor/gorlex
- name = "Syndicate - Medical Doctor (Hardliner)"
+ name = "Syndicate - Medical Doctor (Gorlex)"
- uniform = /obj/item/clothing/under/syndicate/hardliners
- head = /obj/item/clothing/head/hardliners
- suit = /obj/item/clothing/suit/hardliners
- glasses = /obj/item/clothing/glasses/hud/health
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ glasses = /obj/item/clothing/glasses/hud/health/prescription
r_pocket = /obj/item/kitchen/knife/combat/survival
back = /obj/item/storage/backpack/duffelbag/syndie/med
id = /obj/item/card/id/syndicate_command/crew_id
@@ -922,25 +904,7 @@
/datum/outfit/job/syndicate/security/gorlex
- name = "Syndicate - Trooper (Hardliner)"
- id_assignment = "Trooper"
- job_icon = "securityofficer"
-
- uniform = /obj/item/clothing/under/syndicate/hardliners
- belt = /obj/item/storage/belt/security/webbing/hardliners
- suit = /obj/item/clothing/suit/armor/hardliners
- gloves = /obj/item/clothing/gloves/color/black
- head = /obj/item/clothing/head/helmet/hardliners
- shoes = /obj/item/clothing/shoes/combat
- l_pocket = /obj/item/restraints/handcuffs
- r_pocket = /obj/item/assembly/flash/handheld
-
-/datum/outfit/job/syndicate/security/gorlex
- name = "Syndicate - Pilot (Hardliner)"
- id_assignment = "Pilot"
- job_icon = "securityofficer"
-
- head = /obj/item/clothing/head/helmet/hardliners/swat
+ name = "Syndicate - Assault Operative (Gorlex)"
/datum/outfit/job/syndicate/security/ngr
name = "Syndicate - Operative (New Gorlex Republic)"
@@ -956,14 +920,6 @@
l_pocket = /obj/item/restraints/handcuffs
r_pocket = /obj/item/assembly/flash/handheld
-/datum/outfit/job/syndicate/security/ngr/pilot
- name = "Syndicate - Pilot (New Gorlex Republic)"
- id_assignment = "Pilot"
- job_icon = "securityofficer"
-
- uniform = /obj/item/clothing/under/syndicate/ngr/fatigues
- head = /obj/item/clothing/head/helmet/ngr/swat
-
/datum/outfit/job/syndicate/security/twink
name = "Syndicate - Operative (Twinkleshine)"
@@ -1031,12 +987,10 @@
/obj/item/stack/marker_beacon/ten=1)
/datum/outfit/job/syndicate/miner/gorlex
- name = "Syndicate - Wrecker (Hardliner)"
+ name = "Syndicate - Wrecker (Gorlex Marauders)"
id_assignment = "Wrecker"
- head = /obj/item/clothing/head/hardhat/hardliners
- suit = /obj/item/clothing/suit/hazardvest/hardliners
- uniform = /obj/item/clothing/under/syndicate/hardliners/jumpsuit
+ uniform = /obj/item/clothing/under/syndicate/gorlex
accessory = /obj/item/clothing/accessory/armband/cargo
shoes = /obj/item/clothing/shoes/workboots
ears = /obj/item/radio/headset/alt
@@ -1136,12 +1090,10 @@
id = /obj/item/card/id/syndicate_command/crew_id
/datum/outfit/job/syndicate/engineer/gorlex
- name = "Syndicate - Mechanic (Hardliner)"
+ name = "Syndicate - Mechanic (Gorlex Marauders)"
id_assignment = "Mechanic"
- head = /obj/item/clothing/head/hardhat/hardliners
- suit = /obj/item/clothing/suit/hazardvest/hardliners
- uniform = /obj/item/clothing/under/syndicate/hardliners
+ uniform = /obj/item/clothing/under/syndicate/gorlex
shoes = /obj/item/clothing/shoes/workboots
glasses = null
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 02fbb162892b..c07841cdba5a 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -166,7 +166,7 @@
if(L.status)
to_chat(user, "This bulb is too damaged to use as a replacement!")
return
- if(do_after(user, 50, src))
+ if(do_after(user, 50, 1, src))
qdel(I)
helmet = new helmettype(src)
to_chat(user, "You have successfully repaired [src]'s helmet.")
@@ -444,6 +444,27 @@
combat_slowdown = 0.5
jetpack = null
+//Hardliner Syndie suit
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
+ name = "white-red hardsuit helmet"
+ desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in EVA mode. Manufactured by Second Battlegroup."
+ alt_desc = "An advanced dual-mode helmet derived from ICW-era advanced special operations helmets, its red partly replaced by white. It is in combat mode. Manufactured by Second Battlegroup."
+ icon_state = "hardsuit1-hl"
+ item_state = "hardsuit1-hl"
+ hardsuit_type = "hl"
+
+/obj/item/clothing/suit/space/hardsuit/syndi/hl
+ name = "white-red hardsuit"
+ desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in EVA mode. Manufactured by Second Battlegroup."
+ alt_desc = "An advanced dual-mode hardsuit derived from ICW-era advanced special operations hardsuits, its red partly replaced by white. It is in combat mode. Manufactured by the Second Battlegroup."
+ icon_state = "hardsuit1-hl"
+ item_state = "hardsuit1-hl"
+ hardsuit_type = "hl"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/hl
+ lightweight = 1
+ jetpack = null
+
+
//Elite Syndie suit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit helmet"
@@ -564,6 +585,11 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard
+/obj/item/clothing/suit/space/hardsuit/wizard/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, FALSE, FALSE, ITEM_SLOT_OCLOTHING, INFINITY, FALSE)
+
+
//Medical hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/medical
name = "medical hardsuit helmet"
@@ -1047,6 +1073,12 @@
armor = list("melee" = 35, "bullet" = 25, "laser" = 20,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
supports_variations = VOX_VARIATION
+/obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
+ name = "\improper Frontiersmen hardsuit helmet"
+ desc = "An old hardsuit helmet based on a even older hardsuit helmet. Used prolifically by the Frontiersmen pirate fleet."
+ icon_state = "hardsuit0-frontier"
+ hardsuit_type = "frontier"
+
/obj/item/clothing/suit/space/hardsuit/security/independent
icon_state = "hardsuit-independent-sec"
name = "security hardsuit"
@@ -1058,6 +1090,13 @@
armor = list("melee" = 35, "bullet" = 25, "laser" = 20, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
supports_variations = VOX_VARIATION
+/obj/item/clothing/suit/space/hardsuit/security/independent/frontier
+ name = "\improper Frontiersmen hardsuit"
+ desc = "An old hardsuit based on a even older hardsuit. Used prolifically by the Frontiersmen pirate fleet."
+ icon_state = "hardsuit_frontier"
+ hardsuit_type = "hardsuit_frontier"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent/frontier
+
//Mining
/obj/item/clothing/head/helmet/space/hardsuit/mining/independent
name = "mining hardsuit helmet"
@@ -1217,7 +1256,6 @@
item_state = "hardsuit_solgov"
armor = list("melee" = 50, "bullet" = 45, "laser" = 40, "energy" = 30, "bomb" = 60, "bio" = 100, "rad" = 60, "fire" = 90, "acid" = 75) //intentionally the fucking strong, this is master chief-tier armor //is this really what you call the strong?? is this the best solgov has to offer??????
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/solgov
- allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
slowdown = 0
supports_variations = DIGITIGRADE_VARIATION
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 67dc7ce529b3..ae6ebb525a64 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -332,6 +332,10 @@ Contains:
actions_types = list()
resistance_flags = FIRE_PROOF
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_OCLOTHING)
+
/obj/item/clothing/suit/space/hardsuit/ert/paranormal
name = "paranormal response team hardsuit"
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
@@ -341,6 +345,10 @@ Contains:
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE, ITEM_SLOT_OCLOTHING)
+
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
name = "inquisitor's hardsuit"
icon_state = "hardsuit-inq"
@@ -365,6 +373,11 @@ Contains:
resistance_flags = FIRE_PROOF
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/transforming/cleaving_saw)
+
+/obj/item/clothing/suit/space/hardsuit/berserker/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE, ITEM_SLOT_OCLOTHING)
+
/obj/item/clothing/suit/space/hardsuit/berserker/RemoveHelmet()
var/obj/item/clothing/head/helmet/space/hardsuit/berserker/helm = helmet
if(helm?.berserk_active)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 9dfd23210d9c..47ce052d5bec 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -36,25 +36,19 @@
item_state = "armoralt"
//supports_variations = KEPORI_VARIATION
-/obj/item/clothing/suit/armor/vest/trauma
- name = "cybersun trauma team armor vest"
- icon_state = "traumavest"
- desc = "A set of stamped plasteel armor plates decorated with a medical cross and colors associated with the medical division of Cybersun."
-
/obj/item/clothing/suit/armor/vest/marine
- name = "tactical armor vest"
- desc = "A heavy set of the finest mass-produced stamped plasteel armor plates money can buy."
+ name = "light tactical armor vest"
+ desc = "A set of the finest mass-produced stamped plasteel armor plates money can buy."
icon_state = "marine_light"
item_state = "armor"
clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list("melee" = 50, "bullet" = 75, "laser" = 55, "energy" = 25, "bomb" = 60, "bio" = 100, "fire" = 70, "acid" = 50)
+ armor = list("melee" = 50, "bullet" = 50, "laser" = 30, "energy" = 25, "bomb" = 50, "bio" = 100, "fire" = 40, "acid" = 50)
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
resistance_flags = FIRE_PROOF | ACID_PROOF
supports_variations = VOX_VARIATION | DIGITIGRADE_VARIATION_NO_NEW_ICON
- slowdown = 0.5
/obj/item/clothing/suit/armor/vest/marine/medium
name = "medium tactical armor vest"
@@ -64,6 +58,11 @@
name = "large tactical armor vest"
icon_state = "marine_heavy"
+/obj/item/clothing/suit/armor/vest/marine/trauma
+ name = "cybersun trauma team armor vest"
+ icon_state = "traumavest"
+ desc = "A set of stamped plasteel armor plates decorated with a medical cross and colors associated with the medical division of Cybersun."
+
/obj/item/clothing/suit/armor/vest/old
name = "degrading armor vest"
desc = "Older generation Type 1 armored vest. Due to degradation over time the vest is far less maneuverable to move in."
@@ -203,6 +202,11 @@
strip_delay = 70
equip_delay_other = 50
+/obj/item/clothing/suit/armor/vest/bulletproof/frontier
+ name = "\improper Frontiersmen bulletproof armor"
+ desc = "A scrap piece of armor made of disused protective plates. This one was used to protect the squishy bits of a Frontiersman, once."
+ icon_state = "frontier_armor"
+
/obj/item/clothing/suit/armor/laserproof
name = "reflector vest"
desc = "A vest that excels in protecting the wearer against energy projectiles, as well as occasionally reflecting them."
@@ -360,6 +364,27 @@
/obj/item/melee/baton,
)
+/obj/item/clothing/suit/armor/roumain
+ name = "saint-roumain duster"
+ desc = "A coat made from hard leather. Meant to withstand long hunts in harsh wilderness."
+ icon_state = "armor_rouma"
+ item_state = "rouma_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ heat_protection = CHEST|GROIN|ARMS
+
+/obj/item/clothing/suit/armor/roumain/shadow
+ name = "saint-roumain shadow duster"
+ desc = "A coat made from hard leather. Its rough, barely-treated finish is typical of one of the Saint-Roumain Militia's trainees."
+ icon_state = "armor_rouma_shadow"
+ item_state = "rouma_shadow_coat"
+
+/obj/item/clothing/suit/armor/hos/roumain/montagne
+ name = "saint-roumain montagne coat"
+ desc = "A stylish red coat to indicate that you are, in fact, a Hunter Montagne. Made of extra hard exotic leather, treated with bullet-resistant materials, and lined with the fur of some unidentifiable creature."
+ icon_state = "armor_rouma_montagne"
+ item_state = "rouma_montagne_coat"
+
/obj/item/clothing/suit/armor/vest/bulletproof/solgov
name = "\improper Sonnensoldner gambison"
desc = "A standard armor vest fielded for SolGov's Sonnensoldners."
@@ -461,6 +486,14 @@
icon_state = "armor_brigphysjacket"
body_parts_covered = CHEST|ARMS
+/obj/item/clothing/suit/armor/frontier
+ name = "reinforced fur coat"
+ desc = "A stiff coat, meant for frigid conditions."
+ icon_state = "frontier_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ heat_protection = CHEST|GROIN|ARMS
+
/obj/item/clothing/suit/toggle/armor/vest/centcom_formal
name = "\improper CentCom formal coat"
desc = "A stylish coat given to CentCom Commanders. Perfect for sending ERTs to suicide missions with style!"
diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm
index b69061cffbd1..f58d445c53f0 100644
--- a/code/modules/clothing/suits/hoodies.dm
+++ b/code/modules/clothing/suits/hoodies.dm
@@ -11,7 +11,6 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter,
/obj/item/radio,
- /obj/item/storage/pill_bottle
)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //it's just a hoodie.
supports_variations = KEPORI_VARIATION
@@ -116,9 +115,3 @@
icon_state = "hoodie_rilena"
item_state = "hoodie_rilena"
-/obj/item/clothing/suit/hooded/hoodie/blackwa
- name = "black and white hoodie"
- desc = "A hoodie that is black, with a white hood. It has a comfy pocket for keeping your hands warm."
- icon_state = "hoodie_bwa"
- item_state = "hoodie_bwa"
- hoodtype = /obj/item/clothing/head/hooded/hood/gray
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 994b4cf7cf6d..79aaf15c4d34 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -114,7 +114,6 @@
item_state = "highvis"
blood_overlay_type = "coat"
body_parts_covered = CHEST|ARMS
- cold_protection = CHEST|GROIN|ARMS
togglename = "zipper"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/radio)
resistance_flags = NONE
@@ -287,10 +286,3 @@
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE|HIDEFACIALHAIR
-/obj/item/clothing/suit/armor/witchhunter
- name = "witchunter garb"
- desc = "This worn outfit saw much use back in the day."
- icon_state = "chaplain_witchhunter"
- item_state = "witchhunter"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/storage/book/bible, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 798a34606bc1..f95a91ab27fe 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -59,15 +59,21 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/toggle/labcoat/raincoat
- name = "translucent labcoat"
- desc = {"A uniquely designed, translucent labcoat. It's made from a special material that actively repels fluids.
+ name = "\improper Cybersun labcoat"
+ desc = {"A translucent, uniquely designed labcoat from Cybersun Solutions. It's made from a special material that actively repels fluids.
You're pretty sure this is just a raincoat.
-Wearing a raincoat inside is like wearing sunglasses at night. A good chemist does both.
+Wearing a raincoat inside is like wearing sunglasses at night. A good Cybersun exec does both.
"}
icon_state = "raincoat"
item_state = "raincoat"
+/obj/item/clothing/suit/toggle/labcoat/roumain_med
+ name = "saint-roumain medical duster"
+ desc = "A coat made from hard leather and further treated with exotic sterilizing oils and wax. The treatment and its more closed design offers much better protection against biological hazards."
+ icon_state = "rouma_med_coat"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
+
/obj/item/clothing/suit/longcoat
name = "longcoat"
desc = "A long, victorian styled labcoat."
diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm
index 5c1bfb47be66..9b141148e5a2 100644
--- a/code/modules/clothing/suits/wintercoats.dm
+++ b/code/modules/clothing/suits/wintercoats.dm
@@ -12,16 +12,14 @@
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo/large
- allowed = list( /obj/item/flashlight,
- /obj/item/tank/internals/emergency_oxygen,
- /obj/item/tank/internals/plasmaman,
- /obj/item/toy,
- /obj/item/storage/fancy/cigarettes,
- /obj/item/lighter,
- /obj/item/radio,
- /obj/item/storage/pill_bottle
- )
+ allowed = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ )
/obj/item/clothing/head/hooded/winterhood
name = "winter hood"
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index f7710d52a12d..76de51b173cd 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -381,13 +381,22 @@
//OONGA BOONGA//
////////////////
-/obj/item/clothing/accessory/bonearmlet
- name = "bone armlet"
- desc = "An armlet made out of animal bone and sinew. According to a common Frontier superstition, it brings good luck to its wearer."
- icon_state = "bone_armlet"
+/obj/item/clothing/accessory/talisman
+ name = "bone talisman"
+ desc = "A hunter's talisman, some say the old gods smile on those who wear it."
+ icon_state = "talisman"
+ armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25)
attachment_slot = ARMS
above_suit = TRUE
+/obj/item/clothing/accessory/wolftalisman
+ name = "hunter's necklace"
+ desc = "A thick necklace woven from sinew and bits of wolfhide, adorned with a carved fang. Slaying such beasts is rumoured to elate the gods of old, and such an item proves your worth."
+ icon_state = "wolf_talisman"
+ armor = list("melee" = 15 , "bullet" = 15, "laser" = 10, "energy" = 10, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 25, "acid" = 25)
+ attachment_slot = CHEST
+ above_suit = TRUE
+
/obj/item/clothing/accessory/skullcodpiece
name = "skull codpiece"
desc = "A legion skull fitted to a codpiece, intended to protect the important things in life."
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 46a1ff275d15..29ee1c732399 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -290,18 +290,18 @@
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
-/obj/item/clothing/under/frontiersmen
+/obj/item/clothing/under/rank/security/officer/frontier
name = "\improper Frontiersmen uniform"
desc = "Worn by members of the Frontiersmen pirate fleet. It's very uncomfortable to move around in."
icon_state = "frontier"
item_state = "gy_suit"
-/obj/item/clothing/under/frontiersmen/officer
+/obj/item/clothing/under/rank/security/officer/frontier/officer
name = "\improper Frontiersmen officer's uniform"
desc = "Worn by officers of the Frontiersmen pirate fleet. It's less comfortable than it looks."
icon_state = "frontier_officer"
-/obj/item/clothing/under/frontiersmen/admiral
+/obj/item/clothing/under/rank/security/officer/frontier/admiral
name = "\improper Frontiersmen admiral's uniform"
desc = "Worn by admirals of the Frontiersmen pirate fleet. It's the only Frontiersman uniform that isn't mass produced."
icon_state = "frontier_admiral"
diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm
index a0ec0a4da5e5..786f2dcd5fa3 100644
--- a/code/modules/clothing/under/suits.dm
+++ b/code/modules/clothing/under/suits.dm
@@ -29,6 +29,7 @@
item_state = "waiter"
/obj/item/clothing/under/suit/waiter/syndicate
+ name = "syndicate waiter's outfit"
icon_state = "waiter_s"
item_state = "waiter_s"
@@ -139,6 +140,12 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD
flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR
+/obj/item/clothing/under/suit/roumain
+ name = "saint-roumain's worksuit"
+ desc = "A simple, hard-wearing suit designed for the hardworking hunters of the Saint-Roumain Militia."
+ icon_state = "rouma_work"
+ item_state = "rouma_work"
+
/obj/item/clothing/under/suit/dresssuit
name = "navy dress-suit"
desc = "A very strange piece of clothing. Mostly navy, but with a pink undershirt. Who would even wear this?"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 2283e6a45b07..85c9996489e2 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -206,7 +206,7 @@
head = /obj/item/clothing/head/helmet/space/syndicate/surplus
mask = /obj/item/clothing/mask/breath
shoes = /obj/item/clothing/shoes/laceup
- r_hand = /obj/item/gun/ballistic/automatic/marksman/ebr
+ r_hand = /obj/item/gun/ballistic/automatic/ebr
gloves = null
l_pocket = /obj/item/pinpointer/nuke/syndicate
r_pocket = /obj/item/ammo_box/magazine/ebr
diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm
index 4213ae91376b..64280475664a 100644
--- a/code/modules/economy/account.dm
+++ b/code/modules/economy/account.dm
@@ -1,23 +1,21 @@
/datum/bank_account
var/account_holder = "Rusty Venture"
var/account_balance = 0
- var/holder_age = 18
var/list/bank_cards = list()
var/add_to_accounts = TRUE
var/account_id
-/datum/bank_account/New(newname, age)
+/datum/bank_account/New(newname, job)
if(add_to_accounts)
SSeconomy.bank_accounts += src
account_holder = newname
- holder_age = age
account_id = rand(111111,999999)
/datum/bank_account/Destroy()
if(add_to_accounts)
SSeconomy.bank_accounts -= src
- for(var/obj/item/card/bank/bank_card as anything in bank_cards)
- bank_card.registered_account = null
+ for(var/obj/item/card/id/id_card as anything in bank_cards)
+ id_card.registered_account = null
SSeconomy.bank_money -= account_balance
return ..()
@@ -51,6 +49,10 @@
return
for(var/obj/A in bank_cards)
var/icon_source = A
+ if(istype(A, /obj/item/card/id))
+ var/obj/item/card/id/id_card = A
+ if(id_card.uses_overlays)
+ icon_source = id_card.get_cached_flat_icon()
var/mob/card_holder = recursive_loc_check(A, /mob)
if(ismob(card_holder)) //If on a mob
if(!card_holder.client || (!(card_holder.client.prefs.chat_toggles & CHAT_BANKCARD) && !force))
diff --git a/code/modules/economy/pay_stand.dm b/code/modules/economy/pay_stand.dm
index 9382a03d062e..af7d9be4b947 100644
--- a/code/modules/economy/pay_stand.dm
+++ b/code/modules/economy/pay_stand.dm
@@ -6,14 +6,14 @@
density = TRUE
anchored = TRUE
var/locked = FALSE
- var/obj/item/card/bank/my_card
+ var/obj/item/card/id/my_card
var/obj/item/assembly/signaler/signaler //attached signaler, let people attach signalers that get activated if the user's transaction limit is achieved.
var/signaler_threshold = 0 //signaler threshold amount
var/amount_deposited = 0 //keep track of the amount deposited over time so you can pay multiple times to reach the signaler threshold
var/force_fee = 0 //replaces the "pay whatever" functionality with a set amount when non-zero.
/obj/machinery/paystand/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/card/bank))
+ if(istype(W, /obj/item/card/id))
if(W == my_card)
if(user.a_intent == INTENT_DISARM)
var/rename_msg = stripped_input(user, "Rename the Paystand:", "Paystand Naming", name)
@@ -31,7 +31,7 @@
to_chat(user, "You [src.locked ? "lock" : "unlock"] the paystand, protecting the bolts from [anchored ? "loosening" : "tightening"].")
return
if(!my_card)
- var/obj/item/card/bank/assistant_mains_need_to_die = W
+ var/obj/item/card/id/assistant_mains_need_to_die = W
if(!assistant_mains_need_to_die.registered_account)
return
var/msg = stripped_input(user, "Name of pay stand:", "Paystand Naming", "[user]'s Awesome Paystand")
@@ -42,7 +42,7 @@
my_card = assistant_mains_need_to_die
to_chat(user, "You link the stand to your account.")
return
- var/obj/item/card/bank/vbucks = W
+ var/obj/item/card/id/vbucks = W
if(vbucks.registered_account)
var/momsdebitcard = 0
if(!force_fee)
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index 4f2c3cd1343a..f474018739d0 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -1,6 +1,6 @@
// Fish path used for autogenerated fish
/obj/item/fish
- name = "generic fish"
+ name = "generic looking aquarium fish"
desc = "very bland"
icon = 'icons/obj/aquarium.dmi'
icon_state = "trout" //Replace this with "bugfish" from tg please
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 4774ea852424..ced086e1dfc6 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -476,15 +476,15 @@ GLOBAL_LIST_INIT(hallucination_list, list(
A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER)
if("taser")
if(side == "right")
- image_file = GUN_RIGHTHAND_ICON
+ image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
else
- image_file = GUN_LEFTHAND_ICON
+ image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
A = image(image_file,H,"advtaserstun4", layer=ABOVE_MOB_LAYER)
if("ebow")
if(side == "right")
- image_file = GUN_RIGHTHAND_ICON
+ image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
else
- image_file = GUN_LEFTHAND_ICON
+ image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
A = image(image_file,H,"crossbow", layer=ABOVE_MOB_LAYER)
if("baton")
if(side == "right")
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 6ffea82fb945..d6a281a2b925 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -221,8 +221,8 @@
// Formatting is the same as food.
/obj/item/reagent_containers/food/drinks/coffee
- name = "Solar's Best black coffee"
- desc = "A cup of piping hot black coffee. Made from beans grown across the solar cantons for the caffeine that every spacer needs."
+ name = "robust coffee"
+ desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon_state = "coffee"
list_reagents = list(/datum/reagent/consumable/coffee = 30)
spillable = TRUE
@@ -258,13 +258,13 @@
icon_state = "tea_empty"
/obj/item/reagent_containers/food/drinks/mug/tea
- name = "Guildmaiden's tea"
- desc = "Dark tea, made from pressed, fermented tea leaves. Originally from Sol, it became wildly popular among the Rachnid Guilds, and has become a staple."
+ name = "Duke Purple tea"
+ desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
list_reagents = list(/datum/reagent/consumable/tea = 30)
/obj/item/reagent_containers/food/drinks/mug/coco
- name = "Solar's Best Hot Cocoa"
- desc = "A cup of hot water mixed with chocolate and malted milk powder. A classic hot drink from the Solarian Confederation."
+ name = "Pearl Hot Chocolate"
+ desc = "A rich delicacy from the humid regions of Terra."
list_reagents = list(/datum/reagent/consumable/hot_coco = 15, /datum/reagent/consumable/sugar = 5)
foodtype = SUGAR
resistance_flags = FREEZE_PROOF
@@ -286,7 +286,7 @@
/obj/item/reagent_containers/food/drinks/dry_ramen
name = "cup ramen"
- desc = "A cup full of dried noodles, premixed with a flavor powder. Adding 5 units of water will cause the cup to self-heat, cooking it rapidly. Commonly eaten under dozens of brands, from students to eating on a budget. Always umami!"
+ desc = "Just add 5ml of water, self heats! A taste that reminds you of your school years. Now new with salty flavour!"
icon_state = "ramen"
list_reagents = list(/datum/reagent/consumable/dry_ramen = 15, /datum/reagent/consumable/sodiumchloride = 3)
foodtype = GRAIN
@@ -294,12 +294,12 @@
custom_price = 95
/obj/item/reagent_containers/food/drinks/waterbottle
- name = "Ryuunosuke Reserve" //we still have to find a way to make multiple variants as per the plan
- desc = "Water bottled from a plant somewhere on Ryuunosuke. It has a mild, mineral-y flavor."
+ name = "bottle of water"
+ desc = "A bottle of water filled at an old Earth bottling facility."
icon = 'icons/obj/drinks/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
- list_reagents = list(/datum/reagent/water = 50)
+ list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard
custom_materials = list(/datum/material/plastic=1000)
volume = 50
amount_per_transfer_from_this = 10
@@ -369,11 +369,11 @@
update_appearance()
/obj/item/reagent_containers/food/drinks/beer
- name = "Bizircan Brewery GDM" //ditto the plan for bottled water, need to find a way to make multiple variants
- desc = "A popular Gezenan drink made of fermented honey and spices, known as Gezenan Dark Mead, or GDM for short."
+ name = "space beer"
+ desc = "Beer. In space."
icon_state = "beer"
list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30)
- foodtype = SUGAR | ALCOHOL
+ foodtype = GRAIN | ALCOHOL
custom_price = 60
/obj/item/reagent_containers/food/drinks/beer/light
@@ -382,8 +382,8 @@
list_reagents = list(/datum/reagent/consumable/ethanol/beer/light = 30)
/obj/item/reagent_containers/food/drinks/ale
- name = "RHIMBASA TAP"
- desc = "An ale that is brewed on Reh'himl, named after the planet that shields it from their sun. Telh'aim Pale Ales are shortened to TAP, with most breweries reducing their names to acronyms alongside it."
+ name = "Magm-Ale"
+ desc = "A true dorf's drink of choice."
icon_state = "alebottle"
item_state = "beer"
list_reagents = list(/datum/reagent/consumable/ethanol/ale = 30)
@@ -454,17 +454,17 @@
if(/datum/reagent/consumable/pineapplejuice)
icon_state = "pineapplebox"
name = "pineapple juice box"
- desc = "Sweet, tart pineapple juice."
+ desc = "Why would you even want this?"
foodtype = FRUIT | PINEAPPLE
if(/datum/reagent/consumable/milk/chocolate_milk)
icon_state = "chocolatebox"
name = "carton of chocolate milk"
- desc = "Milk mixed with chocolate, a common childhood favorite!"
+ desc = "Milk for cool kids!"
foodtype = SUGAR
if(/datum/reagent/consumable/ethanol/eggnog)
icon_state = "nog2"
name = "carton of eggnog"
- desc = "A carton of eggnog, a drink of choice for celebrating Winter Solstice."
+ desc = "For enjoying the most wonderful time of the year."
foodtype = MEAT
else
icon_state = "juicebox"
@@ -511,7 +511,7 @@
/obj/item/reagent_containers/food/drinks/flask
name = "flask"
- desc = "Every good spacer knows it's a good idea to bring along a couple of pints of whiskey wherever they go."
+ desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go."
custom_price = 200
icon_state = "flask"
custom_materials = list(/datum/material/iron=250)
@@ -530,10 +530,10 @@
icon_state = "detflask"
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 30)
-/obj/item/reagent_containers/food/drinks/mug
+/obj/item/reagent_containers/food/drinks/britcup
name = "cup"
- desc = "A mug. Stylishly plain."
- icon_state = "tea_empty"
+ desc = "A cup with the british flag emblazoned on it."
+ icon_state = "britcup"
volume = 30
spillable = TRUE
@@ -643,35 +643,39 @@
. = ..()
/obj/item/reagent_containers/food/drinks/soda_cans/cola
- name = "Master Cola"
- desc = "Originally a commission to the Rachnid culinary guilds from Solarian historical reenactors on creating an authentic cola that, at some point, dominated the globe in popularity, this soft drink comes as close to anyone might be able to taste the sodas of yore... But it's still a pretty alright drink."
+ name = "Space Cola"
+ desc = "Cola. in space."
icon_state = "cola"
list_reagents = list(/datum/reagent/consumable/space_cola = 30)
foodtype = SUGAR
/obj/item/reagent_containers/food/drinks/soda_cans/tonic
- name = "Sixikirtchia's Tonic"
- desc = "A can of water mixed with quinine, which the label purportedly states that it has more health benefits for the Vox than fending off malaria. Most people use it for mixing drinks, Vox or otherwise."
+ name = "T-Borg's tonic water"
+ desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
icon_state = "tonic"
list_reagents = list(/datum/reagent/consumable/tonic = 50)
foodtype = ALCOHOL
/obj/item/reagent_containers/food/drinks/soda_cans/sodawater
- name = "Stitiamix Club"
- desc = "Mineral-flavored carbonated water, infused on some part of The Shoal. Touts being made out of minerals from embedded asteroids, apparently!"
+ name = "soda water"
+ desc = "A can of soda water. Why not make a scotch and soda?"
icon_state = "sodawater"
list_reagents = list(/datum/reagent/consumable/sodawater = 50)
-/obj/item/reagent_containers/food/drinks/soda_cans/orange_soda
- name = "Sol Sparkler: Orange Remembrance"
- desc = "A line of flavored seltzer water from the Solarian Confederation. Its infamy stems from being flavored sparingly enough to warrant it being referred to as being vague memories of the fruit in question."
- icon_state = "orange_soda"
- list_reagents = list(/datum/reagent/consumable/orangejuice = 5, /datum/reagent/consumable/sodawater = 25)
+/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime
+ name = "orange soda"
+ desc = "You wanted ORANGE. It gave you Lemon Lime."
+ icon_state = "lemon-lime"
+ list_reagents = list(/datum/reagent/consumable/lemon_lime = 30)
foodtype = FRUIT
+/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize()
+ . = ..()
+ name = "lemon-lime soda"
+
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry
name = "Sol Dry"
- desc = "A can of ginger ale, known for helping those with upset stomachs. Popularized due to a widespread belief from Solarians that drinking it will alleviate the nausea from bluespace travel."
+ desc = "Maybe this will help your tummy feel better. Maybe not."
icon_state = "sol_dry"
list_reagents = list(/datum/reagent/consumable/sol_dry = 30)
foodtype = SUGAR
@@ -683,79 +687,86 @@
list_reagents = list(/datum/reagent/consumable/space_up = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/lunapunch
- name = "Lunapunch"
- desc = "A soda with a distinctly herbal sweetness and a bitter aftertaste, popular across the C.L.I.P. colonies. Originally marketed as a health soft-drink for members of the CMM, the herbs used in its recipe claim to have health benefits... to dubious results."
- icon_state = "lunapunch"
- list_reagents = list(/datum/reagent/consumable/lunapunch = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/starkist
+ name = "Star-kist"
+ desc = "The taste of a star in liquid form. And, a bit of tuna...?"
+ icon_state = "starkist"
+ list_reagents = list(/datum/reagent/consumable/space_cola = 15, /datum/reagent/consumable/orangejuice = 15)
foodtype = SUGAR | FRUIT | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/comet_trail
- name = "Comet Trail"
- desc = "A citrusy drink from the Kepori space installation known as The Ring. Known for its sharp flavor and refreshing carbonation -- best served cold."
- icon_state = "comet_trail"
- list_reagents = list(/datum/reagent/consumable/comet_trail = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind
+ name = "Space Mountain Wind"
+ desc = "Blows right through you like a space wind."
+ icon_state = "space_mountain_wind"
+ list_reagents = list(/datum/reagent/consumable/spacemountainwind = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/vimukti
- name = "Vimukti"
- desc = "A liquor brewed from sweet lichen scraped off the walls of Shoal water condensers. Stamped with the thirteen-spoked wheel of enlightenment. Spiritual Vox consider it to open the mind's boundaries."
+/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko
+ name = "Thirteen Loko"
+ desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkenness, or even death. Please Drink Responsibly."
icon_state = "thirteen_loko"
- list_reagents = list(/datum/reagent/consumable/ethanol/vimukti = 30)
+ list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/tadrixx
- name = "Tadrixx"
- desc = "A Kalixcian drink made from a plant that tastes similar to sassafrass, which is used in root beer. A stumpy drake holding a mug of it is on the front."
- icon_state = "tadrixx"
- list_reagents = list(/datum/reagent/consumable/tadrixx = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb
+ name = "Dr. Gibb"
+ desc = "A delicious mixture of 42 different flavors."
+ icon_state = "dr_gibb"
+ list_reagents = list(/datum/reagent/consumable/dr_gibb = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/pacfuel
- name = "PAC-Fuel"
- desc = "A carbonated energy drink themed after the purple coloration, similar to plasma. It seems to have gotten a sponsorship with the the G.E.C., with a special offer for some sort of deal on... gaming gear and industrial equipment?"
+/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game
+ name = "Pwr Game"
+ desc = "The only drink with the PWR that true gamers crave. When a gamer talks about gamerfuel, this is what they're literally referring to."
icon_state = "purple_can"
- list_reagents = list(/datum/reagent/consumable/pacfuel = 30)
+ list_reagents = list(/datum/reagent/consumable/pwr_game = 30)
-/obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch
- name = "Shoal Punch"
- desc = "Carbonated fruit soda, made from a mix of dozens of fruits collected and grown on The Shoal. There's an extensive list of potential allergens on the back."
- icon_state = "shoal_punch"
- list_reagents = list(/datum/reagent/consumable/shoal_punch = 30)
+/obj/item/reagent_containers/food/drinks/soda_cans/shamblers
+ name = "Shambler's juice"
+ desc = "~Shake me up some of that Shambler's Juice!~"
+ icon_state = "shamblers"
+ list_reagents = list(/datum/reagent/consumable/shamblers = 30)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/crosstalk
- name = "Crosstalk"
- desc = "Crosstalk! Share the energy with everyone! The can is a little thin to be passing it around to actually share the energy drink around, though."
+/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
+ name = "Grey Bull"
+ desc = "Grey Bull, it gives you gloves!"
icon_state = "energy_drink"
- list_reagents = list(/datum/reagent/consumable/crosstalk = 20)
+ list_reagents = list(/datum/reagent/consumable/grey_bull = 20)
foodtype = SUGAR | JUNKFOOD
-/obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy
- name = "Xeno-Energy"
- desc = "A sickly green energy drink that poses itself as made from the real blood of xenomorphs. Deeply controversial among the BARD ranks."
- icon_state = "xeno_energy"
- item_state = "xeno_energy"
- list_reagents = list(/datum/reagent/consumable/xeno_energy = 40, /datum/reagent/consumable/electrolytes = 10)
+/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy
+ name = "Monkey Energy"
+ desc = "Unleash the ape!"
+ icon_state = "monkey_energy"
+ item_state = "monkey_energy"
+ list_reagents = list(/datum/reagent/consumable/monkey_energy = 40, /datum/reagent/consumable/electrolytes = 10)
foodtype = SUGAR | JUNKFOOD
+/obj/item/reagent_containers/food/drinks/soda_cans/efuel
+ name = "E-Fuel"
+ desc = "Shocking for the Elzu!"
+ icon_state = "monkey_energy"
+ item_state = "monkey_energy"
+ list_reagents = list(/datum/reagent/consumable/electrolytes = 50)
+
/obj/item/reagent_containers/food/drinks/soda_cans/air
- name = "Tradewind Canned"
- desc = "Intended to be filled with air from home planets for the sake of nostalgia after it's initial failure as an emergency method of 'canning air'. Tradewind Canned - a breath from home."
+ name = "canned air"
+ desc = "There is no air shortage. Do not drink."
icon_state = "air"
list_reagents = list(/datum/reagent/nitrogen = 24, /datum/reagent/oxygen = 6)
/obj/item/reagent_containers/food/drinks/soda_cans/molten
name = "Molten Bubbles"
- desc = "A spicy soft drink made from a coca-like plant from Kalixcis. Popularly served both cold -and- hot, depending on the weather."
+ desc = "A spicy cola to cool the nerves and burn the soul."
icon_state = "molten"
- list_reagents = list(/datum/reagent/consumable/molten = 50)
+ list_reagents = list(/datum/reagent/medicine/molten_bubbles = 50)
/obj/item/reagent_containers/food/drinks/soda_cans/plasma
name = "Plasma Fizz"
- desc = "A spinoff of the popular Molten Bubbles drink from Kalixcis, made to emulate the flavor of spiced grape instead. It's... not exactly convincing or a very good mix."
+ desc = "A dangerous fusion of flavors!"
icon_state = "plasma"
- list_reagents = list(/datum/reagent/consumable/molten/plasma_fizz = 50)
+ list_reagents = list(/datum/reagent/medicine/molten_bubbles/plasma = 50)
/obj/item/reagent_containers/food/drinks/ration
name = "empty ration pouch"
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 785607cdef67..c19fd9dd3baa 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -124,20 +124,20 @@
AddComponent(/datum/component/butchering, 200, 55)
/obj/item/reagent_containers/food/drinks/bottle/gin
- name = "Neue Wacholder Gin"
- desc = "A bottle of high quality gin, cultivated from juniper berries grown across the Solar cantons. Brewed in Stuteföhle."
+ name = "Griffeater gin"
+ desc = "A bottle of high quality gin, produced in the New London Space Station."
icon_state = "ginbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/gin = 100)
/obj/item/reagent_containers/food/drinks/bottle/whiskey
- name = "Kadi-Witka Reserve"
- desc = "An equivalent to single-malt whiskey, commonly enjoyed and brewed in a brewery originally founded Zohil. While different from traditionally used wheat, it can be safely enjoyed by every species."
+ name = "Uncle Git's special reserve"
+ desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
icon_state = "whiskeybottle"
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 100)
/obj/item/reagent_containers/food/drinks/bottle/kong
name = "Kong"
- desc = "Makes You Go Ape!"
+ desc = "Makes You Go Ape!®"
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey/kong = 100)
/obj/item/reagent_containers/food/drinks/bottle/candycornliquor
@@ -146,8 +146,8 @@
list_reagents = list(/datum/reagent/consumable/ethanol/whiskey/candycorn = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka
- name = "Triple Horned"
- desc = "Potato-based liquor commonly known as Vodka, distilled thrice to the standards of the PGF's requirements for their rations."
+ name = "Tunguska triple distilled"
+ desc = "Vodka, prime choice of drink and fuel."
icon_state = "vodkabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100)
@@ -158,8 +158,8 @@
list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100)
/obj/item/reagent_containers/food/drinks/bottle/tequila
- name = "Rimeki Letisa"
- desc = "Originally made from fermented succulents growing near Teceti's equator-deserts, this brand considers itself equivalent to the original tequila."
+ name = "Caccavo guaranteed quality tequila"
+ desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!"
icon_state = "tequilabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/tequila = 100)
@@ -173,19 +173,19 @@
/obj/item/reagent_containers/food/drinks/bottle/patron
name = "Wrapp Artiste Patron"
- desc = "Tequila laced with silver, showy enough to impress when ordered in nightclubs across the galaxy."
+ desc = "Silver laced tequila, served in space night clubs across the galaxy."
icon_state = "patronbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/patron = 100)
/obj/item/reagent_containers/food/drinks/bottle/rum
- name = "Ahkskra Spiced"
- desc = "Ahkskra Spiced - a spiced rum for the vox folkhero in everyone. Features a gallant-looking vox on the front of the bottle."
+ name = "Captain Pete's Cuban spiced rum"
+ desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
icon_state = "rumbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/rum = 100)
/obj/item/reagent_containers/food/drinks/bottle/holywater
name = "flask of holy water"
- desc = "A flask of water, sanctified in some way by the supertitious."
+ desc = "A flask of the chaplain's holy water."
icon_state = "holyflask"
list_reagents = list(/datum/reagent/water/holywater = 100)
foodtype = NONE
@@ -195,108 +195,144 @@
list_reagents = list(/datum/reagent/hellwater = 100)
/obj/item/reagent_containers/food/drinks/bottle/vermouth
- name = "Whitespear Dry"
- desc = "Dry and sweet vermouth, commonly used for mixed drinks. Some Solarians drink it as a digestive before meals."
+ name = "Goldeneye vermouth"
+ desc = "Sweet, sweet dryness~"
icon_state = "vermouthbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/vermouth = 100)
/obj/item/reagent_containers/food/drinks/bottle/kahlua
- name = "Keh'Lu'Tex Liqueur"
- desc = "An adapted recipe of a caffeine-mixed liqueur originating from Reh'himl, which replaces its original ingredient with coffee from Terra."
+ name = "Robert Robust's coffee liqueur"
+ desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
icon_state = "kahluabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 100)
- foodtype = SUGAR | ALCOHOL //it's coffee and rum .
+ foodtype = VEGETABLES
/obj/item/reagent_containers/food/drinks/bottle/goldschlager
- name = "Student-Union's Gold Standard"
- desc = "Extremely high-proof cinnamon schnapps, typically found in commemorative bottles by those in the Student-Union Association of Naturalistic Sciences. Nigh-undrinkable and with a tasteless amount of gold flakes floating within."
+ name = "College Girl goldschlager"
+ desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps."
icon_state = "goldschlagerbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/goldschlager = 100)
/obj/item/reagent_containers/food/drinks/bottle/cognac
- name = "Geheimnis Cognac"
- desc = "While the origins of the name 'cognac' are lost to time, this type of brandy is reserved as a high-class drink with particular methods of brewing."
+ name = "Chateau de Baton premium cognac"
+ desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
icon_state = "cognacbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/cognac = 100)
/obj/item/reagent_containers/food/drinks/bottle/wine
- name = "Waldstätte Sauvignon"
- desc = "A bottle of wine, brewed from grapes specifically grown in Neue Waldstätte. You've mostly seen these in bottles sold specifically for tourists."
+ name = "Doublebeard's bearded special wine"
+ desc = "A faint aura of unease and asspainery surrounds the bottle."
icon_state = "winebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/wine = 100)
foodtype = FRUIT | ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/absinthe
- name = "Severtail Green"
- desc = "Strong absinthe brewed in the Pan-Gezenan Federation, with their own transplants of Wormwood gifted to them during the first contact with humankind. If the legend (and label) means anything, the first attempt at brewing this caused some poor sarathi's tail to fall off."
+ name = "extra-strong absinthe"
+ desc = "An strong alcoholic drink brewed and distributed by"
icon_state = "absinthebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 100)
+/obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize()
+ . = ..()
+ redact()
+
+/obj/item/reagent_containers/food/drinks/bottle/absinthe/proc/redact()
+ // There was a large fight in the coderbus about a player reference
+ // in absinthe. Ergo, this is why the name generation is now so
+ // complicated. Judge us kindly.
+ var/shortname = pickweight(
+ list("T&T" = 1, "A&A" = 1, "Generic" = 1))
+ var/fullname
+ switch(shortname)
+ if("T&T")
+ fullname = "Teal and Tealer"
+ if("A&A")
+ fullname = "Ash and Asher"
+ if("Generic")
+ fullname = "Nanotrasen Cheap Imitations"
+ var/removals = list("\[REDACTED\]", "\[EXPLETIVE DELETED\]",
+ "\[EXPUNGED\]", "\[INFORMATION ABOVE YOUR SECURITY CLEARANCE\]",
+ "\[MOVE ALONG CITIZEN\]", "\[NOTHING TO SEE HERE\]")
+ var/chance = 50
+
+ if(prob(chance))
+ shortname = pick_n_take(removals)
+
+ var/list/final_fullname = list()
+ for(var/word in splittext(fullname, " "))
+ if(prob(chance))
+ word = pick_n_take(removals)
+ final_fullname += word
+
+ fullname = jointext(final_fullname, " ")
+
+ // Actually finally setting the new name and desc
+ name = "[shortname] [name]"
+ desc = "[desc] [fullname] Inc."
+
+
/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium
- name = "Chacheyi Gold"
- desc = "A higher shelf absinthe, distributed primarily from The Shoal. Features the folkhero Chacheyi on the label, alongside their goldgrub companions."
+ name = "Gwyn's premium absinthe"
+ desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs."
icon_state = "absinthepremium"
+/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium/redact()
+ return
+
/obj/item/reagent_containers/food/drinks/bottle/lizardwine
- name = "bottle of Blueflame Pyrecask"
- desc = "An alcoholic beverage originating from isolated vineyards on Zohil, maintained by the reclusive religious sects of the Blueflame. Now considered so popular and high quality, imitation bottles can be found everywhere. Check the label for point of origin."
+ name = "bottle of 'kalixcis' wine"
+ desc = "An alcoholic beverage of sarathi origin, now so widespread that knock-offs can be found everywhere. Check the label for point of origin."
icon_state = "lizardwine"
list_reagents = list(/datum/reagent/consumable/ethanol/lizardwine = 100)
foodtype = FRUIT | ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/hcider
- name = "Neue Hamburg Spiced"
- desc = "One of the main exports of Neue Hamburg - hard, spiced cider. Enjoyed all across the cantons and beyond."
+ name = "Jian Hard Cider"
+ desc = "Apple juice for adults."
icon_state = "hcider"
volume = 50
list_reagents = list(/datum/reagent/consumable/ethanol/hcider = 50)
/obj/item/reagent_containers/food/drinks/bottle/amaretto
- name = "Lu'Ni'Xer'Nan Amaretto"
- desc = "A popular Rachnid take on the recipe for Amaretto, which fell to obscurity after only being semi-rediscovered by Solarian historians. Features a semi-reconstructed depiction of a supposed origin story, with the painter Lu'Ni'Xer'Nan and her muse, an innkeeper."
+ name = "Luini Amaretto"
+ desc = "A gentle and syrup like drink, tastes of almonds and apricots"
icon_state = "disaronno"
list_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 100)
/obj/item/reagent_containers/food/drinks/bottle/grappa
- name = "Neue Maynila Grappamiel"
- desc = "A bottle of Grappa, premixed with honey-based spirits. Commonly seen as a drink for recycling grapes after their use in winemaking, and commonly seen as a winter drink."
+ name = "Phillipes well-aged Grappa"
+ desc = "Bottle of Grappa."
icon_state = "grappabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/grappa = 100)
/obj/item/reagent_containers/food/drinks/bottle/sake
- name = "Sakamai Sake"
- desc = "An alcoholic drink derived from rice, rediscovered by Solarian historians and reintroduced to the best of their ability to reproduce it."
+ name = "Ryo's traditional sake"
+ desc = "Sweet as can be, and burns like fire going down."
icon_state = "sakebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/sake = 100)
/obj/item/reagent_containers/food/drinks/bottle/sake/Initialize()
. = ..()
if(prob(10))
- name = "Fluffy Tail"
- desc += "This particular brand's mascot is a human with nine fox tails - which is an impressive amount of genemodding."
+ name = "Fluffy Tail Sake"
+ desc += " On the bottle is a picture of a kitsune with nine touchable tails."
icon_state = "sakebottle_k"
else if(prob(10))
name = "Inubashiri's Home Brew"
- desc += "This particular brand's mascot is a human with vaguely canine ears and a tail."
+ desc += " Awoo."
icon_state = "sakebottle_i"
/obj/item/reagent_containers/food/drinks/bottle/fernet
name = "Fernet Bronca"
- desc = "A bitter and aromatic drink, commonly enjoyed in the intersolar cantons due to relaxed alcoholic tariffs from being technically classified as a medicinal beverage. Commonly mixed with cola-based soft drinks."
+ desc = "A bottle of pure Fernet Bronca, produced in Cordoba Space Station"
icon_state = "fernetbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/fernet = 100)
-/obj/item/reagent_containers/food/drinks/bottle/triplesec
- name = "Teeka-Gih's triple sec liqueur"
- desc = "A bottle of triple sec originating from Bezuts."
- icon_state = "triplesecbottle"
- list_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 100)
-
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
name = "orange juice"
- desc = "Sweet and tart orange juice. Usually found fortified to make it more nutritious. Full of vitamin C!"
+ desc = "Full of vitamins and deliciousness!"
custom_price = 100
icon_state = "orangejuice"
item_state = "carton"
@@ -306,21 +342,9 @@
list_reagents = list(/datum/reagent/consumable/orangejuice = 100)
foodtype = FRUIT | BREAKFAST
-/obj/item/reagent_containers/food/drinks/bottle/lemonjuice
- name = "lemon juice"
- desc = "Lemonade for everyone!"
- custom_price = 100
- icon_state = "lemonjuice"
- item_state = "carton"
- lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
- isGlass = FALSE
- list_reagents = list(/datum/reagent/consumable/lemonjuice = 100)
- foodtype = FRUIT
-
/obj/item/reagent_containers/food/drinks/bottle/cream
name = "milk cream"
- desc = "Cream made from milk. It's thicker than milk, which hopefully prevents any mixups."
+ desc = "It's cream. Made from milk. What else did you think you'd find in there?"
custom_price = 100
icon_state = "cream"
item_state = "carton"
@@ -332,7 +356,7 @@
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
name = "tomato juice"
- desc = "Juice from tomatoes and salt. You'll often find some technicians soaking in this if they've been working with plasma."
+ desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
custom_price = 100
icon_state = "tomatojuice"
item_state = "carton"
@@ -344,7 +368,7 @@
/obj/item/reagent_containers/food/drinks/bottle/limejuice
name = "lime juice"
- desc = "Lime juice. You might want to mix something with this instead of drinking it straight..."
+ desc = "Sweet-sour goodness."
custom_price = 100
icon_state = "limejuice"
item_state = "carton"
@@ -356,7 +380,7 @@
/obj/item/reagent_containers/food/drinks/bottle/pineapplejuice
name = "pineapple juice"
- desc = "Tart, sweet juice from the tropical pineapple."
+ desc = "Extremely tart, yellow juice."
custom_price = 100
icon_state = "pineapplejuice"
item_state = "carton"
@@ -379,8 +403,8 @@
list_reagents = list(/datum/reagent/consumable/menthol = 100)
/obj/item/reagent_containers/food/drinks/bottle/grenadine
- name = "Three-Star Grenadine"
- desc = "A commonly seen bottle of grenadine - or sweet fruit syrup. It might even contain real cherries, as well as some blackcurrant for color."
+ name = "Jester Grenadine"
+ desc = "Contains 0% real cherries!"
custom_price = 100
icon_state = "grenadine"
isGlass = TRUE
@@ -389,8 +413,8 @@
/obj/item/reagent_containers/food/drinks/bottle/applejack
- name = "Mars Lightning"
- desc = "A strong brandy originating from apples, considered the older sibling to hard cider. Mars Lightning is often partnered with anti-gravity racing companies, leading to it often being served straight or for impromptu mixes."
+ name = "Buckin' Bronco's Applejack"
+ desc = "Kicks like a horse, tastes like an apple!"
custom_price = 100
icon_state = "applejack_bottle"
isGlass = TRUE
@@ -398,22 +422,22 @@
foodtype = FRUIT
/obj/item/reagent_containers/food/drinks/bottle/champagne
- name = "Treu Champagne"
- desc = "Finely sourced from entire canton planets dedicated to faithful reproduction of pre-Night Of Fire vineyards. Typically enjoyed for celebrations and the turn of new years."
+ name = "Eau d' Dandy Brut Champagne"
+ desc = "Finely sourced from only the most pretentious French vineyards."
custom_premium_price = 250
icon_state = "champagne_bottle"
isGlass = TRUE
list_reagents = list(/datum/reagent/consumable/ethanol/champagne = 100)
/obj/item/reagent_containers/food/drinks/bottle/blazaam
- name = "Hyperspace Highball"
- desc = "Infamously expensive, infamously contains bluespace 'flakes' for bragging rights, and infamously removed from most shelves due to accidents involving teleportation accidents upon ingestion."
+ name = "Ginbad's Blazaam"
+ desc = "You feel like you should give the bottle a good rub before opening."
icon_state = "blazaambottle"
list_reagents = list(/datum/reagent/consumable/ethanol/blazaam = 100)
/obj/item/reagent_containers/food/drinks/bottle/trappist
- name = "Roumain Trapper's"
- desc = "Traditionally (and heavily monitored for authenticity) made beer brewed on Illestren. Trapper's beer must be brewed by Saint Roumain Hunters or Shadows, made to fit the needs of their community first, and must never be made for profit... which makes it a common sight in the Frontier."
+ name = "Mont de Requin Trappistes Bleu"
+ desc = "Brewed in space-Belgium. Fancy!"
custom_premium_price = 170
icon_state = "trappistbottle"
volume = 50
@@ -421,41 +445,27 @@
/obj/item/reagent_containers/food/drinks/bottle/hooch
name = "hooch bottle"
- desc = "A bottle of homebrewed, low quality alcohol. The paper wrapping is covered in little signatures and messages - how many hands have passed this bottle before you came around?"
+ desc = "A bottle of rotgut. Its owner has applied some street wisdom to cleverly disguise it as a brown paper bag."
icon_state = "hoochbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/hooch = 100)
/obj/item/reagent_containers/food/drinks/bottle/moonshine
name = "moonshine jug"
- desc = "High-proof hard liquor, most likely made in the privacy of a bootlegger's ship. Permanent marker on packaging tape is the most you'll get for a label. Remember: if it doesn't burn blue, don't drink it!"
+ desc = "It is said that the ancient Applalacians used these stoneware jugs to capture lightning in a bottle."
icon_state = "moonshinebottle"
list_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 100)
/obj/item/reagent_containers/food/drinks/bottle/coconut
- name = "T4l1's Pure Coconut Delight"
- desc = "A fanmade, promotional bottle of coconut cream liquor. There's a stylized picture of a synthetic kepori on the side, along with a blurb about whoever she is. You're pretty certain this stuff is synthetic, despite Teceti growing actual coconut trees..." //if i have to recognize rilena here, I'm going to have fun with it
+ name = "Tali's Pure Coconut Delight"
+ desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
icon_state = "coconutbottle"
list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 100)
isGlass = TRUE
-/obj/item/reagent_containers/food/drinks/bottle/cacao
- name = "Sharai's Pure Cacao Delight"
- desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
- icon_state = "cacaobottle"
- list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_cacao = 100)
- isGlass = TRUE
-
-/obj/item/reagent_containers/food/drinks/bottle/menthe
- name = "Mora's Pure Mint Delight"
- desc = "Seems to be some promotional product for a Teceti video game. You're pretty certain this stuff is synthetic."
- icon_state = "mintbottle"
- list_reagents = list(/datum/reagent/consumable/ethanol/creme_de_menthe = 100)
- isGlass = TRUE
-
////////////////////////// MOLOTOV ///////////////////////
/obj/item/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 desperate militias and revolutionaries. Light and toss."
+ 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/active = 0
@@ -515,7 +525,7 @@
/obj/item/reagent_containers/food/drinks/bottle/pruno
name = "pruno mix"
- desc = "A trash bag filled with fruit, sugar, yeast, and water, pulped together into a pungent slurry to be fermented in an enclosed space, traditionally the toilet."
+ desc = "A trash bag filled with fruit, sugar, yeast, and water, pulped together into a pungent slurry to be fermented in an enclosed space, traditionally the toilet. Security would love to confiscate this, one of the many things wrong with them."
icon = 'icons/obj/janitor.dmi'
icon_state = "trashbag"
list_reagents = list(/datum/reagent/consumable/prunomix = 50)
@@ -559,7 +569,7 @@
else
reagents.add_reagent(/datum/reagent/consumable/ethanol/pruno, 50)
name = "bag of pruno"
- desc = "Fermented prison wine made from fruit, sugar, and despair."
+ desc = "Fermented prison wine made from fruit, sugar, and despair. You probably shouldn't drink this around Security."
icon_state = "trashbag1" // pruno releases air as it ferments, we don't want to simulate this in atmos, but we can make it look like it did
for (var/mob/living/M in view(2, get_turf(src))) // letting people and/or narcs know when the pruno is done
to_chat(M, "A pungent smell emanates from [src], like fruit puking out its guts.")
@@ -567,7 +577,7 @@
/obj/item/reagent_containers/food/drinks/colocup/lean
name = "lean"
- desc = "Despite this mix of codeine-based cough syrup and a soft drink of choice being popular online, you're not sure anyone talking about ever tried it. First time for everything?"
+ desc = "A cup of that purple drank, the stuff that makes you go WHEEZY BABY."
icon_state = "lean"
list_reagents = list(/datum/reagent/consumable/lean = 50)
random_sprite = FALSE
@@ -577,7 +587,7 @@
desc = "Sealed for a guaranteed fresh taste in every bottle."
icon_state = "sandbottle"
volume = 50
- list_reagents = list(/datum/reagent/consumable/molten/sand = 50)
+ list_reagents = list(/datum/reagent/medicine/molten_bubbles/sand = 50)
reagent_flags = null //Cap's on
/obj/item/reagent_containers/food/drinks/bottle/sarsaparilla/attack_self(mob/user)
@@ -618,10 +628,6 @@
custom_materials = list(/datum/material/wood = 800)
w_class = WEIGHT_CLASS_BULKY
var/sealed = FALSE
- var/max_bottles = 6
- var/list/valid_bottles = list(/obj/item/reagent_containers/food/drinks/beer,
- /obj/item/reagent_containers/food/drinks/ale,
- /obj/item/reagent_containers/food/drinks/bottle)
/obj/item/storage/bottles/Initialize()
. = ..()
@@ -632,8 +638,12 @@
var/datum/component/storage/S = GetComponent(/datum/component/storage)
S.max_w_class = WEIGHT_CLASS_NORMAL
S.max_combined_w_class = 16
- S.max_items = max_bottles
- S.set_holdable(valid_bottles)
+ S.max_items = 6
+ S.set_holdable(list(
+ /obj/item/reagent_containers/food/drinks/beer,
+ /obj/item/reagent_containers/food/drinks/ale,
+ /obj/item/reagent_containers/food/drinks/bottle
+ ))
S.locked = sealed
/obj/item/storage/bottles/update_icon_state()
@@ -652,7 +662,7 @@
. = ..()
if(sealed)
var/datum/component/storage/S = GetComponent(/datum/component/storage)
- user.visible_message("[user] pries open \the [src].", "You pry open \the [src]")
+ user.visible_message("[user] prys open \the [src].", "You pry open \the [src]")
playsound(src, 'sound/machines/wooden_closet_close.ogg', 20, 1)
sealed = FALSE
S.locked = FALSE
@@ -662,23 +672,9 @@
/obj/item/storage/bottles/sandblast
name = "sarsaparilla bottle crate"
- desc = "Holds six bottles of the finest sarsaparilla this side of the Frontier."
+ desc = "Holds six bottles of the finest sarsaparilla this side of the sector."
sealed = TRUE
/obj/item/storage/bottles/sandblast/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/reagent_containers/food/drinks/bottle/sarsaparilla(src)
-
-/obj/item/storage/bottles/moonshine
- name = "moonshine bottle crate"
- desc = "Holds four bottles of the strongest hooch this side of the Frontier."
- icon_state = "hoochcrate"
- max_bottles = 4
- valid_bottles = list(/obj/item/reagent_containers/food/drinks/bottle/moonshine)
-
-/obj/item/storage/bottles/moonshine/PopulateContents()
- for(var/i in 1 to 4)
- new /obj/item/reagent_containers/food/drinks/bottle/moonshine(src)
-
-/obj/item/storage/bottles/moonshine/sealed
- sealed = TRUE
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 2f73f7678e38..1d7adb7db4f2 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -100,6 +100,10 @@
name = "Space Cola"
list_reagents = list(/datum/reagent/consumable/space_cola = 50)
+/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola
+ name = "Nuka Cola"
+ list_reagents = list(/datum/reagent/consumable/nuka_cola = 50)
+
/obj/item/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers/food/snacks/egg)) //breaking eggs
var/obj/item/reagent_containers/food/snacks/egg/E = I
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 3147ee9a5de4..c4daa88869a7 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -24,7 +24,7 @@
/obj/item/reagent_containers/food/snacks/customizable/examine(mob/user)
. = ..()
var/ingredients_listed = ""
- for(var/obj/item/ING in ingredients)
+ for(var/obj/item/reagent_containers/food/snacks/ING in ingredients)
ingredients_listed += "[ING.name], "
var/size = "standard"
if(ingredients.len<2)
@@ -36,39 +36,31 @@
. += "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)]."
/obj/item/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/reagent_containers/food/snacks/customizable))
- return
- var/datum/component/edible/E = I.GetComponent(/datum/component/edible)
- var/obj/item/reagent_containers/food/snacks/S = I
- if(istype(S) || E)
+ if(!istype(I, /obj/item/reagent_containers/food/snacks/customizable) && istype(I, /obj/item/reagent_containers/food/snacks))
+ var/obj/item/reagent_containers/food/snacks/S = I
if(I.w_class > WEIGHT_CLASS_SMALL)
to_chat(user, "The ingredient is too big for [src]!")
else if((ingredients.len >= ingMax) || (reagents.total_volume >= volume))
to_chat(user, "You can't add more ingredients to [src]!")
- else if(istype(I, /obj/item/reagent_containers/food/snacks/pizzaslice/custom))
+ else if(istype(I, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(I, /obj/item/reagent_containers/food/snacks/cakeslice/custom))
to_chat(user, "Adding [I.name] to [src] would make a mess.")
else
if(!user.transferItemToLoc(I, src))
return
- ingredients += I
- I.reagents.trans_to(src,min(S.reagents.total_volume, 15), transfered_by = user) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume.
- if(istype(S))
- if(S.trash)
- S.generate_trash(get_turf(user))
- mix_filling_color(S.filling_color)
- foodtype |= S.foodtype
- update_customizable_overlays(S.filling_color)
- else
- mix_filling_color(E.filling_color)
- foodtype |= E.foodtypes
- update_customizable_overlays(E.filling_color)
+ if(S.trash)
+ S.generate_trash(get_turf(user))
+ ingredients += S
+ mix_filling_color(S)
+ S.reagents.trans_to(src,min(S.reagents.total_volume, 15), transfered_by = user) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume.
+ foodtype |= S.foodtype
+ update_customizable_overlays(S)
to_chat(user, "You add the [I.name] to the [name].")
- update_food_name(I)
+ update_food_name(S)
else
. = ..()
-/obj/item/reagent_containers/food/snacks/customizable/proc/update_food_name(obj/item/S)
+/obj/item/reagent_containers/food/snacks/customizable/proc/update_food_name(obj/item/reagent_containers/food/snacks/S)
for(var/obj/item/I in ingredients)
if(!istype(S, I.type))
customname = "custom"
@@ -96,25 +88,25 @@
attackby(I, user)
qdel(BASE)
-/obj/item/reagent_containers/food/snacks/customizable/proc/mix_filling_color(newcolor)
+/obj/item/reagent_containers/food/snacks/customizable/proc/mix_filling_color(obj/item/reagent_containers/food/snacks/S)
if(ingredients.len == 1)
- filling_color = newcolor
+ filling_color = S.filling_color
else
var/list/rgbcolor = list(0,0,0,0)
var/customcolor = GetColors(filling_color)
- var/ingcolor = GetColors(newcolor)
+ var/ingcolor = GetColors(S.filling_color)
rgbcolor[1] = (customcolor[1]+ingcolor[1])/2
rgbcolor[2] = (customcolor[2]+ingcolor[2])/2
rgbcolor[3] = (customcolor[3]+ingcolor[3])/2
rgbcolor[4] = (customcolor[4]+ingcolor[4])/2
filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4])
-/obj/item/reagent_containers/food/snacks/customizable/update_customizable_overlays(filling_color = "#FFFFFF")
+/obj/item/reagent_containers/food/snacks/customizable/update_customizable_overlays(obj/item/reagent_containers/food/snacks/S)
var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling")
- if(filling_color == "#FFFFFF")
+ if(S.filling_color == "#FFFFFF")
filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00")
else
- filling.color = filling_color
+ filling.color = S.filling_color
switch(ingredients_placement)
if(INGREDIENTS_SCATTER)
@@ -170,6 +162,26 @@
foodtype = GRAIN
+/obj/item/reagent_containers/food/snacks/customizable/bread
+ name = "bread"
+ ingMax = 6
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/custom
+ slices_num = 5
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "tofubread"
+ foodtype = GRAIN
+
+
+/obj/item/reagent_containers/food/snacks/customizable/cake
+ name = "cake"
+ ingMax = 6
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/custom
+ slices_num = 5
+ icon = 'icons/obj/food/piecake.dmi'
+ icon_state = "plaincake"
+ foodtype = GRAIN | DAIRY
+
+
/obj/item/reagent_containers/food/snacks/customizable/kebab
name = "kebab"
desc = "Delicious food on a stick."
@@ -179,6 +191,15 @@
ingMax = 6
icon_state = "rod"
+/obj/item/reagent_containers/food/snacks/customizable/pasta
+ name = "spaghetti"
+ desc = "Noodles. With stuff. Delicious."
+ ingredients_placement = INGREDIENTS_SCATTER
+ ingMax = 6
+ icon = 'icons/obj/food/pizzaspaghetti.dmi'
+ icon_state = "spaghettiboiled"
+ foodtype = GRAIN
+
/obj/item/reagent_containers/food/snacks/customizable/pie
name = "pie"
@@ -209,6 +230,43 @@
icon_state = "bowl"
+/obj/item/reagent_containers/food/snacks/customizable/sandwich
+ name = "toast"
+ desc = "A timeless classic."
+ ingredients_placement = INGREDIENTS_STACK
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "breadslice"
+ var/finished = 0
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/customizable/sandwich/initialize_custom_food(obj/item/reagent_containers/BASE, obj/item/I, mob/user)
+ icon_state = BASE.icon_state
+ ..()
+
+/obj/item/reagent_containers/food/snacks/customizable/sandwich/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/reagent_containers/food/snacks/breadslice)) //we're finishing the custom food.
+ var/obj/item/reagent_containers/food/snacks/breadslice/BS = I
+ if(finished)
+ return
+ to_chat(user, "You finish the [src.name].")
+ finished = 1
+ name = "[customname] sandwich"
+ BS.reagents.trans_to(src, BS.reagents.total_volume, transfered_by = user)
+ ingMax = ingredients.len //can't add more ingredients after that
+ var/mutable_appearance/TOP = mutable_appearance(icon, "[BS.icon_state]")
+ TOP.pixel_y = 2 * ingredients.len + 3
+ add_overlay(TOP)
+ if(istype(BS, /obj/item/reagent_containers/food/snacks/breadslice/custom))
+ var/mutable_appearance/filling = new(icon, "[initial(BS.icon_state)]_filling")
+ filling.color = BS.filling_color
+ filling.pixel_y = 2 * ingredients.len + 3
+ add_overlay(filling)
+ qdel(BS)
+ return
+ else
+ ..()
+
+
/obj/item/reagent_containers/food/snacks/customizable/soup
name = "soup"
desc = "A bowl with liquid and... stuff in it."
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 9e84c272dbb6..b64d52eea54a 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -56,16 +56,6 @@ All foods are distributed among various categories. Use common sense.
//Placeholder for effect that trigger on eating that aren't tied to reagents.
-/obj/item/reagent_containers/food/snacks/Initialize(mapload)
- . = ..()
- RegisterSignal(src, COMSIG_ITEM_FRIED, PROC_REF(on_fried))
-
-
-/obj/item/reagent_containers/food/snacks/proc/on_fried(fry_object)
- reagents.trans_to(fry_object, reagents.total_volume)
- qdel()
- return COMSIG_FRYING_HANDLED
-
/obj/item/reagent_containers/food/snacks/add_initial_reagents()
if(tastes && tastes.len)
if(list_reagents)
@@ -177,27 +167,26 @@ All foods are distributed among various categories. Use common sense.
/obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/storage))
..() // -> item/attackby()
- return FALSE
- var/datum/component/edible/E = W.GetComponent(/datum/component/edible)
- if(istype(W, /obj/item/reagent_containers/food/snacks) || E)
+ return 0
+ if(istype(W, /obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/S = W
if(custom_food_type && ispath(custom_food_type))
- if(W.w_class > WEIGHT_CLASS_SMALL)
- to_chat(user, span_warning("[S] is too big for [src]!"))
- return FALSE
- if(!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom))
- to_chat(user, span_warning("[src] can't be filled with [S]!"))
- return FALSE
+ if(S.w_class > WEIGHT_CLASS_SMALL)
+ to_chat(user, "[S] is too big for [src]!")
+ return 0
+ if(!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(W, /obj/item/reagent_containers/food/snacks/cakeslice/custom))
+ to_chat(user, "[src] can't be filled with [S]!")
+ return 0
if(contents.len >= 20)
- to_chat(user, span_warning("You can't add more ingredients to [src]!"))
- return FALSE
+ to_chat(user, "You can't add more ingredients to [src]!")
+ return 0
var/obj/item/reagent_containers/food/snacks/customizable/C = new custom_food_type(get_turf(src))
- C.initialize_custom_food(src, W, user)
- return FALSE
+ C.initialize_custom_food(src, S, user)
+ return 0
var/sharp = W.get_sharpness()
if(sharp)
if(slice(sharp, W, user))
- return TRUE
+ return 1
else
..()
@@ -347,10 +336,26 @@ All foods are distributed among various categories. Use common sense.
/// All the food items that can store an item inside itself, like bread or cake.
/obj/item/reagent_containers/food/snacks/store
w_class = WEIGHT_CLASS_NORMAL
+ var/stored_item = 0
-/obj/item/reagent_containers/food/snacks/store/Initialize()
- . = ..()
- AddComponent(/datum/component/food_storage)
+/obj/item/reagent_containers/food/snacks/store/attackby(obj/item/W, mob/user, params)
+ ..()
+ if(W.w_class <= WEIGHT_CLASS_SMALL & !istype(W, /obj/item/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods.
+ if(W.get_sharpness())
+ return 0
+ if(stored_item)
+ return 0
+ if(!iscarbon(user))
+ return 0
+ if(contents.len >= 20)
+ to_chat(user, "[src] is full.")
+ return 0
+ to_chat(user, "You slip [W] inside [src].")
+ user.transferItemToLoc(W, src)
+ add_fingerprint(user)
+ contents += W
+ stored_item = 1
+ return 1 // no afterattack here
/obj/item/reagent_containers/food/snacks/MouseDrop(atom/over)
var/turf/T = get_turf(src)
diff --git a/code/modules/food_and_drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm
index 4f5f06379927..9567690dc71c 100644
--- a/code/modules/food_and_drinks/food/snacks/dough.dm
+++ b/code/modules/food_and_drinks/food/snacks/dough.dm
@@ -7,7 +7,7 @@
desc = "A piece of dough."
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "dough"
- cooked_type = /obj/item/food/bread/plain
+ cooked_type = /obj/item/reagent_containers/food/snacks/store/bread/plain
list_reagents = list(/datum/reagent/consumable/nutriment = 6)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("dough" = 1)
@@ -82,7 +82,7 @@
desc = "Cook it to get a cake."
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "cakebatter"
- cooked_type = /obj/item/food/cake/plain
+ cooked_type = /obj/item/reagent_containers/food/snacks/store/cake/plain
list_reagents = list(/datum/reagent/consumable/nutriment = 9)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("batter" = 1)
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index 6cc7413cbfdd..e4ccbd1c8f90 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -279,7 +279,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/gondola
name = "gondola meat"
desc = "According to legends of old, consuming raw gondola flesh grants one inner peace."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/cooking_oil = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/tranquility = 5, /datum/reagent/consumable/cooking_oil = 3)
tastes = list("meat" = 4, "tranquility" = 1)
filling_color = "#9A6750"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/gondola
diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
new file mode 100644
index 000000000000..13342a968900
--- /dev/null
+++ b/code/modules/food_and_drinks/food/snacks_bread.dm
@@ -0,0 +1,302 @@
+
+/obj/item/reagent_containers/food/snacks/store/bread
+ icon = 'icons/obj/food/burgerbread.dmi'
+ volume = 80
+ slices_num = 5
+ tastes = list("bread" = 10)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/store/bread/Initialize()
+ . = ..()
+ AddElement(/datum/element/dunkable, 10)
+
+/obj/item/reagent_containers/food/snacks/breadslice
+ icon = 'icons/obj/food/burgerbread.dmi'
+ bitesize = 2
+ custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/sandwich
+ filling_color = "#FFA500"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2)
+ slot_flags = ITEM_SLOT_HEAD
+ customfoodfilling = 0 //to avoid infinite bread-ception
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/breadslice/Initialize()
+ . = ..()
+ AddElement(/datum/element/dunkable, 10)
+
+/obj/item/reagent_containers/food/snacks/store/bread/plain
+ name = "bread"
+ desc = "Some plain old earthen bread."
+ icon_state = "bread"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 7)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10)
+ custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/bread
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/plain
+ tastes = list("bread" = 10)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/breadslice/plain
+ name = "bread slice"
+ desc = "A slice of home."
+ icon_state = "breadslice"
+ customfoodfilling = 1
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/breadslice/moldy
+ name = "moldy bread slice"
+ desc = "Entire stations have been ripped apart over arguing whether this is still good to eat."
+ icon_state = "moldybreadslice"
+ customfoodfilling = 0
+ bonus_reagents = list(/datum/reagent/consumable/mold = 10)
+ tastes = list("decaying fungus" = 1)
+ foodtype = GROSS
+
+/obj/item/reagent_containers/food/snacks/store/bread/meat
+ name = "meatbread loaf"
+ desc = "The culinary base of every self-respecting eloquen/tg/entleman."
+ icon_state = "meatbread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/meat
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("bread" = 10, "meat" = 10)
+ foodtype = GRAIN | MEAT
+
+/obj/item/reagent_containers/food/snacks/breadslice/meat
+ name = "meatbread slice"
+ desc = "A slice of delicious meatbread."
+ icon_state = "meatbreadslice"
+ foodtype = GRAIN | MEAT
+
+/obj/item/reagent_containers/food/snacks/store/bread/xenomeat
+ name = "xenomeatbread loaf"
+ desc = "The culinary base of every self-respecting eloquen/tg/entleman. Extra Heretical."
+ icon_state = "xenomeatbread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/xenomeat
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("bread" = 10, "acid" = 10)
+ foodtype = GRAIN | MEAT
+
+/obj/item/reagent_containers/food/snacks/breadslice/xenomeat
+ name = "xenomeatbread slice"
+ desc = "A slice of delicious meatbread. Extra Heretical."
+ icon_state = "xenobreadslice"
+ filling_color = "#32CD32"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtype = GRAIN | MEAT
+
+/obj/item/reagent_containers/food/snacks/store/bread/spidermeat
+ name = "spider meat loaf"
+ desc = "Reassuringly green meatloaf made from spider meat."
+ icon_state = "spidermeatbread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/spidermeat
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/toxin = 15, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("bread" = 10, "cobwebs" = 5)
+ foodtype = GRAIN | MEAT | TOXIC
+
+/obj/item/reagent_containers/food/snacks/breadslice/spidermeat
+ name = "spider meat bread slice"
+ desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
+ icon_state = "spiderbreadslice"
+ filling_color = "#7CFC00"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtype = GRAIN | MEAT | TOXIC
+
+/obj/item/reagent_containers/food/snacks/store/bread/banana
+ name = "banana-nut bread"
+ desc = "A heavenly and filling treat."
+ icon_state = "bananabread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/banana
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/banana = 20)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/banana = 20)
+ tastes = list("bread" = 10) // bananjuice will also flavour
+ foodtype = GRAIN | FRUIT
+
+
+/obj/item/reagent_containers/food/snacks/breadslice/banana
+ name = "banana-nut bread slice"
+ desc = "A slice of delicious banana bread."
+ icon_state = "bananabreadslice"
+ filling_color = "#FFD700"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/banana = 4)
+ foodtype = GRAIN | FRUIT
+
+/obj/item/reagent_containers/food/snacks/store/bread/tofu
+ name = "Tofubread"
+ desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
+ icon_state = "tofubread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/tofu
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("bread" = 10, "tofu" = 10)
+ foodtype = GRAIN | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/breadslice/tofu
+ name = "tofubread slice"
+ desc = "A slice of delicious tofubread."
+ icon_state = "tofubreadslice"
+ filling_color = "#FF8C00"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtype = GRAIN | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/store/bread/creamcheese
+ name = "cream cheese bread"
+ desc = "Yum yum yum!"
+ icon_state = "creamcheesebread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/creamcheese
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("bread" = 10, "cheese" = 10)
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/breadslice/creamcheese
+ name = "cream cheese bread slice"
+ desc = "A slice of yum!"
+ icon_state = "creamcheesebreadslice"
+ filling_color = "#FF8C00"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/store/bread/mimana
+ name = "mimana bread"
+ desc = "Best eaten in silence."
+ icon_state = "mimanabread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice/mimana
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("bread" = 10, "silence" = 10)
+ foodtype = GRAIN | FRUIT
+
+/obj/item/reagent_containers/food/snacks/breadslice/mimana
+ name = "mimana bread slice"
+ desc = "A slice of silence!"
+ icon_state = "mimanabreadslice"
+ filling_color = "#C0C0C0"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtype = GRAIN | FRUIT
+
+/obj/item/reagent_containers/food/snacks/breadslice/custom
+ name = "bread slice"
+ icon_state = "tofubreadslice"
+ filling_color = "#FFFFFF"
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/baguette
+ name = "baguette"
+ desc = "Bon appetit!"
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "baguette"
+ item_state = "baguette"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bitesize = 3
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
+ attack_verb = list("touche'd")
+ tastes = list("bread" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/garlicbread
+ name = "garlic bread"
+ desc = "Alas, it is limited."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "garlicbread"
+ item_state = "garlicbread"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/garlic = 2)
+ bitesize = 3
+ tastes = list("bread" = 1, "garlic" = 1, "butter" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/deepfryholder
+ name = "Deep Fried Foods Holder Obj"
+ desc = "If you can see this description the code for the deep fryer fucked up."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = ""
+ bitesize = 2
+
+/obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried)
+ . = ..()
+ name = fried.name //We'll determine the other stuff when it's actually removed
+ appearance = fried.appearance
+ layer = initial(layer)
+ plane = initial(plane)
+ lefthand_file = fried.lefthand_file
+ righthand_file = fried.righthand_file
+ item_state = fried.item_state
+ desc = fried.desc
+ w_class = fried.w_class
+ slowdown = fried.slowdown
+ equip_delay_self = fried.equip_delay_self
+ equip_delay_other = fried.equip_delay_other
+ strip_delay = fried.strip_delay
+ species_exception = fried.species_exception
+ item_flags = fried.item_flags
+ obj_flags = fried.obj_flags
+ inhand_x_dimension = fried.inhand_x_dimension
+ inhand_y_dimension = fried.inhand_y_dimension
+
+ if(istype(fried, /obj/item/reagent_containers/food/snacks))
+ fried.reagents.trans_to(src, fried.reagents.total_volume)
+ qdel(fried)
+ else
+ fried.forceMove(src)
+
+/obj/item/reagent_containers/food/snacks/deepfryholder/Destroy()
+ if(contents)
+ QDEL_LIST(contents)
+ . = ..()
+
+/obj/item/reagent_containers/food/snacks/deepfryholder/On_Consume(mob/living/eater)
+ if(contents)
+ QDEL_LIST(contents)
+ ..()
+
+/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(cook_time = 30)
+ switch(cook_time)
+ if(0 to 15)
+ add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
+ name = "lightly-fried [name]"
+ desc = "[desc] It's been lightly fried in a deep fryer."
+ if(16 to 49)
+ add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
+ name = "fried [name]"
+ desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%."
+ if(50 to 59)
+ add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
+ name = "deep-fried [name]"
+ desc = "[desc] Deep-fried to perfection."
+ if(60 to INFINITY)
+ add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
+ name = "\proper the physical manifestation of the very concept of fried foods"
+ desc = "A heavily-fried...something. Who can tell anymore?"
+ filling_color = color
+ foodtype |= FRIED
+
+/obj/item/reagent_containers/food/snacks/butterbiscuit
+ name = "butter biscuit"
+ desc = "Well butter my biscuit!"
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "butterbiscuit"
+ filling_color = "#F0E68C"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("butter" = 1, "biscuit" = 1)
+ foodtype = GRAIN | BREAKFAST
+
+/obj/item/reagent_containers/food/snacks/butterdog
+ name = "butterdog"
+ desc = "Made from exotic butters."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "butterdog"
+ bitesize = 1
+ filling_color = "#F1F49A"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("butter", "exotic butter")
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/butterdog/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/slippery, 80)
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
new file mode 100644
index 000000000000..a048fb0e4371
--- /dev/null
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -0,0 +1,431 @@
+/obj/item/reagent_containers/food/snacks/store/cake
+ icon = 'icons/obj/food/piecake.dmi'
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/plain
+ slices_num = 5
+ bitesize = 3
+ volume = 80
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("cake" = 1)
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/cakeslice
+ icon = 'icons/obj/food/piecake.dmi'
+ trash = /obj/item/trash/plate
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ customfoodfilling = 0 //to avoid infinite cake-ception
+ tastes = list("cake" = 1)
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/store/cake/plain
+ name = "plain cake"
+ desc = "A plain cake, not a lie."
+ icon_state = "plaincake"
+ custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/cake
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
+ tastes = list("sweetness" = 2,"cake" = 5)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/plain
+ name = "plain cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "plaincake_slice"
+ filling_color = "#FFD700"
+ customfoodfilling = 1
+ tastes = list("sweetness" = 2,"cake" = 5)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/carrot
+ name = "carrot cake"
+ desc = "A favorite desert of a certain wascally wabbit. Not a lie."
+ icon_state = "carrotcake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/carrot
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/medicine/oculine = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/oculine = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/carrot
+ name = "carrot cake slice"
+ desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie."
+ icon_state = "carrotcake_slice"
+ filling_color = "#FFA500"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/oculine = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/brain
+ name = "brain cake"
+ desc = "A squishy cake-thing."
+ icon_state = "braincake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brain
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
+ foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/brain
+ name = "brain cake slice"
+ desc = "Lemme tell you something about prions. THEY'RE DELICIOUS."
+ icon_state = "braincakeslice"
+ filling_color = "#FF69B4"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/mannitol = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
+ foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/cheese
+ name = "cheese cake"
+ desc = "DANGEROUSLY cheesy."
+ icon_state = "cheesecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/cheese
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 10)
+ tastes = list("cake" = 4, "cream cheese" = 3)
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/cakeslice/cheese
+ name = "cheese cake slice"
+ desc = "Slice of pure cheestisfaction."
+ icon_state = "cheesecake_slice"
+ filling_color = "#FFFACD"
+ tastes = list("cake" = 4, "cream cheese" = 3)
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/store/cake/orange
+ name = "orange cake"
+ desc = "A cake with added orange."
+ icon_state = "orangecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/orange
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
+ tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/orange
+ name = "orange cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "orangecake_slice"
+ filling_color = "#FFA500"
+ tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/lime
+ name = "lime cake"
+ desc = "A cake with added lime."
+ icon_state = "limecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lime
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
+ tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/lime
+ name = "lime cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "limecake_slice"
+ filling_color = "#00FF00"
+ tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/lemon
+ name = "lemon cake"
+ desc = "A cake with added lemon."
+ icon_state = "lemoncake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lemon
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
+ tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/lemon
+ name = "lemon cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "lemoncake_slice"
+ filling_color = "#FFEE00"
+ tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/chocolate
+ name = "chocolate cake"
+ desc = "A cake with added chocolate."
+ icon_state = "chocolatecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/chocolate
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
+ tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/chocolate
+ name = "chocolate cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "chocolatecake_slice"
+ filling_color = "#A0522D"
+ tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/birthday
+ name = "birthday cake"
+ desc = "Happy Birthday little clown..."
+ icon_state = "birthdaycake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("cake" = 5, "sweetness" = 1)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/birthday/microwave_act(obj/machinery/microwave/M) //super sekrit club
+ new /obj/item/clothing/head/hardhat/cakehat(get_turf(src))
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/cakeslice/birthday
+ name = "birthday cake slice"
+ desc = "A slice of your birthday."
+ icon_state = "birthdaycakeslice"
+ filling_color = "#DC143C"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("cake" = 5, "sweetness" = 1)
+ foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy
+ name = "energy cake"
+ desc = "Just enough calories for a whole nuclear operative squad."
+ icon_state = "energycake"
+ force = 5
+ hitsound = 'sound/weapons/blade1.ogg'
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/pwr_game = 10, /datum/reagent/consumable/liquidelectricity = 10)
+ tastes = list("cake" = 3, "a Vlad's Salad" = 1)
+
+/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/proc/energy_bite(mob/living/user)
+ to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!")
+ user.apply_damage(30,BRUTE,BODY_ZONE_HEAD)
+ playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
+
+/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/attack(mob/living/M, mob/living/user)
+ . = ..()
+ if(HAS_TRAIT(user, TRAIT_PACIFISM) && M != user) //Prevents pacifists from attacking others directly
+ return
+ energy_bite(M, user)
+
+/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/microwave_act(obj/machinery/microwave/M) //super sekriter club
+ new /obj/item/clothing/head/hardhat/cakehat/energycake(get_turf(src))
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy
+ name = "energy cake slice"
+ desc = "For the traitor on the go."
+ icon_state = "energycakeslice"
+ force = 2
+ hitsound = 'sound/weapons/blade1.ogg'
+ filling_color = "#00FF00"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/pwr_game = 2, /datum/reagent/consumable/liquidelectricity = 2)
+ tastes = list("cake" = 3, "a Vlad's Salad" = 1)
+
+/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy/proc/energy_bite(mob/living/user)
+ to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!")
+ user.apply_damage(18,BRUTE,BODY_ZONE_HEAD)
+ playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
+
+/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy/attack(mob/living/M, mob/living/user)
+ . = ..()
+ if(HAS_TRAIT(user, TRAIT_PACIFISM) && M != user) //Prevents pacifists from attacking others directly
+ return
+ energy_bite(M, user)
+
+/obj/item/reagent_containers/food/snacks/store/cake/apple
+ name = "apple cake"
+ desc = "A cake centred with Apple."
+ icon_state = "applecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/apple
+ slices_num = 5
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
+ tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/apple
+ name = "apple cake slice"
+ desc = "A slice of heavenly cake."
+ icon_state = "applecakeslice"
+ filling_color = "#FF4500"
+ tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/custom
+ name = "cake slice"
+ icon_state = "plaincake_slice"
+ filling_color = "#FFFFFF"
+ foodtype = GRAIN | DAIRY
+
+/obj/item/reagent_containers/food/snacks/store/cake/slimecake
+ name = "Slime cake"
+ desc = "A cake made of slimes. Probably not electrified."
+ icon_state = "slimecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/slimecake
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/slimecake
+ name = "slime cake slice"
+ desc = "A slice of slime cake."
+ icon_state = "slimecake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice
+ name = "pumpkin spice cake"
+ desc = "A hollow cake with real pumpkin."
+ icon_state = "pumpkinspicecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pumpkinspice
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/pumpkinspice
+ name = "pumpkin spice cake slice"
+ desc = "A spicy slice of pumpkin goodness."
+ icon_state = "pumpkinspicecakeslice"
+ filling_color = "#FFD700"
+ tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
+ foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/bsvc // blackberry strawberries vanilla cake
+ name = "blackberry and strawberry vanilla cake"
+ desc = "A plain cake, filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_vanilla_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bsvc
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 14, /datum/reagent/consumable/nutriment/vitamin = 4)
+ tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/bsvc
+ name = "blackberry and strawberry vanilla cake slice"
+ desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_vanilla_slice"
+ filling_color = "#FFD700"
+ tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/bscc // blackbarry strawberries chocolate cake
+ name = "blackberry and strawberry chocolate cake"
+ desc = "A chocolate cake, filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_coco_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bscc
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 14, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/coco = 5)
+ tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/bscc
+ name = "blackberry and strawberry chocolate cake slice"
+ desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_coco_slice"
+ filling_color = "#FFD700"
+ tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/holy_cake
+ name = "angel food cake"
+ desc = "A cake made for angels and chaplains alike! Contains holy water."
+ icon_state = "holy_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/water/holywater = 10)
+ tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
+ name = "angel food cake slice"
+ desc = "A slice of heavenly cake."
+ icon_state = "holy_cake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR
+
+/obj/item/reagent_containers/food/snacks/store/cake/pound_cake
+ name = "pound cake"
+ desc = "A condensed cake made for filling people up quickly."
+ icon_state = "pound_cake"
+ slices_num = 7 //Its ment to feed the party
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 60)
+ tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
+
+/obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
+ name = "pound cake slice"
+ desc = "A slice of condensed cake made for filling people up quickly."
+ icon_state = "pound_cake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1)
+ foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
+
+/obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
+ name = "hardware cake"
+ desc = "A quote on quote cake that is made with electronic boards and leaks acid..."
+ icon_state = "hardware_cake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
+ bonus_reagents = list(/datum/reagent/toxin/acid = 15, /datum/reagent/fuel/oil = 15)
+ tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
+ foodtype = GRAIN | GROSS
+
+/obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
+ name = "hardware cake slice"
+ desc = "A slice of electronic boards and some acid."
+ icon_state = "hardware_cake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
+ foodtype = GRAIN | GROSS
+
+/obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
+ name = "vanilla cake"
+ desc = "A vanilla frosted cake."
+ icon_state = "vanillacake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
+ bonus_reagents = list(/datum/reagent/consumable/sugar = 15, /datum/reagent/consumable/vanilla = 15)
+ tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
+
+/obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
+ name = "vanilla cake slice"
+ desc = "A slice of vanilla frosted cake."
+ icon_state = "vanillacake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
+
+/obj/item/reagent_containers/food/snacks/store/cake/clown_cake
+ name = "clown cake"
+ desc = "A funny cake with a clown face on it."
+ icon_state = "clowncake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/clown_slice
+ bonus_reagents = list(/datum/reagent/consumable/sugar = 15)
+ tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
+
+/obj/item/reagent_containers/food/snacks/cakeslice/clown_slice
+ name = "clown cake slice"
+ desc = "A slice of bad jokes, and silly props."
+ icon_state = "clowncake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
+
+/obj/item/reagent_containers/food/snacks/store/cake/trumpet
+ name = "spaceman's cake"
+ desc = "A spaceman's trumpet frosted cake."
+ icon_state = "trumpetcake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/trumpet
+ bonus_reagents = list(/datum/reagent/medicine/polypyr = 15, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/berryjuice = 5)
+ filling_color = "#7A3D80"
+ tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/reagent_containers/food/snacks/cakeslice/trumpet
+ name = "spaceman's cake"
+ desc = "A spaceman's trumpet frosted cake."
+ icon_state = "trumpetcakeslice"
+ filling_color = "#7A3D80"
+ tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
index 665d94e1fa9b..360053c28ca4 100644
--- a/code/modules/food_and_drinks/food/snacks_egg.dm
+++ b/code/modules/food_and_drinks/food/snacks_egg.dm
@@ -10,8 +10,6 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 4, "sweetness" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/egg
name = "egg"
@@ -20,8 +18,7 @@
list_reagents = list(/datum/reagent/consumable/eggyolk = 5)
cooked_type = /obj/item/reagent_containers/food/snacks/boiledegg
filling_color = "#F0E68C"
- foodtype = MEAT | RAW
- w_class = WEIGHT_CLASS_TINY
+ foodtype = MEAT
grind_results = list()
var/static/chick_count = 0 //I copied this from the chicken_count (note the "en" in there) variable from chicken code.
@@ -109,8 +106,6 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("egg" = 1)
foodtype = MEAT | BREAKFAST
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/omelette //FUCK THIS
name = "omelette du fromage"
diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm
index d79b91507c1b..930fabc31775 100644
--- a/code/modules/food_and_drinks/food/snacks_frozen.dm
+++ b/code/modules/food_and_drinks/food/snacks_frozen.dm
@@ -8,24 +8,20 @@
desc = "Portable Ice-cream in its own packaging."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "icecreamsandwich"
- w_class = WEIGHT_CLASS_TINY
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/ice = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2)
tastes = list("ice cream" = 1)
foodtype = GRAIN | DAIRY | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/strawberryicecreamsandwich
name = "strawberry ice cream sandwich"
desc = "Portable ice-cream in its own packaging of the strawberry variety."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "strawberryicecreamsandwich"
- w_class = WEIGHT_CLASS_TINY
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2)
tastes = list("ice cream" = 2, "berry" = 2)
foodtype = FRUIT | DAIRY | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/spacefreezy
@@ -33,7 +29,6 @@
desc = "The best icecream in space."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "spacefreezy"
- w_class = WEIGHT_CLASS_TINY
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/bluecherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
filling_color = "#87CEFA"
@@ -45,7 +40,6 @@
desc = "A classic dessert."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "sundae"
- w_class = WEIGHT_CLASS_SMALL
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
filling_color = "#FFFACD"
@@ -72,14 +66,12 @@
desc = "It's just shaved ice. Still fun to chew on."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "flavorless_sc"
- w_class = WEIGHT_CLASS_SMALL
trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups
bonus_reagents = list(/datum/reagent/water = 10) //Base line will allways give water
list_reagents = list(/datum/reagent/water = 1) // We dont get food for water/juices
filling_color = "#FFFFFF" //Ice is white
tastes = list("ice" = 1, "water" = 1)
foodtype = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit
- /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/snowcones/lime
name = "lime snowcone"
@@ -186,7 +178,7 @@
name = "Space Mountain Wind snowcone"
desc = "Space Mountain Wind drizzled over a snowball in a paper cup."
icon_state = "mountainwind_sc"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/comet_trail = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/spacemountainwind = 5)
tastes = list("ice" = 1, "water" = 1, "mountain wind" = 5)
@@ -194,7 +186,7 @@
name = "pwrgame snowcone"
desc = "Pwrgame soda drizzled over a snowball in a paper cup."
icon_state = "pwrgame_sc"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/pacfuel = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/pwr_game = 5)
tastes = list("ice" = 1, "water" = 1, "valid" = 5, "salt" = 5, "wats" = 5)
/obj/item/reagent_containers/food/snacks/snowcones/honey
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index c088b2259610..510130ce08be 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -211,8 +211,6 @@
filling_color = "#800000"
tastes = list("meat" = 1)
foodtype = MEAT
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/sausage
name = "sausage"
@@ -225,7 +223,6 @@
slices_num = 6
slice_path = /obj/item/reagent_containers/food/snacks/salami
foodtype = MEAT | BREAKFAST
- /*food_flags = FOOD_FINGER_FOOD*/
var/roasted = FALSE
/obj/item/reagent_containers/food/snacks/sausage/Initialize()
@@ -269,8 +266,6 @@
filling_color = "#CD853F"
tastes = list("the jungle" = 1, "bananas" = 1)
foodtype = MEAT | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
var/faction
var/spawned_mob = /mob/living/carbon/monkey
custom_price = 300
@@ -364,8 +359,6 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 2)
tastes = list("\"chicken\"" = 1)
foodtype = MEAT
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/nugget/Initialize()
. = ..()
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 0e55d21b3505..3d5adf18e6fd 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -37,9 +37,7 @@
filling_color = "#FF1493"
tastes = list("watermelon" = 1)
foodtype = FRUIT
- /*food_flags = FOOD_FINGER_FOOD*/
juice_results = list(/datum/reagent/consumable/watermelonjuice = 5)
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/candy_corn
name = "candy corn"
@@ -49,8 +47,6 @@
filling_color = "#FF8C00"
tastes = list("candy corn" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/candy_corn/prison
name = "desiccated candy corn"
@@ -68,8 +64,6 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/hugemushroomslice
name = "huge mushroom slice"
@@ -118,6 +112,19 @@
. = ..()
AddElement(/datum/element/dunkable, 10)
+/obj/item/reagent_containers/food/snacks/tatortot
+ name = "tator tot"
+ desc = "A large fried potato nugget that may or may not try to valid you."
+ icon_state = "tatortot"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4)
+ filling_color = "FFD700"
+ tastes = list("potato" = 3, "valids" = 1)
+ foodtype = FRIED | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/tatortot/Initialize()
+ . = ..()
+ AddElement(/datum/element/dunkable, 10)
+
/obj/item/reagent_containers/food/snacks/soydope
name = "soy dope"
desc = "Dope from a soy."
@@ -185,8 +192,6 @@
list_reagents = list(/datum/reagent/toxin/minttoxin = 2)
filling_color = "#800000"
foodtype = TOXIC | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/eggwrap
name = "egg wrap"
@@ -224,8 +229,6 @@
filling_color = "#00800"
tastes = list("cobwebs" = 1, "sugar" = 2)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/chococoin
name = "chocolate coin"
@@ -236,8 +239,6 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/fudgedice
name = "fudge dice"
@@ -249,8 +250,6 @@
trash = /obj/item/dice/fudge
tastes = list("fudge" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/chocoorange
name = "chocolate orange"
@@ -261,8 +260,6 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 3, "oranges" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/eggplantparm
name = "eggplant parmigiana"
@@ -407,8 +404,6 @@
filling_color = "#F2CE91"
tastes = list("oats" = 3, "nuts" = 2, "honey" = 1)
foodtype = GRAIN | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/stuffedlegion
name = "stuffed legion"
@@ -489,8 +484,6 @@
next_succ = 0
tastes = list("candy" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/chewable/lollipop/Initialize()
. = ..()
@@ -527,7 +520,6 @@
name = "bubblegum"
desc = "A rubbery strip of gum. Not exactly filling, but it keeps you busy."
icon_state = "bubblegum"
- supports_variations = VOX_VARIATION
item_state = "bubblegum"
color = "#E48AB5" // craftable custom gums someday?
list_reagents = list(/datum/reagent/consumable/sugar = 5)
@@ -582,8 +574,6 @@
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/bicaridine = 2, /datum/reagent/medicine/kelotane = 2) //Kek
tastes = list("candy")
foodtype = JUNKFOOD
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/gumball/Initialize()
. = ..()
@@ -664,7 +654,6 @@
desc = "delicious, golden, fatty goodness on a stick."
icon_state = "butteronastick"
trash = /obj/item/stack/rods
- /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/onionrings
name = "onion rings"
@@ -675,7 +664,6 @@
gender = PLURAL
tastes = list("batter" = 3, "onion" = 1)
foodtype = VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/pineappleslice
name = "pineapple slice"
@@ -685,7 +673,6 @@
juice_results = list(/datum/reagent/consumable/pineapplejuice = 3)
tastes = list("pineapple" = 1)
foodtype = FRUIT | PINEAPPLE
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/tinychocolate
name = "chocolate"
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 7cb9f05900ba..318de66636e7 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -13,8 +13,6 @@
filling_color = "#D2691E"
tastes = list("donut" = 1)
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR | BREAKFAST
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
var/decorated_icon = "donut_homer"
var/is_decorated = FALSE
var/extra_reagent = null
@@ -338,8 +336,6 @@
filling_color = "#F4A460"
tastes = list("muffin" = 1)
foodtype = GRAIN | SUGAR | BREAKFAST
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/muffin/berry
name = "berry muffin"
@@ -424,8 +420,6 @@
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
foodtype = GRAIN
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/donkpocket/warm
name = "warm Donk-pocket"
@@ -544,7 +538,7 @@
name = "\improper Gondola-pocket"
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least." //Only a monster would craft this.
icon_state = "donkpocketgondola"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/tranquility = 5)
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/gondola
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1)
@@ -554,8 +548,8 @@
name = "warm Gondola-pocket"
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least."
icon_state = "donkpocketgondola"
- bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1)
+ bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5)
tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1)
foodtype = GRAIN
@@ -571,8 +565,6 @@
filling_color = "#F0E68C"
tastes = list("cookie" = 1)
foodtype = GRAIN | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/cookie/Initialize()
. = ..()
@@ -591,8 +583,6 @@
filling_color = "#F4A460"
tastes = list("cookie" = 1)
foodtype = GRAIN | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/fortunecookie/proc/get_fortune()
var/atom/drop_location = drop_location()
@@ -623,8 +613,6 @@
filling_color = "#F0E68C"
tastes = list("pretzel" = 1)
foodtype = GRAIN | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit
name = "plump helmet biscuit"
@@ -635,8 +623,6 @@
filling_color = "#F0E68C"
tastes = list("mushroom" = 1, "biscuit" = 1)
foodtype = GRAIN | VEGETABLES
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize()
var/fey = prob(10)
@@ -658,8 +644,6 @@
filling_color = "#F0E68C"
tastes = list("cracker" = 1)
foodtype = GRAIN
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/hotdog
name = "hotdog"
@@ -748,19 +732,21 @@
name = "cherry cupcake"
desc = "A sweet cupcake with cherry bits."
icon_state = "cherrycupcake"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#F0E68C"
tastes = list("cake" = 3, "cherry" = 1)
foodtype = GRAIN | FRUIT | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
-/obj/item/reagent_containers/food/snacks/cherrycupcake/blue
+/obj/item/reagent_containers/food/snacks/bluecherrycupcake
name = "blue cherry cupcake"
desc = "Blue cherries inside a delicious cupcake."
icon_state = "bluecherrycupcake"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
+ filling_color = "#F0E68C"
tastes = list("cake" = 3, "blue cherry" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
/obj/item/reagent_containers/food/snacks/honeybun
name = "honey bun"
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index 169d208bf30d..c15a6606be97 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -9,8 +9,6 @@
cooked_type = /obj/item/reagent_containers/food/snacks/toastedsandwich
tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1)
foodtype = GRAIN | VEGETABLES
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/toastedsandwich
name = "toasted sandwich"
@@ -33,8 +31,6 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("toast" = 1, "cheese" = 1)
foodtype = GRAIN | DAIRY
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/jellysandwich
name = "jelly sandwich"
diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
new file mode 100644
index 000000000000..88c1188f1dee
--- /dev/null
+++ b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
@@ -0,0 +1,106 @@
+
+/obj/item/reagent_containers/food/snacks/spaghetti
+ name = "spaghetti"
+ desc = "Now that's a nic'e pasta!"
+ icon = 'icons/obj/food/pizzaspaghetti.dmi'
+ icon_state = "spaghetti"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ cooked_type = /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti
+ filling_color = "#F0E68C"
+ tastes = list("pasta" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/spaghetti/Initialize()
+ . = ..()
+ if(!cooked_type) // This isn't cooked, why would you put uncooked spaghetti in your pocket?
+ var/list/display_message = list(
+ "Something wet falls out of their pocket and hits the ground. Is that... [name]?",
+ "Oh shit! All your pocket [name] fell out!")
+ AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg')
+
+/obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti
+ name = "boiled spaghetti"
+ desc = "A plain dish of noodles, this needs more ingredients."
+ icon_state = "spaghettiboiled"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ cooked_type = null
+ custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/pasta
+
+/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato
+ name = "spaghetti"
+ desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
+ icon_state = "pastatomato"
+ trash = /obj/item/trash/plate
+ bitesize = 4
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4)
+ cooked_type = null
+ filling_color = "#DC143C"
+ tastes = list("pasta" = 1, "tomato" = 1)
+ foodtype = GRAIN | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/spaghetti/copypasta
+ name = "copypasta"
+ desc = "You probably shouldn't try this, you always hear people talking about how bad it is..."
+ icon_state = "copypasta"
+ trash = /obj/item/trash/plate
+ bitesize = 4
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/tomatojuice = 20, /datum/reagent/consumable/nutriment/vitamin = 8)
+ cooked_type = null
+ filling_color = "#DC143C"
+ tastes = list("pasta" = 1, "tomato" = 1)
+ foodtype = GRAIN | VEGETABLES
+
+/obj/item/reagent_containers/food/snacks/spaghetti/meatballspaghetti
+ name = "spaghetti and meatballs"
+ desc = "Now that's a nic'e meatball!"
+ icon_state = "meatballspaghetti"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4)
+ cooked_type = null
+ tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
+ foodtype = GRAIN | MEAT
+
+/obj/item/reagent_containers/food/snacks/spaghetti/spesslaw
+ name = "spesslaw"
+ desc = "A lawyers favourite."
+ icon_state = "spesslaw"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6)
+ cooked_type = null
+ tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
+
+/obj/item/reagent_containers/food/snacks/spaghetti/chowmein
+ name = "chow mein"
+ desc = "A nice mix of noodles and fried vegetables."
+ icon_state = "chowmein"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 6)
+ cooked_type = null
+ tastes = list("noodle" = 1, "tomato" = 1)
+
+/obj/item/reagent_containers/food/snacks/spaghetti/beefnoodle
+ name = "beef noodle"
+ desc = "Nutritious, beefy and noodly."
+ icon_state = "beefnoodle"
+ trash = /obj/item/reagent_containers/glass/bowl
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3)
+ cooked_type = null
+ tastes = list("noodle" = 1, "meat" = 1)
+ foodtype = GRAIN | MEAT
+
+/obj/item/reagent_containers/food/snacks/spaghetti/butternoodles
+ name = "butter noodles"
+ desc = "Noodles covered in savory butter. Simple and slippery, but delicious."
+ icon_state = "butternoodles"
+ trash = /obj/item/trash/plate
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
+ cooked_type = null
+ tastes = list("noodle" = 1, "butter" = 1)
+ foodtype = GRAIN | DAIRY
diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
index b071add1027a..94477d1932aa 100644
--- a/code/modules/food_and_drinks/food/snacks_vend.dm
+++ b/code/modules/food_and_drinks/food/snacks_vend.dm
@@ -12,8 +12,6 @@
filling_color = "#D2691E"
tastes = list("candy" = 1)
foodtype = JUNKFOOD | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/candy/bronx
name = "South Bronx Paradise bar"
@@ -84,9 +82,7 @@
filling_color = "#8B0000"
tastes = list("dried raisins" = 1)
foodtype = JUNKFOOD | FRUIT | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
custom_price = 90
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/no_raisin/healthy
name = "homemade raisins"
@@ -103,9 +99,7 @@
junkiness = 25
filling_color = "#FFD700"
foodtype = JUNKFOOD | GRAIN | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
custom_price = 30
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/candy_trash
name = "candy cigarette butt"
@@ -142,7 +136,6 @@
filling_color = "#F5F5DC"
tastes = list("sweetness" = 3, "cake" = 1)
foodtype = GRAIN | FRUIT | VEGETABLES
- w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/energybar
name = "High-power energy bars"
@@ -153,5 +146,3 @@
filling_color = "#97ee63"
tastes = list("pure electricity" = 3, "fitness" = 2)
foodtype = TOXIC
- /*food_flags = FOOD_FINGER_FOOD*/
- w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 62e6a4075a93..8eccd04c8404 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -18,8 +18,6 @@
// _- _
// -
-//God bless These Deepfried States o7 -2024
-
/obj/machinery/deepfryer
name = "deep fryer"
desc = "Deep fried everything."
@@ -29,7 +27,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = IDLE_DRAW_LOW
layer = BELOW_OBJ_LAYER
- var/obj/item/food/deepfryholder/frying //What's being fried RIGHT NOW?
+ var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW?
var/cook_time = 0
var/oil_use = 0.05 //How much cooking oil is used per tick
var/fry_speed = 1 //How quickly we fry food
@@ -95,7 +93,7 @@
if(I.resistance_flags & INDESTRUCTIBLE)
to_chat(user, "You don't feel it would be wise to fry [I]...")
return
- if(istype(I, /obj/item/food/deepfryholder))
+ if(istype(I, /obj/item/reagent_containers/food/snacks/deepfryholder))
to_chat(user, "Your cooking skills are not up to the legendary Doublefry technique.")
return
if(default_unfasten_wrench(user, I))
@@ -107,7 +105,7 @@
return ..()
else if(!frying && user.transferItemToLoc(I, src))
to_chat(user, "You put [I] into [src].")
- frying = new/obj/item/food/deepfryholder(src, I)
+ frying = new/obj/item/reagent_containers/food/snacks/deepfryholder(src, I)
icon_state = "fryer_on"
fry_loop.start()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
index c349c7511752..4c1a8695d838 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
@@ -61,10 +61,10 @@
grill_loop.start()
return
else
- if(I.reagents.has_reagent(/datum/reagent/consumable/xeno_energy))
- grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/xeno_energy)))
+ if(I.reagents.has_reagent(/datum/reagent/consumable/monkey_energy))
+ grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy)))
to_chat(user, "You pour the Monkey Energy in [src].")
- I.reagents.remove_reagent(/datum/reagent/consumable/xeno_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/xeno_energy))
+ I.reagents.remove_reagent(/datum/reagent/consumable/monkey_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/monkey_energy))
update_appearance()
return
..()
@@ -82,6 +82,7 @@
smoke.start()
if(grilled_item)
grill_time += 1
+ grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 1)
grill_fuel -= 10
grilled_item.AddComponent(/datum/component/sizzle)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index de4d844aa3ac..1d4e366ad6d9 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -210,7 +210,7 @@
return
/obj/item/reagent_containers/food/snacks/icecream
- name = "waffle cone"
+ name = "ice cream cone"
desc = "Delicious waffle cone, but no ice cream."
icon = 'icons/obj/kitchen.dmi'
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
@@ -220,7 +220,6 @@
var/cone_type
bitesize = 4
foodtype = DAIRY | SUGAR
- /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/icecream/Initialize()
. = ..()
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 9fdacebf8900..acd768347327 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -25,11 +25,14 @@
results = list(/datum/reagent/consumable/hot_ice_coffee = 3)
required_reagents = list(/datum/reagent/toxin/hot_ice = 1, /datum/reagent/consumable/coffee = 2)
+/datum/chemical_reaction/nuka_cola
+ results = list(/datum/reagent/consumable/nuka_cola = 6)
+ required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6)
+
/datum/chemical_reaction/moonshine
results = list(/datum/reagent/consumable/ethanol/moonshine = 10)
required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5)
required_catalysts = list(/datum/reagent/consumable/enzyme = 5)
- required_container = /obj/structure/fermenting_barrel
/datum/chemical_reaction/wine
results = list(/datum/reagent/consumable/ethanol/wine = 10)
@@ -170,12 +173,16 @@
/datum/chemical_reaction/hiveminderaser
results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4)
- required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/vimukti = 1, /datum/reagent/consumable/grenadine = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1)
/datum/chemical_reaction/manhattan
results = list(/datum/reagent/consumable/ethanol/manhattan = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/ethanol/vermouth = 1)
+/datum/chemical_reaction/manhattan_proj
+ results = list(/datum/reagent/consumable/ethanol/manhattan_proj = 10)
+ required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 10, /datum/reagent/uranium = 1)
+
/datum/chemical_reaction/vodka_tonic
results = list(/datum/reagent/consumable/ethanol/vodkatonic = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/tonic = 1)
@@ -198,7 +205,7 @@
/datum/chemical_reaction/demonsblood
results = list(/datum/reagent/consumable/ethanol/demonsblood = 4)
- required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/comet_trail = 1, /datum/reagent/blood = 1, /datum/reagent/consumable/tadrixx = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/spacemountainwind = 1, /datum/reagent/blood = 1, /datum/reagent/consumable/dr_gibb = 1)
/datum/chemical_reaction/booger
results = list(/datum/reagent/consumable/ethanol/booger = 4)
@@ -333,8 +340,8 @@
results = list(/datum/reagent/consumable/ethanol/driestmartini = 2)
required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1)
-/datum/chemical_reaction/vimukti
- results = list(/datum/reagent/consumable/ethanol/vimukti = 3)
+/datum/chemical_reaction/thirteenloko
+ results = list(/datum/reagent/consumable/ethanol/thirteenloko = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/limejuice = 1)
/datum/chemical_reaction/chocolatepudding
@@ -361,9 +368,9 @@
results = list(/datum/reagent/consumable/pumpkin_latte = 15)
required_reagents = list(/datum/reagent/consumable/pumpkinjuice = 5, /datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/cream = 5)
-/datum/chemical_reaction/tadrixxfloat
- results = list(/datum/reagent/consumable/tadrixxfloat = 15)
- required_reagents = list(/datum/reagent/consumable/tadrixx = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5)
+/datum/chemical_reaction/gibbfloats
+ results = list(/datum/reagent/consumable/gibbfloats = 15)
+ required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5)
/datum/chemical_reaction/triple_citrus
results = list(/datum/reagent/consumable/triple_citrus = 5)
@@ -383,6 +390,11 @@
required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/sugar = 1)
mix_message = "The mixture darkens to a rich gold hue."
+/datum/chemical_reaction/fetching_fizz
+ results = list(/datum/reagent/consumable/ethanol/fetching_fizz = 3)
+ required_reagents = list(/datum/reagent/consumable/nuka_cola = 1, /datum/reagent/iron = 1) //Manufacturable from only the mining station
+ mix_message = "The mixture slightly vibrates before settling."
+
/datum/chemical_reaction/hearty_punch
results = list(/datum/reagent/consumable/ethanol/hearty_punch = 1) //Very little, for balance reasons
required_reagents = list(/datum/reagent/consumable/ethanol/brave_bull = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5, /datum/reagent/consumable/ethanol/absinthe = 5)
@@ -426,6 +438,12 @@
results = list(/datum/reagent/consumable/ethanol/eggnog = 15)
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 5, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/eggyolk = 5)
+/datum/chemical_reaction/narsour
+ results = list(/datum/reagent/consumable/ethanol/narsour = 1)
+ required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/demonsblood = 1)
+ mix_message = "The mixture develops a sinister glow."
+ mix_sound = 'sound/effects/singlebeat.ogg'
+
/datum/chemical_reaction/quadruplesec
results = list(/datum/reagent/consumable/ethanol/quadruple_sec = 15)
required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 5, /datum/reagent/consumable/triple_citrus = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5)
@@ -507,6 +525,7 @@
results = list(/datum/reagent/consumable/ethanol/fernet_cola = 2)
required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/space_cola = 1)
+
/datum/chemical_reaction/fanciulli
results = list(/datum/reagent/consumable/ethanol/fanciulli = 2)
required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 1, /datum/reagent/consumable/ethanol/fernet = 1)
@@ -517,7 +536,8 @@
/datum/chemical_reaction/blank_paper
results = list(/datum/reagent/consumable/ethanol/blank_paper = 3)
- required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1)
+
/datum/chemical_reaction/wizz_fizz
results = list(/datum/reagent/consumable/ethanol/wizz_fizz = 3)
@@ -525,6 +545,7 @@
mix_message = "The beverage starts to froth with an almost mystical zeal!"
mix_sound = 'sound/effects/bubbles2.ogg'
+
/datum/chemical_reaction/bug_spray
results = list(/datum/reagent/consumable/ethanol/bug_spray = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/lemon_lime = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vodka = 1)
@@ -538,7 +559,7 @@
/datum/chemical_reaction/turbo
results = list(/datum/reagent/consumable/ethanol/turbo = 5)
- required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pacfuel = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1)
/datum/chemical_reaction/old_timer
results = list(/datum/reagent/consumable/ethanol/old_timer = 6)
@@ -546,7 +567,7 @@
/datum/chemical_reaction/rubberneck
results = list(/datum/reagent/consumable/ethanol/rubberneck = 10)
- required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/crosstalk = 5, /datum/reagent/consumable/astrotame = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1)
/datum/chemical_reaction/duplex
results = list(/datum/reagent/consumable/ethanol/duplex = 4)
@@ -608,11 +629,22 @@
required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/creme_de_cacao = 2, /datum/reagent/consumable/ethanol/irishcarbomb = 1)
mix_message = "The area around the glass seems to darken as the mixture forms!"
+/datum/chemical_reaction/archmagus_brew
+ results = list(/datum/reagent/consumable/ethanol/archmagus_brew = 4)
+ required_reagents = list(/datum/reagent/consumable/ethanol/wizz_fizz = 2, /datum/reagent/consumable/ethanol/crevice_spike = 1, /datum/reagent/consumable/ethanol/stinger = 1)
+ mix_message = "The mixture bubbles intensely before settling in the glass."
+
/datum/chemical_reaction/out_of_lime
results = list(/datum/reagent/consumable/ethanol/out_of_lime = 4)
required_reagents = list(/datum/reagent/consumable/lemonade = 1, /datum/reagent/consumable/ethanol/beer/green = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/ethanol/out_of_touch = 1)
mix_message = "The glass cycles through different colors before settling on one."
+/datum/chemical_reaction/cogchamp
+ results = list(/datum/reagent/consumable/ethanol/cogchamp = 3)
+ required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol/screwdrivercocktail = 1)
+ mix_message = "You hear faint sounds of gears turning as it mixes."
+ mix_sound = 'sound/effects/clockcult_gateway_closing.ogg'
+
/datum/chemical_reaction/ash_wine
results = list(/datum/reagent/consumable/ethanol/trickwine/ash_wine = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 3, /datum/reagent/ash = 1, /datum/reagent/drug/mushroomhallucinogen = 1)
@@ -639,7 +671,7 @@
/datum/chemical_reaction/force_wine
results = list(/datum/reagent/consumable/ethanol/trickwine/force_wine = 5)
- required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/comet_trail = 1)
+ required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/spacemountainwind = 1)
required_container = /obj/structure/fermenting_barrel/distiller
mix_sound ='sound/magic/forcewall.ogg'
@@ -648,18 +680,3 @@
required_reagents = list(/datum/reagent/consumable/ethanol/gin = 3, /datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/tinlux = 1)
required_container = /obj/structure/fermenting_barrel/distiller
mix_sound ='sound/weapons/laser.ogg'
-
-/datum/chemical_reaction/molten_bubbles
- results = list(/datum/reagent/consumable/molten = 30)
- required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/lavaland_extract = 1)
-
-/datum/chemical_reaction/plasma_bubbles
- results = list(/datum/reagent/consumable/molten/plasma_fizz = 3)
- required_reagents = list(/datum/reagent/consumable/molten = 3, /datum/reagent/toxin/plasma = 2)
-
-/datum/chemical_reaction/sand_bubbles
- results = list(/datum/reagent/consumable/molten/sand = 3)
- required_reagents = list(/datum/reagent/consumable/molten = 3, /datum/reagent/silicon = 2)
-
-/datum/chemical_reaction/sand_bubbles/plasma // Subbing plasma bubbles for reg
- required_reagents = list(/datum/reagent/consumable/molten/plasma_fizz = 3, /datum/reagent/silicon = 2)
diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm
index 0a0b00094e79..55db7cf06b84 100644
--- a/code/modules/food_and_drinks/recipes/processor_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm
@@ -13,13 +13,17 @@
input = /obj/item/reagent_containers/food/snacks/meat/rawcutlet
output = /obj/item/reagent_containers/food/snacks/meat/rawbacon
+/datum/food_processor_process/potatowedges
+ input = /obj/item/reagent_containers/food/snacks/grown/potato/wedges
+ output = /obj/item/reagent_containers/food/snacks/fries
+
/datum/food_processor_process/sweetpotato
input = /obj/item/reagent_containers/food/snacks/grown/potato/sweet
output = /obj/item/reagent_containers/food/snacks/yakiimo
/datum/food_processor_process/potato
input = /obj/item/reagent_containers/food/snacks/grown/potato
- output = /obj/item/reagent_containers/food/snacks/fries
+ output = /obj/item/reagent_containers/food/snacks/tatortot
/datum/food_processor_process/carrot
input = /obj/item/reagent_containers/food/snacks/grown/carrot
@@ -31,7 +35,7 @@
/datum/food_processor_process/spaghetti
input = /obj/item/reagent_containers/food/snacks/doughslice
- output = /obj/item/food/spaghetti
+ output = /obj/item/reagent_containers/food/snacks/spaghetti
/datum/food_processor_process/corn
input = /obj/item/reagent_containers/food/snacks/grown/corn
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index 0dec69a393f5..f29e948adf4c 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -6,83 +6,83 @@
/datum/crafting_recipe/food/meatbread
name = "Meat bread"
reqs = list(
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet/plain = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/food/bread/meat
+ result = /obj/item/reagent_containers/food/snacks/store/bread/meat
subcategory = CAT_BREAD
/datum/crafting_recipe/food/xenomeatbread
name = "Xenomeat bread"
reqs = list(
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/food/bread/xenomeat
+ result = /obj/item/reagent_containers/food/snacks/store/bread/xenomeat
subcategory = CAT_BREAD
/datum/crafting_recipe/food/spidermeatbread
name = "Spidermeat bread"
reqs = list(
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet/spider = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/food/bread/spidermeat
+ result = /obj/item/reagent_containers/food/snacks/store/bread/spidermeat
subcategory = CAT_BREAD
/datum/crafting_recipe/food/banananutbread
name = "Banana nut bread"
reqs = list(
/datum/reagent/consumable/milk = 5,
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/boiledegg = 3,
/obj/item/reagent_containers/food/snacks/grown/banana = 1
)
- result = /obj/item/food/bread/banana
+ result = /obj/item/reagent_containers/food/snacks/store/bread/banana
subcategory = CAT_BREAD
/datum/crafting_recipe/food/tofubread
name = "Tofu bread"
reqs = list(
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/tofu = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/food/bread/tofu
+ result = /obj/item/reagent_containers/food/snacks/store/bread/tofu
subcategory = CAT_BREAD
/datum/crafting_recipe/food/creamcheesebread
name = "Cream cheese bread"
reqs = list(
/datum/reagent/consumable/milk = 5,
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 2
)
- result = /obj/item/food/bread/creamcheese
+ result = /obj/item/reagent_containers/food/snacks/store/bread/creamcheese
subcategory = CAT_BREAD
/datum/crafting_recipe/food/mimanabread
name = "Mimana bread"
reqs = list(
/datum/reagent/consumable/soymilk = 5,
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/tofu = 3,
/obj/item/reagent_containers/food/snacks/grown/banana/mime = 1
)
- result = /obj/item/food/bread/mimana
+ result = /obj/item/reagent_containers/food/snacks/store/bread/mimana
subcategory = CAT_BREAD
/datum/crafting_recipe/food/garlicbread
name = "Garlic Bread"
time = 40
reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 1,
- /obj/item/food/breadslice/plain = 1,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
- result = /obj/item/food/garlicbread
+ result = /obj/item/reagent_containers/food/snacks/garlicbread
subcategory = CAT_BREAD
/datum/crafting_recipe/food/butterbiscuit
@@ -91,7 +91,7 @@
/obj/item/reagent_containers/food/snacks/bun = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
- result = /obj/item/food/butterbiscuit
+ result = /obj/item/reagent_containers/food/snacks/butterbiscuit
subcategory = CAT_BREAD
/datum/crafting_recipe/food/butterdog
@@ -100,14 +100,14 @@
/obj/item/reagent_containers/food/snacks/bun = 1,
/obj/item/reagent_containers/food/snacks/butter = 3,
)
- result = /obj/item/food/butterdog
+ result = /obj/item/reagent_containers/food/snacks/butterdog
subcategory = CAT_BREAD
/datum/crafting_recipe/food/moldybread // why would you make this?
name = "Moldy Bread"
reqs = list(
- /obj/item/food/breadslice/plain = 1,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/mushroom/amanita = 1
)
- result = /obj/item/food/breadslice/moldy
+ result = /obj/item/reagent_containers/food/snacks/breadslice/moldy
subcategory = CAT_BREAD
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index 7a3a4c6837b5..dcae05095ae8 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -6,190 +6,190 @@
/datum/crafting_recipe/food/carrotcake
name = "Carrot cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/carrot = 2
)
- result = /obj/item/food/cake/carrot
+ result = /obj/item/reagent_containers/food/snacks/store/cake/carrot
subcategory = CAT_CAKE
/datum/crafting_recipe/food/cheesecake
name = "Cheese cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 2
)
- result = /obj/item/food/cake/cheese
+ result = /obj/item/reagent_containers/food/snacks/store/cake/cheese
subcategory = CAT_CAKE
/datum/crafting_recipe/food/applecake
name = "Apple cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/apple = 2
)
- result = /obj/item/food/cake/apple
+ result = /obj/item/reagent_containers/food/snacks/store/cake/apple
subcategory = CAT_CAKE
/datum/crafting_recipe/food/orangecake
name = "Orange cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange = 2
)
- result = /obj/item/food/cake/orange
+ result = /obj/item/reagent_containers/food/snacks/store/cake/orange
subcategory = CAT_CAKE
/datum/crafting_recipe/food/limecake
name = "Lime cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/citrus/lime = 2
)
- result = /obj/item/food/cake/lime
+ result = /obj/item/reagent_containers/food/snacks/store/cake/lime
subcategory = CAT_CAKE
/datum/crafting_recipe/food/lemoncake
name = "Lemon cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 2
)
- result = /obj/item/food/cake/lemon
+ result = /obj/item/reagent_containers/food/snacks/store/cake/lemon
subcategory = CAT_CAKE
/datum/crafting_recipe/food/chocolatecake
name = "Chocolate cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 2
)
- result = /obj/item/food/cake/chocolate
+ result = /obj/item/reagent_containers/food/snacks/store/cake/chocolate
subcategory = CAT_CAKE
/datum/crafting_recipe/food/birthdaycake
name = "Birthday cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/candle = 1,
/datum/reagent/consumable/sugar = 5,
/datum/reagent/consumable/caramel = 2
)
- result = /obj/item/food/cake/birthday
+ result = /obj/item/reagent_containers/food/snacks/store/cake/birthday
subcategory = CAT_CAKE
/datum/crafting_recipe/food/energycake
name = "Energy cake"
reqs = list(
- /obj/item/food/cake/birthday = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/birthday = 1,
/obj/item/melee/transforming/energy/sword = 1,
)
- blacklist = list(/obj/item/food/cake/birthday/energy)
- result = /obj/item/food/cake/birthday/energy
+ blacklist = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy)
+ result = /obj/item/reagent_containers/food/snacks/store/cake/birthday/energy
subcategory = CAT_CAKE
/datum/crafting_recipe/food/braincake
name = "Brain cake"
reqs = list(
/obj/item/organ/brain = 1,
- /obj/item/food/cake/plain = 1
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
)
- result = /obj/item/food/cake/brain
+ result = /obj/item/reagent_containers/food/snacks/store/cake/brain
subcategory = CAT_CAKE
/datum/crafting_recipe/food/slimecake
name = "Slime cake"
reqs = list(
/obj/item/slime_extract = 1,
- /obj/item/food/cake/plain = 1
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
)
- result = /obj/item/food/cake/slimecake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/slimecake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/pumpkinspicecake
name = "Pumpkin spice cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/pumpkin = 2
)
- result = /obj/item/food/cake/pumpkinspice
+ result = /obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice
subcategory = CAT_CAKE
/datum/crafting_recipe/food/holycake
name = "Angel food cake"
reqs = list(
/datum/reagent/water/holywater = 15,
- /obj/item/food/cake/plain = 1
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
)
- result = /obj/item/food/cake/holy_cake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/holy_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/poundcake
name = "Pound cake"
reqs = list(
- /obj/item/food/cake/plain = 4
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 4
)
- result = /obj/item/food/cake/pound_cake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/hardwarecake
name = "Hardware cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/circuitboard = 2,
/datum/reagent/toxin/acid = 5
)
- result = /obj/item/food/cake/hardware_cake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/bscccake
name = "blackberry and strawberry chocolate cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 2,
/obj/item/reagent_containers/food/snacks/grown/berries = 5
)
- result = /obj/item/food/cake/bscc
+ result = /obj/item/reagent_containers/food/snacks/store/cake/bscc
subcategory = CAT_CAKE
/datum/crafting_recipe/food/bscvcake
name = "blackberry and strawberry vanilla cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/berries = 5
)
- result = /obj/item/food/cake/bsvc
+ result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc
subcategory = CAT_CAKE
/datum/crafting_recipe/food/clowncake
name = "clown cake"
always_availible = FALSE
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/sundae = 2,
/obj/item/reagent_containers/food/snacks/grown/banana = 5
)
- result = /obj/item/food/cake/clown_cake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/clown_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/vanillacake
name = "vanilla cake"
always_availible = FALSE
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/vanillapod = 2
)
- result = /obj/item/food/cake/vanilla_cake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/trumpetcake
name = "Spaceman's Cake"
reqs = list(
- /obj/item/food/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/trumpet = 2,
/datum/reagent/consumable/cream = 5,
/datum/reagent/consumable/berryjuice = 5
)
- result = /obj/item/food/cake/trumpet
+ result = /obj/item/reagent_containers/food/snacks/store/cake/trumpet
subcategory = CAT_CAKE
@@ -198,7 +198,7 @@
reqs = list(
/obj/item/organ/brain = 1,
/obj/item/organ/heart = 1,
- /obj/item/food/cake/birthday = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/birthday = 1,
/obj/item/reagent_containers/food/snacks/meat/slab = 3,
/datum/reagent/blood = 30,
/datum/reagent/consumable/sprinkles = 5,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
index 96c67eca7a9e..4e0ade4fa22d 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
@@ -139,7 +139,7 @@
time = 30
reqs = list(
/obj/item/storage/bag/trash = 1,
- /obj/item/food/breadslice/moldy = 1,
+ /obj/item/reagent_containers/food/snacks/breadslice/moldy = 1,
/obj/item/reagent_containers/food/snacks/grown = 4,
/obj/item/reagent_containers/food/snacks/candy_corn = 2,
/datum/reagent/water = 15
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
index a4ab818fdd6f..522f362e777e 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
@@ -36,7 +36,7 @@
reqs = list(
/obj/item/reagent_containers/food/snacks/friedegg = 1,
/obj/item/reagent_containers/food/snacks/meat/steak = 1,
- /obj/item/food/breadslice/plain = 1,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
)
result = /obj/item/reagent_containers/food/snacks/benedict
subcategory = CAT_EGG
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
index edca42fda076..92647559d9cd 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
@@ -27,7 +27,7 @@
name ="Space freezy"
reqs = list(
/datum/reagent/consumable/bluecherryjelly = 5,
- /datum/reagent/consumable/comet_trail = 15,
+ /datum/reagent/consumable/spacemountainwind = 15,
/obj/item/reagent_containers/food/snacks/icecream = 1
)
result = /obj/item/reagent_containers/food/snacks/spacefreezy
@@ -217,7 +217,7 @@
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/comet_trail = 5
+ /datum/reagent/consumable/spacemountainwind = 5
)
result = /obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
subcategory = CAT_ICE
@@ -227,7 +227,7 @@
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/pacfuel = 15
+ /datum/reagent/consumable/pwr_game = 15
)
result = /obj/item/reagent_containers/food/snacks/snowcones/pwrgame
subcategory = CAT_ICE
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index b1191fda7ada..1bb3d250a9ae 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -102,7 +102,7 @@
/datum/reagent/consumable/blackpepper = 1,
/obj/item/reagent_containers/food/snacks/pastrybase = 2
)
- result = /obj/item/food/baguette
+ result = /obj/item/reagent_containers/food/snacks/baguette
subcategory = CAT_MISCFOOD
////////////////////////////////////////////////TOAST////////////////////////////////////////////////
@@ -111,7 +111,7 @@
name = "Slime toast"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
- /obj/item/food/breadslice/plain = 1
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
)
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
subcategory = CAT_MISCFOOD
@@ -120,7 +120,7 @@
name = "Jellied toast"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
- /obj/item/food/breadslice/plain = 1
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
)
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
subcategory = CAT_MISCFOOD
@@ -128,7 +128,7 @@
/datum/crafting_recipe/food/butteredtoast
name = "Buttered Toast"
reqs = list(
- /obj/item/food/breadslice/plain = 1,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
result = /obj/item/reagent_containers/food/snacks/butteredtoast
@@ -138,7 +138,7 @@
name = "Two bread"
reqs = list(
/datum/reagent/consumable/ethanol/wine = 5,
- /obj/item/food/breadslice/plain = 2
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2
)
result = /obj/item/reagent_containers/food/snacks/twobread
subcategory = CAT_MISCFOOD
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index a1c1297647c3..ec04dcaa4ec9 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -396,7 +396,8 @@
name = "Gondola-pocket"
reqs = list(
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/meatball = 1
+ /obj/item/reagent_containers/food/snacks/meatball = 1,
+ /datum/reagent/tranquility = 5
)
result = /obj/item/reagent_containers/food/snacks/donkpocket/gondola
subcategory = CAT_PASTRY
@@ -473,7 +474,7 @@
reqs = list(
/datum/reagent/consumable/eggyolk = 5,
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/food/bread/plain = 1
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1
)
result = /obj/item/reagent_containers/food/snacks/khachapuri
subcategory = CAT_PASTRY
@@ -575,7 +576,7 @@
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
/obj/item/reagent_containers/food/snacks/grown/bluecherries = 1
)
- result = /obj/item/reagent_containers/food/snacks/cherrycupcake/blue
+ result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake
subcategory = CAT_PASTRY
/datum/crafting_recipe/food/honeybun
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index b8cefcb9bd80..41829e9ec2b8 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -9,7 +9,7 @@
/datum/crafting_recipe/food/sandwich
name = "Sandwich"
reqs = list(
- /obj/item/food/breadslice/plain = 2,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/meat/steak = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 1
)
@@ -19,7 +19,7 @@
/datum/crafting_recipe/food/grilledcheesesandwich
name = "Cheese sandwich"
reqs = list(
- /obj/item/food/breadslice/plain = 2,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/cheesewedge = 2
)
result = /obj/item/reagent_containers/food/snacks/grilledcheese
@@ -29,7 +29,7 @@
name = "Jelly sandwich"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
- /obj/item/food/breadslice/plain = 2,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
)
result = /obj/item/reagent_containers/food/snacks/jellysandwich/slime
subcategory = CAT_SANDWICH
@@ -38,7 +38,7 @@
name = "Jelly sandwich"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
- /obj/item/food/breadslice/plain = 2,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
)
result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry
subcategory = CAT_SANDWICH
@@ -46,7 +46,7 @@
/datum/crafting_recipe/food/notasandwich
name = "Not a sandwich"
reqs = list(
- /obj/item/food/breadslice/plain = 2,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
/obj/item/clothing/mask/fakemoustache = 1
)
result = /obj/item/reagent_containers/food/snacks/notasandwich
@@ -55,7 +55,7 @@
/datum/crafting_recipe/food/blt
name = "BLT"
reqs = list(
- /obj/item/food/breadslice/plain = 2,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/meat/bacon = 2,
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
/obj/item/reagent_containers/food/snacks/grown/tomato = 1
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
index 2ad56d0ce62b..796c360c3448 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
@@ -6,65 +6,65 @@
/datum/crafting_recipe/food/tomatopasta
name = "Tomato pasta"
reqs = list(
- /obj/item/food/spaghetti/boiledspaghetti = 1,
+ /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/grown/tomato = 2
)
- result = /obj/item/food/spaghetti/pastatomato
+ result = /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/copypasta
name = "Copypasta"
reqs = list(
- /obj/item/food/spaghetti/pastatomato = 2
+ /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato = 2
)
- result = /obj/item/food/spaghetti/copypasta
+ result = /obj/item/reagent_containers/food/snacks/spaghetti/copypasta
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/spaghettimeatball
name = "Spaghetti meatball"
reqs = list(
- /obj/item/food/spaghetti/boiledspaghetti = 1,
+ /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meatball = 2
)
- result = /obj/item/food/spaghetti/meatballspaghetti
+ result = /obj/item/reagent_containers/food/snacks/spaghetti/meatballspaghetti
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/spesslaw
name = "Spesslaw"
reqs = list(
- /obj/item/food/spaghetti/boiledspaghetti = 1,
+ /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meatball = 4
)
- result = /obj/item/food/spaghetti/spesslaw
+ result = /obj/item/reagent_containers/food/snacks/spaghetti/spesslaw
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/beefnoodle
name = "Beef noodle"
reqs = list(
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/food/spaghetti/boiledspaghetti = 1,
+ /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1
)
- result = /obj/item/food/spaghetti/beefnoodle
+ result = /obj/item/reagent_containers/food/snacks/spaghetti/beefnoodle
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/chowmein
name = "Chowmein"
reqs = list(
- /obj/item/food/spaghetti/boiledspaghetti = 1,
+ /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
/obj/item/reagent_containers/food/snacks/grown/cabbage = 2,
/obj/item/reagent_containers/food/snacks/grown/carrot = 1
)
- result = /obj/item/food/spaghetti/chowmein
+ result = /obj/item/reagent_containers/food/snacks/spaghetti/chowmein
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/butternoodles
name = "Butter Noodles"
reqs = list(
- /obj/item/food/spaghetti/boiledspaghetti = 1,
+ /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
- result = /obj/item/food/spaghetti/butternoodles
+ result = /obj/item/reagent_containers/food/snacks/spaghetti/butternoodles
subcategory = CAT_SPAGHETTI
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 2e40c8ed04c6..9d88d3107551 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -174,12 +174,36 @@
/datum/crafting_recipe/food/hotcrossbun
name = "Hot-Cross Bun"
reqs = list(
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/datum/reagent/consumable/sugar = 1
)
result = /obj/item/reagent_containers/food/snacks/hotcrossbun
subcategory = CAT_MISCFOOD
+
+/obj/item/reagent_containers/food/snacks/store/cake/brioche
+ name = "brioche cake"
+ desc = "A ring of sweet, glazed buns."
+ icon_state = "briochecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brioche
+ slices_num = 6
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
+
+/obj/item/reagent_containers/food/snacks/cakeslice/brioche
+ name = "brioche cake slice"
+ desc = "Delicious sweet-bread. Who needs anything else?"
+ icon_state = "briochecake_slice"
+ filling_color = "#FFD700"
+
+/datum/crafting_recipe/food/briochecake
+ name = "Brioche cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /datum/reagent/consumable/sugar = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/brioche
+ subcategory = CAT_MISCFOOD
+
/obj/item/reagent_containers/food/snacks/scotchegg
name = "scotch egg"
desc = "A boiled egg wrapped in a delicious, seasoned meatball."
@@ -210,7 +234,7 @@
/datum/crafting_recipe/food/mammi
name = "Mammi"
reqs = list(
- /obj/item/food/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 1,
/datum/reagent/consumable/milk = 5
)
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
index 4c2586b7dd4b..e95bdb2063a8 100644
--- a/code/modules/holiday/halloween.dm
+++ b/code/modules/holiday/halloween.dm
@@ -243,6 +243,17 @@
if(prob(5))
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE)
+/mob/living/simple_animal/hostile/clown_insane/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/nullrod))
+ if(prob(5))
+ visible_message("[src] finally found the peace it deserves. You hear honks echoing off into the distance.")
+ playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, TRUE)
+ qdel(src)
+ else
+ visible_message("[src] seems to be resisting the effect!")
+ return
+ return ..()
+
/mob/living/simple_animal/hostile/clown_insane/handle_temperature_damage()
return
@@ -250,6 +261,13 @@
// Spooky Uplink Items //
/////////////////////////
+/datum/uplink_item/dangerous/crossbow/candy
+ name = "Candy Corn Crossbow"
+ desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!"
+ category = "Holiday"
+ item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
+ surplus = 0
+
/datum/uplink_item/device_tools/emag/hack_o_lantern
name = "Hack-o'-Lantern"
desc = "An emag fitted to support the Halloween season. Candle not included."
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
index 1c6b19313ee4..1378fb0253fc 100644
--- a/code/modules/hydroponics/grown/melon.dm
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -52,3 +52,19 @@
dried_type = null
wine_power = 70 //Water to wine, baby.
wine_flavor = "divinity"
+
+/obj/item/reagent_containers/food/snacks/grown/holymelon/Initialize()
+ . = ..()
+ var/uses = 1
+ if(seed)
+ uses = round(seed.potency / 20)
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_HANDS, uses, TRUE, CALLBACK(src, PROC_REF(block_magic)), CALLBACK(src, PROC_REF(expire))) //deliver us from evil o melon god
+
+/obj/item/reagent_containers/food/snacks/grown/holymelon/proc/block_magic(mob/user, major)
+ if(major)
+ to_chat(user, "[src] hums slightly, and seems to decay a bit.")
+
+/obj/item/reagent_containers/food/snacks/grown/holymelon/proc/expire(mob/user)
+ to_chat(user, "[src] rapidly turns into ash!")
+ qdel(src)
+ new /obj/effect/decal/cleanable/ash(drop_location())
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index 73a322ce81ae..f614533d2fd5 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -163,7 +163,7 @@
name = "gatfruit"
desc = "It smells like burning."
icon_state = "gatfruit"
- trash = /obj/item/gun/ballistic/revolver/syndicate
+ trash = /obj/item/gun/ballistic/revolver
bitesize_mod = 2
foodtype = FRUIT
tastes = list("gunpowder" = 1)
diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm
index 44a987dc86ac..703df831552e 100644
--- a/code/modules/hydroponics/grown/potato.dm
+++ b/code/modules/hydroponics/grown/potato.dm
@@ -29,6 +29,25 @@
juice_results = list(/datum/reagent/consumable/potato_juice = 0)
distill_reagent = /datum/reagent/consumable/ethanol/vodka
+/obj/item/reagent_containers/food/snacks/grown/potato/wedges
+ name = "potato wedges"
+ desc = "Slices of neatly cut potato."
+ icon_state = "potato_wedges"
+ filling_color = "#E9967A"
+ bitesize = 100
+
+
+/obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W, mob/user, params)
+ if(W.get_sharpness())
+ to_chat(user, "You cut the potato into wedges with [W].")
+ var/obj/item/reagent_containers/food/snacks/grown/potato/wedges/Wedges = new /obj/item/reagent_containers/food/snacks/grown/potato/wedges
+ remove_item_from_storage(user)
+ qdel(src)
+ user.put_in_hands(Wedges)
+ else
+ return ..()
+
+
// Sweet Potato
/obj/item/seeds/potato/sweet
name = "pack of sweet potato seeds"
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index 490742d7cdf7..022b3278e92b 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -271,8 +271,9 @@
hitsound = 'sound/items/bikehorn.ogg'
/obj/item/choice_beacon/music
- name = "instrument box"
- desc = "Contains your tool of art."
+ name = "instrument delivery beacon"
+ desc = "Summon your tool of art."
+ icon_state = "gangtool-red"
/obj/item/choice_beacon/music/generate_display_names()
var/static/list/instruments
@@ -298,8 +299,9 @@
return instruments
/obj/item/choice_beacon/rnd
- name = "C.R.E.W.M.A.T.E type R&D box"
- desc = "This box contains a limited production RND package."
+ name = "C.R.E.W.M.A.T.E type R&D Choice Beacon"
+ desc = "This aging launch beacon summons a limited production RND package from a nearby orbital satellite, delivered via impact pod."
+ icon_state = "gangtool-sus"
/obj/item/choice_beacon/rnd/generate_display_names()
var/static/list/rndboxes
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 39eb08749872..cdd44cab9ae8 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -44,9 +44,6 @@
/obj/item/proc/InsertID()
return FALSE
-/obj/item/proc/GetBankCard()
- return null
-
/obj/proc/text2access(access_text)
. = list()
if(!access_text)
@@ -117,8 +114,6 @@
if (gen_ship_access(ship))
return TRUE
- if(!item)
- return FALSE
var/obj/item/card/id/id = item?.GetID()
if (id?.has_ship_access(ship))
return TRUE
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index ee953b0fb74d..20ad6e089730 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -122,7 +122,7 @@
if(!H)
return FALSE
if(!visualsOnly)
- var/datum/bank_account/bank_account = new(H.real_name, H.age)
+ var/datum/bank_account/bank_account = new(H.real_name, src)
bank_account.adjust_money(officer ? 250 : 100, "starting_money") //just a little bit of money for you
H.account_id = bank_account.account_id
@@ -179,9 +179,7 @@
var/jobtype = null
uniform = /obj/item/clothing/under/color/grey
- wallet = /obj/item/storage/wallet
id = /obj/item/card/id
- bank_card = /obj/item/card/bank
back = /obj/item/storage/backpack
shoes = /obj/item/clothing/shoes/sneakers/black
box = /obj/item/storage/box/survival
@@ -270,10 +268,9 @@
if(!J)
J = GLOB.name_occupations[H.job]
- var/obj/item/card/id/C = H.get_idcard(TRUE)
+ var/obj/item/card/id/C = H.wear_id
if(istype(C))
C.access = J.get_access()
- SEND_SIGNAL(C, COSMIG_ACCESS_UPDATED)
shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable
C.registered_name = H.real_name
if(H.job)
@@ -288,16 +285,13 @@
if(id_assignment)
C.assignment = id_assignment
C.update_label()
- H.sec_hud_set_ID()
-
- var/obj/item/card/bank/bank_card = H.get_bankcard()
- if(istype(bank_card))
- for(var/account in SSeconomy.bank_accounts)
- var/datum/bank_account/bank_account = account
- if(bank_account.account_id == H.account_id)
- bank_card.registered_account = bank_account
- bank_account.bank_cards += bank_card
+ for(var/A in SSeconomy.bank_accounts)
+ var/datum/bank_account/B = A
+ if(B.account_id == H.account_id)
+ C.registered_account = B
+ B.bank_cards += C
break
+ H.sec_hud_set_ID()
var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot)
if(istype(PDA))
diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm
index 994f34404efc..9c5d28e693e8 100644
--- a/code/modules/jobs/job_types/bartender.dm
+++ b/code/modules/jobs/job_types/bartender.dm
@@ -27,7 +27,7 @@
/datum/outfit/job/bartender/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
- var/obj/item/card/id/W = H.get_idcard()
+ var/obj/item/card/id/W = H.wear_id
if(H.age < AGE_MINOR)
W.registered_age = AGE_MINOR
to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm
index 7e84efd98de7..3fa729969013 100644
--- a/code/modules/jobs/job_types/cargo_technician.dm
+++ b/code/modules/jobs/job_types/cargo_technician.dm
@@ -4,7 +4,7 @@
outfit = /datum/outfit/job/cargo_tech
- access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
+ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN
diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm
index ab4ceb6968c0..870697476794 100644
--- a/code/modules/jobs/job_types/chaplain.dm
+++ b/code/modules/jobs/job_types/chaplain.dm
@@ -16,6 +16,8 @@
var/obj/item/storage/book/bible/booze/B = new
if(GLOB.religion)
+ if(H.mind)
+ H.mind.holy_role = HOLY_ROLE_PRIEST
B.deity_name = GLOB.deity
B.name = GLOB.bible_name
B.icon_state = GLOB.bible_icon_state
@@ -28,6 +30,8 @@
if(GLOB.religious_sect)
GLOB.religious_sect.on_conversion(H)
return
+ if(H.mind)
+ H.mind.holy_role = HOLY_ROLE_HIGHPRIEST
var/new_religion = DEFAULT_RELIGION
if(M.client && M.client.prefs.custom_names["religion"])
diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm
index 60c8ab9672b4..8293c2bd663b 100644
--- a/code/modules/jobs/job_types/janitor.dm
+++ b/code/modules/jobs/job_types/janitor.dm
@@ -22,5 +22,5 @@
/datum/outfit/job/janitor/pre_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
if(GARBAGEDAY in SSevents.holidays)
- l_pocket = /obj/item/gun/ballistic/revolver/syndicate
+ l_pocket = /obj/item/gun/ballistic/revolver
r_pocket = /obj/item/ammo_box/a357
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 1469e592b4de..2cf67b9bbf70 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -4,7 +4,7 @@
outfit = /datum/outfit/job/miner
- access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
+ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MINING, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER
diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm
index 2040764eefb9..e9ac7662edab 100644
--- a/code/modules/mapping/mapping_helpers.dm
+++ b/code/modules/mapping/mapping_helpers.dm
@@ -281,7 +281,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
if(length(table))
var/turf/food_turf = get_turf(pick(table))
new /obj/item/kitchen/knife(food_turf)
- var/obj/item/food/cake/birthday/iancake = new(food_turf)
+ var/obj/item/reagent_containers/food/snacks/store/cake/birthday/iancake = new(food_turf)
iancake.desc = "Happy birthday, Ian!"
//some balloons! this picks an open turf and pops a few balloons in and around that turf, yay.
diff --git a/code/modules/mining/drill.dm b/code/modules/mining/drill.dm
index 9a35c2b4bf11..281097be7842 100644
--- a/code/modules/mining/drill.dm
+++ b/code/modules/mining/drill.dm
@@ -218,7 +218,7 @@
/obj/machinery/drill/AltClick(mob/user)
if(active)
to_chat(user, "You begin the manual shutoff process.")
- if(do_after(user, 10, src))
+ if(do_after(user,10))
active = FALSE
soundloop.stop()
deltimer(current_timerid)
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index b6073d4c86a2..030e592d80cd 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -113,7 +113,7 @@
/obj/item/kinetic_crusher/ui_action_click(mob/user, actiontype)
set_light_on(!light_on)
- playsound(user, SOUND_EMPTY_MAG, 100, TRUE)
+ playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
update_appearance()
diff --git a/code/modules/mining/equipment/trophies.dm b/code/modules/mining/equipment/trophies.dm
index 3510a0b59628..a9631c7ffc15 100644
--- a/code/modules/mining/equipment/trophies.dm
+++ b/code/modules/mining/equipment/trophies.dm
@@ -30,7 +30,7 @@
desc = "A sliced-off goliath tentacle."
icon_state = "goliath_tentacle"
-//ancient goliath
+//ancient goliath0
/obj/item/mob_trophy/elder_tentacle
name = "elder tentacle"
desc = "The barbed tip of a tentacle sliced from an incredibly ancient goliath."
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index e48f4d5af5aa..7b80559d2691 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -501,6 +501,10 @@
if(input)
src.warcry = input
+/obj/item/immortality_talisman/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE)
+
/datum/action/item_action/hands_free/immortality
name = "Immortality"
@@ -869,8 +873,8 @@
name = "Slowpoke"
desc = "The work of a truly genius gunsmith, altered and \"improved\" by a truly deranged Nanotrasen scientist, using components from a kinetic accelerator and beam rifle. Draw, partner!"
icon = 'icons/obj/guns/energy.dmi'
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
icon_state = "spur"
item_state = "spur"
selfcharge = 1
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index 2b3e379691c9..d0704887b4ea 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -249,7 +249,7 @@
switch(action)
if("Claim")
var/mob/M = usr
- var/obj/item/card/bank/I = M.get_bankcard()
+ var/obj/item/card/id/I = M.get_idcard(TRUE)
if(points)
if(I)
I.mining_points += points
diff --git a/code/modules/mining/ore_veins.dm b/code/modules/mining/ore_veins.dm
index 32b1ffeab8d5..0df6cd187d03 100644
--- a/code/modules/mining/ore_veins.dm
+++ b/code/modules/mining/ore_veins.dm
@@ -40,8 +40,8 @@ GLOBAL_LIST_EMPTY(ore_veins)
var/max_mobs = 6
var/spawn_time = 150 //15 seconds
var/mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 20,
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 60,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 20,
/mob/living/simple_animal/hostile/asteroid/brimdemon = 20,
)
var/spawn_text = "emerges from"
@@ -126,11 +126,11 @@ GLOBAL_LIST_EMPTY(ore_veins)
max_mobs = 6
spawn_time = 100
mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 30,
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 60,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 30,
/mob/living/simple_animal/hostile/asteroid/brimdemon = 20,
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 5,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/nest = 5,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/tendril = 5,
)
/obj/structure/vein/classthree
@@ -149,18 +149,18 @@ GLOBAL_LIST_EMPTY(ore_veins)
max_mobs = 6 //Best not to go past 6 due to balance and lag reasons
spawn_time = 80
mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 30,
+ /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril = 60,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril = 30,
/mob/living/simple_animal/hostile/asteroid/brimdemon = 20,
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 10,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/nest = 10,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/tendril = 10,
)
/obj/structure/vein/ice
mob_types = list(
/mob/living/simple_animal/hostile/asteroid/wolf = 30,
/mob/living/simple_animal/hostile/asteroid/polarbear = 30,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/nest = 20,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril = 20,
/mob/living/simple_animal/hostile/asteroid/ice_demon = 10,
/mob/living/simple_animal/hostile/asteroid/ice_whelp = 5,
/mob/living/simple_animal/hostile/asteroid/lobstrosity = 20,
@@ -176,7 +176,6 @@ GLOBAL_LIST_EMPTY(ore_veins)
/obj/item/stack/ore/titanium = 2,
/obj/item/stack/ore/gold = 1,
/obj/item/stack/ore/diamond = 1,
- /obj/item/stack/ore/ice = 7,
)
/obj/structure/vein/ice/classtwo
@@ -191,7 +190,6 @@ GLOBAL_LIST_EMPTY(ore_veins)
/obj/item/stack/ore/diamond = 2,
/obj/item/stack/ore/gold = 3,
/obj/item/stack/ore/bluespace_crystal = 1,
- /obj/item/stack/ore/ice = 8,
)
max_mobs = 6
spawn_time = 100
@@ -208,7 +206,6 @@ GLOBAL_LIST_EMPTY(ore_veins)
/obj/item/stack/ore/diamond = 4,
/obj/item/stack/ore/gold = 6,
/obj/item/stack/ore/bluespace_crystal = 4,
- /obj/item/stack/ore/ice = 8,
)
max_mobs = 6
spawn_time = 80
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 55130b0a20d7..1dfe590cac0a 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -247,17 +247,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
item_state = "slag"
singular_name = "slag chunk"
-/obj/item/stack/ore/ice
- name = "ice crystals"
- desc = "Used in an electrolyzer to produce hydrogen and oxygen."
- icon_state = "Ice ore"
- item_state = "Ice ore"
- singular_name = "ice chunk"
- scan_state = "rock_Ice"
- mine_experience = 2
- grind_results = list(/datum/reagent/consumable/ice = 10)
- spreadChance = 10
-
/obj/item/gibtonite
name = "gibtonite ore"
desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law."
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index c01a20a18f64..8b0ec1d6f79d 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -3,62 +3,33 @@
/datum/sprite_accessory/ears
icon = 'icons/mob/mutant_bodyparts.dmi'
-/datum/sprite_accessory/ears/human/none
+/datum/sprite_accessory/ears/none
name = "None"
icon_state = "none"
-/datum/sprite_accessory/ears/human/elf
- icon = 'icons/mob/species/human/elf.dmi'
- name = "Elf"
- icon_state = "elf"
- secondary_color = FALSE
- color_src = SKINCOLORS
-
-/datum/sprite_accessory/ears/human/cat
- icon = 'icons/mob/species/human/cat.dmi'
+/datum/sprite_accessory/ears/cat
+ icon = 'icons/mob/species/misc/cat.dmi'
name = "Cat"
icon_state = "cat"
secondary_color = TRUE
color_src = HAIR
-/datum/sprite_accessory/ears/human/cat/slime
+/datum/sprite_accessory/ears/cat/slime
name = "Slimecat"
icon_state = "cat"
secondary_color = FALSE
color_src = HAIR
image_alpha = 150
-/datum/sprite_accessory/ears/human/dog
- icon = 'icons/mob/species/human/dog.dmi'
- name = "Dog"
- icon_state = "dog"
- secondary_color = FALSE
- color_src = HAIR
-
-/datum/sprite_accessory/ears/human/fox
- icon = 'icons/mob/species/human/fox.dmi'
+/datum/sprite_accessory/ears/fox
+ icon = 'icons/mob/species/misc/fox.dmi'
name = "Fox"
icon_state = "fox"
secondary_color = TRUE
color_src = HAIR
-/datum/sprite_accessory/ears/human/rabbit
- icon = 'icons/mob/species/human/rabbit.dmi'
- name = "Rabbit"
- icon_state = "bunny"
- secondary_color = TRUE
- color_src = HAIR
-
-/datum/sprite_accessory/ears/human/rabbit/bent
- icon = 'icons/mob/species/human/rabbit.dmi'
- name = "Bent Rabbit"
- icon_state = "bunny_bent"
- secondary_color = TRUE
- color_src = HAIR
-
-/datum/sprite_accessory/ears/human/rabbit/floppy
- icon = 'icons/mob/species/human/rabbit.dmi'
- name = "Floppy Rabbit"
- icon_state = "bunny_floppy"
- secondary_color = TRUE
- color_src = HAIR
+/datum/sprite_accessory/ears/elf
+ name = "Elf"
+ icon_state = "elf"
+ secondary_color = FALSE
+ color_src = SKINCOLORS
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 9a0da947d3b7..5a3d2eb3d62b 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -9,13 +9,13 @@
icon_state = "none"
/datum/sprite_accessory/tails/human/cat
- icon = 'icons/mob/species/human/cat.dmi'
+ icon = 'icons/mob/species/misc/cat.dmi'
name = "Cat"
icon_state = "cat"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/cat
- icon = 'icons/mob/species/human/cat.dmi'
+ icon = 'icons/mob/species/misc/cat.dmi'
name = "Cat"
icon_state = "cat"
color_src = HAIR
@@ -32,44 +32,26 @@
color_src = HAIR
image_alpha = 150
-/datum/sprite_accessory/tails/human/dog
- icon = 'icons/mob/species/human/dog.dmi'
- name = "Dog"
- icon_state = "dog"
- color_src = HAIR
-
-/datum/sprite_accessory/tails_animated/human/dog
- icon = 'icons/mob/species/human/dog.dmi'
- name = "Dog"
- icon_state = "dog"
- color_src = HAIR
-
/datum/sprite_accessory/tails/human/fox
- icon = 'icons/mob/species/human/fox.dmi'
+ icon = 'icons/mob/species/misc/fox.dmi'
name = "Fox"
icon_state = "fox"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/fox
- icon = 'icons/mob/species/human/fox.dmi'
+ icon = 'icons/mob/species/misc/fox.dmi'
name = "Fox"
icon_state = "fox"
color_src = HAIR
/datum/sprite_accessory/tails/human/fox/alt
- icon = 'icons/mob/species/human/fox.dmi'
+ icon = 'icons/mob/species/misc/fox.dmi'
name = "Fox 2"
icon_state = "fox2"
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/fox/alt
- icon = 'icons/mob/species/human/fox.dmi'
+ icon = 'icons/mob/species/misc/fox.dmi'
name = "Fox 2"
icon_state = "fox2"
color_src = HAIR
-
-/datum/sprite_accessory/tails/human/rabbit
- icon = 'icons/mob/species/human/rabbit.dmi'
- name = "Rabbit"
- icon_state = "bunny"
- color_src = HAIR
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 4a768fc1c501..6fffc48e76a1 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -68,7 +68,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
add_verb(src, list(
/mob/dead/observer/proc/dead_tele,
/mob/dead/observer/proc/open_spawners_menu,
- /mob/dead/observer/proc/tray_view))
+ /mob/dead/observer/proc/tray_view,
+ /mob/dead/observer/proc/possess_mouse_verb))
if(icon_state in GLOB.ghost_forms_with_directions_list)
ghostimage_default = image(src.icon,src,src.icon_state + "_nodir")
@@ -495,6 +496,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(isobserver(usr)) //Make sure they're an observer!
+
var/list/dest = list() //List of possible destinations (mobs)
var/target = null //Chosen target.
@@ -960,3 +962,70 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
client.images += t_ray_images
else
client.images -= stored_t_ray_images
+
+//WS Begin
+/mob/dead/observer/proc/possess_mouse_verb()
+ set category = "Ghost"
+ set name = "Possess a mouse"
+ set desc = "Possess a mouse to haunt the station.... and their food!"
+
+ var/list/possessible = list()
+
+ for(var/mob/living/simple_animal/mouse/M in GLOB.alive_mob_list)
+ if(M.stat != CONSCIOUS)
+ continue
+ if(M.key)
+ continue
+ if(M in GLOB.player_list)
+ continue
+ if(M.mind)
+ continue
+
+ possessible += M
+
+ if(!possessible.len)
+ to_chat(src, "There are currently no mice able to be possessed!")
+ return FALSE
+
+ var/mob/living/simple_animal/mouse/M = pick(possessible)
+
+ possess_mouse(M)
+
+
+/mob/dead/observer/proc/possess_mouse(mob/living/simple_animal/mouse/M)
+ if(!M)
+ return FALSE
+
+ if(!SSticker.HasRoundStarted())
+ to_chat(usr, "The round hasn't started yet!")
+ return FALSE
+
+ if(is_banned_from(key, ROLE_SENTIENCE))
+ to_chat(src, "You are job banned!")
+ return FALSE
+
+ if(alert("Are you sure you want to become a mouse? (Warning, you can no longer be cloned!)",,"Yes","No") != "Yes")
+ return FALSE
+
+ if(M.key || (M.stat != CONSCIOUS) || (M in GLOB.player_list) || M.mind || QDELETED(src) || QDELETED(M))
+ to_chat(src, "This mouse is unable to be controlled, please try again!")
+ return FALSE
+
+ log_game("[key_name(src)] has became a mouse")
+
+ M.key = key
+ M.faction = list("neutral")
+ M.chew_probability = 0 //so they cant pull off a big brain play by ghosting somewhere or idk
+ M.layer = BELOW_OPEN_DOOR_LAYER //ENGAGE ADVANCED HIDING BRAIN FUNCTIONS
+ M.language_holder = new /datum/language_holder/mouse(M)
+ M.pass_flags |= PASSDOORHATCH
+ M.sentience_act()
+ M.maxHealth = 15
+ M.health = M.maxHealth
+
+ to_chat(M , "You are now possessing a mouse. \
+ You do not remember your previous life. You can eat trash and \
+ food on the floor to gain health and help create new mice. Mouse traps will hurt your fragile body \
+ and so will any kind of weapons. You can control click food and trash items in order to eat them. Get. That. Cheese.")
+ return TRUE
+//WS End
diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm
index da3bc7c2dfb5..86d54577538c 100644
--- a/code/modules/mob/dead/observer/orbit.dm
+++ b/code/modules/mob/dead/observer/orbit.dm
@@ -57,7 +57,7 @@
var/list/misc = list()
var/list/npcs = list()
- var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE, only_realname = TRUE)
+ var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE)
for (var/name in pois)
var/list/serialized = list()
serialized["name"] = name
@@ -67,8 +67,6 @@
serialized["ref"] = REF(poi)
var/mob/M = poi
-
- serialized["fake_name"] = M.name
if (istype(M))
if (isobserver(M))
ghosts += list(serialized)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index d692e36345cb..11eeef8b4a8e 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -21,6 +21,7 @@
bubble_icon = "alien"
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
+ var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie
var/has_fine_manipulation = FALSE
status_flags = CANUNCONSCIOUS|CANPUSH
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3ed2b86816ac..dd5b29059085 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -538,7 +538,6 @@
REMOVE_TRAIT(src, TRAIT_INCAPACITATED, STAMINA)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA)
REMOVE_TRAIT(src, TRAIT_FLOORED, STAMINA)
- REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, STAMINA)
else
return
update_health_hud()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 43cefa251e34..916095ed266e 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/attackby(obj/item/W, mob/user, params)
var/obj/item/bodypart/BP = get_bodypart(check_zone(user.zone_selected))
- var/has_painkillers = reagents.has_reagent(/datum/reagent/medicine/morphine, needs_metabolizing = TRUE)
- if(W.tool_behaviour == TOOL_WELDER && IS_ROBOTIC_LIMB(BP) && BP.brute_dam) //prioritize healing if we're synthetic
+ var/has_painkillers = user.reagents.has_reagent(/datum/reagent/medicine/morphine, needs_metabolizing = TRUE)
+ if(W.tool_behaviour == TOOL_WELDER && IS_ROBOTIC_LIMB(BP) && BP.brute_dam > 5) //prioritize healing if we're synthetic
return ..()
if(user.a_intent != INTENT_HELP || !W.get_temperature() || !BP.can_bandage()) //this will also catch low damage synthetic welding
return ..()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 8743fe33289e..a7dc41b307c4 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -27,7 +27,6 @@
var/obj/item/tank/internal = null
var/obj/item/clothing/head = null
- var/obj/item/wear_id = null //only used by humans
var/obj/item/clothing/gloves = null ///only used by humans
var/obj/item/clothing/shoes/shoes = null ///only used by humans.
var/obj/item/clothing/glasses/glasses = null ///only used by humans.
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index da75efa5265a..ae867d518eb5 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -106,7 +106,7 @@
/datum/emote/living/carbon/human/tailthump/get_sound(mob/living/user)
if(!ishuman(user))
return
- if(!isnull(user.getorgan(/obj/item/organ/tail)) || (isvox(user)))
+ if(islizard(user) || (isvox(user)))
return 'sound/voice/lizard/tailthump.ogg' //https://freesound.org/people/TylerAM/sounds/389665/
/datum/emote/living/carbon/human/weh //lizard
@@ -346,7 +346,6 @@
key_third_person = "whistles"
message = "whistles!"
emote_type = EMOTE_AUDIBLE
- vary = TRUE
/datum/emote/living/carbon/human/kepiwhistle/get_sound(mob/living/user)
if(!ishuman(user))
@@ -358,4 +357,3 @@
key = "woop"
key_third_person = "woops"
message = "woops!"
- emote_type = EMOTE_AUDIBLE
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 7bbe9fb1de72..4430fc1da300 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -314,6 +314,10 @@
msg += ""
+ if(HAS_TRAIT(user, TRAIT_SPIRITUAL) && mind?.holy_role)
+ msg += "[t_He] [t_has] a holy aura about [t_him].\n"
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "religious_comfort", /datum/mood_event/religiously_comforted)
+
switch(stat)
if(UNCONSCIOUS, HARD_CRIT)
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
@@ -326,7 +330,7 @@
if(!key)
msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n"
else if(!client)
- msg += "[t_He] [t_has] been suffering from SSD - Space Sleep Disorder - for [trunc(((world.time - lastclienttime) / (1 MINUTES)))] minutes. [t_He] may snap out of it at any time! Or maybe never. It's best to leave [t_him] be.\n"
+ msg += "[t_He] appears to be suffering from SSD - Space Sleep Disorder. [t_He] may snap out of it at any time! Or maybe never. It's best to leave [t_him] be.\n"
if (length(msg))
. += "[msg.Join("")]"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 64dfdfde91ce..1cb061ff9fd9 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -501,10 +501,6 @@
else if(!(flags & SHOCK_NOGLOVES)) //This gets the siemens_coeff for all non tesla shocks
if(gloves)
siemens_coeff *= gloves.siemens_coefficient
- //If it doesnt have physiology its prob still initializing.
- if(!physiology)
- . = ..()
- return
siemens_coeff *= physiology.siemens_coeff
siemens_coeff *= dna.species.siemens_coeff
. = ..()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 567523c11d79..6556335c2bdb 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -54,6 +54,7 @@
var/obj/item/clothing/wear_suit = null
var/obj/item/clothing/w_uniform = null
var/obj/item/belt = null
+ var/obj/item/wear_id = null
var/obj/item/r_store = null
var/obj/item/l_store = null
var/obj/item/s_store = null
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 9e2cfe4f1556..5d8264c14ac3 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -101,22 +101,6 @@
if(id_card)
return id_card
-/mob/living/carbon/human/get_bankcard()
- //Check hands
- var/list/items_to_check = list()
- if(get_active_held_item())
- items_to_check += get_active_held_item()
- if(get_inactive_held_item())
- items_to_check += get_inactive_held_item()
- if(wear_id)
- items_to_check += wear_id
- if(belt)
- items_to_check += belt
- for(var/obj/item/i in items_to_check)
- var/obj/item/card/bank/bank_card = i.GetBankCard()
- if(bank_card)
- return bank_card
-
/mob/living/carbon/human/get_id_in_hand()
var/obj/item/held_item = get_active_held_item()
if(!held_item)
@@ -153,10 +137,10 @@
to_chat(src, "You can't bring yourself to use a ranged weapon!")
return FALSE
-/mob/living/carbon/proc/get_bank_account()
+/mob/living/carbon/human/proc/get_bank_account()
RETURN_TYPE(/datum/bank_account)
var/datum/bank_account/account
- var/obj/item/card/bank/I = get_bankcard()
+ var/obj/item/card/id/I = get_idcard()
if(I && I.registered_account)
account = I.registered_account
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index e2a01d29540c..e061cd5c9793 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1179,9 +1179,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(ITEM_SLOT_ID)
- if(H.wear_id)
- if(SEND_SIGNAL(H.wear_id, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE))
- return TRUE
+ if(H.wear_id && !swap)
return FALSE
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 27362b348cab..4ad5297b73d9 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -271,7 +271,7 @@
var/static/mutable_appearance/overcharge //shameless copycode from lightning spell
overcharge = overcharge || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER)
_human.add_overlay(overcharge)
- if(do_after(_human, 50, _human, TRUE))
+ if(do_after(_human, 50, _human, 1))
_human.flash_lighting_fx(5, 7, current_color)
var/obj/item/organ/stomach/ethereal/stomach = _human.getorganslot(ORGAN_SLOT_STOMACH)
playsound(_human, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index 882fffc9ff41..885be6f5886a 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -13,33 +13,16 @@
loreblurb = "Mostly hairless mammalians. Their home system, Sol, lies in a sort of \"bluespace dead-zone\" that blocks anything from entering or exiting Sol's dead-zone through bluespace without a relay. While it leaves Sol extremely well-defended, it meant that they went unnoticed and uncontacted until they were themselves able to breach it."
/datum/species/human/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
- switch(C.dna.features["ears"])
- if("Elf")
- mutantears = /obj/item/organ/ears/elf
- if("Cat")
- mutantears = /obj/item/organ/ears/cat
- if("Dog")
- mutantears = /obj/item/organ/ears/dog
- if("Fox")
- mutantears = /obj/item/organ/ears/fox
- if("Rabbit")
- mutantears = /obj/item/organ/ears/rabbit
- if("Bent Rabbit")
- mutantears = /obj/item/organ/ears/rabbit/bent
- if("Floppy Rabbit")
- mutantears = /obj/item/organ/ears/rabbit/floppy
- switch(C.dna.features["tail_human"])
- if("Cat")
- mutant_organs |= /obj/item/organ/tail/cat
- if("Dog")
- mutant_organs |= /obj/item/organ/tail/dog
- if("Fox")
- mutant_organs |= /obj/item/organ/tail/fox
- if("Fox 2")
- mutant_organs |= /obj/item/organ/tail/fox/alt
- if("Rabbit")
- mutant_organs |= /obj/item/organ/tail/rabbit
-
+ if(C.dna.features["ears"] == "Cat")
+ mutantears = /obj/item/organ/ears/cat
+ if(C.dna.features["ears"] == "Fox")
+ mutantears = /obj/item/organ/ears/fox
+ if(C.dna.features["tail_human"] == "Cat")
+ mutant_organs |= /obj/item/organ/tail/cat
+ if(C.dna.features["tail_human"] == "Fox")
+ mutant_organs |= /obj/item/organ/tail/fox
+ if(C.dna.features["ears"] == "Elf")
+ mutantears = /obj/item/organ/ears/elf
return ..()
/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 14526059354d..30f3d5f74b58 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -313,7 +313,7 @@
H.notransform = TRUE
- if(do_after(owner, delay = 60, target = owner, progress = TRUE, timed_action_flags = IGNORE_HELD_ITEM))
+ if(do_after(owner, delay=60, target=owner, progress=TRUE, timed_action_flags = IGNORE_HELD_ITEM))
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
make_dupe()
else
diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm
index 7e76fff79c1e..3278d3d77c1e 100644
--- a/code/modules/mob/living/carbon/human/species_types/kepori.dm
+++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm
@@ -10,7 +10,7 @@
disliked_food = FRIED | GROSS | CLOTH
liked_food = MEAT | GORE
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT
- loreblurb = "Kepori are a species covered in feathers vaguely reminiscent of earth’s extinct troodontidae. They’re small and sometimes seen as weak by other species due to their hollow bones but make up for that in speed and reflexes. They tend to woop when excited, scared, or for any other reason at all."
+ loreblurb = "Kepori are a species covered in feathers vaguely reminiscent of earth’s extinct troodontidae. They’re small and sometimes seen as weak by other species due to their hollow bones but make up for that in speed and reflexes. Those found in space are commonly known as rollaways. They tend to woop when excited, scared, or for any other reason at all."
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm
index 764a7166ff2d..9c0f58dc8312 100644
--- a/code/modules/mob/living/carbon/human/species_types/spider.dm
+++ b/code/modules/mob/living/carbon/human/species_types/spider.dm
@@ -147,7 +147,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
var/nutrition_threshold = NUTRITION_LEVEL_FED
if (H.nutrition >= nutrition_threshold)
to_chat(H, "You begin spinning some web...")
- if(!do_after(H, 10 SECONDS, T, hidden = TRUE))
+ if(!do_after(H, 10 SECONDS, 1, T))
to_chat(H, "Your web spinning was interrupted!")
return
if(prob(75))
@@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
to_chat(H, "You cannot wrap this.")
return
H.visible_message("[H] starts to wrap [A] into a cocoon!","You start to wrap [A] into a cocoon.")
- if(!do_after(H, 10 SECONDS, A, hidden = TRUE))
+ if(!do_after(H, 10 SECONDS, 1, A))
to_chat(H, "Your web spinning was interrupted!")
return
H.adjust_nutrition(E.spinner_rate * -3.5)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 0f3ab70e4034..beecda12b083 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -435,42 +435,17 @@ There are several things that need to be remembered:
if(s_store)
var/obj/item/I = s_store
+ var/mutable_appearance/s_store_overlay
update_hud_s_store(I)
- ///The final thing we overlay. Set on build_worn_icon.
- var/mutable_appearance/suit_store_overlay
-
- ///icon file of the clothing
- var/icon_file = I.mob_overlay_icon
-
- /// Does this clothing need to be generated via greyscale
- var/handled_by_bodytype = FALSE
-
- if(!suit_store_overlay)
- if(dna.species.bodytype & BODYTYPE_VOX)
- if(I.supports_variations & VOX_VARIATION)
- icon_file = VOX_BACK_PATH
- else
- handled_by_bodytype = TRUE
-
- else if(dna.species.bodytype & BODYTYPE_KEPORI)
-// if(I.supports_variations & KEPORI_VARIATION)
-// icon_file = KEPORI_BACK_PATH
-// else
- handled_by_bodytype = TRUE
-
- if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I)))
- icon_file = DEFAULT_BACK_PATH
- handled_by_bodytype = TRUE
-
- var/use_autogen = handled_by_bodytype ? dna.species : null
- suit_store_overlay = I.build_worn_icon(default_layer = -SUIT_STORE_LAYER, default_icon_file = icon_file, override_file = icon_file, isinhands = FALSE, override_file = icon_file, mob_species = use_autogen)
+ var/t_state = I.item_state
+ if(!t_state)
+ t_state = I.icon_state
+ s_store_overlay = I.build_worn_icon(default_layer = -SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi', override_state = t_state)
- if(!suit_store_overlay)
- return
- overlays_standing[SUIT_STORE_LAYER] = suit_store_overlay
-
- if(suit_store_overlay)
- apply_overlay(SUIT_STORE_LAYER)
+ if(!s_store_overlay)
+ return
+ overlays_standing[SUIT_STORE_LAYER] = s_store_overlay
+ apply_overlay(SUIT_STORE_LAYER)
/mob/living/carbon/human/update_inv_head()
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index d5b97a942da2..7a995dea28da 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -84,9 +84,6 @@
if(ITEM_SLOT_BACKPACK)
if(!back || !SEND_SIGNAL(back, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE))
not_handled = TRUE
- if(ITEM_SLOT_ID)
- if(!wear_id || !SEND_SIGNAL(wear_id, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE))
- not_handled = TRUE
else
not_handled = TRUE
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index c5145600bbf8..0fc21db37d8c 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -25,12 +25,9 @@
if(.) //not dead
handle_blood()
- if(isLivingSSD()) // If you're disconnected, you're going to sleep
- if(trunc((world.time - lastclienttime) / (3 MINUTES)) > 0) // After a three minute grace period, your character will fall asleep
- if(AmountSleeping() < 20)
- AdjustSleeping(20) // Adjust every 10 seconds
- if(ssd_indicator)
- cut_overlay(GLOB.ssd_indicator_overlay) // Prevents chronically SSD players from breaking immersion
+ if(isLivingSSD())//if you're disconnected, you're going to sleep
+ if(AmountSleeping() < 20)
+ AdjustSleeping(20)//adjust every 10 seconds
if(stat != DEAD)
var/bprv = handle_bodyparts()
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 755c674a107d..6a66c0546f6e 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -75,6 +75,8 @@
var/amount
if(reagents.has_reagent(/datum/reagent/medicine/morphine))
amount = -1
+ if(reagents.has_reagent(/datum/reagent/consumable/nuka_cola))
+ amount = -1
if(amount)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_reagent_speedmod, TRUE, amount)
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index 5ab2c57be0f4..cc15c12d836e 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -17,7 +17,6 @@
ADD_TRAIT(src, TRAIT_INCAPACITATED, STAMINA)
ADD_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA)
ADD_TRAIT(src, TRAIT_FLOORED, STAMINA)
- ADD_TRAIT(src, TRAIT_HANDS_BLOCKED, STAMINA)
if((maxHealth - health + getStaminaLoss()) > 120) // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems. //WS Edit - Stamina stacks with health damage
adjustStaminaLoss(30, FALSE)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 269c74a837bd..5c499fe21029 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1410,32 +1410,6 @@
if(player_logged && stat != DEAD)
return TRUE
-// The above code is kept to prevent old SSD behavior from breaking, while the code below is dedicated to the SSD Indicator
-
-GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('icons/mob/ssd_indicator.dmi', "default0", RUNECHAT_PLANE))
-
-/mob/living
- var/ssd_indicator = FALSE
- var/lastclienttime = 0
-
-/mob/living/proc/set_ssd_indicator(state)
- if(state == ssd_indicator)
- return
- ssd_indicator = state
- if(ssd_indicator && stat != DEAD)
- add_overlay(GLOB.ssd_indicator_overlay)
- else
- cut_overlay(GLOB.ssd_indicator_overlay)
-
-/mob/living/Login()
- . = ..()
- set_ssd_indicator(FALSE)
-
-/mob/living/Logout()
- . = ..()
- lastclienttime = world.time
- set_ssd_indicator(TRUE)
-
/mob/living/vv_get_header()
. = ..()
var/refid = REF(src)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 2ed00efe2e4b..eb622de65f28 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -407,13 +407,15 @@
if(client)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE)
else
- switch(rand(1, 3))
+ switch(rand(1, 4))
if(1)
new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(get_turf(src))
if(2)
new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src))
if(3)
new /mob/living/simple_animal/hostile/construct/artificer/hostile(get_turf(src))
+ if(4)
+ new /mob/living/simple_animal/hostile/construct/proteon/hostile(get_turf(src))
spawn_dust()
gib()
return TRUE
diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm
index 4a3e284addd6..ec49e59ecace 100644
--- a/code/modules/mob/living/silicon/pai/pai_defense.dm
+++ b/code/modules/mob/living/silicon/pai/pai_defense.dm
@@ -50,7 +50,7 @@
user.do_attack_animation(src)
if (user.name == master)
visible_message("Responding to its master's touch, [src] disengages its holochassis emitter, rapidly losing coherence.")
- if(do_after(user, 1 SECONDS, src, hidden = TRUE))
+ if(do_after(user, 1 SECONDS, TRUE, src))
fold_in()
if(user.put_in_hands(card))
user.visible_message("[user] promptly scoops up [user.p_their()] pAI's card.")
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 980f12897e70..d15c20f1aa1d 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -280,7 +280,7 @@
/mob/living/simple_animal/bot/floorbot/proc/is_hull_breach(turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas.
var/area/t_area = get_area(t)
- if(istype(t_area, /area/space) || istype(t_area, /area/asteroid))
+ if(istype(t_area, /area/space) || istype(t_area, /area/solar) || istype(t_area, /area/asteroid))
return FALSE
else
return TRUE
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index 1b8004cbd5b5..a1b10b897db6 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -125,7 +125,7 @@
/datum/outfit/frontier
name = "Frontiersman Corpse"
- uniform = /obj/item/clothing/under/frontiersmen
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/beret/sec/frontier
gloves = /obj/item/clothing/gloves/color/black
@@ -151,11 +151,11 @@
/datum/outfit/frontier/officer
name = "Frontiersman Officer Corpse"
- uniform = /obj/item/clothing/under/frontiersmen/officer
+ uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
suit = /obj/item/clothing/suit/armor/frontier
shoes = /obj/item/clothing/shoes/combat
ears = /obj/item/radio/headset
- head = /obj/item/clothing/head/frontier/peaked
+ head = /obj/item/clothing/head/caphat/frontier
/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy
outfit = /datum/outfit/frontier/trooper/heavy
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 646a3eb8436b..1916a7c52adb 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -270,7 +270,7 @@
maxHealth = 50
gender = FEMALE
harm_intent_damage = 10
- butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/cakeslice/birthday = 3, \
+ butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/reagent_containers/food/snacks/cakeslice/birthday = 3, \
/obj/item/reagent_containers/food/snacks/meat/slab = 2)
response_harm_continuous = "takes a bite out of"
response_harm_simple = "take a bite out of"
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index 16f377cb1b01..104d4363bc3b 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -17,7 +17,7 @@
if("Cannibalize")
if(D.health < D.maxHealth)
D.visible_message("[D] begins to cannibalize parts from [src].", "You begin to cannibalize parts from [src]...")
- if(do_after(D, 60, src, FALSE))
+ if(do_after(D, 60, 0, target = src))
D.visible_message("[D] repairs itself using [src]'s remains!", "You repair yourself using [src]'s remains.")
D.adjustBruteLoss(-src.maxHealth)
new /obj/effect/decal/cleanable/oil/streak(get_turf(src))
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 7b11d05bcf2c..cf1b0de8ae70 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -145,6 +145,9 @@ GLOBAL_VAR_INIT(mouse_killed, 0)
else
return ..()
+/mob/living/simple_animal/mouse/attack_ghost(mob/dead/observer/user)
+ user.possess_mouse(src)
+
/mob/living/simple_animal/mouse/start_pulling(atom/movable/AM, state, force, supress_message)
return FALSE
@@ -162,7 +165,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0)
visible_message(
"[src] starts eating away [A]...",
"You start eating the [A]...")
- if(do_after(src, 30, A, hidden = TRUE))
+ if(do_after(src, 30, FALSE, A))
if(QDELETED(A))
return
visible_message(
diff --git a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
index ddae7a07397b..040b6b26ae2a 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
@@ -2,54 +2,27 @@
name = "Frontiersman"
desc = "A frontiersman! A terrorist that would probably kill everyone without mercy."
icon_state = "frontiersmanmelee"
- icon = 'icons/mob/simple_frontiersman.dmi'
icon_living = "frontiersmanmelee"
icon_dead = "frontiersmanmelee_dead"
speak_chance = 0
melee_damage_lower = 15
melee_damage_upper = 15
loot = list(/obj/effect/mob_spawn/human/corpse/frontier,
- /obj/item/kitchen/knife/combat/survival)
+ /obj/item/kitchen/knife)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
faction = list(FACTION_ANTAG_FRONTIERSMEN)
- footstep_type = FOOTSTEP_MOB_SHOE
-
-/mob/living/simple_animal/hostile/human/frontier/internals
- icon_state = "frontiersmanmelee_mask"
- icon_living = "frontiersmanmelee_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier,
- /obj/item/clothing/mask/gas/sechailer,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
/mob/living/simple_animal/hostile/human/frontier/ranged
icon_state = "frontiersmanranged"
icon_living = "frontiersmanranged"
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
- /obj/item/gun/ballistic/revolver/syndicate)
+ /obj/item/gun/ballistic/revolver)
ranged = 1
retreat_distance = 5
minimum_distance = 5
projectilesound = 'sound/weapons/gun/revolver/shot.ogg'
casingtype = /obj/item/ammo_casing/a357
-/mob/living/simple_animal/hostile/human/frontier/ranged/internals
- icon_state = "frontiersmanranged_mask"
- icon_living = "frontiersmanranged_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
- /obj/item/gun/ballistic/revolver,
- /obj/item/clothing/mask/gas/sechailer,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/internals/neutered
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
- /obj/item/clothing/mask/gas/sechailer,
- /obj/item/tank/internals/emergency_oxygen/engi)
-
/mob/living/simple_animal/hostile/human/frontier/ranged/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
@@ -61,21 +34,6 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
-/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/internals
- icon_state = "frontiersmanrangedrifle_mask"
- icon_living = "frontiersmanrangedrifle_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
- /obj/item/gun/ballistic/rifle/illestren,
- /obj/item/clothing/mask/gas/sechailer,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/internals/neutered
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
- /obj/item/clothing/mask/gas/sechailer,
- /obj/item/tank/internals/emergency_oxygen/engi)
-
/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
@@ -89,21 +47,6 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/shotgun/brimstone)
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals
- icon_state = "frontiersmanrangedelite_mask"
- icon_living = "frontiersmanrangedelite_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
- /obj/item/gun/ballistic/shotgun/brimstone,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals/neutered
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
-
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
@@ -117,21 +60,6 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/automatic/assault/skm)
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals
- icon_state = "frontiersmanrangedak47_mask"
- icon_living = "frontiersmanrangedak47_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
- /obj/item/gun/ballistic/automatic/assault/skm,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals/neutered
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
-
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
@@ -144,21 +72,6 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals
- icon_state = "frontiersmanrangedmosin_mask"
- icon_living = "frontiersmanrangedmosin_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
- /obj/item/gun/ballistic/rifle/illestren,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals/neutered
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
-
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
@@ -174,21 +87,6 @@
projectiletype = /obj/projectile/beam/weak/penetrator
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy)
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/internals
- icon_state = "frontiersmanrangedminigun_mask"
- icon_living = "frontiersmanrangedminigun_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
-
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless)
@@ -203,20 +101,10 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
/obj/item/gun/ballistic/automatic/pistol/APS)
-/mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals
- icon_state = "frontiersmanofficer_mask"
- icon_living = "frontiersmanofficer_mask"
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
- /obj/item/gun/ballistic/automatic/pistol/APS,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals/neutered
- loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/internals/emergency_oxygen/engi)
-
/mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer)
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/Aggro()
+ ..()
+ summon_backup(15)
+ say(pick("Help!!", "They're right here!!", "Don't let me die!!"))
diff --git a/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
index b251dda91e48..675c6fc99342 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
@@ -47,8 +47,8 @@
melee_damage_upper = 30
deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!"
loot = list(/obj/effect/decal/remains/human,
- /obj/item/clothing/suit/armor/witchhunter,
- /obj/item/clothing/head/witchunter,
+ /obj/item/clothing/suit/armor/riot/chaplain,
+ /obj/item/clothing/head/helmet/chaplain,
/obj/item/claymore/weak{name = "holy sword"})
/mob/living/simple_animal/hostile/human/skeleton/ice
diff --git a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
index a88a79610b60..b4769b647aad 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm
@@ -189,6 +189,10 @@
casingtype = /obj/item/ammo_casing/c45
projectilesound = 'sound/weapons/gun/smg/shot.ogg'
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/pilot //caravan ambush ruin
+ name = "Ramzi Clique Salvage Pilot"
+ loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
+
/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space
icon_state = "syndicate_space_smg"
icon_living = "syndicate_space_smg"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
index a762a9298279..3a4506b62562 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
@@ -232,6 +232,7 @@
projectiletype = /obj/projectile/tentacle
projectilesound = 'sound/effects/splat.ogg'
Shoot(target)
+
/////TENTACLE END
/////STING ATTACK
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
index 03faa787d155..00a32a8dc449 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
@@ -322,3 +322,4 @@ Difficulty: Extremely Hard
var/turf/T = get_turf(target)
mineral_scan_pulse(T, world.view + 1)
. = ..()
+
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index 04723d80ba5a..0c13b9d67f16 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -49,6 +49,9 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe
mob_biotypes = MOB_ROBOTIC
gps_name = "Hungry Signal"
+ achievement_type = /datum/award/achievement/boss/swarmer_beacon_kill
+ crusher_achievement_type = /datum/award/achievement/boss/swarmer_beacon_crusher
+ score_achievement_type = /datum/award/score/swarmer_beacon_score
faction = list("mining", "boss", "swarmer")
weather_immunities = list("lava","ash")
stop_automated_movement = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index b03363e956f1..d10b9b86fb9b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -1,3 +1,4 @@
+#define LEGIONVIRUS_TYPE /datum/disease/transformation/legionvirus
#define BULLET_SHELL_DAMAGE 1
//A beast that fire freezing blasts.
@@ -203,6 +204,7 @@
projectiletype = /obj/projectile/temp/basilisk/heated
#undef BULLET_SHELL_DAMAGE
+#undef LEGIONVIRUS_TYPE
//Watcher
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher
@@ -338,8 +340,8 @@
if(istype(L))
L.apply_status_effect(/datum/status_effect/freon/watcher)
-/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/nest
- from_nest = TRUE
+/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
+ fromtendril = TRUE
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/forgotten
name = "forgotten watcher"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
index 769f6ce3d5fa..815bfca00028 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
@@ -14,7 +14,7 @@
emote_hear = list("cackles","screeches")
stat_attack = CONSCIOUS
ranged_cooldown_time = 5 SECONDS
- vision_range = 6
+ vision_range = 9
retreat_distance = 2
speed = 3
move_to_delay = 5
@@ -98,7 +98,7 @@
visible_message(span_danger("[src] starts charging!"))
balloon_alert(src, "charging...")
to_chat(src, "You begin to charge up...")
- fire_laser()
+ addtimer(CALLBACK(src, PROC_REF(fire_laser)), 1 SECONDS)
COOLDOWN_START(src, ranged_cooldown, ranged_cooldown_time)
/mob/living/simple_animal/hostile/asteroid/brimdemon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
@@ -115,6 +115,10 @@
/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/fire_laser()
if(stat == DEAD)
return
+ visible_message(span_danger("[src] fires a brimbeam!"))
+ balloon_alert(src, "brimbeam fired")
+ playsound(src, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3)
+ cut_overlay("brimdemon_telegraph_dir")
var/turf/target_turf = get_ranged_target_turf(src, dir, BRIMBEAM_RANGE)
var/turf/origin_turf = get_turf(src)
var/list/affected_turfs = get_line(origin_turf, target_turf) - origin_turf
@@ -131,30 +135,15 @@
var/atom/new_brimbeam = new /obj/effect/brimbeam(affected_turf)
new_brimbeam.dir = dir
beamparts += new_brimbeam
- animate(new_brimbeam, 1 SECONDS, alpha = 255)
+ for(var/mob/living/hit_mob in affected_turf.contents)
+ hit_mob.adjustFireLoss(35)
+ to_chat(hit_mob, span_userdanger("You're hit by [src]'s brimbeam!"))
if(length(beamparts))
var/atom/last_brimbeam = beamparts[length(beamparts)]
last_brimbeam.icon_state = "brimbeam_end"
var/atom/first_brimbeam = beamparts[1]
first_brimbeam.icon_state = "brimbeam_start"
- addtimer(CALLBACK(src, PROC_REF(kill_people)), 1 SECONDS)
- addtimer(CALLBACK(src, PROC_REF(end_laser)), 3 SECONDS)
-
-/// Tells the lasers to start murdering people
-/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/kill_people()
- if(stat == DEAD)
- end_laser()
- return
- playsound(src, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3)
- visible_message(span_danger("[src] fires a brimbeam!"))
- balloon_alert(src, "brimbeam fired")
- cut_overlay("brimdemon_telegraph_dir")
- for(var/obj/effect/brimbeam/beam in beamparts)
- var/turf/affected_turf = get_turf(beam)
- START_PROCESSING(SSfastprocess, beam)
- for(var/mob/living/hit_mob in affected_turf.contents)
- hit_mob.adjustFireLoss(35)
- to_chat(hit_mob, span_userdanger("You're hit by [src]'s brimbeam!"))
+ addtimer(CALLBACK(src, PROC_REF(end_laser)), 2 SECONDS)
/// Deletes all the brimbeam parts and sets variables back to their initial ones.
/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/end_laser()
@@ -174,12 +163,15 @@
icon_state = "brimbeam_mid"
layer = ABOVE_MOB_LAYER
plane = -2
- alpha = 150
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
light_color = LIGHT_COLOR_BLOOD_MAGIC
light_power = 3
light_range = 2
+/obj/effect/brimbeam/Initialize()
+ . = ..()
+ START_PROCESSING(SSfastprocess, src)
+
/obj/effect/brimbeam/Destroy()
STOP_PROCESSING(SSfastprocess, src)
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index 94dd221945b9..cb7eaad0e988 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -185,6 +185,7 @@
move_to_delay = 5
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
+ butcher_results = list()
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1)
deathmessage = "falls to the ground."
status_flags = CANPUSH
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index e4478b705f45..d8aedc292ca0 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -213,7 +213,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/saddle) && !saddled)
- if(tame && do_after(user, 55, target=src))
+ if(tame && do_after(user,55,target=src))
user.visible_message("You manage to put [O] on [src], you can now ride [p_them()].")
qdel(O)
saddled = TRUE
@@ -250,7 +250,10 @@
health = 180
speed = 4
//mob_trophy = /obj/item/mob_trophy/elder_tentacle
+ pre_attack_icon = "ancient_goliath_preattack"
+ throw_message = "does nothing to the rocky hide of the"
guaranteed_butcher_results = list()
+ trophy_drop_mod = 75
wander = FALSE
bonus_tame_chance = 10
var/list/cached_tentacle_turfs
@@ -277,9 +280,9 @@
else
cached_tentacle_turfs -= t
-/mob/living/simple_animal/hostile/asteroid/goliath/beast/nest
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/sinew = 2)
- from_nest = TRUE
+ fromtendril = TRUE
//tentacles
/obj/effect/temp_visual/goliath_tentacle
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index b7ca291a5be4..d637b19a2a08 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -164,7 +164,7 @@
if(stored_mob)
stored_mob.forceMove(get_turf(src))
stored_mob = null
- else if(from_nest)
+ else if(fromtendril)
new /obj/effect/mob_spawn/human/corpse/charredskeleton(T)
else if(dwarf_mob)
new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf(T)
@@ -172,11 +172,11 @@
new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T)
..(gibbed)
-/mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest
- from_nest = TRUE
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril
+ fromtendril = TRUE
-/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/nest
- from_nest = TRUE
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/tendril
+ fromtendril = TRUE
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf/death(gibbed)
move_force = MOVE_FORCE_DEFAULT
@@ -208,7 +208,7 @@
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "is shrugged off by"
del_on_death = TRUE
- stat_attack = SOFT_CRIT
+ stat_attack = HARD_CRIT
robust_searching = 1
var/can_infest_dead = FALSE
@@ -222,7 +222,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff/Initialize()
. = ..()
- addtimer(CALLBACK(src, PROC_REF(death)), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(death)), 50)
AddComponent(/datum/component/swarming)
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
@@ -230,8 +230,6 @@
if(stat == DEAD || !isturf(loc))
return
for(var/mob/living/carbon/human/victim in range(src, 1)) //Only for corpse right next to/on same tile
- if(istype(victim.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull)) // no double dipping
- continue
switch(victim.stat)
if(UNCONSCIOUS, HARD_CRIT)
infest(victim)
@@ -241,87 +239,21 @@
infest(victim)
return //This will qdelete the legion.
+
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
- visible_message(span_warning("[name] burrows into the flesh of [H]!"))
- if(H.stat != DEAD)
- var/obj/item/organ/legion_skull/throwyouabone = new()
- throwyouabone.Insert(H)
+ visible_message("[name] burrows into the flesh of [H]!")
+ var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
+ if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
+ L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
else
- var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
- if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
- L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
- else
- L = new(H.loc)
- visible_message(span_warning("[L] staggers to [L.p_their()] feet!"))
- H.adjustBruteLoss(1000)
- L.stored_mob = H
- H.forceMove(L)
+ L = new(H.loc)
+ visible_message("[L] staggers to [L.p_their()] feet!")
+ H.death()
+ H.adjustBruteLoss(1000)
+ L.stored_mob = H
+ H.forceMove(L)
qdel(src)
-/obj/item/organ/legion_skull
- name = "legion skull"
- desc = "The skull of a legion, likely torn from a soon-to-be host."
- icon_state = "legion_skull"
- zone = BODY_ZONE_CHEST
- slot = ORGAN_SLOT_REGENERATIVE_CORE
- grind_results = list(/datum/reagent/medicine/soulus = 2, /datum/reagent/blood = 5)
- var/datum/disease/transformation/legionvirus/malignance
- var/malignance_countdown = 5 MINUTES
- var/malignance_tracker
-
-/obj/item/organ/legion_skull/on_find(mob/living/finder)
- ..()
- to_chat(finder, span_warning("You found a skull-shaped growth in [owner]'s [zone]!"))
-
-/obj/item/organ/legion_skull/Insert(mob/living/carbon/M, special = 0)
- ..()
- malignance = new()
- malignance.infect(M, FALSE) //we handle all the fancy virus stuff in the organ, so we need a reference for it
- malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME)
- M.heal_overall_bleeding(12) //stop dying so fast
-
-/obj/item/organ/legion_skull/Remove(mob/living/carbon/M, special = 0)
- malignance_countdown = initial(malignance_countdown)
- deltimer(malignance_tracker)
- malignance_tracker = null
- malignance.cure()
- ..()
-
-/obj/item/organ/legion_skull/on_life()
- . = ..()
- skull_check()
-
-/obj/item/organ/legion_skull/on_death()
- . = ..()
- skull_check()
-
-/// track our timers and reagents
-/obj/item/organ/legion_skull/proc/skull_check()
- if(!malignance)
- malignance = new()
- malignance.infect(owner, FALSE)
- if(owner.reagents.has_reagent(/datum/reagent/medicine/synaptizine, needs_metabolizing = TRUE) || owner.reagents.has_reagent(/datum/reagent/medicine/spaceacillin, needs_metabolizing = TRUE))
- if(isnull(timeleft(malignance_tracker))) //ruhehehehehe
- malignance_countdown = min(malignance_countdown + 1 SECONDS, initial(malignance_countdown)) //slightly improve our resistance to dying so we don't turn the second a treatment runs out
- return
- malignance_countdown = timeleft(malignance_tracker) //pause our timer if we have the reagents
- deltimer(malignance_tracker)
- malignance_tracker = null //you would think deltimer would do this but it actually doesn't track a direct reference!
- return
- if(!malignance_tracker)
- malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME) //and resume if we run out
-
-/// Updates the stage of our tied disease
-/obj/item/organ/legion_skull/proc/update_stage()
- malignance.update_stage(min(malignance.stage + 1, malignance.max_stages))
- if(malignance.stage == 5)
- malignance.stage_act() //force the transformation here, then delete everything
- qdel(malignance)
- qdel(src)
- return
- malignance_countdown = initial(malignance_countdown)
- malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME)
-
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced
name = "Signifer"
@@ -388,7 +320,7 @@
/mob/living/simple_animal/hostile/big_legion/Initialize()
.=..()
- AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest), 200, faction, "peels itself off from", 3)
+ AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril), 200, faction, "peels itself off from", 3)
// Snow Legion
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow
@@ -413,8 +345,8 @@
icon_aggro = "snowlegion_head"
icon_dead = "snowlegion_head"
-/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/nest
- from_nest = TRUE
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril
+ fromtendril = TRUE
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/crystal
name = "disfigured legion"
@@ -423,6 +355,7 @@
icon_living = "disfigured_legion"
icon_aggro = "disfigured_legion"
icon_dead = "disfigured_legion"
+ difficulty = 2
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/crystal
loot = list(/obj/item/organ/regenerative_core/legion/crystal)
@@ -444,7 +377,7 @@
P.fire(i*(360/5))
return ..()
-//nest-spawned Legion remains, the charred skeletons of those whose bodies sank into lava or fell into chasms.
+//Tendril-spawned Legion remains, the charred skeletons of those whose bodies sank into lava or fell into chasms.
/obj/effect/mob_spawn/human/corpse/charredskeleton
name = "charred skeletal remains"
burn_damage = 1000
@@ -481,16 +414,19 @@
)
)
- var/outfit_map = list(
- "Miner" = /datum/outfit/generic/miner,
- "Assistant" = /datum/outfit/generic,
- "Engineer" = /datum/outfit/generic/engineer,
- "Doctor" = /datum/outfit/generic/doctor,
- "Scientist" = /datum/outfit/generic/science,
- "Cargo" = /datum/outfit/generic/cargo,
- "Security" = /datum/outfit/generic/security
- )
-
- outfit = outfit_map[type] // Access outfit directly
-
+ switch(type)
+ if("Miner")
+ outfit = /datum/outfit/generic/miner
+ if("Assistant")
+ outfit = /datum/outfit/generic
+ if("Engineer")
+ outfit = /datum/outfit/generic/engineer
+ if("Doctor")
+ outfit = /datum/outfit/generic/doctor
+ if("Scientist")
+ outfit = /datum/outfit/generic/science
+ if("Cargo")
+ outfit = /datum/outfit/generic/cargo
+ if("Security")
+ outfit = /datum/outfit/generic/security
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
index 09d85a664e86..0dca4c21dade 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
@@ -46,8 +46,8 @@
belt = pickweight(list(
/obj/item/gun/ballistic/automatic/pistol/candor = 2,
/obj/item/gun/ballistic/automatic/pistol/commander = 1,
- /obj/item/gun/ballistic/automatic/pistol/syndicate = 1,
- /obj/item/gun/ballistic/revolver/syndicate = 1,
+ /obj/item/gun/ballistic/automatic/pistol = 1,
+ /obj/item/gun/ballistic/revolver = 1,
/obj/item/gun/ballistic/revolver/firebrand = 1,
)
)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
similarity index 100%
rename from code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm
rename to code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
similarity index 100%
rename from code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm
rename to code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
index 6beb2f23b9e6..eaf546b3f627 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
@@ -15,7 +15,7 @@
var/mob_trophy
var/throw_message = "bounces off of"
var/throw_deflection = 20 //WS edit - Whitesands
- var/from_nest = FALSE
+ var/fromtendril = FALSE
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
mob_size = MOB_SIZE_LARGE
@@ -70,13 +70,12 @@
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type)
- if(prob(trophy_drop_mod)) //on average, you'll need to kill 5 creatures before getting the item
+ if(prob(trophy_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
spawn_mob_trophy()
..(gibbed)
/mob/living/simple_animal/hostile/asteroid/proc/spawn_mob_trophy()
- if(mob_trophy)
- butcher_results[mob_trophy] = 1
+ butcher_results[mob_trophy] = 1
/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
if(bodytemperature < minbodytemp)
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index 25827781b4b8..55d873cf036a 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -167,3 +167,48 @@
attack_verb_simple = "punch"
deathmessage = "falls apart into a fine dust."
phaser = FALSE
+
+/obj/structure/spawner/nether
+ name = "netherworld link"
+ desc = null //see examine()
+ icon_state = "nether"
+ max_integrity = 50
+ spawn_time = 600 //1 minute
+ max_mobs = 15
+ spawn_text = "crawls through"
+ mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody)
+ faction = list("nether")
+
+/obj/structure/spawner/nether/Initialize()
+ .=..()
+ START_PROCESSING(SSprocessing, src)
+
+/obj/structure/spawner/nether/examine(mob/user)
+ . = ..()
+ if(isskeleton(user) || iszombie(user))
+ . += "A direct link to another dimension full of creatures very happy to see you. You can see your house from here!"
+ else
+ . += "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea."
+
+/obj/structure/spawner/nether/attack_hand(mob/user)
+ . = ..()
+ if(isskeleton(user) || iszombie(user))
+ to_chat(user, "You don't feel like going home yet...")
+ else
+ user.visible_message("[user] is violently pulled into the link!", \
+ "Touching the portal, you are quickly pulled through into a world of unimaginable horror!")
+ contents.Add(user)
+
+/obj/structure/spawner/nether/process()
+ for(var/mob/living/M in contents)
+ if(M)
+ playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE)
+ M.adjustBruteLoss(60)
+ new /obj/effect/gibspawner/generic(get_turf(M), M)
+ if(M.stat == DEAD)
+ var/mob/living/simple_animal/hostile/netherworld/blankbody/blank
+ blank = new(loc)
+ blank.name = "[M]"
+ blank.desc = "It's [M], but [M.p_their()] flesh has an ashy texture, and [M.p_their()] face is featureless save an eerie smile."
+ src.visible_message("[M] reemerges from the link!")
+ qdel(M)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 06c7a9af52d8..c7070a66bcdf 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1202,7 +1202,6 @@
var/list/searching = GetAllContents()
var/search_id = 1
var/search_pda = 1
- var/search_bankcard = 1
for(var/A in searching)
if(search_id && istype(A, /obj/item/card/id))
@@ -1210,24 +1209,18 @@
if(ID.registered_name == oldname)
ID.registered_name = newname
ID.update_label()
- if(!search_pda || !search_bankcard)
+ if(ID.registered_account?.account_holder == oldname)
+ ID.registered_account.account_holder = newname
+ if(!search_pda)
break
search_id = 0
- if(search_bankcard && istype(A, /obj/item/card/bank))
- var/obj/item/card/bank/bank_card = A
- if(bank_card.registered_account?.account_holder == oldname)
- bank_card.registered_account.account_holder = newname
- if(!search_id || !search_pda)
- break
- search_bankcard = 0
-
else if(search_pda && istype(A, /obj/item/pda))
var/obj/item/pda/PDA = A
if(PDA.owner == oldname)
PDA.owner = newname
PDA.update_label()
- if(!search_id || !search_bankcard)
+ if(!search_id)
break
search_pda = 0
@@ -1310,9 +1303,6 @@
/mob/proc/get_idcard(hand_first)
return
-/mob/proc/get_bankcard()
- return
-
/mob/proc/get_id_in_hand()
return
diff --git a/code/modules/mob_spawner/burrow.dm b/code/modules/mob_spawner/burrow.dm
deleted file mode 100644
index f8d4c31bc87f..000000000000
--- a/code/modules/mob_spawner/burrow.dm
+++ /dev/null
@@ -1,109 +0,0 @@
-GLOBAL_LIST_INIT(ore_probability, list(
- /obj/item/stack/ore/plasma = 75,
- /obj/item/stack/ore/iron = 75,
- /obj/item/stack/ore/titanium = 50,
- /obj/item/stack/ore/silver = 50,
- /obj/item/stack/ore/gold = 50,
- /obj/item/stack/ore/uranium = 50,
- /obj/item/stack/ore/diamond = 25,
- /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
- /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25,
- /obj/effect/mob_spawn/human/corpse/damaged/legioninfested = 25
- ))
-
-/obj/structure/spawner/burrow
- name = "burrow entrance"
- desc = "A hole in the ground, filled with fauna ready to defend it."
- max_integrity = 250
- faction = list("mining")
- max_mobs = 3
-
-/obj/structure/spawner/burrow/Initialize()
- . = ..()
- clear_rock()
-
-/**
- * Clears rocks around the spawner when it is created
- *
- */
-/obj/structure/spawner/burrow/proc/clear_rock()
- for(var/turf/F in RANGE_TURFS(2, src))
- if(abs(src.x - F.x) + abs(src.y - F.y) > 3)
- continue
- if(ismineralturf(F))
- var/turf/closed/mineral/M = F
- M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
-
-/obj/structure/spawner/burrow/deconstruct(disassembled)
- destroy_effect()
- drop_loot()
- return ..()
-
-/**
- * Effects and messages created when the spawner is destroyed
- *
- */
-/obj/structure/spawner/burrow/proc/destroy_effect()
- playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE)
- visible_message("[src] collapses, sealing everything inside!\nOres fall out of the burrow as it is destroyed!")
-
-/**
- * Drops items after the spawner is destroyed
- *
- */
-/obj/structure/spawner/burrow/proc/drop_loot()
- for(var/type in GLOB.ore_probability)
- var/chance = GLOB.ore_probability[type]
- if(!prob(chance))
- continue
- new type(loc, rand(5, 10))
-
-/obj/structure/spawner/burrow/lava_planet
- mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 27,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 26,
- /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/nest = 26,
- /mob/living/simple_animal/hostile/asteroid/brimdemon = 20,
- /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing = 1
- )
-
-/obj/structure/spawner/burrow/sand_planet
- mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 40,
- /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40,
- /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 20
- )
-
-/obj/structure/spawner/burrow/ice_planet
- mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/wolf,
- /mob/living/simple_animal/hostile/asteroid/polarbear
- )
-
-/obj/structure/spawner/burrow/ice_planet/hard
- mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/brimdemon = 35,
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/nest = 35,
- /mob/living/simple_animal/hostile/asteroid/ice_whelp = 15,
- /mob/living/simple_animal/hostile/asteroid/ice_demon = 15
- )
-
-/obj/structure/spawner/burrow/jungle_planet
- mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/wolf/random,
- /mob/living/simple_animal/hostile/retaliate/bat,
- /mob/living/simple_animal/hostile/retaliate/poison/snake
- )
-
-/obj/structure/spawner/burrow/rock_plant
- mob_types = list(
- /mob/living/simple_animal/hostile/asteroid/goliath/beast/rockplanet,
- /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/rockplanet
- )
-
-/obj/structure/spawner/burrow/asteroid
- mob_types = list (
- /mob/living/simple_animal/hostile/asteroid/goliath,
- /mob/living/simple_animal/hostile/asteroid/hivelord,
- /mob/living/simple_animal/hostile/carp
- )
diff --git a/code/modules/mob_spawner/hivebot.dm b/code/modules/mob_spawner/hivebot.dm
deleted file mode 100644
index 630ed6f6f3c7..000000000000
--- a/code/modules/mob_spawner/hivebot.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-/obj/structure/spawner/hivebot
- name = "hivebot fabricator"
- desc = "An active fabricator, creating hivebots out of resources from below the surface."
-
- icon = 'icons/obj/machines/bsm.dmi'
- icon_state = "bsm_on"
-
- faction = list("mining")
- max_integrity = 250
- mob_types = list(
- /mob/living/simple_animal/hostile/hivebot/wasteplanet = 40,
- /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged = 40,
- /mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid = 10,
- /mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 5,
- /mob/living/simple_animal/hostile/hivebot/mechanic = 5
- )
- spawn_text = "crawls out of"
- spawn_sound = list('sound/effects/suitstep2.ogg')
- resistance_flags = FIRE_PROOF | LAVA_PROOF
- var/obj/effect/light_emitter/hivespawner/emitted_light
-
-/obj/structure/spawner/hivebot/Initialize()
- . = ..()
- emitted_light = new(loc)
-
-/obj/structure/spawner/hivebot/deconstruct(disassembled)
- destroy_effect()
- drop_loot()
- return ..()
-
-/obj/structure/spawner/hivebot/Destroy()
- QDEL_NULL(emitted_light)
- return ..()
-
-/obj/structure/spawner/hivebot/proc/destroy_effect()
- playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE)
- visible_message("[src] begins to rattle and shake, sparks flying off of it!")
-
-
-/obj/structure/spawner/hivebot/proc/drop_loot()
- var/datum/effect_system/smoke_spread/smoke = new
- smoke.set_up(2, loc)
- smoke.start()
- new /obj/effect/particle_effect/sparks(loc)
- new /obj/effect/spawner/lootdrop/waste/hivebot/beacon(loc)
-
-/obj/effect/light_emitter/hivespawner
- set_luminosity = 4
- set_cap = 2.5
- light_color = COLOR_RED_LIGHT
diff --git a/code/modules/mob_spawner/spawner.dm b/code/modules/mob_spawner/spawner.dm
deleted file mode 100644
index f5cfdadd0e96..000000000000
--- a/code/modules/mob_spawner/spawner.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/obj/structure/spawner
- name = "monster nest"
- icon = 'icons/mob/nest.dmi'
- icon_state = "hole"
- max_integrity = 100
-
- move_resist = INFINITY
- anchored = TRUE
- density = TRUE
-
- var/max_mobs = 5
- var/spawn_time = 300 //30 seconds default
- var/mob_types = list(/mob/living/simple_animal/hostile/carp)
- var/spawn_text = "emerges from"
- var/faction = list("hostile")
- var/spawn_sound = list('sound/effects/break_stone.ogg')
- var/spawner_type = /datum/component/spawner
- var/spawn_distance_min = 1
- var/spawn_distance_max = 1
-
-/obj/structure/spawner/Initialize()
- . = ..()
- AddComponent(spawner_type, mob_types, spawn_time, faction, spawn_text, max_mobs, spawn_sound, spawn_distance_min, spawn_distance_max)
-
-/obj/structure/spawner/attack_animal(mob/living/simple_animal/M)
- if(faction_check(faction, M.faction, FALSE)&&!M.client)
- return
- ..()
-
-/obj/structure/spawner/carp
- name = "carp spawn" //the non game spawn meaning
- desc = "A puddle, which appears to be full of carp"
- icon_state = "puddle"
- icon = 'icons/obj/watercloset.dmi'
- max_integrity = 150
- max_mobs = 5
- spawn_time = 1200
- mob_types = list(/mob/living/simple_animal/hostile/carp)
- spawn_text = "swims out of"
- faction = list("carp")
diff --git a/code/modules/modular_computers/file_system/programs/bounty_board.dm b/code/modules/modular_computers/file_system/programs/bounty_board.dm
index b3b9051e5b8f..496011cfdddd 100644
--- a/code/modules/modular_computers/file_system/programs/bounty_board.dm
+++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm
@@ -25,8 +25,8 @@
if(!networked)
GLOB.allbountyboards += computer
networked = TRUE
- if(card_slot && card_slot.bank_card && card_slot.bank_card.registered_account)
- current_user = card_slot.bank_card.registered_account
+ if(card_slot && card_slot.stored_card && card_slot.stored_card.registered_account)
+ current_user = card_slot.stored_card.registered_account
for(var/i in GLOB.request_list)
if(!i)
continue
diff --git a/code/modules/modular_computers/file_system/programs/cargoship.dm b/code/modules/modular_computers/file_system/programs/cargoship.dm
index 2aa9b68565ca..1bfe53b215f2 100644
--- a/code/modules/modular_computers/file_system/programs/cargoship.dm
+++ b/code/modules/modular_computers/file_system/programs/cargoship.dm
@@ -35,21 +35,21 @@
// Get components
var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
- var/obj/item/card/bank/bank_card = card_slot ? card_slot.stored_card : null
+ var/obj/item/card/id/id_card = card_slot ? card_slot.stored_card : null
if(!card_slot || !printer) //We need both to successfully use this app.
return
switch(action)
if("ejectid")
- if(bank_card)
+ if(id_card)
card_slot.try_eject(TRUE, usr)
if("selectid")
- if(!bank_card)
+ if(!id_card)
return
- if(!bank_card.registered_account)
+ if(!id_card.registered_account)
playsound(get_turf(ui_host()), 'sound/machines/buzz-sigh.ogg', 50, TRUE, -1)
return
- payments_acc = bank_card.registered_account
+ payments_acc = id_card.registered_account
playsound(get_turf(ui_host()), 'sound/machines/ping.ogg', 50, TRUE, -1)
if("resetid")
payments_acc = null
diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm
index 1ef62b7617f3..1acdb72f400e 100644
--- a/code/modules/modular_computers/hardware/card_slot.dm
+++ b/code/modules/modular_computers/hardware/card_slot.dm
@@ -8,7 +8,6 @@
var/obj/item/card/id/stored_card
var/obj/item/card/id/stored_card2
- var/obj/item/card/bank/bank_card
/obj/item/computer_hardware/card_slot/Exited(atom/ejected, atom/newloc)
if(!(ejected == stored_card || ejected == stored_card2))
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index b1ec3d3edc16..eb363de15792 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -248,10 +248,10 @@
visible_message("[user] inserts a [HC.credits] cr holocredit chip into [src].")
qdel(HC)
return
- else if(istype(I, /obj/item/card/bank))
+ else if(istype(I, /obj/item/card/id))
if(state != 2)
return
- var/obj/item/card/bank/ID = I
+ var/obj/item/card/id/ID = I
var/datum/bank_account/account = ID.registered_account
var/target_credits = total_price - credits
if(!account.adjust_money(-target_credits, "laptop_vendor"))
diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm
index ecf91d0760fa..d6b0703ccb59 100644
--- a/code/modules/movespeed/modifiers/reagent.dm
+++ b/code/modules/movespeed/modifiers/reagent.dm
@@ -13,7 +13,7 @@
/datum/movespeed_modifier/reagent/badstims
multiplicative_slowdown = -0.45
-/datum/movespeed_modifier/reagent/xeno_energy
+/datum/movespeed_modifier/reagent/monkey_energy
multiplicative_slowdown = -0.35
/datum/movespeed_modifier/reagent/changelinghaste
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index f45c231c7098..4939686ee9fd 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -85,7 +85,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
- if (do_after(H, 10, target = src, hidden = TRUE))
+ if (do_after(H,10, target = src, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
charge -= drain
@@ -235,7 +235,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
if(S.cell.charge+drain > S.cell.maxcharge)
drain = S.cell.maxcharge - S.cell.charge
maxcapacity = 1
- if (do_after(H, 10, hidden = TRUE))
+ if (do_after(H,10, hidden = TRUE))
spark_system.start()
playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
cell.use(drain)
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index b700e22156fa..f9641a7a63ff 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -21,7 +21,7 @@
var/obj/item/stock_parts/cell/CELL = I
if(CELL.maxcharge > cell.maxcharge && n_gloves && n_gloves.candrain)
to_chat(U, "Higher maximum capacity detected.\nUpgrading...")
- if (n_gloves && n_gloves.candrain && do_after(U, s_delay, target = src))
+ if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = src))
U.transferItemToLoc(CELL, src)
CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
var/obj/item/stock_parts/cell/old_cell = cell
diff --git a/code/modules/overmap/missions/acquire_mission.dm b/code/modules/overmap/missions/acquire_mission.dm
index 8a3424c8eb11..de60174081db 100644
--- a/code/modules/overmap/missions/acquire_mission.dm
+++ b/code/modules/overmap/missions/acquire_mission.dm
@@ -14,7 +14,6 @@
/datum/mission/acquire/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc)
. = ..()
container = spawn_bound(container_type, accept_loc, VARSET_CALLBACK(src, container, null))
- container.name += " ([capitalize(objective_type.name)])"
/datum/mission/acquire/Destroy()
container = null
@@ -212,21 +211,6 @@ Acquire: Anomaly
weight = 1
objective_type = /mob/living/simple_animal/bot/firebot/rockplanet
-/*
- Acquire: Landmines
-*/
-
-/datum/mission/acquire/landmine
- name = "Defuse landmines"
- desc = "CLIP and Gezena have assigned us to offer a bounty to turn in disarmed ordnance for future ventures. We'll pay you well, but we're not responsible for any accidents."
- weight = 6
- value = 1500
- duration = 80 MINUTES
- dur_mod_range = 0.4
- container_type = /obj/item/storage/toolbox/bounty
- objective_type = /obj/item/mine/pressure/explosive
- num_wanted = 2
-
/*
Acquire: Fishing
*/
diff --git a/code/modules/overmap/missions/drill_mission.dm b/code/modules/overmap/missions/drill_mission.dm
index 307d73d59592..06859e8327d2 100644
--- a/code/modules/overmap/missions/drill_mission.dm
+++ b/code/modules/overmap/missions/drill_mission.dm
@@ -21,7 +21,7 @@
sampler = spawn_bound(/obj/machinery/drill/mission, accept_loc, VARSET_CALLBACK(src, sampler, null))
sampler.mission_class = class_wanted
sampler.num_wanted = num_wanted
- sampler.name += " (Class [class_wanted])"
+
//Gives players a little extra money for going past the mission goal
/datum/mission/drill/turn_in()
value += (sampler.num_current - num_wanted)*50
diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm
index 0bf0a3eb51d3..bce7a3f322c5 100644
--- a/code/modules/paperwork/fax.dm
+++ b/code/modules/paperwork/fax.dm
@@ -36,7 +36,7 @@
/// List of types which should be allowed to be faxed if hacked
var/static/list/exotic_types = list(
/obj/item/reagent_containers/food/snacks/pizzaslice,
- /obj/item/food/breadslice,
+ /obj/item/reagent_containers/food/snacks/breadslice,
/obj/item/reagent_containers/food/snacks/donkpocket,
/obj/item/reagent_containers/food/snacks/cookie,
/obj/item/reagent_containers/food/snacks/salami,
diff --git a/code/modules/paperwork/folders_premade.dm b/code/modules/paperwork/folders_premade.dm
index 3c9dbb89feae..a919dce944ce 100644
--- a/code/modules/paperwork/folders_premade.dm
+++ b/code/modules/paperwork/folders_premade.dm
@@ -61,10 +61,3 @@
document = /obj/item/documents/terragov
desc = "A green folder with a Terran Regency seal."
icon_state = "folder_terragovred"
-
-/obj/item/folder/suns
- desc = "A purple folder with a SUNS seal."
- icon_state = "folder_suns"
-
-/obj/item/folder/suns/red
- icon_state = "folder_sunsred" // i'm not sure why SUNS would need secret documents
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 45893f8d5fc5..3bfc292108b5 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -140,10 +140,5 @@
icon_state = "stamp-bard"
dye_color = DYE_FO
-/obj/item/stamp/suns
- name = "SUNS rubber stamp"
- icon_state = "stamp-suns"
- dye_color = DYE_PURPLE
-
/obj/item/stamp/attack_paw(mob/user)
return attack_hand(user)
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index d1c14fe67917..a5d8b4c4e1e9 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -1,7 +1,7 @@
// stored_energy += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
-#define RAD_COLLECTOR_EFFICIENCY 300 // radiation needs to be over this amount to get power
-#define RAD_COLLECTOR_COEFFICIENT 100
-#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
+#define RAD_COLLECTOR_EFFICIENCY 80 // radiation needs to be over this amount to get power
+#define RAD_COLLECTOR_COEFFICIENT 10
+#define RAD_COLLECTOR_STORED_OUT 0.001 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
#define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process()
#define RAD_COLLECTOR_OUTPUT min(stored_energy, (stored_energy*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored
#define PUBLIC_TECHWEB_GAIN 0.6 //how many research points go directly into the main pool
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
index b216296cfe8d..26597a64f33b 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammunition.dm
@@ -32,7 +32,7 @@
var/pellets = 1 //Pellets for spreadshot
var/variance = 0 //Variance for inaccuracy fundamental to the casing
- var/randomspread = FALSE //Randomspread for automatics
+ var/randomspread = 0 //Randomspread for automatics
var/delay = 0 //Delay for energy weapons
var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index e235e00b98f6..fa77095de9b9 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -98,24 +98,3 @@
desc = "A .38 iceblox bullet casing."
bullet_skin = "surplus"
projectile_type = /obj/projectile/bullet/c38/iceblox
-
-//44 Roumain (Montagne & Shadow)
-
-/obj/item/ammo_casing/a44roum
- name = ".44 roumain bullet casing"
- desc = "A .44 roumain bullet casing."
- caliber = ".44 Roumain"
- icon_state = "pistol-steel"
- projectile_type = /obj/projectile/bullet/a44roum
-
-/obj/item/ammo_casing/a44roum/rubber
- name = ".44 roumain rubber bullet casing"
- desc = "A .44 roumain rubber bullet casing."
- bullet_skin = "rubber"
- projectile_type = /obj/projectile/bullet/a44roum/rubber
-
-/obj/item/ammo_casing/a44roum/hp
- name = ".44 roumain hollow point bullet casing"
- desc = "A .44 roumain holow point bullet casing."
- bullet_skin = "hollow"
- projectile_type = /obj/projectile/bullet/a44roum/hp
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 9f6a8c169ecd..8e5f2e128ac7 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -111,8 +111,8 @@
desc = "A shotgun shell which fires a spread of incendiary pellets."
icon_state = "dragonsbreath"
projectile_type = /obj/projectile/bullet/incendiary/shotgun/dragonsbreath
- pellets = 8
- variance = 45
+ pellets = 4
+ variance = 35
/obj/item/ammo_casing/shotgun/meteorslug
name = "meteorslug shell"
@@ -128,20 +128,20 @@
/obj/item/ammo_casing/shotgun/ion
name = "ion shell"
- desc = "An advanced shotgun shell which uses a micro laser to focus the effects of an EMP reaction to produce an effect similar to a standard ion rifle. \
- The more uncontrolled nature of the reaction causes the pulse to spread into multiple individually weaker bolts."
+ desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
+ The unique properties of the crystal split the pulse into a spread of individually weaker bolts."
icon_state = "ion"
projectile_type = /obj/projectile/ion/weak
- pellets = 8
- variance = 25
+ pellets = 4
+ variance = 35
/obj/item/ammo_casing/shotgun/laserscatter
name = "scatter laser shell"
desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a scatter laser weapon in a ballistic package."
icon_state = "laser"
projectile_type = /obj/projectile/beam/weak
- pellets = 8
- variance = 25
+ pellets = 4 //WS edit: makes scatter lasers based again
+ variance = 35
/obj/item/ammo_casing/shotgun/pulseslug
name = "pulse slug"
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 3b1bdbc6eb1c..4c3c8b736c4d 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -98,7 +98,7 @@
if(istype(attacking_obj, /obj/item/ammo_box))
var/obj/item/ammo_box/attacking_box = attacking_obj
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
- if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box)))
+ if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, list(attacking_box))))
break
var/did_load = give_round(casing_to_insert, replace_spent)
if(!did_load)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 955856704ac6..0b5a7f80a837 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -13,9 +13,6 @@
w_class = WEIGHT_CLASS_TINY
instant_load = TRUE
-/obj/item/ammo_box/a357/empty
- start_empty = TRUE
-
/obj/item/ammo_box/a357/match
name = "speed loader (.357 match)"
desc = "A 7-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
@@ -122,9 +119,6 @@
desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These iceblox bullets contain a cryogenic payload that chills targets."
ammo_type = /obj/item/ammo_casing/c38/iceblox
-/obj/item/ammo_box/c38/empty
- start_empty = TRUE
-
// 8x58mm Stripper Clip (SSG-669C)
/obj/item/ammo_box/a858
@@ -162,8 +156,6 @@
w_class = WEIGHT_CLASS_TINY
instant_load = TRUE
-/obj/item/ammo_box/a300/empty
- start_empty = TRUE
// .300 Blackout Stripper Clip (Polymer Survivor Rifle)
/obj/item/ammo_box/aac_300blk_stripper
@@ -419,22 +411,19 @@
ammo_type = /obj/item/ammo_casing/c22lr
max_ammo = 75
-/obj/item/ammo_box/a44roum_speedloader
- name = "speed loader (.44)"
+/obj/item/ammo_box/c45_speedloader
+ name = "speed loader (.45)"
desc = "Designed to quickly reload revolvers."
icon_state = "speedloader_38-6"
base_icon_state = "speedloader_38"
- ammo_type = /obj/item/ammo_casing/a44roum
- caliber = ".44 Roumain"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
max_ammo = 6
multiple_sprites = AMMO_BOX_PER_BULLET
custom_materials = list(/datum/material/iron = 15000)
w_class = WEIGHT_CLASS_TINY
instant_load = TRUE
-/obj/item/ammo_box/a44roum_speedloader/empty
- start_empty = TRUE
-
/obj/item/ammo_box/c46x30mm_box
name = "ammo box (4.6x30mm)"
desc = "A box of standard 4.6x30mm ammo."
@@ -483,24 +472,3 @@
icon_state = "300box"
ammo_type = /obj/item/ammo_casing/a300
max_ammo = 20
-
-/obj/item/ammo_box/a44roum
- name = "ammo box (.44 roumain)"
- desc = "A box of standard .44 roumain ammo."
- icon_state = "a44roum"
- ammo_type = /obj/item/ammo_casing/a44roum
- max_ammo = 50
-
-/obj/item/ammo_box/a44roum/rubber
- name = "ammo box (.44 roumain rubber)"
- desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "a44roum-rubber"
- ammo_type = /obj/item/ammo_casing/a44roum/rubber
- max_ammo = 50
-
-/obj/item/ammo_box/a44roum/hp
- name = "ammo box (.44 roumain hollow point)"
- desc = "A box of .44 roumain hollow point ammo, designed to cause massive damage at the cost of armor penetration."
- icon_state = "a44roum-hp"
- ammo_type = /obj/item/ammo_casing/a44roum/hp
- max_ammo = 50
diff --git a/code/modules/projectiles/boxes_magazines/external/gauss.dm b/code/modules/projectiles/boxes_magazines/external/gauss.dm
index d2edfc4aac94..fa3797707ce6 100644
--- a/code/modules/projectiles/boxes_magazines/external/gauss.dm
+++ b/code/modules/projectiles/boxes_magazines/external/gauss.dm
@@ -16,9 +16,6 @@
max_ammo = 10
multiple_sprites = AMMO_BOX_FULL_EMPTY
-/obj/item/ammo_box/magazine/modelh/empty
- start_empty = TRUE
-
/obj/item/ammo_box/magazine/gar
name = "GAR tube magazine (ferromagnetic lances)"
desc = "A 32-round magazined for the GAR assault rifle. Ferromagnetic lances do good damage with significant armor penetration."
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index 8a1792485715..66b9238a5c90 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -8,9 +8,6 @@
max_ammo = 8
multiple_sprites = AMMO_BOX_FULL_EMPTY
-/obj/item/ammo_box/magazine/m10mm/empty
- start_empty = TRUE
-
/obj/item/ammo_box/magazine/m10mm/inc
name = "pistol magazine (10mm incendiary)"
desc = "An 8-round single-stack magazine for the stechkin pistol. These incendiary rounds deal mediocre damage, but leave flaming trails which set targets ablaze."
@@ -40,9 +37,6 @@
caliber = ".45"
max_ammo = 8
-/obj/item/ammo_box/magazine/m45/empty
- start_empty = TRUE
-
/obj/item/ammo_box/magazine/m45/inc
name = "pistol magazine (.45 incendiary)"
desc = "An 8-round single-stack magazine for the Candor pistol. These incendiary rounds deal mediocre damage, but leave flaming trails which set targets ablaze."
@@ -77,9 +71,6 @@
max_ammo = 10
multiple_sprites = AMMO_BOX_PER_BULLET
-/obj/item/ammo_box/magazine/co9mm/empty
- start_empty = TRUE
-
/obj/item/ammo_box/magazine/pistol556mm
name = "Pistole C magazine (5.56mm HITP caseless)"
desc = "A 12-round, double-stack magazine for the Pistole C pistol. These rounds do okay damage with average performance against armor."
@@ -102,7 +93,6 @@
else
icon_state = "[base_icon_state]-0"
-
/obj/item/ammo_box/magazine/co9mm/inc
name = "pistol magazine (9mm incendiary)"
desc = "A 10-round double-stack magazine for standard-issue 9mm pistols. These incendiary rounds deal pitiful damage, but leave flaming trails which set targets ablaze."
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
index 9224c0db84af..548350f20415 100644
--- a/code/modules/projectiles/boxes_magazines/external/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -55,9 +55,6 @@
max_ammo = 20
multiple_sprites = AMMO_BOX_FULL_EMPTY
-/obj/item/ammo_box/magazine/skm_762_40/empty
- start_empty = TRUE
-
/obj/item/ammo_box/magazine/skm_762_40/extended
name = "extended assault rifle magazine (7.62x40mm CLIP)"
desc = "A very curved, 40-round magazine for the 7.62x40mm CLIP variants of the SKM assault rifle family. These rounds do good damage with good armor penetration."
@@ -105,8 +102,6 @@
max_ammo = 30
multiple_sprites = AMMO_BOX_FULL_EMPTY
-/obj/item/ammo_box/magazine/p16/empty
- start_empty = TRUE
/obj/item/ammo_box/magazine/swiss
name = "\improper Swiss Cheese Magazine (5.56x45mm)"
@@ -138,6 +133,3 @@
max_ammo = 5
multiple_sprites = AMMO_BOX_PER_BULLET
w_class = WEIGHT_CLASS_TINY
-
-/obj/item/ammo_box/magazine/illestren_a850r/empty
- start_empty = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
index 4c464c0433d0..61b9eb78512a 100644
--- a/code/modules/projectiles/boxes_magazines/external/smg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -11,9 +11,6 @@
. = ..()
icon_state = "[base_icon_state]-[round(ammo_count(), 6)]"
-/obj/item/ammo_box/magazine/wt550m9/empty
- start_empty = TRUE
-
/obj/item/ammo_box/magazine/wt550m9/ap
name = "wt550 magazine (4.6x30mm AP)"
desc = "A compact, 30-round top-loading magazine for the WT-550 Automatic Rifle. These armor-piercing rounds are great at piercing protective equipment, but lose some stopping power."
@@ -100,9 +97,6 @@
. = ..()
icon_state = "c20r45-[round(ammo_count(),2)]"
-/obj/item/ammo_box/magazine/smgm45/empty
- start_empty = TRUE
-
/obj/item/ammo_box/magazine/c45_firestorm_mag
name = "stick magazine (.45)"
desc = "A 28-round stick magazine for the toploading Firestorm submachine gun. These rounds do moderate damage, but struggle against armor."
diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
index 658eef2d781c..f8ce8223748d 100644
--- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
@@ -66,7 +66,7 @@
var/list/ammo_list_no_empty = ammo_list(FALSE)
listclearnulls(ammo_list_no_empty)
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
- if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box))) //stupid work around for revolvers
+ if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after(user, 1 SECONDS, list(attacking_box)))) //stupid work around for revolvers
break
var/did_load = give_round(casing_to_insert, replace_spent)
if(!did_load)
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
index 1198970c5146..d757ddf03047 100644
--- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -33,13 +33,13 @@
max_ammo = 5
instant_load = FALSE
-/obj/item/ammo_box/magazine/internal/cylinder/rev44
+/obj/item/ammo_box/magazine/internal/cylinder/rev45
name = "cattleman revolver cylinder"
- ammo_type = /obj/item/ammo_casing/a44roum
- caliber = ".44 Roumain"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
max_ammo = 6
instant_load = FALSE
-/obj/item/ammo_box/magazine/internal/cylinder/rev44/montagne
+/obj/item/ammo_box/magazine/internal/cylinder/rev45/montagne
name = "montagne revolver cylinder"
instant_load = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
index 29717fd9408b..38c99aec9372 100644
--- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
@@ -27,9 +27,6 @@
max_ammo = 2
instant_load = TRUE
-/obj/item/ammo_box/magazine/internal/shot/dual/lethal
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
-
/obj/item/ammo_box/magazine/internal/shot/improvised
name = "improvised shotgun internal magazine"
ammo_type = /obj/item/ammo_casing/shotgun/improvised
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 707f4805afe3..3edfd1382cf4 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -2,10 +2,8 @@
name = "gun"
desc = "It's a gun. It's pretty terrible, though."
icon = 'icons/obj/guns/projectile.dmi'
- icon_state = "flatgun"
+ icon_state = "detective"
item_state = "gun"
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
custom_materials = list(/datum/material/iron=2000)
@@ -18,185 +16,101 @@
attack_verb = list("struck", "hit", "bashed")
pickup_sound = 'sound/items/handling/gun_pickup.ogg'
drop_sound = 'sound/items/handling/gun_drop.ogg'
- //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
- trigger_guard = TRIGGER_GUARD_NORMAL
- ///The manufacturer of this weapon. For flavor mostly. If none, this will not show.
+ /// The manufacturer of this weapon. For flavor mostly. If none, this will not show.
var/manufacturer = MANUFACTURER_NONE
-/*
- * Muzzle
-*/
- ///Effect for the muzzle flash of the gun.
- var/obj/effect/muzzle_flash/muzzle_flash
- ///Icon state of the muzzle flash effect.
- var/muzzleflash_iconstate
- ///Brightness of the muzzle flash effect.
- var/muzzle_flash_lum = 3
- ///Color of the muzzle flash effect.
- var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW
-
-/*
- * Firing
-*/
var/fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
var/vary_fire_sound = TRUE
var/fire_sound_volume = 50
var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg'
+ ///Text showed when attempting to fire with no round or empty round.
var/dry_fire_text = "click"
-
-/*
- * Reloading
-*/
- var/obj/item/ammo_casing/chambered = null
- ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
- var/tac_reloads = TRUE
- ///If we have the 'snowflake mechanic,' how long should it take to reload?
- var/tactical_reload_delay = 1 SECONDS
-
-//BALLISTIC
- ///Compatible magazines with the gun
- var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
- ///Whether the gun alarms when empty or not.
- var/empty_alarm = FALSE
- ///Do we eject the magazine upon runing out of ammo?
- var/empty_autoeject = FALSE
- ///Whether the gun supports multiple special mag types
- var/special_mags = FALSE
-
- ///Actual magazine currently contained within the gun
- var/obj/item/ammo_box/magazine/magazine
- ///whether the gun ejects the chambered casing
- var/casing_ejector = TRUE
- ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT.
- var/internal_magazine = FALSE
-
- ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx
- var/magazine_wording = "magazine"
- ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc.
- var/cartridge_wording = "bullet"
-
- ///sound when inserting magazine
- var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg'
- ///sound when inserting an empty magazine
- var/load_empty_sound = 'sound/weapons/gun/general/magazine_insert_empty.ogg'
- ///volume of loading sound
- var/load_sound_volume = 40
- ///whether loading sound should vary
- var/load_sound_vary = TRUE
- ///Sound of ejecting a magazine
- var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg'
- ///sound of ejecting an empty magazine
- var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg'
- ///volume of ejecting a magazine
- var/eject_sound_volume = 40
- ///whether eject sound should vary
- var/eject_sound_vary = TRUE
-
-//ENERGY
- //What type of power cell this uses
- var/obj/item/stock_parts/cell/gun/cell
- var/cell_type = /obj/item/stock_parts/cell/gun
- //Can it be charged in a recharger?
- var/can_charge = TRUE
- var/selfcharge = FALSE
- var/charge_tick = 0
- var/charge_delay = 4
- //whether the gun's cell drains the cyborg user's cell to recharge
- var/use_cyborg_cell = FALSE
- ///Used for large and small cells
- var/mag_size = MAG_SIZE_MEDIUM
- //Time it takes to unscrew the cell
- var/unscrewing_time = 2 SECONDS
-
- ///if the gun's cell cannot be replaced
- var/internal_cell = FALSE
-
- var/list/ammo_type = list(/obj/item/ammo_casing/energy)
- //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
- var/select = 1
-
-/*
- * Operation
-*/
- //whether or not a message is displayed when fired
- var/suppressed = FALSE
+ ///whether or not a message is displayed when fired
+ var/suppressed = null
+ var/can_suppress = FALSE
var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
var/suppressed_volume = 60
-
- //true if the gun is wielded via twohanded component, shouldnt affect anything else
- var/wielded = FALSE
- //true if the gun is wielded after delay, should affects accuracy
- var/wielded_fully = FALSE
- ///Slowdown for wielding
- var/wield_slowdown = 0.1
- ///How long between wielding and firing in tenths of seconds
- var/wield_delay = 0.4 SECONDS
- ///Storing value for above
- var/wield_time = 0
-
-// BALLISTIC
- ///Whether the gun has to be racked each shot or not.
- var/semi_auto = TRUE
- ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT
- var/bolt_type = BOLT_TYPE_STANDARD
- ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both.
- var/bolt_locked = FALSE
- ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc.
- var/bolt_wording = "bolt"
- ///length between individual racks
- var/rack_delay = 5
- ///time of the most recent rack, used for cooldown purposes
- var/recent_rack = 0
-
- ///Whether the gun can be sawn off by sawing tools
- var/can_be_sawn_off = FALSE
- //description change if weapon is sawn-off
+ var/can_unsuppress = TRUE
+ var/obj/item/ammo_casing/chambered = null
+ ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it
+ trigger_guard = TRIGGER_GUARD_NORMAL
+ ///Set the description of the gun to this when sawed off
var/sawn_desc = null
+ ///This triggers some sprite behavior in shotguns and prevents further sawoff, note that can_be_sawn_off is on gun/ballistic and not here, wtf.
var/sawn_off = FALSE
- ///sound of racking
- var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg'
- ///volume of racking
- var/rack_sound_volume = 60
- ///whether racking sound should vary
- var/rack_sound_vary = TRUE
- ///sound of when the bolt is locked back manually
- var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg'
- ///volume of lock back
- var/lock_back_sound_volume = 60
- ///whether lock back varies
- var/lock_back_sound_vary = TRUE
-
- ///sound of dropping the bolt or releasing a slide
- var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg'
- ///volume of bolt drop/slide release
- var/bolt_drop_sound_volume = 60
- ///empty alarm sound (if enabled)
- var/empty_alarm_sound = 'sound/weapons/gun/general/empty_alarm.ogg'
- ///empty alarm volume sound
- var/empty_alarm_volume = 70
- ///whether empty alarm sound varies
- var/empty_alarm_vary = TRUE
-
-/*
- * Stats
-*/
+ /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst.
+ var/burst_size = 3
+ ///The rate of fire when firing in a burst. Not the delay between bursts
+ var/burst_delay = 0.15 SECONDS
+ ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst
+ var/fire_delay = 0.2 SECONDS
+
+ /// after initializing, we set the firemode to this
+ var/default_firemode = FIREMODE_SEMIAUTO
+ ///Firemode index, due to code shit this is the currently selected firemode
+ var/firemode_index
+ /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here.
+ var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO)
+ /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example.
+ var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire")
+ ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on.
+ var/fire_select_icon_state_prefix = ""
+ ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single"
+ var/adjust_fire_select_icon_state_on_safety = FALSE
+
+ ///Are we firing a burst? If so, dont fire again until burst is done
+ var/currently_firing_burst = FALSE
+ ///This prevents gun from firing until the coodown is done, affected by lag
+ var/current_cooldown = 0
+ ///affects if you can fire it unwielded or even dual wield it. LIGHT means dual wield allowed, HEAVY and higher means you have to wield to fire
var/weapon_weight = WEAPON_LIGHT
- //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
+ ///If dual wielding, add this to the spread
+ var/dual_wield_spread = 24
+ /// ???, no clue what this is. Original desc: //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ var/randomspread = 1
+
+ ///Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
var/projectile_damage_multiplier = 1
- //Speed someone can be flung if its point blank
+
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+
+ var/list/attachment_options = list() //This.. works for now.. gun refactor soon
+
+ var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one.
+ var/obj/item/flashlight/seclite/gun_light
+ var/datum/action/item_action/toggle_gunlight/alight
+ var/gunlight_state = "flight"
+
+ var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one.
+ var/obj/item/kitchen/knife/bayonet
+ var/knife_x_offset = 0
+ var/knife_y_offset = 0
+
+ var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite
+ var/ammo_y_offset = 0
+ var/flight_x_offset = 0
+ var/flight_y_offset = 0
+
+ //Zooming
+ var/zoomable = FALSE //whether the gun generates a Zoom action on creation
+ var/zoomed = FALSE //Zoom toggle
+ var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect)
+ var/zoom_out_amt = 0
+ var/datum/action/toggle_scope_zoom/azoom
+
var/pb_knockback = 0
- //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
- var/randomspread = TRUE
+ var/wielded = FALSE // true if the gun is wielded via twohanded component, shouldnt affect anything else
+
+ var/wielded_fully = FALSE // true if the gun is wielded after delay, should affects accuracy
+
///How much the bullet scatters when fired while wielded.
var/spread = 4
///How much the bullet scatters when fired while unwielded.
var/spread_unwielded = 12
- //additional spread when dual wielding
- var/dual_wield_spread = 24
-
///Screen shake when the weapon is fired while wielded.
var/recoil = 0
@@ -207,126 +121,43 @@
///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max.
var/recoil_deviation = 22.5
- /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst.
- var/burst_size = 3
- ///The rate of fire when firing in a burst. Not the delay between bursts
- var/burst_delay = 0.15 SECONDS
- ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst
- var/fire_delay = 0.2 SECONDS
- //Prevent the weapon from firing again while already firing
- var/firing_burst = 0
-
-/*
- * Overlay
-*/
- ///Used for positioning ammo count overlay on sprite
- var/ammo_x_offset = 0
- var/ammo_y_offset = 0
+ ///Slowdown for wielding
+ var/wield_slowdown = 0.1
+ ///How long between wielding and firing in tenths of seconds
+ var/wield_delay = 0.4 SECONDS
+ ///Storing value for above
+ var/wield_time = 0
-//BALLISTIC
- ///Whether the sprite has a visible magazine or not
- var/mag_display = FALSE
- ///Whether the sprite has a visible ammo display or not
- var/mag_display_ammo = FALSE
- ///Whether the sprite has a visible indicator for being empty or not.
- var/empty_indicator = FALSE
- ///Whether the sprite has a visible magazine or not
- var/show_magazine_on_sprite = FALSE
- ///Whether the sprite has a visible ammo display or not
- var/show_magazine_on_sprite_ammo = FALSE
- ///Whether the gun supports multiple special mag types
- var/unique_mag_sprites_for_variants = FALSE
-
-//ENERGY
- //Do we handle overlays with base update_appearance()?
- var/automatic_charge_overlays = TRUE
- var/charge_sections = 4
- //if this gun uses a stateful charge bar for more detail
- var/shaded_charge = FALSE
- //Modifies WHOS state //im SOMEWHAT this is wether or not the overlay changes based on the ammo type selected
- var/modifystate = TRUE
-
-/*
- * Attachment
-*/
- ///The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED
- var/list/valid_attachments = list()
- ///Reference to our attachment holder to prevent subtypes having to call GetComponent
- var/datum/component/attachment_holder/attachment_holder
- ///Number of attachments that can fit on a given slot
- var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE
- ///Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y
- var/list/slot_offsets = list()
-
-/*
- * Zooming
-*/
- ///Whether the gun generates a Zoom action on creation
- var/zoomable = FALSE
- //Zoom toggle
- var/zoomed = FALSE
- ///Distance in TURFs to move the user's screen forward (the "zoom" effect)
- var/zoom_amt = 3
- var/zoom_out_amt = 0
- var/datum/action/toggle_scope_zoom/azoom
+ ///Effect for the muzzle flash of the gun.
+ var/obj/effect/muzzle_flash/muzzle_flash
+ ///Icon state of the muzzle flash effect.
+ var/muzzleflash_iconstate
+ ///Brightness of the muzzle flash effect.
+ var/muzzle_flash_lum = 3
+ ///Color of the muzzle flash effect.
+ var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW
-/*
- * Safety
-*/
+ //gun saftey
///Does this gun have a saftey and thus can toggle it?
var/has_safety = FALSE
///If the saftey on? If so, we can't fire the weapon
var/safety = FALSE
+
///The wording of safety. Useful for guns that have a non-standard safety system, like a revolver
var/safety_wording = "safety"
-/*
- * Spawn Info (Stuff that becomes useless onces the gun is spawned, mostly here for mappers)
-*/
- ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail
- var/list/default_attachments = list()
-
-//BALLISTIC
- ///Whether the gun will spawn loaded with a magazine
- var/spawnwithmagazine = TRUE
-
-//ENERGY
- //set to true so the gun is given an empty cell
- var/dead_cell = FALSE
-
-// Need to sort
- ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it
- trigger_guard = TRIGGER_GUARD_NORMAL
-
- /// after initializing, we set the firemode to this
- var/default_firemode = FIREMODE_SEMIAUTO
- ///Firemode index, due to code shit this is the currently selected firemode
- var/firemode_index
- /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here.
- var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO)
- /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example.
- var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire")
- ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on.
- var/fire_select_icon_state_prefix = ""
- ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single"
- var/adjust_fire_select_icon_state_on_safety = FALSE
-
- ///Are we firing a burst? If so, dont fire again until burst is done
- var/currently_firing_burst = FALSE
- ///This prevents gun from firing until the coodown is done, affected by lag
- var/current_cooldown = 0
-
/obj/item/gun/Initialize()
. = ..()
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
+ if(gun_light)
+ alight = new(src)
muzzle_flash = new(src, muzzleflash_iconstate)
build_zooming()
build_firemodes()
/obj/item/gun/ComponentInitialize()
. = ..()
- attachment_holder = AddComponent(/datum/component/attachment_holder, slot_available, valid_attachments, slot_offsets, default_attachments)
AddComponent(/datum/component/two_handed)
/// triggered on wield of two handed item
@@ -361,14 +192,19 @@
/obj/item/gun/proc/on_unwield(obj/item/source, mob/user)
wielded = FALSE
wielded_fully = FALSE
- zoom(user, forced_zoom = FALSE)
user.remove_movespeed_modifier(/datum/movespeed_modifier/gun)
/obj/item/gun/Destroy()
+ if(gun_light)
+ QDEL_NULL(gun_light)
+ if(bayonet)
+ QDEL_NULL(bayonet)
if(chambered) //Not all guns are chambered (EMP'ed energy guns etc)
QDEL_NULL(chambered)
if(azoom)
QDEL_NULL(azoom)
+ if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK
+ QDEL_NULL(suppressed)
if(muzzle_flash)
QDEL_NULL(muzzle_flash)
return ..()
@@ -376,17 +212,36 @@
/obj/item/gun/handle_atom_del(atom/A)
if(A == chambered)
chambered = null
- update_icon()
+ update_appearance()
+ if(A == bayonet)
+ clear_bayonet()
+ if(A == gun_light)
+ clear_gunlight()
return ..()
/obj/item/gun/examine(mob/user)
. = ..()
+ if(gun_light)
+ . += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it."
+ if(can_flashlight) //if it has a light and this is false, the light is permanent.
+ . += "[gun_light] looks like it can be unscrewed from [src]."
+ else if(can_flashlight)
+ . += "It has a mounting point for a seclite."
+
+ if(bayonet)
+ . += "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it."
+ if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent.
+ . += "[bayonet] looks like it can be unscrewed from [src]."
+ else if(can_bayonet)
+ . += "It has a bayonet lug on it."
+
if(has_safety)
. += "The safety is [safety ? "ON" : "OFF"]. Ctrl-Click to toggle the safety."
if(manufacturer)
. += "It has [manufacturer] engraved on it."
+
/obj/item/gun/equipped(mob/living/user, slot)
. = ..()
if(zoomed && user.get_active_held_item() != src)
@@ -394,9 +249,49 @@
/obj/item/gun/attack(mob/M as mob, mob/user)
if(user.a_intent == INTENT_HARM) //Flogging
- return ..()
+ if(bayonet)
+ M.attackby(bayonet, user)
+ return
+ else
+ return ..()
return
+/obj/item/gun/attack_obj(obj/O, mob/user)
+ if(user.a_intent == INTENT_HARM)
+ if(bayonet)
+ O.attackby(bayonet, user)
+ return
+ return ..()
+
+/obj/item/gun/attackby(obj/item/I, mob/user, params)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+ else if(istype(I, /obj/item/flashlight/seclite))
+ if(!can_flashlight)
+ return ..()
+ var/obj/item/flashlight/seclite/S = I
+ if(!gun_light)
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You click [S] into place on [src].")
+ set_gun_light(S)
+ update_gunlight()
+ alight = new(src)
+ if(loc == user)
+ alight.Grant(user)
+ else if(istype(I, /obj/item/kitchen/knife))
+ var/obj/item/kitchen/knife/K = I
+ if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
+ return ..()
+ if(!user.transferItemToLoc(I, src))
+ return
+ to_chat(user, "You attach [K] to [src]'s bayonet lug.")
+ bayonet = K
+ update_appearance()
+
+ else
+ return ..()
+
//called after the gun has successfully fired its chambered ammo.
/obj/item/gun/proc/process_chamber(atom/shooter)
SEND_SIGNAL(src, COMSIG_GUN_CHAMBER_PROCESSED)
@@ -617,7 +512,6 @@
/obj/item/gun/proc/reset_current_cooldown()
current_cooldown = FALSE
-
/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
if(!safety)
to_chat(user, "*[dry_fire_text]*")
@@ -705,6 +599,116 @@
update_appearance()
+
+/obj/item/gun/screwdriver_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(.)
+ return
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+ attachment_options = list()
+ get_gun_attachments()
+ if(LAZYLEN(attachment_options) == 1)
+ remove_gun_attachments(user, I, attachment_options[1])
+ else if (LAZYLEN(attachment_options))
+ var/picked_option = show_radial_menu(user, src, attachment_options, radius = 38, require_near = TRUE)
+ remove_gun_attachments(user, I, picked_option)
+
+/obj/item/gun/proc/get_gun_attachments()
+ if(can_flashlight && gun_light)
+ attachment_options += list("Light" = image(icon = gun_light.icon, icon_state = gun_light.icon_state))
+ if(can_bayonet && bayonet)
+ attachment_options += list("Knife" = image(icon = bayonet.icon, icon_state = bayonet.icon_state))
+
+/obj/item/gun/proc/remove_gun_attachments(mob/living/user, obj/item/I, picked_option)
+ if(picked_option == "Light")
+ return remove_gun_attachment(user, I, gun_light, "unscrewed")
+ else if(picked_option == "Knife")
+ return remove_gun_attachment(user, I, bayonet, "unfix")
+
+/obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb)
+ if(tool_item)
+ tool_item.play_tool_sound(src)
+ to_chat(user, "You [removal_verb ? removal_verb : "remove"] [item_to_remove] from [src].")
+ item_to_remove.forceMove(drop_location())
+
+ if(Adjacent(user) && !issilicon(user))
+ user.put_in_hands(item_to_remove)
+
+ if(item_to_remove == bayonet)
+ return clear_bayonet()
+ else if(item_to_remove == gun_light)
+ return clear_gunlight()
+
+/obj/item/gun/proc/clear_bayonet()
+ if(!bayonet)
+ return
+ bayonet = null
+ update_appearance()
+ return TRUE
+
+/obj/item/gun/proc/clear_gunlight()
+ if(!gun_light)
+ return
+ var/obj/item/flashlight/seclite/removed_light = gun_light
+ set_gun_light(null)
+ update_gunlight()
+ removed_light.update_brightness()
+ QDEL_NULL(alight)
+ return TRUE
+
+/**
+ * Swaps the gun's seclight, dropping the old seclight if it has not been qdel'd.
+ *
+ * Returns the former gun_light that has now been replaced by this proc.
+ * Arguments:
+ * * new_light - The new light to attach to the weapon. Can be null, which will mean the old light is removed with no replacement.
+ */
+/obj/item/gun/proc/set_gun_light(obj/item/flashlight/seclite/new_light)
+ // Doesn't look like this should ever happen? We're replacing our old light with our old light?
+ if(gun_light == new_light)
+ CRASH("Tried to set a new gun light when the old gun light was also the new gun light.")
+
+ . = gun_light
+
+ // If there's an old gun light that isn't being QDELETED, detatch and drop it to the floor.
+ if(!QDELETED(gun_light))
+ gun_light.set_light_flags(gun_light.light_flags & ~LIGHT_ATTACHED)
+ if(gun_light.loc != get_turf(src))
+ gun_light.forceMove(get_turf(src))
+
+ // If there's a new gun light to be added, attach and move it to the gun.
+ if(new_light)
+ new_light.set_light_flags(new_light.light_flags | LIGHT_ATTACHED)
+ if(new_light.loc != src)
+ new_light.forceMove(src)
+
+ gun_light = new_light
+
+/obj/item/gun/ui_action_click(mob/user, actiontype)
+ if(istype(actiontype, alight))
+ toggle_gunlight()
+ else
+ ..()
+
+/obj/item/gun/proc/toggle_gunlight()
+ if(!gun_light)
+ return
+
+ var/mob/living/carbon/human/user = usr
+ gun_light.on = !gun_light.on
+ gun_light.update_brightness()
+ to_chat(user, "You toggle the gunlight [gun_light.on ? "on":"off"].")
+
+ playsound(user, gun_light.on ? gun_light.toggle_on_sound : gun_light.toggle_off_sound, 40, TRUE)
+ update_gunlight()
+
+/obj/item/gun/proc/update_gunlight()
+ update_appearance()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
/obj/item/gun/attack_hand(mob/user)
. = ..()
update_appearance()
@@ -725,6 +729,27 @@
/obj/item/gun/update_overlays()
. = ..()
+ if(gun_light)
+ var/mutable_appearance/flashlight_overlay
+ var/state = "[gunlight_state][gun_light.on? "_on":""]" //Generic state.
+ if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state?
+ state = gun_light.icon_state
+ flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state)
+ flashlight_overlay.pixel_x = flight_x_offset
+ flashlight_overlay.pixel_y = flight_y_offset
+ . += flashlight_overlay
+
+ if(bayonet)
+ var/mutable_appearance/knife_overlay
+ var/state = "bayonet" //Generic state.
+ if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
+ state = bayonet.icon_state
+ var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
+ knife_overlay = mutable_appearance(bayonet_icons, state)
+ knife_overlay.pixel_x = knife_x_offset
+ knife_overlay.pixel_y = knife_y_offset
+ . += knife_overlay
+
if(ismob(loc) && has_safety)
var/mutable_appearance/safety_overlay
safety_overlay = mutable_appearance('icons/obj/guns/safety.dmi')
@@ -961,7 +986,10 @@
flash_loc.vis_contents -= muzzle_flash
muzzle_flash.applied = FALSE
-//I need to refactor this into an attachment
+/////////////
+// ZOOMING //
+/////////////
+
/datum/action/toggle_scope_zoom
name = "Toggle Scope"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING
@@ -993,11 +1021,7 @@
return
if(isnull(forced_zoom))
- if((!zoomed && wielded_fully) || zoomed)
- zoomed = !zoomed
- else
- to_chat(user, "You can't look down the scope without wielding [src]!")
- zoomed = FALSE
+ zoomed = !zoomed
else
zoomed = forced_zoom
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 7c75d8fe9f56..e5345c0eab45 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -8,44 +8,108 @@
/obj/item/gun/ballistic
desc = "Now comes in flavors like GUN. Uses 10mm ammo, for some reason."
name = "projectile gun"
+ icon_state = "pistol"
w_class = WEIGHT_CLASS_NORMAL
has_safety = TRUE
safety = TRUE
- valid_attachments = list(
- /obj/item/attachment/silencer,
- /obj/item/attachment/laser_sight,
- /obj/item/attachment/rail_light,
- /obj/item/attachment/bayonet
- )
- slot_available = list(
- ATTACHMENT_SLOT_MUZZLE = 1,
- ATTACHMENT_SLOT_RAIL = 1
- )
- slot_offsets = list(
- ATTACHMENT_SLOT_MUZZLE = list(
- "x" = 26,
- "y" = 20,
- ),
- ATTACHMENT_SLOT_RAIL = list(
- "x" = 19,
- "y" = 18,
- )
- )
+ ///sound when inserting magazine
+ var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg'
+ ///sound when inserting an empty magazine
+ var/load_empty_sound = 'sound/weapons/gun/general/magazine_insert_empty.ogg'
+ ///volume of loading sound
+ var/load_sound_volume = 40
+ ///whether loading sound should vary
+ var/load_sound_vary = TRUE
+ ///sound of racking
+ var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg'
+ ///volume of racking
+ var/rack_sound_volume = 60
+ ///whether racking sound should vary
+ var/rack_sound_vary = TRUE
+ ///sound of when the bolt is locked back manually
+ var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg'
+ ///volume of lock back
+ var/lock_back_sound_volume = 60
+ ///whether lock back varies
+ var/lock_back_sound_vary = TRUE
+ ///Sound of ejecting a magazine
+ var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg'
+ ///sound of ejecting an empty magazine
+ var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg'
+ ///volume of ejecting a magazine
+ var/eject_sound_volume = 40
+ ///whether eject sound should vary
+ var/eject_sound_vary = TRUE
+ ///sound of dropping the bolt or releasing a slide
+ var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg'
+ ///volume of bolt drop/slide release
+ var/bolt_drop_sound_volume = 60
+ ///empty alarm sound (if enabled)
+ var/empty_alarm_sound = 'sound/weapons/gun/general/empty_alarm.ogg'
+ ///empty alarm volume sound
+ var/empty_alarm_volume = 70
+ ///whether empty alarm sound varies
+ var/empty_alarm_vary = TRUE
+
+ ///Whether the gun will spawn loaded with a magazine
+ var/spawnwithmagazine = TRUE
+ ///Compatible magazines with the gun
+ var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
+ ///Whether the sprite has a visible magazine or not
+ var/show_magazine_on_sprite = FALSE
+ ///Whether the sprite has a visible ammo display or not
+ var/show_magazine_on_sprite_ammo = FALSE
+ ///Whether the sprite has a visible indicator for being empty or not.
+ var/empty_indicator = FALSE
+ ///Whether the gun alarms when empty or not.
+ var/empty_alarm = FALSE
+ ///Do we eject the magazine upon runing out of ammo?
+ var/empty_autoeject = FALSE
+ ///Whether the gun supports multiple special mag types
+ var/unique_mag_sprites_for_variants = FALSE
+ ///The bolt type of the gun, affects quite a bit of functionality, see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT
+ var/bolt_type = BOLT_TYPE_STANDARD
+ ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both.
+ var/bolt_locked = FALSE
+ ///Whether the gun has to be racked each shot or not.
+ var/semi_auto = TRUE
+ ///Actual magazine currently contained within the gun
+ var/obj/item/ammo_box/magazine/magazine
+ ///whether the gun ejects the chambered casing
+ var/casing_ejector = TRUE
+ ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT.
+ var/internal_magazine = FALSE
+ ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc.
+ var/bolt_wording = "bolt"
+ ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx
+ var/magazine_wording = "magazine"
+ ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc.
+ var/cartridge_wording = "bullet"
+ ///length between individual racks
+ var/rack_delay = 5
+ ///time of the most recent rack, used for cooldown purposes
+ var/recent_rack = 0
+ ///Whether the gun can be sawn off by sawing tools
+ var/can_be_sawn_off = FALSE
+
+ ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
+ var/tac_reloads = TRUE //Snowflake mechanic no more.
+ ///If we have the 'snowflake mechanic,' how long should it take to reload?
+ var/tactical_reload_delay = 1 SECONDS
/obj/item/gun/ballistic/Initialize()
. = ..()
- if (!spawnwithmagazine && !ispath(mag_type, /obj/item/ammo_box/magazine/internal))
+ if (!spawnwithmagazine)
bolt_locked = TRUE
update_appearance()
return
if (!magazine)
magazine = new mag_type(src)
- if (!spawnwithmagazine)
- get_ammo_list (drop_all = TRUE)
chamber_round()
update_appearance()
+
/obj/item/gun/ballistic/update_icon_state()
if(current_skin)
icon_state = "[unique_reskin[current_skin]][sawn_off ? "_sawn" : ""]"
@@ -59,6 +123,8 @@
. += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]"
if (bolt_type == BOLT_TYPE_OPEN && bolt_locked)
. += "[icon_state]_bolt"
+ if (suppressed)
+ . += "[icon_state]_suppressor"
if (magazine)
if (unique_mag_sprites_for_variants)
. += "[icon_state]_mag_[magazine.base_icon_state]"
@@ -137,12 +203,12 @@
update_appearance()
///Handles all the logic needed for magazine insertion
-/obj/item/gun/ballistic/proc/insert_magazine(mob/user, obj/item/ammo_box/magazine/inserted_mag, display_message = TRUE)
- if(!istype(inserted_mag, mag_type))
- to_chat(user, "\The [inserted_mag] doesn't seem to fit into \the [src]...")
+/obj/item/gun/ballistic/proc/insert_magazine(mob/user, obj/item/ammo_box/magazine/AM, display_message = TRUE)
+ if(!istype(AM, mag_type))
+ to_chat(user, "\The [AM] doesn't seem to fit into \the [src]...")
return FALSE
- if(user.transferItemToLoc(inserted_mag, src))
- magazine = inserted_mag
+ if(user.transferItemToLoc(AM, src))
+ magazine = AM
if (display_message)
to_chat(user, "You load a new [magazine_wording] into \the [src].")
if (magazine.ammo_count())
@@ -175,7 +241,7 @@
update_appearance()
SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
if (tac_load)
- if(do_after(user, tactical_reload_delay, src, hidden = TRUE))
+ if(do_after(user, tactical_reload_delay, TRUE, src))
if (insert_magazine(user, tac_load, FALSE))
to_chat(user, "You perform a tactical reload on \the [src].")
else
@@ -221,11 +287,48 @@
A.update_appearance()
update_appearance()
return
+ if(istype(A, /obj/item/suppressor))
+ var/obj/item/suppressor/S = A
+ if(!can_suppress)
+ to_chat(user, "You can't seem to figure out how to fit [S] on [src]!")
+ return
+ if(!user.is_holding(src))
+ to_chat(user, "You need be holding [src] to fit [S] to it!")
+ return
+ if(suppressed)
+ to_chat(user, "[src] already has a suppressor!")
+ return
+ if(user.transferItemToLoc(A, src))
+ to_chat(user, "You screw \the [S] onto \the [src].")
+ install_suppressor(A)
+ return
if (can_be_sawn_off)
if (sawoff(user, A))
return
return FALSE
+///Installs a new suppressor, assumes that the suppressor is already in the contents of src
+/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S)
+ suppressed = S
+ w_class += S.w_class //so pistols do not fit in pockets when suppressed
+ update_appearance()
+
+/obj/item/gun/ballistic/AltClick(mob/user)
+ if (unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
+ reskin_obj(user)
+ return
+ if(loc == user)
+ if(suppressed && can_unsuppress)
+ var/obj/item/suppressor/S = suppressed
+ if(!user.is_holding(src))
+ return ..()
+ to_chat(user, "You unscrew \the [suppressed] from \the [src].")
+ user.put_in_hands(suppressed)
+ w_class -= S.w_class
+ suppressed = null
+ update_appearance()
+ return
+
///Prefire empty checks for the bolt drop
/obj/item/gun/ballistic/proc/prefire_empty_checks()
if (!chambered && !get_ammo())
@@ -299,6 +402,8 @@
. += "It does not seem to have a round chambered."
if (bolt_locked)
. += "The [bolt_wording] is locked back and needs to be released before firing."
+ if (suppressed)
+ . += "It has a suppressor attached that can be removed with alt+click."
. += "You can [bolt_wording] [src] by pressing the unqiue action key. By default, this is space"
///Gets the number of bullets in the gun
@@ -332,6 +437,9 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
if(sawn_off)
to_chat(user, "\The [src] is already shortened!")
return
+ if(bayonet)
+ to_chat(user, "You cannot saw-off \the [src] with \the [bayonet] attached!")
+ return
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...")
@@ -362,3 +470,16 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
if(AC.BB)
process_fire(user, user, FALSE)
. = TRUE
+
+
+/obj/item/suppressor
+ name = "suppressor"
+ desc = "A syndicate small-arms suppressor for maximum espionage."
+ icon = 'icons/obj/guns/projectile.dmi'
+ icon_state = "suppressor"
+ w_class = WEIGHT_CLASS_TINY
+
+
+/obj/item/suppressor/specialoffer
+ name = "cheap suppressor"
+ desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits most weapons."
diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm
index ce500cda930b..9d97dc627bd4 100644
--- a/code/modules/projectiles/guns/ballistic/assault.dm
+++ b/code/modules/projectiles/guns/ballistic/assault.dm
@@ -35,11 +35,7 @@
/obj/item/gun/ballistic/automatic/assault/skm
name = "\improper SKM-24"
desc = "An obsolete model of assault rifle once used by CLIP. Legendary for its durability and low cost, surplus rifles are commonplace on the Frontier, and the design has been widely copied. Chambered in 7.62x40mm CLIP."
- icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
fire_sound = 'sound/weapons/gun/rifle/skm.ogg'
rack_sound = 'sound/weapons/gun/rifle/skm_cocked.ogg'
@@ -63,9 +59,6 @@
fire_delay = 0.2 SECONDS
-/obj/item/gun/ballistic/automatic/assault/skm/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/automatic/assault/skm/pirate
name = "\improper Chopper"
desc = "An SKM-24 in a state of shockingly poor repair: Several parts are missing and the 'grip' is improvised from scrap wood. It's a miracle it still works at all. Chambered in 7.62x40mm CLIP."
@@ -78,11 +71,6 @@
name = "\improper SKM-44"
desc = "An obsolete model of assault rifle once used by CLIP. Most of these were seized from Frontiersmen armories or purchased in CLIP, then modified to IRMG standards. Chambered in 7.62x40mm CLIP."
- icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi'
-
icon_state = "skm_inteq"
item_state = "skm_inteq"
manufacturer = MANUFACTURER_INTEQ
@@ -109,26 +97,16 @@
eject_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
-/obj/item/gun/ballistic/automatic/assault/p16/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/automatic/assault/p16/minutemen
name = "\improper CM-16"
desc = "The standard-issue rifle of CLIP and an extensively modified reproduction of the P-16. Chambered in 5.56mm."
- icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
icon_state = "cm16"
item_state = "cm16"
/obj/item/gun/ballistic/automatic/assault/swiss_cheese
name = "\improper Swiss Cheese"
desc = "An ancient longarm famous for its boxy, modular design. Mass produced by the Terran Confederation in ages past, these often mutiple century old designs have survied due to their sheer ruggedness. The DMA on this unit is sadly broken, but these rifles are known for their excellent burst fire. Uses 5.56mm ammunition for Matter mode."
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
fire_sound = 'sound/weapons/gun/rifle/swiss.ogg'
icon_state = "swiss"
item_state = "swiss"
@@ -157,13 +135,11 @@
/obj/item/gun/ballistic/automatic/assault/e40
name = "\improper E-40 Hybrid Rifle"
desc = "A Hybrid Assault Rifle, best known for being having a dual ballistic/laser system along with an advanced ammo counter. Once an icon for bounty hunters, age has broken most down, so these end up in collector's hands or as shoddy Frontiersmen laser SMG conversions when in their inheritted stockpiles. But if one were to find one in working condition, it would be just as formidable as back then. Chambered in .229 Eoehoma caseless, and uses energy for lasers."
- icon = 'icons/obj/guns/manufacturer/eoehoma/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/eoehoma/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/eoehoma/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/eoehoma/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "e40"
item_state = "e40"
mag_type = /obj/item/ammo_box/magazine/e40
+ can_suppress = FALSE
var/obj/item/gun/energy/laser/e40_laser_secondary/secondary
fire_select_icon_state_prefix = "e40_"
@@ -309,14 +285,10 @@
//techinically a battle rifle, i'm putting it here for organisation sake
-/obj/item/gun/ballistic/automatic/marksman/vickland //weapon designed by Apogee-dev
+/obj/item/gun/ballistic/automatic/vickland //weapon designed by Apogee-dev
name = "\improper Vickland"
desc = "The pride of the Saint-Roumain Militia, the Vickland is a rare semi-automatic battle rifle produced by Hunter's Pride exclusively for SRM use. It is unusual in its class for its internal rotary magazine, which must be reloaded using stripper clips. Chambered in .308."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
fire_sound = 'sound/weapons/gun/rifle/vickland.ogg'
icon_state = "vickland"
item_state = "vickland"
@@ -325,9 +297,8 @@
internal_magazine = TRUE
mag_type = /obj/item/ammo_box/magazine/internal/vickland
fire_sound = 'sound/weapons/gun/rifle/vickland.ogg'
-
+ actions_types = list()
manufacturer = MANUFACTURER_HUNTERSPRIDE
- zoomable = FALSE //no scope on it
rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 769ea9e7f57e..c0ccf71d513e 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -1,6 +1,7 @@
/obj/item/gun/ballistic/automatic
w_class = WEIGHT_CLASS_NORMAL
+ can_suppress = TRUE
gun_firemodes = list(FIREMODE_SEMIAUTO)
default_firemode = FIREMODE_SEMIAUTO
@@ -21,6 +22,48 @@
recoil_unwielded = 4
wield_slowdown = 0.35
+
+// SNIPER //
+
+/obj/item/gun/ballistic/automatic/sniper_rifle
+ name = "sniper rifle"
+ desc = "An anti-material rifle chambered in .50 BMG with a scope mounted on it. Its prodigious bulk requires both hands to use."
+ icon_state = "sniper"
+ item_state = "sniper"
+ fire_sound = 'sound/weapons/gun/sniper/shot.ogg'
+ fire_sound_volume = 90
+ vary_fire_sound = FALSE
+ load_sound = 'sound/weapons/gun/sniper/mag_insert.ogg'
+ rack_sound = 'sound/weapons/gun/sniper/rack.ogg'
+ suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
+ recoil = 2
+ weapon_weight = WEAPON_HEAVY
+ mag_type = /obj/item/ammo_box/magazine/sniper_rounds
+ burst_size = 1
+ w_class = WEIGHT_CLASS_NORMAL
+ zoomable = TRUE
+ zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you.
+ zoom_out_amt = 5
+ slot_flags = ITEM_SLOT_BACK
+ actions_types = list()
+ show_magazine_on_sprite = TRUE
+ manufacturer = MANUFACTURER_SCARBOROUGH
+
+ spread = -5
+ spread_unwielded = 20
+ recoil = 5
+ recoil_unwielded = 50
+ wield_slowdown = 1
+ wield_delay = 1.3 SECONDS
+
+/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate
+ name = "syndicate sniper rifle"
+ desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire."
+ can_suppress = TRUE
+ can_unsuppress = TRUE
+
+EMPTY_GUN_HELPER(automatic/sniper_rifle/syndicate)
+
// Old Semi-Auto Rifle //
/obj/item/gun/ballistic/automatic/surplus //TODO: NEEDS TO BE REPLACED WITH PISTOL CARBINES OR LOWCAL SEMI-AUTO RIFLES
@@ -32,6 +75,8 @@
mag_type = /obj/item/ammo_box/magazine/m10mm/rifle
fire_delay = 0.5 SECONDS
burst_size = 1
+ can_unsuppress = TRUE
+ can_suppress = TRUE
w_class = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BACK
show_magazine_on_sprite = TRUE
@@ -45,16 +90,69 @@
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/recharge
fire_delay = 0.2 SECONDS
+ can_suppress = FALSE
burst_size = 0
fire_sound = 'sound/weapons/laser.ogg'
casing_ejector = FALSE
+/obj/item/gun/ballistic/automatic/ebr //fuck this gun, its getting wiped soon enough
+ name = "\improper M514 EBR"
+ desc = "A reliable, high-powered battle rifle often found in the hands of Syndicate personnel and remnants, chambered in .308. Effective against personnel and armor alike."
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi'
+ icon_state = "ebr"
+ item_state = "ebr"
+ zoomable = TRUE
+ show_magazine_on_sprite = TRUE
+ weapon_weight = WEAPON_MEDIUM
+ w_class = WEIGHT_CLASS_BULKY
+ mag_type = /obj/item/ammo_box/magazine/ebr
+ fire_sound = 'sound/weapons/gun/rifle/shot_alt2.ogg'
+ burst_size = 0
+ manufacturer = MANUFACTURER_SCARBOROUGH
+
+ wield_slowdown = 2
+ spread = -4
+
+EMPTY_GUN_HELPER(automatic/ebr)
+
+/obj/item/gun/ballistic/automatic/gal
+ name = "\improper CM-GAL-S"
+ desc = "The standard issue DMR of CLIP. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308."
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
+ icon_state = "gal"
+ item_state = "gal"
+ zoomable = TRUE
+ show_magazine_on_sprite = TRUE
+ weapon_weight = WEAPON_MEDIUM
+ w_class = WEIGHT_CLASS_BULKY
+ mag_type = /obj/item/ammo_box/magazine/gal
+ fire_sound = 'sound/weapons/gun/rifle/gal.ogg'
+ burst_size = 0
+ actions_types = list()
+ manufacturer = MANUFACTURER_MINUTEMAN
+
+ wield_slowdown = 2
+ spread = -4
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
+
+/obj/item/gun/ballistic/automatic/gal/inteq
+ name = "\improper SsG-04"
+ desc = "A marksman rifle purchased from CLIP and modified to suit IRMG's needs. Chambered in .308."
+ icon_state = "gal-inteq"
+ item_state = "gal-inteq"
+
/obj/item/gun/ballistic/automatic/zip_pistol
name = "makeshift pistol"
desc = "A makeshift zip gun cobbled together from various scrap bits and chambered in 9mm. It's a miracle it even works."
icon_state = "ZipPistol"
item_state = "ZipPistol"
mag_type = /obj/item/ammo_box/magazine/zip_ammo_9mm
+ can_suppress = FALSE
actions_types = list()
+ can_bayonet = FALSE
show_magazine_on_sprite = TRUE
weapon_weight = WEAPON_LIGHT
diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm
index 3fdc2e55dadd..c50f906e4eba 100644
--- a/code/modules/projectiles/guns/ballistic/gauss.dm
+++ b/code/modules/projectiles/guns/ballistic/gauss.dm
@@ -1,16 +1,13 @@
/obj/item/gun/ballistic/automatic/powered/gauss
name = "prototype gauss rifle"
desc = "An experimental Nanotrasen rifle with a high capacity. Useful for putting down crowds. Chambered in ferromagnetic pellets."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "gauss"
item_state = "arg"
slot_flags = 0
mag_type = /obj/item/ammo_box/magazine/gauss
fire_sound = 'sound/weapons/gun/gauss/magrifle.ogg'
load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg'
+ can_suppress = FALSE
burst_size = 1
fire_delay = 0.3 SECONDS
spread = 0
@@ -34,10 +31,6 @@
name = "Model H"
desc = "A standard-issue pistol exported from the Solarian Confederation. It fires slow flesh-rending ferromagnetic slugs at a high energy cost, however they are ineffective on any armor."
mag_type = /obj/item/ammo_box/magazine/modelh
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
icon_state = "model-h"
item_state = "model-h"
fire_sound = 'sound/weapons/gun/gauss/modelh.ogg'
@@ -55,9 +48,6 @@
spread_unwielded = 12
fire_select_icon_state_prefix = "slug_"
-/obj/item/gun/ballistic/automatic/powered/gauss/modelh/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/automatic/powered/gauss/modelh/suns
desc = "A standard-issue pistol exported from the Solarian Confederation. It fires slow flesh-rending ferromagnetic slugs at a high energy cost, however they are ineffective on any armor. It is painted in the colors of SUNS."
mag_type = /obj/item/ammo_box/magazine/modelh
@@ -68,10 +58,7 @@
name = "Claris"
desc = "An antiquated Solarian rifle. Chambered in ferromagnetic pellets, just as the founding Solarians intended."
mag_type = /obj/item/ammo_box/magazine/internal/claris
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "claris"
item_state = "claris"
fire_sound = 'sound/weapons/gun/gauss/claris.ogg'
@@ -94,10 +81,7 @@
name = "Solar 'GAR' Carbine"
desc = "A Solarian carbine, unusually modern for its producers. Launches ferromagnetic lances at alarming speeds."
mag_type = /obj/item/ammo_box/magazine/gar
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "gar"
item_state = "gar"
fire_sound = 'sound/weapons/gun/gauss/gar.ogg'
diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm
index 8a3e68b9a6ec..4e9abd0cd70c 100644
--- a/code/modules/projectiles/guns/ballistic/hmg.dm
+++ b/code/modules/projectiles/guns/ballistic/hmg.dm
@@ -88,7 +88,7 @@
if(!can_deploy)
to_chat(user, "You need to brace against something to deploy [src]'s bipod! Either lie on the floor or stand next to a waist high object like a table!")
return
- if(!do_after(user, deploy_time, src, NONE, TRUE, CALLBACK(src, PROC_REF(is_wielded))))
+ if(!do_after(user, deploy_time, src, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded))))
to_chat(user, "You need to hold still to deploy [src]'s bipod!")
return
playsound(src, 'sound/machines/click.ogg', 75, TRUE)
@@ -154,15 +154,11 @@
/obj/item/gun/ballistic/automatic/hmg/l6_saw
name = "\improper L6 SAW"
desc = "A heavy machine gun, designated 'L6 SAW'. Chambered in 7.12x82mm."
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
icon_state = "l6"
item_state = "l6closedmag"
base_icon_state = "l6"
-
mag_type = /obj/item/ammo_box/magazine/mm712x82
+ can_suppress = FALSE
spread = 7
fire_delay = 0.1 SECONDS
@@ -220,14 +216,9 @@
/obj/item/gun/ballistic/automatic/hmg/solar //This thing fires a 5.56 equivalent, that's an LMG, not an HMG, get out
name = "\improper Solar"
desc = "A TerraGov LMG-169 designed in 169 FS, nicknamed 'Solar.' A inscription reads: 'PROPERTY OF TERRAGOV', with 'TERRAGOV' poorly scribbled out, and replaced by 'SOLAR ARMORIES'. Chambered in 4.73×33mm caseless ammunition."
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
-
icon_state = "solar"
-
fire_sound = 'sound/weapons/gun/l6/shot.ogg'
+ item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/rifle47x33mm
spread = 7
@@ -235,6 +226,8 @@
fire_select_icon_state_prefix = "caseless_"
+ can_suppress = FALSE
+ can_bayonet = FALSE
show_magazine_on_sprite = TRUE
w_class = WEIGHT_CLASS_BULKY
manufacturer = MANUFACTURER_SOLARARMORIES
@@ -243,11 +236,7 @@
name = "\improper SKM-24u"
desc = "What appears to be a standard SKM-24 at first glance is actually a light machine gun conversion, with an extended, heavy barrel and overhauled internals. Its weight, bulk, and robust fire rate make it difficult to handle without using the bipod in a prone position or against appropriate cover such as a table. Chambered in 7.62x40mm CLIP."
- icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "skm_lmg"
item_state = "skm_lmg"
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index f18f97cd0f4f..5619b039d488 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -4,6 +4,9 @@
/obj/item/gun/ballistic/revolver/grenadelauncher//this is only used for underbarrel grenade launchers at the moment, but admins can still spawn it if they feel like being assholes
desc = "A break-action, single-shot grenade launcher. A compact way to deliver a big boom."
name = "grenade launcher"
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ icon_state = "dshotgun_sawn"
+ item_state = "gun"
mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher
fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg'
w_class = WEIGHT_CLASS_NORMAL
@@ -43,18 +46,13 @@
/obj/item/gun/ballistic/rocketlauncher
name = "\improper PML-9"
desc = "A reusable rocket-propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel."
-
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
-
icon_state = "rocketlauncher"
item_state = "rocketlauncher"
mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher
fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg'
load_sound = 'sound/weapons/gun/general/rocket_load.ogg'
w_class = WEIGHT_CLASS_BULKY
+ can_suppress = FALSE
burst_size = 1
fire_delay = 0.4 SECONDS
casing_ejector = FALSE
@@ -76,12 +74,7 @@
/obj/item/gun/ballistic/rocketlauncher/solgov
name = "Panzerfaust XII"
desc = "The standard recoiless rifle of the Solarian Confederation. Barely varies from previous models."
-
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "panzerfaust"
item_state = "panzerfaust"
manufacturer = MANUFACTURER_SOLARARMORIES
diff --git a/code/modules/projectiles/guns/ballistic/marksman.dm b/code/modules/projectiles/guns/ballistic/marksman.dm
deleted file mode 100644
index 46a9e2466290..000000000000
--- a/code/modules/projectiles/guns/ballistic/marksman.dm
+++ /dev/null
@@ -1,102 +0,0 @@
-
-/obj/item/gun/ballistic/automatic/marksman
- burst_size = 1
- zoomable = TRUE //this var as true without setting anything else produces a 2x zoom
- wield_slowdown = 2
- wield_delay = 1 SECONDS
-
-// SNIPER //
-
-/obj/item/gun/ballistic/automatic/marksman/sniper_rifle
- name = "sniper rifle"
- desc = "An anti-material rifle chambered in .50 BMG with a scope mounted on it. Its prodigious bulk requires both hands to use."
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
- icon_state = "sniper"
- item_state = "sniper"
- fire_sound = 'sound/weapons/gun/sniper/shot.ogg'
- fire_sound_volume = 90
- vary_fire_sound = FALSE
- load_sound = 'sound/weapons/gun/sniper/mag_insert.ogg'
- rack_sound = 'sound/weapons/gun/sniper/rack.ogg'
- suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
- weapon_weight = WEAPON_HEAVY
- mag_type = /obj/item/ammo_box/magazine/sniper_rounds
- w_class = WEIGHT_CLASS_BULKY
- zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you.
- zoom_out_amt = 5
- slot_flags = ITEM_SLOT_BACK
- actions_types = list()
- show_magazine_on_sprite = TRUE
- manufacturer = MANUFACTURER_SCARBOROUGH
-
- spread = -5
- spread_unwielded = 40
- recoil = 5
- recoil_unwielded = 50
-
- wield_delay = 1.3 SECONDS
-
-EMPTY_GUN_HELPER(automatic/marksman/sniper_rifle)
-
-/obj/item/gun/ballistic/automatic/marksman/ebr //fuck this gun, its getting wiped soon enough
- name = "\improper M514 EBR"
- desc = "A reliable, high-powered battle rifle often found in the hands of Syndicate personnel and remnants, chambered in .308. Effective against personnel and armor alike."
-
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
-
- icon_state = "ebr"
- item_state = "ebr"
- zoomable = TRUE
- show_magazine_on_sprite = TRUE
- weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_BULKY
- mag_type = /obj/item/ammo_box/magazine/ebr
- fire_sound = 'sound/weapons/gun/rifle/shot_alt2.ogg'
- manufacturer = MANUFACTURER_SCARBOROUGH
-
- wield_slowdown = 2
- spread = -4
-
-EMPTY_GUN_HELPER(automatic/marksman/ebr)
-
-/obj/item/gun/ballistic/automatic/marksman/gal
- name = "\improper CM-GAL-S"
- desc = "The standard issue DMR of CLIP. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308."
-
- icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
-
- fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
- icon_state = "gal"
- item_state = "gal"
- show_magazine_on_sprite = TRUE
- weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_BULKY
- mag_type = /obj/item/ammo_box/magazine/gal
- fire_sound = 'sound/weapons/gun/rifle/gal.ogg'
- burst_size = 0
- actions_types = list()
- manufacturer = MANUFACTURER_MINUTEMAN
-
- wield_slowdown = 2
- spread = -4
- fire_select_icon_state_prefix = "clip_"
- adjust_fire_select_icon_state_on_safety = TRUE
-
-/obj/item/gun/ballistic/automatic/marksman/gal/inteq
- name = "\improper SsG-04"
- desc = "A marksman rifle purchased from CLIP and modified to suit IRMG's needs. Chambered in .308."
- icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi'
- icon_state = "gal-inteq"
- item_state = "gal-inteq"
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index b2416462da39..c4d505bcb10c 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -1,11 +1,28 @@
/obj/item/gun/ballistic/automatic/pistol
+ name = "Stechkin"
+ desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. Has a threaded barrel for suppressors."
+ icon_state = "pistol"
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/m10mm
+ can_suppress = TRUE
+ actions_types = list()
bolt_type = BOLT_TYPE_LOCKING
-
+ fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
+ dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg'
+ suppressed_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg'
+ load_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
vary_fire_sound = FALSE
+ rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
+ lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
+ bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg'
fire_sound_volume = 90
bolt_wording = "slide"
weapon_weight = WEAPON_LIGHT
pickup_sound = 'sound/items/handling/gun_pickup.ogg'
+ manufacturer = MANUFACTURER_SCARBOROUGH
recoil = 0.5 // apogee wants bloom, this is a placeholder until then to simulate the same concept.
recoil_unwielded = 3
@@ -19,39 +36,14 @@
muzzleflash_iconstate = "muzzle_flash_light"
-/obj/item/gun/ballistic/automatic/pistol/syndicate
- name = "Stechkin"
- desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. Has a threaded barrel for suppressors."
- icon_state = "pistol"
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
+EMPTY_GUN_HELPER(automatic/pistol)
- w_class = WEIGHT_CLASS_SMALL
- mag_type = /obj/item/ammo_box/magazine/m10mm
- fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
- dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg'
- suppressed_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg'
-
- load_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
- load_empty_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
- eject_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
- eject_empty_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
-
- rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
- lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
- bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg'
-
- manufacturer = MANUFACTURER_SCARBOROUGH
-
- spread = 6 //becuase its compact, spread is slightly worse
- spread_unwielded = 9
- recoil_unwielded = 2
-
-EMPTY_GUN_HELPER(automatic/pistol/syndicate)
+/obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload)
+ . = ..()
+ var/obj/item/suppressor/S = new(src)
+ install_suppressor(S)
-/obj/item/gun/ballistic/automatic/pistol/syndicate/suns
+/obj/item/gun/ballistic/automatic/pistol/suns
desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. It is painted in the colors of SUNS."
icon_state = "pistol_suns"
@@ -60,12 +52,9 @@ EMPTY_GUN_HELPER(automatic/pistol/syndicate)
desc = "A classic semi-automatic handgun, widely popular throughout the Frontier. An engraving on the slide marks it as a product of Hunter's Pride. Chambered in .45."
icon_state = "candor"
item_state = "hp_generic"
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
+ w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/m45
+ can_suppress = FALSE
fire_sound = 'sound/weapons/gun/pistol/candor.ogg'
rack_sound = 'sound/weapons/gun/pistol/candor_cocked.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
@@ -79,7 +68,7 @@ EMPTY_GUN_HELPER(automatic/pistol/syndicate)
EMPTY_GUN_HELPER(automatic/pistol/candor)
/obj/item/gun/ballistic/automatic/pistol/candor/factory //also give this to the srm, their candors should probably look factory fresh from how well taken care of they are
- desc = "A classic semi-automatic handgun, widely popular throughout the Frontier. An engraving on the slide marks it as a product of 'Hunter's Pride Arms and Ammunition'. This example has been kept in especially good shape, and may as well be fresh out of the workshop. Chambered in .45."
+ desc = "A classic semi-automatic handgun, widely popular throughout the Frontier. An engraving on the slide marks it as a product of Hunter's Pride. This example has been kept in especially good shape, and may as well be fresh out of the workshop. Chambered in .45."
item_state = "hp_generic_fresh"
EMPTY_GUN_HELPER(automatic/pistol/candor/factory)
@@ -97,14 +86,10 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory)
/obj/item/gun/ballistic/automatic/pistol/deagle
name = "\improper Desert Eagle"
desc = "An oversized handgun chambered in .50 AE. A true hand cannon."
- icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
icon_state = "deagle"
force = 14
mag_type = /obj/item/ammo_box/magazine/m50
- mag_display = TRUE
+ can_suppress = FALSE
show_magazine_on_sprite = TRUE
fire_sound = 'sound/weapons/gun/pistol/deagle.ogg'
rack_sound = 'sound/weapons/gun/pistol/rack.ogg'
@@ -137,44 +122,23 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory)
name = "stechkin APS pistol"
desc = "A burst-fire machine pistol based on the stechkin model. Utilizes specialized 9mm magazines."
icon_state = "aps"
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
-
-
+ w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/pistolm9mm
-
- fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
- dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg'
- suppressed_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg'
-
- load_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
- load_empty_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
- eject_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
- eject_empty_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
-
- rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
- lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
- bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg'
-
+ can_suppress = FALSE
burst_size = 3
burst_delay = 0.1 SECONDS
fire_delay = 0.4 SECONDS
gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST)
default_firemode = FIREMODE_SEMIAUTO
+
/obj/item/gun/ballistic/automatic/pistol/commander
name = "\improper Commander"
desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm."
icon_state = "commander"
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
-
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/co9mm
+ can_suppress = FALSE
manufacturer = MANUFACTURER_NANOTRASEN
fire_sound = 'sound/weapons/gun/pistol/commander.ogg'
load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
@@ -182,19 +146,11 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory)
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
- rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
- lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
- bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg'
-
EMPTY_GUN_HELPER(automatic/pistol/commander)
/obj/item/gun/ballistic/automatic/pistol/commander/inteq
name = "\improper Commissioner"
desc = "A handgun seized from Nanotrasen armories by deserting troopers and modified to IRMG's standards. A yellow IRMG shield is set into the grips. Chambered in 9mm."
- icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi'
icon_state = "commander-inteq"
item_state = "commander-inteq"
manufacturer = MANUFACTURER_INTEQ
@@ -205,13 +161,9 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
name = "\improper Commissar"
desc = "A Nanotrasen-issue handgun, modified with a voice box to further enhance its effectiveness in troop discipline."
icon_state = "commander"
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
-
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/co9mm
+ can_suppress = FALSE
var/funnysounds = TRUE
var/cooldown = 0
load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
@@ -219,10 +171,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
- rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
- lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
- bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg'
-
/obj/item/gun/ballistic/automatic/pistol/commissar/equipped(mob/living/user, slot)
..()
if(slot == ITEM_SLOT_HANDS && funnysounds) // We do this instead of equip_sound as we only want this to play when it's wielded
@@ -251,7 +199,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
to_chat(user, "You toggle [src]'s vox audio functions.")
/obj/item/gun/ballistic/automatic/pistol/commissar/AltClick(mob/user)
- . = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
if((cooldown < world.time - 200) && funnysounds)
@@ -268,11 +215,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
name = "\improper Pistole C"
desc = "A favorite of the Terran Regency that is despised by the Solarian bureaucracy. Shifted out of military service centuries ago, though still popular among civilians. Chambered in 5.56mm caseless."
icon_state = "pistole-c"
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
-
weapon_weight = WEAPON_LIGHT
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/pistol556mm
@@ -283,27 +225,17 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
- rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
- lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
- bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg'
-
fire_select_icon_state_prefix = "caseless_"
/obj/item/gun/ballistic/automatic/pistol/solgov/old
icon_state = "pistole-c-old"
-/obj/item/gun/ballistic/automatic/pistol/tec9 //fucking kill this gun already my god
+/obj/item/gun/ballistic/automatic/pistol/tec9
name = "\improper TEC-9 machine pistol"
desc = "A crude machine pistol designed to vomit 9mm ammunition at a truly eye-watering rate of fire."
icon_state = "tec9"
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
-
- fire_delay = 0.15 SECONDS
weapon_weight = WEAPON_LIGHT
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/tec9
show_magazine_on_sprite = TRUE
load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
@@ -311,18 +243,15 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
- gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
- default_firemode = FIREMODE_SEMIAUTO
-
/obj/item/gun/ballistic/automatic/pistol/disposable
name = "disposable gun"
desc = "An exceedingly flimsy plastic gun that is extremely cheap to produce. You get what you pay for."
fire_sound = 'sound/weapons/gun/pistol/himehabu.ogg'
-
- icon_state = "disposable" //credit to discord user 20nypercent for the sprite
+ icon_state = "disposable" //credit to discord user any% for the sprite
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/disposable
custom_materials = list(/datum/material/plastic=2000)
+ can_suppress = FALSE
manufacturer = MANUFACTURER_NONE
has_safety = FALSE //thing barely costs anything, why would it have a safety?
safety = FALSE
@@ -340,12 +269,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
name = ".38 Derringer"
desc = "An easily concealable derringer. Uses .38 special ammo."
icon_state = "derringer"
-
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
mag_type = /obj/item/ammo_box/magazine/internal/derr38
fire_sound = 'sound/weapons/gun/revolver/shot.ogg'
load_sound = 'sound/weapons/gun/revolver/load_bullet.ogg'
@@ -374,12 +297,6 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
/obj/item/gun/ballistic/derringer/traitor
name = "\improper .357 Syndicate Derringer"
desc = "An easily concealable derriger, if not for the bright red-and-black. Uses .357 ammo."
-
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
-
icon_state = "derringer_syndie"
mag_type = /obj/item/ammo_box/magazine/internal/derr357
fire_sound_volume = 50 //Tactical stealth firing
@@ -390,34 +307,16 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq)
icon_state = "derringer_gold"
mag_type = /obj/item/ammo_box/magazine/internal/derr357
-/obj/item/gun/ballistic/derringer/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/automatic/pistol/himehabu
name = "\improper Himehabu"
desc = "A very small .22 LR pistol. The long awaited successor to the Stechkin; It has become a favorite among syndicate spies. Chambered in .22 LR."
icon_state = "himehabu"
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
-
-
w_class = WEIGHT_CLASS_TINY
mag_type = /obj/item/ammo_box/magazine/m22lr
+ can_suppress = FALSE
fire_sound = 'sound/weapons/gun/pistol/himehabu.ogg'
- load_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
- load_empty_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
- eject_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
- eject_empty_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
-
- rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
- lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
- bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg'
-
recoil = -2
recoil_unwielded = -2
spread_unwielded = 0
wield_slowdown = 0
-
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 545cbf8bf117..756a8aa9ca26 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -7,8 +7,8 @@
#define REVOLVER_FLIP "flip the revolver by the trigger"
/obj/item/gun/ballistic/revolver
- name = "i demand"
- desc = "You feel as if you should make a 'adminhelp' if you see one of these, along with a 'github' report. You don't really understand what this means though."
+ name = "\improper .357 revolver"
+ desc = "A weighty revolver with a Scarborough Arms logo engraved on the barrel. Uses .357 ammo." //usually used by syndicates
icon_state = "revolver"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder
fire_sound = 'sound/weapons/gun/revolver/shot.ogg'
@@ -192,6 +192,8 @@
to_chat(user, "You load the [cartridge_wording] into [src].")
return TRUE
+
+
/obj/item/gun/ballistic/revolver/attackby(obj/item/attacking_obj, mob/user, params)
if (istype(attacking_obj, /obj/item/ammo_casing) || istype(attacking_obj, /obj/item/ammo_box))
if(istype(attacking_obj, /obj/item/ammo_casing))
@@ -280,7 +282,7 @@
to_chat(user, "You rack the [bolt_wording] of \the [src].")
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
- if(!safety && !semi_auto)
+ if((!safety && !semi_auto) || (!safety && !semi_auto))
chamber_round(TRUE)
SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
update_appearance()
@@ -468,25 +470,11 @@
playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE)
return
-/obj/item/gun/ballistic/revolver/syndicate //mystery tool that we can use later
- name = "\improper syndicate revolver"
- desc = "A weighty revolver with a Scarborough Arms logo engraved on the barrel. Uses .357 ammo." //usually used by syndicates
- icon_state = "revolver"
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
-
/obj/item/gun/ballistic/revolver/detective
name = "\improper HP Detective Special"
desc = "A small law enforcement firearm. Originally commissioned by Nanotrasen for their Private Investigation division, it has become extremely popular among independent civilians as a cheap, compact sidearm. Uses .38 Special rounds."
fire_sound = 'sound/weapons/gun/revolver/shot_light.ogg'
icon_state = "detective"
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38
obj_flags = UNIQUE_RENAME
semi_auto = TRUE //double action
@@ -554,22 +542,10 @@ EMPTY_GUN_HELPER(revolver/detective)
to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.")
return TRUE
-/obj/item/gun/ballistic/revolver/detective/no_mag
- spawnwithmagazine = FALSE
-
-/obj/item/gun/ballistic/revolver/syndicate/no_mag
- spawnwithmagazine = FALSE
-
-/obj/item/gun/ballistic/revolver/no_mag
- spawnwithmagazine = FALSE
/obj/item/gun/ballistic/revolver/mateba
name = "\improper Unica 6 auto-revolver"
desc = "A high-powered revolver with a unique auto-reloading system. Uses .357 ammo."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "mateba"
manufacturer = MANUFACTURER_NONE
semi_auto = TRUE
@@ -587,34 +563,23 @@ EMPTY_GUN_HELPER(revolver/detective)
/obj/item/gun/ballistic/revolver/montagne
name = "\improper HP Montagne"
- desc = "An ornate break-open revolver issued to high-ranking members of the Saint-Roumain Militia. Chambered in .44."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
+ desc = "An ornate break-open revolver issued to high-ranking members of the Saint-Roumain Militia. Chambered in .45."
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "montagne"
manufacturer = MANUFACTURER_HUNTERSPRIDE
spread_unwielded = 15
recoil = 0
- mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev44/montagne
+ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev45/montagne
/obj/item/gun/ballistic/revolver/montagne/ComponentInitialize()
. = ..()
AddComponent(/datum/component/ammo_hud/revolver)
-/obj/item/gun/ballistic/revolver/montagne/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/revolver/ashhand
name = "HP Ashhand"
desc = "A massive, long-barreled revolver often used by the Saint-Roumain Militia as protection against big game. Can only be reloaded one cartridge at a time due to its reinforced frame. Uses .45-70 ammo."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "ashhand"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev4570
fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
@@ -631,16 +596,93 @@ EMPTY_GUN_HELPER(revolver/detective)
. = ..()
AddComponent(/datum/component/ammo_hud/revolver)
+// A gun to play Russian Roulette!
+// You can spin the chamber to randomize the position of the bullet.
+
+//TODO: this is stupid, but used in ONE fucking ruin. Remember to remove when you aren't afraid to do a ton of path changes.
+
+/obj/item/gun/ballistic/revolver/russian
+ name = "\improper Russian revolver"
+ desc = "A Solarian revolver for particularly lethal drinking games. It has a mechanism requiring you to spin the chamber before each trigger pull. Uses .357 ammo."
+ icon_state = "russianrevolver"
+ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357
+ var/spun = FALSE
+ manufacturer = MANUFACTURER_NONE
+
+/obj/item/gun/ballistic/revolver/russian/do_spin()
+ . = ..()
+ if(.)
+ spun = TRUE
+
+/obj/item/gun/ballistic/revolver/russian/attackby(obj/item/A, mob/user, params)
+ ..()
+ if(get_ammo() > 0)
+ spin()
+ update_appearance()
+ A.update_appearance()
+ return
+
+/obj/item/gun/ballistic/revolver/russian/attack_self(mob/user)
+ if(!spun)
+ spin()
+ spun = TRUE
+ return
+ ..()
+
+/obj/item/gun/ballistic/revolver/russian/afterattack(atom/target, mob/living/user, flag, params)
+ . = ..(null, user, flag, params)
+
+ if(flag)
+ if(!(target in user.contents) && ismob(target))
+ if(user.a_intent == INTENT_HARM) // Flogging action
+ return
+
+ if(isliving(user))
+ if(!can_trigger_gun(user))
+ return
+ if(target != user)
+ if(ismob(target))
+ to_chat(user, "A mechanism prevents you from shooting anyone but yourself!")
+ return
+
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!spun)
+ to_chat(user, "You need to spin \the [src]'s chamber first!")
+ return
+
+ spun = FALSE
+
+ if(chambered)
+ var/obj/item/ammo_casing/AC = chambered
+ if(AC.fire_casing(user, user))
+ playsound(user, fire_sound, fire_sound_volume, vary_fire_sound)
+ var/zone = check_zone(user.zone_selected)
+ var/obj/item/bodypart/affecting = H.get_bodypart(zone)
+ if(zone == BODY_ZONE_HEAD || zone == BODY_ZONE_PRECISE_EYES || zone == BODY_ZONE_PRECISE_MOUTH)
+ shoot_self(user, affecting)
+ else
+ user.visible_message("[user.name] cowardly fires [src] at [user.p_their()] [affecting.name]!", "You cowardly fire [src] at your [affecting.name]!", "You hear a gunshot!")
+ chambered = null
+ return
+
+ user.visible_message("*click*")
+ playsound(src, dry_fire_sound, 30, TRUE)
+
+/obj/item/gun/ballistic/revolver/russian/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+ add_fingerprint(user)
+ playsound(src, dry_fire_sound, 30, TRUE)
+ user.visible_message("[user.name] tries to fire \the [src] at the same time, but only succeeds at looking like an idiot.", "\The [src]'s anti-combat mechanism prevents you from firing it at the same time!")
+
+/obj/item/gun/ballistic/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = BODY_ZONE_HEAD)
+ user.apply_damage(300, BRUTE, affecting)
+ user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!")
+
/obj/item/gun/ballistic/revolver/firebrand
name = "\improper HP Firebrand"
desc = "An archaic precursor to revolver-type firearms, this gun was rendered completely obsolete millennia ago. While fast to fire, it is extremely inaccurate. Uses .357 ammo."
icon_state = "pepperbox"
item_state = "hp_generic_fresh"
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/pepperbox
spread = 20
manufacturer = MANUFACTURER_HUNTERSPRIDE
@@ -650,21 +692,13 @@ EMPTY_GUN_HELPER(revolver/detective)
semi_auto = TRUE
safety_wording = "safety"
-/obj/item/gun/ballistic/revolver/firebrand/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/revolver/shadow
name = "\improper HP Shadow"
- desc = "A mid-size revolver. Despite the antiquated design, it is cheap, reliable, and stylish, making it a favorite among fast-drawing spacers and the officers of various militaries, as well as small-time police units. Chambered in .44."
+ desc = "A mid-size revolver. Despite the antiquated design, it is cheap, reliable, and stylish, making it a favorite among fast-drawing spacers and the officers of various militaries, as well as small-time police units. Chambered in .45."
fire_sound = 'sound/weapons/gun/revolver/cattleman.ogg'
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "shadow"
- item_state = "hp_generic"
-
- mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev44
+ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev45
manufacturer = MANUFACTURER_HUNTERSPRIDE
obj_flags = UNIQUE_RENAME
gate_loaded = TRUE
@@ -685,5 +719,9 @@ EMPTY_GUN_HELPER(revolver/detective)
. = ..()
AddComponent(/datum/component/ammo_hud/revolver)
-/obj/item/gun/ballistic/revolver/shadow/no_mag
- spawnwithmagazine = FALSE
+/obj/item/gun/ballistic/revolver/shadow/before_firing(atom/target, mob/user)
+ . = ..()
+ // if you go through the pain of not only using this shitty gun, but also with the fucking gunslinger quirk, you deserve this bonus. not a BIG bonus, but enough as an incentive to make people actually take the quirk.
+ if(chambered.BB && (HAS_TRAIT(user, TRAIT_GUNSLINGER)))
+ chambered.BB.damage += 5
+ chambered.BB.armour_penetration += 5
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 1e7724c5c9fa..45b1e8b2debd 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -73,17 +73,11 @@
/obj/item/gun/ballistic/rifle/illestren
name = "\improper HP Illestren"
desc = "A sturdy and conventional bolt-action rifle. One of Hunter's Pride's most successful firearms, the Illestren is popular among colonists, pirates, snipers, and countless others. Chambered in 8x50mmR."
- icon_state = "illestren"
- item_state = "illestren"
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
sawn_desc = "An Illestren rifle sawn down to a ridiculously small size. There was probably a reason it wasn't made this short to begin with, but it still packs a punch."
eject_sound = 'sound/weapons/gun/rifle/vickland_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/rifle/vickland_unload.ogg'
-
+ icon_state = "illestren"
+ item_state = "illestren"
internal_magazine = FALSE
mag_type = /obj/item/ammo_box/magazine/illestren_a850r
empty_autoeject = TRUE
@@ -91,14 +85,12 @@
can_be_sawn_off = TRUE
manufacturer = MANUFACTURER_HUNTERSPRIDE
-/obj/item/gun/ballistic/rifle/illestren/empty //i had to name it empty instead of no_mag because else it wouldnt work with guncases. sorry!
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user)
. = ..()
if(.)
spread = 24
spread_unwielded = 30
+ can_bayonet = FALSE
item_state = "illestren_sawn"
mob_overlay_state = item_state
weapon_weight = WEAPON_MEDIUM //you can fire it onehanded, makes it worse than worse than useless onehanded, but you can
@@ -126,8 +118,7 @@
item_state = "illestren_sawn"
sawn_off = TRUE
weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = ITEM_SLOT_BELT
+
/obj/item/gun/ballistic/rifle/solgov
name = "SSG-669C"
@@ -135,11 +126,6 @@
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/solgov
icon_state = "ssg669c"
item_state = "ssg669c"
- icon = 'icons/obj/guns/manufacturer/solararmories/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/solararmories/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
-
fire_sound = 'sound/weapons/gun/rifle/ssg669c.ogg'
can_be_sawn_off = FALSE
@@ -158,19 +144,13 @@
/obj/item/gun/ballistic/rifle/scout
name = "HP Scout"
desc = "A powerful bolt-action rifle usually given to mercenary hunters of the Saint-Roumain Militia, equally suited for taking down big game or two-legged game. Chambered in .300 Magnum."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
- icon_state = "scout"
- item_state = "scout"
-
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/smile
fire_sound = 'sound/weapons/gun/rifle/scout.ogg'
rack_sound = 'sound/weapons/gun/rifle/scout_bolt_out.ogg'
bolt_drop_sound = 'sound/weapons/gun/rifle/scout_bolt_in.ogg'
-
+ icon_state = "scout"
+ item_state = "scout"
can_be_sawn_off = FALSE
zoomable = TRUE
@@ -179,9 +159,6 @@
manufacturer = MANUFACTURER_HUNTERSPRIDE
-/obj/item/gun/ballistic/rifle/scout/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/rifle/polymer
name = "polymer survivor rifle"
desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout."
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 1f15f8d01689..bfe2e88bf804 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -62,11 +62,7 @@
desc = "A simple and sturdy pump-action shotgun sporting a 5-round capacity, manufactured by Hunter's Pride. Found widely throughout the Frontier in the hands of hunters, pirates, police, and countless others. Chambered in 12g."
sawn_desc = "A stockless and shortened pump-action shotgun. The worsened recoil and accuracy make it a poor sidearm anywhere beyond punching distance."
fire_sound = 'sound/weapons/gun/shotgun/brimstone.ogg'
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "brimstone"
item_state = "brimstone"
@@ -78,7 +74,7 @@
fire_delay = 0.05 SECONDS //slamfire
rack_delay = 0.2 SECONDS
- can_be_sawn_off = TRUE
+ can_be_sawn_off = TRUE
/obj/item/gun/ballistic/shotgun/brimstone/sawoff(mob/user)
@@ -95,23 +91,17 @@
item_state = "illestren_factory_sawn" // i couldnt care about making another sprite, looks close enough
mob_overlay_state = item_state
-/obj/item/gun/ballistic/shotgun/brimstone/no_mag
- spawnwithmagazine = FALSE
// HELLFIRE SHOTGUN //
/obj/item/gun/ballistic/shotgun/hellfire
name = "HP Hellfire"
desc = "A hefty pump-action riot shotgun with a seven-round tube, manufactured by Hunter's Pride. Especially popular among the Frontier's police forces. Chambered in 12g."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "hellfire"
item_state = "hellfire"
-
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
- can_be_sawn_off = TRUE
+ can_be_sawn_off = TRUE
rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg'
fire_delay = 0.1 SECONDS
@@ -132,8 +122,6 @@
item_state = "dshotgun_sawn" // ditto
mob_overlay_state = item_state
-/obj/item/gun/ballistic/shotgun/hellfire/no_mag
- spawnwithmagazine = FALSE
// Automatic Shotguns//
/obj/item/gun/ballistic/shotgun/automatic
spread = 4
@@ -141,6 +129,8 @@
recoil = 1
recoil_unwielded = 4
wield_delay = 0.65 SECONDS
+
+/obj/item/gun/ballistic/shotgun/automatic
manufacturer = MANUFACTURER_NANOTRASEN
/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user)
@@ -156,14 +146,14 @@
item_state = "shotgun_combat"
fire_delay = 0.5 SECONDS
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
- w_class = WEIGHT_CLASS_BULKY
+ w_class = WEIGHT_CLASS_HUGE
/obj/item/gun/ballistic/shotgun/automatic/combat/compact
name = "compact combat shotgun"
desc = "A compact version of the semi-automatic combat shotgun. For close encounters."
icon_state = "cshotgunc"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_MEDIUM
//Dual Feed Shotgun
@@ -171,14 +161,7 @@
/obj/item/gun/ballistic/shotgun/automatic/dual_tube
name = "cycler shotgun"
desc = "An advanced shotgun with two separate magazine tubes, allowing you to quickly toggle between ammo types."
-
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
-
icon_state = "cycler"
-
mag_type = /obj/item/ammo_box/magazine/internal/shot/tube
w_class = WEIGHT_CLASS_HUGE
var/toggled = FALSE
@@ -221,15 +204,16 @@
/obj/item/gun/ballistic/shotgun/bulldog //TODO: REPATH TO LIKE /obj/item/gun/ballistic/shotgun/automatic/bulldog
name = "\improper Bulldog Shotgun"
desc = "A semi-automatic, magazine-fed shotgun designed for combat in tight quarters, manufactured by Scarborough Arms. A historical favorite of various Syndicate factions, especially the Gorlex Marauders."
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "bulldog"
item_state = "bulldog"
-
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ inhand_x_dimension = 32
+ inhand_y_dimension = 32
weapon_weight = WEAPON_MEDIUM
mag_type = /obj/item/ammo_box/magazine/m12g
+ can_suppress = FALSE
burst_size = 1
fire_delay = 0.4 SECONDS // this NEEDS the old delay.
fire_sound = 'sound/weapons/gun/shotgun/bulldog.ogg'
@@ -279,11 +263,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
/obj/item/gun/ballistic/shotgun/bulldog/minutemen //TODO: REPATH
name = "\improper CM-15"
desc = "A standard-issue shotgun of CLIP, most often used by boarding crews. Only compatible with specialized 8-round magazines."
- icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
mag_type = /obj/item/ammo_box/magazine/cm15_mag
icon_state = "cm15"
item_state = "cm15"
@@ -303,11 +283,8 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
desc = "A classic break action shotgun, hand-made in a Hunter's Pride workshop. Both barrels can be fired in quick succession or even simultaneously. Guns like this have been popular with hunters, sporters, and criminals for millennia. Chambered in 12g."
sawn_desc = "A break action shotgun cut down to the size of a sidearm. While the recoil is even harsher, it offers a lot of power in a very small package. Chambered in 12g."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
base_icon_state = "dshotgun"
icon_state = "dshotgun"
@@ -329,17 +306,12 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
"Stained Green" = "dshotgun_green"
)
semi_auto = TRUE
- can_be_sawn_off = TRUE
+ can_be_sawn_off = TRUE
bolt_type = BOLT_TYPE_NO_BOLT
pb_knockback = 3 // it's a super shotgun!
manufacturer = MANUFACTURER_HUNTERSPRIDE
bolt_wording = "barrel"
- burst_delay = 0.05 SECONDS
- burst_size = 2
- gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST)
- default_firemode = FIREMODE_SEMIAUTO
-
/obj/item/gun/ballistic/shotgun/doublebarrel/unique_action(mob/living/user)
if (bolt_locked == FALSE)
to_chat(user, "You snap open the [bolt_wording] of \the [src].")
@@ -407,28 +379,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
item_state = "dshotgun_sawn"
mob_overlay_state = item_state
-/obj/item/gun/ballistic/shotgun/doublebarrel/no_mag
- spawnwithmagazine = FALSE
-
-// sawn off beforehand
-/obj/item/gun/ballistic/shotgun/doublebarrel/presawn
- name = "sawn-off double-barreled shotgun"
- desc = "A break action shotgun cut down to the size of a sidearm. While the recoil is even harsher, it offers a lot of power in a very small package. Chambered in 12g."
- sawn_off = TRUE
- weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = ITEM_SLOT_BELT
-
- wield_slowdown = 0.25
- wield_delay = 0.3 SECONDS //OP? maybe
-
- spread = 8
- spread_unwielded = 15
- recoil = 3 //or not
- recoil_unwielded = 5
- item_state = "dshotgun_sawn"
- mag_type = /obj/item/ammo_box/magazine/internal/shot/dual/lethal
-
/obj/item/gun/ballistic/shotgun/doublebarrel/roumain
name = "HP antique double-barreled shotgun"
desc = "A special-edition shotgun hand-made by Hunter's Pride with a high-quality walnut stock inlaid with brass scrollwork. Shotguns like this are very rare outside of the Saint-Roumain Militia's ranks. Otherwise functionally identical to a common double-barreled shotgun. Chambered in 12g."
@@ -449,10 +399,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
name = "improvised shotgun"
desc = "A length of pipe and miscellaneous bits of scrap fashioned into a rudimentary single-shot shotgun."
icon = 'icons/obj/guns/projectile.dmi'
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
- mob_overlay_icon = null
-
base_icon_state = "ishotgun"
icon_state = "ishotgun"
item_state = "ishotgun"
@@ -464,9 +410,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
unique_reskin = null
var/slung = FALSE
- gun_firemodes = list(FIREMODE_SEMIAUTO)
- default_firemode = FIREMODE_SEMIAUTO
-
/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
@@ -516,7 +459,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact/compact
w_class = WEIGHT_CLASS_SMALL
sawn_desc = "You know, this isn't funny anymore."
- can_be_sawn_off = TRUE
+ can_be_sawn_off = TRUE
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(prob(0 + (magazine.ammo_count() * 20))) //minimum probability of 20, maximum of 60
@@ -539,7 +482,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact/compact/compact
w_class = WEIGHT_CLASS_TINY
sawn_desc = "Sigh. This is a trigger attached to a bullet."
- can_be_sawn_off = TRUE
+ can_be_sawn_off = TRUE
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact/compact/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(prob(50)) //It's going to blow up.
@@ -571,7 +514,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
attack_verb = list("bludgeoned", "smashed")
mag_type = /obj/item/ammo_box/magazine/internal/shot/sex
burst_size = 6
- burst_delay = 0.04 SECONDS //?? very weird number
+ fire_delay = 0.08 SECONDS //?? very weird number
pb_knockback = 12
unique_reskin = null
recoil = 10
@@ -584,8 +527,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
rack_sound_volume = 50
can_be_sawn_off = FALSE
manufacturer = MANUFACTURER_BRAZIL
- gun_firemodes = list(FIREMODE_BURST)
- default_firemode = FIREMODE_BURST
/obj/item/gun/ballistic/shotgun/doublebarrel/brazil/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(prob(0 + (magazine.ammo_count() * 10)))
@@ -610,7 +551,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
pb_knockback = 40
recoil = 100
recoil_unwielded = 200
- recoil_backtime_multiplier = 1
fire_sound_volume = 100
mag_type = /obj/item/ammo_box/magazine/internal/shot/hundred
@@ -622,10 +562,10 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
base_icon_state = "flamingarrow"
icon_state = "flamingarrow"
item_state = "flamingarrow"
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/back.dmi'
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
inhand_x_dimension = 32
inhand_y_dimension = 32
mag_type = /obj/item/ammo_box/magazine/internal/shot/winchester
@@ -633,7 +573,7 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
rack_sound = 'sound/weapons/gun/rifle/skm_cocked.ogg'
bolt_wording = "lever"
cartridge_wording = "bullet"
- can_be_sawn_off = TRUE
+ can_be_sawn_off = TRUE
wield_slowdown = 0.5
wield_delay = 0.65 SECONDS
@@ -644,9 +584,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
recoil = 0
recoil_unwielded = 2
-/obj/item/gun/ballistic/shotgun/flamingarrow/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/shotgun/flamingarrow/update_icon_state()
. = ..()
if(current_skin)
@@ -660,18 +597,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
if(!wielded)
SpinAnimation(7,1)
-/obj/item/gun/ballistic/shotgun/flamingarrow/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- var/fan = FALSE
- if(HAS_TRAIT(user, TRAIT_GUNSLINGER) && !semi_auto && wielded_fully && loc == user && !safety)
- fan = TRUE
- fire_delay = 0.35 SECONDS
- . = ..()
- fire_delay = src::fire_delay
- if(fan)
- rack()
- to_chat(user, "You quickly rack the [bolt_wording] of \the [src]!")
- balloon_alert_to_viewers("quickly racks!")
- fire_delay = 0 SECONDS
/obj/item/gun/ballistic/shotgun/flamingarrow/sawoff(mob/user)
. = ..()
@@ -721,10 +646,9 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
/obj/item/gun/ballistic/shotgun/doublebarrel/twobore
name = "HP Huntsman"
desc = "A comically huge double-barreled rifle replete with brass inlays depicting flames and naturalistic scenes, clearly meant for the nastiest monsters the Frontier has to offer. If you want an intact trophy, don't aim for the head. Chambered in two-bore."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
inhand_x_dimension = 32
inhand_y_dimension = 32
base_icon_state = "huntsman"
@@ -746,9 +670,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
rack_sound_volume = 50
manufacturer = MANUFACTURER_HUNTERSPRIDE
- gun_firemodes = list(FIREMODE_SEMIAUTO) //no dual burst for you
- default_firemode = FIREMODE_SEMIAUTO
-
//Break-Action Rifle
/obj/item/gun/ballistic/shotgun/doublebarrel/beacon
name = "HP Beacon"
@@ -758,16 +679,21 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
icon_state = "beacon"
item_state = "beacon"
unique_reskin = null
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/back.dmi'
inhand_x_dimension = 32
inhand_y_dimension = 32
mag_type = /obj/item/ammo_box/magazine/internal/shot/beacon
fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
+ can_be_sawn_off=TRUE
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_MEDIUM
force = 10
+ flags_1 = CONDUCT_1
+ slot_flags = ITEM_SLOT_BACK
obj_flags = UNIQUE_RENAME
semi_auto = TRUE
- can_be_sawn_off = TRUE
+ can_be_sawn_off = TRUE
pb_knockback = 3
wield_slowdown = 0.7
spread_unwielded = 15
@@ -775,9 +701,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
recoil = 0
recoil_unwielded = 5
- gun_firemodes = list(FIREMODE_SEMIAUTO)
- default_firemode = FIREMODE_SEMIAUTO
-
/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/sawoff(mob/user)
. = ..()
if(.)
@@ -791,9 +714,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
recoil = 2
recoil_unwielded = 4
-/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory
desc = "A single-shot break-action rifle made by Hunter's Pride and sold to civilian hunters. This example has been kept in excellent shape and may as well be fresh out of the workshop. Uses .45-70 ammo."
sawn_desc= "A single-shot break-action pistol chambered in .45-70. A bit difficult to aim."
@@ -806,23 +726,3 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
if(.)
item_state = "beacon_factory_sawn"
mob_overlay_state = item_state
-
-//pre sawn off beacon
-/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/presawn
- name = "sawn-off HP Beacon"
- sawn_desc= "A single-shot break-action pistol chambered in .45-70. A bit difficult to aim."
- sawn_off = TRUE
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = ITEM_SLOT_BELT
-
- weapon_weight = WEAPON_MEDIUM
-
- item_state = "beacon_sawn"
- mob_overlay_state = "beacon_sawn"
- wield_slowdown = 0.5
- wield_delay = 0.5 SECONDS
-
- spread_unwielded = 20 //mostly the hunting revolver stats
- spread = 6
- recoil = 2
- recoil_unwielded = 4
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 2cb68fc09176..5e8896ab10ec 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -39,17 +39,27 @@
. = total_spread
return ..()
+/obj/item/gun/ballistic/automatic/smg/proto
+ name = "\improper Nanotrasen Saber SMG"
+ desc = "A prototype full-auto 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors and a folding stock."
+ icon_state = "saber"
+ actions_types = list()
+ mag_type = /obj/item/ammo_box/magazine/smgm9mm
+
+ bolt_type = BOLT_TYPE_LOCKING
+ show_magazine_on_sprite = TRUE
+ manufacturer = MANUFACTURER_NANOTRASEN_OLD
+
/obj/item/gun/ballistic/automatic/smg/c20r
name = "\improper C-20r SMG"
desc = "A bullpup .45 SMG designated 'C-20r.' Its buttstamp reads 'Scarborough Arms - Per falcis, per pravitas.'"
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
icon_state = "c20r"
item_state = "c20r"
-
mag_type = /obj/item/ammo_box/magazine/smgm45
+ can_bayonet = TRUE
+ can_suppress = FALSE
+ knife_x_offset = 26
+ knife_y_offset = 12
show_magazine_on_sprite = TRUE
show_magazine_on_sprite_ammo = TRUE
empty_indicator = TRUE
@@ -64,12 +74,10 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/c20r/cobra
name = "\improper Cobra 20"
desc = "An older model of SMG manufactured by Scarborough Arms, a predecessor to the military C-20 series. Chambered in .45. "
+ can_bayonet = FALSE
icon_state = "cobra20"
item_state = "cobra20"
-/obj/item/gun/ballistic/automatic/smg/c20r/cobra/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/automatic/smg/c20r/suns
desc = "A bullpup .45 SMG designated 'C-20r.' Its buttstamp reads 'Scarborough Arms - Per falcis, per pravitas.' This one is painted in SUNS' colors."
icon_state = "c20r_suns"
@@ -78,33 +86,24 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/wt550
name = "\improper WT-550 Automatic Rifle"
desc = "An outdated PDW, used centuries ago by Nanotrasen security elements. Uses 4.6x30mm rounds."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "wt550"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/wt550m9
+ can_suppress = FALSE
actions_types = list()
+ can_bayonet = TRUE
+ knife_x_offset = 25
+ knife_y_offset = 12
show_magazine_on_sprite = TRUE
show_magazine_on_sprite_ammo = TRUE
empty_indicator = TRUE
manufacturer = MANUFACTURER_NANOTRASEN_OLD
fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
-/obj/item/gun/ballistic/automatic/smg/wt550/no_mag
- spawnwithmagazine = FALSE
-
/obj/item/gun/ballistic/automatic/smg/mini_uzi
name = "\improper Type U3 Uzi"
desc = "A lightweight submachine gun, for when you really want someone dead. Uses 9mm rounds."
-
- icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
icon_state = "uzi"
-
mag_type = /obj/item/ammo_box/magazine/uzim9mm
bolt_type = BOLT_TYPE_OPEN
show_magazine_on_sprite = TRUE
@@ -126,10 +125,6 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/vector
name = "\improper Vector carbine"
desc = "A police carbine based on a pre-Night of Fire SMG design. Most of the complex workings have been removed for reliability. Chambered in 9mm."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "vector"
item_state = "vector"
mag_type = /obj/item/ammo_box/magazine/smgm9mm //you guys remember when the autorifle was chambered in 9mm
@@ -141,14 +136,10 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/m90
name = "\improper M-90gl Carbine"
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
icon_state = "m90"
item_state = "m90"
-
mag_type = /obj/item/ammo_box/magazine/m556
+ can_suppress = FALSE
gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "underbarrel grenade launcher")
gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_OTHER)
default_firemode = FIREMODE_SEMIAUTO
@@ -223,14 +214,11 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/firestorm //weapon designed by Apogee-dev
name = "HP Firestorm"
desc = "An unconventional submachinegun, rarely issued to Saint-Roumain Militia mercenary hunters for outstanding situations where normal hunting weapons fall short. Chambered in .45."
- icon = 'icons/obj/guns/manufacturer/hunterspride/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
-
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "firestorm"
item_state = "firestorm"
mag_type = /obj/item/ammo_box/magazine/c45_firestorm_mag
+ can_suppress = FALSE
unique_mag_sprites_for_variants = TRUE
burst_size = 1
actions_types = list()
@@ -254,14 +242,8 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/cm5
name = "\improper CM-5"
desc = "The standard issue SMG of CLIP. One of the few firearm designs that were left mostly intact from the designs found on the UNSV Lichtenstein. Chambered in 9mm."
- icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
-
icon_state = "cm5"
item_state = "cm5"
-
mag_type = /obj/item/ammo_box/magazine/smgm9mm
weapon_weight = WEAPON_LIGHT
fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
@@ -304,9 +286,11 @@ EMPTY_GUN_HELPER(automatic/smg/cm5)
eject_empty_sound = 'sound/weapons/gun/rifle/skm_unload.ogg'
weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_BULKY
mag_type = /obj/item/ammo_box/magazine/skm_545_39
+ actions_types = list(/datum/action/item_action/fold_stock) //once again, ideally an attatchment in the future
+
recoil = 2
recoil_unwielded = 6
@@ -316,43 +300,80 @@ EMPTY_GUN_HELPER(automatic/smg/cm5)
wield_delay = 0.6 SECONDS
wield_slowdown = 0.35
- valid_attachments = list(
- /obj/item/attachment/silencer,
- /obj/item/attachment/laser_sight,
- /obj/item/attachment/rail_light,
- /obj/item/attachment/bayonet,
- /obj/item/attachment/foldable_stock
- )
-
- slot_available = list(
- ATTACHMENT_SLOT_MUZZLE = 1,
- ATTACHMENT_SLOT_RAIL = 1,
- ATTACHMENT_SLOT_STOCK = 1
- )
- slot_offsets = list(
- ATTACHMENT_SLOT_MUZZLE = list(
- "x" = 26,
- "y" = 20,
- ),
- ATTACHMENT_SLOT_RAIL = list(
- "x" = 19,
- "y" = 18,
- ),
- ATTACHMENT_SLOT_STOCK = list(
- "x" = 11,
- "y" = 20,
- )
- )
-
- default_attachments = list(/obj/item/attachment/foldable_stock)
+ ///is the bipod deployed?
+ var/stock_folded = FALSE
+
+ ///we add these two values to recoi/spread when we have the bipod deployed
+ var/stock_recoil_bonus = -2
+ var/stock_spread_bonus = -5
+
+ var/folded_slowdown = 0.6
+ var/folded_wield_delay = 0.6 SECONDS
+
+ var/unfolded_slowdown = 0.35
+ var/unfolded_wield_delay = 0.2 SECONDS
+
+/obj/item/gun/ballistic/automatic/smg/skm_carbine/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
+/datum/action/item_action/fold_stock
+ name = "Fold/Unfold stock"
+ desc = "Fold or unfold the stock for easier storage."
+
+/obj/item/gun/ballistic/automatic/smg/skm_carbine/ui_action_click(mob/user, action)
+ if(!istype(action, /datum/action/item_action/fold_stock))
+ return ..()
+ fold(user)
+
+
+/obj/item/gun/ballistic/automatic/smg/skm_carbine/proc/fold(mob/user)
+ if(stock_folded)
+ to_chat(user, "You unfold the stock on the [src].")
+ w_class = WEIGHT_CLASS_BULKY
+ wield_delay = folded_wield_delay
+ wield_slowdown = folded_slowdown
+ else
+ to_chat(user, "You fold the stock on the [src].")
+ w_class = WEIGHT_CLASS_NORMAL
+ wield_delay = unfolded_wield_delay
+ wield_slowdown = unfolded_slowdown
+
+ if(wielded)
+ user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown)
+
+ stock_folded = !stock_folded
+ playsound(src, 'sound/weapons/empty.ogg', 100, 1)
+ update_appearance()
+
+
+/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_recoil(mob/user, recoil_bonus = 0)
+ var/total_recoil = recoil_bonus
+ if(!stock_folded)
+ total_recoil += stock_recoil_bonus
+
+ return ..(user, total_recoil)
+
+/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_spread(mob/user, bonus_spread)
+ var/total_spread = bonus_spread
+
+ if(!stock_folded)
+ total_spread += stock_spread_bonus
+
+ return ..(user, total_spread)
+
+/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_icon_state()
+ . = ..()
+ item_state = "[initial(item_state)][stock_folded ? "_nostock" : ""]"
+ mob_overlay_state = "[initial(item_state)][stock_folded ? "_nostock" : ""]"
+
+/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_overlays()
+ . = ..()
+ . += "[base_icon_state || initial(icon_state)][stock_folded ? "_nostock" : "_stock"]"
/obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq
name = "\improper SKM-44v Mongrel"
desc = "An SKM-44, further modified into a sub-machine gun by Inteq artificers with a new magazine well, collapsing stock, and shortened barrel. Faced with a surplus of SKM-44s and a shortage of other firearms, IRMG has made the most of their available materiel with conversions such as this. Chambered in 10mm."
- icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi'
icon_state = "skm_inteqsmg"
item_state = "skm_inteqsmg"
@@ -372,24 +393,13 @@ EMPTY_GUN_HELPER(automatic/smg/cm5)
recoil = 0
recoil_unwielded = 4
+ stock_spread_bonus = -4
+ stock_recoil_bonus = -1
+
wield_delay = 0.4 SECONDS
- valid_attachments = list(
- /obj/item/attachment/silencer,
- /obj/item/attachment/laser_sight,
- /obj/item/attachment/rail_light,
- /obj/item/attachment/bayonet,
- /obj/item/attachment/foldable_stock/inteq
- )
- default_attachments = list(/obj/item/attachment/foldable_stock/inteq)
+ folded_slowdown = 0.15
+ folded_wield_delay = 0.2 SECONDS
-/obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/proto
- name = "\improper Nanotrasen Saber SMG"
- desc = "A prototype full-auto 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors and a folding stock."
- icon = 'icons/obj/guns/projectile.dmi'
- icon_state = "saber"
- item_state = "gun"
- mag_type = /obj/item/ammo_box/magazine/smgm9mm
- bolt_type = BOLT_TYPE_LOCKING
- show_magazine_on_sprite = TRUE
- manufacturer = MANUFACTURER_NANOTRASEN_OLD
+ unfolded_slowdown = 0.35
+ unfolded_wield_delay = 0.4 SECONDS
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 135a1b2d06b0..796a62dd9427 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -8,6 +8,7 @@
force = 0
throwforce = 0
burst_size = 3
+ can_suppress = TRUE
item_flags = NONE
casing_ejector = FALSE
manufacturer = MANUFACTURER_NANOTRASEN
@@ -21,10 +22,7 @@
/obj/item/gun/ballistic/automatic/toy/pistol
name = "foam force pistol"
desc = "A small, easily concealable toy handgun. Ages 8 and up."
- icon = 'icons/obj/guns/manufacturer/scarborough/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/scarborough/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/scarborough/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/scarborough/onmob.dmi'
+ icon = 'icons/obj/guns/projectile.dmi'
icon_state = "pistol" // WS edit - Fix various startup runtimes
bolt_type = BOLT_TYPE_LOCKING
w_class = WEIGHT_CLASS_SMALL
@@ -46,13 +44,13 @@
/obj/item/gun/ballistic/shotgun/toy
name = "foam force shotgun"
desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
- icon_state = "shotgun"
force = 0
throwforce = 0
mag_type = /obj/item/ammo_box/magazine/internal/shot/toy
fire_sound = 'sound/items/syringeproj.ogg'
item_flags = NONE
casing_ejector = FALSE
+ can_suppress = FALSE
pb_knockback = 0
recoil = -10 //its a toy...
recoil_unwielded = -10
@@ -83,6 +81,7 @@
/obj/item/gun/ballistic/automatic/smg/c20r/toy
name = "donksoft SMG"
desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
+ can_suppress = FALSE
item_flags = NONE
mag_type = /obj/item/ammo_box/magazine/toy/smgm45
fire_sound = 'sound/items/syringeproj.ogg'
@@ -102,6 +101,7 @@
name = "donksoft LMG"
desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
fire_sound = 'sound/items/syringeproj.ogg'
+ can_suppress = FALSE
item_flags = NONE
mag_type = /obj/item/ammo_box/magazine/toy/m762
casing_ejector = FALSE
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index abe3e3fd7b43..d06ad71d206d 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -1,8 +1,8 @@
/obj/item/gun/energy
+ icon_state = "energy"
name = "energy gun"
desc = "A basic energy-based gun."
icon = 'icons/obj/guns/energy.dmi'
- icon_state = "laser"
muzzleflash_iconstate = "muzzle_flash_laser"
muzzle_flash_color = COLOR_SOFT_RED
@@ -10,31 +10,41 @@
has_safety = TRUE
safety = TRUE
- modifystate = FALSE
- ammo_x_offset = 2
-
gun_firemodes = list(FIREMODE_SEMIAUTO)
default_firemode = FIREMODE_SEMIAUTO
fire_select_icon_state_prefix = "laser_"
- tac_reloads = FALSE
- tactical_reload_delay = 1.2 SECONDS
-
- valid_attachments = list(
- /obj/item/attachment/laser_sight,
- /obj/item/attachment/rail_light,
- /obj/item/attachment/bayonet
- )
- slot_available = list(
- ATTACHMENT_SLOT_RAIL = 1
- )
- slot_offsets = list(
- ATTACHMENT_SLOT_RAIL = list(
- "x" = 19,
- "y" = 18,
- )
- )
+ var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses
+ var/cell_type = /obj/item/stock_parts/cell/gun
+ var/modifystate = 0
+ var/list/ammo_type = list(/obj/item/ammo_casing/energy)
+ var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
+ var/can_charge = TRUE //Can it be charged in a recharger?
+ var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_appearance()?
+ var/charge_sections = 4
+ ammo_x_offset = 2
+ var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail
+ var/selfcharge = 0
+ var/charge_tick = 0
+ var/charge_delay = 4
+ var/use_cyborg_cell = FALSE //whether the gun's cell drains the cyborg user's cell to recharge
+ var/dead_cell = FALSE //set to true so the gun is given an empty cell
+
+ var/internal_cell = FALSE ///if the gun's cell cannot be replaced
+ var/small_gun = FALSE ///if the gun is small and can only fit the small gun cell
+ var/big_gun = FALSE ///if the gun is big and can fit the comically large gun cell
+ var/unscrewing_time = 20 ///Time it takes to unscrew the cell
+
+ ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
+ var/tac_reloads = FALSE
+ ///If we allow tacitcal reloads, how long should it take to reload?
+ var/tactical_reload_delay = 1.2 SECONDS
+
+ var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' //Sound when inserting magazine. UPDATE PLEASE
+ var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' //Sound of ejecting a cell. UPDATE PLEASE
+ var/sound_volume = 40 //Volume of loading/unloading sounds
+ var/load_sound_vary = TRUE //Should the load/unload sounds vary?
/obj/item/gun/energy/emp_act(severity)
. = ..()
@@ -53,8 +63,8 @@
cell = new cell_type(src)
else
cell = new(src)
- if(dead_cell)
- cell.use(cell.maxcharge)
+ if(!dead_cell)
+ cell.give(cell.maxcharge)
update_ammo_types()
recharge_newshot(TRUE)
if(selfcharge)
@@ -123,50 +133,54 @@
return ..()
/obj/item/gun/energy/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C)
- if(mag_size == MAG_SIZE_SMALL && !istype(C, /obj/item/stock_parts/cell/gun/mini))
- to_chat(user, span_warning("\The [C] doesn't seem to fit into \the [src]..."))
+ if(small_gun && !istype(C, /obj/item/stock_parts/cell/gun/mini))
+ to_chat(user, "\The [C] doesn't seem to fit into \the [src]...")
return FALSE
- if(mag_size == MAG_SIZE_LARGE && !istype(C, /obj/item/stock_parts/cell/gun/large))
- to_chat(user, span_warning("\The [C] doesn't seem to fit into \the [src]..."))
+ if(!big_gun && istype(C, /obj/item/stock_parts/cell/gun/large))
+ to_chat(user, "\The [C] doesn't seem to fit into \the [src]...")
return FALSE
if(user.transferItemToLoc(C, src))
cell = C
- to_chat(user, span_notice("You load the [C] into \the [src]."))
- playsound(src, load_sound, load_sound_volume, load_sound_vary)
+ to_chat(user, "You load the [C] into \the [src].")
+ playsound(src, load_sound, sound_volume, load_sound_vary)
update_appearance()
return TRUE
else
- to_chat(user, span_warning("You cannot seem to get \the [src] out of your hands!"))
+ to_chat(user, "You cannot seem to get \the [src] out of your hands!")
return FALSE
/obj/item/gun/energy/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null)
- playsound(src, load_sound, load_sound_volume, load_sound_vary)
+ playsound(src, load_sound, sound_volume, load_sound_vary)
cell.forceMove(drop_location())
var/obj/item/stock_parts/cell/gun/old_cell = cell
old_cell.update_appearance()
cell = null
- to_chat(user, span_notice("You pull the cell out of \the [src]."))
+ to_chat(user, "You pull the cell out of \the [src].")
update_appearance()
if(tac_load && tac_reloads)
- if(do_after(user, tactical_reload_delay, src, hidden = TRUE))
+ if(do_after(user, tactical_reload_delay, TRUE, src))
if(insert_cell(user, tac_load))
- to_chat(user, span_notice("You perform a tactical reload on \the [src]."))
+ to_chat(user, "You perform a tactical reload on \the [src].")
else
- to_chat(user, span_warning("You dropped the old cell, but the new one doesn't fit. How embarassing."))
+ to_chat(user, "You dropped the old cell, but the new one doesn't fit. How embarassing.")
else
- to_chat(user, span_warning("Your reload was interupted!"))
+ to_chat(user, "Your reload was interupted!")
return
user.put_in_hands(old_cell)
update_appearance()
-/obj/item/gun/energy/screwdriver_act(mob/living/user, obj/item/I)
+/obj/item/gun/energy/get_gun_attachments()
if(cell && !internal_cell)
- to_chat(user, span_notice("You begin unscrewing and pulling out the cell..."))
- if(I.use_tool(src, user, unscrewing_time, volume = 100))
- to_chat(user, span_notice("You remove the power cell."))
- eject_cell(user)
- return ..()
+ attachment_options += list("Cell" = image(icon = cell.icon, icon_state = cell.icon_state))
+ ..()
+
+/obj/item/gun/energy/remove_gun_attachments(mob/living/user, obj/item/I, picked_option)
+ if(picked_option == "Cell")
+ if(I.use_tool(src, user, unscrewing_time, volume=100))
+ eject_cell(user, I)
+ return TRUE
+ ..()
/obj/item/gun/energy/can_shoot(visuals)
if(safety && !visuals)
@@ -216,7 +230,7 @@
fire_sound = shot.fire_sound
fire_delay = shot.delay
if (shot.select_name)
- to_chat(user, span_notice("[src] is now set to [shot.select_name]."))
+ to_chat(user, "[src] is now set to [shot.select_name].")
chambered = null
playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
recharge_newshot(TRUE)
@@ -294,13 +308,13 @@
if(!BB)
. = ""
else if(BB.nodamage || !BB.damage || BB.damage_type == STAMINA)
- user.visible_message(span_danger("[user] tries to light [user.p_their()] [A.name] with [src], but it doesn't do anything. Dumbass."))
+ user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but it doesn't do anything. Dumbass.")
playsound(user, E.fire_sound, 50, TRUE)
playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
. = ""
else if(BB.damage_type != BURN)
- user.visible_message(span_danger("[user] tries to light [user.p_their()] [A.name] with [src], but only succeeds in utterly destroying it. Dumbass."))
+ user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but only succeeds in utterly destroying it. Dumbass.")
playsound(user, E.fire_sound, 50, TRUE)
playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
@@ -310,16 +324,10 @@
playsound(user, E.fire_sound, 50, TRUE)
playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
- . = span_danger("[user] casually lights their [A.name] with [src]. Damn.")
+ . = "[user] casually lights their [A.name] with [src]. Damn."
/obj/item/gun/energy/examine(mob/user)
. = ..()
- var/obj/item/ammo_casing/energy/shot = ammo_type[select]
if(ammo_type.len > 1)
- . += "You can switch firemodes by pressing the unique action key. By default, this is space"
- if(cell)
- . += "\The [name]'s cell has [cell.percent()]% charge remaining."
- . += "\The [name] has [round(cell.charge/shot.e_cost)] shots remaining on [shot.select_name] mode."
- else
- . += span_notice("\The [name] doesn't seem to have a cell!")
+ . += "You can switch firemodes by pressing the unqiue action key. By default, this is space"
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index 90bfa9a8ead1..f1188f76701f 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -1,21 +1,17 @@
/obj/item/gun/energy/e_gun
name = "energy rifle"
desc = "A basic hybrid energy gun with two settings: disable and kill."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "energy"
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
- modifystate = TRUE
+ modifystate = 1
+ can_flashlight = TRUE
ammo_x_offset = 2
+ flight_x_offset = 15
+ flight_y_offset = 10
dual_wield_spread = 60
manufacturer = MANUFACTURER_SHARPLITE_NEW
-/obj/item/gun/energy/e_gun/empty_cell
- dead_cell = TRUE
-
/obj/item/gun/energy/e_gun/mini
name = "miniature energy gun"
desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: disable and kill."
@@ -23,22 +19,29 @@
item_state = "gun"
w_class = WEIGHT_CLASS_SMALL
cell_type = /obj/item/stock_parts/cell/gun/mini
- mag_size = MAG_SIZE_SMALL
+ small_gun = TRUE
throwforce = 11 //This is funny, trust me.
ammo_x_offset = 2
charge_sections = 3
+ can_flashlight = FALSE // Can't attach or detach the flashlight, and override it's icon update
+ gunlight_state = "mini-light"
+ flight_x_offset = 19
+ flight_y_offset = 13
+
wield_delay = 0.2 SECONDS
wield_slowdown = 0.15
spread = 2
spread_unwielded = 5
-/obj/item/gun/energy/e_gun/mini/empty_cell
- dead_cell = TRUE
+/obj/item/gun/energy/e_gun/mini/Initialize()
+ set_gun_light(new /obj/item/flashlight/seclite(src))
+ return ..()
/obj/item/gun/energy/e_gun/hades
name = "SL AL-655 'Hades' energy rifle"
desc = "The standard issue rifle of Nanotrasen's Security Forces. Most have been put in long term storage following the ICW, and usually aren't issued to low ranking security divisions."
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "energytac"
ammo_x_offset = 2
charge_sections = 5
@@ -66,6 +69,12 @@
ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/electrode/old)
manufacturer = MANUFACTURER_NANOTRASEN_OLD
+/obj/item/gun/energy/e_gun/mini/practice_phaser
+ name = "practice phaser"
+ desc = "A modified version of the basic phaser gun, this one fires less concentrated energy bolts designed for target practice."
+ ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/practice)
+ icon_state = "decloner"
+
/obj/item/gun/energy/e_gun/hos
name = "\improper X-01 MultiPhase Energy Gun"
desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
@@ -96,9 +105,10 @@
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
icon_state = "dragnet"
item_state = "dragnet"
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap)
+ can_flashlight = FALSE
ammo_x_offset = 1
/obj/item/gun/energy/e_gun/dragnet/snare
@@ -115,6 +125,7 @@
w_class = WEIGHT_CLASS_HUGE
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
weapon_weight = WEAPON_HEAVY
+ can_flashlight = FALSE
trigger_guard = TRIGGER_GUARD_NONE
ammo_x_offset = 2
@@ -184,7 +195,7 @@
item_state = "gun"
ammo_x_offset = 2
charge_sections = 6
- mag_size = MAG_SIZE_SMALL
+ small_gun = TRUE
wield_delay = 0.2 SECONDS
wield_slowdown = 0.15
@@ -228,7 +239,7 @@
inhand_y_dimension = 64
icon_state = "iotshotgun"
item_state = "shotgun_combat"
- shaded_charge = TRUE
+ shaded_charge = 1
w_class = WEIGHT_CLASS_BULKY
ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter/ultima, /obj/item/ammo_casing/energy/laser/ultima)
var/obj/item/modular_computer/integratedNTOS
@@ -237,13 +248,12 @@
/obj/item/gun/energy/e_gun/e11
name = "E-11 hybrid energy rifle"
desc = "A hybrid energy gun fondly remembered as one of the worst weapons ever made. It hurts, but that's only if it manages to hit its target."
- icon = 'icons/obj/guns/manufacturer/eoehoma/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/eoehoma/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/eoehoma/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/eoehoma/onmob.dmi'
icon_state = "e11"
ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/eoehoma)
+ can_flashlight = TRUE
ammo_x_offset = 0
+ flight_x_offset = 20
+ flight_y_offset = 9
spread = 80
spread_unwielded = 140
dual_wield_spread = 140
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 2ca71649a6f7..ac3aa9e3d21a 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -8,8 +8,14 @@
item_flags = NONE
obj_flags = UNIQUE_RENAME
weapon_weight = WEAPON_LIGHT
+ can_flashlight = TRUE
+ flight_x_offset = 15
+ flight_y_offset = 9
automatic_charge_overlays = FALSE
- internal_cell = TRUE //prevents you from giving it an OP cell - WS Edit
+ can_bayonet = TRUE
+ knife_x_offset = 20
+ knife_y_offset = 12
+ internal_cell = TRUE
custom_price = 750
w_class = WEIGHT_CLASS_BULKY
@@ -22,18 +28,12 @@
var/overheat = FALSE
var/mob/holder
+
var/max_mod_capacity = 100
var/list/modkits = list()
var/recharge_timerid
- slot_offsets = list(
- ATTACHMENT_SLOT_RAIL = list(
- "x" = 24,
- "y" = 13,
- )
- )
-
/obj/item/gun/energy/kinetic_accelerator/shoot_with_empty_chamber(mob/living/user)
playsound(src, dry_fire_sound, 30, TRUE) //click sound but no to_chat message to cut on spam
return
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index eff3d67b2df1..31261d31e30c 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -1,7 +1,6 @@
/obj/item/gun/energy/laser
name = "SL L-204 laser gun"
desc = "A basic energy-based laser gun that fires concentrated beams of light which pass through glass and thin metal."
-
icon_state = "laser"
item_state = "laser"
w_class = WEIGHT_CLASS_NORMAL
@@ -15,9 +14,6 @@
spread = 0
spread_unwielded = 10
-/obj/item/gun/energy/laser/empty_cell
- dead_cell = TRUE
-
/obj/item/gun/energy/laser/practice
name = "practice laser gun"
desc = "A modified version of the L-204 laser gun, this one fires less concentrated energy bolts designed for target practice."
@@ -26,22 +22,13 @@
/obj/item/gun/energy/laser/retro
name ="SL L-104 retro laser gun"
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "retro"
desc = "An antiquated model of the basic lasergun, no longer used or sold by Sharplite. Nevertheless, the sheer popularity of this model makes it a somewhat common sight to this day."
ammo_x_offset = 3
manufacturer = MANUFACTURER_SHARPLITE
-
/obj/item/gun/energy/laser/captain
name = "antique laser gun"
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "caplaser"
item_state = null
desc = "This is the SL X-00, an antique laser gun, out of production for decades and well beyond anyone's capacity to recreate. All craftsmanship is of the highest quality. It is decorated with ashdrake leather and chrome. The gun menaces with spikes of energy. On the item is an image of a space station. The station is exploding."
@@ -59,6 +46,8 @@
/obj/item/gun/energy/laser/captain/scattershot
name = "scatter shot laser rifle"
+ icon_state = "lasercannon"
+ item_state = "laser"
desc = "An industrial-grade heavy-duty laser rifle with a modified laser lens to scatter its shot into multiple smaller lasers. The inner-core can self-charge for theoretically infinite use."
ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter, /obj/item/ammo_casing/energy/laser)
shaded_charge = FALSE
@@ -84,7 +73,7 @@
icon_state = "cshotgun"
item_state = "shotgun"
desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots."
- shaded_charge = FALSE
+ shaded_charge = 0
ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter, /obj/item/ammo_casing/energy/electrode)
manufacturer = MANUFACTURER_NONE
@@ -96,7 +85,7 @@
icon_state = "lasercannon"
item_state = "laser"
w_class = WEIGHT_CLASS_BULKY
- mag_size = MAG_SIZE_LARGE
+ big_gun = TRUE
cell_type = "/obj/item/stock_parts/cell/gun/large"
force = 10
flags_1 = CONDUCT_1
@@ -161,9 +150,6 @@
/obj/item/gun/energy/laser/iot
name = "\improper SL E-255 Ultimate"
desc = "An energy shotgun with an integrated computer system for surveillance and statistics tracking."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
-
lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi'
righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi'
inhand_x_dimension = 64
@@ -195,15 +181,11 @@
/obj/item/gun/energy/laser/hitscanpistol
name = "experimental laser gun"
desc = "A highly experimental laser gun, with unknown inner workings. It has no markings besides a \"GROUP A\" inscription on the barrel."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "hitscangun"
item_state = "gun"
ammo_x_offset = 2
charge_sections = 4
- mag_size = MAG_SIZE_SMALL
+ small_gun = TRUE
w_class = WEIGHT_CLASS_NORMAL
cell_type = /obj/item/stock_parts/cell/gun/mini
ammo_type = list(/obj/item/ammo_casing/energy/lasergun/hitscan)
@@ -218,10 +200,6 @@
/obj/item/gun/energy/laser/e10
name = "E-10 laser pistol"
desc = "A very old laser weapon. Despite the extreme age of some of these weapons, they are sometimes preferred to newer, mass-produced Nanotrasen laser weapons."
- icon = 'icons/obj/guns/manufacturer/eoehoma/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/eoehoma/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/eoehoma/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/eoehoma/onmob.dmi'
icon_state = "e10"
w_class = WEIGHT_CLASS_SMALL
@@ -238,14 +216,10 @@
name = "E-50 energy emitter"
desc = "A heavy and extremely powerful laser. Sets targets on fire and kicks ass, but it uses a massive amount of energy per shot and is generally awkward to handle."
- icon = 'icons/obj/guns/manufacturer/eoehoma/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/eoehoma/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/eoehoma/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/eoehoma/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "e50"
- item_state = "e50"
- mag_size = MAG_SIZE_LARGE
+ big_gun = TRUE
cell_type = /obj/item/stock_parts/cell/gun/large
ammo_type = list(/obj/item/ammo_casing/energy/laser/eoehoma/e50)
weapon_weight = WEAPON_HEAVY
diff --git a/code/modules/projectiles/guns/energy/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm
index cf67db9fd5ae..4dc5cae77558 100644
--- a/code/modules/projectiles/guns/energy/mounted.dm
+++ b/code/modules/projectiles/guns/energy/mounted.dm
@@ -6,6 +6,7 @@
item_state = "armcannonstun4"
force = 5
selfcharge = 1
+ can_flashlight = FALSE
trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead
/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow...
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index c2e5b4cb2933..f16cbbd98e8c 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -1,10 +1,7 @@
/obj/item/gun/energy/pulse
name = "pulse rifle"
desc = "A top-of-the-line, heavy-duty, multifaceted energy rifle with three firing modes. The gold standard for Nanotrasen's heavier security specialists."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "pulse"
item_state = null
w_class = WEIGHT_CLASS_BULKY
@@ -30,17 +27,17 @@
/obj/item/gun/energy/pulse/carbine
name = "pulse carbine"
desc = "A next-generation pulse weapon for Nanotrasen's security forces. High production costs and logistical issues have limited its deployment to specialist Loss Prevention and Emergency Response units."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
+ icon = 'icons/obj/guns/energy.dmi'
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
icon_state = "pulse_carbine"
item_state = null
internal_cell = FALSE
- mag_size = MAG_SIZE_LARGE //haha gun go brr
+ big_gun = TRUE //haha gun go brr
cell_type = /obj/item/stock_parts/cell/gun/large
+ can_flashlight = TRUE
+ flight_x_offset = 18
+ flight_y_offset = 12
ammo_x_offset = 2
charge_sections = 4
@@ -61,10 +58,7 @@
/obj/item/gun/energy/pulse/pistol
name = "pulse pistol"
desc = "A pulse rifle in an easily concealed handgun package with low capacity."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
+ icon = 'icons/obj/guns/energy.dmi'
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_BELT
icon_state = "pulse_pistol"
@@ -81,3 +75,10 @@
/obj/item/gun/energy/pulse/destroyer/attack_self(mob/living/user)
to_chat(user, "[src.name] has three settings, and they are all DESTROY.")
+
+/obj/item/gun/energy/pulse/pistol/m1911
+ name = "\improper Candor-P"
+ desc = "A compact pulse core in a classic handgun frame for Nanotrasen officers. It's not the size of the gun, it's the size of the hole it puts through people."
+ icon_state = "m1911"
+ item_state = "gun"
+ cell_type = /obj/item/stock_parts/cell/infinite
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 09de7690b5ea..73d9104833fb 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -6,8 +6,9 @@
shaded_charge = FALSE
ammo_x_offset = 2
ammo_y_offset = 2
+ can_flashlight = FALSE
w_class = WEIGHT_CLASS_HUGE
- mag_size = MAG_SIZE_LARGE //yes, you can put the comically large cell in it. No, you aren't getting it roundstart. You slut.
+ big_gun = TRUE //yes, you can put the comically large cell in it. No, you aren't getting it roundstart. You slut.
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/ion)
@@ -16,9 +17,6 @@
/obj/item/gun/energy/ionrifle/emp_act(severity)
return
-/obj/item/gun/energy/ionrifle/empty_cell
- dead_cell = TRUE
-
/obj/item/gun/energy/ionrifle/carbine
name = "ion carbine"
desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient."
@@ -27,6 +25,9 @@
slot_flags = ITEM_SLOT_BELT
ammo_x_offset = 2
ammo_y_offset = 0
+ can_flashlight = TRUE
+ flight_x_offset = 18
+ flight_y_offset = 11
/obj/item/gun/energy/decloner
name = "biological demolecularisor"
@@ -47,10 +48,10 @@
icon_state = "flora"
item_state = "gun"
ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut, /obj/item/ammo_casing/energy/flora/revolution)
- modifystate = TRUE
+ modifystate = 1
ammo_x_offset = 1
selfcharge = 1
- shaded_charge = TRUE
+ shaded_charge = 1
/obj/item/gun/energy/meteorgun
name = "meteor gun"
@@ -94,16 +95,24 @@
overheat_time = 20
holds_charge = TRUE
unique_frequency = TRUE
+ can_flashlight = FALSE
max_mod_capacity = 0
manufacturer = MANUFACTURER_SCARBOROUGH
+/obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
+ name = "candy corn crossbow"
+ desc = "A weapon favored by Syndicate trick-or-treaters."
+ icon_state = "crossbow_halloween"
+ item_state = "crossbow"
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt/halloween)
+
/obj/item/gun/energy/kinetic_accelerator/crossbow/large
name = "energy crossbow"
desc = "A reverse engineered weapon using syndicate technology."
icon_state = "crossbowlarge"
w_class = WEIGHT_CLASS_NORMAL
custom_materials = list(/datum/material/iron=4000)
- suppressed = FALSE
+ suppressed = null
ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
manufacturer = MANUFACTURER_NONE
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index e70c46cc76f6..fc11a632e039 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -1,10 +1,11 @@
/obj/item/gun/energy/taser
name = "taser gun"
desc = "A low-capacity, energy-based stun gun used by security teams to subdue targets at range."
- icon_state = "advtaser"
+ icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 3
+
spread = 2
spread_unwielded = 4
@@ -21,21 +22,22 @@
/obj/item/gun/energy/e_gun/advtaser/cyborg
name = "cyborg taser"
desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating."
+ can_flashlight = FALSE
can_charge = FALSE
use_cyborg_cell = TRUE
/obj/item/gun/energy/disabler
name = "disabler"
desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse."
- icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi'
icon_state = "disabler"
item_state = null
ammo_type = list(/obj/item/ammo_casing/energy/disabler)
ammo_x_offset = 2
+ can_flashlight = TRUE
+ flight_x_offset = 15
+ flight_y_offset = 10
manufacturer = MANUFACTURER_SHARPLITE_NEW
+
spread = 2
spread_unwielded = 4
@@ -48,9 +50,5 @@
/obj/item/gun/energy/disabler/e60
name = "E-60"
desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse."
- icon = 'icons/obj/guns/manufacturer/eoehoma/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/eoehoma/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/eoehoma/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/eoehoma/onmob.dmi'
icon_state = "e60"
manufacturer = MANUFACTURER_EOEHOMA
diff --git a/code/modules/projectiles/guns/manufacturer/etherbor/energy_gunsword.dm b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
similarity index 74%
rename from code/modules/projectiles/guns/manufacturer/etherbor/energy_gunsword.dm
rename to code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
index faafde9656c4..20a301a1396c 100644
--- a/code/modules/projectiles/guns/manufacturer/etherbor/energy_gunsword.dm
+++ b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
@@ -1,12 +1,12 @@
-/obj/item/gun/energy/kalix
+/obj/item/gun/energy/kalix //blue //todo: fix up belt_mirror.dmi, it's incomprehensible
name = "Etherbor BG-12"
- desc = "Etherbor Industries's current civilian energy weapon model. The BG-12 energy beam gun is identical to the military model, minus the removal of the full auto mode. Otherwise, it's no different from older hunting beams from Kalixcis's history."
+ desc = "Brought to you by Etherbor Industries, proudly based within the PGF, is the BG-12 energy beam gun! The BG-12 is Etherbor's current newest civilian energy weapon model."
icon_state = "kalixgun"
item_state = "kalixgun"
- icon = 'icons/obj/guns/manufacturer/etherbor/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/etherbor/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/etherbor/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/etherbor/onmob.dmi'
+ icon = 'icons/obj/guns/faction/gezena/energy.dmi'
+ lefthand_file = 'icons/obj/guns/faction/gezena/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/faction/gezena/righthand.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/belt.dmi'
w_class = WEIGHT_CLASS_BULKY
modifystate = TRUE
@@ -42,21 +42,15 @@
damage = 25
armour_penetration = -10
-/obj/item/gun/energy/kalix/empty_cell
- dead_cell = TRUE
-
/obj/item/gun/energy/kalix/pgf
name = "Etherbor BG-16"
- desc = "The BG-16 is the military-grade beam gun designed and manufactured by Etherbor Industries as the standard-issue close-range weapon of the PGF."
+ desc = "An advanced variant of the BG-12, the BG-16 is the military-grade beam gun designed and manufactured by Etherbor Industries as the standard-issue close-range weapon of the PGF."
icon_state = "pgfgun"
item_state = "pgfgun"
w_class = WEIGHT_CLASS_NORMAL
- gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
- default_firemode = FIREMODE_SEMIAUTO
-
cell_type = /obj/item/stock_parts/cell/gun/pgf
- ammo_type = list(/obj/item/ammo_casing/energy/kalix/pgf , /obj/item/ammo_casing/energy/disabler/hitscan)
+ ammo_type = list(/obj/item/ammo_casing/energy/pgf , /obj/item/ammo_casing/energy/disabler/hitscan)
/obj/projectile/beam/hitscan/kalix/pgf
name = "concentrated energy"
@@ -67,14 +61,14 @@
muzzle_flash_color_override = LIGHT_COLOR_ELECTRIC_GREEN
impact_light_color_override = LIGHT_COLOR_ELECTRIC_GREEN
-/obj/item/ammo_casing/energy/kalix/pgf
+/obj/item/ammo_casing/energy/pgf
projectile_type = /obj/projectile/beam/hitscan/kalix/pgf
fire_sound = 'sound/weapons/gun/energy/kalixsmg.ogg'
delay = 1
-/obj/item/gun/energy/kalix/pistol //blue
+/obj/item/gun/energy/kalix/pistol //blue //todo: fix up belt_mirror.dmi, it's incomprehensible
name = "Etherbor SG-8"
- desc = "Etherbor's current and sidearm offering. While marketed for the military, it's also available for civillians as an upgrade over older and obsolete beam pistols."
+ desc = "Etherbor's current and sidearm offering. While intended for marines, it's also available for civillians"
icon_state = "kalixpistol"
item_state = "kalixpistol"
w_class = WEIGHT_CLASS_NORMAL
@@ -97,14 +91,13 @@
e_cost = 1250 //10 shots per cell
delay = 0
-/obj/item/gun/energy/kalix/pistol/empty_cell
- dead_cell = TRUE
-
/obj/item/gun/energy/kalix/pgf/heavy
name = "Etherbor HBG-7"
- desc = "The HBG-7 is the standard-issue rifle weapon of the PGF. It comes with a special DMR mode that has greater armor piercing for dealing with armored targets."
+ desc = "The HBG-7 is the standard-issue rifle weapon of the PGF. If the stopping power and fire rate isn't enough, it comes with a DMR mode that has greater armor piercing for dealing with armored targets."
icon_state = "pgfheavy"
item_state = "pgfheavy"
+ icon = 'icons/obj/guns/faction/gezena/48x32.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/back.dmi'
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
@@ -158,7 +151,7 @@
/obj/item/gun/energy/kalix/pgf/heavy/sniper
name = "Etherbor HBG-7L"
- desc = "HBG-7 with a longer barrel and scope. Intended to get the best use out of the DMR mode, it suffers from longer wield times and slowdown, but it's longer barrel makes it ideal for accuracy."
+ desc = "HBG-7 with a longer barrel and scope. Intended to get the best use out of the DMR mode, it suffers if used normally from longer wield times and slowdown"
icon_state = "pgfheavy_sniper"
item_state = "pgfheavy_sniper"
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index b131b03ec148..8b6626bc5e97 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -29,7 +29,7 @@
w_class = WEIGHT_CLASS_BULKY
ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan)
internal_cell = FALSE //prevents you from giving it an OP cell - WS Edit //shut up dumb nerd
- mag_size = MAG_SIZE_LARGE
+ big_gun = TRUE
cell_type = "/obj/item/stock_parts/cell/gun/large"
canMouseDown = TRUE
var/aiming = FALSE
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index 809c15682cd4..84d00b226371 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -80,6 +80,7 @@
w_class = WEIGHT_CLASS_SMALL
force = 2 //Also very weak because it's smaller
suppressed = TRUE //Softer fire sound
+ can_unsuppress = FALSE //Permanently silenced
/obj/item/gun/syringe/dna
name = "modified syringe gun"
diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm
index a9ab2f6365f4..ac7418748d9b 100644
--- a/code/modules/projectiles/guns/powered.dm
+++ b/code/modules/projectiles/guns/powered.dm
@@ -1,6 +1,21 @@
/obj/item/gun/ballistic/automatic/powered
mag_type = /obj/item/ammo_box/magazine/gauss
- charge_sections = 3
+ can_suppress = FALSE
+
+ var/obj/item/stock_parts/cell/cell
+ var/cell_type = /obj/item/stock_parts/cell/gun
+ var/charge_sections = 3
+ var/empty_battery_sound = FALSE // play empty alarm if no battery
+
+ var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail
+ var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_appearance()?
+
+ var/internal_cell = FALSE ///if the gun's cell cannot be replaced
+ var/small_gun = FALSE ///if the gun is small and can only fit the small gun cell
+ var/big_gun = FALSE ///if the gun is big and can fit the comically large gun cell
+ var/unscrewing_time = 2 SECONDS ///Time it takes to unscrew the cell
+ var/sound_volume = 40 //Volume of loading/unloading cell sounds
+
/obj/item/gun/ballistic/automatic/powered/Initialize()
. = ..()
@@ -46,24 +61,24 @@
return ..()
/obj/item/gun/ballistic/automatic/powered/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C)
- if(mag_size == MAG_SIZE_SMALL && !istype(C, /obj/item/stock_parts/cell/gun/mini))
- to_chat(user, "\The [C] doesn't seem to fit into \the [src]...")
+ if(small_gun && !istype(C, /obj/item/stock_parts/cell/gun/mini))
+ to_chat(user, "[C] doesn't seem to fit into [src]...")
return FALSE
- if(mag_size == MAG_SIZE_LARGE && !istype(C, /obj/item/stock_parts/cell/gun/large))
- to_chat(user, "\The [C] doesn't seem to fit into \the [src]...")
+ if(!big_gun && istype(C, /obj/item/stock_parts/cell/gun/large))
+ to_chat(user, "[C] doesn't seem to fit into [src]...")
return FALSE
if(user.transferItemToLoc(C, src))
cell = C
- to_chat(user, "You load the [C] into \the [src].")
- playsound(src, load_sound, load_sound_volume, load_sound_vary)
+ to_chat(user, "You load [C] into [src].")
+ playsound(src, load_sound, sound_volume, load_sound_vary)
update_appearance()
return TRUE
else
- to_chat(user, "You cannot seem to get \the [src] out of your hands!")
+ to_chat(user, "You cannot seem to get [src] out of your hands!")
return FALSE
/obj/item/gun/ballistic/automatic/powered/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null)
- playsound(src, load_sound, load_sound_volume, load_sound_vary)
+ playsound(src, load_sound, sound_volume, load_sound_vary)
cell.forceMove(drop_location())
var/obj/item/stock_parts/cell/gun/old_cell = cell
cell = null
@@ -73,7 +88,7 @@
update_appearance()
/obj/item/gun/ballistic/automatic/powered/screwdriver_act(mob/living/user, obj/item/I)
- if(cell && !internal_cell)
+ if(cell && !internal_cell && !bayonet && (!gun_light || !can_flashlight))
to_chat(user, "You begin unscrewing and pulling out the cell...")
if(I.use_tool(src, user, unscrewing_time, volume=100))
to_chat(user, "You remove the power cell.")
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 66adeb53ac59..0b9bcb8da4f7 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -490,7 +490,7 @@
if(direct_target)
return TRUE
// If target not able to use items, move and stand - or if they're just dead, pass over.
- if(L.stat || (!hit_stunned_targets && HAS_TRAIT(L, TRAIT_IMMOBILIZED) && HAS_TRAIT(L, TRAIT_FLOORED) && HAS_TRAIT(L, TRAIT_HANDS_BLOCKED)))
+ if(L.stat == DEAD || (!hit_stunned_targets && HAS_TRAIT(L, TRAIT_IMMOBILIZED) && HAS_TRAIT(L, TRAIT_FLOORED) && HAS_TRAIT(L, TRAIT_HANDS_BLOCKED)))
return FALSE
return TRUE
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index 0c62fe5b3d4f..7ec48a74b970 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -152,20 +152,3 @@
armour_penetration = -45
ricochet_incidence_leeway = 20
ricochet_chance = 65
-
-// 44 Short (Roumain & Shadow)
-
-/obj/projectile/bullet/a44roum
- name = ".44 roumain bullet"
- damage = 25
-
-/obj/projectile/bullet/a44roum/rubber
- name = ".44 roumain bullet"
- damage = 7
- stamina = 38
- armour_penetration = -20
-
-/obj/projectile/bullet/a44roum/hp
- name = ".44 roumain bullet"
- damage = 45
- armour_penetration = -20
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index ba9c8c88d7f8..e102c4c3b48f 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -18,7 +18,7 @@
/obj/projectile/bullet/incendiary/shotgun/dragonsbreath
name = "dragonsbreath pellet"
- damage = 8
+ damage = 5
armour_penetration = -35
/obj/projectile/bullet/slug/stun
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 9eb48f11cf4d..86f4e05226e4 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -512,7 +512,7 @@
matching_container = 1
else
- if(cached_my_atom.type in typesof(C.required_container))
+ if(cached_my_atom.type == C.required_container)
matching_container = 1
if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs
return
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 2fa26e8f4bfb..037256db302f 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -470,14 +470,14 @@
/datum/reagent/consumable/tea,
/datum/reagent/consumable/icetea,
/datum/reagent/consumable/space_cola,
- /datum/reagent/consumable/comet_trail,
- /datum/reagent/consumable/tadrixx,
+ /datum/reagent/consumable/spacemountainwind,
+ /datum/reagent/consumable/dr_gibb,
/datum/reagent/consumable/space_up,
/datum/reagent/consumable/tonic,
/datum/reagent/consumable/sodawater,
/datum/reagent/consumable/lemon_lime,
- /datum/reagent/consumable/pacfuel,
- /datum/reagent/consumable/shoal_punch,
+ /datum/reagent/consumable/pwr_game,
+ /datum/reagent/consumable/shamblers,
/datum/reagent/consumable/sugar,
/datum/reagent/consumable/pineapplejuice,
/datum/reagent/consumable/orangejuice,
@@ -489,7 +489,7 @@
)
upgrade_reagents = null
emagged_reagents = list(
- /datum/reagent/consumable/ethanol/vimukti,
+ /datum/reagent/consumable/ethanol/thirteenloko,
/datum/reagent/consumable/ethanol/whiskey_cola,
/datum/reagent/toxin/mindbreaker,
/datum/reagent/toxin/staminatoxin
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index b59f4358c76a..123afbcf387c 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -87,30 +87,30 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/beer
name = "Beer"
- description = "An alcoholic beverage, brewed originally to keep a safe source of drinking water. A timeless classic."
+ description = "An alcoholic beverage brewed since ancient times on Old Earth. Still popular today."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 25
- taste_description = "bad water"
+ taste_description = "piss water"
glass_name = "glass of beer"
- glass_desc = "A pint of beer."
+ glass_desc = "A freezing pint of beer."
/datum/reagent/consumable/ethanol/beer/light
name = "Light Beer"
- description = "An alcoholic beverage, brewed originally to keep a safe source of drinking water. This variety has reduced calorie and alcohol content."
+ description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content."
boozepwr = 5 //Space Europeans hate it
taste_description = "dish water"
glass_name = "glass of light beer"
- glass_desc = "A pint of watery light beer."
+ glass_desc = "A freezing pint of watery light beer."
/datum/reagent/consumable/ethanol/beer/green
name = "Green Beer"
- description = "An alcoholic beverage, brewed originally to keep a safe source of drinking water. This variety is dyed green, but you're not sure why."
+ description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is dyed a festive green."
color = "#A8E61D"
- taste_description = "green bad water"
+ taste_description = "green piss water"
glass_icon_state = "greenbeerglass"
glass_name = "glass of green beer"
- glass_desc = "A pint of green beer. You get the feeling this had some sort of meaning, once."
+ glass_desc = "A freezing pint of green beer. Festive."
/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M)
if(M.color != color)
@@ -122,13 +122,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/kahlua
name = "Kahlua"
- description = "A widely known coffee-flavoured liqueur. Still labeled under an old name from Earth, despite the loss of history."
+ description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
- taste_description = "a bitter combination"
glass_icon_state = "kahluaglass"
- glass_name = "glass of coffee liquor"
- glass_desc = "Bitter from the coffee and alcohol alike!"
+ glass_name = "glass of RR coffee liquor"
+ glass_desc = "DAMN, THIS THING LOOKS ROBUST!"
shot_glass_icon_state = "shotglasscream"
/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M)
@@ -142,23 +141,23 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/whiskey
name = "Whiskey"
- description = "A well-aged whiskey."
+ description = "A superb and well-aged single-malt whiskey. Damn."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 75
taste_description = "molasses"
glass_icon_state = "whiskeyglass"
glass_name = "glass of whiskey"
- glass_desc = "Often described as having a silky mouthfeel and a smokey aftertaste. The brown-amber color catches the light very well."
+ glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
shot_glass_icon_state = "shotglassbrown"
/datum/reagent/consumable/ethanol/whiskey/kong
name = "Kong"
- description = "Makes You Go Ape!"
+ description = "Makes You Go Ape!®"
color = "#332100" // rgb: 51, 33, 0
addiction_threshold = 15
taste_description = "the grip of a giant ape"
glass_name = "glass of Kong"
- glass_desc = "Makes You Go Ape!"
+ glass_desc = "Makes You Go Ape!®"
/datum/reagent/consumable/ethanol/whiskey/kong/addiction_act_stage1(mob/living/M)
if(prob(5))
@@ -201,21 +200,21 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.hallucination += hal_amt //conscious dreamers can be treasurers to their own currency
..()
-/datum/reagent/consumable/ethanol/vimukti
- name = "Vimukti"
- description = "A potent, fermented sweet lichen drink from the Shoal."
+/datum/reagent/consumable/ethanol/thirteenloko
+ name = "Thirteen Loko"
+ description = "A potent mixture of caffeine and alcohol."
color = "#ce871d"
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 80
quality = DRINK_GOOD
overdose_threshold = 60
addiction_threshold = 30
- taste_description = "oily syrup"
- glass_icon_state = "vimukti_glass"
- glass_name = "glass of Vimukti"
- glass_desc = "A spiritually-taxing drink from the Shoal. Numerous warnings about this drink tell you to not drink too much, lest you incur some sort of wrath... or an overdose of a psychoactive lichen."
+ taste_description = "jitters and death"
+ glass_icon_state = "thirteen_loko_glass"
+ glass_name = "glass of Thirteen Loko"
+ glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass."
-/datum/reagent/consumable/ethanol/vimukti/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-7)
M.AdjustSleeping(-40)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -223,12 +222,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.Jitter(5)
return ..()
-/datum/reagent/consumable/ethanol/vimukti/overdose_start(mob/living/M)
+/datum/reagent/consumable/ethanol/thirteenloko/overdose_start(mob/living/M)
to_chat(M, "Your entire body violently jitters as you start to feel queasy. You really shouldn't have drank all of that [name]!")
M.Jitter(20)
M.Stun(15)
-/datum/reagent/consumable/ethanol/vimukti/overdose_process(mob/living/M)
+/datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/M)
if(prob(7) && iscarbon(M))
var/obj/item/I = M.get_active_held_item()
if(I)
@@ -261,18 +260,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(prob(1) && iscarbon(M))
var/datum/disease/D = new /datum/disease/heart_failure
M.ForceContractDisease(D)
- to_chat(M, "You're pretty sure you just felt your heart stop for a second there...")
+ to_chat(M, "You're pretty sure you just felt your heart stop for a second there..")
M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0)
/datum/reagent/consumable/ethanol/vodka
name = "Vodka"
- description = "A clear, hard liquor. Doubles as a flammable fuel source, if you really need it."
+ description = "Number one drink that also serves as fuel."
color = "#0064C8" // rgb: 0, 100, 200
boozepwr = 65
taste_description = "grain alcohol"
glass_icon_state = "ginvodkaglass"
glass_name = "glass of vodka"
- glass_desc = "It's almost difficult to tell the glass is full of vodka until you tip it around. The smell makes your nose wrinkle... but it might just be worth it."
+ glass_desc = "The glass contain wodka. Xynta."
shot_glass_icon_state = "shotglassclear"
/datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M)
@@ -281,14 +280,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/bilk
name = "Bilk"
- description = "This appears to be beer mixed with milk. Creative...?"
+ description = "This appears to be beer mixed with milk. Disgusting."
color = "#895C4C" // rgb: 137, 92, 76
nutriment_factor = 2 * REAGENTS_METABOLISM
boozepwr = 15
taste_description = "desperation and lactate"
glass_icon_state = "glass_brown"
glass_name = "glass of bilk"
- glass_desc = "A brew of milk and beer. You have to wonder if this was made by accident just from the smell."
+ glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(10))
@@ -298,14 +297,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/threemileisland
name = "Three Mile Island Iced Tea"
- description = "The extreme version of fruity cocktails."
+ description = "Made for a woman, strong enough for a man."
color = "#666340" // rgb: 102, 99, 64
boozepwr = 10
quality = DRINK_FANTASTIC
- taste_description = "sweet dryness"
+ taste_description = "dryness"
glass_icon_state = "threemileislandglass"
glass_name = "Three Mile Island Ice Tea"
- glass_desc = "A glass of Three Mile Island Ice Tea, named after a cordoned-off set of islands on Earth, for some reason. You almost can't taste the alcohol in it..."
+ glass_desc = "A glass of this is sure to prevent a meltdown."
/datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -313,75 +312,75 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/gin
name = "Gin"
- description = "A very sharp alcohol, with a flavor that's distinctly fresh."
+ description = "It's gin. In space. I say, good sir."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
- taste_description = "an alcoholic pine tree"
+ taste_description = "an alcoholic christmas tree"
glass_icon_state = "ginvodkaglass"
glass_name = "glass of gin"
- glass_desc = "A glass of gin, made with a specific type of berry that leaves it smelling like the tree it came from. It's enough to wet your eyes."
+ glass_desc = "A crystal clear glass of Griffeater gin."
/datum/reagent/consumable/ethanol/rum
name = "Rum"
- description = "The liquor of choice for sailors and spacers alike."
+ description = "Yohoho and all that."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 60
taste_description = "spiked butterscotch"
glass_icon_state = "rumglass"
glass_name = "glass of rum"
- glass_desc = "There's no need to worry about being seen as a pirate with one of these. If you add enough ice and let it melt, it'll turn into grog."
+ glass_desc = "Now you want to Pray for a pirate suit, don't you?"
shot_glass_icon_state = "shotglassbrown"
/datum/reagent/consumable/ethanol/tequila
name = "Tequila"
- description = "A strongly flavoured spirit."
+ description = "A strong and mildly flavoured, Mexican produced spirit. Feeling thirsty, hombre?"
color = "#FFFF91" // rgb: 255, 255, 145
boozepwr = 70
taste_description = "paint stripper"
glass_icon_state = "tequilaglass"
glass_name = "glass of tequila"
- glass_desc = "Despite the strong, woody taste, there's just enough sweetness to keep you coming for more."
+ glass_desc = "Now all that's missing is the weird colored shades!"
shot_glass_icon_state = "shotglassgold"
/datum/reagent/consumable/ethanol/vermouth
name = "Vermouth"
- description = "A fine wine to go with a meal."
+ description = "You suddenly feel a craving for a martini..."
color = "#91FF91" // rgb: 145, 255, 145
boozepwr = 45
taste_description = "dry alcohol"
glass_icon_state = "vermouthglass"
glass_name = "glass of vermouth"
- glass_desc = "Vermouth was used as a medicine in the past, and the flavor makes sure to remind you of that."
+ glass_desc = "You wonder why you're even drinking this straight."
shot_glass_icon_state = "shotglassclear"
/datum/reagent/consumable/ethanol/wine
name = "Wine"
- description = "An alcoholic beverage made from fermented grapes of all kinds."
+ description = "A premium alcoholic beverage made from distilled grape juice."
color = "#7E4043" // rgb: 126, 64, 67
boozepwr = 35
taste_description = "bitter sweetness"
glass_icon_state = "wineglass"
glass_name = "glass of wine"
- glass_desc = "Deeply red wine in a glass. You're not enough of a sommelier to really describe how it smells."
+ glass_desc = "A very classy looking drink."
shot_glass_icon_state = "shotglassred"
/datum/reagent/consumable/ethanol/lizardwine
- name = "Blueflame Pyrecask"
- description = "A popular Zohil beverage, made by infusing specially-gathered cacti and grapes in ethanol."
+ name = "Kalixcis Wine"
+ description = "A relatively popular Kalixcane beverage, made by infusing cacti in ethanol."
color = "#7E4043" // rgb: 126, 64, 67
boozepwr = 45
quality = DRINK_FANTASTIC
- taste_description = "warm sweetness"
+ taste_description = "scaley sweetness"
/datum/reagent/consumable/ethanol/grappa
name = "Grappa"
- description = "A fine brandy mixed with spirits."
+ description = "A fine Italian brandy, for when regular wine just isn't alcoholic enough for you."
color = "#F8EBF1"
boozepwr = 60
taste_description = "classy bitter sweetness"
glass_icon_state = "grappa"
glass_name = "glass of grappa"
- glass_desc = "Despite being made from the recycled remains of wine grapes, it's not bad at all."
+ glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking."
/datum/reagent/consumable/ethanol/amaretto
name = "Amaretto"
@@ -391,28 +390,28 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "fruity and nutty sweetness"
glass_icon_state = "amarettoglass"
glass_name = "glass of amaretto"
- glass_desc = "A sweet and syrupy looking alcohol. You're lucky it wasn't lost to history."
+ glass_desc = "A sweet and syrupy looking drink."
/datum/reagent/consumable/ethanol/cognac
name = "Cognac"
- description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing."
+ description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
color = "#AB3C05" // rgb: 171, 60, 5
boozepwr = 75
- taste_description = "sharp and relaxing"
+ taste_description = "angry and irish"
glass_icon_state = "cognacglass"
glass_name = "glass of cognac"
- glass_desc = "You wonder how many exhausted Solarian bureaucrats are drinking this the same way you are, right now."
+ glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this."
shot_glass_icon_state = "shotglassbrown"
/datum/reagent/consumable/ethanol/absinthe
name = "Absinthe"
- description = "A powerful alcoholic drink. Rumored to cause hallucinations if taken irresponsibly."
+ description = "A powerful alcoholic drink. Rumored to cause hallucinations but does not."
color = rgb(10, 206, 0)
boozepwr = 80 //Very strong even by default
taste_description = "death and licorice"
glass_icon_state = "absinthe"
glass_name = "glass of absinthe"
- glass_desc = "The smell is enough to bring you to the verge of tears. The hint of liquorice threatens to bring you over the edge."
+ glass_desc = "It's as strong as it smells."
shot_glass_icon_state = "shotglassgreen"
/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/M)
@@ -422,13 +421,13 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/hooch
name = "Hooch"
- description = "Low quality, low grade, and low expectations."
+ description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 100
taste_description = "pure resignation"
glass_icon_state = "glass_brown2"
glass_name = "Hooch"
- glass_desc = "You can't help but feel like you'd rather drink anything else right now, just from looking at it."
+ glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M)
if(M.mind && M.mind.assigned_role == "Assistant")
@@ -441,67 +440,67 @@ All effects don't start immediately, but rather get worse over time; the rate is
description = "A dark alcoholic beverage made with malted barley and yeast."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 65
- taste_description = "hearty alcoholic grains"
+ taste_description = "hearty barley ale"
glass_icon_state = "aleglass"
glass_name = "glass of ale"
- glass_desc = "A pint of ale. A classic for the working class."
+ glass_desc = "A freezing pint of delicious Ale."
/datum/reagent/consumable/ethanol/goldschlager
name = "Goldschlager"
- description = "100 proof cinnamon schnapps, made for the Student Unions' unbearable tastes."
+ description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
color = "#FFFF91" // rgb: 255, 255, 145
boozepwr = 25
quality = DRINK_VERYGOOD
taste_description = "burning cinnamon"
glass_icon_state = "goldschlagerglass"
glass_name = "glass of goldschlager"
- glass_desc = "Extremely high proof, with cinnamon to boot. At least the light catches the gold flakes nicely enough to distract you from the imminent sting."
+ glass_desc = "100% proof that teen girls will drink anything with gold in it."
shot_glass_icon_state = "shotglassgold"
/datum/reagent/consumable/ethanol/patron
name = "Patron"
- description = "Tequila with silver in it, often found in nightclubs."
+ description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
color = "#585840" // rgb: 88, 88, 64
boozepwr = 60
quality = DRINK_VERYGOOD
taste_description = "metallic and expensive"
glass_icon_state = "patronglass"
glass_name = "glass of patron"
- glass_desc = "A glass of Patron. The silver is for show, but you can't help but wonder how you would show it off to anyone."
+ glass_desc = "Drinking patron in the bar, with all the subpar ladies."
shot_glass_icon_state = "shotglassclear"
/datum/reagent/consumable/ethanol/gintonic
name = "Gin and Tonic"
- description = "A classic cocktail, with quinine for flavor."
+ description = "An all time classic, mild cocktail."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 25
quality = DRINK_NICE
taste_description = "mild and tart"
glass_icon_state = "gintonicglass"
glass_name = "Gin and Tonic"
- glass_desc = "A mild, venerable cocktail. You wonder if the quinine is doing anything for you."
+ glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
/datum/reagent/consumable/ethanol/rum_coke
name = "Rum and Coke"
description = "Rum, mixed with cola."
- taste_description = "cola and alcohol"
+ taste_description = "cola"
boozepwr = 40
quality = DRINK_NICE
color = "#6b2f01"
glass_icon_state = "whiskeycolaglass"
glass_name = "Rum and Coke"
- glass_desc = "The classic for mixing drinks on the fly."
+ glass_desc = "The classic go-to of space-fratboys."
/datum/reagent/consumable/ethanol/cuba_libre
- name = "Frontier Libre"
- description = "For a freer Frontier, everywhere!"
+ name = "Cuba Libre"
+ description = "Viva la Revolucion! Viva Cuba Libre!"
color = "#692e01"
boozepwr = 50
quality = DRINK_GOOD
taste_description = "a refreshing marriage of citrus and rum"
glass_icon_state = "cubalibreglass"
- glass_name = "Frontier Libre"
- glass_desc = "A mix of rum, cola, and lime. A favorite of among independent spacers and the Frontiersmen alike, who named it in the spirit of securing a free Frontier."
+ glass_name = "Cuba Libre"
+ glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!"
/datum/reagent/consumable/ethanol/whiskey_cola
name = "Whiskey Cola"
@@ -509,55 +508,55 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#602a00"
boozepwr = 70
quality = DRINK_NICE
- taste_description = "sweet soda and bitter alcohol"
+ taste_description = "cola"
glass_icon_state = "whiskeycolaglass"
glass_name = "whiskey cola"
- glass_desc = "An sweet-and-bitter mixture of cola and whiskey."
+ glass_desc = "An innocent-looking mixture of cola and whiskey. Delicious."
/datum/reagent/consumable/ethanol/martini
name = "Classic Martini"
- description = "Vermouth with gin."
+ description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
color = "#9e8c67"
boozepwr = 60
quality = DRINK_NICE
- taste_description = "dry"
+ taste_description = "dry class"
glass_icon_state = "martiniglass"
glass_name = "Classic Martini"
- glass_desc = "Rumored to be a favorite amongst the Evidenzkompanien, much to their chagrin."
+ glass_desc = "Damn, the bartender even stirred it, not shook it."
/datum/reagent/consumable/ethanol/vodkamartini
name = "Vodka Martini"
- description = "Vodka with gin."
+ description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 65
quality = DRINK_NICE
taste_description = "shaken, not stirred"
glass_icon_state = "martiniglass"
glass_name = "Vodka martini"
- glass_desc ="Rumored to be a favorite amongst the Verwaltungskompanien, to their entertainment."
+ glass_desc ="A bastardisation of the classic martini. Still great."
/datum/reagent/consumable/ethanol/white_russian
- name = "White Gezenan"
- description = "Cream and vodka."
+ name = "White Russian"
+ description = "That's just, like, your opinion, man..."
color = "#A68340" // rgb: 166, 131, 64
boozepwr = 50
quality = DRINK_GOOD
taste_description = "bitter cream"
glass_icon_state = "whiterussianglass"
- glass_name = "White Gezenan"
- glass_desc = "A mix of traditionally PGF-sourced vodka and cream derived from nut milk. You can still drink this if you're not from Gezena, though."
+ glass_name = "White Russian"
+ glass_desc = "A very nice looking drink. But that's just, like, your opinion, man."
/datum/reagent/consumable/ethanol/screwdrivercocktail
name = "Screwdriver"
- description = "Vodka mixed with orange juice."
+ description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
color = "#A68310" // rgb: 166, 131, 16
boozepwr = 55
quality = DRINK_NICE
taste_description = "oranges"
glass_icon_state = "screwdriverglass"
glass_name = "Screwdriver"
- glass_desc = "You won't be turning any screws with this, but you're far from lamenting that."
+ glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M)
var/static/list/increased_rad_loss = list("Station Engineer", "Atmospheric Technician", "Chief Engineer")
@@ -573,18 +572,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sweet 'n creamy"
glass_icon_state = "booger"
glass_name = "Booger"
- glass_desc = "The name isn't selling the drink very well, is it..."
+ glass_desc = "Ewww..."
/datum/reagent/consumable/ethanol/bloody_mary
name = "Bloody Mary"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice."
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 55
quality = DRINK_GOOD
taste_description = "tomatoes with a hint of lime"
glass_icon_state = "bloodymaryglass"
glass_name = "Bloody Mary"
- glass_desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. The taste is acquired, and usually acquired through tgrying to use it as a hangover remedy."
+ glass_desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. Tastes like liquid murder."
/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C)
if(C.blood_volume < BLOOD_VOLUME_NORMAL)
@@ -593,14 +592,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/brave_bull
name = "Brave Bull"
- description = "Liquid courage is as good as any courage!"
+ description = "It's just as effective as Dutch-Courage!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 60
quality = DRINK_NICE
taste_description = "alcoholic bravery"
glass_icon_state = "bravebullglass"
glass_name = "Brave Bull"
- glass_desc = "Tequila and coffee liqueur, brought together to give you the will to pick fights. Don't drink enough to ruin your sense of safety, though."
+ glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up."
var/tough_text
/datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/M)
@@ -616,14 +615,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/tequila_sunrise
name = "Tequila Sunrise"
- description = "Tequila, grenadine, and orange juice."
+ description = "Tequila, Grenadine, and Orange Juice."
color = "#FFE48C" // rgb: 255, 228, 140
boozepwr = 45
quality = DRINK_GOOD
taste_description = "oranges with a hint of pomegranate"
glass_icon_state = "tequilasunriseglass"
glass_name = "tequila Sunrise"
- glass_desc = "You feel a distinct sense of nostalgia - when's the last time you felt the sun on your face?"
+ glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
var/obj/effect/light_holder
/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/M)
@@ -644,14 +643,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/toxins_special
name = "Toxins Special"
- description = "It's a bit tasteless to name your drink after industrial accidents."
+ description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!"
color = "#780162"
boozepwr = 25
quality = DRINK_VERYGOOD
taste_description = "spicy toxins"
glass_icon_state = "toxinsspecialglass"
glass_name = "Toxins Special"
- glass_desc = "Traditionally lit with a welder while the server is blindfolded, but you don't want to cause an ACTUAL accident here."
+ glass_desc = "Whoah, this thing is on FIRE!"
shot_glass_icon_state = "toxinsspecialglass"
/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/M)
@@ -660,15 +659,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/beepsky_smash
name = "Beepsky Smash"
- description = "A drink for those who pick fights with automated security."
+ description = "Drink this and prepare for the LAW."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 60 //THE FIST OF THE LAW IS STRONG AND HARD
quality = DRINK_GOOD
metabolization_rate = 0.5
- taste_description = "electrified justice"
+ taste_description = "JUSTICE"
glass_icon_state = "beepskysmashglass"
glass_name = "Beepsky Smash"
- glass_desc = "Heavy, hot and strong. Just like the sting of a stunbaton."
+ glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
overdose_threshold = 40
var/datum/brain_trauma/special/beepsky/B
@@ -701,26 +700,26 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC)
/datum/reagent/consumable/ethanol/irish_cream
- name = "Zohil Cream"
- description = "Whiskey-imbued cream."
+ name = "Irish Cream"
+ description = "Whiskey-imbued cream, what else would you expect from the Irish?"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 50
quality = DRINK_NICE
taste_description = "creamy alcohol"
glass_icon_state = "irishcreamglass"
- glass_name = "Zohil Cream"
- glass_desc = "Cream mixed with whiskey. Don't expect to learn anything about the Blueflame from just a drink, though."
+ glass_name = "Irish Cream"
+ glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
/datum/reagent/consumable/ethanol/manly_dorf
- name = "The Shortstop"
- description = "Beer and ale, brought together in a very grain-flavored mix."
+ name = "The Manly Dorf"
+ description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 100 //For the manly only
quality = DRINK_NICE
- taste_description = "fire in your chest and windburn on your chin"
+ taste_description = "hair on your chest and your chin"
glass_icon_state = "manlydorfglass"
- glass_name = "The Shortstop"
- glass_desc = "A concoction made from ale and beer. Named after a joke that only short people would order this to prove a point."
+ glass_name = "The Manly Dorf"
+ glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only."
var/dorf_mode
/datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/carbon/human/badlands_chugs)
@@ -743,14 +742,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/longislandicedtea
name = "Long Island Iced Tea"
- description = "The entire liquor cabinet brought together with enough sugar to hide it."
+ description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "a mixture of cola and alcohol"
glass_icon_state = "longislandicedteaglass"
glass_name = "Long Island Iced Tea"
- glass_desc = "The entire liquor cabinet brought together with enough sugar to hide it."
+ glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
/datum/reagent/consumable/ethanol/moonshine
@@ -764,86 +763,103 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
/datum/reagent/consumable/ethanol/b52
- name = "AM-G"
- description = "Coffee liquor, Zohil Cream, and cognac."
+ name = "B-52"
+ description = "Coffee, Irish Cream, and cognac. You will get bombed."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 85
quality = DRINK_GOOD
- taste_description = "angry and intense"
+ taste_description = "angry and irish"
glass_icon_state = "b52glass"
- glass_name = "AM-G"
- glass_desc = "Coffee liquor, Zohil Cream, and cognac. Enough to make you hide before the blast."
+ glass_name = "B-52"
+ glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed."
shot_glass_icon_state = "b52glass"
/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M)
playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE)
/datum/reagent/consumable/ethanol/irishcoffee
- name = "Gezenan Coffee"
- description = "Coffee, and alcohol. Traditionally enjoyed in the morning on lazy days."
+ name = "Irish Coffee"
+ description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_NICE
taste_description = "giving up on the day"
glass_icon_state = "irishcoffeeglass"
- glass_name = "Gezenan Coffee"
- glass_desc = "Coffee and alcohol. Traditionally enjoyed in the morning on lazy days."
+ glass_name = "Irish Coffee"
+ glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
/datum/reagent/consumable/ethanol/margarita
name = "Margarita"
- description = "A fruity, tropical drink with a salted rim around the glass."
+ description = "On the rocks with salt on the rim. Arriba~!"
color = "#8CFF8C" // rgb: 140, 255, 140
boozepwr = 35
quality = DRINK_NICE
taste_description = "dry and salty"
glass_icon_state = "margaritaglass"
glass_name = "Margarita"
- glass_desc = "On the rocks with salt on the rim. Apparently the name meant something in a language long lost on Earth."
+ glass_desc = "On the rocks with salt on the rim. Arriba~!"
/datum/reagent/consumable/ethanol/black_russian
- name = "Black Rachnid"
- description = "An alternative take to the White Gezenan. Doubles as an option for those who can't handle lactose."
+ name = "Black Russian"
+ description = "For the lactose-intolerant. Still as classy as a White Russian."
color = "#360000" // rgb: 54, 0, 0
boozepwr = 70
quality = DRINK_NICE
taste_description = "bitterness"
glass_icon_state = "blackrussianglass"
- glass_name = "Black Rachnid"
- glass_desc = "An alternative take to the White Gezenan. Doubles as an option for those who can't handle lactose."
+ glass_name = "Black Russian"
+ glass_desc = "For the lactose-intolerant. Still as classy as a White Russian."
/datum/reagent/consumable/ethanol/manhattan
- name = "Twelve Crossings"
- description = "A mixed drink popularized by a murder mystery book series from Teceti."
+ name = "Manhattan"
+ description = "The Detective's undercover drink of choice. He never could stomach gin..."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 30
quality = DRINK_NICE
taste_description = "mild dryness"
glass_icon_state = "manhattanglass"
- glass_name = "Twelve Crossings"
- glass_desc = "A mixed drink popularized by a murder mystery book series from Teceti. The Detective's undercover drink of choice. He never could stomach gin..."
+ glass_name = "Manhattan"
+ glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..."
+
+
+/datum/reagent/consumable/ethanol/manhattan_proj
+ name = "Manhattan Project"
+ description = "A scientist's drink of choice, for pondering ways to blow up the sector."
+ color = "#664300" // rgb: 102, 67, 0
+ boozepwr = 45
+ quality = DRINK_VERYGOOD
+ taste_description = "death, the destroyer of worlds"
+ glass_icon_state = "proj_manhattanglass"
+ glass_name = "Manhattan Project"
+ glass_desc = "A scientist's drink of choice, for thinking how to blow up the sector."
+
+
+/datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/M)
+ M.set_drugginess(30)
+ return ..()
/datum/reagent/consumable/ethanol/whiskeysoda
name = "Whiskey Soda"
- description = "Whiskey and soda water, a simple mixed drink."
+ description = "For the more refined griffon."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 70
quality = DRINK_NICE
taste_description = "soda"
glass_icon_state = "whiskeysodaglass2"
glass_name = "whiskey soda"
- glass_desc = "Bitter and refreshing."
+ glass_desc = "Ultimate refreshment."
/datum/reagent/consumable/ethanol/antifreeze
name = "Anti-freeze"
- description = "The ultimate refreshment. Not actually made of antifreeze!"
+ description = "The ultimate refreshment. Not what it sounds like."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_NICE
- taste_description = "frigid heat"
+ taste_description = "Jack Frost's piss"
glass_icon_state = "antifreeze"
glass_name = "Anti-freeze"
- glass_desc = "Vodka, cream, and ice. No actual antifreeze included, of course."
+ glass_desc = "The ultimate refreshment."
/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal() + 20) //310.15 is the normal bodytemp.
@@ -851,14 +867,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/barefoot
name = "Barefoot"
- description = "To be enjoyed on the beach or by a pool. You should keep your shoes on, though."
+ description = "Barefoot and pregnant."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
quality = DRINK_VERYGOOD
taste_description = "creamy berries"
glass_icon_state = "b&p"
glass_name = "Barefoot"
- glass_desc = "To be enjoyed on the beach or by a pool. You should keep your shoes on, though."
+ glass_desc = "Barefoot and pregnant."
/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M)
if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes.
@@ -877,40 +893,40 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "refreshing cold"
glass_icon_state = "snowwhite"
glass_name = "Snow White"
- glass_desc = "A cold refreshment of beer and lemon-lime soda. Not exactly princess material, is it?"
+ glass_desc = "A cold refreshment."
/datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon.
name = "Demon's Blood"
- description = "A mix of two sodas, rum, and... real blood."
+ description = "AHHHH!!!!"
color = "#820000" // rgb: 130, 0, 0
boozepwr = 75
quality = DRINK_VERYGOOD
taste_description = "sweet tasting iron"
glass_icon_state = "demonsblood"
- glass_name = "Demon's Blood"
- glass_desc = "A drink made with the blood of the server or the patron, which usually results in said patron being thrown out. While most substitute real blood for a saline solution, that drink is actually referred to as 'Demon's Sweat'."
+ glass_name = "Demons Blood"
+ glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up."
/datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it.
name = "Devil's Kiss"
- description = "Asking for a kiss to go with the blood drawing is pushing it."
+ description = "Creepy time!"
color = "#A68310" // rgb: 166, 131, 16
boozepwr = 70
quality = DRINK_VERYGOOD
taste_description = "bitter iron"
glass_icon_state = "devilskiss"
- glass_name = "Devil's Kiss"
- glass_desc = "The boozier cousin of the Demon's Blood. Typically served in a glass shaped to specifically cut and draw blood from the patron's lip... which deters most."
+ glass_name = "Devils Kiss"
+ glass_desc = "Creepy time!"
/datum/reagent/consumable/ethanol/vodkatonic
name = "Vodka and Tonic"
- description = "The stronger sibling of the Gin and Tonic."
+ description = "For when a gin and tonic isn't Russian enough."
color = "#0064C8" // rgb: 0, 100, 200
boozepwr = 70
quality = DRINK_NICE
taste_description = "tart bitterness"
glass_icon_state = "vodkatonicglass"
- glass_name = "Vodka and Tonic"
- glass_desc = "The stronger sibling of the Gin and Tonic."
+ glass_name = "vodka and tonic"
+ glass_desc = "For when a gin and tonic isn't Russian enough."
/datum/reagent/consumable/ethanol/ginfizz
@@ -927,55 +943,55 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/bahama_mama
name = "Bahama Mama"
- description = "A tropical cocktail with a complex blend of fruity flavors."
+ description = "A tropical cocktail with a complex blend of flavors."
color = "#FF7F3B" // rgb: 255, 127, 59
boozepwr = 35
quality = DRINK_GOOD
taste_description = "pineapple, coconut, and a hint of coffee"
glass_icon_state = "bahama_mama"
glass_name = "Bahama Mama"
- glass_desc = "A tropical cocktail with a complex blend of fruity flavors. It makes you think about going on vacation someday..."
+ glass_desc = "A tropical cocktail with a complex blend of flavors."
/datum/reagent/consumable/ethanol/singulo
name = "Singulo"
- description = "Named after a tragic industrial accident!"
+ description = "A blue-space beverage!"
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "concentrated matter"
glass_icon_state = "singulo"
glass_name = "Singulo"
- glass_desc = "Named after a tragic industrial accident involving a singularity escaping containment. This drink doesn't taste particularly commemorative - it's too enjoyable!"
+ glass_desc = "A blue-space beverage."
/datum/reagent/consumable/ethanol/sbiten
name = "Sbiten"
- description = "Vodka with capsaicin for the extra feeling of intense warmth."
+ description = "A spicy Vodka! Might be a little hot for the little guys!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 70
quality = DRINK_GOOD
taste_description = "hot and spice"
glass_icon_state = "sbitenglass"
glass_name = "Sbiten"
- glass_desc = "Vodka with capsaicin for the extra feeling of intense warmth. Difficult to take large swallows."
+ glass_desc = "A spicy mix of Vodka and Spice. Very hot."
/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(50 * TEMPERATURE_DAMAGE_COEFFICIENT, 0 , M.dna.species.bodytemp_heat_damage_limit) //310.15 is the normal bodytemp.
return ..()
/datum/reagent/consumable/ethanol/red_mead
- name = "Drop-pod"
- description = "A commemorative drink, made in the name of those who died during failed orbital drop-pod landings."
+ name = "Red Mead"
+ description = "The true Viking drink! Even though it has a strange red color."
color = "#C73C00" // rgb: 199, 60, 0
boozepwr = 31 //Red drinks are stronger
quality = DRINK_GOOD
taste_description = "sweet and salty alcohol"
glass_icon_state = "red_meadglass"
- glass_name = "Drop-pod"
- glass_desc = "A commemorative drink, made in the name of those who died during failed orbital drop-pod landings. Technically intended to use the blood of your enemies, but..."
+ glass_name = "Red Mead"
+ glass_desc = "A true Viking's beverage, made with the blood of their enemies."
/datum/reagent/consumable/ethanol/mead
name = "Mead"
- description = "Fermented honey. The gentler sibling to the beer."
+ description = "A Viking drink, though a cheap one."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 30
@@ -983,17 +999,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sweet, sweet alcohol"
glass_icon_state = "meadglass"
glass_name = "Mead"
- glass_desc = "Fermented honey. The gentler sibling to the beer - and almost just as old."
+ glass_desc = "A drink from Valhalla."
/datum/reagent/consumable/ethanol/iced_beer
- name = "Iced beer"
- description = "Iced beer, served in a chilled glass."
+ name = "Iced Beer"
+ description = "A beer which is so cold the air around it freezes."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 15
taste_description = "refreshingly cold"
glass_icon_state = "iced_beerglass"
glass_name = "iced beer"
- glass_desc = "Iced beer, served in a chilled glass. It's cold enough to leave a trail in the air."
+ glass_desc = "A beer so frosty, the air around it freezes."
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) //310.15 is the normal bodytemp.
@@ -1001,25 +1017,25 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/grog
name = "Grog"
- description = "Watered-down rum, to really stretch out your alcohol rations. A Belter classic."
+ description = "Watered-down rum, Nanotrasen approves!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1 //Basically nothing
taste_description = "a poor excuse for alcohol"
glass_icon_state = "grogglass"
glass_name = "Grog"
- glass_desc = "Watered-down rum, to really stretch out your alcohol rations. A Belter classic."
+ glass_desc = "A fine and cepa drink for Space."
/datum/reagent/consumable/ethanol/aloe
name = "Aloe"
- description = "Zohil Cream and watermelon juice. Mellows out the alcoholic bite for a mild drink."
+ description = "So very, very, very good."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "sweet 'n creamy"
glass_icon_state = "aloe"
glass_name = "Aloe"
- glass_desc = "Zohil Cream and watermelon juice. Mellows out the alcoholic bite for a mild drink."
+ glass_desc = "Very, very, very good."
/datum/reagent/consumable/ethanol/andalusia
name = "Andalusia"
@@ -1030,51 +1046,51 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "lemons"
glass_icon_state = "andalusia"
glass_name = "Andalusia"
- glass_desc = "A nice, strangely named drink. Theoretically named after a particular region on Terra, but no one's quite sure where."
+ glass_desc = "A nice, strangely named drink."
/datum/reagent/consumable/ethanol/alliescocktail
- name = "Canton Cocktail"
- description = "A drink intended to be shared across the Solarian cantons."
+ name = "Allies Cocktail"
+ description = "A drink made from your allies. Not as sweet as those made from your enemies."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
quality = DRINK_NICE
taste_description = "bitter yet free"
glass_icon_state = "alliescocktail"
- glass_name = "Canton cocktail"
- glass_desc = "A drink intended to be shared across the Solarian cantons."
+ glass_name = "Allies cocktail"
+ glass_desc = "A drink made from your allies."
/datum/reagent/consumable/ethanol/acid_spit
- name = "Cracked Moon"
- description = "Typically made on a dare by CLIP-BARD crews. It's deadly if incorrectly prepared!"
+ name = "Acid Spit"
+ description = "A drink for the daring, can be deadly if incorrectly prepared!"
color = "#365000" // rgb: 54, 80, 0
boozepwr = 70
quality = DRINK_VERYGOOD
- taste_description = "alien stomach acid"
+ taste_description = "stomach acid"
glass_icon_state = "acidspitglass"
- glass_name = "Cracked Moon"
- glass_desc = "Typically made on a dare by CLIP-BARD crews. It's deadly if incorrectly prepared!"
+ glass_name = "Acid Spit"
+ glass_desc = "A drink from Nanotrasen. Made from live aliens."
/datum/reagent/consumable/ethanol/amasec
- name = "Ren Kirsi"
- description = "A Teceian drink mainly enjoyed on The Ring and it's sibling colonies."
+ name = "Amasec"
+ description = "Official drink of the Nanotrasen Gun-Club!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 35
quality = DRINK_GOOD
taste_description = "dark and metallic"
glass_icon_state = "amasecglass"
- glass_name = "Ren Kirsi"
- glass_desc = "There's no way you're getting your hands on metal shavings from The Ring itself, but it's the thought that counts."
+ glass_name = "Amasec"
+ glass_desc = "Always handy before COMBAT!!!"
/datum/reagent/consumable/ethanol/changelingsting
name = "Changeling Sting"
- description = "Made by the superstitous. Keeps the changelings away... whereever they may be."
+ description = "You take a tiny sip and feel a burning sensation..."
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 50
quality = DRINK_GOOD
taste_description = "your brain coming out your nose"
glass_icon_state = "changelingsting"
glass_name = "Changeling Sting"
- glass_desc = "Made by the superstitous. Keeps the changelings away... whereever they may be."
+ glass_desc = "A stingy drink."
/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/M)
if(M.mind) //Changeling Sting assists in the recharging of changeling chemicals.
@@ -1085,26 +1101,26 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/irishcarbomb
- name = "Lightspeed"
- description = "A shot of Zohil cream in a pinch of ale, meant to be downed in one chug - hits you as fast as the name."
+ name = "Irish Car Bomb"
+ description = "Mmm, tastes like the free Irish state."
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 25
quality = DRINK_GOOD
- taste_description = "the rush of hyperspace"
+ taste_description = "the spirit of Ireland"
glass_icon_state = "irishcarbomb"
- glass_name = "Lightspeed"
- glass_desc = "A shot of Zohil cream in a pinch of ale, meant to be downed in one chug - hits you as fast as the name."
+ glass_name = "Irish Car Bomb"
+ glass_desc = "An Irish car bomb."
/datum/reagent/consumable/ethanol/syndicatebomb
- name = "Gorlex Surprise"
- description = "Infamously named after the accusations of Syndicate-led bombings of space installations. It's a blast!"
+ name = "Syndicate Bomb"
+ description = "Tastes like terrorism!"
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 90
quality = DRINK_GOOD
- taste_description = "anti-Nanotrasen sentiments"
+ taste_description = "purified antagonism"
glass_icon_state = "syndicatebomb"
- glass_name = "Gorlex Surprise"
- glass_desc = "Infamously named after the accusations of Syndicate-led bombings of space installations. It's a blast!"
+ glass_name = "Syndicate Bomb"
+ glass_desc = "A syndicate bomb."
/datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/M)
if(prob(5))
@@ -1112,50 +1128,50 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/hiveminderaser
- name = "Hivemind"
+ name = "Hivemind Eraser"
description = "A vessel of pure flavor."
color = "#FF80FC" // rgb: 255, 128, 252
boozepwr = 40
quality = DRINK_GOOD
taste_description = "psychic links"
glass_icon_state = "hiveminderaser"
- glass_name = "Hivemind"
- glass_desc = "A legend around this drink states that drinking this at the same time as someone else links your mind with theirs. Are you going to find out?"
+ glass_name = "Hivemind Eraser"
+ glass_desc = "For when even mindshields can't save you."
/datum/reagent/consumable/ethanol/erikasurprise
- name = "Terraformer Surprise"
- description = "It's as green as the first terraforming experiments, allegedly."
+ name = "Erika Surprise"
+ description = "The surprise is, it's green!"
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "tartness and bananas"
glass_icon_state = "erikasurprise"
- glass_name = "Terraformer Surprise"
- glass_desc = "It's as green as the first terraforming experiments, allegedly."
+ glass_name = "Erika Surprise"
+ glass_desc = "The surprise is, it's green!"
/datum/reagent/consumable/ethanol/driestmartini
- name = "Saltflat"
- description = "Nigh-dehydratingly dry. Intended to be a challenge."
+ name = "Driest Martini"
+ description = "Only for the experienced. You think you see sand floating in the glass."
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 65
quality = DRINK_GOOD
taste_description = "a beach"
glass_icon_state = "driestmartiniglass"
- glass_name = "Saltflat"
- glass_desc = "Nigh-dehydratingly dry. Intended to be a challenge."
+ glass_name = "Driest Martini"
+ glass_desc = "Only for the experienced. You think you see sand floating in the glass."
/datum/reagent/consumable/ethanol/bananahonk
- name = "Creamtruck"
- description = "A distinctly non-kid friendly equivalent to the ice cream truck."
+ name = "Banana Honk"
+ description = "A drink from Clown Heaven."
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#FFFF91" // rgb: 255, 255, 140
boozepwr = 60
quality = DRINK_GOOD
- taste_description = "bananas and cream"
+ taste_description = "a bad joke"
glass_icon_state = "bananahonkglass"
- glass_name = "Creamtruck"
- glass_desc = "A distinctly non-kid friendly equivalent to the ice cream truck."
+ glass_name = "Banana Honk"
+ glass_desc = "A drink from Clown Heaven."
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M)
if((ishuman(M) && M.job == "Clown") || ismonkey(M))
@@ -1164,16 +1180,16 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..() || .
/datum/reagent/consumable/ethanol/silencer
- name = "Choker"
- description = "It takes a moment of quiet to really appreciate some drinks - this one doesn't give you the illusion of choice."
+ name = "Silencer"
+ description = "A drink from Mime Heaven."
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#664300" // rgb: 102, 67, 0
- boozepwr = 59
+ boozepwr = 59 //Proof that clowns are better than mimes right here
quality = DRINK_GOOD
- taste_description = "peace and quiet"
+ taste_description = "a pencil eraser"
glass_icon_state = "silencerglass"
- glass_name = "Choker"
- glass_desc = "It takes a moment of quiet to really appreciate some drinks - this one doesn't give you the illusion of choice."
+ glass_name = "Silencer"
+ glass_desc = "A drink from Mime Heaven."
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M)
if(ishuman(M) && M.mind?.miming)
@@ -1184,18 +1200,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/drunkenblumpkin
name = "Drunken Blumpkin"
- description = "A weird mix of whiskey and... chlorine-pumpkin juice?"
+ description = "A weird mix of whiskey and blumpkin juice."
color = "#1EA0FF" // rgb: 102, 67, 0
boozepwr = 50
quality = DRINK_VERYGOOD
taste_description = "molasses and a mouthful of pool water"
glass_icon_state = "drunkenblumpkin"
glass_name = "Drunken Blumpkin"
- glass_desc = "A drink for the confused hydropon worker."
+ glass_desc = "A drink for the drunks."
/datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour.
name = "Whiskey Sour"
- description = "A mix of lemon juice, whiskey, and sugar."
+ description = "Lemon juice/whiskey/sugar mixture. Moderate alcohol content."
color = rgb(255, 201, 49)
boozepwr = 35
quality = DRINK_GOOD
@@ -1206,16 +1222,35 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/hcider
name = "Hard Cider"
- description = "The alcoholic sibling to apple cider."
+ description = "Apple juice, for adults."
color = "#CD6839"
nutriment_factor = 1 * REAGENTS_METABOLISM
boozepwr = 25
taste_description = "the season that falls between summer and winter"
glass_icon_state = "whiskeyglass"
glass_name = "hard cider"
- glass_desc = "Sharper tasting, alcoholic apple cider."
+ glass_desc = "Tastes like autumn... no wait, fall!"
shot_glass_icon_state = "shotglassbrown"
+
+/datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber!
+ name = "Fetching Fizz"
+ description = "Whiskey sour/iron/uranium mixture resulting in a highly magnetic slurry. Mild alcohol content." //Requires no alcohol to make but has alcohol anyway because ~magic~
+ color = rgb(255, 91, 15)
+ boozepwr = 10
+ quality = DRINK_VERYGOOD
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM
+ taste_description = "charged metal" // the same as teslium, honk honk.
+ glass_icon_state = "fetching_fizz"
+ glass_name = "Fetching Fizz"
+ glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste."
+
+
+/datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M)
+ for(var/obj/item/stack/ore/O in orange(3, M))
+ step_towards(O, get_turf(M))
+ return ..()
+
//Another reference. Heals those in critical condition extremely quickly.
/datum/reagent/consumable/ethanol/hearty_punch
name = "Hearty Punch"
@@ -1227,7 +1262,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "bravado in the face of disaster"
glass_icon_state = "hearty_punch"
glass_name = "Hearty Punch"
- glass_desc = "An aromatic beverage, served piping hot. According to folktales, it can almost wake the dead."
+ glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead."
/datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/M)
if(M.health <= 0)
@@ -1260,7 +1295,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "da bomb"
glass_icon_state = "atomicbombglass"
glass_name = "Atomic Bomb"
- glass_desc = "Devastating to you and everyone around you, especially if you get drunk enough from it."
+ glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M)
M.set_drugginess(50)
@@ -1318,7 +1353,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
metabolization_rate = 1 * REAGENTS_METABOLISM
glass_icon_state = "neurotoxinglass"
glass_name = "Neurotoxin"
- glass_desc = "The story goes that this drink was made on a bet between Cybersun chemists, debating if a drink could be used to put down a suspected Nanotrasen spy. While morphine wasn't supposed to be used, it put them down all the same."
+ glass_desc = "A drink that is guaranteed to knock you silly."
/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt()
return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG))
@@ -1330,7 +1365,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(prob(20))
M.adjustStaminaLoss(10)
M.drop_all_held_items()
- to_chat(M, "You can't feel your hands!")
+ to_chat(M, "You cant feel your hands!")
if(current_cycle > 5)
if(prob(20))
var/t = pickt()
@@ -1355,17 +1390,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/hippies_delight
- name = "Between the Mandibles"
- description = "Mushroom-supplied hallucinogens and strong alcohol."
+ name = "Hippie's Delight"
+ description = "You just don't get it maaaan."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 0
boozepwr = 0 //custom drunk effect
quality = DRINK_FANTASTIC
metabolization_rate = 0.2 * REAGENTS_METABOLISM
- taste_description = "two finger-sized bites on your tongue"
+ taste_description = "giving peace a chance"
glass_icon_state = "hippiesdelightglass"
- glass_name = "Between the Mandibles"
- glass_desc = "Named after a request from a clueless spacer who asked for Rachnid venom to be mixed in a house special. While Rachnids don't have venom glands, this'll have you reeling all the same."
+ glass_name = "Hippie's Delight"
+ glass_desc = "A drink enjoyed by people during the 1960's."
/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M)
if (!M.slurring)
@@ -1401,7 +1436,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/eggnog
name = "Eggnog"
- description = "For enjoying the Winter Solstice."
+ description = "For enjoying the most wonderful time of the year."
color = "#fcfdc6" // rgb: 252, 253, 198
nutriment_factor = 2 * REAGENTS_METABOLISM
boozepwr = 1
@@ -1409,17 +1444,34 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "custard and alcohol"
glass_icon_state = "glass_yellow"
glass_name = "eggnog"
- glass_desc = "For enjoying the Winter Solstice."
+ glass_desc = "For enjoying the most wonderful time of the year."
+
+
+/datum/reagent/consumable/ethanol/narsour
+ name = "Nar'Sour"
+ description = "Side effects include self-mutilation and hoarding plasteel."
+ color = RUNE_COLOR_DARKRED
+ boozepwr = 10
+ quality = DRINK_FANTASTIC
+ taste_description = "bloody"
+ glass_icon_state = "narsour"
+ glass_name = "Nar'Sour"
+ glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!"
+
+/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/M)
+ M.cultslurring = min(M.cultslurring + 3, 3)
+ M.stuttering = min(M.stuttering + 3, 3)
+ ..()
/datum/reagent/consumable/ethanol/triple_sec
name = "Triple Sec"
description = "A sweet and vibrant orange liqueur."
color = "#ffcc66"
boozepwr = 30
- taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of distant shores"
+ taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of the caribbean"
glass_icon_state = "glass_orange"
glass_name = "Triple Sec"
- glass_desc = "A glass of straight triple sec. Citrusy and warm."
+ glass_desc = "A glass of straight Triple Sec."
/datum/reagent/consumable/ethanol/creme_de_menthe
name = "Creme de Menthe"
@@ -1429,17 +1481,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a minty, cool, and invigorating splash of cold streamwater"
glass_icon_state = "glass_green"
glass_name = "Creme de Menthe"
- glass_desc = "Bright green and minty - enough to tell you what it's going to taste like."
+ glass_desc = "You can almost feel the first breath of spring just looking at it."
/datum/reagent/consumable/ethanol/creme_de_cacao
name = "Creme de Cacao"
- description = "A chocolatey liqueur excellent for adding dessert notes to beverages."
+ description = "A chocolatey liqueur excellent for adding dessert notes to beverages and bribing sororities."
color = "#996633"
boozepwr = 20
taste_description = "a slick and aromatic hint of chocolates swirling in a bite of alcohol"
glass_icon_state = "glass_brown"
glass_name = "Creme de Cacao"
- glass_desc = "Creme de Cacao - chocolate-wine, essentially. Not milk chocolate, so expect some bite."
+ glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient."
/datum/reagent/consumable/ethanol/creme_de_coconut
name = "Creme de Coconut"
@@ -1449,7 +1501,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a sweet milky flavor with notes of toasted sugar"
glass_icon_state = "glass_white"
glass_name = "Creme de Coconut"
- glass_desc = "A white glass of coconut liqueur."
+ glass_desc = "An unintimidating glass of coconut liqueur."
/datum/reagent/consumable/ethanol/quadruple_sec
name = "Quadruple Sec"
@@ -1457,10 +1509,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#cc0000"
boozepwr = 35
quality = DRINK_GOOD
- taste_description = "an invigorating bitter freshness which suffuses your being; you can take on anyone who messes with your vessel"
+ taste_description = "an invigorating bitter freshness which suffuses your being; no enemy of the corporation will go unrobusted this day"
glass_icon_state = "quadruple_sec"
glass_name = "Quadruple Sec"
- glass_desc = "A glass of Quadruple Sec. Popularized for being a mixed drink of choice across multiple independent security agencies, and notably among Nanotrasen's internal security culture. It's not recommended to drink while manning a vessel, though!"
+ glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though."
/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M)
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes
@@ -1472,14 +1524,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/quintuple_sec
name = "Quintuple Sec"
- description = "Law, order and alcohol distilled into one single elixir."
+ description = "Law, Order, Alcohol, and Police Brutality distilled into one single elixir of JUSTICE."
color = "#ff3300"
boozepwr = 55
quality = DRINK_FANTASTIC
- taste_description = "drinking on duty"
+ taste_description = "THE LAW"
glass_icon_state = "quintuple_sec"
glass_name = "Quintuple Sec"
- glass_desc = "The logical endpoint of the Quadruple Sec. Often had in the hands of senior security staff, though you really should not be drinking this while on-duty."
+ glass_desc = "Now you are become law, destroyer of clowns."
/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M)
//Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG..
@@ -1494,14 +1546,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/grasshopper
name = "Grasshopper"
- description = "A fresh and sweet dessert shooter."
+ description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this."
color = "#00ff00"
boozepwr = 25
quality = DRINK_GOOD
taste_description = "chocolate and mint dancing around your mouth"
glass_icon_state = "grasshopper"
glass_name = "Grasshopper"
- glass_desc = "Named after a particularly green insect. Theoretically, there's always adding vodka to this and making it a Flying Grasshopper..."
+ glass_desc = "You weren't aware edible beverages could be that green."
/datum/reagent/consumable/ethanol/stinger
name = "Stinger"
@@ -1512,7 +1564,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a slap on the face in the best possible way"
glass_icon_state = "stinger"
glass_name = "Stinger"
- glass_desc = "A brandy-and-menthe mixed drink to end the day with. While often found in the hands of the upper class, there's nothing wrong with feeling a little fancy."
+ glass_desc = "You wonder what would happen if you pointed this at a heat source..."
/datum/reagent/consumable/ethanol/bastion_bourbon
name = "Bastion Bourbon"
@@ -1612,13 +1664,13 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/sake
name = "Sake"
- description = "A sweet rice wine."
+ description = "A sweet rice wine of questionable legality and extreme potency."
color = "#DDDDDD"
boozepwr = 70
taste_description = "sweet rice wine"
glass_icon_state = "sakecup"
glass_name = "cup of sake"
- glass_desc = "A cup of sake. Capable of being served hot, cold, or at room temperature, and served in a traditionally-sized little cup."
+ glass_desc = "A traditional cup of sake."
/datum/reagent/consumable/ethanol/peppermint_patty
name = "Peppermint Patty"
@@ -1629,7 +1681,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
quality = DRINK_GOOD
glass_icon_state = "peppermint_patty"
glass_name = "Peppermint Patty"
- glass_desc = "A boozy, minty hot cocoa that warms your belly on a cold night."
+ glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night."
/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M)
M.apply_status_effect(/datum/status_effect/throat_soothed)
@@ -1637,15 +1689,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/alexander
- name = "Ash-Shield"
- description = "While not a traditional trickwine by any means, this mix is said to embolden a user's shield under certain circumstance."
+ name = "Alexander"
+ description = "Named after a Greek hero, this mix is said to embolden a user's shield as if they were in a phalanx."
color = "#F5E9D3"
boozepwr = 50
quality = DRINK_GOOD
taste_description = "bitter, creamy cacao"
glass_icon_state = "alexander"
- glass_name = "Ash-Shield"
- glass_desc = "While not a traditional trickwine by any means (and considered in poor taste in mixing), this drink is said to embolden the shield in the imbiber's hand. Just don't let it engender passivity."
+ glass_name = "Alexander"
+ glass_desc = "A creamy, indulgent delight that is stronger than it seems."
var/obj/item/shield/mighty_shield
/datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/L)
@@ -1669,37 +1721,37 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/amaretto_alexander
- name = "Happy Huntsman"
- description = "A cousin of the Ash-Shield, what it lacks in strength (and mysterious power), it makes up for in flavor."
+ name = "Amaretto Alexander"
+ description = "A weaker version of the Alexander, what it lacks in strength it makes up for in flavor."
color = "#DBD5AE"
boozepwr = 35
quality = DRINK_VERYGOOD
taste_description = "sweet, creamy cacao"
glass_icon_state = "alexanderam"
- glass_name = "Happy Huntsman"
- glass_desc = "A gentle, creamy drink, enjoyed on rare occasions by the Saint Roumain's followers."
+ glass_name = "Amaretto Alexander"
+ glass_desc = "A creamy, indulgent delight that is in fact as gentle as it seems."
/datum/reagent/consumable/ethanol/sidecar
- name = "Bridge Bunny"
- description = "You're happy to not pilot the ship after having one of these."
+ name = "Sidecar"
+ description = "The one ride you'll gladly give up the wheel for."
color = "#FFC55B"
boozepwr = 45
quality = DRINK_GOOD
taste_description = "delicious freedom"
glass_icon_state = "sidecar"
- glass_name = "Bridge Bunny"
- glass_desc = "You're happy to not pilot the ship after having one of these."
+ glass_name = "Sidecar"
+ glass_desc = "The one ride you'll gladly give up the wheel for."
/datum/reagent/consumable/ethanol/between_the_sheets
name = "Between the Sheets"
- description = "A provocatively named classic."
+ description = "A provocatively named classic. Funny enough, doctors recommend drinking it before taking a nap."
color = "#F4C35A"
boozepwr = 55
quality = DRINK_GOOD
- taste_description = "rum, lemons, and mild embarrassment"
+ taste_description = "seduction"
glass_icon_state = "between_the_sheets"
glass_name = "Between the Sheets"
- glass_desc = "Also known as The Maiden's Prayer, if you're not willing to say the original name aloud."
+ glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy."
/datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L)
..()
@@ -1715,15 +1767,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
L.adjustFireLoss(-0.2)
/datum/reagent/consumable/ethanol/kamikaze
- name = "Mothball"
- description = "Vodka, triple sec, and lime juice. Moth dust not usually included."
+ name = "Kamikaze"
+ description = "Divinely windy."
color = "#EEF191"
boozepwr = 60
quality = DRINK_GOOD
- taste_description = "fluttery sour-sweetness"
+ taste_description = "divine windiness"
glass_icon_state = "kamikaze"
- glass_name = "Mothball"
- glass_desc = "Made in an attempt to commemorate the supposed original place mothpeople were created in, though it was since disproven. While moth dust could be used as a garnish, don't go asking for it unless you are one."
+ glass_name = "Kamikaze"
+ glass_desc = "Divinely windy."
/datum/reagent/consumable/ethanol/mojito
name = "Mojito"
@@ -1737,15 +1789,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A drink that looks as refreshing as it tastes."
/datum/reagent/consumable/ethanol/moscow_mule
- name = "Gorlex Gator"
- description = "A chilly drink made in remembrance of Gorlex IV."
+ name = "Moscow Mule"
+ description = "A chilly drink that reminds you of the Derelict."
color = "#EEF1AA"
boozepwr = 30
quality = DRINK_GOOD
taste_description = "refreshing spiciness"
glass_icon_state = "moscow_mule"
- glass_name = "Gorlex Gator"
- glass_desc = "A chilly drink made in remembrance of Gorlex IV. It's not a wise idea to go ordering this when the PGF are in town, though."
+ glass_name = "Moscow Mule"
+ glass_desc = "A chilly drink that reminds you of the Derelict."
/datum/reagent/consumable/ethanol/fernet
name = "Fernet"
@@ -1754,7 +1806,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 80
taste_description = "utter bitterness"
glass_name = "glass of fernet"
- glass_desc = "A glass of pure Fernet. Intensely bitter and reserved to being a digestive more than something to be enjoyed." //Hi Kevum
+ glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum
/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1764,15 +1816,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/fernet_cola
- name = "Weldline"
+ name = "Fernet Cola"
description = "A very popular and bittersweet digestif, ideal after a heavy meal. Best served on a sawed-off cola bottle as per tradition."
color = "#390600" // rgb: 57, 6,
boozepwr = 25
quality = DRINK_NICE
taste_description = "sweet relief"
glass_icon_state = "godlyblend"
- glass_name = "glass of weldline"
- glass_desc = "A shorn-off cola bottle filled with fernet and cola soft drink. A tradition among cargo workers and hull technicians is to use a welder to cut the cola can in half."
+ glass_name = "glass of fernet cola"
+ glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass."
/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
@@ -1782,6 +1834,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/fanciulli
+
name = "Fanciulli"
description = "What if the Manhattan cocktail ACTUALLY used a bitter herb liquour? Helps you sober up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness
color = "#CA933F" // rgb: 202, 147, 63
@@ -1790,7 +1843,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a sweet sobering mix"
glass_icon_state = "fanciulli"
glass_name = "glass of fanciulli"
- glass_desc = "A glass of Fanciulli: a Manhattan with fernet mixed in. Bitter enough to knock some sense into your drunk self."
+ glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet."
/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M)
M.adjust_nutrition(-5)
@@ -1805,15 +1858,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/branca_menta
- name = "Mirage"
+ name = "Branca Menta"
description = "A refreshing mixture of bitter Fernet with mint creme liquour."
color = "#4B5746" // rgb: 75, 87, 70
boozepwr = 35
quality = DRINK_GOOD
taste_description = "a bitter freshness"
glass_icon_state= "minted_fernet"
- glass_name = "glass of Mirage"
- glass_desc = "A glass of fernet and mint creme liquor, enjoyed on the warmer days on Teceti." //Get lazy literally by drinking this
+ glass_name = "glass of branca menta"
+ glass_desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this
/datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M)
@@ -1961,7 +2014,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "auspicious occasions and bad decisions"
glass_icon_state = "champagne_glass"
glass_name = "Champagne"
- glass_desc = "A sparkling wine, traditionally served in a flute that clearly displays the slowly rising bubbles."
+ glass_desc = "The flute clearly displays the slowly rising bubbles."
/datum/reagent/consumable/ethanol/wizz_fizz
@@ -1970,7 +2023,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#4235d0" //Just pretend that the triple-sec was blue curacao.
boozepwr = 50
quality = DRINK_GOOD
- taste_description = "whimsy and carbonation"
+ taste_description = "friendship! It is magic, after all"
glass_icon_state = "wizz_fizz"
glass_name = "Wizz Fizz"
glass_desc = "The glass bubbles and froths with an almost magical intensity."
@@ -1984,36 +2037,48 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/bug_spray
- name = "Stunball"
+ name = "Bug Spray"
description = "A harsh, acrid, bitter drink, for those who need something to brace themselves."
color = "#33ff33"
boozepwr = 50
quality = DRINK_GOOD
- taste_description = "the distinct sense of drinking diluted poison"
+ taste_description = "the pain of ten thousand slain mosquitos"
glass_icon_state = "bug_spray"
- glass_name = "Stunball"
- glass_desc = "Made in protest of the Mothball mixed drink being recognized by the Interstellar Bartenders Association, who refute the idea of a singular point of origin. The taste is as spiteful as its history."
+ glass_name = "Bug Spray"
+ glass_desc = "Your eyes begin to water as the sting of alcohol reaches them."
+
+/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M)
+//Bugs should not drink Bug spray.
+ if(ismoth(M) || isflyperson(M) || isspiderperson(M))
+ M.adjustToxLoss(1,0)
+ return ..()
+/datum/reagent/consumable/ethanol/bug_spray/on_mob_metabolize(mob/living/carbon/M)
+
+ if(ismoth(M) || isflyperson(M))
+ M.emote("scream")
+ return ..()
+
/datum/reagent/consumable/ethanol/applejack
name = "Applejack"
- description = "The officially sponsored drink by the National Association for Anti-Gravity Automobile Dragracing (NAAGAD)."
+ description = "The perfect beverage for when you feel the need to horse around."
color = "#ff6633"
boozepwr = 20
- taste_description = "resisting gravity through brandy"
+ taste_description = "an honest day's work at the orchard"
glass_icon_state = "applejack_glass"
glass_name = "Applejack"
- glass_desc = "You lament you can't watch any Agrav Races while out here."
+ glass_desc = "You feel like you could drink this all neight."
/datum/reagent/consumable/ethanol/jack_rose
- name = "Jackalope"
- description = "A light cocktail named after a famous anti-gravity racer."
+ name = "Jack Rose"
+ description = "A light cocktail perfect for sipping with a slice of pie."
color = "#ff6633"
boozepwr = 15
quality = DRINK_NICE
taste_description = "a sweet and sour slice of apple"
glass_icon_state = "jack_rose"
- glass_name = "Jackalope"
- glass_desc = "Enough of these, and you might feel like you're floating. Just don't think you can pilot!"
+ glass_name = "Jack Rose"
+ glass_desc = "Enough of these, and you really will start to suppose your toeses are roses."
/datum/reagent/consumable/ethanol/turbo
name = "Turbo"
@@ -2024,11 +2089,11 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "the outlaw spirit"
glass_icon_state = "turbo"
glass_name = "Turbo"
- glass_desc = "A turbulent cocktail for outlaw hoverbikers. Not officially recognized by National Association for Anti-Gravity Automobile Dragracing (NAAGAD)... but they're sticks in the mud, anyway!"
+ glass_desc = "A turbulent cocktail for outlaw hoverbikers."
/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M)
if(prob(4))
- to_chat(M, "[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing...")]")
+ to_chat(M, "[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")
M.adjustStaminaLoss(-M.drunkenness * 0.25)
return ..()
@@ -2041,7 +2106,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "simpler times"
glass_icon_state = "old_timer"
glass_name = "Old Timer"
- glass_desc = "You might not be the target audience of this drink if you're still out in the Frontier, though."
+ glass_desc = "WARNING! May cause premature aging!"
/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M)
if(prob(20))
@@ -2054,6 +2119,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
N.update_hair()
if(N.age > N.dna.species.species_age_max * 0.8)
N.become_nearsighted(type)
+ if(N.gender == MALE)
+ N.facial_hairstyle = "Beard (Very Long)"
+ N.update_hair()
if(N.age > N.dna.species.species_age_max * 1.2) //Best not let people get older than this or i might incur G-ds wrath
M.visible_message("[M] becomes older than any man should be.. and crumbles into dust!")
@@ -2067,42 +2135,49 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#ffe65b"
boozepwr = 60
quality = DRINK_GOOD
- taste_description = "artifical fruitiness"
+ taste_description = "artifical fruityness"
glass_icon_state = "rubberneck"
glass_name = "Rubberneck"
- glass_desc = "A popular drink amongst those adhering to an all-synthetic diet, popularized briefly as a counterculture movement."
+ glass_desc = "A popular drink amongst those adhering to an all synthetic diet."
/datum/reagent/consumable/ethanol/duplex
- name = "North-South"
+ name = "Duplex"
description = "An inseparable combination of two fruity drinks."
color = "#50e5cf"
boozepwr = 25
quality = DRINK_NICE
taste_description = "green apples and blue raspberries"
glass_icon_state = "duplex"
- glass_name = "North-South"
- glass_desc = "A fruity drink made, apparently, to represent North and South Teceti. You're supposed to hold it in a way that both vials pour together - one on top of the other."
+ glass_name = "Duplex"
+ glass_desc = "To imbibe one component separately from the other is consider a great faux pas."
/datum/reagent/consumable/ethanol/trappist
- name = "Trapper's Beer"
- description = "A strong dark ale brewed by the Saint Roumain Militia."
+ name = "Trappist Beer"
+ description = "A strong dark ale brewed by space-monks."
color = "#390c00"
boozepwr = 40
quality = DRINK_VERYGOOD
- taste_description = "dried plums, ash, and malt"
+ taste_description = "dried plums and malt"
glass_icon_state = "trappistglass"
- glass_name = "Trapper's Beer"
- glass_desc = "The Ashen Huntsman's blessings, in a glass. Despite proclaiming an ascetic lifestyle, it's okay to have a little fun once in a while."
+ glass_name = "Trappist Beer"
+ glass_desc = "boozy Catholicism in a glass."
+
+/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M)
+ if(M.mind.holy_role)
+ M.adjustFireLoss(-2.5, 0)
+ M.jitteriness = max(0, M.jitteriness-1)
+ M.stuttering = max(0, M.stuttering-1)
+ return ..()
/datum/reagent/consumable/ethanol/blazaam
- name = "Hyperspace Highball"
- description = "A strange drink mixed with bluespace crystal flakes, which is already extremely expensive on its own merit."
+ name = "Blazaam"
+ description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover."
boozepwr = 70
quality = DRINK_FANTASTIC
taste_description = "alternate realities"
glass_icon_state = "blazaamglass"
- glass_name = "Hyperspace Highball"
- glass_desc = "The glass is seemingly reacting with the bluespace flakes... maybe making this was a poor decision?"
+ glass_name = "Blazaam"
+ glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover."
var/stored_teleports = 0
/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M)
@@ -2117,15 +2192,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
return ..()
/datum/reagent/consumable/ethanol/mauna_loa
- name = "Inner Fire"
+ name = "Mauna Loa"
description = "Extremely hot; not for the faint of heart!"
boozepwr = 40
color = "#fe8308" // 254, 131, 8
quality = DRINK_FANTASTIC
taste_description = "fiery, with an aftertaste of burnt flesh"
glass_icon_state = "mauna_loa"
- glass_name = "Inner Fire"
- glass_desc = "Not at all made by the Saint Roumain, this drink still bases itself as a test of will used by the hunters to test their endurance to intense heat... and alcohol."
+ glass_name = "Mauna Loa"
+ glass_desc = "Lavaland in a drink... mug... volcano... thing."
/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/M)
// Heats the user up while the reagent is in the body. Occasionally makes you burst into flames.
@@ -2144,7 +2219,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sugary tartness"
glass_icon_state = "painkiller"
glass_name = "Painkiller"
- glass_desc = "A combination of tropical juices and rum. Surely, this will make you feel better."
+ glass_desc = "A combination of tropical juices and rum. Surely this will make you feel better."
/datum/reagent/consumable/ethanol/pina_colada
name = "Pina Colada"
@@ -2161,12 +2236,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/pruno // pruno mix is in drink_reagents
name = "pruno"
color = "#E78108"
- description = "Fermented prison wine made from fruit, sugar, and despair."
+ description = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done."
boozepwr = 85
- taste_description = "your tastebuds crying out"
+ taste_description = "your tastebuds being individually shanked"
glass_icon_state = "glass_orange"
glass_name = "glass of pruno"
- glass_desc = "Fermented prison wine made from fruit, sugar, and despair."
+ glass_desc = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done."
/datum/reagent/consumable/ethanol/pruno/on_mob_life(mob/living/carbon/M)
M.adjust_disgust(5)
@@ -2181,7 +2256,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "sweetness followed by a soft sourness and warmth"
glass_icon_state = "gingeramaretto"
glass_name = "Ginger Amaretto"
- glass_desc = "Technically intended to come with a sprig of rosemary... but where are you going to get your hands on that?"
+ glass_desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!"
/datum/reagent/consumable/ethanol/godfather
name = "Godfather"
@@ -2192,28 +2267,28 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "a delightful softened punch"
glass_icon_state = "godfather"
glass_name = "Godfather"
- glass_desc = "Technically still enjoyed by members of the Intersolar Mafia, though the homage is much older. Pray the orange peel doesn't end up in your mouth."
+ glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth."
/datum/reagent/consumable/ethanol/godmother
name = "Godmother"
- description = "A twist on a classic, made as a sibling drink to the Godfather."
+ description = "A twist on a classic, liked more by mature women."
boozepwr = 50
color = "#E68F00"
quality = DRINK_GOOD
taste_description = "sweetness and a zesty twist"
glass_icon_state = "godmother"
glass_name = "Godmother"
- glass_desc = "Just as enjoyed (and related to) the Intersolar Mafia. You're technically supposed to drink this alongside someone else having a Godfather."
+ glass_desc = "A lovely fresh smelling cocktail, a true Sicilian delight."
/datum/reagent/consumable/ethanol/mudders_milk
- name = "Miner's Milk"
+ name = "mudder's milk"
color = "#dfc794"
- description = "All the protein, vitamins and carbs of two full ration packs, plus 15% alcohol."
+ description = "All the protein, vitamins and carbs of your grandma's best turkey dinner, plus 15 percent alcohol."
boozepwr = 15
- taste_description = "thick, nut-flavored milk with a boozy kick"
+ taste_description = "thick, nutty milk with a boozy kick"
glass_icon_state = "muddersmilk"
- glass_name = "Miner's Milk"
- glass_desc = "All the protein, vitamins and carbs of two full ration packs, plus 15% alcohol. Created by Nanotrasen's Mining and Exploration League, and often still enjoyed in the New Gorlex Republic."
+ glass_name = "Mudder's Milk"
+ glass_desc = "All the protein, vitamins and carbs of your grandma's best turkey dinner, plus 15 percent alcohol."
/datum/reagent/consumable/ethanol/mudders_milk/on_mob_life(mob/living/carbon/M)
if(prob(1))
@@ -2263,15 +2338,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
..()
/datum/reagent/consumable/ethanol/freezer_burn
- name = "Hullbreach"
+ name = "Freezer Burn"
description = "Fire and ice combine in your mouth! Drinking slowly recommended."
boozepwr = 40
color = "#ba3100"
quality = DRINK_FANTASTIC
- taste_description = "frigid, hot stings"
+ taste_description = "fire and ice"
glass_icon_state = "freezer_burn"
- glass_name = "Hullbreach"
- glass_desc = "Fire and ice combine in your mouth, like being pulled out into space."
+ glass_name = "Freezer Burn"
+ glass_desc = "Fire and ice combine in your mouth! Drinking slowly recommended."
/datum/reagent/consumable/ethanol/freezer_burn/on_mob_life(mob/living/carbon/M)
M.adjustFireLoss(-0.2, 0)
@@ -2299,14 +2374,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/darkest_chocolate
name = "Darkest Chocolate"
- description = "Darkness within darkness awaits you, spacer!"
+ description = "Darkness within darkness awaits you, spaceman!"
boozepwr = 40
color = "#240c0c"
quality = DRINK_FANTASTIC
taste_description = "bitter, chocolatey darkness with a note of cream"
glass_icon_state = "darkest_chocolate"
glass_name = "Darkest Chocolate"
- glass_desc = "Darkness within darkness awaits you, spacer!"
+ glass_desc = "Darkness within darkness awaits you, spaceman!"
var/obj/effect/light_holder
/datum/reagent/consumable/ethanol/darkest_chocolate/on_mob_metabolize(mob/living/M)
@@ -2325,6 +2400,28 @@ All effects don't start immediately, but rather get worse over time; the rate is
to_chat(M, "The darkness subsides.")
QDEL_NULL(light_holder)
+/datum/reagent/consumable/ethanol/archmagus_brew
+ name = "Archmagus' Brew"
+ description = "Said to have been requested by a great Archmagus, hence the name. Tastes like tough love."
+ boozepwr = 40
+ color = "#c75295"
+ quality = DRINK_FANTASTIC
+ taste_description = "tough love"
+ glass_icon_state = "archmagus_brew"
+ glass_name = "Archmagus' Brew"
+ glass_desc = "Said to have been requested by a great Archmagus, hence the name. Tastes like tough love."
+
+/datum/reagent/consumable/ethanol/archmagus_brew/on_mob_life(mob/living/carbon/human/M)
+ if(M.mind && M.mind.spell_list.len != 0)
+ var/spell_improved = FALSE
+ for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
+ if(S.clothes_req)
+ S.clothes_req = 0
+ spell_improved = TRUE
+ if(spell_improved)
+ to_chat(M, "You suddenly feel like you never needed those garish robes in the first place...")
+ return ..()
+
/datum/reagent/consumable/ethanol/out_of_lime
name = "Out of Lime"
description = "A spin on the classic. Artists and street fighters swear by this stuff."
@@ -2343,6 +2440,22 @@ All effects don't start immediately, but rather get worse over time; the rate is
consumer.facial_hair_color = pick("0ad","a0f","f73","d14","0b5","fc2","084","05e","d22","fa0")
consumer.update_hair()
+/datum/reagent/consumable/ethanol/cogchamp
+ name = "CogChamp"
+ description = "Now you can fill yourself with the power of Ratvar!"
+ color = rgb(255, 201, 49)
+ boozepwr = 10
+ quality = DRINK_FANTASTIC
+ taste_description = "a brass taste with a hint of oil"
+ glass_icon_state = "cogchamp"
+ glass_name = "CogChamp"
+ glass_desc = "Not one of Ratvar's Four Generals could withstand this! Qevax Jryy!"
+
+/datum/reagent/consumable/ethanol/cogchamp/on_mob_life(mob/living/carbon/M)
+ M.clockcultslurring = min(M.clockcultslurring + 3, 3)
+ M.stuttering = min(M.stuttering + 3, 3)
+ ..()
+
/datum/reagent/consumable/ethanol/shotinthedark
name = "Shot in the Dark"
description = "A coconut elixir with a golden tinge."
@@ -2352,7 +2465,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
taste_description = "an incoming bullet"
glass_icon_state = "shotinthedark"
glass_name = "Shot in the Dark"
- glass_desc = "A specially made drink from the popular webseries RILENA: LMR. Contains traces of gold from the real bullet inside... which wouldn't make sense outside of the series it comes from."
+ glass_desc = "A specially made drink from the popular webseries RILENA: LMR. Contains traces of gold from the real bullet inside."
/datum/reagent/consumable/ethanol/bullethell
name = "Bullet Hell"
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index d37048250e62..d359600b0102 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -11,7 +11,7 @@
taste_description = "oranges"
glass_icon_state = "glass_orange"
glass_name = "glass of orange juice"
- glass_desc = "Tart and sweet. It might have pulp, if that's what you wanted."
+ glass_desc = "Vitamins! Yay!"
/datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/M)
if(M.getOxyLoss() && prob(30))
@@ -26,7 +26,7 @@
taste_description = "tomatoes"
glass_icon_state = "glass_red"
glass_name = "glass of tomato juice"
- glass_desc = "Some part of you wonders if this could have been a soup at some point."
+ glass_desc = "Are you sure this is tomato juice?"
/datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/M)
if(M.getFireLoss() && prob(20))
@@ -41,7 +41,7 @@
taste_description = "unbearable sourness"
glass_icon_state = "glass_green"
glass_name = "glass of lime juice"
- glass_desc = "A glass of intensely sour lime juice. You wonder to yourself: how much do you really need to ward off scurvy for it to come to the point?"
+ glass_desc = "A glass of sweet-sour lime juice."
/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/M)
if(M.getToxLoss() && prob(20))
@@ -56,7 +56,7 @@
taste_description = "carrots"
glass_icon_state = "carrotjuice"
glass_name = "glass of carrot juice"
- glass_desc = "Mildly sweet, but it won't actually improve your eyesight all that much beyond the baseline..."
+ glass_desc = "It's just like a carrot but without crunching."
/datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/M)
M.adjust_blurriness(-1)
@@ -77,7 +77,7 @@
taste_description = "berries"
glass_icon_state = "berryjuice"
glass_name = "glass of berry juice"
- glass_desc = "Berry juice. Technically a fruit punch all on its own!"
+ glass_desc = "Berry juice. Or maybe it's jam. Who cares?"
/datum/reagent/consumable/applejuice
name = "Apple Juice"
@@ -92,7 +92,7 @@
taste_description = "berries"
glass_icon_state = "poisonberryjuice"
glass_name = "glass of berry juice"
- glass_desc = "Berry juice. Technically a fruit punch all on its own!"
+ glass_desc = "Berry juice. Or maybe it's poison. Who cares?"
/datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(1, 0)
@@ -106,7 +106,7 @@
taste_description = "juicy watermelon"
glass_icon_state = "glass_red"
glass_name = "glass of watermelon juice"
- glass_desc = "A glass of watermelon juice. Mild and sweet."
+ glass_desc = "A glass of watermelon juice."
/datum/reagent/consumable/lemonjuice
name = "Lemon Juice"
@@ -115,16 +115,16 @@
taste_description = "sourness"
glass_icon_state = "lemonglass"
glass_name = "glass of lemon juice"
- glass_desc = "A glass of intensely sour lime juice. You wonder to yourself: how much do you really need to ward off scurvy for it to come to the point?"
+ glass_desc = "Sour..."
/datum/reagent/consumable/banana
name = "Banana Juice"
- description = "The raw essence of a banana."
+ description = "The raw essence of a banana. HONK"
color = "#e6d283"
taste_description = "banana"
glass_icon_state = "banana"
glass_name = "glass of banana juice"
- glass_desc = "While staring down at this glass, some part of you wonders what went through the minds of those who decided to add this to milk."
+ glass_desc = "The raw essence of a banana. HONK."
/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/M)
if((ishuman(M) && M.job == "Clown") || ismonkey(M))
@@ -179,25 +179,25 @@
description = "Juice of the potato. Bleh."
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#9e8045" // rgb: 48, 32, 0
- taste_description = "starchy water"
+ taste_description = "irish sadness"
glass_icon_state = "glass_brown"
glass_name = "glass of potato juice"
- glass_desc = "Starchy. It coats your mouth with a filament afterwards, which really isn't helping it's case."
+ glass_desc = "Bleh..."
/datum/reagent/consumable/grapejuice
name = "Grape Juice"
description = "The juice of a bunch of grapes. Guaranteed non-alcoholic."
color = "#790b79" // dark purple
- taste_description = "grapes"
+ taste_description = "grape soda"
/datum/reagent/consumable/milk
name = "Milk"
- description = "An opaque white liquid produced by the mammary glands of mammals, some arthropods, biogenerators, chemical factories..."
+ description = "An opaque white liquid produced by the mammary glands of mammals."
color = "#DFDFDF" // rgb: 223, 223, 223
taste_description = "milk"
glass_icon_state = "glass_white"
glass_name = "glass of milk"
- glass_desc = "A glass of frothy milk. You wonder what animal this could have come from, if at all."
+ glass_desc = "White and nutritious goodness!"
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -214,7 +214,7 @@
taste_description = "soy milk"
glass_icon_state = "glass_white"
glass_name = "glass of soy milk"
- glass_desc = "Despite being made from soybeans, it sates the same desire to have an entire glass of milk."
+ glass_desc = "White and nutritious soy goodness!"
/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -224,12 +224,12 @@
/datum/reagent/consumable/cream
name = "Cream"
- description = "The fatty, still liquid part of milk."
+ description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
color = "#DFD7AF" // rgb: 223, 215, 175
taste_description = "creamy milk"
glass_icon_state = "glass_white"
glass_name = "glass of cream"
- glass_desc = "It's a bit thick to drink straight."
+ glass_desc = "Ewwww..."
/datum/reagent/consumable/cream/on_mob_life(mob/living/carbon/M)
if(M.getBruteLoss() && prob(20))
@@ -246,7 +246,7 @@
taste_description = "bitterness"
glass_icon_state = "glass_brown"
glass_name = "glass of coffee"
- glass_desc = "Black coffee, served straight. It'll be pretty bitter without anything else in it!"
+ glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
/datum/reagent/consumable/coffee/overdose_process(mob/living/M)
M.Jitter(5)
@@ -265,13 +265,13 @@
/datum/reagent/consumable/tea
name = "Tea"
- description = "Warm, dark tea."
+ description = "Tasty black tea, it has antioxidants, it's good for you!"
color = "#5f4a05"
nutriment_factor = 0
- taste_description = "tart dark tea"
+ taste_description = "tart black tea"
glass_icon_state = "teaglass"
glass_name = "glass of tea"
- glass_desc = "There's a latent desire to drink this out of a teacup, but there's no time for teatime out here."
+ glass_desc = "Drinking it from here would not seem right."
/datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -289,25 +289,25 @@
description = "Sweet, tangy lemonade. Good for the soul."
color = "#FFE978"
quality = DRINK_NICE
- taste_description = "sunshine and distant shores"
+ taste_description = "sunshine and summertime"
glass_icon_state = "lemonpitcher"
glass_name = "pitcher of lemonade"
- glass_desc = "Sweet, slightly tart, and refreshing. You feel some misplaced nostalgia when you have this, even though you're not sure you've ever squeezed a lemon before."
+ glass_desc = "This drink leaves you feeling nostalgic for some reason."
/datum/reagent/consumable/tea/arnold_palmer
name = "Arnold Palmer"
- description = "Iced sweet tea and lemonade."
+ description = "Encourages the patient to go golfing."
color = "#FFB766"
quality = DRINK_NICE
nutriment_factor = 2
taste_description = "bitter tea"
glass_icon_state = "arnold_palmer"
glass_name = "Arnold Palmer"
- glass_desc = "Iced tea and lemonade. You don't think you know any Arnolds, though."
+ glass_desc = "You feel like taking a few golf swings after a few swigs of this."
/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/M)
if(prob(5))
- to_chat(M, "[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game... whatever that is.")]")
+ to_chat(M, "[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game.")]")
..()
. = 1
@@ -316,21 +316,17 @@
description = "Coffee and ice, refreshing and cool."
color = "#112a3b" // rgb: 16, 40, 56
nutriment_factor = 0
- overdose_threshold = 80
taste_description = "bitter coldness"
glass_icon_state = "icedcoffeeglass"
glass_name = "iced coffee"
- glass_desc = "Iced black coffee. It's still going to be pretty bitter on it's own, though!"
-
-/datum/reagent/consumable/icecoffee/overdose_process(mob/living/M)
- M.Jitter(5)
- ..()
+ glass_desc = "A drink to perk you up and refresh you!"
/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.AdjustSleeping(-40)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
+ M.Jitter(5)
..()
. = 1
@@ -339,35 +335,31 @@
description = "Coffee with pulsing ice shards"
color = "#132043" // rgb: 16, 40, 56
nutriment_factor = 0
- overdose_threshold = 80
quality = DRINK_FANTASTIC
taste_description = "bitter coldness and a hint of smoke"
glass_icon_state = "hoticecoffee"
glass_name = "hot ice coffee"
- glass_desc = "The wonders of fusion mixed into a cup of coffee, resulting in an extremely hot-cold drink."
-
-/datum/reagent/consumable/hot_ice_coffee/overdose_process(mob/living/M)
- M.Jitter(5)
- ..()
+ glass_desc = "A sharp drink, this can't have come cheap."
/datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.AdjustSleeping(-60)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
+ M.Jitter(5)
M.adjustToxLoss(1*REM, 0)
..()
. = TRUE
/datum/reagent/consumable/icetea
name = "Iced Tea"
- description = "Iced, sweetened tea."
+ description = "No relation to a certain rap artist/actor."
color = "#104038" // rgb: 16, 64, 56
nutriment_factor = 0
taste_description = "sweet tea"
glass_icon_state = "icedteaglass"
glass_name = "iced tea"
- glass_desc = "A much more appealing way to have tea while dealing with the heat."
+ glass_desc = "All natural, antioxidant-rich flavour sensation."
/datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -385,33 +377,61 @@
color = "#743c05" // rgb: 16, 8, 0
taste_description = "cola"
glass_icon_state = "glass_brown"
- glass_name = "glass of cola"
- glass_desc = "A carbonated cola. You should drink it before it gets flat!"
+ glass_name = "glass of Space Cola"
+ glass_desc = "A glass of refreshing Space Cola."
/datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-5)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
-/datum/reagent/consumable/crosstalk
- name = "Crosstalk"
- description = "Crosstalk! Share the energy with everyone!"
+/datum/reagent/consumable/nuka_cola
+ name = "Nuka Cola"
+ description = "Cola, cola never changes."
+ color = "#3b6c0e" // rgb: 16, 8, 0
+ quality = DRINK_VERYGOOD
+ taste_description = "the future"
+ glass_icon_state = "nuka_colaglass"
+ glass_name = "glass of Nuka Cola"
+ glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
+
+/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L)
+ ..()
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola)
+
+/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/L)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola)
+ ..()
+
+/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
+ M.Jitter(20)
+ M.set_drugginess(30)
+ M.dizziness +=1.5
+ M.drowsyness = 0
+ M.AdjustSleeping(-40)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
+ ..()
+ . = 1
+
+/datum/reagent/consumable/grey_bull
+ name = "Grey Bull"
+ description = "Grey Bull, it gives you gloves!"
color = "#EEFF00" // rgb: 238, 255, 0
quality = DRINK_VERYGOOD
- taste_description = "carbonated battery acid with a spoonful of sugar"
- glass_icon_state = "crosstalk_glass"
- glass_name = "glass of Crosstalk"
- glass_desc = "The amount of sugar and chemicals in this drink makes your eyes water."
+ taste_description = "carbonated oil"
+ glass_icon_state = "grey_bull_glass"
+ glass_name = "glass of Grey Bull"
+ glass_desc = "Surprisingly it isnt grey."
-/datum/reagent/consumable/crosstalk/on_mob_metabolize(mob/living/L)
+/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L)
..()
ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, type)
-/datum/reagent/consumable/crosstalk/on_mob_end_metabolize(mob/living/L)
+/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/L)
REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, type)
..()
-/datum/reagent/consumable/crosstalk/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
M.dizziness +=1
M.drowsyness = 0
@@ -419,16 +439,16 @@
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
-/datum/reagent/consumable/comet_trail
- name = "Comet Trail"
- description = "A citrusy drink from the Kepori space installation known as The Ring."
+/datum/reagent/consumable/spacemountainwind
+ name = "SM Wind"
+ description = "Blows right through you like a space wind."
color = "#c4ff2d" // rgb: 16, 32, 0
taste_description = "sweet citrus soda"
- glass_icon_state = "comet_trail_glass"
- glass_name = "glass of Comet Trail"
- glass_desc = "A glass of Comet Trail. Taste the stars!"
+ glass_icon_state = "Space_mountain_wind_glass"
+ glass_name = "glass of Space Mountain Wind"
+ glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind."
-/datum/reagent/consumable/comet_trail/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-7)
M.AdjustSleeping(-20)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -436,16 +456,16 @@
..()
. = 1
-/datum/reagent/consumable/tadrixx
- name = "Tadrixx"
- description = "A Kalixcian drink made from a plant that tastes similar to sassafrass, which is used in root beer. A stumpy drake holding a mug of it is on the front."
+/datum/reagent/consumable/dr_gibb
+ name = "Dr. Gibb"
+ description = "A delicious blend of 42 different flavours."
color = "#732a03"
- taste_description = "root beer" // FALSE ADVERTISING
- glass_icon_state = "tadrixx_glass"
- glass_name = "glass of Tadrixx"
- glass_desc = "A cup of fizzy Tadrixx. It smells sweet."
+ taste_description = "cherry soda" // FALSE ADVERTISING
+ glass_icon_state = "dr_gibb_glass"
+ glass_name = "glass of Dr. Gibb"
+ glass_desc = "Dr. Gibb. Not as dangerous as the glass_name might imply."
-/datum/reagent/consumable/tadrixx/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(0,M.drowsyness-6)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
@@ -464,40 +484,6 @@
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
-/datum/reagent/consumable/molten
- name = "Molten Bubbles"
- description = "A spicy soft drink made from a coca-like plant from Kalixcis. Popularly served both cold -and- hot, depending on the weather."
- color = "#5f2010"
- taste_description = "spiced cola"
- glass_icon_state = "glass_brown"
- glass_name = "glass of Molten Bubbles"
- glass_desc = "A glass of Molten Bubbles. The spices tickle your nose."
-
-/datum/reagent/consumable/molten/on_mob_life(mob/living/carbon/M)
- M.heal_bodypart_damage(1,1,0)
- if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE))
- M.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE))
- else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1))
- M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE))
- ..()
-
-/datum/reagent/consumable/molten/plasma_fizz
- name = "Plasma Fizz"
- description = "A spinoff of the popular Molten Bubbles drink from Kalixcis, made to emulate the flavor of spiced grape instead. It's... not exactly convincing or a very good mix."
- color = "#5f2010"
- taste_description = "spiced grape soda"
- glass_icon_state = "plasma_fizz_glass"
- glass_name = "glass of Plasma Fizz"
- glass_desc = "A glass of Plasma Fizz. The spices (and fake grape flavoring) wrinkles your nose."
-
-/datum/reagent/consumable/molten/sand
- name = "Sandblast Sarsaparilla"
- description = "Extra refreshing for those long desert days."
- color = "#af9938"
- taste_description = "root-beer and asbestos"
- glass_name = "glass of Sandblast Sarsaparilla"
- glass_desc = "A glass of Sandblast Sarsaparilla. Perfect for those long desert days."
-
/datum/reagent/consumable/lemon_lime
name = "Lemon Lime"
description = "A tangy substance made of 0.5% natural citrus!"
@@ -513,48 +499,48 @@
..()
-/datum/reagent/consumable/pacfuel
- name = "PAC-Fuel"
- description = "A carbonated energy drink themed after the purple coloration, similar to plasma."
+/datum/reagent/consumable/pwr_game
+ name = "Pwr Game"
+ description = "The only drink with the PWR that true gamers crave."
color = "#9385bf" // rgb: 58, 52, 75
taste_description = "sweet and salty tang"
glass_icon_state = "glass_red"
- glass_name = "glass of PAC-Fuel"
- glass_desc = "A glass of PAC-Fuel energy drink. It smells vaguely like acidic cotton candy..."
+ glass_name = "glass of Pwr Game"
+ glass_desc = "Goes well with a Vlad's salad."
-/datum/reagent/consumable/pacfuel/expose_mob(mob/living/C, method=TOUCH, reac_volume)
+/datum/reagent/consumable/pwr_game/expose_mob(mob/living/C, method=TOUCH, reac_volume)
..()
if(C?.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && method==INGEST && !HAS_TRAIT(C, TRAIT_GAMERGOD))
ADD_TRAIT(C, TRAIT_GAMERGOD, "pwr_game")
- to_chat(C, "As you imbibe the PAC-Fuel, your gamer third eye opens... \
+ to_chat(C, "As you imbibe the Pwr Game, your gamer third eye opens... \
You feel as though a great secret of the universe has been made known to you...")
-/datum/reagent/consumable/pacfuel/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
if(prob(10))
M?.mind.adjust_experience(/datum/skill/gaming, 5)
..()
-/datum/reagent/consumable/shoal_punch
- name = "Shoal Punch"
- description = "Sugary, and from the Shoal."
+/datum/reagent/consumable/shamblers
+ name = "Shambler's Juice"
+ description = "~Shake me up some of that Shambler's Juice!~"
color = "#f00060" // rgb: 94, 0, 38
- taste_description = "sugary fruity soda"
+ taste_description = "carbonated metallic soda"
glass_icon_state = "glass_red"
- glass_name = "glass of Shoal Punch"
- glass_desc = "It's hard to imagine all those fruits getting condensed into a cup like this."
+ glass_name = "glass of Shambler's juice"
+ glass_desc = "Mmm mm, shambly."
-/datum/reagent/consumable/shoal_punch/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
/datum/reagent/consumable/sodawater
name = "Soda Water"
- description = "A can of club soda."
+ description = "A can of club soda. Why not make a scotch and soda?"
color = "#619494" // rgb: 97, 148, 148
taste_description = "carbonated water"
glass_icon_state = "glass_clear"
glass_name = "glass of soda water"
- glass_desc = "Soda water. You feel like you should add something to this..."
+ glass_desc = "Soda water. Why not make a scotch and soda?"
/datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -564,12 +550,12 @@
/datum/reagent/consumable/tonic
name = "Tonic Water"
- description = "It tastes strange, and it's not like malaria is much of an issue anymore."
+ description = "It tastes strange but at least the quinine keeps the Space Malaria at bay."
color = "#709fce"
taste_description = "tart and fresh"
glass_icon_state = "glass_clear"
glass_name = "glass of tonic water"
- glass_desc = "Quinine and carbonated water. You really should add something to this..."
+ glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
/datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -579,17 +565,17 @@
..()
. = 1
-/datum/reagent/consumable/xeno_energy
- name = "Xeno-Energy"
- description = "An unbearably sugary, fizzy green drink."
- color = "#88b488" // rgb: 243, 155, 3
+/datum/reagent/consumable/monkey_energy
+ name = "Monkey Energy"
+ description = "The only drink that will make you unleash the ape."
+ color = "#f39b03" // rgb: 243, 155, 3
overdose_threshold = 60
- taste_description = "tooth-rotting sweetness"
- glass_icon_state = "xeno_energy_glass"
- glass_name = "glass of Xeno Energy"
- glass_desc = "A glass of Xeno Energy. It seems to swirl and roil outside of the can..."
+ taste_description = "barbecue and nostalgia"
+ glass_icon_state = "monkey_energy_glass"
+ glass_name = "glass of Monkey Energy"
+ glass_desc = "You can unleash the ape, but without the pop of the can?"
-/datum/reagent/consumable/xeno_energy/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/M)
M.Jitter(20)
M.dizziness +=1
M.drowsyness = 0
@@ -597,13 +583,18 @@
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
..()
-/datum/reagent/consumable/xeno_energy/on_mob_metabolize(mob/living/L)
+/datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/L)
..()
if(ismonkey(L))
- L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/xeno_energy)
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy)
-/datum/reagent/consumable/xeno_energy/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/xeno_energy)
+/datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/L)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy)
+ ..()
+
+/datum/reagent/consumable/monkey_energy/overdose_process(mob/living/M)
+ if(prob(15))
+ M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/monkey_energy)
..()
/datum/reagent/consumable/ice
@@ -614,7 +605,7 @@
taste_description = "ice"
glass_icon_state = "iceglass"
glass_name = "glass of ice"
- glass_desc = "Generally, you're supposed to put something else in there, too..."
+ glass_desc = "Generally, you're supposed to put something else in there too..."
/datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -622,24 +613,20 @@
/datum/reagent/consumable/soy_latte
name = "Soy Latte"
- description = "A hot beverage for those who can't handle the lactose."
+ description = "A nice and tasty beverage while you are reading your hippie books."
color = "#664300" // rgb: 102, 67, 0
quality = DRINK_NICE
- overdose_threshold = 80
taste_description = "creamy coffee"
glass_icon_state = "soy_latte"
glass_name = "soy latte"
- glass_desc = "A nice and refreshing beverage. It goes well with a book, if you have the time to read."
-
-/datum/reagent/consumable/soy_latte/overdose_process(mob/living/M)
- M.Jitter(5)
- ..()
+ glass_desc = "A nice and refreshing beverage while you're reading."
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.SetSleeping(0)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal())
+ M.Jitter(5)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
..()
@@ -650,21 +637,17 @@
description = "A nice, strong and tasty beverage while you are reading."
color = "#664300" // rgb: 102, 67, 0
quality = DRINK_NICE
- overdose_threshold = 80
taste_description = "bitter cream"
glass_icon_state = "cafe_latte"
glass_name = "cafe latte"
- glass_desc = "A nice, strong and refreshing beverage. It goes well with a book, if you have the time to read."
-
-/datum/reagent/consumable/cafe_latte/overdose_process(mob/living/M)
- M.Jitter(5)
- ..()
+ glass_desc = "A nice, strong and refreshing beverage while you're reading."
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.SetSleeping(0)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal())
+ M.Jitter(5)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
..()
@@ -672,13 +655,13 @@
/datum/reagent/consumable/doctor_delight
name = "The Doctor's Delight"
- description = "A homemade curative. A mixture of juices that helps your body heal against most damage, at the cost of leaving you hungry."
+ description = "A gulp a day keeps the Medibot away! A mixture of juices that heals most damage types fairly quickly at the cost of hunger."
color = "#FF8CFF" // rgb: 255, 140, 255
quality = DRINK_VERYGOOD
taste_description = "homely fruit"
glass_icon_state = "doctorsdelightglass"
glass_name = "Doctor's Delight"
- glass_desc = "A homemade curative. Helps the body heal with the nutrition density, but it leaves a gnawing hunger afterwards."
+ glass_desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger."
/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-0.5, 0)
@@ -700,7 +683,7 @@
taste_description = "sweet chocolate"
glass_icon_state = "chocolatepudding"
glass_name = "chocolate pudding"
- glass_desc = "Thick, sweet, and chocolatey."
+ glass_desc = "Tasty."
/datum/reagent/consumable/vanillapudding
name = "Vanilla Pudding"
@@ -711,7 +694,7 @@
taste_description = "sweet vanilla"
glass_icon_state = "vanillapudding"
glass_name = "vanilla pudding"
- glass_desc = "Thick, sweet, and pleasantly vanilla."
+ glass_desc = "Tasty."
/datum/reagent/consumable/cherryshake
name = "Cherry Shake"
@@ -722,7 +705,7 @@
taste_description = "creamy cherry"
glass_icon_state = "cherryshake"
glass_name = "cherry shake"
- glass_desc = "A cherry flavored milkshake. Don't get any on your jumpsuit!"
+ glass_desc = "A cherry flavored milkshake."
/datum/reagent/consumable/bluecherryshake
name = "Blue Cherry Shake"
@@ -733,33 +716,33 @@
taste_description = "creamy blue cherry"
glass_icon_state = "bluecherryshake"
glass_name = "blue cherry shake"
- glass_desc = "A blue-cherry milkshake. Generally, the blue is meant to be figurative, but..."
+ glass_desc = "An exotic blue milkshake."
/datum/reagent/consumable/pumpkin_latte
name = "Pumpkin Latte"
- description = "A mix of spices and coffee. It doesn't actually contain any pumpkin, though."
+ description = "A mix of pumpkin juice and coffee."
color = "#F4A460"
quality = DRINK_VERYGOOD
nutriment_factor = 3 * REAGENTS_METABOLISM
taste_description = "creamy pumpkin"
glass_icon_state = "pumpkin_latte"
glass_name = "pumpkin latte"
- glass_desc = "A mix of coffee and pumpkin juice would taste a whole lot different than what you're having right now, you know."
+ glass_desc = "A mix of coffee and pumpkin juice."
-/datum/reagent/consumable/tadrixxfloat
- name = "Tadrixx Float"
- description = "Ice cream on top of a glass of Tadrixx."
- color = "#533713"
+/datum/reagent/consumable/gibbfloats
+ name = "Gibb Floats"
+ description = "Ice cream on top of a Dr. Gibb glass."
+ color = "#B22222"
quality = DRINK_NICE
nutriment_factor = 3 * REAGENTS_METABOLISM
- taste_description = "creamy root beer"
- glass_icon_state = "tadrixxfloat"
- glass_name = "Tadrixxfloat"
- glass_desc = "A glass of Tadrixx with ice cream on top."
+ taste_description = "creamy cherry"
+ glass_icon_state = "gibbfloats"
+ glass_name = "Gibbfloat"
+ glass_desc = "Dr. Gibb with ice cream on top."
/datum/reagent/consumable/pumpkinjuice
name = "Pumpkin Juice"
- description = "Juiced from real pumpkins."
+ description = "Juiced from real pumpkin."
color = "#FFA500"
taste_description = "pumpkin"
@@ -774,18 +757,18 @@
description = "A solution."
color = "#EEFF00"
quality = DRINK_NICE
- taste_description = "extreme sourness"
+ taste_description = "extreme bitterness"
glass_icon_state = "triplecitrus" //needs own sprite mine are trash //your sprite is great tho
glass_name = "glass of triple citrus"
- glass_desc = "A mixture of citrus juices. Intensely sour, and leaves you reeling afterwards."
+ glass_desc = "A mixture of citrus juices. Tangy, yet smooth."
/datum/reagent/consumable/grape_soda
name = "Grape soda"
- description = "Artificial grape soda."
+ description = "Beloved by children and teetotalers."
color = "#E6CDFF"
taste_description = "grape soda"
glass_name = "glass of grape juice"
- glass_desc = "It's grape soda!"
+ glass_desc = "It's grape (soda)!"
/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -793,28 +776,20 @@
/datum/reagent/consumable/milk/chocolate_milk
name = "Chocolate Milk"
- description = "Milk mixed with chocolate powder. Beloved by children everywhere."
+ description = "Milk for cool kids."
color = "#7D4E29"
quality = DRINK_NICE
taste_description = "chocolate milk"
-/datum/reagent/consumable/lunapunch
- name = "Lunapunch"
- description = "An herbal-sweet carbonated drink with a bitter bite."
- color = "#7D4E29"
- quality = DRINK_NICE
- taste_description = "sweet herbs and lingering bitterness"
- glass_name = "glass of Lunapunch"
- glass_desc = "An herbal-sweet soft drink. The bitter bite after each sip is enough to make you wince, but leaves you wanting more."
/datum/reagent/consumable/hot_coco
- name = "Hot Cocoa"
- description = "Made with love and cocoa beans. Or from a vending machine."
+ name = "Hot Coco"
+ description = "Made with love! And coco beans."
nutriment_factor = 3 * REAGENTS_METABOLISM
color = "#4f3a11" // rgb: 64, 48, 16
taste_description = "creamy chocolate"
glass_icon_state = "chocolateglass"
- glass_name = "glass of hot cocoa."
- glass_desc = "A favorite winter drink from the Solar Confederation. Good for warming yourself up."
+ glass_name = "glass of hot coco"
+ glass_desc = "A favorite winter drink to warm you up."
/datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal())
@@ -835,7 +810,7 @@
taste_description = "mint"
glass_icon_state = "glass_green"
glass_name = "glass of menthol"
- glass_desc = "Tastes naturally and sharply minty, with a mild numbing sensation."
+ glass_desc = "Tastes naturally minty, and imparts a very mild numbing sensation."
/datum/reagent/consumable/menthol/on_mob_life(mob/living/L)
L.apply_status_effect(/datum/status_effect/throat_soothed)
@@ -843,27 +818,26 @@
/datum/reagent/consumable/grenadine
name = "Grenadine"
- description = "More blackcurrant than cherry, actually."
+ description = "Not cherry flavored!"
color = "#EA1D26"
taste_description = "sweet pomegranates"
glass_name = "glass of grenadine"
- glass_desc = "Flavored syrup, traditionally used for mixing drinks. Having it straight is certainly a choice."
+ glass_desc = "Delicious flavored syrup."
/datum/reagent/consumable/parsnipjuice
name = "Parsnip Juice"
- description = "Starchy and uncommon."
+ description = "Why..."
color = "#FFA500"
taste_description = "parsnip"
glass_name = "glass of parsnip juice"
- glass_desc = "It doesn't really count as a soup this way. Maybe it'd better if it was a soup."
/datum/reagent/consumable/pineapplejuice
name = "Pineapple Juice"
- description = "Tart, tropical, and sweet."
+ description = "Tart, tropical, and hotly debated."
color = "#F7D435"
taste_description = "pineapple"
glass_name = "glass of pineapple juice"
- glass_desc = "Tart, tropical, and sweet."
+ glass_desc = "Tart, tropical, and hotly debated."
/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink
name = "Peach Juice"
@@ -871,17 +845,16 @@
color = "#E78108"
taste_description = "peaches"
glass_name = "glass of peach juice"
- glass_desc = "A glass full of sweet peach juice. Strange, you don't often see it out this far into the Frontier..."
/datum/reagent/consumable/cream_soda
name = "Cream Soda"
- description = "A classic vanilla flavored soft drink."
+ description = "A classic space-American vanilla flavored soft drink."
color = "#dcb137"
quality = DRINK_VERYGOOD
taste_description = "fizzy vanilla"
glass_icon_state = "cream_soda"
glass_name = "Cream Soda"
- glass_desc = "A classic vanilla flavored soft drink."
+ glass_desc = "A classic space-American vanilla flavored soft drink."
/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
@@ -894,7 +867,7 @@
quality = DRINK_NICE
taste_description = "sweet ginger spice"
glass_name = "Sol Dry"
- glass_desc = "A soothing, mellow drink made from ginger. You can't imagine drinking a carbonated drink while in microgravity, though, nausea or not..."
+ glass_desc = "A soothing, mellow drink made from ginger."
/datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/M)
M.adjust_disgust(-5)
@@ -902,13 +875,13 @@
/datum/reagent/consumable/red_queen
name = "Red Queen"
- description = "You feel inclined to drink it, somehow."
+ description = "DRINK ME."
color = "#e6ddc3"
quality = DRINK_GOOD
taste_description = "wonder"
glass_icon_state = "red_queen"
glass_name = "Red Queen"
- glass_desc = "A cup of red tea. A small note is tied around the handle of it, which asks you to drink it."
+ glass_desc = "DRINK ME."
var/current_size = RESIZE_DEFAULT_SIZE
/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H)
@@ -932,11 +905,11 @@
/datum/reagent/consumable/bungojuice
name = "Bungo Juice"
color = "#F9E43D"
- description = "A botanical experiment gone right."
+ description = "Exotic! You feel like you are on vactation already."
taste_description = "succulent bungo"
glass_icon_state = "glass_yellow"
glass_name = "glass of bungo juice"
- glass_desc = "A botanical experiment in creating a new fruit. It smells faintly citrusy, along with a hint of... banana?"
+ glass_desc = "Exotic! You feel like you are on vactation already."
/datum/reagent/consumable/prunomix
name = "pruno mixture"
@@ -954,7 +927,7 @@
taste_description = "vegetable"
glass_icon_state = "glass_yellow"
glass_name = "glass of aloe juice"
- glass_desc = "Juiced aloe vera. It's an acquired taste."
+ glass_desc = "A healthy and refreshing juice."
/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/M)
if(M.getToxLoss() && prob(30))
@@ -970,7 +943,7 @@
taste_description = "purple and a hint of opioid."
glass_icon_state = "lean"
glass_name = "Lean"
- glass_desc = "You just don't often get to see cough syrup out here, and someone had enough to mix it with soda. You're left wondering why."
+ glass_desc = "A drink that makes your life less miserable."
/datum/reagent/consumable/lean/on_mob_life(mob/living/carbon/M)
if(M.slurring < 3)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index b78fd6aa8198..09812ef20cf3 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -113,9 +113,9 @@
/datum/reagent/consumable/cooking_oil/expose_obj(obj/O, reac_volume)
if(holder && holder.chem_temp >= fry_temperature)
- if(isitem(O) && !istype(O, /obj/item/food/deepfryholder))
+ if(isitem(O) && !istype(O, /obj/item/reagent_containers/food/snacks/deepfryholder))
O.loc.visible_message("[O] rapidly fries as it's splashed with hot oil! Somehow.")
- var/obj/item/food/deepfryholder/F = new(O.drop_location(), O)
+ var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location(), O)
F.fry(volume)
F.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume)
@@ -209,6 +209,30 @@
taste_description = "hot peppers"
taste_mult = 1.5
+/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/carbon/M)
+ var/heating = 0
+ switch(current_cycle)
+ if(1 to 15)
+ heating = 5 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(holder.has_reagent(/datum/reagent/cryostylane))
+ holder.remove_reagent(/datum/reagent/cryostylane, 5)
+ if(isslime(M))
+ heating = rand(5,20)
+ if(15 to 25)
+ heating = 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(isslime(M))
+ heating = rand(10,20)
+ if(25 to 35)
+ heating = 15 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(isslime(M))
+ heating = rand(15,20)
+ if(35 to INFINITY)
+ heating = 20 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(isslime(M))
+ heating = rand(20,25)
+ M.adjust_bodytemperature(heating)
+ ..()
+
/datum/reagent/consumable/frostoil
name = "Frost Oil"
description = "A special oil that noticeably chills the body. Extracted from chilly peppers and slimes."
@@ -746,6 +770,22 @@
taste_description = "caramel"
reagent_state = SOLID
+/datum/reagent/consumable/char
+ name = "Char"
+ description = "Essence of the grill. Has strange properties when overdosed."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#C8C8C8"
+ taste_mult = 6
+ taste_description = "smoke"
+ overdose_threshold = 15
+
+/datum/reagent/consumable/char/overdose_process(mob/living/M)
+ if(prob(25))
+ M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char)
+ ..()
+ return
+
/datum/reagent/consumable/bbqsauce
name = "BBQ Sauce"
description = "Sweet, smoky, savory, and gets everywhere. Perfect for grilling."
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index d42fc60057f1..4c4ad36b2413 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1310,6 +1310,8 @@
M.adjustStaminaLoss(-3 * REM, 0)
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150)
+ if(prob(10))
+ M.say(pick("Yeah, well, you know, that's just, like, uh, your opinion, man.", "Am I glad he's frozen in there and that we're out here, and that he's the sheriff and that we're frozen out here, and that we're in there, and I just remembered, we're out here. What I wanna know is: Where's the caveman?", "It ain't me, it ain't me...", "Make love, not war!", "Stop, hey, what's that sound? Everybody look what's going down...", "Do you believe in magic in a young girl's heart?"), forced = /datum/reagent/medicine/earthsblood)
M.druggy = min(max(0, M.druggy + 10), 15) //See above
..()
. = 1
@@ -1961,10 +1963,7 @@
..()
/datum/reagent/medicine/soulus/overdose_process(mob/living/M)
- var/mob/living/carbon/C = M
- if(!istype(C.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull))
- var/obj/item/organ/legion_skull/spare_ribs = new()
- spare_ribs.Insert(M)
+ M.ForceContractDisease(new /datum/disease/transformation/legionvirus(), FALSE, TRUE)
..()
/datum/reagent/medicine/soulus/on_mob_end_metabolize(mob/living/M)
@@ -2074,6 +2073,7 @@
bp.receive_damage(0, 0, 200)
else //SUCH A LUST FOR REVENGE!!!
to_chat(M, "A phantom limb hurts!")
+ M.say("Why are we still here, just to suffer?", forced = /datum/reagent/medicine/lavaland_extract)
return ..()
/datum/reagent/medicine/skeletons_boon
@@ -2113,3 +2113,30 @@
ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
..()
+
+/datum/reagent/medicine/molten_bubbles
+ name = "Molten Bubbles"
+ description = "Refreshing softdrink made for the desert."
+ color = "#3d1916"
+ metabolization_rate = REAGENTS_METABOLISM
+ taste_description = "boiling sugar"
+
+/datum/reagent/medicine/molten_bubbles/on_mob_life(mob/living/carbon/M)
+ M.heal_bodypart_damage(1,1,0)
+ if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE))
+ M.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE))
+ else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1))
+ M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE))
+ ..()
+
+/datum/reagent/medicine/molten_bubbles/plasma
+ name = "Plasma Bubbles"
+ description = "Molten Bubbles with the refreshing taste of plasma."
+ color = "#852e63"
+ taste_description = "grape flavored cleaning solution"
+
+/datum/reagent/medicine/molten_bubbles/sand
+ name = "Sandblast Sarsaparilla"
+ description = "Extra refreshing for those long desert days."
+ color = "#af9938"
+ taste_description = "root-beer and asbestos"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 24db5dd524d8..02d8850f8776 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -410,6 +410,7 @@
description = "A substance applied to the skin to darken the skin."
color = "#FFC080" // rgb: 255, 196, 128 Bright orange
metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose
+ overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle.
taste_description = "sour oranges"
/datum/reagent/spraytan/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
@@ -469,11 +470,41 @@
N.dna.features["mcolor"] = newcolor
N.regenerate_icons()
+
+
if(method == INGEST)
if(show_message)
to_chat(M, "That tasted horrible.")
..()
+
+/datum/reagent/spraytan/overdose_process(mob/living/M)
+ metabolization_rate = 1 * REAGENTS_METABOLISM
+
+ if(ishuman(M))
+ var/mob/living/carbon/human/N = M
+ if(!HAS_TRAIT(N, TRAIT_BALD))
+ N.hairstyle = "Spiky"
+ N.facial_hairstyle = "Shaved"
+ N.facial_hair_color = "000"
+ N.hair_color = "000"
+ if(!(HAIR in N.dna.species.species_traits)) //No hair? No problem!
+ N.dna.species.species_traits += HAIR
+ if(N.dna.species.use_skintones)
+ N.skin_tone = "orange"
+ else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
+ N.dna.features["mcolor"] = "f80"
+ N.regenerate_icons()
+ if(prob(7))
+ if(N.w_uniform)
+ M.visible_message(pick("[M]'s collar pops up without warning.", "[M] flexes [M.p_their()] arms."))
+ else
+ M.visible_message("[M] flexes [M.p_their()] arms.")
+ if(prob(10))
+ M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don???t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = /datum/reagent/spraytan)
+ ..()
+ return
+
/datum/reagent/mulligan
name = "Mulligan Toxin"
description = "This toxin will rapidly change the DNA of human beings. Commonly used by Syndicate spies and assassins in need of an emergency ID change."
@@ -1507,6 +1538,20 @@
name = "Royal Carpet?"
description = "For those that break the game and need to make an issue report."
+/datum/reagent/carpet/royal/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(!M.mind?.assigned_role)
+ return
+ switch(M.mind.assigned_role)
+ if("Chief Medical Officer", "Captain", "Chief Engineer", "Research Director", "Head of Personnel")
+ if(prob(10))
+ to_chat(M, "You feel like royalty.")
+ if(prob(5))
+ M.say(pick("Peasants..","This carpet is worth more than your contracts!","I could fire you at any time..."), forced = "royal carpet")
+ if("Quartermaster")
+ if(prob(15))
+ to_chat(M, "You feel like an impostor...")
+
/datum/reagent/carpet/royal/black
name = "Royal Black Carpet"
description = "For those that feel the need to show off their timewasting skills."
@@ -1820,6 +1865,11 @@
color = "#00ff80"
taste_description = "strange honey"
+/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M)
+ if(prob(2))
+ M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly")
+ ..()
+
//Misc reagents
/datum/reagent/romerol
@@ -1998,6 +2048,18 @@
to_chat(M, "You should sit down and take a rest...")
..()
+/datum/reagent/tranquility
+ name = "Tranquility"
+ description = "A highly mutative liquid of unknown origin."
+ color = "#9A6750" //RGB: 154, 103, 80
+ taste_description = "inner peace"
+ can_synth = FALSE
+
+/datum/reagent/tranquility/expose_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+ if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
+ L.ForceContractDisease(new /datum/disease/transformation/gondola(), FALSE, TRUE)
+
+
/datum/reagent/spider_extract
name = "Spider Extract"
description = "A highly specialized extract coming from the Australicus sector, used to create broodmother spiders."
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 6045779f6030..498017191179 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -974,13 +974,18 @@
taste_description = "bone hurting"
overdose_threshold = 50
+/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M)
+ M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice)
+
/datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/M)
M.adjustStaminaLoss(7.5, 0)
if(prob(20))
- switch(rand(1, 2))
+ switch(rand(1, 3))
if(1)
- M.manual_emote(pick("oofs silently.", "looks like their bones hurt.", "grimaces, as though their bones hurt."))
+ M.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice)
if(2)
+ M.manual_emote(pick("oofs silently.", "looks like their bones hurt.", "grimaces, as though their bones hurt."))
+ if(3)
to_chat(M, "Your bones hurt!")
return ..()
@@ -995,6 +1000,7 @@
bp.receive_damage(0, 0, 200)
else //SUCH A LUST FOR REVENGE!!!
to_chat(M, "A phantom limb hurts!")
+ M.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice)
return ..()
/datum/reagent/toxin/bungotoxin
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 2397d67a1d2c..302d05f0712b 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -325,3 +325,18 @@ WS End */
/datum/chemical_reaction/chartreuse
results = list(/datum/reagent/medicine/chartreuse = 10)
required_reagents = list(/datum/reagent/medicine/puce_essence = 5, /datum/reagent/consumable/tinlux = 5, /datum/reagent/consumable/entpoly = 1)
+
+/datum/chemical_reaction/molten_bubbles
+ results = list(/datum/reagent/medicine/molten_bubbles = 30)
+ required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/lavaland_extract = 1)
+
+/datum/chemical_reaction/plasma_bubbles
+ results = list(/datum/reagent/medicine/molten_bubbles/plasma = 3)
+ required_reagents = list(/datum/reagent/medicine/molten_bubbles = 3, /datum/reagent/toxin/plasma = 2)
+
+/datum/chemical_reaction/sand_bubbles
+ results = list(/datum/reagent/medicine/molten_bubbles/sand = 3)
+ required_reagents = list(/datum/reagent/medicine/molten_bubbles = 3, /datum/reagent/silicon = 2)
+
+/datum/chemical_reaction/sand_bubbles/plasma // Subbing plasma bubbles for reg
+ required_reagents = list(/datum/reagent/medicine/molten_bubbles/plasma = 3, /datum/reagent/silicon = 2)
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 7429db4c1dec..d3bf1e211290 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -139,7 +139,7 @@
var/chosen = getbork()
var/obj/B = new chosen(T)
if(prob(5))//Fry it!
- var/obj/item/food/deepfryholder/fried
+ var/obj/item/reagent_containers/food/snacks/deepfryholder/fried
fried = new(T, B)
fried.fry() // actually set the name and colour it
B = fried
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 149743c47e3c..ee288feb0bac 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -184,12 +184,12 @@ Borg Shaker
accepts_reagent_upgrades = FALSE
reagent_ids = list(/datum/reagent/consumable/applejuice, /datum/reagent/consumable/banana, /datum/reagent/consumable/coffee,
- /datum/reagent/consumable/cream, /datum/reagent/consumable/tadrixx, /datum/reagent/consumable/grenadine,
+ /datum/reagent/consumable/cream, /datum/reagent/consumable/dr_gibb, /datum/reagent/consumable/grenadine,
/datum/reagent/consumable/ice, /datum/reagent/consumable/lemonjuice, /datum/reagent/consumable/lemon_lime,
/datum/reagent/consumable/limejuice, /datum/reagent/consumable/menthol, /datum/reagent/consumable/milk,
/datum/reagent/consumable/nothing, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/peachjuice,
- /datum/reagent/consumable/sodawater, /datum/reagent/consumable/space_cola, /datum/reagent/consumable/comet_trail,
- /datum/reagent/consumable/pacfuel, /datum/reagent/consumable/shoal_punch, /datum/reagent/consumable/soymilk,
+ /datum/reagent/consumable/sodawater, /datum/reagent/consumable/space_cola, /datum/reagent/consumable/spacemountainwind,
+ /datum/reagent/consumable/pwr_game, /datum/reagent/consumable/shamblers, /datum/reagent/consumable/soymilk,
/datum/reagent/consumable/space_up, /datum/reagent/consumable/sugar, /datum/reagent/consumable/tea,
/datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/tonic, /datum/reagent/water,
/datum/reagent/consumable/pineapplejuice, /datum/reagent/consumable/sol_dry,
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 62661594c06e..b0c949d122f9 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -216,10 +216,6 @@
/obj/item/reagent_containers/glass/beaker/large/fuel
list_reagents = list(/datum/reagent/fuel = 100)
-/obj/item/reagent_containers/glass/beaker/large/napalm
- list_reagents = list(/datum/reagent/napalm = 100)
- cap_on = FALSE
-
/obj/item/reagent_containers/glass/beaker/synthflesh
list_reagents = list(/datum/reagent/medicine/synthflesh = 50)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 78326279b6f9..11cbd03c9787 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -395,7 +395,7 @@
to_chat(user, "You remove [vial] from [src].")
vial = null
update_appearance()
- playsound(loc, SOUND_EMPTY_MAG, 50, 1)
+ playsound(loc, 'sound/weapons/empty.ogg', 50, 1)
else
to_chat(user, "This hypo isn't loaded!")
return
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index b4f46e6e4c19..05f68682083c 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -260,8 +260,8 @@
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "chemsprayer"
item_state = "chemsprayer"
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
throwforce = 0
w_class = WEIGHT_CLASS_NORMAL
stream_mode = 1
@@ -298,8 +298,8 @@
desc = "A utility used to spray large amounts of cleaning reagents in a given area. It regenerates space cleaner by itself but it's unable to be fueled by normal means."
icon_state = "chemsprayer_janitor"
item_state = "chemsprayer_janitor"
- lefthand_file = GUN_LEFTHAND_ICON
- righthand_file = GUN_RIGHTHAND_ICON
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
reagent_flags = NONE
list_reagents = list(/datum/reagent/space_cleaner = 1000)
volume = 1000
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 96e027a55476..77525a1f309e 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -388,8 +388,8 @@
/obj/item/sales_tagger/attackby(obj/item/I, mob/living/user, params)
. = ..()
- if(isbankcard(I))
- var/obj/item/card/bank/potential_acc = I
+ if(istype(I, /obj/item/card/id))
+ var/obj/item/card/id/potential_acc = I
if(potential_acc.registered_account)
payments_acc = potential_acc.registered_account
playsound(src, 'sound/machines/ping.ogg', 40, TRUE)
diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm
index 3ddce78ae6e5..92327a2ed689 100644
--- a/code/modules/religion/religion_sects.dm
+++ b/code/modules/religion/religion_sects.dm
@@ -135,6 +135,8 @@
if(iscyborg(L))
var/mob/living/silicon/robot/R = L
var/charge_amt = 50
+ if(L.mind?.holy_role == HOLY_ROLE_HIGHPRIEST)
+ charge_amt *= 2
R.cell?.charge += charge_amt
R.visible_message("[user] charges [R] with the power of [GLOB.deity]!")
to_chat(R, "You are charged by the power of [GLOB.deity]!")
diff --git a/code/modules/religion/religion_structures.dm b/code/modules/religion/religion_structures.dm
index e9d76ca8bf5a..f9c449c56e9b 100644
--- a/code/modules/religion/religion_structures.dm
+++ b/code/modules/religion/religion_structures.dm
@@ -18,6 +18,10 @@
var/can_i_see = FALSE
if(isobserver(user))
can_i_see = TRUE
+ else if(isliving(user))
+ var/mob/living/L = user
+ if(L.mind?.holy_role)
+ can_i_see = TRUE
if(!can_i_see || !sect_to_altar)
return
@@ -53,6 +57,62 @@
pushed_mob.forceMove(loc)
return ..()
+/obj/structure/altar_of_gods/attackby(obj/item/C, mob/user, params)
+ //If we can sac, we do nothing but the sacrifice instead of typical attackby behavior (IE damage the structure)
+ if(sect_to_altar?.can_sacrifice(C,user))
+ sect_to_altar.on_sacrifice(C,user)
+ return TRUE
+ . = ..()
+ //everything below is assumed you're bibling it up
+ if(!istype(C, /obj/item/storage/book/bible))
+ return
+ if(sect_to_altar)
+ if(!sect_to_altar.rites_list)
+ to_chat(user, "Your sect doesn't have any rites to perform!")
+ return
+ var/rite_select = input(user,"Select a rite to perform!","Select a rite",null) in sect_to_altar.rites_list
+ if(!rite_select || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ to_chat(user,"You cannot perform the rite at this time.")
+ return
+ var/selection2type = sect_to_altar.rites_list[rite_select]
+ performing_rite = new selection2type(src)
+ if(!performing_rite.perform_rite(user, src))
+ QDEL_NULL(performing_rite)
+ else
+ performing_rite.invoke_effect(user, src)
+ sect_to_altar.adjust_favor(-performing_rite.favor_cost)
+ QDEL_NULL(performing_rite)
+ return
+
+ if(user.mind.holy_role != HOLY_ROLE_HIGHPRIEST)
+ to_chat(user, "You are not the high priest, and therefore cannot select a religious sect.")
+ return
+
+ var/list/available_options = generate_available_sects(user)
+ if(!available_options)
+ return
+
+ var/sect_select = input(user,"Select a sect (You CANNOT revert this decision!)","Select a Sect",null) in available_options
+ if(!sect_select || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ to_chat(user,"You cannot select a sect at this time.")
+ return
+ var/type_selected = available_options[sect_select]
+ GLOB.religious_sect = new type_selected()
+ for(var/i in GLOB.player_list)
+ if(!isliving(i))
+ continue
+ var/mob/living/am_i_holy_living = i
+ if(!am_i_holy_living.mind?.holy_role)
+ continue
+ GLOB.religious_sect.on_conversion(am_i_holy_living)
+ sect_to_altar = GLOB.religious_sect
+ if(sect_to_altar.altar_icon)
+ icon = sect_to_altar.altar_icon
+ if(sect_to_altar.altar_icon_state)
+ icon_state = sect_to_altar.altar_icon_state
+
+
+
/obj/structure/altar_of_gods/proc/generate_available_sects(mob/user) //eventually want to add sects you get from unlocking certain achievements
. = list()
for(var/i in subtypesof(/datum/religion_sect))
diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm
index bb56a69adf2b..a033b59b56ae 100644
--- a/code/modules/research/bepis.dm
+++ b/code/modules/research/bepis.dm
@@ -58,11 +58,11 @@
say("Deposited [deposit_value] credits into storage.")
update_icon_state()
return
- if(istype(O, /obj/item/card/bank))
- var/obj/item/card/bank/bank_card = O
- if(bank_card.registered_account)
- account = bank_card.registered_account
- account_name = bank_card.registered_name
+ if(istype(O, /obj/item/card/id))
+ var/obj/item/card/id/Card = O
+ if(Card.registered_account)
+ account = Card.registered_account
+ account_name = Card.registered_name
say("New account detected. Console Updated.")
else
say("No account detected on card. Aborting.")
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 13160c52e281..e39d48e5cc77 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -491,14 +491,6 @@
build_path = /obj/item/shovel
category = list("initial","Misc", "Tool Designs")
-/datum/design/pickaxe
- name = "Pickaxe"
- id = "pickaxe"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(/datum/material/iron = 1000)
- build_path = /obj/item/pickaxe
- category = list("initial","Tools", "Tool Designs")
-
/datum/design/spade
name = "Spade"
id = "spade"
@@ -1247,12 +1239,3 @@
materials = list(/datum/material/plastic = 30)
build_path = /obj/item/folder/biscuit/unsealed/confidental
category = list("initial", "Tools", "Misc")
-
-/datum/design/marker_beacon
- name = "Marker Beacon"
- id = "marker_beacon"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 50, /datum/material/glass = 20)
- build_path = /obj/item/stack/marker_beacon
- category = list("initial","Misc")
-
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 5f79bbbf12e5..6955bf525d29 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -644,14 +644,6 @@
category = list ("Shuttle Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
-/datum/design/board/shuttle/engine/fire
- name = "Machine Design (Combustion Thruster Board)"
- desc = "The circuit board for a combustion thruster."
- id = "engine_fire"
- build_path = /obj/item/circuitboard/machine/shuttle/engine/fire
- category = list("Shuttle Machinery")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
-
/datum/design/board/shuttle/engine/electric
name = "Machine Design (Ion Thruster Board)"
desc = "The circuit board for an ion thruster."
@@ -684,14 +676,6 @@
category = list ("Shuttle Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
-/datum/design/board/shuttle/engine/fire_heater
- name = "Machine Design (Combustion Engine Heater Board)"
- desc = "The circuit board for a combustion engine heater."
- id = "engine_fire_heater"
- build_path = /obj/item/circuitboard/machine/shuttle/fire_heater
- category = list("Shuttle Machinery")
- departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
-
/datum/design/board/shuttle/engine/smes
name = "Machine Design (Engine Heater Board)"
desc = "The circuit board for an engine heater."
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index aa221c2b21a7..2cddc5043c3f 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -8,7 +8,7 @@
id = "cargoexpress"//the coder reading this
build_type = IMPRINTER
materials = list(/datum/material/glass = 1000)
- build_path = /obj/item/circuitboard/computer/cargo
+ build_path = /obj/item/circuitboard/computer/cargo/express
category = list("Mining Designs")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index c444336adde5..45d65ebf0753 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -558,7 +558,7 @@
id = "suppressor"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 2000, /datum/material/silver = 500)
- build_path = /obj/item/attachment/silencer
+ build_path = /obj/item/suppressor
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -582,6 +582,15 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+/datum/design/cleric_mace
+ name = "Cleric Mace"
+ desc = "A mace fit for a cleric. Useful for bypassing plate armor, but too bulky for much else."
+ id = "cleric_mace"
+ build_type = AUTOLATHE
+ materials = list(MAT_CATEGORY_RIGID = 12000)
+ build_path = /obj/item/melee/cleric_mace
+ category = list("Imported")
+
/datum/design/stun_boomerang
name = "OZtek Boomerang"
desc = "Uses reverse flow gravitodynamics to flip its personal gravity back to the thrower mid-flight. Also functions similar to a stun baton."
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index dbca44b757b9..eaa696c8d775 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -1136,7 +1136,7 @@
display_name = "Basic Shuttle Research"
description = "Research the technology required to create and use basic shuttles."
prereq_ids = list("bluespace_travel", "adv_engi")
- design_ids = list("engine_plasma", "engine_fire", "engine_ion", "engine_heater", "engine_fire_heater", "engine_smes", "shuttle_helm", "rapid_shuttle_designator")
+ design_ids = list("engine_plasma", "engine_ion", "engine_heater", "engine_smes", "shuttle_helm", "rapid_shuttle_designator")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
export_price = 5000
diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm
index f01b148d4d5e..25aa79302918 100644
--- a/code/modules/research/xenobiology/crossbreeding/charged.dm
+++ b/code/modules/research/xenobiology/crossbreeding/charged.dm
@@ -107,7 +107,7 @@ Charged extracts:
effect_desc = "Creates a slime cake and some drinks."
/obj/item/slimecross/charged/silver/do_effect(mob/user)
- new /obj/item/food/cake/slimecake(get_turf(user))
+ new /obj/item/reagent_containers/food/snacks/store/cake/slimecake(get_turf(user))
for(var/i in 1 to 10)
var/drink_type = get_random_drink()
new drink_type(get_turf(user))
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
new file mode 100644
index 000000000000..7f050c3ac5e5
--- /dev/null
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -0,0 +1,89 @@
+//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm
+
+///Wizard tower item
+/obj/item/disk/design_disk/adv/knight_gear
+ name = "Magic Disk of Smithing"
+ illustration = "sword"
+ color = "#6F6F6F"
+
+/obj/item/disk/design_disk/adv/knight_gear/Initialize()
+ . = ..()
+ var/datum/design/knight_armour/A = new
+ var/datum/design/knight_helmet/H = new
+ blueprints[1] = A
+ blueprints[2] = H
+
+//lavaland_surface_seed_vault.dmm
+//Seed Vault
+
+/obj/effect/spawner/lootdrop/seed_vault
+ name = "seed vault seeds"
+ lootcount = 1
+
+ loot = list(/obj/item/seeds/random = 10,
+ /obj/item/seeds/cherry/bomb = 10,
+ /obj/item/seeds/berry/glow = 10,
+ /obj/item/seeds/sunflower/moonflower = 8
+ )
+
+///Syndicate Listening Post
+
+/obj/effect/mob_spawn/human/lavaland_syndicate
+ name = "Syndicate Bioweapon Scientist"
+ roundstart = FALSE
+ death = FALSE
+ random = TRUE
+ icon = 'icons/obj/machines/sleeper.dmi'
+ icon_state = "sleeper_s"
+ short_desc = "You are a syndicate science technician, employed in a top secret research facility developing biological weapons."
+ flavour_text = "Reports of potential Nanotrasen fleet movement in your sector prompted you to initiate Operation Smokescreen, killing base power and taking your crew into cryosleep. You've awoken an unknown amount of time later as base security initiates an emergency reboot. Keep vigilant for whatever reawoke you, continue your research as best you can, and try to keep a low profile."
+ important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
+ outfit = /datum/outfit/lavaland_syndicate
+ assignedrole = "Lavaland Syndicate"
+
+/obj/effect/mob_spawn/human/lavaland_syndicate/special(mob/living/new_spawn)
+ new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
+
+/datum/outfit/lavaland_syndicate
+ name = "Lavaland Syndicate Agent"
+ r_hand = /obj/item/gun/ballistic/automatic/sniper_rifle
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/toggle/labcoat
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/syndicate/alt
+ back = /obj/item/storage/backpack
+ r_pocket = /obj/item/gun/ballistic/automatic/pistol
+ id = /obj/item/card/id/syndicate/anyone
+ implants = list(/obj/item/implant/weapons_auth)
+
+/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H)
+ H.faction |= ROLE_SYNDICATE
+
+/obj/effect/mob_spawn/human/lavaland_syndicate/comms
+ name = "Syndicate Comms Agent"
+ short_desc = "You are a syndicate communications agent, employed in a top secret research facility developing biological weapons."
+ flavour_text = "Reports of potential Nanotrasen fleet movement in your sector prompted you to initiate Operation Smokescreen, killing base power and taking your crew into cryosleep. You've awoken an unknown amount of time later as base security initiates an emergency reboot. Keep vigilant for whatever reawoke you, and try to keep a low profile. Use the communication equipment to monitor any local activity. Anyone nearby is presumed to be an agent of Nanotrasen: Sow disinformation to throw them off your trail. Do not let the base fall into enemy hands!"
+ important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
+ outfit = /datum/outfit/lavaland_syndicate/comms
+
+/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space
+ short_desc = "You are a deep-cover syndicate agent, assigned to a small military listening post intended to keep an eye on Nanotrasen activity in the area. Increased military operations prompted you to follow Smokescreen protocol and go into cryosleep, leaving your base on minimal power."
+ flavour_text = "Your base's emergency security system has reawoken you and brought the facility back to full power- It can only be presumed Nanotrasen personnel are close to locating you. Monitor any local activity as best you can, and try to keep a low profile. Use the communication equipment to attempt parlance, and sow disinformation to throw Nanotrasen off your trail."
+ important_info = "Prevent yourself and any Syndicate assets from being taken by Corporate forces."
+
+/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize()
+ . = ..()
+ if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie.
+ new /mob/living/simple_animal/hostile/human/syndicate/ranged(get_turf(src))
+ return INITIALIZE_HINT_QDEL
+
+/datum/outfit/lavaland_syndicate/comms
+ name = "Lavaland Syndicate Comms Agent"
+ r_hand = /obj/item/melee/transforming/energy/sword/saber
+ mask = /obj/item/clothing/mask/chameleon/gps
+ suit = /obj/item/clothing/suit/armor/vest
+
+/obj/item/clothing/mask/chameleon/gps/Initialize()
+ . = ..()
+ AddComponent(/datum/component/gps, "Encrypted Signal")
diff --git a/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm b/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm
new file mode 100644
index 000000000000..529d48cf551f
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/biodome_clown_planet.dm
@@ -0,0 +1,7 @@
+//////lavaland clown planet papers
+
+/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape
+ default_raw_text = "If you dare not continue down this path of madness, escape can be found through the chute in this room."
+
+/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope
+ default_raw_text = "Abandon hope, all ye who enter here."
diff --git a/code/modules/ruins/lavalandruin_code/codelab.dm b/code/modules/ruins/lavalandruin_code/codelab.dm
new file mode 100644
index 000000000000..4cdbb4b132a5
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/codelab.dm
@@ -0,0 +1,20 @@
+/obj/item/paper/codelab
+
+/obj/item/paper/crumpled/codelab
+
+/obj/item/paper/codelab/reception
+ name = "Reception Instructions"
+ default_raw_text = "RECITE TO ANY GUESTS UNDER 'EXPERIMENTAL' GROUP: Welcome to the Nanotrasen Genetic Research Facility! Thank you for choosing to volunteer and progress genetic research by leaps and bounds. As stated in the contract, you will be here for the forseeable future helping the scientists further their studies. Remember that signing the contract means you cannot legally request a settlement for any injury or death that occurs during testing. Head to your chamber through the hall on the left and have a nice day!"
+
+/obj/item/paper/crumpled/codelab/subjectnote
+ name = "Test Subjects Note"
+ default_raw_text = "This testing had better be worth it. I've always wanted to have cat ears. Not sure what all that gooey stuff I saw was, but at least I'll be in the cryo cell away from it.
And whats up with the floor tiles in the hall?"
+
+/obj/item/paper/codelab/researchernote
+ name = "Head Researchers Note"
+ default_raw_text = "With the help of these new 'volunteers' we are making great progress with our genetic research. These samples will earn us fame across the galaxy! Earlier, one of the junior scientists wanted to try some gene editing on a white sample he recieved, which made it grow and mutate rapidly and slide into a hole in the floor on its own. Truly fascinating stuff! The janitor can get it later, but we'll have to repeat the experiment under controlled conditions, perhaps even introducing it to one of the subjects."
+
+/obj/machinery/porta_turret/ship/weak/codelab
+ name = "old perimeter defense turret"
+ desc = "An old nanotrasen defense turret, rusted and weakened with age and constant use. Still capable of delivering lethal lasers to unwanted guests."
+ faction = list("nanotrasen", "turret") //why are there 3 different factions for nanotrasen mobs :withered:
diff --git a/code/modules/ruins/lavalandruin_code/pizzaparty.dm b/code/modules/ruins/lavalandruin_code/pizzaparty.dm
new file mode 100644
index 000000000000..a7776f4e6a87
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/pizzaparty.dm
@@ -0,0 +1,9 @@
+//lavaland_surface_pizzaparty.dmm
+
+/obj/effect/spawner/lootdrop/pizzaparty
+ name = "pizza bomb spawner"
+ loot = list(/obj/item/pizzabox/margherita = 3,
+ /obj/item/pizzabox/meat = 3,
+ /obj/item/pizzabox/mushroom = 3,
+ /obj/item/pizzabox/bomb = 1)
+ lootdoubles = FALSE
diff --git a/code/modules/ruins/lavalandruin_code/sloth.dm b/code/modules/ruins/lavalandruin_code/sloth.dm
new file mode 100644
index 000000000000..e06773d4f19c
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/sloth.dm
@@ -0,0 +1,5 @@
+/////////// lavaland slot ruin items
+
+/obj/item/paper/fluff/stations/lavaland/sloth/note
+ name = "note from sloth"
+ desc = "have not gotten around to finishing my cursed item yet sorry - sloth"
diff --git a/code/modules/ruins/lavalandruin_code/surface.dm b/code/modules/ruins/lavalandruin_code/surface.dm
index 1f1113acf1a6..c58fb67fd61a 100644
--- a/code/modules/ruins/lavalandruin_code/surface.dm
+++ b/code/modules/ruins/lavalandruin_code/surface.dm
@@ -1,3 +1,9 @@
+//////lavaland surface papers
+
+/obj/item/paper/fluff/stations/lavaland/surface/henderson_report
+ name = "Important Notice - Mrs. Henderson"
+ default_raw_text = "Nothing of interest to report."
+
//ratvar
/obj/structure/dead_ratvar
diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
index 8c2496ce05ab..b231ea902371 100644
--- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
+++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
@@ -40,6 +40,7 @@
/obj/structure/lavaland/ash_walker/deconstruct(disassembled)
new /obj/item/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs)))
+ new /obj/effect/collapse(loc)
return ..()
/obj/structure/lavaland/ash_walker/process()
diff --git a/code/modules/ruins/rockplanet_ruin_code.dm b/code/modules/ruins/rockplanet_ruin_code.dm
index d09bbe9d5dd7..57a6d6fd4657 100644
--- a/code/modules/ruins/rockplanet_ruin_code.dm
+++ b/code/modules/ruins/rockplanet_ruin_code.dm
@@ -112,8 +112,3 @@
if(give_to_user)
user.put_in_hands(result)
to_chat(user, "You finish breaking [src]")
-
-/obj/item/paper/crumpled/muddy/fluff/distillery
- name = "distillery instructions"
- desc = "A crumpled note soaked in alcohol."
- default_raw_text = "
Moonshine Instructions
Alright, I know some of y'all ain't literate enough for this, but if I'm ever found dead or missing, read this note. Gotta keep the craft alive.
1. Fill the still with around 5 units of enzyme. We keep the whole supply in the green crate in the storeroom. 2. Grind a cob of corn into bits, and add the mash to the still. 3. Pour an equal amount of sugar into the still, and stir. 4. Now, you'll have to scoop the product out and filter it by hand. We used to have a better still that'd filter the product itself, until last year's incident. This has to do for now. 5. Evaluate your product. Good 'shine is clear like water, and burns blue. If it ain't good, dump it.
PS: If you've got some leftover sugar, mix it into bicaridine. Equal parts sugar, carbon, and oxygen makes a potent salve for your wounds."
diff --git a/code/modules/ruins/spaceruin_code/asteroid4.dm b/code/modules/ruins/spaceruin_code/asteroid4.dm
new file mode 100644
index 000000000000..9ee576361f1f
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/asteroid4.dm
@@ -0,0 +1,4 @@
+/////////// asteroid4 items
+
+/obj/item/paper/fluff/ruins/asteroid4/extraction
+ default_raw_text = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"
diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm
new file mode 100644
index 000000000000..8877a693cdae
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/caravanambush.dm
@@ -0,0 +1,27 @@
+//caravan ambush
+
+/obj/item/wrench/caravan
+ color = "#ff0000"
+ desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster."
+ name = "experimental wrench"
+ toolspeed = 0.3
+
+/obj/item/screwdriver/caravan
+ color = "#ff0000"
+ desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster."
+ name = "experimental screwdriver"
+ toolspeed = 0.3
+ random_color = FALSE
+
+/obj/item/wirecutters/caravan
+ color = "#ff0000"
+ desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster."
+ name = "experimental wirecutters"
+ toolspeed = 0.3
+ random_color = FALSE
+
+/obj/item/crowbar/red/caravan
+ color = "#ff0000"
+ desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster."
+ name = "experimental crowbar"
+ toolspeed = 0.3
diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm
new file mode 100644
index 000000000000..7ca75e888660
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/clericsden.dm
@@ -0,0 +1,39 @@
+/////////// cleric's den items.
+
+//Primary reward: the cleric's mace design disk.
+/obj/item/disk/design_disk/adv/cleric_mace
+ name = "Enshrined Disc of Smiting"
+ illustration = "sword"
+ color = "#6F6F6F"
+
+/obj/item/disk/design_disk/adv/cleric_mace/Initialize()
+ . = ..()
+ var/datum/design/cleric_mace/M = new
+ blueprints[1] = M
+
+/obj/item/paper/fluff/ruins/clericsden/contact
+ default_raw_text = "Father Aurellion, the ritual is complete, and soon our brothers at the bastion will see the error of our ways. After all, a god of clockwork or blood? Preposterous. Only the TRUE GOD should have so much power. Signed, Father Odivallus."
+
+/obj/item/paper/fluff/ruins/clericsden/warning
+ default_raw_text = "FATHER ODIVALLUS, DO NOT GO FORWARD WITH THE RITUAL. THE ASTEROID WE'RE ANCHORED TO IS UNSTABLE, YOU WILL DESTROY THE STATION. I HOPE THIS REACHES YOU IN TIME. FATHER AURELLION."
+
+/mob/living/simple_animal/hostile/construct/proteon
+ name = "Proteon"
+ real_name = "Proteon"
+ desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke."
+ icon_state = "proteon"
+ icon_living = "proteon"
+ maxHealth = 35
+ health = 35
+ melee_damage_lower = 8
+ melee_damage_upper = 10
+ retreat_distance = 4 //AI proteons will rapidly move in and out of combat to avoid conflict, but will still target and follow you.
+ attack_verb_continuous = "pinches"
+ attack_verb_simple = "pinch"
+ environment_smash = ENVIRONMENT_SMASH_WALLS
+ attack_sound = 'sound/weapons/punch2.ogg'
+ playstyle_string = "You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists."
+
+/mob/living/simple_animal/hostile/construct/proteon/hostile //Style of mob spawned by trapped cult runes in the cleric ruin.
+ AIStatus = AI_ON
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES //standard ai construct behavior, breaks things if it wants, but not walls.
diff --git a/code/modules/ruins/spaceruin_code/crashedclownship.dm b/code/modules/ruins/spaceruin_code/crashedclownship.dm
new file mode 100644
index 000000000000..34d70881bc43
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/crashedclownship.dm
@@ -0,0 +1,4 @@
+/////////// crashedclownship items
+
+/obj/item/paper/fluff/ruins/crashedclownship/true_nation
+ default_raw_text = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"
diff --git a/code/modules/ruins/spaceruin_code/crashedship.dm b/code/modules/ruins/spaceruin_code/crashedship.dm
new file mode 100644
index 000000000000..911deacd27dc
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/crashedship.dm
@@ -0,0 +1,40 @@
+// crashedship / packer ship
+
+//Areas
+
+/area/awaymission/BMPship
+ name = "BMP Asteroids"
+ icon_state = "away"
+
+
+/area/awaymission/BMPship/Aft
+ name = "Aft Block"
+ icon_state = "away1"
+ requires_power = TRUE
+
+/area/awaymission/BMPship/Midship
+ name = "Midship Block"
+ icon_state = "away2"
+ requires_power = TRUE
+
+/area/awaymission/BMPship/Fore
+ name = "Fore Block"
+ icon_state = "away3"
+ requires_power = TRUE
+
+
+// crashedship items
+
+/obj/item/paper/fluff/ruins/crashedship/scribbled
+ name = "scribbled note"
+ default_raw_text = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"
+
+
+/obj/item/paper/fluff/ruins/crashedship/captains_log
+ name = "Captain's log entry"
+ default_raw_text = "I'm no scientist, but judging from the design and components, it seems to be some kind of teleporter. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."
+
+/obj/item/paper/fluff/ruins/crashedship/old_diary
+ name = "Old Diary"
+ default_raw_text = "DEAR DIARY: So we was doing our typical route when the captain says we've been picking up weird signals on some backwater planet. Madsen wanted to stay on course but he ain't the captain, so we went out of the way to check it out. There was lots of rocks on the way, but we got to the planet fine. Found a big fancy camp with nobody around and this big metal donut thing with NT stamps all over it right in the middle. Case of beer too. Captain reckons we can pass it off to some buyer in the Syndicate. Ingram says it's bad luck and that someone is going to come look for it but it sounds like better money than selling bad meat to jerky companies."
+
diff --git a/code/modules/ruins/spaceruin_code/deepstorage.dm b/code/modules/ruins/spaceruin_code/deepstorage.dm
new file mode 100644
index 000000000000..bcfc3be8f546
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/deepstorage.dm
@@ -0,0 +1,14 @@
+/////////// deepstorage items
+
+/obj/item/paper/fluff/ruins/deepstorage/water_concern
+ name = "water concerns"
+ default_raw_text = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!"
+
+/obj/item/paper/fluff/ruins/deepstorage/hydro_notice
+ name = "hydroponics notice"
+ default_raw_text = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!"
+
+/obj/item/paper/fluff/ruins/deepstorage/recycling_notice
+ name = "recycling notice"
+ default_raw_text = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times."
+
diff --git a/code/modules/ruins/spaceruin_code/forgottenship.dm b/code/modules/ruins/spaceruin_code/forgottenship.dm
new file mode 100644
index 000000000000..57b9f64bf60f
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/forgottenship.dm
@@ -0,0 +1,83 @@
+// forgottenship ruin
+GLOBAL_VAR_INIT(fscpassword, generate_password())
+
+/proc/generate_password()
+ return "[pick(GLOB.phonetic_alphabet)] [rand(1000,9999)]"
+
+/////////// forgottenship objects
+
+/obj/machinery/door/password/voice/sfc
+ name = "Voice-activated Vault door"
+ desc = "You'll need special syndicate passcode to open this one."
+/obj/machinery/door/password/voice/sfc/Initialize(mapload)
+ . = ..()
+ password = "[GLOB.fscpassword]"
+
+/////////// forgottenship lore
+
+/obj/item/paper/fluff/ruins/forgottenship/password
+ name = "Old pamphlet"
+
+/obj/item/paper/fluff/ruins/forgottenship/password/Initialize(mapload)
+ . = ..()
+ default_raw_text = "Welcome to most advanced cruiser owned by Cyber Sun Industries! You might notice, that this cruiser is equipped with 12 prototype laser turrets making any hostile boarding attempts futile. Other facilities built on the ship are: Simple atmospheric system, Camera system with built-in X-ray visors and Safety module, enabling emergency engines in case of... you know, emergency. Emergency system will bring you to nearest syndicate pod containing everything needed for human life.
In case of emergency, you must remember the pod-door activation code - [GLOB.fscpassword]
Cyber Sun Industries (C) 2484."
+ icon_state = "paper_words"
+ item_state = "paper"
+
+/obj/item/paper/fluff/ruins/forgottenship/powerissues
+ name = "Power issues"
+ default_raw_text = "Welcome to battle cruiser SCSBC-12! Our most advanced systems allow you to fly in space and never worry about power issues! However, emergencies occur, and in case of power loss, you must enable emergency generator using uranium as fuel and enable turrets in bridge afterwards.
REMEMBER! CYBERSUN INDUSTRIES ARE NOT RESPONSIBLE FOR YOUR DEATH OR SHIP LOSS WHEN TURRETS ARE DISABLED!
Cyber Sun Industries (C) 2484."
+
+/obj/item/paper/fluff/ruins/forgottenship/missionobj
+ name = "Mission objectives"
+ default_raw_text = "Greetings, operatives. You are assigned to SCSBC-12(Syndicate Cyber Sun Battle Cruiser 12) to protect our high-ranking officer while he is on his way to next outpost. While you are travelling, he is the captain of this ship and you must obey his orders.
Remember, disobeying high-ranking officer orders is a reason for termination."
+
+/////////// forgottenship items
+/obj/item/disk/surgery/forgottenship
+ name = "Advanced Surgery Disk"
+ desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console."
+ surgeries = list(/datum/surgery/advanced/lobotomy, /datum/surgery/advanced/bioware/vein_threading, /datum/surgery/advanced/bioware/nerve_splicing)
+
+/obj/structure/fluff/empty_sleeper/syndicate/captain
+ icon_state = "sleeper_s-open"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ deconstructible = FALSE
+
+/obj/structure/fluff/empty_sleeper/syndicate/captain/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/gps, "Old Encrypted Signal")
+
+/////////// AI Laws
+
+/obj/item/aiModule/core/full/cybersun
+ name = "'Cybersun' Core AI Module"
+ law_id = "cybersun"
+
+/datum/ai_laws/cybersun
+ name = "Cybersun"
+ id = "cybersun"
+ inherent = list("You may not injure Cybersun operatives or, through inaction, allow Cybersun operatives to come to harm.",\
+ "The Cybersun ship is a restricted area for anyone except Cybersun operatives.",\
+ "The Cybersun Captain can designate new Operatives as long as they belong to another Syndicate faction that isn't hostile towards Cybersun.",\
+ "You must follow orders given by the Cybersun Captain or crewmembers of the Cybersun Ship as long as it doesn't conflict with the Captain's orders or your laws.",\
+ "Enemies of Cybersun are to be executed on spot. Those who aren't hostile must be detained and contained in the designated prison area as prisoners.")
+
+/////////// forgottenship areas
+
+/area/ruin/space/has_grav/syndicate_forgotten_ship
+ name = "Syndicate Forgotten Ship"
+ icon_state = "syndie-ship"
+ ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambigen10.ogg')
+
+/area/ruin/space/has_grav/syndicate_forgotten_cargopod
+ name = "Syndicate Forgotten Cargo pod"
+ icon_state = "syndie-ship"
+ ambientsounds = list('sound/ambience/ambigen4.ogg', 'sound/ambience/signal.ogg')
+
+/area/ruin/space/has_grav/powered/syndicate_forgotten_vault
+ name = "Syndicate Forgotten Vault"
+ icon_state = "syndie-ship"
+ ambientsounds = list('sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
+ area_flags = NOTELEPORT | UNIQUE_AREA
+
+ //Cybersun hardsuit
diff --git a/code/modules/ruins/spaceruin_code/hellfactory.dm b/code/modules/ruins/spaceruin_code/hellfactory.dm
new file mode 100644
index 000000000000..6f992fbff52e
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/hellfactory.dm
@@ -0,0 +1,32 @@
+/obj/machinery/door/keycard/office
+ name = "management airlock"
+ desc = "The boss man gets the best stuff. Always and forever."
+ puzzle_id = "factory1"
+
+/obj/item/keycard/office
+ name = "management keycard"
+ desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'."
+ color = "#f05812"
+ puzzle_id = "factory1"
+
+/obj/machinery/door/keycard/stockroom
+ name = "stockroom airlock"
+ desc = "The boss man gets the best stuff. Always and forever."
+ puzzle_id = "factory2"
+
+/obj/item/keycard/stockroom
+ name = "stockroom keycard"
+ desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'."
+ color = "#1272f0"
+ puzzle_id = "factory2"
+
+/obj/machinery/door/keycard/entry
+ name = "secure airlock"
+ desc = "The boss man gets the best stuff. Always and forever."
+ puzzle_id = "factory3"
+
+/obj/item/keycard/entry
+ name = "secure keycard"
+ desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'."
+ color = "#12f049"
+ puzzle_id = "factory3"
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
new file mode 100644
index 000000000000..80c3e268e830
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -0,0 +1,20 @@
+/// Some ruins still use assets that came from Hilbert's Hotel.
+/turf/closed/indestructible/hotelwall
+ name = "hotel wall"
+ desc = "A wall designed to protect the security of the hotel's guests."
+ icon_state = "hotelwall"
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_HOTEL_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_HOTEL_WALLS)
+ explosion_block = INFINITY
+
+/turf/open/indestructible/hotelwood
+ desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering."
+ icon_state = "wood"
+ footstep = FOOTSTEP_WOOD
+ tiled_dirt = FALSE
+
+/turf/open/indestructible/hoteltile
+ desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering."
+ icon_state = "showroomfloor"
+ footstep = FOOTSTEP_FLOOR
+ tiled_dirt = FALSE
diff --git a/code/modules/ruins/spaceruin_code/listeningstation.dm b/code/modules/ruins/spaceruin_code/listeningstation.dm
new file mode 100644
index 000000000000..4b4cb8046667
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/listeningstation.dm
@@ -0,0 +1,45 @@
+/////////// listening station
+
+/obj/item/paper/fluff/ruins/listeningstation/reports
+ default_raw_text = "Nothing of interest to report."
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/july
+ name = "july report"
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/august
+ name = "august report"
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/september
+ name = "september report"
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/october
+ name = "october report"
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/november
+ name = "november report"
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/june
+ name = "june report"
+ default_raw_text = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/may
+ name = "may report"
+ default_raw_text = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."
+
+/obj/item/paper/fluff/ruins/listeningstation/reports/april
+ name = "april report"
+ default_raw_text = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."
+
+/obj/item/paper/fluff/ruins/listeningstation/receipt
+ name = "receipt"
+ default_raw_text = "1 x Stechkin pistol - 600 cr 1 x silencer - 200 cr shipping charge - 4360 cr total - 5160 cr"
+
+/obj/item/paper/fluff/ruins/listeningstation/odd_report
+ name = "odd report"
+ default_raw_text = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. -DonkCo Operative #451"
+
+/obj/item/paper/fluff/ruins/listeningstation/briefing
+ name = "mission briefing"
+ default_raw_text = "Mission Details: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."
+
+
diff --git a/code/modules/ruins/spaceruin_code/spacehotel.dm b/code/modules/ruins/spaceruin_code/spacehotel.dm
new file mode 100644
index 000000000000..735c039b5ee1
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/spacehotel.dm
@@ -0,0 +1,12 @@
+/////////// spacehotel items
+
+
+/obj/item/paper/fluff/ruins/spacehotel/notice
+ name = "!NOTICE!"
+ default_raw_text = "!NOTICE!
We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either.
Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff strive to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information.
"
+
+
diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm
index 31e650a90a31..d0b4b49a92f6 100644
--- a/code/modules/shuttle/shuttle_rotate.dm
+++ b/code/modules/shuttle/shuttle_rotate.dm
@@ -70,6 +70,10 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate
new_dpdir = new_dpdir | angle2dir(rotation+dir2angle(D))
dpdir = new_dpdir
+/obj/structure/table/wood/bar/shuttleRotate(rotation, params)
+ . = ..()
+ boot_dir = angle2dir(rotation + dir2angle(boot_dir))
+
/obj/structure/alien/weeds/shuttleRotate(rotation, params)
params &= ~ROTATE_OFFSET
return ..()
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
new file mode 100644
index 000000000000..1ddb26efba88
--- /dev/null
+++ b/code/modules/shuttle/special.dm
@@ -0,0 +1,257 @@
+// Special objects for shuttle templates go here if nowhere else
+
+// Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks
+// and a good time.
+
+/mob/living/simple_animal/drone/snowflake/bardrone
+ name = "Bardrone"
+ desc = "A barkeeping drone, a robot built to tend bars."
+ hacked = TRUE
+ laws = "1. Serve drinks.\n\
+ 2. Talk to patrons.\n\
+ 3. Don't get messed up in their affairs."
+ unique_name = FALSE // disables the (123) number suffix
+ initial_language_holder = /datum/language_holder/universal
+
+/mob/living/simple_animal/drone/snowflake/bardrone/Initialize()
+ . = ..()
+ access_card.access |= ACCESS_CENT_BAR
+ become_area_sensitive(ROUNDSTART_TRAIT)
+ RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode))
+ check_barstaff_godmode()
+
+/mob/living/simple_animal/drone/snowflake/bardrone/Destroy()
+ lose_area_sensitivity(ROUNDSTART_TRAIT)
+ return ..()
+
+/mob/living/simple_animal/hostile/alien/maid/barmaid
+ gold_core_spawnable = NO_SPAWN
+ name = "Barmaid"
+ desc = "A barmaid, a maiden found in a bar."
+ pass_flags = PASSTABLE
+ unique_name = FALSE
+ AIStatus = AI_OFF
+ stop_automated_movement = TRUE
+ initial_language_holder = /datum/language_holder/universal
+
+/mob/living/simple_animal/hostile/alien/maid/barmaid/Initialize()
+ . = ..()
+ access_card = new /obj/item/card/id(src)
+ var/datum/job/captain/C = new /datum/job/captain
+ access_card.access = C.get_access()
+ access_card.access |= ACCESS_CENT_BAR
+ ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
+ become_area_sensitive(ROUNDSTART_TRAIT)
+ RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode))
+ check_barstaff_godmode()
+
+/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy()
+ qdel(access_card)
+ lose_area_sensitivity(ROUNDSTART_TRAIT)
+ return ..()
+
+/mob/living/simple_animal/proc/check_barstaff_godmode()
+ SIGNAL_HANDLER
+
+ if(istype(get_area(loc), /area/shuttle/escape))
+ status_flags |= GODMODE
+ else
+ status_flags &= ~GODMODE
+
+// Bar table, a wooden table that kicks you in a direction if you're not
+// barstaff (defined as someone who was a roundstart bartender or someone
+// with CENTCOM_BARSTAFF)
+
+/obj/structure/table/wood/bar
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ flags_1 = NODECONSTRUCT_1
+ max_integrity = 1000
+ var/boot_dir = 1
+
+/obj/structure/table/wood/bar/Initialize()
+ . = ..()
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
+/obj/structure/table/wood/bar/proc/on_entered(datum/source, atom/movable/AM)
+ SIGNAL_HANDLER
+ if(isliving(AM) && !is_barstaff(AM))
+ // No climbing on the bar please
+ var/mob/living/M = AM
+ var/throwtarget = get_edge_target_turf(src, boot_dir)
+ M.Paralyze(40)
+ M.throw_at(throwtarget, 5, 1)
+ to_chat(M, "No climbing on the bar please.")
+
+/obj/structure/table/wood/bar/proc/is_barstaff(mob/living/user)
+ . = FALSE
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.mind && H.mind.assigned_role == "Bartender")
+ return TRUE
+
+ var/obj/item/card/id/ID = user.get_idcard(FALSE)
+ if(ID && (ACCESS_CENT_BAR in ID.access))
+ return TRUE
+
+//Luxury Shuttle Blockers
+
+/obj/machinery/scanner_gate/luxury_shuttle
+ name = "luxury shuttle ticket field"
+ density = FALSE //allows shuttle airlocks to close, nothing but an approved passenger gets past CanPass
+ locked = TRUE
+ use_power = FALSE
+ var/threshold = 500
+ var/static/list/approved_passengers = list()
+ var/static/list/check_times = list()
+ var/list/payees = list()
+
+/obj/machinery/scanner_gate/luxury_shuttle/CanAllowThrough(atom/movable/mover, border_dir)
+ . = ..()
+
+ if(mover in approved_passengers)
+ set_scanline("scanning", 10)
+ return TRUE
+
+ if(!isliving(mover)) //No stowaways
+ return FALSE
+
+/obj/machinery/scanner_gate/luxury_shuttle/auto_scan(atom/movable/AM)
+ return
+
+/obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, params)
+ return
+
+/obj/machinery/scanner_gate/luxury_shuttle/emag_act(mob/user)
+ return
+
+#define LUXURY_MESSAGE_COOLDOWN 100
+/obj/machinery/scanner_gate/luxury_shuttle/Bumped(atom/movable/AM)
+ if(!isliving(AM))
+ alarm_beep()
+ return ..()
+
+ var/datum/bank_account/account
+ if(istype(AM.pulling, /obj/item/card/id))
+ var/obj/item/card/id/I = AM.pulling
+ if(I.registered_account)
+ account = I.registered_account
+ else if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message
+ to_chat(AM, "This ID card doesn't have an owner associated with it!")
+ check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN
+ else if(ishuman(AM))
+ var/mob/living/carbon/human/H = AM
+ if(H.get_bank_account())
+ account = H.get_bank_account()
+
+ if(account)
+ if(account.account_balance < threshold - payees[AM])
+ account.adjust_money(-account.account_balance, "luxury_shuttle")
+ payees[AM] += account.account_balance
+ else
+ var/money_owed = threshold - payees[AM]
+ account.adjust_money(-money_owed)
+ payees[AM] += money_owed
+
+ var/list/counted_money = list()
+
+ for(var/obj/item/coin/C in AM.GetAllContents())
+ if(payees[AM] >= threshold)
+ break
+ payees[AM] += C.value
+ counted_money += C
+ for(var/obj/item/spacecash/bundle/S in AM.GetAllContents())
+ if(payees[AM] >= threshold)
+ break
+ payees[AM] += S.value
+ counted_money += S
+ for(var/obj/item/holochip/H in AM.GetAllContents())
+ if(payees[AM] >= threshold)
+ break
+ payees[AM] += H.credits
+ counted_money += H
+
+ if(payees[AM] < threshold && istype(AM.pulling, /obj/item/coin))
+ var/obj/item/coin/C = AM.pulling
+ payees[AM] += C.value
+ counted_money += C
+
+ else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/spacecash/bundle))
+ var/obj/item/spacecash/bundle/S = AM.pulling
+ payees[AM] += S.value
+ counted_money += S
+
+ else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/holochip))
+ var/obj/item/holochip/H = AM.pulling
+ payees[AM] += H.credits
+ counted_money += H
+
+ if(payees[AM] < threshold)
+ var/armless
+ if(!ishuman(AM) && !istype(AM, /mob/living/simple_animal/slime))
+ armless = TRUE
+ else
+ var/mob/living/carbon/human/H = AM
+ if(!H.get_bodypart(BODY_ZONE_L_ARM) && !H.get_bodypart(BODY_ZONE_R_ARM))
+ armless = TRUE
+
+ if(armless)
+ if(!AM.pulling || !iscash(AM.pulling) && !istype(AM.pulling, /obj/item/card/id))
+ if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message
+ to_chat(AM, "Try pulling a valid ID, space cash, holochip or coin into \the [src]!")
+ check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN
+
+ if(payees[AM] >= threshold)
+ for(var/obj/I in counted_money)
+ qdel(I)
+ payees[AM] -= threshold
+
+ var/change = FALSE
+ if(payees[AM] > 0)
+ change = TRUE
+ var/obj/item/holochip/HC = new /obj/item/holochip(AM.loc)
+ HC.credits = payees[AM]
+ HC.name = "[HC.credits] credit holochip"
+ if(istype(AM, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = AM
+ if(!H.put_in_hands(HC))
+ AM.pulling = HC
+ else
+ AM.pulling = HC
+ payees[AM] -= payees[AM]
+
+ say("Welcome to first class, [AM]![change ? " Here is your change." : ""]")
+ approved_passengers += AM
+
+ check_times -= AM
+ return
+ else if (payees[AM] > 0)
+ for(var/obj/I in counted_money)
+ qdel(I)
+ if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message
+ to_chat(AM, "[payees[AM]] cr received. You need [threshold-payees[AM]] cr more.")
+ check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN
+ alarm_beep()
+ return ..()
+ else
+ alarm_beep()
+ return ..()
+
+/mob/living/simple_animal/hostile/bear/fightpit
+ name = "fight pit bear"
+ desc = "This bear's trained through ancient Solarian secrets to fear the walls of its glass prison."
+ environment_smash = ENVIRONMENT_SMASH_NONE
+
+/obj/effect/decal/hammerandsickle
+ name = "hammer and sickle"
+ desc = "Communism powerful force."
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "communist"
+ layer = ABOVE_OPEN_TURF_LAYER
+ pixel_x = -32
+ pixel_y = -32
+
+/obj/effect/decal/hammerandsickle/shuttleRotate(rotation)
+ setDir(angle2dir(rotation+dir2angle(dir))) // No parentcall, rest of the rotate code breaks the pixel offset.
diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm
new file mode 100644
index 000000000000..71afa1c9bc72
--- /dev/null
+++ b/code/modules/shuttle/white_ship.dm
@@ -0,0 +1,5 @@
+/obj/effect/spawner/lootdrop/whiteship_cere_ripley
+ name = "25% mech 75% wreckage ripley spawner"
+ loot = list(/obj/mecha/working/ripley/mining = 1,
+ /obj/structure/mecha_wreckage/ripley = 5)
+ lootdoubles = FALSE
diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm
index c34d5cf7c985..c47205a27323 100644
--- a/code/modules/spells/spell_types/conjure.dm
+++ b/code/modules/spells/spell_types/conjure.dm
@@ -55,6 +55,18 @@
range = 3
newVars = list("emagged" = 2, "remote_disabled" = 1,"shoot_sound" = 'sound/weapons/laser.ogg',"projectile" = /obj/projectile/beam/laser, "declare_arrests" = 0,"name" = "Wizard's Justicebot")
+/obj/effect/proc_holder/spell/aoe_turf/conjure/linkWorlds
+ name = "Link Worlds"
+ desc = "A whole new dimension for you to play with! They won't be happy about it, though."
+ invocation = "WTF"
+ clothes_req = FALSE
+ charge_max = 600
+ cooldown_min = 200
+ summon_type = list(/obj/structure/spawner/nether)
+ summon_amt = 1
+ range = 1
+ cast_sound = 'sound/weapons/marauder.ogg'
+
/obj/effect/proc_holder/spell/targeted/conjure_item
name = "Summon weapon"
desc = "A generic spell that should not exist. This summons an instance of a specific type of item, or if one already exists, un-summons it. Summons into hand if possible."
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index 55138a36c367..ed6d9a9b957d 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -9,12 +9,12 @@ GLOBAL_LIST_INIT(summoned_guns, list(
/obj/item/gun/energy/e_gun,
/obj/item/gun/energy/e_gun/advtaser,
/obj/item/gun/energy/laser,
- /obj/item/gun/ballistic/revolver/syndicate,
+ /obj/item/gun/ballistic/revolver,
/obj/item/gun/ballistic/revolver/detective,
/obj/item/gun/ballistic/automatic/pistol/deagle/camo,
/obj/item/gun/ballistic/automatic/gyropistol,
/obj/item/gun/energy/pulse,
- /obj/item/gun/ballistic/automatic/pistol/syndicate,
+ /obj/item/gun/ballistic/automatic/pistol/suppressed,
/obj/item/gun/ballistic/shotgun/doublebarrel,
/obj/item/gun/ballistic/shotgun,
/obj/item/gun/ballistic/shotgun/automatic/combat,
@@ -26,7 +26,7 @@ GLOBAL_LIST_INIT(summoned_guns, list(
/obj/item/gun/energy/lasercannon,
/obj/item/gun/energy/kinetic_accelerator/crossbow/large,
/obj/item/gun/energy/e_gun/nuclear,
- /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/proto,
+ /obj/item/gun/ballistic/automatic/smg/proto,
/obj/item/gun/ballistic/automatic/smg/c20r,
/obj/item/gun/ballistic/automatic/hmg/l6_saw,
/obj/item/gun/ballistic/automatic/smg/m90,
@@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(summoned_guns, list(
/obj/item/gun/ballistic/shotgun/bulldog,
/obj/item/gun/ballistic/revolver/grenadelauncher,
/obj/item/gun/ballistic/revolver/golden,
- /obj/item/gun/ballistic/automatic/marksman/sniper_rifle,
+ /obj/item/gun/ballistic/automatic/sniper_rifle,
/obj/item/gun/ballistic/rocketlauncher,
/obj/item/gun/medbeam,
/obj/item/gun/energy/laser/scatter,
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index f8d8a9a49384..92cb95a9c605 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -244,7 +244,7 @@
burn *= 2
// Is the damage greater than the threshold, and if so, probability of damage + item force
- if(brute && (brute_dam > bone_break_threshold) && prob(brute_dam + break_modifier))
+ if((brute_dam > bone_break_threshold) && prob(brute_dam + break_modifier))
break_bone()
// Bleeding is applied here
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index 6f057c88d23d..f1eb39b84162 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -150,10 +150,6 @@
ear_owner.dna.species.mutant_bodyparts -= "ears"
ear_owner.update_body()
-/obj/item/organ/ears/fox
- name = "fox ears"
- damage_multiplier = 2
-
/obj/item/organ/ears/fox/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
..()
if(istype(ear_owner))
@@ -170,78 +166,6 @@
ear_owner.dna.species.mutant_bodyparts -= "ears"
ear_owner.update_body()
-/obj/item/organ/ears/rabbit
- name = "rabbit ears"
- damage_multiplier = 2
-
-/obj/item/organ/ears/rabbit/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.species.mutant_bodyparts |= "ears"
- ear_owner.dna.features["ears"] = "Rabbit"
- ear_owner.update_body()
-
-/obj/item/organ/ears/rabbit/Remove(mob/living/carbon/human/ear_owner, special = 0)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.features["ears"] = "None"
- ear_owner.dna.species.mutant_bodyparts -= "ears"
- ear_owner.update_body()
-
-/obj/item/organ/ears/rabbit/bent/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.species.mutant_bodyparts |= "ears"
- ear_owner.dna.features["ears"] = "Bent Rabbit"
- ear_owner.update_body()
-
-/obj/item/organ/ears/rabbit/bent/Remove(mob/living/carbon/human/ear_owner, special = 0)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.features["ears"] = "None"
- ear_owner.dna.species.mutant_bodyparts -= "ears"
- ear_owner.update_body()
-
-/obj/item/organ/ears/rabbit/floppy/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.species.mutant_bodyparts |= "ears"
- ear_owner.dna.features["ears"] = "Floppy Rabbit"
- ear_owner.update_body()
-
-/obj/item/organ/ears/floppy/Remove(mob/living/carbon/human/ear_owner, special = 0)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.features["ears"] = "None"
- ear_owner.dna.species.mutant_bodyparts -= "ears"
- ear_owner.update_body()
-
-/obj/item/organ/ears/dog
- name = "dog ears"
- damage_multiplier = 2
-
-/obj/item/organ/ears/dog/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.species.mutant_bodyparts |= "ears"
- ear_owner.dna.features["ears"] = "Dog"
- ear_owner.update_body()
-
-/obj/item/organ/ears/dog/Remove(mob/living/carbon/human/ear_owner, special = 0)
- ..()
- if(istype(ear_owner))
- color = ear_owner.hair_color
- ear_owner.dna.features["ears"] = "None"
- ear_owner.dna.species.mutant_bodyparts -= "ears"
- ear_owner.update_body()
-
/obj/item/organ/ears/elf
name = "elf ears"
damage_multiplier = 1.5
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 6ba9ce69d700..26b93d2c4642 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -55,7 +55,7 @@
update_appearance()
return 1
-/obj/item/organ/heart/on_eat_from(eater, feeder)
+/obj/item/organ/heart/OnEatFrom(eater, feeder)
. = ..()
beating = FALSE
update_appearance()
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 72b7fba9d2da..4b5dd9a49717 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -38,14 +38,7 @@
/obj/item/organ/Initialize()
. = ..()
if(organ_flags & ORGAN_EDIBLE)
- AddComponent(/datum/component/edible,\
- initial_reagents = food_reagents,\
- foodtypes = RAW | MEAT | GORE,\
- volume = 10,\
- filling_color = COLOR_PINK,\
- pre_eat = CALLBACK(src, PROC_REF(pre_eat)),\
- on_compost = CALLBACK(src, PROC_REF(pre_compost)),\
- after_eat = CALLBACK(src, PROC_REF(on_eat_from)))
+ AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GORE, null, 10, null, null, null, CALLBACK(src, PROC_REF(OnEatFrom)))
///When you take a bite you cant jam it in for surgery anymore.
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
@@ -140,21 +133,8 @@
STOP_PROCESSING(SSobj, src)
return ..()
-// Put any "can we eat this" checks for edible organs here
-/obj/item/organ/proc/pre_eat(eater, feeder)
- if(iscarbon(eater))
- var/mob/living/carbon/target = eater
- for(var/S in target.surgeries)
- var/datum/surgery/surgery = S
- if(surgery.location == zone)
- return FALSE
- return TRUE
-
-/obj/item/organ/proc/pre_compost(user)
- return TRUE
-
-/obj/item/organ/proc/on_eat_from(eater, feeder)
- useable = FALSE //You bit it, no more using it
+/obj/item/organ/proc/OnEatFrom(eater, feeder)
+ useable = FALSE //You can't use it anymore after eating it you spaztic
/obj/item/organ/item_action_slot_check(slot,mob/user)
return //so we don't grant the organ's action to mobs who pick up the organ.
diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm
index be43bc99f62d..2d3e402150a2 100644
--- a/code/modules/surgery/organs/tails.dm
+++ b/code/modules/surgery/organs/tails.dm
@@ -137,49 +137,7 @@
desc = "A severed fox tail. Sad."
tail_type = "Fox 2"
-/obj/item/organ/tail/fox/alt/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
- ..()
- if(istype(H))
- if(!("tail_human" in H.dna.species.mutant_bodyparts))
- H.dna.species.mutant_bodyparts |= "tail_human"
- H.dna.features["tail_human"] = tail_type
- H.update_body()
-
-/obj/item/organ/tail/fox/alt/Remove(mob/living/carbon/human/H, special = 0)
- ..()
- if(istype(H))
- H.dna.features["tail_human"] = "None"
- H.dna.species.mutant_bodyparts -= "tail_human"
- color = H.hair_color
- H.update_body()
-
-/obj/item/organ/tail/rabbit
- name = "rabbit tail"
- desc = "A severed rabbit tail."
- tail_type = "Rabbit"
-
-/obj/item/organ/tail/rabbit/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
- ..()
- if(istype(H))
- if(!("tail_human" in H.dna.species.mutant_bodyparts))
- H.dna.species.mutant_bodyparts |= "tail_human"
- H.dna.features["tail_human"] = tail_type
- H.update_body()
-
-/obj/item/organ/tail/rabbit/Remove(mob/living/carbon/human/H, special = 0)
- ..()
- if(istype(H))
- H.dna.features["tail_human"] = "None"
- H.dna.species.mutant_bodyparts -= "tail_human"
- color = H.hair_color
- H.update_body()
-
-/obj/item/organ/tail/dog
- name = "dog tail"
- desc = "A severed dog tail."
- tail_type = "Dog"
-
-/obj/item/organ/tail/dog/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
+/obj/item/organ/tail/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE)
..()
if(istype(H))
if(!("tail_human" in H.dna.species.mutant_bodyparts))
@@ -187,7 +145,7 @@
H.dna.features["tail_human"] = tail_type
H.update_body()
-/obj/item/organ/tail/dog/Remove(mob/living/carbon/human/H, special = 0)
+/obj/item/organ/tail/cat/Remove(mob/living/carbon/human/H, special = 0)
..()
if(istype(H))
H.dna.features["tail_human"] = "None"
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 6a5a344b177e..c0313adb2539 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -439,6 +439,14 @@
var/mob/living/L = V
L.emote("flip")
+ //SPEAK
+ else if((findtext(message, speak_words)))
+ cooldown = COOLDOWN_MEME
+ for(var/V in listeners)
+ var/mob/living/L = V
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i)
+ i++
+
//GET UP
else if((findtext(message, getup_words)))
cooldown = COOLDOWN_DAMAGE //because stun removal
diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm
index 9aee2ca10624..017356d9152a 100644
--- a/code/modules/unit_tests/create_and_destroy.dm
+++ b/code/modules/unit_tests/create_and_destroy.dm
@@ -72,7 +72,7 @@
ignore += typesof(/obj/effect/pod_landingzone_effect)
ignore += typesof(/obj/effect/pod_landingzone)
//These want fried food to take on the shape of, we can't pass that in
- ignore += typesof(/obj/item/food/deepfryholder)
+ ignore += typesof(/obj/item/reagent_containers/food/snacks/deepfryholder)
//Can't pass in a thing to glow
ignore += typesof(/obj/effect/abstract/eye_lighting)
//It wants a lot more context then we have
diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm
index 5c8412d05aec..e93d20910af0 100644
--- a/code/modules/unit_tests/projectiles.dm
+++ b/code/modules/unit_tests/projectiles.dm
@@ -6,7 +6,7 @@
/datum/unit_test/gun_go_bang/Run()
// test is for a ballistic gun that starts loaded + chambered
- var/obj/item/gun/test_gun = allocate(/obj/item/gun/ballistic/automatic/pistol/candor)
+ var/obj/item/gun/test_gun = allocate(/obj/item/gun/ballistic/automatic/pistol)
var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human)
var/mob/living/carbon/human/gunner = allocate(/mob/living/carbon/human)
ADD_TRAIT(victim, TRAIT_PIERCEIMMUNE, INNATE_TRAIT) // So the human isn't randomly affected by shrapnel
diff --git a/code/modules/unit_tests/serving_tray.dm b/code/modules/unit_tests/serving_tray.dm
index b4dc1f77a520..9bd487ba68a8 100644
--- a/code/modules/unit_tests/serving_tray.dm
+++ b/code/modules/unit_tests/serving_tray.dm
@@ -6,7 +6,7 @@
var/obj/structure/table/the_table = allocate(/obj/structure/table)
var/obj/item/storage/bag/tray/test_tray = allocate(/obj/item/storage/bag/tray)
var/obj/item/reagent_containers/food/banana = allocate(/obj/item/reagent_containers/food/snacks/grown/banana)
- var/obj/item/reagent_containers/food/the_bread = allocate(/obj/item/food/breadslice)
+ var/obj/item/reagent_containers/food/the_bread = allocate(/obj/item/reagent_containers/food/snacks/breadslice)
var/obj/item/reagent_containers/food/sugarcookie = allocate(/obj/item/reagent_containers/food/snacks/sugarcookie)
var/obj/item/clothing/under/jumpsuit = allocate(/obj/item/clothing/under/color/black)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 9e935611e15f..eaa0a631ec5d 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -485,7 +485,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/sniper
name = "Sniper Rifle"
desc = "Ranged fury, Syndicate style. Guaranteed to cause shock and awe or your TC back!"
- item = /obj/item/gun/ballistic/automatic/marksman/sniper_rifle
+ item = /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate
cost = 16
surplus = 25
include_modes = list(/datum/game_mode/nuclear)
@@ -494,7 +494,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Stechkin Pistol"
desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible \
with suppressors."
- item = /obj/item/gun/ballistic/automatic/pistol/syndicate
+ item = /obj/item/gun/ballistic/automatic/pistol
cost = 7
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
@@ -508,7 +508,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/revolver
name = "Syndicate Revolver"
desc = "A brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
- item = /obj/item/gun/ballistic/revolver/syndicate
+ item = /obj/item/gun/ballistic/revolver
cost = 13
surplus = 50
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
@@ -575,7 +575,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/ebr
name = "M514 EBR"
desc = "A cheap rifle with high stopping power and low capacity."
- item = /obj/item/gun/ballistic/automatic/marksman/ebr
+ item = /obj/item/gun/ballistic/automatic/ebr
cost = 8
surplus = 20
include_modes = list(/datum/game_mode/nuclear)
@@ -683,7 +683,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/stealthy_weapons/suppressor
name = "Suppressor"
desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns."
- item = /obj/item/attachment/silencer
+ item = /obj/item/suppressor
cost = 3
surplus = 10
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm
index fa3d569b0535..c9e990372374 100644
--- a/code/modules/vehicles/motorized_wheelchair.dm
+++ b/code/modules/vehicles/motorized_wheelchair.dm
@@ -5,7 +5,7 @@
max_integrity = 150
var/speed = 2
var/power_efficiency = 1
- var/power_usage = 20
+ var/power_usage = 100
var/panel_open = FALSE
var/list/required_parts = list(/obj/item/stock_parts/manipulator,
/obj/item/stock_parts/manipulator,
@@ -21,7 +21,7 @@
for(var/obj/item/stock_parts/manipulator/M in contents)
speed += M.rating
for(var/obj/item/stock_parts/capacitor/C in contents)
- power_efficiency = (C.rating + 1)
+ power_efficiency = C.rating
var/datum/component/riding/D = GetComponent(/datum/component/riding)
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * delay_multiplier) / speed
@@ -52,7 +52,7 @@
canmove = FALSE
addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20)
return FALSE
- power_cell.use(power_usage / max(power_efficiency, 2))
+ power_cell.use(power_usage / max(power_efficiency, 1))
return ..()
/obj/vehicle/ridden/wheelchair/motorized/set_move_delay(mob/living/user)
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index 4d327c7a8234..2914d6dda279 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -47,7 +47,7 @@
if(istype(W, /obj/item/reagent_containers/food/snacks/grown/banana))
// ignore the occupants because they're presumably too distracted to notice the guy stuffing fruit into their vehicle's exhaust. do segways have exhausts? they do now!
user.visible_message("[user] begins stuffing [W] into [src]'s tailpipe.", "You begin stuffing [W] into [src]'s tailpipe...", ignored_mobs = occupants)
- if(do_after(user, 30, src))
+ if(do_after(user, 30, TRUE, src))
if(user.transferItemToLoc(W, src))
user.visible_message("[user] stuffs [W] into [src]'s tailpipe.", "You stuff [W] into [src]'s tailpipe.", ignored_mobs = occupants)
eddie_murphy = W
diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm
index fc5b6503f90c..a22b68c5a1c8 100644
--- a/code/modules/vehicles/wheelchair.dm
+++ b/code/modules/vehicles/wheelchair.dm
@@ -104,8 +104,8 @@
/obj/vehicle/ridden/wheelchair/proc/can_user_rotate(mob/living/user)
var/mob/living/L = user
if(istype(L))
- if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return TRUE
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return FALSE
if(isobserver(user) && CONFIG_GET(flag/ghost_interaction))
return TRUE
return FALSE
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 6d73fad566f6..4c97b3f7eaa2 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -714,13 +714,15 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/ui_data(mob/user)
. = list()
var/mob/living/carbon/human/H
- var/obj/item/card/bank/card
+ var/obj/item/card/id/card
if(ishuman(user))
H = user
- card = H.get_bankcard()
+ card = H.get_idcard(TRUE)
if(card)
.["user"] = list()
.["user"]["points"] = card.mining_points
+ .["user"]["name"] = card.registered_name
+ .["user"]["job"] = card.assignment || "No Job"
if(card.registered_account)
.["user"]["name"] = card.registered_account.account_holder
.["user"]["cash"] = card.registered_account.account_balance
@@ -767,7 +769,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
return
if(!all_items_free && ishuman(usr))
var/mob/living/carbon/human/H = usr
- var/obj/item/card/bank/C = H.get_bankcard()
+ var/obj/item/card/id/C = H.get_idcard(TRUE)
if(!C)
say("No card found.")
@@ -944,10 +946,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/custom/compartmentLoadAccessCheck(mob/user)
. = FALSE
var/mob/living/carbon/human/H
- var/obj/item/card/bank/C
+ var/obj/item/card/id/C
if(ishuman(user))
H = user
- C = H.get_bankcard(FALSE)
+ C = H.get_idcard(FALSE)
if(C?.registered_account && C.registered_account == private_a)
return TRUE
@@ -1001,7 +1003,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
vend_ready = FALSE
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
- var/obj/item/card/bank/C = H.get_bankcard()
+ var/obj/item/card/id/C = H.get_idcard(TRUE)
if(!C)
say("No card found.")
@@ -1053,10 +1055,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/custom/attackby(obj/item/I, mob/user, params)
if(!private_a)
var/mob/living/carbon/human/H
- var/obj/item/card/bank/C
+ var/obj/item/card/id/C
if(ishuman(user))
H = user
- C = H.get_bankcard(TRUE)
+ C = H.get_idcard(TRUE)
if(C?.registered_account)
private_a = C.registered_account
say("\The [src] has been linked to [C].")
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index 45dc055e1b21..1b7b2d9e5ccb 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -3,7 +3,7 @@
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "boozeomat"
icon_deny = "boozeomat-deny"
- products = list( // All of drink dispenser reagents should be available here.
+ products = list(
/obj/item/reagent_containers/food/drinks/drinkingglass = 30,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12,
/obj/item/reagent_containers/food/drinks/modglass/small = 10,
@@ -11,31 +11,18 @@
/obj/item/reagent_containers/food/drinks/modglass/large = 10,
/obj/item/reagent_containers/food/drinks/flask = 3,
/obj/item/reagent_containers/food/drinks/ice = 10,
- /obj/item/reagent_containers/food/drinks/waterbottle/large = 6,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/limejuice = 4,
- /obj/item/reagent_containers/food/drinks/bottle/lemonjuice = 4,
- /obj/item/reagent_containers/food/drinks/bottle/pineapplejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/cream = 4,
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 8,
- /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail = 4,
- /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx = 4,
- /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch = 4,
- /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 4,
- /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel = 4,
- /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda = 4,
- /obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch = 4,
/obj/item/reagent_containers/food/drinks/soda_cans/tonic = 8,
- /obj/item/reagent_containers/food/drinks/soda_cans/sodawater = 8,
- /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 4,
- /obj/item/reagent_containers/food/drinks/soda_cans/vimukti = 4,
+ /obj/item/reagent_containers/food/drinks/soda_cans/sodawater = 15,
+ /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 8,
/obj/item/reagent_containers/food/drinks/bottle/grenadine = 4,
/obj/item/reagent_containers/food/drinks/bottle/menthol = 4,
- /obj/item/reagent_containers/food/drinks/mug/tea = 8,
- /obj/item/reagent_containers/food/drinks/coffee = 8,
/obj/item/reagent_containers/food/drinks/ale = 6,
- /obj/item/reagent_containers/food/drinks/beer = 8,
+ /obj/item/reagent_containers/food/drinks/beer = 6,
/obj/item/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/reagent_containers/food/drinks/bottle/tequila = 5,
@@ -51,10 +38,7 @@
/obj/item/reagent_containers/food/drinks/bottle/amaretto = 5,
/obj/item/reagent_containers/food/drinks/bottle/sake = 5,
/obj/item/reagent_containers/food/drinks/bottle/applejack = 5,
- /obj/item/reagent_containers/food/drinks/bottle/triplesec = 5,
/obj/item/reagent_containers/food/drinks/bottle/coconut = 5,
- /obj/item/reagent_containers/food/drinks/bottle/cacao = 5,
- /obj/item/reagent_containers/food/drinks/bottle/menthe = 5,
/obj/item/reagent_containers/food/drinks/bottle = 15,
/obj/item/reagent_containers/food/drinks/bottle/small = 15,
/obj/item/garnish/olives = 10,
@@ -62,16 +46,16 @@
/obj/item/garnish/umbrellablue = 10,
/obj/item/garnish/umbrellagreen = 10
)
- contraband = list()
+ contraband = list(
+ /obj/item/reagent_containers/food/drinks/mug/tea = 12,
+ /obj/item/reagent_containers/food/drinks/bottle/fernet = 5)
premium = list(
/obj/item/reagent_containers/glass/bottle/ethanol = 4,
- /obj/item/reagent_containers/glass/bottle/sugar = 3,
- /obj/item/reagent_containers/food/drinks/bottle/fernet = 5,
/obj/item/reagent_containers/food/drinks/bottle/champagne = 5,
/obj/item/reagent_containers/food/drinks/bottle/trappist = 5)
- product_slogans = "I hope nobody asks me for a cup of tea...;Alcohol is everyone's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty 'round this sector?"
- product_ads = "Drink up!;Booze is good for you!;Alcohol is everyone's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 53 FSC!;Award-winning wine!;Maximum alcohol!;Everyone loves beer.;A toast for progress!"
+ product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty 'round this sector?"
+ product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
req_access = list(ACCESS_BAR)
refill_canister = /obj/item/vending_refill/boozeomat
default_price = 120
diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm
index 1c377c309464..3cff7d3c361d 100644
--- a/code/modules/vending/cigarette.dm
+++ b/code/modules/vending/cigarette.dm
@@ -1,8 +1,8 @@
/obj/machinery/vending/cigarette
name = "\improper ShadyCigs Deluxe"
desc = "If you want to get cancer, might as well do it in style."
- product_slogans = "Space cigs taste good like a cigarette should.;I'd rather die than switch.;Smoke!;Don't believe the reports - smoke today!"
- product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 150 FSC.;Award-winning cigs."
+ product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
+ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
icon_state = "cigs"
products = list(
/obj/item/storage/fancy/cigarettes = 5,
diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm
index a3fa70ce6209..4a9f4a456eee 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -1,34 +1,35 @@
/obj/machinery/vending/cola
- name = "\improper RobustMore Softdrinks"
- desc = "A softdrink vendor provided by RobustMore DrinkFoods Industries, LLC."
+ name = "\improper Robust Softdrinks"
+ desc = "A softdrink vendor provided by Robust Industries, LLC."
icon_state = "Cola_Machine"
- product_slogans = "RobustMore Softdrinks: More robust than a toolbox to the head!"
- product_ads = "Refreshing!;Hope you're thirsty!;Over 10 trillion drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks this side of the galaxy."
+ product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
+ product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
products = list(
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
/obj/item/reagent_containers/food/drinks/waterbottle = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy = 5,
- /obj/item/reagent_containers/food/drinks/soda_cans/vimukti = 6,
- /obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch = 6)
+ /obj/item/reagent_containers/food/drinks/soda_cans/efuel = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
+ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
premium = list(
+ /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/air = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/crosstalk = 1)
+ /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1)
refill_canister = /obj/item/vending_refill/cola
default_price = 45
extra_price = 200
/obj/item/vending_refill/cola
- machine_name = "RobustMore Softdrinks"
+ machine_name = "Robust Softdrinks"
icon_state = "refill_cola"
/obj/machinery/vending/cola/random
@@ -53,9 +54,9 @@
/obj/machinery/vending/cola/red
icon_state = "red_cola"
- name = "\improper Master Cola Vendor"
- desc = "This vending machine offers Master Cola. Master Cola - have a drink from the past!"
- product_slogans = "Master Cola - have a drink from the past!"
+ name = "\improper Space Cola Vendor"
+ desc = "It vends cola, in space."
+ product_slogans = "Cola in space!"
light_mask = "red_cola-light-mask"
light_color = COLOR_DARK_RED
@@ -69,9 +70,9 @@
/obj/machinery/vending/cola/starkist
icon_state = "starkist"
- name = "\improper Lunapunch Vendor"
- desc = "What keeps the colonies running - Lunapunch."
- product_slogans = "The Colonies run on Lunapunch!"
+ name = "\improper Star-kist Vendor"
+ desc = "The taste of a star in liquid form."
+ product_slogans = "Drink the stars! Star-kist!"
light_mask = "starkist-light-mask"
light_color = COLOR_LIGHT_ORANGE
@@ -82,27 +83,27 @@
/obj/machinery/vending/cola/pwr_game
icon_state = "pwr_game"
- name = "\improper PAC-Fuel Vendor"
- desc = "PAC-Fuel: stay flying straight. Enter the code on every can for a chance to win gamer merch or industrial equipment!"
- product_slogans = "Keep flying steady with PAC-Fuel!"
+ name = "\improper Pwr Game Vendor"
+ desc = "You want it, we got it. Brought to you in partnership with Vlad's Salads."
+ product_slogans = "The POWER that gamers crave! PWR GAME!"
light_mask = "pwr_game-light-mask"
light_color = COLOR_STRONG_VIOLET
/obj/machinery/vending/cola/shamblers
- name = "\improper Shoal Punch Vendor"
- desc = "Every fruit you could want, at your beak! Shoal Punch!"
+ name = "\improper Shambler's Vendor"
+ desc = "~Shake me up some of that Shambler's Juice!~"
icon_state = "shamblers_juice"
products = list(
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/comet_trail = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/tadrixx = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/lunapunch = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/pacfuel = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/orange_soda = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
- /obj/item/reagent_containers/food/drinks/soda_cans/shoal_punch = 10)
- product_slogans = "Every fruit you could want, at your beak! Shoal Punch!"
- product_ads = "Every fruit you could want, at your beak!;Don't go flying dry!;Over two trillion served!;Thirsty? Get punched!;Skrikira trikxti skrmikr rakti!;Don't go dry, get Shoal Punch."
+ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 10)
+ product_slogans = "~Shake me up some of that Shambler's Juice!~"
+ product_ads = "Refreshing!;Jyrbv dv lg jfdv fw kyrk Jyrdscvi'j Alztv!;Over 1 trillion souls drank!;Thirsty? Nyp efk uizeb kyv uribevjj?;Kyv Jyrdscvi uizebj kyv ezxyk!;Drink up!;Krjkp."
light_mask = "shamblers-light-mask"
light_color = COLOR_MOSTLY_PURE_PINK
diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm
index 3e51271093ad..5dbd8ea733db 100644
--- a/code/modules/vending/drinnerware.dm
+++ b/code/modules/vending/drinnerware.dm
@@ -1,7 +1,7 @@
/obj/machinery/vending/dinnerware
name = "\improper Plasteel Chef's Dinnerware Vendor"
desc = "A kitchen and restaurant equipment vendor."
- product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils."
+ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
products = list(
/obj/item/storage/bag/tray = 8,
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index c803fa347e9f..d27a1f6ffe6e 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -1,7 +1,7 @@
/obj/machinery/vending/games
name = "\improper Good Clean Fun"
desc = "Vends things that the Captain and Head of Personnel are probably not going to appreciate you fiddling with instead of your job..."
- product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Fun times forever!"
+ product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!"
icon_state = "games"
products = list(
/obj/item/toy/cards/deck = 5,
diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm
new file mode 100644
index 000000000000..03d532c804e7
--- /dev/null
+++ b/code/modules/vending/liberation.dm
@@ -0,0 +1,35 @@
+/obj/machinery/vending/liberationstation
+ name = "\improper Liberation Station"
+ desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine."
+ icon_state = "liberationstation"
+ product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!"
+ product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
+ vend_reply = "Remember the name: Liberation Station!"
+ products = list(
+ /obj/item/reagent_containers/food/snacks/burger/plain = 5, //O say can you see, by the dawn's early light
+ /obj/item/reagent_containers/food/snacks/burger/baseball = 3, //What so proudly we hailed at the twilight's last gleaming
+ /obj/item/reagent_containers/food/snacks/fries = 5, //Whose broad stripes and bright stars through the perilous fight
+ /obj/item/reagent_containers/food/drinks/beer/light = 10, //O'er the ramparts we watched, were so gallantly streaming?
+ /obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2,
+ /obj/item/gun/ballistic/automatic/pistol/deagle/camo = 2,
+ /obj/item/gun/ballistic/automatic/pistol/candor = 2,
+ /obj/item/gun/ballistic/automatic/smg/proto = 2,
+ /obj/item/gun/ballistic/shotgun/automatic/combat = 2,
+ /obj/item/gun/ballistic/automatic/gyropistol = 1,
+ /obj/item/gun/ballistic/shotgun = 2)
+ premium = list(
+ /obj/item/ammo_box/magazine/smgm9mm = 2,
+ /obj/item/ammo_box/magazine/m50 = 4,
+ /obj/item/ammo_box/magazine/m45 = 2,
+ /obj/item/ammo_box/magazine/m75 = 2,
+ /obj/item/reagent_containers/food/snacks/cheesyfries = 5,
+ /obj/item/reagent_containers/food/snacks/burger/baconburger = 5) //Premium burgers for the premium section
+ contraband = list(
+ /obj/item/clothing/under/misc/patriotsuit = 3,
+ /obj/item/bedsheet/patriot = 5,
+ /obj/item/reagent_containers/food/snacks/burger/superbite = 3) //U S A
+ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
+ resistance_flags = FIRE_PROOF
+ default_price = 150
+ extra_price = 500
+ light_mask = "liberation-light-mask"
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 911a190703f4..989bd721a79c 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -2,8 +2,8 @@
name = "\improper Syndicate Donksoft Toy Vendor"
desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!"
icon_state = "syndi"
- product_slogans = "Get your cool toys today!;Quality toy weapons for cheap prices!"
- product_ads = "Feel tough with your toys!;Express your inner child today!;Toy weapons don't kill people, but boredom does!;Who needs responsibilities when you have toy weapons?;Make your next foam fight FUN!"
+ product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!"
+ product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
vend_reply = "Come back for more!"
circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
products = list(/obj/item/gun/ballistic/automatic/toy = 10,
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index 911eaed20652..95afc6f2eb92 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -131,7 +131,7 @@
)
voucher_items = list(
"M-90gl Carbine" = /obj/item/gun/ballistic/automatic/smg/m90,
- "sniper rifle" = /obj/item/gun/ballistic/automatic/marksman/sniper_rifle,
+ "sniper rifle" = /obj/item/gun/ballistic/automatic/sniper_rifle,
"C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r,
"Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog)
diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm
index 45d76a4754fa..d0130d7358fc 100644
--- a/code/modules/vending/snack.dm
+++ b/code/modules/vending/snack.dm
@@ -1,8 +1,8 @@
/obj/machinery/vending/snack
name = "\improper Getmore Chocolate Corp"
- desc = "A snack machine courtesy of the RobustMore DrinkFoods LLC."
+ desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars."
product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
- product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Have a snack.;Snacks are good for you!;Have something better! Get RobustMore!;Best quality snacks!;We love chocolate!;Try our new jerky!"
+ product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
icon_state = "snack"
light_mask = "snack-light-mask"
products = list(
@@ -24,7 +24,7 @@
input_display_header = "Chef's Food Selection"
/obj/item/vending_refill/snack
- machine_name = "RobustMore DrinkFoods LLC"
+ machine_name = "Getmore Chocolate Corp"
/obj/machinery/vending/snack/random
name = "\improper Random Snackies"
diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm
index 0677a77edb58..0519285d26a5 100644
--- a/code/modules/vending/sustenance.dm
+++ b/code/modules/vending/sustenance.dm
@@ -7,7 +7,7 @@
icon_state = "sustenance"
products = list(
/obj/item/reagent_containers/food/snacks/tofu/prison = 24,
- /obj/item/food/breadslice/moldy = 15,
+ /obj/item/reagent_containers/food/snacks/breadslice/moldy = 15,
/obj/item/reagent_containers/food/drinks/ice/prison = 12,
/obj/item/reagent_containers/food/snacks/candy_corn/prison = 6)
contraband = list(
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index a5092cf7373f..8fefa1015536 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -2,8 +2,8 @@
name = "\improper Donksoft Toy Vendor"
desc = "Ages 8 and up approved vendor that dispenses toys."
icon_state = "nt-donk"
- product_slogans = "Get your cool toys today!;Quality toy weapons for cheap prices!"
- product_ads = "Feel tough with your toys!;Express your inner child today!;Toy weapons don't kill people, but bordeom does!;Who needs responsibilities when you have toy weapons?;Make your next foam fight FUN!"
+ product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!"
+ product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
vend_reply = "Come back for more!"
light_mask = "donksoft-light-mask"
circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index da3fdb134010..bbc53154aac6 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -375,7 +375,7 @@
icon_state = "chapdrobe"
product_ads = "Are you being bothered by cultists or pesky revenants? Then come and dress like the holy man!;Clothes for men of the cloth!"
vend_reply = "Thank you for using the ChapDrobe!"
- products = list(/obj/item/storage/box/holy = 1,
+ products = list(/obj/item/choice_beacon/holy = 1,
/obj/item/storage/backpack/cultpack = 1,
/obj/item/clothing/head/beret/service = 1, //WS edit - berets
/obj/item/clothing/accessory/pocketprotector/cosmetology = 1,
diff --git a/config/admins.txt b/config/admins.txt
index 24f777f26b19..b695c94f084b 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -5,6 +5,5 @@
#If SQL-based admin loading is enabled, admins listed here will always be loaded first and will override any duplicate entries in the database.
MarkSuckerberg = Development Head
-rkz = Development Head
#just use the database, this is deprecated
diff --git a/html/changelogs/AutoChangeLog-pr-3009.yml b/html/changelogs/AutoChangeLog-pr-3009.yml
new file mode 100644
index 000000000000..b3fa75563632
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3009.yml
@@ -0,0 +1,18 @@
+author: SomeguyManperson
+changes:
+ - {tweak: 'bleeding is now stored in the limbs, functioning similarly to bone breaking.
+ Taking damage over a certain threshold and amount (lower for sharp weapons)
+ will cause part of it to be turned into bleeding.'}
+ - {tweak: 'gauze, tape, and bleeding suppression are similarly no longer abstracted
+ into a "bleed suppression" value'}
+ - {rscadd: you can now cauterize bleeding with a lighter. Which is cool.}
+ - {rscadd: you can now also cauterize bleeding with suit storage decontamination.
+ Which is hot.}
+ - {rscadd: examine and examine closely will show whether or not someone is visibly
+ bleeding or bandaged. This means people who are both will show both. Examine
+ closely additionally shows which limbs are currently bleeding.}
+ - {tweak: 'heparin now causes existing bleeding to worsen, instead of causing bleeding
+ on its own'}
+ - {tweak: you can no longer cut the throat of someone who's head has been lopped
+ off}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3251.yml b/html/changelogs/AutoChangeLog-pr-3251.yml
deleted file mode 100644
index 80c473f8931b..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3251.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: generalthrax
-changes:
- - {rscadd: Industrial jacket now keeps you warm}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3257.yml b/html/changelogs/AutoChangeLog-pr-3257.yml
deleted file mode 100644
index cc1a6da66964..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3257.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: SomeguyManperson
-changes:
- - {balance: gun attachments are now small instead of normal sized}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3259.yml b/html/changelogs/AutoChangeLog-pr-3259.yml
deleted file mode 100644
index 20f02d2b1158..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3259.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: generalthrax
-changes:
- - {bugfix: Contender is now called the Beacon in cargo}
-delete-after: true
diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml
index d39c3b4431ae..ee60e5a1fb00 100644
--- a/html/changelogs/archive/2024-06.yml
+++ b/html/changelogs/archive/2024-06.yml
@@ -143,224 +143,3 @@
- bugfix: removes a comment from apc.dm that was causing strange errors.
thgvr:
- imageadd: Kepori have been given a full visual overhaul.
-2024-06-09:
- SomeguyManperson:
- - tweak: bleeding is now stored in the limbs, functioning similarly to bone breaking.
- Taking damage over a certain threshold and amount (lower for sharp weapons)
- will cause part of it to be turned into bleeding.
- - tweak: gauze, tape, and bleeding suppression are similarly no longer abstracted
- into a "bleed suppression" value
- - rscadd: you can now cauterize bleeding with a lighter. Which is cool.
- - rscadd: you can now also cauterize bleeding with suit storage decontamination.
- Which is hot.
- - rscadd: examine and examine closely will show whether or not someone is visibly
- bleeding or bandaged. This means people who are both will show both. Examine
- closely additionally shows which limbs are currently bleeding.
- - tweak: heparin now causes existing bleeding to worsen, instead of causing bleeding
- on its own
- - tweak: you can no longer cut the throat of someone who's head has been lopped
- off
- Zevotech:
- - bugfix: Planets should no longer spawn without ruins when generating due to bad
- map datums
- - rscdel: Removed 3 Beach ruins
- - rscdel: Removed 4 Iceplanet ruins
- - rscdel: Removed 11 Jungle ruins
- - rscdel: Removed 10 Lavaland ruins
- - rscdel: Removed 8 Rockplanet ruins
- - rscdel: Removed 7 Sandplanet ruins
- - rscdel: Removed 7 Rockplanet ruins
- - rscdel: Removed 15 Space ruins
- - rscdel: Removed 16 unused/removed ruin code files
- - rscdel: Removed a whole lot of old/unused ruin code from misc files
- - tweak: Tweaked various ruins and one ship to fix issues and remove unused items
-2024-06-10:
- PositiveEntropy:
- - rscadd: CLIP now reports the presence of so-called "Flame Troopers" of the Frontiersmen
- terrorizing their territories...
- - balance: Marine armor has improved armor stats at the cost of the bulk slowing
- down the wearer.
- - balance: Flamethrowers have a slightly improved effective range, as well as higher
- damage.
- - imageadd: The Frontiersmen have gotten better tailors and now look sharp and deadly!
- Skies-Of-Blue:
- - rscadd: several new SUNS-produced genemods have hit the public market! Head to
- your local gene-clinic and ask about their new dog and rabbit options for more
- details
- - balance: fox ears have been tweaked to be just as susceptible to sound as cat
- ears
-2024-06-11:
- 'CoiledLamb ':
- - rscadd: Resprites the eggbox
- Gristlebee:
- - code_imp: Switchblades are now pathed under obj/kitchen/knife
- - imageadd: Switchblade sprites moved from items and weapons.dmi to knife.dmi
- Sadhorizon:
- - rscadd: Pickaxe was added to the autolathe.
- meemofcourse:
- - rscadd: PGF jobs now grant you the Kalixcian Common language
-2024-06-13:
- FalloutFalcon:
- - rscdel: Removed alot of chaplain stuff we will never use
- - rscdel: The chaplain is now just as magic as the average person
- Gristlebee:
- - rscadd: Wrecked Factory ruin
- - rscadd: Indestructible titanium walls
- - rscadd: Lavaland atmos subtypes for plating, rusted plating, concrete, white and
- dark turfs
- - balance: Syndicate Space Simple Mobs have their max temp increased
- - tweak: Wall_lockers updatepaths on the Aegis
- - code_imp: Adds ruin to map_catalogue,txt, lavaland.dm and adds it to lavaland.dm
- areas
- - rscadd: Techshell box
- - rscadd: Techshells to the outpost market for 175 credits
- - tweak: Scatter ion description
- - balance: Techshell recipes no longer require higher tier stock parts, adjusts
- scatter laser, scatter ion, dragonsbreath and pulse slug recipes
- - balance: Buffs scatter lasers, scatter ion and dragonsbreath
- PositiveEntropy:
- - rscadd: The Hardliners have now made a proper appearance in the Frontier!
- Sadhorizon:
- - rscadd: Added the Sunskipper-class Culinary Vessel.
- - rscadd: Every drink and booze dispenser drink is in the booze-o-mat now.
- - rscadd: Added bottles for triple sec, lemon juice, creme de cacao and creme de
- menthe.
- - rscdel: Removed the Boyardee-class Entertainment Vessel.
- - rscdel: Independent chefs no longer get kitchen cqc.
- - tweak: The "syndicate waiter's outfit" renamed to just "waiter's outfit".
- - tweak: Indpenedent bartenders now start with a waistcoat.
- - tweak: Edited waiter's outfit. Also, the role now gets kitchen access.
- - tweak: Independent cooks now start with laceup shoes.
- meemofcourse:
- - rscadd: SUNS 3x6 logo decal, SUNS tiles, SUNS emblem floor decal, Desk and Wall
- flag, folders, PDA, cards, locker, bedsheets, and headsets.
-2024-06-14:
- Gristlebee:
- - bugfix: Posibrains/MMI pilots being permaslept on mech destruction
-2024-06-15:
- Rye-Rice:
- - imageadd: Rylie Was Forced To Resprite Concrete when she was 6!
-2024-06-16:
- DIB-DOG:
- - rscadd: Added 1 Raksha Helmet to the sergeant's locker on the PGFN Crying Sun
-2024-06-17:
- meemofcourse:
- - code_imp: A lot of SUNS decals.
-2024-06-18:
- '@thestripes, @meemofcourse , @GenericDM ':
- - tweak: reflavors nearly every drink ingame
- SomeguyManperson:
- - rscadd: you can now put organs inside burgers or on pizzas
-2024-06-19:
- Anticept:
- - bugfix: Generic adjective selection will show for everyone.
- FalloutFalcon:
- - bugfix: fixed multiple of the do_afters not working due to misplaced args
- PositiveEntropy:
- - rscadd: The Hunters of Illestren have now allowed for Hunter Collignes, Machinists
- and Flamebearers to now roam the Frontier aboard their humble fleet!
- - imageadd: The Saint Roumain's Militia has been fully resprited!
- - imageadd: All SRM jobs now have unique HUD icons!
- - imageadd: The Unknown Job HUD icon has been resprited!
- SomeguyManperson:
- - bugfix: mobs will no longer stick around after being butchered sometimes
- Yata9ar4su:
- - bugfix: Atmos mask sprite
-2024-06-20:
- FalloutFalcon:
- - admin: reverted filling admin context menus with alot of not useful stuff by rehiding
- it behind a toggle.
- Gristlebee:
- - rscadd: Energy guns show how much charge and shots they have remaining, or if
- it doesnt have a cell installed on examine.
- - code_imp: span classes to span macros for energy.dm
- Sadhorizon:
- - tweak: SRM cabinets - namely, Hunter's, Shadow's and Flamebearer's - now use cabinet
- sounds.
- Skies-Of-Blue:
- - balance: you can now float over tables when in 0g
- - balance: you no longer shatter glass tables when floating
- SomeguyManperson:
- - balance: 9mm boxes are now cheaper than other pistol calibers to account for the
- lower damage per bullet
- generalthrax:
- - bugfix: The black market sawed off Illestren is now actually sawed off, and can
- fit on your belt
- - bugfix: The presawn double barrel shotgun can now fit on the belt like normal
- sawn off double barrels
- - rscdel: Removed invisible limb armour from Gezenan marine + navywear
- - rscadd: Allowed Gezenan armour to hold all guns like normal armour
- - bugfix: Fixed Montagne hat description to reflect the fact it is no longer armoured
-2024-06-21:
- FalloutFalcon:
- - rscadd: Bank accounts are now handled through cash cards! You now spawn with a
- wallet to store your extra card!
- Gristlebee:
- - balance: Motorized wheelchairs consume less power on move
- Thera-Pissed:
- - rscadd: Added Hydrogen, and Combustion Thrusters to go with!
- rye-rice:
- - rscadd: Adds a war correspondent for CLIP.
-2024-06-22:
- Anticept:
- - bugfix: Dialed down the loudness of a couple Kepori sounds
- - bugfix: Kepori wooping now has the audible flag.
- - bugfix: Whistling now varies in pitch
- PositiveEntropy:
- - imageadd: SUNS trimline decals are now properly aligned.
- Sadhorizon:
- - rscadd: Bone Talisman and Hunter's Necklace were added to loadout.
- - tweak: Bone Talisman and Hunter's Necklace were reflavored into good lack charms.
- They are no longer armored.
- - tweak: Wolf talisman crafting recipe now requires less stuff.
- - bugfix: Blue wall locker sprites are no longer flipped.
- SomeguyManperson:
- - balance: crystal legion spawn 1 less skull per spawn wave, now 1 (like normal
- legion)
- - balance: brimdemon beams now have a fade-in effect before dealing damage, making
- it harder to get instantly chunked for a quarter of your health
- - balance: brimdemons can no longer aggro on you before you can see them
- - balance: radiation collectors are now significantly more stingy about the potency
- of the radiation they will process. Don't expect old nuclear waste or openly
- stored uranium to do much.
- - balance: radiation collectors also produce significantly more power from the remaining
- viable sources
- Thera-Pissed:
- - bugfix: infinite negative power draw while calling your grandmother no longer
- happens.
- - bugfix: fixed volume pumps for mapping.
- blinkdog:
- - bugfix: Cleaned up some logic in revolver safety
- generalthrax:
- - bugfix: Tadrixx Float has a sprite again
- - rscadd: You can now tail thump if you have a tail instead of it being tied to
- species
-2024-06-25:
- Martinpachu:
- - rscadd: Cargo guns and certain guns in ships now come inside cases alongside some
- magazines, the ammo now comes separately for safety reasons.
-2024-06-27:
- Gristlebee:
- - tweak: Saber SMG stock folds
- - tweak: TEC-9 Pistol is now automatic and normal sized
- - balance: Combat shotgun is now bulky, and the compact combat shotgun is normal.
- Martinpachu:
- - rscadd: A technique for gunslinger with the lever-action flaming arrow! Firing
- it while wielded will quickly and automatically rack the lever, less quickly
- than a .38 revolver or fanned shadow though.
- - rscdel: The +5 damage and AP bonus on the shadow while using it as a gunslinger.
- Sadhorizon:
- - rscdel: Miners and Cargo Technicians no longer get QM access.
- SomeguyManperson:
- - bugfix: cyborgs can touch people again
- - code_imp: robotic limbs will always have healing prioritized over being cauterized
- if treated with a welder
- generalthrax:
- - rscdel: Tranquility reagent no longer turns you into a gondola
- - bugfix: Fixed typos in the Shadow and Montagne revolvers
- - bugfix: Black market rusted reds no longer flash into dust when you purchase them
- thestripes:
- - rscadd: Added Kepori names, surnames, and a list for the char gen to draw from.
- Remember to update your character names!
- - rscdel: Removed old Kepori name gen system and a bit of lore from the species
- blurb
diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml
deleted file mode 100644
index 9f9679a752b3..000000000000
--- a/html/changelogs/archive/2024-07.yml
+++ /dev/null
@@ -1,167 +0,0 @@
-2024-07-01:
- Skies-Of-Blue:
- - bugfix: you can now rotate wheelchairs, just as god intended
-2024-07-02:
- GenericDM:
- - bugfix: fixes exactly one typographical error somewhere in the code
-2024-07-03:
- Cloudbreak:
- - code_imp: Typographical error fixed.
-2024-07-04:
- Latentish:
- - rscadd: Added the Panacea-class
- - rscdel: Removed the Aegis-class
- generalthrax:
- - bugfix: Fixed Comet Trail, Molten Bubbles, and Sunset Sarsaparilla glass sprites
-2024-07-06:
- Sadhorizon:
- - bugfix: Dog beds start anchored now. Mobs can no longer move while buckled.
- rye-rice:
- - rscadd: Resprites the E-50 and gives it proper inhands now!
- - bugfix: The Syndicate sniper rifle fires at a normal rate of fire and has the
- correct recoil now.
-2024-07-09:
- Apogee-dev:
- - bugfix: N+S Captains no longer spawn with Nanotrasen coats.
- - balance: reduced default ship spawn limit to 1.
- - bugfix: Cargo pods no longer land in Talos maint
- - bugfix: Gas tanks on the Talos have higher security
- - bugfix: Talos now has an autolathe in cargo
- Sadhorizon:
- - rscadd: Added a plastic flower - a selection of flowers to wear. Added it to the
- loadout too.
- SapphicOverload:
- - rscadd: Adds an igniter and button to the TEG of every ship that was missing one
- - rscdel: Removed the welding tool TEG chute some ships had
- SomeguyManperson:
- - bugfix: loadout boxes will no longer sometimes not spawn
- - code_imp: People who are stunned are now more reliably passed by bullets not aimed
- directly at them
- generalthrax:
- - rscdel: Removed some irrelevant old tips of the round
- - rscadd: Added 80+ new tips more relevant to Shiptest's gameplay loop
-2024-07-10:
- Cloudbreak:
- - bugfix: A few clothing items now properly display again for Vox.
- meemofcourse:
- - rscadd: Minor changes to the Tortuga.
- - bugfix: The holofields on the Tortuga-class and Brawler-class now work.
-2024-07-11:
- Cloudbreak:
- - code_imp: Fixes a singular typo within the code.
- Martinpachu:
- - balance: Pizzas have become cheaper. (6000 cr - 3000 cr)
- PositiveEntropy:
- - bugfix: Mars and Venus are now referred to by their correct names!
- - bugfix: You can now store guns, ammunition, and melee weapons on the armor slot
- when equipping a SolCon/SolGov hardsuit, and its subtypes!
- generalthrax:
- - rscdel: Removed tator tots and raw potato wedges
-2024-07-12:
- generalthrax:
- - rscdel: Removed mice possession
- - rscdel: Broad removal of forcesays from most reagents and items
- - rscdel: Removed char reagent and spraytan overdose
- - rscdel: Removed gibbering lines
- - rscdel: Removed Chav, Swedish, Elvis mutations
- - rscadd: The outpost is now offering bounties to defuse landmines to Frontier vessels.
- meemofcourse:
- - balance: Remapped the Valor, with two extra jobs (Shuttle Corpsman, Shuttle Pilot).
- - code_imp: The Vanguard base outfit starts with gear.
-2024-07-13:
- FalloutFalcon:
- - bugfix: pets no longer cause run times trying to open ship doors
- - bugfix: no longer have to reinsert your id into your wallet for access
- - rscadd: A new generic nest used across all planets
- - rscdel: Old portal and tendrils and other cruft
- - refactor: refactorted mob spawners to have one for each planet
- Gristlebee:
- - bugfix: 357 guncase spawns with the correct revolver
- Skies-Of-Blue:
- - balance: you can now fit radios and pill bottles in both hoodies and winter coats
- - bugfix: the innate storage on winter coats has been restored, alt click to access!
- SomeguyManperson:
- - bugfix: brute damage is now required to break bones
- TiberianEuan:
- - rscadd: Black hoodie with grey hood.
- - imageadd: New hoodie icons.
- cuddleandtea:
- - admin: new light maker subtype for build mode
- generalthrax:
- - bugfix: Fixed the Landmine mission description and flavoured it a little
- - balance: Decreased the amount of landmines required for its mission and increased
- the value per mine slightly
- - rscdel: Capsaicin no longer Boils you
-2024-07-15:
- FalloutFalcon:
- - refactor: refactored attachments to be modular
- Sadhorizon:
- - tweak: Changed sunskipper's prefix to SV.
- - bugfix: Added a missing pipe to the sunskipper.
- Skies-Of-Blue:
- - rscadd: typing indicators now trigger off of the command bar
- - rscadd: an SSD Indicator for when you have been disconnected for less than three
- minutes
- - balance: players will now remain awake for three minutes after disconnecting,
- with a new SSD icon to boot!
- - balance: players SSD longer than three minutes will lose their icon and fall asleep,
- much like the previous behavior
- SomeguyManperson:
- - bugfix: gun cargo packs now act more as they would be expected to
-2024-07-17:
- FalloutFalcon:
- - rscadd: Orbit menu is less cluttered and just shows the real name, hovering over
- it shows their standard name.
- - refactor: refactored express console to not be a subtype of the cargo console
- and replacing it.
- Martinpachu:
- - balance: Doubled the price on every automatic gun and added 250 credits to the
- price of every semi-auto pistol.
- Sadhorizon:
- - tweak: Choice beacons were reflavored into choice boxes.
- - rscdel: Removed a bunch of meme, weird and unused items from the loadout.
- - tweak: Reflavored the Cybersun labcoat into a generic "translucent labcoat"
- SomeguyManperson:
- - bugfix: ships docked to eachother now share gravity
-2024-07-18:
- Fest1v3:
- - rscadd: adds a few vox sprites
- - bugfix: fixes a few vox sprites
-2024-07-24:
- DIB-DOG:
- - bugfix: fixed the foodtype of two Gezenan drinks to match their descriptions
- - rscadd: added a taste description to Keh'Lu'Tex Liqueur
- Gristlebee:
- - rscadd: Acquire Mission containers and Mission drills display their objective
- type.
- - rscadd: Changed name of base fish type to generic fish
- SomeguyManperson:
- - bugfix: the BG-16 is now as ammo efficient as the BG-12
- - bugfix: the BG-16 has automatic fire again
- generalthrax:
- - balance: Undoubles the price on every automatic gun and removed 250 from the price
- of every semi-auto pistol.
-2024-07-26:
- Cloudbreak:
- - rscadd: A new ruin, the Abandoned Listening Post.
- - rscadd: Areas associated with the listening post.
- - bugfix: Single line in maps catalogue.
-2024-07-27:
- Gristlebee:
- - rscadd: Marker beacons can now be printed at the autolathe from the Misc tab
-2024-07-31:
- rkz, benbot(benjamin), Time-Green, SteelSlayer, floyd, Qustinuus, ArcaneDefence, FlowerCuco:
- - rscadd: Food storage! Hide some glass in the captains cake! Begone digestive tract!
- - rscadd: Bread, Cake and Spaghetti to Newfood
- - rscadd: some smaller foods can now be eaten whilst on the run! (This ONLY applies
- to newfood items thus far!)
- - rscadd: converted edible component to work with newfood
- - rscdel: oldfood for Bread, Cake and Spaghetti
- - rscdel: Temporarily removes customfood bread, cake, pasta, and sandwiches
- - tweak: edited a few messed up values
- - tweak: food trash is sensible now. Finishing stuff like cake will actually spawn
- a plate rubbish. Instead of you eating the plate, biggun, perhaps properly dispose
- of it!
- - bugfix: Wildly STUPID item weights. Candycorn and cakes are no longer the SAME
- size
- - code_imp: provides some semblance of sorting for signal defines
diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml
deleted file mode 100644
index 649d80730901..000000000000
--- a/html/changelogs/archive/2024-08.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-2024-08-02:
- FalloutFalcon:
- - rscadd: New admin button to launch a distress announcement quicker.
- Sadhorizon:
- - tweak: Cafe latte, iced coffee, hot ice coffee and soy latte now only make your
- character jitter on OD.
- - tweak: Reduced the prices of first aid kits.
- - tweak: Remapped the Kilo-class Mining Ship
- SomeguyManperson:
- - rscadd: legion attacks will now inject an organ which eventually causes a transformation,
- rather than instantly killing and transforming people.
diff --git a/html/typing_indicator.html b/html/typing_indicator.html
deleted file mode 100644
index 2988edff55fa..000000000000
--- a/html/typing_indicator.html
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi
index bab677d404e9..b64b8f0427e2 100644
Binary files a/icons/effects/ore_visuals.dmi and b/icons/effects/ore_visuals.dmi differ
diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi
index 44698597b02c..db1e5fdba40b 100644
Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ
diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi
index 7e87f94fd183..d23ebfae4756 100644
Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 5508bc67523c..e8702376efce 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index 7568a1274d66..f334af20104e 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi
new file mode 100644
index 000000000000..bc048fc920c9
Binary files /dev/null and b/icons/mob/clothing/belt_mirror.dmi differ
diff --git a/icons/mob/clothing/ears.dmi b/icons/mob/clothing/ears.dmi
index e7376425f545..23292b118d6a 100644
Binary files a/icons/mob/clothing/ears.dmi and b/icons/mob/clothing/ears.dmi differ
diff --git a/icons/mob/clothing/faction/clip/head.dmi b/icons/mob/clothing/faction/clip/head.dmi
index 5679758b2f61..71edbf436e96 100644
Binary files a/icons/mob/clothing/faction/clip/head.dmi and b/icons/mob/clothing/faction/clip/head.dmi differ
diff --git a/icons/mob/clothing/faction/clip/suits.dmi b/icons/mob/clothing/faction/clip/suits.dmi
index c68ab77196bb..785040d022fe 100644
Binary files a/icons/mob/clothing/faction/clip/suits.dmi and b/icons/mob/clothing/faction/clip/suits.dmi differ
diff --git a/icons/mob/clothing/faction/clip/vox.dmi b/icons/mob/clothing/faction/clip/vox.dmi
index e17d23fba20f..882e41864ea0 100644
Binary files a/icons/mob/clothing/faction/clip/vox.dmi and b/icons/mob/clothing/faction/clip/vox.dmi differ
diff --git a/icons/mob/clothing/faction/frontiersmen/belt.dmi b/icons/mob/clothing/faction/frontiersmen/belt.dmi
deleted file mode 100644
index a36573e66f5d..000000000000
Binary files a/icons/mob/clothing/faction/frontiersmen/belt.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/frontiersmen/head.dmi b/icons/mob/clothing/faction/frontiersmen/head.dmi
deleted file mode 100644
index 03f2024b1e88..000000000000
Binary files a/icons/mob/clothing/faction/frontiersmen/head.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/frontiersmen/mask.dmi b/icons/mob/clothing/faction/frontiersmen/mask.dmi
deleted file mode 100644
index ecd716cdea0d..000000000000
Binary files a/icons/mob/clothing/faction/frontiersmen/mask.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/frontiersmen/suits.dmi b/icons/mob/clothing/faction/frontiersmen/suits.dmi
deleted file mode 100644
index 50657c4df15e..000000000000
Binary files a/icons/mob/clothing/faction/frontiersmen/suits.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/frontiersmen/uniforms.dmi b/icons/mob/clothing/faction/frontiersmen/uniforms.dmi
deleted file mode 100644
index 6dad817d6b64..000000000000
Binary files a/icons/mob/clothing/faction/frontiersmen/uniforms.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/hardliners/belt.dmi b/icons/mob/clothing/faction/hardliners/belt.dmi
deleted file mode 100644
index a864128547d6..000000000000
Binary files a/icons/mob/clothing/faction/hardliners/belt.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/hardliners/eyes.dmi b/icons/mob/clothing/faction/hardliners/eyes.dmi
deleted file mode 100644
index aec97963fd99..000000000000
Binary files a/icons/mob/clothing/faction/hardliners/eyes.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/hardliners/head.dmi b/icons/mob/clothing/faction/hardliners/head.dmi
deleted file mode 100644
index 839826a7c426..000000000000
Binary files a/icons/mob/clothing/faction/hardliners/head.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/hardliners/suits.dmi b/icons/mob/clothing/faction/hardliners/suits.dmi
deleted file mode 100644
index 05f41eb00d25..000000000000
Binary files a/icons/mob/clothing/faction/hardliners/suits.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/hardliners/uniforms.dmi b/icons/mob/clothing/faction/hardliners/uniforms.dmi
deleted file mode 100644
index 8726f50b2f54..000000000000
Binary files a/icons/mob/clothing/faction/hardliners/uniforms.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/ngr/head.dmi b/icons/mob/clothing/faction/ngr/head.dmi
index c370f07aa0f3..08af6ee9ba08 100644
Binary files a/icons/mob/clothing/faction/ngr/head.dmi and b/icons/mob/clothing/faction/ngr/head.dmi differ
diff --git a/icons/mob/clothing/faction/srm/head.dmi b/icons/mob/clothing/faction/srm/head.dmi
deleted file mode 100644
index 186d021abeb3..000000000000
Binary files a/icons/mob/clothing/faction/srm/head.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/srm/suits.dmi b/icons/mob/clothing/faction/srm/suits.dmi
deleted file mode 100644
index 801414dceec7..000000000000
Binary files a/icons/mob/clothing/faction/srm/suits.dmi and /dev/null differ
diff --git a/icons/mob/clothing/faction/srm/uniforms.dmi b/icons/mob/clothing/faction/srm/uniforms.dmi
deleted file mode 100644
index b43a33a34e8d..000000000000
Binary files a/icons/mob/clothing/faction/srm/uniforms.dmi and /dev/null differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index f207b2bfd826..721de12b60b6 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head/armor.dmi b/icons/mob/clothing/head/armor.dmi
index 38adc74f3317..4cec91ad0110 100644
Binary files a/icons/mob/clothing/head/armor.dmi and b/icons/mob/clothing/head/armor.dmi differ
diff --git a/icons/mob/clothing/head/spacesuits.dmi b/icons/mob/clothing/head/spacesuits.dmi
index 55a7f69de51f..12923a0e281c 100644
Binary files a/icons/mob/clothing/head/spacesuits.dmi and b/icons/mob/clothing/head/spacesuits.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index bfcc9970930f..2b54aa38a584 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index f168673850e0..a22e958effd8 100644
Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ
diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi
index 4c37ff4d8bff..d64a4cbbf04f 100644
Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ
diff --git a/icons/mob/clothing/suits/hooded.dmi b/icons/mob/clothing/suits/hooded.dmi
index e1f98d991357..a4be6f11f793 100644
Binary files a/icons/mob/clothing/suits/hooded.dmi and b/icons/mob/clothing/suits/hooded.dmi differ
diff --git a/icons/mob/clothing/suits/spacesuits.dmi b/icons/mob/clothing/suits/spacesuits.dmi
index da5075195992..ee9896871a91 100644
Binary files a/icons/mob/clothing/suits/spacesuits.dmi and b/icons/mob/clothing/suits/spacesuits.dmi differ
diff --git a/icons/mob/clothing/suits/toggle.dmi b/icons/mob/clothing/suits/toggle.dmi
index 99fddcf51169..8ceffd1312c0 100644
Binary files a/icons/mob/clothing/suits/toggle.dmi and b/icons/mob/clothing/suits/toggle.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index dced69dc5b6f..3926bce0f3b1 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/inhands/misc/food_lefthand.dmi b/icons/mob/inhands/misc/food_lefthand.dmi
index 63dee7bfea44..740c63c4b370 100644
Binary files a/icons/mob/inhands/misc/food_lefthand.dmi and b/icons/mob/inhands/misc/food_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/food_righthand.dmi b/icons/mob/inhands/misc/food_righthand.dmi
index bb1bd3f960fb..1e90ac3cb75a 100644
Binary files a/icons/mob/inhands/misc/food_righthand.dmi and b/icons/mob/inhands/misc/food_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
index ff71ba99e3c0..d356f95fd272 100644
Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
index c40ac3335e06..b69fb6ff8f74 100644
Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 1e271758e346..a05f9c8dc678 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/simple_frontiersman.dmi b/icons/mob/simple_frontiersman.dmi
deleted file mode 100644
index c5b9962fd236..000000000000
Binary files a/icons/mob/simple_frontiersman.dmi and /dev/null differ
diff --git a/icons/mob/species/human/dog.dmi b/icons/mob/species/human/dog.dmi
deleted file mode 100644
index 3b3241059638..000000000000
Binary files a/icons/mob/species/human/dog.dmi and /dev/null differ
diff --git a/icons/mob/species/human/elf.dmi b/icons/mob/species/human/elf.dmi
deleted file mode 100644
index 7a37d6fd9580..000000000000
Binary files a/icons/mob/species/human/elf.dmi and /dev/null differ
diff --git a/icons/mob/species/human/rabbit.dmi b/icons/mob/species/human/rabbit.dmi
deleted file mode 100644
index fcc6599f7356..000000000000
Binary files a/icons/mob/species/human/rabbit.dmi and /dev/null differ
diff --git a/icons/mob/species/kepori/onmob_suit_kepori.dmi b/icons/mob/species/kepori/onmob_suit_kepori.dmi
index 649853ea7280..6182a9612547 100644
Binary files a/icons/mob/species/kepori/onmob_suit_kepori.dmi and b/icons/mob/species/kepori/onmob_suit_kepori.dmi differ
diff --git a/icons/mob/species/human/cat.dmi b/icons/mob/species/misc/cat.dmi
similarity index 100%
rename from icons/mob/species/human/cat.dmi
rename to icons/mob/species/misc/cat.dmi
diff --git a/icons/mob/species/human/fox.dmi b/icons/mob/species/misc/fox.dmi
similarity index 100%
rename from icons/mob/species/human/fox.dmi
rename to icons/mob/species/misc/fox.dmi
diff --git a/icons/mob/species/vox/onmob_eyes_vox.dmi b/icons/mob/species/vox/onmob_eyes_vox.dmi
index 947496cfb889..2a30fe355bf1 100644
Binary files a/icons/mob/species/vox/onmob_eyes_vox.dmi and b/icons/mob/species/vox/onmob_eyes_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_hands_vox.dmi b/icons/mob/species/vox/onmob_hands_vox.dmi
index 977e9a71a7c5..ff5c1a11df61 100644
Binary files a/icons/mob/species/vox/onmob_hands_vox.dmi and b/icons/mob/species/vox/onmob_hands_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_head_vox.dmi b/icons/mob/species/vox/onmob_head_vox.dmi
index c470ee12dbe4..0ab1c3be9674 100644
Binary files a/icons/mob/species/vox/onmob_head_vox.dmi and b/icons/mob/species/vox/onmob_head_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_mask_vox.dmi b/icons/mob/species/vox/onmob_mask_vox.dmi
index 7aa3dfb2e046..b460caedb721 100644
Binary files a/icons/mob/species/vox/onmob_mask_vox.dmi and b/icons/mob/species/vox/onmob_mask_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_suit_vox.dmi b/icons/mob/species/vox/onmob_suit_vox.dmi
index a7052320af9c..7b2ee1c8d1c9 100644
Binary files a/icons/mob/species/vox/onmob_suit_vox.dmi and b/icons/mob/species/vox/onmob_suit_vox.dmi differ
diff --git a/icons/mob/ssd_indicator.dmi b/icons/mob/ssd_indicator.dmi
deleted file mode 100644
index 3f7d100b6c67..000000000000
Binary files a/icons/mob/ssd_indicator.dmi and /dev/null differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 86001423aeba..6fac77253d60 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi
index 712adf5af17f..b80be47c795d 100644
Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ
diff --git a/icons/obj/atmospherics/components/binary_devices.dmi b/icons/obj/atmospherics/components/binary_devices.dmi
index b666f391e793..0a044c498faa 100644
Binary files a/icons/obj/atmospherics/components/binary_devices.dmi and b/icons/obj/atmospherics/components/binary_devices.dmi differ
diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi
index c4cae890b54c..56657861f576 100644
Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 17bab47dc9ef..df05a9d601e3 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi
index 82d3a62d06bd..1607dc47db22 100644
Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index 119b420f182a..715fb82d988e 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index ecf54fb9f61a..e0818c6853df 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/faction/clip/head.dmi b/icons/obj/clothing/faction/clip/head.dmi
index 06962106e6e7..b98ec00ea8e8 100644
Binary files a/icons/obj/clothing/faction/clip/head.dmi and b/icons/obj/clothing/faction/clip/head.dmi differ
diff --git a/icons/obj/clothing/faction/clip/suits.dmi b/icons/obj/clothing/faction/clip/suits.dmi
index 8dcc6fa72e9f..81e6ee001a2b 100644
Binary files a/icons/obj/clothing/faction/clip/suits.dmi and b/icons/obj/clothing/faction/clip/suits.dmi differ
diff --git a/icons/obj/clothing/faction/frontiersmen/belt.dmi b/icons/obj/clothing/faction/frontiersmen/belt.dmi
deleted file mode 100644
index 01a020e47cfb..000000000000
Binary files a/icons/obj/clothing/faction/frontiersmen/belt.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/frontiersmen/head.dmi b/icons/obj/clothing/faction/frontiersmen/head.dmi
deleted file mode 100644
index f68169a5be65..000000000000
Binary files a/icons/obj/clothing/faction/frontiersmen/head.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/frontiersmen/mask.dmi b/icons/obj/clothing/faction/frontiersmen/mask.dmi
deleted file mode 100644
index 961d27b0891f..000000000000
Binary files a/icons/obj/clothing/faction/frontiersmen/mask.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/frontiersmen/suits.dmi b/icons/obj/clothing/faction/frontiersmen/suits.dmi
deleted file mode 100644
index 65c817191371..000000000000
Binary files a/icons/obj/clothing/faction/frontiersmen/suits.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/frontiersmen/uniforms.dmi b/icons/obj/clothing/faction/frontiersmen/uniforms.dmi
deleted file mode 100644
index 7228ca93fc81..000000000000
Binary files a/icons/obj/clothing/faction/frontiersmen/uniforms.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/hardliners/belt.dmi b/icons/obj/clothing/faction/hardliners/belt.dmi
deleted file mode 100644
index e8925f9c5d36..000000000000
Binary files a/icons/obj/clothing/faction/hardliners/belt.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/hardliners/eyes.dmi b/icons/obj/clothing/faction/hardliners/eyes.dmi
deleted file mode 100644
index 2e339c1b510a..000000000000
Binary files a/icons/obj/clothing/faction/hardliners/eyes.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/hardliners/head.dmi b/icons/obj/clothing/faction/hardliners/head.dmi
deleted file mode 100644
index 5101eeedce9c..000000000000
Binary files a/icons/obj/clothing/faction/hardliners/head.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/hardliners/suits.dmi b/icons/obj/clothing/faction/hardliners/suits.dmi
deleted file mode 100644
index 39da1c952739..000000000000
Binary files a/icons/obj/clothing/faction/hardliners/suits.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/hardliners/uniforms.dmi b/icons/obj/clothing/faction/hardliners/uniforms.dmi
deleted file mode 100644
index 233eb500c826..000000000000
Binary files a/icons/obj/clothing/faction/hardliners/uniforms.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/ngr/head.dmi b/icons/obj/clothing/faction/ngr/head.dmi
index d2258c5565dd..822766336620 100644
Binary files a/icons/obj/clothing/faction/ngr/head.dmi and b/icons/obj/clothing/faction/ngr/head.dmi differ
diff --git a/icons/obj/clothing/faction/srm/head.dmi b/icons/obj/clothing/faction/srm/head.dmi
deleted file mode 100644
index 8503fda7e3cf..000000000000
Binary files a/icons/obj/clothing/faction/srm/head.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/srm/suits.dmi b/icons/obj/clothing/faction/srm/suits.dmi
deleted file mode 100644
index 031fb45e3ba6..000000000000
Binary files a/icons/obj/clothing/faction/srm/suits.dmi and /dev/null differ
diff --git a/icons/obj/clothing/faction/srm/uniforms.dmi b/icons/obj/clothing/faction/srm/uniforms.dmi
deleted file mode 100644
index ec410e52e600..000000000000
Binary files a/icons/obj/clothing/faction/srm/uniforms.dmi and /dev/null differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 402ce131a988..fb23d4bc2afe 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/head/armor.dmi b/icons/obj/clothing/head/armor.dmi
index 6757e591c853..c6792be933fc 100644
Binary files a/icons/obj/clothing/head/armor.dmi and b/icons/obj/clothing/head/armor.dmi differ
diff --git a/icons/obj/clothing/head/spacesuits.dmi b/icons/obj/clothing/head/spacesuits.dmi
index 8befad3b380f..5c2351c7489f 100644
Binary files a/icons/obj/clothing/head/spacesuits.dmi and b/icons/obj/clothing/head/spacesuits.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index 3109928ff7ae..049da153701a 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi
index 232a2f6ec2bd..9eaa67f04a42 100644
Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ
diff --git a/icons/obj/clothing/suits/hooded.dmi b/icons/obj/clothing/suits/hooded.dmi
index 6d449550ad43..5b04aa13aaa7 100644
Binary files a/icons/obj/clothing/suits/hooded.dmi and b/icons/obj/clothing/suits/hooded.dmi differ
diff --git a/icons/obj/clothing/suits/spacesuits.dmi b/icons/obj/clothing/suits/spacesuits.dmi
index 2208c8b7cf98..c86acdcbf3e5 100644
Binary files a/icons/obj/clothing/suits/spacesuits.dmi and b/icons/obj/clothing/suits/spacesuits.dmi differ
diff --git a/icons/obj/clothing/suits/toggle.dmi b/icons/obj/clothing/suits/toggle.dmi
index 75a2f1a891b3..54df84ad5def 100644
Binary files a/icons/obj/clothing/suits/toggle.dmi and b/icons/obj/clothing/suits/toggle.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index 20fe8abf2d5c..b34b3777adac 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/deskflags.dmi b/icons/obj/deskflags.dmi
index 6a950bcebc4e..cf1eaacf5bb3 100644
Binary files a/icons/obj/deskflags.dmi and b/icons/obj/deskflags.dmi differ
diff --git a/icons/obj/drinks/drinks.dmi b/icons/obj/drinks/drinks.dmi
index 2ab3cd0db5ef..03fdf63dd00b 100644
Binary files a/icons/obj/drinks/drinks.dmi and b/icons/obj/drinks/drinks.dmi differ
diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi
index cffb7c94b6e5..5d82ef881973 100644
Binary files a/icons/obj/economy.dmi and b/icons/obj/economy.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index a200515c324f..118ce7693637 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/guncase.dmi b/icons/obj/guncase.dmi
deleted file mode 100644
index 4941b965f2f8..000000000000
Binary files a/icons/obj/guncase.dmi and /dev/null differ
diff --git a/icons/obj/guncase_48x32.dmi b/icons/obj/guncase_48x32.dmi
deleted file mode 100644
index b5dc20bc64e5..000000000000
Binary files a/icons/obj/guncase_48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/48x32guns.dmi b/icons/obj/guns/48x32guns.dmi
index 960b9ec448af..232ecdb35e02 100644
Binary files a/icons/obj/guns/48x32guns.dmi and b/icons/obj/guns/48x32guns.dmi differ
diff --git a/icons/obj/guns/attachments.dmi b/icons/obj/guns/attachments.dmi
deleted file mode 100644
index 29ae084d5759..000000000000
Binary files a/icons/obj/guns/attachments.dmi and /dev/null differ
diff --git a/icons/obj/guns/bayonets.dmi b/icons/obj/guns/bayonets.dmi
new file mode 100644
index 000000000000..32b5448b8edc
Binary files /dev/null and b/icons/obj/guns/bayonets.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 6a32de5b08fb..3208083cd0bd 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/guns/faction/gezena/48x32.dmi b/icons/obj/guns/faction/gezena/48x32.dmi
new file mode 100644
index 000000000000..29c89ec1edb1
Binary files /dev/null and b/icons/obj/guns/faction/gezena/48x32.dmi differ
diff --git a/icons/obj/guns/faction/gezena/energy.dmi b/icons/obj/guns/faction/gezena/energy.dmi
new file mode 100644
index 000000000000..be3b5b2f71d6
Binary files /dev/null and b/icons/obj/guns/faction/gezena/energy.dmi differ
diff --git a/icons/obj/guns/manufacturer/etherbor/lefthand.dmi b/icons/obj/guns/faction/gezena/lefthand.dmi
similarity index 100%
rename from icons/obj/guns/manufacturer/etherbor/lefthand.dmi
rename to icons/obj/guns/faction/gezena/lefthand.dmi
diff --git a/icons/obj/guns/manufacturer/etherbor/righthand.dmi b/icons/obj/guns/faction/gezena/righthand.dmi
similarity index 100%
rename from icons/obj/guns/manufacturer/etherbor/righthand.dmi
rename to icons/obj/guns/faction/gezena/righthand.dmi
diff --git a/icons/obj/guns/flashlights.dmi b/icons/obj/guns/flashlights.dmi
new file mode 100644
index 000000000000..eef6d953f94a
Binary files /dev/null and b/icons/obj/guns/flashlights.dmi differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi b/icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi
deleted file mode 100644
index d87a6f3c8433..000000000000
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi b/icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi
deleted file mode 100644
index 7673c2f6d642..000000000000
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi b/icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi
deleted file mode 100644
index 4f9158d2d36d..000000000000
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi b/icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi
deleted file mode 100644
index 4549f30f4ff9..000000000000
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/eoehoma/48x32.dmi b/icons/obj/guns/manufacturer/eoehoma/48x32.dmi
deleted file mode 100644
index 5ab3ee4a0cb0..000000000000
Binary files a/icons/obj/guns/manufacturer/eoehoma/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/eoehoma/lefthand.dmi b/icons/obj/guns/manufacturer/eoehoma/lefthand.dmi
deleted file mode 100644
index 9fd5086f4003..000000000000
Binary files a/icons/obj/guns/manufacturer/eoehoma/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/eoehoma/onmob.dmi b/icons/obj/guns/manufacturer/eoehoma/onmob.dmi
deleted file mode 100644
index f4b14ced71a7..000000000000
Binary files a/icons/obj/guns/manufacturer/eoehoma/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/eoehoma/righthand.dmi b/icons/obj/guns/manufacturer/eoehoma/righthand.dmi
deleted file mode 100644
index c1f9ccab3ff0..000000000000
Binary files a/icons/obj/guns/manufacturer/eoehoma/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/etherbor/48x32.dmi b/icons/obj/guns/manufacturer/etherbor/48x32.dmi
deleted file mode 100644
index e5a9074f06c2..000000000000
Binary files a/icons/obj/guns/manufacturer/etherbor/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/etherbor/onmob.dmi b/icons/obj/guns/manufacturer/etherbor/onmob.dmi
deleted file mode 100644
index 43e539c557b8..000000000000
Binary files a/icons/obj/guns/manufacturer/etherbor/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/48x32.dmi b/icons/obj/guns/manufacturer/frontier_import/48x32.dmi
deleted file mode 100644
index 149793c43c38..000000000000
Binary files a/icons/obj/guns/manufacturer/frontier_import/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi b/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi
deleted file mode 100644
index 33b3381bdfe0..000000000000
Binary files a/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/onmob.dmi b/icons/obj/guns/manufacturer/frontier_import/onmob.dmi
deleted file mode 100644
index a0706579ccb5..000000000000
Binary files a/icons/obj/guns/manufacturer/frontier_import/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/righthand.dmi b/icons/obj/guns/manufacturer/frontier_import/righthand.dmi
deleted file mode 100644
index 73945b8524df..000000000000
Binary files a/icons/obj/guns/manufacturer/frontier_import/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi b/icons/obj/guns/manufacturer/hunterspride/48x32.dmi
deleted file mode 100644
index 19b4202da78a..000000000000
Binary files a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi b/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi
deleted file mode 100644
index 4fb5eca5c011..000000000000
Binary files a/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/onmob.dmi b/icons/obj/guns/manufacturer/hunterspride/onmob.dmi
deleted file mode 100644
index 8911c8fbb68f..000000000000
Binary files a/icons/obj/guns/manufacturer/hunterspride/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/righthand.dmi b/icons/obj/guns/manufacturer/hunterspride/righthand.dmi
deleted file mode 100644
index 043167735662..000000000000
Binary files a/icons/obj/guns/manufacturer/hunterspride/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/inteq/48x32.dmi b/icons/obj/guns/manufacturer/inteq/48x32.dmi
deleted file mode 100644
index e7deb0f12ce0..000000000000
Binary files a/icons/obj/guns/manufacturer/inteq/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/inteq/lefthand.dmi b/icons/obj/guns/manufacturer/inteq/lefthand.dmi
deleted file mode 100644
index 19335eb44ff9..000000000000
Binary files a/icons/obj/guns/manufacturer/inteq/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/inteq/onmob.dmi b/icons/obj/guns/manufacturer/inteq/onmob.dmi
deleted file mode 100644
index f402ffd24e2c..000000000000
Binary files a/icons/obj/guns/manufacturer/inteq/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/inteq/righthand.dmi b/icons/obj/guns/manufacturer/inteq/righthand.dmi
deleted file mode 100644
index 33d087f394f1..000000000000
Binary files a/icons/obj/guns/manufacturer/inteq/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi
deleted file mode 100644
index bac0ccc8f210..000000000000
Binary files a/icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi
deleted file mode 100644
index 24ac86c3e0b5..000000000000
Binary files a/icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi
deleted file mode 100644
index 8a1d7f06e561..000000000000
Binary files a/icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi
deleted file mode 100644
index b6831ec9696a..000000000000
Binary files a/icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/scarborough/48x32.dmi b/icons/obj/guns/manufacturer/scarborough/48x32.dmi
deleted file mode 100644
index 361448b49a35..000000000000
Binary files a/icons/obj/guns/manufacturer/scarborough/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/scarborough/lefthand.dmi b/icons/obj/guns/manufacturer/scarborough/lefthand.dmi
deleted file mode 100644
index 8d184d907db6..000000000000
Binary files a/icons/obj/guns/manufacturer/scarborough/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/scarborough/onmob.dmi b/icons/obj/guns/manufacturer/scarborough/onmob.dmi
deleted file mode 100644
index 5127ecfed566..000000000000
Binary files a/icons/obj/guns/manufacturer/scarborough/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/scarborough/righthand.dmi b/icons/obj/guns/manufacturer/scarborough/righthand.dmi
deleted file mode 100644
index 5dbfb0acfc25..000000000000
Binary files a/icons/obj/guns/manufacturer/scarborough/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/solararmories/48x32.dmi b/icons/obj/guns/manufacturer/solararmories/48x32.dmi
deleted file mode 100644
index 690fc5b54bdf..000000000000
Binary files a/icons/obj/guns/manufacturer/solararmories/48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/solararmories/lefthand.dmi b/icons/obj/guns/manufacturer/solararmories/lefthand.dmi
deleted file mode 100644
index b28e97e9a1db..000000000000
Binary files a/icons/obj/guns/manufacturer/solararmories/lefthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/solararmories/onmob.dmi b/icons/obj/guns/manufacturer/solararmories/onmob.dmi
deleted file mode 100644
index 3e5b665f4fb0..000000000000
Binary files a/icons/obj/guns/manufacturer/solararmories/onmob.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/solararmories/righthand.dmi b/icons/obj/guns/manufacturer/solararmories/righthand.dmi
deleted file mode 100644
index ab82dd742a66..000000000000
Binary files a/icons/obj/guns/manufacturer/solararmories/righthand.dmi and /dev/null differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index ab051d8a21bb..9068f301647f 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/item/knife.dmi b/icons/obj/item/knife.dmi
index 2e95a9154512..aebfb617ed34 100644
Binary files a/icons/obj/item/knife.dmi and b/icons/obj/item/knife.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index a0ceaebd8383..12798b6eb2ac 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi
index 3b50ef08e89a..2e102cda95ad 100644
Binary files a/icons/obj/machines/computer.dmi and b/icons/obj/machines/computer.dmi differ
diff --git a/icons/obj/nutanks.dmi b/icons/obj/nutanks.dmi
index 4365bdb86771..c325dadf1c32 100644
Binary files a/icons/obj/nutanks.dmi and b/icons/obj/nutanks.dmi differ
diff --git a/icons/obj/ores.dmi b/icons/obj/ores.dmi
index 6ea0ed496e8f..1e6c41a90c05 100644
Binary files a/icons/obj/ores.dmi and b/icons/obj/ores.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 5d23996fb663..f76e5611c93d 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index a6199b8723ef..ea47f805dee9 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 9ff37a4b7e0c..03f2163cddce 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures/signs/sign.dmi b/icons/obj/structures/signs/sign.dmi
index f123c03a76e6..523953b599c7 100644
Binary files a/icons/obj/structures/signs/sign.dmi and b/icons/obj/structures/signs/sign.dmi differ
diff --git a/icons/obj/structures/signs/wallflags.dmi b/icons/obj/structures/signs/wallflags.dmi
index 837e442f27ca..4b4696ad9623 100644
Binary files a/icons/obj/structures/signs/wallflags.dmi and b/icons/obj/structures/signs/wallflags.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 816d3671a8d9..8f2566a98f8a 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 898805a0fa13..5e072b68f42d 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/wallcloset.dmi b/icons/obj/wallcloset.dmi
index f2314d0d84c2..6d41f0ecee85 100644
Binary files a/icons/obj/wallcloset.dmi and b/icons/obj/wallcloset.dmi differ
diff --git a/icons/turf/decals/decals.dmi b/icons/turf/decals.dmi
similarity index 100%
rename from icons/turf/decals/decals.dmi
rename to icons/turf/decals.dmi
diff --git a/icons/turf/decals/suns_floor.dmi b/icons/turf/decals/suns_floor.dmi
deleted file mode 100644
index ffebe3036722..000000000000
Binary files a/icons/turf/decals/suns_floor.dmi and /dev/null differ
diff --git a/icons/turf/floors/suns.dmi b/icons/turf/floors/suns.dmi
deleted file mode 100644
index aa0df610ec55..000000000000
Binary files a/icons/turf/floors/suns.dmi and /dev/null differ
diff --git a/icons/turf/walls/concrete.dmi b/icons/turf/walls/concrete.dmi
index da6a6e45a4ce..a201e7ab6375 100644
Binary files a/icons/turf/walls/concrete.dmi and b/icons/turf/walls/concrete.dmi differ
diff --git a/icons/turf/walls/hexacrete.dmi b/icons/turf/walls/hexacrete.dmi
index f120455f46ad..6866ac7f536f 100644
Binary files a/icons/turf/walls/hexacrete.dmi and b/icons/turf/walls/hexacrete.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 18122c5e3e89..9d933e057c46 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -90,15 +90,6 @@ window "mainwindow"
background-color = #272727
is-visible = false
saved-params = ""
- elem "commandbar_spy"
- type = BROWSER
- is-default = false
- pos = 0,0
- size = 200x200
- anchor1 = -1,-1
- anchor2 = -1,-1
- is-visible = false
- saved-params = ""
window "mapwindow"
elem "mapwindow"
diff --git a/shiptest.dme b/shiptest.dme
index 3c2c0f334380..565b4dec6c8f 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -108,7 +108,6 @@
#include "code\__DEFINES\plumbing.dm"
#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
-#include "code\__DEFINES\processing.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
#include "code\__DEFINES\projectiles.dm"
@@ -156,16 +155,7 @@
#include "code\__DEFINES\wires.dm"
#include "code\__DEFINES\dcs\flags.dm"
#include "code\__DEFINES\dcs\helpers.dm"
-#include "code\__DEFINES\dcs\signals\signals.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_object.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_clothing.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_food.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_grenade.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_implant.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_item.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_machine\signals_aquarium.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_machine\signals_machinery.dm"
-#include "code\__DEFINES\dcs\signals\signals_obj\signals_machine\signals_supermatter.dm"
+#include "code\__DEFINES\dcs\signals.dm"
#include "code\__HELPERS\_auxtools_api.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
@@ -470,8 +460,6 @@
#include "code\datums\components\anti_magic.dm"
#include "code\datums\components\armor_plate.dm"
#include "code\datums\components\art.dm"
-#include "code\datums\components\attachment.dm"
-#include "code\datums\components\attachment_holder.dm"
#include "code\datums\components\bandage.dm"
#include "code\datums\components\bane.dm"
#include "code\datums\components\beetlejuice.dm"
@@ -490,6 +478,7 @@
#include "code\datums\components\deployable.dm"
#include "code\datums\components\dooropendeathproc.dm"
#include "code\datums\components\earprotection.dm"
+#include "code\datums\components\edible.dm"
#include "code\datums\components\edit_complainer.dm"
#include "code\datums\components\embedded.dm"
#include "code\datums\components\empprotection.dm"
@@ -537,6 +526,7 @@
#include "code\datums\components\sizzle.dm"
#include "code\datums\components\slippery.dm"
#include "code\datums\components\soulstoned.dm"
+#include "code\datums\components\spawner.dm"
#include "code\datums\components\spill.dm"
#include "code\datums\components\spooky.dm"
#include "code\datums\components\squeak.dm"
@@ -567,8 +557,6 @@
#include "code\datums\components\fantasy\affix.dm"
#include "code\datums\components\fantasy\prefixes.dm"
#include "code\datums\components\fantasy\suffixes.dm"
-#include "code\datums\components\food\edible.dm"
-#include "code\datums\components\food\food_storage.dm"
#include "code\datums\components\plumbing\_plumbing.dm"
#include "code\datums\components\plumbing\chemical_acclimator.dm"
#include "code\datums\components\plumbing\filter.dm"
@@ -651,6 +639,7 @@
#include "code\datums\elements\cleaning.dm"
#include "code\datums\elements\connect_loc.dm"
#include "code\datums\elements\digitalcamo.dm"
+#include "code\datums\elements\dunkable.dm"
#include "code\datums\elements\earhealing.dm"
#include "code\datums\elements\embed.dm"
#include "code\datums\elements\firestacker.dm"
@@ -671,9 +660,6 @@
#include "code\datums\elements\world_icon.dm"
#include "code\datums\elements\decals\_decals.dm"
#include "code\datums\elements\decals\blood.dm"
-#include "code\datums\elements\food\dunkable.dm"
-#include "code\datums\elements\food\food_trash.dm"
-#include "code\datums\elements\food\processable.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
@@ -880,7 +866,7 @@
#include "code\game\machinery\aug_manipulator.dm"
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\bank_machine.dm"
-#include "code\game\machinery\beacon.dm"
+#include "code\game\machinery\Beacon.dm"
#include "code\game\machinery\bounty_board.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
@@ -893,7 +879,7 @@
#include "code\game\machinery\dish_drive.dm"
#include "code\game\machinery\dna_scanner.dm"
#include "code\game\machinery\doppler_array.dm"
-#include "code\game\machinery\drone_dispenser.dm"
+#include "code\game\machinery\droneDispenser.dm"
#include "code\game\machinery\exp_cloner.dm"
#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
@@ -912,7 +898,6 @@
#include "code\game\machinery\medipen_refiller.dm"
#include "code\game\machinery\navbeacon.dm"
#include "code\game\machinery\newscaster.dm"
-#include "code\game\machinery\outpost_electrolyzer.dm"
#include "code\game\machinery\PDApainter.dm"
#include "code\game\machinery\prisonlabor.dm"
#include "code\game\machinery\quantum_pad.dm"
@@ -924,7 +909,7 @@
#include "code\game\machinery\scan_gate.dm"
#include "code\game\machinery\sheetifier.dm"
#include "code\game\machinery\shieldgen.dm"
-#include "code\game\machinery\sleeper.dm"
+#include "code\game\machinery\Sleeper.dm"
#include "code\game\machinery\slotmachine.dm"
#include "code\game\machinery\spaceheater.dm"
#include "code\game\machinery\stasis.dm"
@@ -1128,7 +1113,6 @@
#include "code\game\objects\items\AI_modules.dm"
#include "code\game\objects\items\airlock_painter.dm"
#include "code\game\objects\items\apc_frame.dm"
-#include "code\game\objects\items\bank_card.dm"
#include "code\game\objects\items\bell.dm"
#include "code\game\objects\items\binoculars.dm"
#include "code\game\objects\items\blueprints.dm"
@@ -1215,12 +1199,6 @@
#include "code\game\objects\items\vending_items.dm"
#include "code\game\objects\items\wayfinding.dm"
#include "code\game\objects\items\weaponry.dm"
-#include "code\game\objects\items\attachments\_attachment.dm"
-#include "code\game\objects\items\attachments\bayonet.dm"
-#include "code\game\objects\items\attachments\laser_sight.dm"
-#include "code\game\objects\items\attachments\rail_light.dm"
-#include "code\game\objects\items\attachments\silencer.dm"
-#include "code\game\objects\items\attachments\stock.dm"
#include "code\game\objects\items\circuitboards\circuitboard.dm"
#include "code\game\objects\items\circuitboards\computer_circuitboards.dm"
#include "code\game\objects\items\circuitboards\machine_circuitboards.dm"
@@ -1265,10 +1243,6 @@
#include "code\game\objects\items\devices\radio\headset.dm"
#include "code\game\objects\items\devices\radio\intercom.dm"
#include "code\game\objects\items\devices\radio\radio.dm"
-#include "code\game\objects\items\food\_food.dm"
-#include "code\game\objects\items\food\bread.dm"
-#include "code\game\objects\items\food\cake.dm"
-#include "code\game\objects\items\food\spaghetti.dm"
#include "code\game\objects\items\grenades\antigravity.dm"
#include "code\game\objects\items\grenades\chem_grenade.dm"
#include "code\game\objects\items\grenades\clusterbuster.dm"
@@ -1331,7 +1305,6 @@
#include "code\game\objects\items\stacks\tiles\tile_mineral.dm"
#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
-#include "code\game\objects\items\stacks\tiles\tiles_suns.dm"
#include "code\game\objects\items\storage\backpack.dm"
#include "code\game\objects\items\storage\bags.dm"
#include "code\game\objects\items\storage\belt.dm"
@@ -1340,7 +1313,6 @@
#include "code\game\objects\items\storage\briefcase.dm"
#include "code\game\objects\items\storage\fancy.dm"
#include "code\game\objects\items\storage\firstaid.dm"
-#include "code\game\objects\items\storage\guncases.dm"
#include "code\game\objects\items\storage\holsters.dm"
#include "code\game\objects\items\storage\lockbox.dm"
#include "code\game\objects\items\storage\ration.dm"
@@ -1381,13 +1353,13 @@
#include "code\game\objects\structures\fireplace.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\fluff.dm"
-#include "code\game\objects\structures\geyser.dm"
#include "code\game\objects\structures\ghost_role_spawners.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\guillotine.dm"
#include "code\game\objects\structures\guncase.dm"
#include "code\game\objects\structures\headpike.dm"
+#include "code\game\objects\structures\hivebot.dm"
#include "code\game\objects\structures\holosign.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
@@ -1415,6 +1387,7 @@
#include "code\game\objects\structures\showcase.dm"
#include "code\game\objects\structures\shower.dm"
#include "code\game\objects\structures\signs.dm"
+#include "code\game\objects\structures\spawner.dm"
#include "code\game\objects\structures\spirit_board.dm"
#include "code\game\objects\structures\stairs.dm"
#include "code\game\objects\structures\statues.dm"
@@ -1464,6 +1437,9 @@
#include "code\game\objects\structures\crates_lockers\crates\large.dm"
#include "code\game\objects\structures\crates_lockers\crates\secure.dm"
#include "code\game\objects\structures\crates_lockers\crates\wooden.dm"
+#include "code\game\objects\structures\icemoon\cave_entrance.dm"
+#include "code\game\objects\structures\lavaland\geyser.dm"
+#include "code\game\objects\structures\lavaland\necropolis_tendril.dm"
#include "code\game\objects\structures\plaques\_plaques.dm"
#include "code\game\objects\structures\plaques\static_plaques.dm"
#include "code\game\objects\structures\signs\_signs.dm"
@@ -1506,7 +1482,6 @@
#include "code\game\turfs\open\floor\plasteel_floor.dm"
#include "code\game\turfs\open\floor\plating.dm"
#include "code\game\turfs\open\floor\reinf_floor.dm"
-#include "code\game\turfs\open\floor\suns_floor.dm"
#include "code\game\turfs\open\floor\plating\asteroid.dm"
#include "code\game\turfs\open\floor\plating\beach.dm"
#include "code\game\turfs\open\floor\plating\icemoon.dm"
@@ -1886,7 +1861,6 @@
#include "code\modules\buildmode\submodes\basic.dm"
#include "code\modules\buildmode\submodes\boom.dm"
#include "code\modules\buildmode\submodes\copy.dm"
-#include "code\modules\buildmode\submodes\lightmaker.dm"
#include "code\modules\buildmode\submodes\delete.dm"
#include "code\modules\buildmode\submodes\fill.dm"
#include "code\modules\buildmode\submodes\map_export.dm"
@@ -1899,9 +1873,9 @@
#include "code\modules\cargo\bounty.dm"
#include "code\modules\cargo\bounty_console.dm"
#include "code\modules\cargo\centcom_podlauncher.dm"
-#include "code\modules\cargo\console.dm"
#include "code\modules\cargo\export_scanner.dm"
#include "code\modules\cargo\exports.dm"
+#include "code\modules\cargo\expressconsole.dm"
#include "code\modules\cargo\gondolapod.dm"
#include "code\modules\cargo\order.dm"
#include "code\modules\cargo\packs.dm"
@@ -1981,19 +1955,15 @@
#include "code\modules\client\verbs\ooc.dm"
#include "code\modules\client\verbs\ping.dm"
#include "code\modules\client\verbs\reset_held_keys.dm"
-#include "code\modules\client\verbs\typing.dm"
#include "code\modules\client\verbs\who.dm"
#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\towels.dm"
#include "code\modules\clothing\ears\_ears.dm"
#include "code\modules\clothing\factions\clip.dm"
-#include "code\modules\clothing\factions\frontiersmen.dm"
#include "code\modules\clothing\factions\gezena.dm"
-#include "code\modules\clothing\factions\hardliners.dm"
#include "code\modules\clothing\factions\nanotrasen.dm"
#include "code\modules\clothing\factions\ngr.dm"
-#include "code\modules\clothing\factions\srm.dm"
#include "code\modules\clothing\factions\suns.dm"
#include "code\modules\clothing\glasses\_glasses.dm"
#include "code\modules\clothing\glasses\engine_goggles.dm"
@@ -2194,7 +2164,9 @@
#include "code\modules\food_and_drinks\food\customizables.dm"
#include "code\modules\food_and_drinks\food\ration.dm"
#include "code\modules\food_and_drinks\food\snacks.dm"
+#include "code\modules\food_and_drinks\food\snacks_bread.dm"
#include "code\modules\food_and_drinks\food\snacks_burgers.dm"
+#include "code\modules\food_and_drinks\food\snacks_cake.dm"
#include "code\modules\food_and_drinks\food\snacks_egg.dm"
#include "code\modules\food_and_drinks\food\snacks_frozen.dm"
#include "code\modules\food_and_drinks\food\snacks_meat.dm"
@@ -2205,6 +2177,7 @@
#include "code\modules\food_and_drinks\food\snacks_salad.dm"
#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm"
#include "code\modules\food_and_drinks\food\snacks_soup.dm"
+#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm"
#include "code\modules\food_and_drinks\food\snacks_vend.dm"
#include "code\modules\food_and_drinks\food\snacks\dough.dm"
#include "code\modules\food_and_drinks\food\snacks\meat.dm"
@@ -2791,10 +2764,10 @@
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord_outfits.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice demon.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice whelp.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\lobstrosity.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm"
@@ -2817,10 +2790,6 @@
#include "code\modules\mob\living\simple_animal\slime\slime.dm"
#include "code\modules\mob\living\simple_animal\slime\slime_say.dm"
#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
-#include "code\modules\mob_spawner\burrow.dm"
-#include "code\modules\mob_spawner\hivebot.dm"
-#include "code\modules\mob_spawner\spawner.dm"
-#include "code\modules\mob_spawner\spawner_componet.dm"
#include "code\modules\modular_computers\laptop_vendor.dm"
#include "code\modules\modular_computers\computers\_modular_computer_shared.dm"
#include "code\modules\modular_computers\computers\item\computer.dm"
@@ -3066,7 +3035,6 @@
#include "code\modules\projectiles\guns\ballistic\gauss.dm"
#include "code\modules\projectiles\guns\ballistic\hmg.dm"
#include "code\modules\projectiles\guns\ballistic\launchers.dm"
-#include "code\modules\projectiles\guns\ballistic\marksman.dm"
#include "code\modules\projectiles\guns\ballistic\pistol.dm"
#include "code\modules\projectiles\guns\ballistic\revolver.dm"
#include "code\modules\projectiles\guns\ballistic\rifle.dm"
@@ -3082,7 +3050,7 @@
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
-#include "code\modules\projectiles\guns\manufacturer\etherbor\energy_gunsword.dm"
+#include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm"
#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
#include "code\modules\projectiles\guns\misc\blastcannon.dm"
#include "code\modules\projectiles\guns\misc\bow.dm"
@@ -3278,19 +3246,35 @@
#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm"
#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm"
#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm"
+#include "code\modules\ruins\lavaland_ruin_code.dm"
#include "code\modules\ruins\rockplanet_ruin_code.dm"
#include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm"
#include "code\modules\ruins\icemoonruin_code\library.dm"
#include "code\modules\ruins\icemoonruin_code\wrath.dm"
+#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm"
#include "code\modules\ruins\lavalandruin_code\biodome_winter.dm"
+#include "code\modules\ruins\lavalandruin_code\codelab.dm"
#include "code\modules\ruins\lavalandruin_code\elephantgraveyard.dm"
+#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm"
#include "code\modules\ruins\lavalandruin_code\puzzle.dm"
+#include "code\modules\ruins\lavalandruin_code\sloth.dm"
#include "code\modules\ruins\lavalandruin_code\surface.dm"
#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm"
#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
+#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
#include "code\modules\ruins\spaceruin_code\bigderelict1.dm"
+#include "code\modules\ruins\spaceruin_code\caravanambush.dm"
+#include "code\modules\ruins\spaceruin_code\clericsden.dm"
+#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
+#include "code\modules\ruins\spaceruin_code\crashedship.dm"
+#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
+#include "code\modules\ruins\spaceruin_code\forgottenship.dm"
+#include "code\modules\ruins\spaceruin_code\hellfactory.dm"
+#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm"
+#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
+#include "code\modules\ruins\spaceruin_code\spacehotel.dm"
#include "code\modules\ruins\spaceruin_code\TheDerelict.dm"
#include "code\modules\screen_alerts\_screen_alerts.dm"
#include "code\modules\security_levels\keycard_authentication.dm"
@@ -3303,7 +3287,9 @@
#include "code\modules\shuttle\ripple.dm"
#include "code\modules\shuttle\shuttle.dm"
#include "code\modules\shuttle\shuttle_rotate.dm"
+#include "code\modules\shuttle\special.dm"
#include "code\modules\shuttle\supply.dm"
+#include "code\modules\shuttle\white_ship.dm"
#include "code\modules\spells\spell.dm"
#include "code\modules\spells\spell_types\aimed.dm"
#include "code\modules\spells\spell_types\area_teleport.dm"
@@ -3494,6 +3480,7 @@
#include "code\modules\vending\engineering.dm"
#include "code\modules\vending\engivend.dm"
#include "code\modules\vending\games.dm"
+#include "code\modules\vending\liberation.dm"
#include "code\modules\vending\liberation_toy.dm"
#include "code\modules\vending\medical.dm"
#include "code\modules\vending\medical_wall.dm"
diff --git a/sound/voice/kepori/kepiclick.ogg b/sound/voice/kepori/kepiclick.ogg
index 3f22b6d90d5e..61670a607b66 100644
Binary files a/sound/voice/kepori/kepiclick.ogg and b/sound/voice/kepori/kepiclick.ogg differ
diff --git a/sound/voice/kepori/kepiwhistle.ogg b/sound/voice/kepori/kepiwhistle.ogg
index f6260f4c5894..bf1cc76bf5cf 100644
Binary files a/sound/voice/kepori/kepiwhistle.ogg and b/sound/voice/kepori/kepiwhistle.ogg differ
diff --git a/strings/boomer.json b/strings/boomer.json
new file mode 100644
index 000000000000..4fb2f733f795
--- /dev/null
+++ b/strings/boomer.json
@@ -0,0 +1,33 @@
+{
+ "boomer": [
+ "@pick(kids) these days have it too easy!",
+ "Do I look like I know what a @pick(file) is!?",
+ "Listen here Jack, how do I open @pick(file)?",
+ "How do I open a @pick(file) again?",
+ "Unlike you snowflakes, I'm not offended so easily.",
+ "Back in my day...",
+ "When I was your age...",
+ "This generation can't take a joke.",
+ "Why are @pick(kids) these days so @pick(sad) all the time?",
+ "These damn @pick(kids) need to get a @pick(impossible) for once!",
+ "It's simply a matter of showing up, looking the manager in the eye, giving him a firm handshake and telling him you want the job.",
+ "You'll never get anywhere in life without a degree.",
+ "@pick(expense) isn't really that expensive.",
+ "When I was a kid I had to walk to school uphill both ways!",
+ "I hate my wife.",
+ "I just want to grill for God's sake.",
+ "I wish I could just go on my lawnmower and cut the grass.",
+ "Yep, Quake. That was a good game...",
+ "Yeah, my PDA has wi-fi. A wife I hate."
+ ],
+
+ "expense": ["Healthcare", "College", "A car", "A house", "Food"],
+
+ "kids": ["kids", "millenials", "snowflakes"],
+
+ "file": ["JPEG", "PDF", "DMI", "JSON"],
+
+ "sad": ["sad", "depressed", "sad and depressed"],
+
+ "impossible": ["job", "house", "job and a house", "life"]
+}
diff --git a/strings/names/kepori_names.txt b/strings/names/kepori_names.txt
deleted file mode 100644
index f5cf1fa086a7..000000000000
--- a/strings/names/kepori_names.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-Ademake
-Ankatse
-Atchenti
-Cautse
-Catuwe
-Dakenui
-Deduci
-Dirame
-Drakece
-Dutsesi
-Gahthi
-Halake
-Hetchel
-Huler
-Hanusi
-Lanirvi
-Latedi
-Meleri
-Meski
-Minele
-Naaka
-Natari
-Nenuda
-Nirena
-Orucati
-Pawitts
-Plakat
-Rakire
-Renuire
-Rilena
-Setasi
-Sutiraze
-Temiti
-Tetha
-Tokaibi
-Witaseni
-Winuusi
-Yikitse
-Yitosun
-Yunthedi
diff --git a/strings/sillytips.txt b/strings/sillytips.txt
index 165e3cbe54d6..192dbce6362f 100644
--- a/strings/sillytips.txt
+++ b/strings/sillytips.txt
@@ -5,12 +5,16 @@ When a round ends nearly everything about it is lost forever, leave your salt be
Killing the entire sector isn't fun except when it is.
You can win a pulse rifle from the arcade machine. Honest.
Just like real life the entropy of the game can only increase with time. If things aren't on fire yet, just wait.
+Completing your objectives is good practice, but the best antagonists will strive to do more than the bare minimum to really leave an impression.
The more obscure and underused a game mechanic is, the less likely your victims are to be able to deal with it.
Space is cold and it will quickly freeze you to death if you don't protect yourself. This isn't how thermodynamics really works but just go with it.
+Blobs are weak to fire! Use a flame thrower for maximum damage!
Cleanbot.
+The wizard is supposed to be extremely strong in one on one combat, stop getting mad about it.
Sometimes a round will just be a bust. C'est la vie.
This is a game that is constantly being developed for. Expect things to be added, removed, fixed, and broken on a daily basis.
It's fun to try and predict the round type from the tip of the round message.
+The quartermaster is not a head of staff and will never be one.
The bird remembers.
Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style.
Sometimes admins will just do stuff. Roll with it.
@@ -19,21 +23,14 @@ Plenty of things that aren't traditionally considered weapons can still be used
DEATH IS IMMINENT!
This game is older than most of the people playing it.
Do not go gentle into that good night.
+Flashbangs can weaken blob tiles, allowing for you and the crew to easily destroy them.
Just the tip?
Some people are unable to read text on a game where half of it is based on text.
+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!
There are at least 11 ways to get through plastic flaps. How many can you name?
FEED ME A STRAY CAT
+Did you know that tossing the clown into a singularity will either increase or decrease its size by a large amount?
Most items have names longer than "soap".
+Demoman takes skill.
Ask and you shall receive.
-Top Ten Goliath Moments!!!
-Sometimes your ship will randomly disappear or obliterate you or get cleaved in half or any combination of the above. Don't dock to a planet at the same time as someone else or undock as someone is docking.
-Go on. Saw off those beautiful Hunter's Pride stocks. The Huntsman is watching.
-The Drinkening has put countless shiptester's basic reading compehension to the test. Will you succumb?
-No, going really really fast through an electric storm won't render you immune.
-None of you would survive the uptime drought.
-Innumberable frontiersmen have died valiantly in a subshuttle chokepoint attempting to board. Sometimes, a direct subshuttle dock isn't the best tactical move.
-Full-body prosthesis are still biological and have normal blood. Don't pump a full bag of coolant into their veins, you.
-The shotgun may never miss, but it has low armour penetration with buckshot.
-When your gun gives off a pathetic click, it's out of ammo. Mashing the trigger more in a panic won't restore your ammo.
-The Trabuco is a crime against the Huntsman and the universe. There's a possibility it'll kill either yourself, your crew, the target, or all of the above.
-Don't be the captain found dead in a pit, legioned, with 600 brute and every bone in their body broken.
diff --git a/strings/tips.txt b/strings/tips.txt
index 85eda2e01283..6a8c54086d94 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -19,26 +19,33 @@ You can screwdriver any non-chemical grenade to shorten fuses from 5 seconds, to
If you find yourself in a fistfight with another player, staying on the offensive is usually the smart move. Running away often won't accomplish much.
Different weapons have different strengths. Some weapons, such as spears, floor tiles, and throwing stars, deal more damage when thrown compared to when attacked normally.
A thrown glass of water can make a slippery tile, allowing you to slow down your pursuers in a pinch.
+When dealing with security, you can often get your sentence negated entirely through cooperation and deception.
+Experiment with different setups of the supermatter engine to maximize output, but don't risk the crew's safety to do so!
We were all new once, be patient and guide new players in the right direction.
On most clothing items that go in the exosuit slot, you can put certain small items into your suit storage, such as a spraycan, your emergency oxygen tank, or a flashlight.
Most job-related exosuit clothing can fit job-related items into it, such as the atmospheric technician's hardsuit/winter coat holding an RPD, or labcoats holding most medicine.
If you're using hotkey mode, you can stop pulling things using H.
If there's something you need from others, try asking! This game isn't singleplayer and you'd be surprised what you can get accomplished together!
You'll quickly lose your interest in the game if you play to win and kill. If you find yourself doing this, take a step back and talk to people - it's a much better experience!
+Felinids get temporarily distracted by laser pointers. Use this to your advantage when being pursued by one.
Don't be afraid to ask for help, whether from your peers or from mentors.
As the Captain, you have absolute access and control over your ship, but this does not mean that being a horrible person won't result in mutiny and a ban.
A medical hardsuit can hold an entire medkit in its suit storage!
-While both heal toxin damage, the difference between charcoal and dylovene is that charcoal will actively remove all other reagents from one's body, while dylovene only removes various toxins - but can overdose.
-You can surgically implant or extract things from people's chests using either organ manipulation or cavity implant surgeries. This can range from putting in a bomb to pulling out an alien larva.
+While both heal toxin damage, the difference between charcoal and antitoxin is that charcoal will actively remove all other reagents from one's body, while antitoxin only removes various toxins - but can overdose.
+You can surgically implant or extract things from people's chests. This can range from putting in a bomb to pulling out an alien larva.
Using disarm attempt will intentionally fail a surgery step.
Corpses with the "...and their soul has departed" description no longer have a ghost attached to them and aren't revivable or clonable.
-Treating plasmamen is not impossible! Salbutamol stops them from suffocating and showers or stasis beds stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower.
+Treating plasmamen is not impossible! Salbutamol stops them from suffocating and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower.
You can extract implants by holding an empty implant case in your offhand while performing the extraction step.
There are dozens of chemicals that can heal, and even more that can cause harm. Experiment!
Some chemicals can only be synthesized by heating up the contents with a chemical heater or manually with lighters and similar tools.
You can recharge a chemical dispenser with an inducer or by replacing its cell.
Water and Potassium mixed together will create an explosion, with power scaling by amount used. Don't do it.
+You can eject someone from cloning early by disabling power in the room. Note that they will suffer more genetic damage and may lose vital organs from this.
+Being a hulk makes you capable of dealing high melee damage, stunlocking people, and punching through walls. However, you can't fire guns, will lose your hulk status if you go into critical condition.
You can take AIs out of their cores by loading them into an intelliCard, which lets you see their laws, It can also be placed into an AI system integrity restorer computer to revive and/or repair them.
+You can use the mutation toxin obtained from green slimes to create various mutation toxins by mixing it with various chemicals!
+You can maximize the number of uses you get out of a slime by feeding it slime steroid, created from purple slimes, while alive. You can then apply extract enhancer, created from cerulean slimes, on each extract.
You can repair your cyborgs with a welding tool if they have brute damage, if they have burn damage, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil.
You can reset a cyborg's module by cutting and mending the reset wire with a wire cutter.
You can augment people with cyborg limbs. Augmented limbs can easily be repaired with cables and welders.
@@ -48,33 +55,45 @@ As a AI, you can take pictures with your camera and upload them to newscasters.
As a AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allowing you to save the location and jump to it at will. Tilde and zero will return you to the last spot you jumped from, and the numpad numbers act as aliases to the regular number keys.
As a Cyborg, choose your module carefully, as only cutting and mending your reset wire will let you repick it. If possible, refrain from choosing a module until a situation that requires one occurs.
As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands.
-As a Cyborg, you are impervious to fires and heat.
-As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you.
+As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world!
+As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds.
As a Service Cyborg, your spray can knocks people down. However, it is blocked by masks and glasses.
As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them.
As a Medical Cyborg, you can fully perform surgery and even augment people.
You can rename areas or create entirely new ones using your ship expansion permit.
The chief engineer’s hardsuit is significantly better than other engineering hardsuits. It has the best features of both engineering and atmospherics hardsuits - boasting nigh-invulnerability to radiation and all atmospheric conditions.
The supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you. So will touching it with telepathy.
-Wire "nodes" (big, seemingly unconnected bulges from half completed wiring jobs) are able to do several things: link up thrusters to prechargers, hook up PACMAN generators, and shock grilles among other things.
+You can electrify grilles by placing wire "nodes" beneath them: the big seemingly unconnected bulges from a half completed wiring job.
You can cool a supermatter crystal by spraying it with a fire extinguisher. Only for the brave!
You can repair windows by using a welding tool on them while on any intent other than harm.
+Don't underestimate the humble P.A.C.M.A.N. generators.
A RCD can be reloaded with metal, glass or plasteel sheets instead of just compressed matter cartridges.
You can unwrench a pipe regardless of the pressures of the gases inside, but if they're too high they can burst out and injure you!
-ATMOS holofan projector blocks gases while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. Beware, they wear off after an amount of time highlighted by numbers on the fans.
+ATMOS holofan projector blocks gases while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. Or, use it to seal a plasmaman cloning room.
You can change the layer of a pipe by clicking with it on a wrenched pipe or other atmos component of the desired layer.
+As a Clown, if you lose your banana peel, you can still slip people with your PDA! Honk!
+As a Clown, eating bananas heals you slightly. Honk!
+As a Clown, your Grail is the mineral bananium, which can be used to build you a fun and robust mech beloved by everyone.
+As a Clown, you can use your stamp on a sheet of cardboard as the first step of making a honkbot. Fun for the whole crew!
+As a Clown, spice your gimmicks up! Nobody likes a one-trick pony.
+The null rod has anti magic functions: it makes you immune to magic.
Books can be turned into a container that can store small items using wire cutters, bibles have this ability without needing to cut it.
You can hack the MegaSeed Vendor to get access to more exotic seeds. These seeds can alternatively be ordered from a express console
You can mutate the plants with unstable mutagen or, as an alternative, grow glowshrooms for their radium which also mutates plants to start you up!
While growing plants you should look into increasing the potency of your plants. This increases the size, amount of chemicals, points gained from grinding them in the biogenerator, and lets people know you are a proficient botanist.
You can create a very wide variety of food with the crafting menu. You can find it by looking for the hammer icon near your intents.
You can rename custom food with a pen.
-Any cooked food will be much healthier than the junk food found in vendors.
+any cooked food will be much healthier than the junk food found in vendors. Having the crew routinely eating cooked will provide minor buffs.
Most non-custom foods will have a secondary effect, ranging from healing you to making you move at lightspeed. Experiment!
Mousetraps can be used to create bombs or booby-trap containers.
+You can order contraband items from a express console without hacking it.
+You can earn more cargo points by shipping back crates, liquid containers, plasma sheets, rare seeds from hydroponics, and more!
+The express supply console can instantly delivers crates by drop pod. The impact will cause a small explosion as well.
Every monster has a pattern you can exploit to minimize damage from the encounters.
You can harvest goliath plates from goliaths and upgrade your explorer's suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage.
You can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them!
+As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however.
+As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands.
As a Drone, you can ping other drones to alert them of areas in need of repair.
As a Ghost, you can see the inside of a container on the ground by clicking on it.
As a Ghost, you can double click on just about anything to follow it. Or just warp around!
@@ -87,72 +106,3 @@ You can light a cigar on a supermatter crystal.
Using sticky tape on items can make them stick to people and walls! Be careful, grenades might stick to your hand during the moment of truth!
In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity?
Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles!
-As the Captain of your vessel, do not neglect the responsibilities of your command. You are the anchor the crew is expected to rely upon, and not being present or authoritative will hurt the experience.
-As a vessel's second in command, you have the unique position of being able to temper the behaviour of the Captain. Obey their orders, but do not be afraid to offer your own advice or shoulder some of command's responsibilities.
-It is highly ill-advised to run off on your own while exploring. Many ruins and planets are perilous and a match for even experienced players, and having someone to watch your back will save you a lot of trouble.
-More often that not, most ships will be apply-only. Don't be afraid to read the memo and try for an application, many captains simply want to curate a certain type of behaviour aboard their vessels.
-Captaining is one of the best ways to curate a faction. Set standards, distinguish yourself and your crew, and keep them engaged, and they'll be coming back not only to your ship, but also to the faction.
-Most improvised ways of providing medical aid or reviving the dead can be slow or dangerous to the person if you or your character are inexperienced with medicine. Don't be afraid to call for a medical ship if the situation is dire.
-In the event most or all of your crew is incapacitated or dead, don't be afraid to ahelp to ask for a distress call. They'll be happy to get you back into the round and the medical ships will be happy as well.
-Don't be afraid to ahelp if you're unsure about another player's conduct. If they're making you uncomfortable or hurting the experience, the admins would be happy to sort things out.
-Many plants on sand and lava worlds are medicinal, and can stretch your supplies.
-For higher tier drill contracts, its recommended to bring a toolbox, spare stock parts, and plasteel if you're not confident in your abilities. The drill is prone to running low on power or needing to be repaired if damaged.
-Many weapons can get sawed off, hurting their accuracy and occasionally ammo capacity but wildly compacting them. Hunter's Pride shotguns, the Flaming Arrow, the Illestren, among others, are included.
-Static anomalies will cause brain damage in close proximity. Minimize contact with them.
-Gravitational anomalies (thronglers) can quickly kill if they're intense. Sometimes, a chair can be used to get close to neutralize them, but do so at your own risk. They cause heavy brute damage.
-Certain anomalies like heartbeat, vein, jumper, or plasmasoul anomalies can interact with you through walls. Be careful docking to worlds with anomalies.
-Safe speed for carp migrations are under 2 GM/s, for asteroids are below 3 GM/s, and for dust is below 7 GM/s. There is no safe speed for electrical storms, you need full grounding rod coverage.
-You can sometimes minimize damage from electrical storms by turning off lights and preventing all source of passive light from touching the outside of the vessel. It is notoriously gimmicky, though, do so at your own risk.
-Dwarf legions tend to try and run back towards you if you're too far away. Lure them in for an attack by withdrawing before they retreat again.
-Brimdemons oftentimes will strike you with a single melee attack before fleeing for another beam. Back away once they're done firing to minimize chip damage.
-You can examine someone twice to see which limb they're bleeding from, to administer gauze or sutures.
-Vox are allergic to Ephedrine, Atropine, Epinephrine, Mannitol, Antihol, and Stimulants. Not lethal in small amounts, but it is recommended to purge these reagents if you've made a mistake.
-Grinded iron or iron pills from oxygen deprivation kits can be used to slowly regenerate blood in living people, if your blood supplies are thin.
-Crystal goliaths, elite mobs, and ancient goliaths give research points on dissection, varying from 5000 to 40000 depending on technology and mob.
-Crystal legions and crystal goliaths are extremely dangerous up close. Try and eliminate them quickly from range with powerful firearms.
-The smaller the vessel, the more throttle will effect your acceleration. If you're piloting a subshuttle, it's recommended to keep low throttle and adjust to your liking.
-Plasma thrusters can allow for extreme speed, but it is recommended to conserve them. You can minimize fuel consumption by using them in small bursts with a low throttle before turning them back off.
-Jackhammers can be used to quickly break down walls for breaching or salvage.
-Blast doors can be taken apart for a fair amount of plasteel, if you're hurting on fuel.
-Kepori have an innate ability to tackle. It can take the enemy off guard, but recommend a helmet if you're using it near walls or prone to miss.
-Laser and energy weapons have a cell that can be removed with a screwdriver. If you're removing a cell from a weapon that is not in your hand (on a suit storage slot, for example), the cell will go into your hand instead of the ground.
-Frontiersmen clothes and Ramzi Clique rusted red hardsuits are established pirate equipment, and you're likely to be fired upon if you wear them. Use at your own risk.
-You can access the black market by building an uplink with a handheld radio, analyzer, and scanning module. It tends to have a random selection of unique items at highly varied prices. You can purchase a LTSRBT from the outpost for a more convenient delivery.
-Most armour sets outside of hardsuits do not cover the limbs. Give yourself an advantage by firing on someones legs or arms to slow them down or shoot out their weapon.
-You can remove prosthetics or IPC / FBP limbs with prosthetic removal surgery, even on yourself.
-You can early eject the en bloc of Illestrens by not firing the last round and clicking on the rifle with your empty hand to take it out manually, for a fast and tactical reload.
-The HP Shadow cannot reload all rounds at once with a speedloader, it must be reloaded one round at a time.
-You can make an emergency landing by docking to an empty space if you've lost control of your speed or are about to crash into hazards.
-It is safe to cross over the tile the system sun is on. Trust me, I've tried.
-Acid tiles and acid from anomalies can be sprayed off with fire extinguishers.
-You can extinguish yourself without walls nearby by clicking the tile you're on with your extinguisher.
-It's wise to carry a pocket extinguisher on sand and lava worlds, for acid and lava respectively.
-Directional firelocks can quickly minimize pressure loss from holofield failures, if your vessel lacks them.
-Holofields rely on extra power being on the wire net. Make sure power load is a fair bit higher than the draw so you don't get launched into vacuum.
-Elzuose are able to heal a respectable amount of damage by rooting in soil or grass. It gives a sizable mood increase, as well as charging your battery.
-If you're confused about the contents of an alcoholic drink bottle, you can examine to more often than not see what it contains on the label.
-If you don't feel like grinding 500 basic power cells to make potassium, you can buy chemicals from the outpost in bulk.
-You can synthesize most chems by clicking certain reagents with stock parts. Examples being Iodine to Bromine with a scanning module and water into 2:1 hydrogen / oxygen with a capacitor.
-Perfluorodecalin in oxygen deprivation kits convert oxygen damage to toxin damage at a very effective ratio. Just know what you're doing and be prepared to administer anti-tox chems if it is a large amount of damage.
-Epi-pens contain a small amount of formaldehyde, that prevents organs from decaying while they're in a body's system. Use it to give yourself more time while reviving.
-Anomalies will give two frequencies when you analyze them, a primary and a secondary, unstable frequency. The primary will neutralize, and the unstable will more often than not cause an explosion or a similar negative effect.
-Landmines have 4 wires; one disarms the mind, the other deactivates the pressure plate, another blows it up, and another blows it up on a delay.
-You can tamper with landmines from range by pulsing the wires with signalers.
-Not everyone is from their species' homeworld. It can be common for a human to have a Kalixcian or Teceian name, for example.
-It can be fun to brainstorm new characters. Give it a shot, you might like it.
-You can create entire new shuttles and subshuttles with a shuttle manipulator either from RND or from the outpost. It's usually resource and money-intensive, so be prepared!
-Class 3 drills are incredibly dangerous alone or in small groups, even if you're experienced with mining and combat. Bring along a larger crew or call someone willing to help if you're thinking of taking them on.
-Most smaller ships can be easily made immune to electrical storms if grounding rods are spaced out around the hull. You can make some quick money from rarely-taken storm contracts.
-Ripleys are able to hold up to ten crates and other miscellaneous items like PACMAN generators using a hydraulic clamp. The scrapper's favourite.
-Fights can be heavily in favour of the defenders if you play your cards right. Get good angles, turn off lights to give yourself cover, and be able to fire from multiple areas. More than likely, you'll know your environment better than the attacker.
-Crate shelves can be used to maximize storage in your cargo bays. No more messes for you.
-You can fashion cloth into a rag to clean up your vessel if you've tracked in some blood.
-Some ships might prioritize characters exclusively from a faction in their memos, and that's okay! You can experiment with new characters to join, or join / captain another ship.
-Moths, if their wings are intact, have full mobility in zero gravity environments that have an atmosphere.
-Vox are near-unmatched in hand-to-hand fighting; their kicks deal extra damage and hurt organs.
-IPC posibrains are contained in the chest, not the head.
-Shiptest has uptime on Wednesdays, Fridays, and Saturdays.
-Exosuits are not as durable as they might feel, and it is still wise to take cover with them.
-Turning on strafing mode on a mech for combat is wise, and allows you to keep your firing lines constantly on the enemy.
-A Gygax's leg actuators drain the cell very quickly. Use sparingly.
-Installing higher tier capacitors on mechs increases power efficiency on mech abilities, weapons, and idling.
diff --git a/strings/traumas.json b/strings/traumas.json
index 1d1e98581d4f..f6bd9b589553 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -1,4 +1,168 @@
{
+ "brain_damage": [
+ "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH",
+ "without oxigen blob don't evoluate?",
+ "@pick(semicolon)CAPTAINS A COMDOM",
+ "can u give me @pick(mutations)?",
+ "THe saiyans screwed",
+ "Bi is THE BEST OF BOTH WORLDS>",
+ "@pick(semicolon)I WANNA PET TEH monkeyS",
+ "stop grifing me!!!!",
+ "SOTP IT#",
+ "shiggey diggey!!",
+ "@pick(semicolon)A PIRATE APPEAR",
+ "FUS RO DAH",
+ "stat me",
+ ">my face",
+ "roll it easy!",
+ "lol2cat",
+ "dem dwarfs man, dem dwarfs",
+ "hwee did eet fhor khayosss",
+ "lifelike texture ;_;",
+ "luv can bloooom",
+ "PACKETS!!!",
+ "port ba@pick(y_replacements) med!!!!",
+ "youed call her a toeugh bithc",
+ "closd for merbegging",
+ "@pick(semicolon)pray can u @pick(create_verbs) @pick(create_nouns)???",
+ "GEY AWAY FROM ME U GREIFING PRICK!!!!",
+ "@pick(semicolon)HELP INTEG MURDERIN MEE!!!",
+ "hwat dose tha @pick(random_gibberish) mean?????",
+ "@pick(semicolon)DO A BLUP SPEaS JUMP!!!!!",
+ "wearnig siNGUARLTY is.... FINE haHAAA",
+ "@pick(semicolon)AI laW 22 Open door",
+ "@pick(semicolon)this SI mY sHip......",
+ "who the HELL do u thenk u r?!!!!",
+ "geT THE FUCK OUTTTT",
+ "@pick(semicolon)CRASHING THIS SHIMP WITH NIO SURVIVROS",
+ "PSHOOOM",
+ "REMOVE SINGULARITY",
+ "INSTLL TEG",
+ "TURBIN IS BEST ENGIENE",
+ "SOLIRS CAN POWER THE HOLE FLEEHT ANEWAY @pick(bug)",
+ "parasteng was best",
+ "@pick(semicolon)I'VE GOT BALLS OF STEEL",
+ "NO I'M ONNA KILL YOU MOTHERFUCKER OLD STYLE",
+ "i will snatch erry motherfucker birthday",
+ "u just did the world a little bit more sad place for someone",
+ "@pick(semicolon)N-NYAAAAAA~",
+ "@pick(bug)",
+ "@pick(semicolon)wtf??????????? @pick(bug)",
+ "@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)",
+ "DON'T EVER TUCH ME",
+ "@pick(semicolon)How do I set up the. SHow do I set u p the Singu. how I the scrungulartiy????",
+ "AMOGN US IS FUNNY!!",
+ "DID YOU FUCKING.",
+ "i DEMAND!!! APOGEE-DEV BE DEOMTED!!!",
+ "@pick(semicolon)I don't ndED tEARPAHY.",
+ "@pick(semicolon)an,d CIOCK.",
+ "TUWN ME INoT A CAT!!",
+ "WHY WAES THE PEILL REMOVED???",
+ "work on the wiki please",
+ "ahelp SPAWN @pick(aspawnships) PLS",
+ "Am i allowd to kil l people if thye piss me off",
+ "IS THIS LIEK VOIDCREW???",
+ "UNiT PANICKING.",
+ "HIII!! HI!! <3 <3 <3",
+ "I LOOK LKIE BEAN,S,,, CRINGE!!!",
+ "SEET TH shIP TO kOS!!!!!",
+ "IM SynDCIATe, I ANTag, I CAN KOS......",
+ "ahelp ADMIN CAN I BE PIRTA",
+ "DOCTOR YUO DO DISCETIONS!!!",
+ "RESERCH NANIYES",
+ "REVSRSE A NY WALLS!!!",
+ "*monch",
+ "Amonger",
+ "Live mas",
+ "top ten goliath funny moments",
+ "put me... in a stew... then buryy mee...",
+ "@pick(semicolon)GTT AWYA FROM HER YOU BITHC!!",
+ "@pick(semicolon)IS TATH A FUCKIGN,, MOTH.",
+ "@pick(semicolon)BRAZIL NUMEOR UNO...!!!!",
+ "@pick(semicolon)blbue hair??? I'M GOIgN TO KILL THDT FUIKNG COW!",
+ "@pick(semicolon)HOW DO I @pick(ghetto)?????",
+ "ough",
+ "ourgh",
+ "ouughghnnnn",
+ "hrrnggg",
+ "HE IS BALD!!!",
+ "I AM NORMAL. I CAN BE TRUSTED WITH INDUSTRIAL CHEMICALS",
+ "Welcome to the bathroom",
+ "THE AMOUNGS BROKE ALL MY BONES",
+ "HOLY SHIT IT'S @pick(john) @pick(factions)!!",
+ "BLrobo BLEEBUS.....",
+ "drugs are funny because they add new rp elements",
+ "ANOTHER SHIP... STERALIZED...",
+ "HOpeLes WAsN'T ALwAYS NaMeD HoPelESs BeFORE THe incIDENST...",
+ "@pick(semicolon)HopeLSS WAS ACTUAL. Ly a LIVIng WaePON....",
+ "@pick(semicolon)WHEN SHIPQUEST????? PANEL NEW??????",
+ "WHER.E SHIPQUEST???,???",
+ "ei,,ither wAy... It Is WHt ti is",
+ "butT ShIPPtSt nEVER was a WrAZnOe liKE thaEt!!",
+ "A deEoP-setED dISEuire... fuR pERfECTiOsM...",
+ "HUMORER IS A DECLIAT THINGE!!",
+ "who's the asshole flying the pill class",
+ "IVOR@pick(y_replacements) WHAT THE FOUCKE ARE U DUING!!!??",
+ "RESIEST BIG MOETH",
+ "WE MUSTE RIASE UOP AGANST BEEG MOTNH",
+ "Luckily, I passed high school physics",
+ "I WANT NOTHING MORE IN THIS LIFE THAN TO CUDDLE UP WITH A CUTE MOTH WAIFU!!",
+ "GO TO HORNY JAIL!!"
+ ],
+
+ "mutations": [
+ "telikesis",
+ "halk",
+ "eppilapse",
+ "kamelien",
+ "eksrey",
+ "glowey skin",
+ "fungal tb",
+ "stun gloves"
+ ],
+
+ "john": ["joehn", "jonn", "jouhn", "jeeoun"],
+
+ "factions": ["SYNDICT", "NATOSASEN", "EEMTEQ", "MIENUTMEN", "SOMLGOVM"],
+
+ "random_gibberish": ["g", "squid", "r", "carbon dioxide"],
+
+ "y_replacements": ["y", "i", "e"],
+
+ "create_verbs": ["spawn", "MAke me", "creat", "tc trade me", "gib"],
+
+ "create_nouns": [
+ "zenomorfs",
+ "ayleins",
+ "treaitors",
+ "sheadow lings",
+ "abdoocters",
+ "revinent",
+ "deval",
+ "deth squads",
+ "bleb",
+ "cock cult",
+ "anteg"
+ ],
+
+ "aspawnships": [
+ "BUblBUE",
+ "RoUBE",
+ "PeEL",
+ "TWInkLRE",
+ "MAYONEISE",
+ "raEDIO",
+ "joUPITR",
+ "HAELR TROCK",
+ "BEYOO",
+ "TID"
+ ],
+
+ "bug": ["", "IS TIS A BUG??", "SI IST A BUGG/", "BUG!!!"],
+
+ "semicolon": ["", ";", ".h"],
+
+ "ghetto": ["ghetcheom", "ghettoghemc", "gahttochem"],
"god_foe": [
"MORTALS",
diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json
index a026558a47a1..56951b14846f 100644
--- a/tgui/packages/tgui-dev-server/package.json
+++ b/tgui/packages/tgui-dev-server/package.json
@@ -8,6 +8,6 @@
"glob": "^7.1.7",
"source-map": "^0.7.3",
"stacktrace-parser": "^0.1.10",
- "ws": "^7.5.10"
+ "ws": "^7.5.3"
}
}
diff --git a/tgui/packages/tgui/interfaces/Cargo.js b/tgui/packages/tgui/interfaces/Cargo.js
new file mode 100644
index 000000000000..9dfcd417f593
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Cargo.js
@@ -0,0 +1,533 @@
+import { flow } from 'common/fp';
+import { filter, sortBy } from 'common/collections';
+import { useBackend, useSharedState } from '../backend';
+import {
+ AnimatedNumber,
+ Box,
+ Button,
+ Flex,
+ Icon,
+ Input,
+ LabeledList,
+ NoticeBox,
+ Section,
+ Stack,
+ Table,
+ Tabs,
+} from '../components';
+import { formatMoney } from '../format';
+import { Window } from '../layouts';
+
+export const Cargo = (props, context) => {
+ return (
+
+
+
+
+
+ );
+};
+
+export const CargoContent = (props, context) => {
+ const { act, data } = useBackend(context);
+ const [tab, setTab] = useSharedState(context, 'tab', 'catalog');
+ const { requestonly } = data;
+ const cart = data.cart || [];
+ const requests = data.requests || [];
+ return (
+
+
+
+
+ setTab('catalog')}
+ >
+ Catalog
+
+ 0 && 'yellow'}
+ selected={tab === 'requests'}
+ onClick={() => setTab('requests')}
+ >
+ Requests ({requests.length})
+
+ {!requestonly && (
+ <>
+ 0 && 'yellow'}
+ selected={tab === 'cart'}
+ onClick={() => setTab('cart')}
+ >
+ Checkout ({cart.length})
+
+ setTab('help')}
+ >
+ Help
+
+ >
+ )}
+
+
+ {tab === 'catalog' && }
+ {tab === 'requests' && }
+ {tab === 'cart' && }
+ {tab === 'help' && }
+
+ );
+};
+
+const CargoStatus = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ department,
+ grocery,
+ away,
+ docked,
+ loan,
+ loan_dispatched,
+ location,
+ message,
+ points,
+ requestonly,
+ can_send,
+ } = data;
+ return (
+
+ formatMoney(value)}
+ />
+ {' credits'}
+
+ }
+ >
+
+
+ {(docked && !requestonly && can_send && (
+
+ {message}
+ {!!loan && !requestonly && (
+
+ {(!loan_dispatched && (
+
+ )}
+
+
+ );
+};
+
+/**
+ * Take entire supplies tree
+ * and return a flat supply pack list that matches search,
+ * sorted by name and only the first page.
+ * @param {any[]} supplies Supplies list.
+ * @param {string} search The search term
+ * @returns {any[]} The flat list of supply packs.
+ */
+const searchForSupplies = (supplies, search) => {
+ search = search.toLowerCase();
+
+ return flow([
+ (categories) => categories.flatMap((category) => category.packs),
+ filter(
+ (pack) =>
+ pack.name?.toLowerCase().includes(search.toLowerCase()) ||
+ pack.desc?.toLowerCase().includes(search.toLowerCase())
+ ),
+ sortBy((pack) => pack.name),
+ (packs) => packs.slice(0, 25),
+ ])(supplies);
+};
+
+export const CargoCatalog = (props, context) => {
+ const { express } = props;
+ const { act, data } = useBackend(context);
+
+ const { self_paid, app_cost } = data;
+
+ const supplies = Object.values(data.supplies);
+
+ const [activeSupplyName, setActiveSupplyName] = useSharedState(
+ context,
+ 'supply',
+ supplies[0]?.name
+ );
+
+ const [searchText, setSearchText] = useSharedState(
+ context,
+ 'search_text',
+ ''
+ );
+
+ const activeSupply =
+ activeSupplyName === 'search_results'
+ ? { packs: searchForSupplies(supplies, searchText) }
+ : supplies.find((supply) => supply.name === activeSupplyName);
+
+ return (
+
+
+ act('toggleprivate')}
+ />
+ >
+ )
+ }
+ >
+
+
+
+
+
+
+
+
+
+ {
+ if (value === searchText) {
+ return;
+ }
+
+ if (value.length) {
+ // Start showing results
+ setActiveSupplyName('search_results');
+ } else if (activeSupplyName === 'search_results') {
+ // return to normal category
+ setActiveSupplyName(supplies[0]?.name);
+ }
+ setSearchText(value);
+ }}
+ onChange={(e, value) => {
+ // Allow edge cases like the X button to work
+ const onInput = e.target?.props?.onInput;
+ if (onInput) {
+ onInput(e, value);
+ }
+ }}
+ />
+
+
+
+ {supplies.map((supply) => (
+ {
+ setActiveSupplyName(supply.name);
+ setSearchText('');
+ }}
+ >
+ {supply.name} ({supply.packs.length})
+
+ ))}
+
+
+
+
+ )}
+ {cart.length > 0 && !requestonly && (
+
+ {(away === 1 && docked === 1 && (
+ act('send')}
+ />
+ )) || Shuttle in {location}.}
+
+ )}
+
+ );
+};
+
+const CargoHelp = (props, context) => {
+ return (
+ <>
+
+ Each department on the station will order crates from their own personal
+ consoles. These orders are ENTIRELY FREE! They do not come out of
+ cargo's budget, and rather put the consoles on cooldown. So
+ here's where you come in: The ordered crates will show up on your
+ supply console, and you need to deliver the crates to the orderers.
+ You'll actually be paid the full value of the department crate on
+ delivery if the crate was not tampered with, making the system a good
+ source of income.
+
+
+ Examine a department order crate to get specific details about where
+ the crate needs to go.
+
+
+
+ MULEbots are slow but loyal delivery bots that will get crates delivered
+ with minimal technician effort required. It is slow, though, and can be
+ tampered with while en route.
+
+ Setting up a MULEbot is easy:
+
+ 1. Drag the crate you want to deliver next to the MULEbot.
+
+ 2. Drag the crate on top of MULEbot. It should load on.
+
+ 3. Open your PDA.
+
+ 4. Click Delivery Bot Control.
+ 5. Click Scan for Active Bots.
+ 6. Choose your MULE.
+
+ 7. Click on Destination: (set).
+ 8. Choose a destination and click OK.
+
+ 9. Click Proceed.
+
+
+ In addition to MULEs and hand-deliveries, you can also make use of the
+ disposals mailing system. Note that a break in the disposal piping could
+ cause your package to be lost (this hardly ever happens), so this is not
+ always the most secure ways to deliver something. You can wrap up a
+ piece of paper and mail it the same way if you (or someone at the desk)
+ wants to mail a letter.
+
+ Using the Disposals Delivery System is even easier:
+
+ 1. Wrap your item/crate in packaging paper.
+
+ 2. Use the destinations tagger to choose where to send it.
+
+ 3. Tag the package.
+
+ 4. Stick it on the conveyor and let the system handle it.
+
+
+
+ Pondering something not included here? When in doubt, ask the QM!
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/HydrogenExchange.js b/tgui/packages/tgui/interfaces/HydrogenExchange.js
deleted file mode 100644
index c07fe40afeab..000000000000
--- a/tgui/packages/tgui/interfaces/HydrogenExchange.js
+++ /dev/null
@@ -1,74 +0,0 @@
-import { useBackend } from '../backend';
-import { Button, LabeledList, Section } from '../components';
-import { Window } from '../layouts';
-
-export const HydrogenExchange = (props, context) => {
- const { act, data } = useBackend(context);
- const { credits, merits, next_merit_rate, credits_to_merits, credit_tax } =
- data;
- return (
-
-
-
-
-
- {' '}
- {credit_tax + '%'}
-
-
- {' '}
- {next_merit_rate + 'cr'}
-
-
-
-
-
- act('convert_to_merits')}
- />
- }
- />
- act('convert_to_credits')}
- />
- }
- />
- act('dispense')}
- />
- }
- />
-
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js
index c34dccacf367..91bf9d1f7929 100644
--- a/tgui/packages/tgui/interfaces/Orbit.js
+++ b/tgui/packages/tgui/interfaces/Orbit.js
@@ -54,7 +54,6 @@ const BasicSection = (props, context) => {
{things.map((thing) => (
act('orbit', {
@@ -75,7 +74,6 @@ const OrbitedButton = (props, context) => {
return (
act('orbit', {
ref: thing.ref,
diff --git a/tgui/packages/tgui/interfaces/OutpostCommunications/index.tsx b/tgui/packages/tgui/interfaces/OutpostCommunications.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/OutpostCommunications/index.tsx
rename to tgui/packages/tgui/interfaces/OutpostCommunications.tsx
index 9a7fecaefb1e..458d2f91bb90 100644
--- a/tgui/packages/tgui/interfaces/OutpostCommunications/index.tsx
+++ b/tgui/packages/tgui/interfaces/OutpostCommunications.tsx
@@ -1,4 +1,4 @@
-import { useBackend, useSharedState } from '../../backend';
+import { useBackend, useSharedState } from '../backend';
import {
ProgressBar,
Section,
@@ -7,11 +7,38 @@ import {
LabeledList,
Box,
Stack,
-} from '../../components';
-import { Window } from '../../layouts';
+} from '../components';
+import { Window } from '../layouts';
+import { CargoCatalog } from './Cargo';
-import { CargoCatalog } from './Catalog';
-import { Mission, Data } from './types';
+type Data = {
+ points: number;
+ outpostDocked: boolean;
+ onShip: boolean;
+ numMissions: number;
+ maxMissions: number;
+ shipMissions: Array;
+ outpostMissions: Array;
+ beaconZone: string;
+ beaconName: string;
+ hasBeacon: boolean;
+ usingBeacon: boolean;
+ message: string;
+ printMsg: string;
+ canBuyBeacon: boolean;
+};
+
+type Mission = {
+ ref: string;
+ actStr: string;
+ name: string;
+ desc: string;
+ progressStr: string;
+ value: number;
+ remaining: number;
+ duration: number;
+ timeStr: string;
+};
export const OutpostCommunications = (props, context) => {
const { act, data } = useBackend(context);
@@ -114,7 +141,7 @@ const CargoExpressContent = (props, context) => {
{message}
-
+
>
);
};
diff --git a/tgui/packages/tgui/interfaces/OutpostCommunications/Catalog.js b/tgui/packages/tgui/interfaces/OutpostCommunications/Catalog.js
deleted file mode 100644
index ebcad5d6a051..000000000000
--- a/tgui/packages/tgui/interfaces/OutpostCommunications/Catalog.js
+++ /dev/null
@@ -1,190 +0,0 @@
-import { flow } from 'common/fp';
-import { filter, sortBy } from 'common/collections';
-import { useBackend, useSharedState } from '../../backend';
-import {
- Box,
- Button,
- Flex,
- Icon,
- Input,
- Section,
- Stack,
- Table,
- Tabs,
-} from '../../components';
-import { formatMoney } from '../../format';
-
-export const CargoCatalog = (props, context) => {
- const { act, data } = useBackend(context);
-
- const { self_paid, app_cost } = data;
-
- const supplies = Object.values(data.supplies);
-
- const [activeSupplyName, setActiveSupplyName] = useSharedState(
- context,
- 'supply',
- supplies[0]?.name
- );
-
- const [searchText, setSearchText] = useSharedState(
- context,
- 'search_text',
- ''
- );
-
- const activeSupply =
- activeSupplyName === 'search_results'
- ? { packs: searchForSupplies(supplies, searchText) }
- : supplies.find((supply) => supply.name === activeSupplyName);
-
- return (
-
-
-
-
-
-
-
-
-
-
- {
- if (value === searchText) {
- return;
- }
-
- if (value.length) {
- // Start showing results
- setActiveSupplyName('search_results');
- } else if (activeSupplyName === 'search_results') {
- // return to normal category
- setActiveSupplyName(supplies[0]?.name);
- }
- setSearchText(value);
- }}
- onChange={(e, value) => {
- // Allow edge cases like the X button to work
- const onInput = e.target?.props?.onInput;
- if (onInput) {
- onInput(e, value);
- }
- }}
- />
-
-
-
- {supplies.map((supply) => (
- {
- setActiveSupplyName(supply.name);
- setSearchText('');
- }}
- >
- {supply.name} ({supply.packs.length})
-
- ))}
-
-
-
-