")
+ to_chat(M, "Report printed. Log cleared.")
datatoprint = ""
scanning = 1
else
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index cc3320489f6..1c3124a74cb 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -12,7 +12,7 @@ var/list/world_uplinks = list()
var/welcome // Welcoming menu message
var/uses // Numbers of crystals
var/hidden_crystals = 0
- var/list/ItemsCategory // List of categories with lists of items
+ var/list/uplink_items // List of categories with lists of items
var/list/ItemsReference // List of references with an associated item
var/list/nanoui_items // List of items for NanoUI use
var/nanoui_menu = 0 // The current menu we are in
@@ -32,7 +32,7 @@ var/list/world_uplinks = list()
..()
welcome = ticker.mode.uplink_welcome
uses = ticker.mode.uplink_uses
- ItemsCategory = get_uplink_items()
+ uplink_items = get_uplink_items()
world_uplinks += src
@@ -57,14 +57,14 @@ var/list/world_uplinks = list()
dat += "Each item costs a number of telecrystals as indicated by the number following its name.
"
var/category_items = 1
- for(var/category in ItemsCategory)
+ for(var/category in uplink_items)
if(category_items < 1)
dat += "We apologize, as you could not afford anything from this category.
"
dat += "
"
dat += "[category]
"
category_items = 0
- for(var/datum/uplink_item/I in ItemsCategory[category])
+ for(var/datum/uplink_item/I in uplink_items[category])
if(I.cost > uses)
continue
if(I.job && I.job.len)
@@ -87,9 +87,9 @@ var/list/world_uplinks = list()
var/list/nano = new
var/list/reference = new
- for(var/category in ItemsCategory)
+ for(var/category in uplink_items)
nano[++nano.len] = list("Category" = category, "items" = list())
- for(var/datum/uplink_item/I in ItemsCategory[category])
+ for(var/datum/uplink_item/I in uplink_items[category])
if(I.job && I.job.len)
if(!(I.job.Find(job)))
continue
@@ -117,6 +117,9 @@ var/list/world_uplinks = list()
if(..())
return 1
+ if(href_list["refund"])
+ refund(usr)
+
if(href_list["buy_item"] == "random")
var/datum/uplink_item/UI = chooseRandomItem()
href_list["buy_item"] = UI.reference
@@ -142,6 +145,22 @@ var/list/world_uplinks = list()
return 1
+/obj/item/uplink/proc/refund(mob/user as mob)
+ var/obj/item/I = user.get_active_hand()
+ if(I) // Make sure there's actually something in the hand before even bothering to check
+ for(var/category in uplink_items)
+ for(var/item in uplink_items[category])
+ var/datum/uplink_item/UI = item
+ var/path = UI.refund_path || UI.item
+ var/cost = UI.refund_amount || UI.cost
+ if(I.type == path && UI.refundable && I.check_uplink_validity())
+ uses += cost
+ used_TC -= cost
+ to_chat(user, "[I] refunded.")
+ qdel(I)
+ return
+ ..()
+
// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it.
/* How to create an uplink in 3 easy steps!
@@ -287,17 +306,6 @@ var/list/world_uplinks = list()
return 1
return 0
-//Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it)
-/obj/item/radio/uplink/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/antag_spawner/borg_tele))
- var/obj/item/antag_spawner/borg_tele/S = W
- if(!S.used && !S.checking)
- hidden_uplink.uses += S.TC_cost
- qdel(S)
- to_chat(user, "Teleporter refunded.")
- else
- to_chat(user, "This teleporter is already used, or is currently being used.")
-
// PRESET UPLINKS
// A collection of preset uplinks.
//
diff --git a/code/game/objects/items/mixing_bowl.dm b/code/game/objects/items/mixing_bowl.dm
new file mode 100644
index 00000000000..1edfdac9561
--- /dev/null
+++ b/code/game/objects/items/mixing_bowl.dm
@@ -0,0 +1,170 @@
+
+/obj/item/mixing_bowl
+ name = "mixing bowl"
+ desc = "Mixing it up in the kitchen."
+ flags = OPENCONTAINER
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "mixing_bowl"
+ var/max_n_of_items = 25
+ var/dirty = FALSE
+ var/clean_icon = "mixing_bowl"
+ var/dirty_icon = "mixing_bowl_dirty"
+
+/obj/item/mixing_bowl/New()
+ ..()
+ create_reagents(100)
+
+/obj/item/mixing_bowl/attackby(obj/item/I, mob/user, params)
+ if(dirty)
+ if(istype(I, /obj/item/soap))
+ user.visible_message("[user] starts to scrub [src].", "You start to scrub [src].")
+ if(do_after(user, 20 * I.toolspeed, target = src))
+ clean()
+ user.visible_message("[user] has scrubbed [src] clean.", "You have scrubbed [src] clean.")
+ return 1
+ else
+ to_chat(user, "You should clean [src] before you use it for food prep.")
+ return 0
+ if(is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_MICROWAVE]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_GRILL]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_OVEN]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_CANDY]))
+ if(contents.len>=max_n_of_items)
+ to_chat(user, "This [src] is full of ingredients, you cannot put more.")
+ return 1
+ if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
+ if(S.amount > 1)
+ var/obj/item/stack/to_add = S.split(user, 1)
+ to_add.forceMove(src)
+ user.visible_message("[user] adds one of [S] to [src].", "You add one of [S] to [src].")
+ else
+ return add_item(S, user)
+ else
+ return add_item(I, user)
+ else if(is_type_in_list(I, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment)))
+ if(!I.reagents)
+ return 1
+ for(var/datum/reagent/R in I.reagents.reagent_list)
+ if(!(R.id in GLOB.cooking_reagents[RECIPE_MICROWAVE]) && !(R.id in GLOB.cooking_reagents[RECIPE_GRILL]) && !(R.id in GLOB.cooking_reagents[RECIPE_OVEN]) && !(R.id in GLOB.cooking_reagents[RECIPE_CANDY]))
+ to_chat(user, "Your [I] contains components unsuitable for cookery.")
+ return 1
+ else
+ to_chat(user, "You have no idea what you can cook with [I].")
+ return 1
+
+/obj/item/mixing_bowl/proc/add_item(obj/item/I, mob/user)
+ if(!user.drop_item())
+ to_chat(user, "\The [I] is stuck to your hand, you cannot put it in [src]")
+ //return 0
+ else
+ I.forceMove(src)
+ user.visible_message("[user] adds [I] to [src].", "You add [I] to [src].")
+
+/obj/item/mixing_bowl/attack_self(mob/user)
+ var/dat = ""
+ if(dirty)
+ dat = {"This [src] is dirty!
Please clean it before use!"}
+ else
+ var/list/items_counts = new
+ var/list/items_measures = new
+ var/list/items_measures_p = new
+ for(var/obj/O in contents)
+ var/display_name = O.name
+ if(istype(O,/obj/item/reagent_containers/food/snacks/egg))
+ items_measures[display_name] = "egg"
+ items_measures_p[display_name] = "eggs"
+ if(istype(O,/obj/item/reagent_containers/food/snacks/tofu))
+ items_measures[display_name] = "tofu chunk"
+ items_measures_p[display_name] = "tofu chunks"
+ if(istype(O,/obj/item/reagent_containers/food/snacks/meat)) //any meat
+ items_measures[display_name] = "slab of meat"
+ items_measures_p[display_name] = "slabs of meat"
+ if(istype(O,/obj/item/reagent_containers/food/snacks/donkpocket))
+ display_name = "Turnovers"
+ items_measures[display_name] = "turnover"
+ items_measures_p[display_name] = "turnovers"
+ if(istype(O,/obj/item/reagent_containers/food/snacks/carpmeat))
+ items_measures[display_name] = "fillet of meat"
+ items_measures_p[display_name] = "fillets of meat"
+ items_counts[display_name]++
+ for(var/O in items_counts)
+ var/N = items_counts[O]
+ if(!(O in items_measures))
+ dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
"}
+ else
+ if(N==1)
+ dat += {"[capitalize(O)]: [N] [items_measures[O]]
"}
+ else
+ dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
"}
+
+ for(var/datum/reagent/R in reagents.reagent_list)
+ var/display_name = R.name
+ if(R.id == "capsaicin")
+ display_name = "Hotsauce"
+ if(R.id == "frostoil")
+ display_name = "Coldsauce"
+ dat += {"[display_name]: [R.volume] unit\s
"}
+
+ if(items_counts.len==0 && reagents.reagent_list.len==0)
+ dat = {"The [src] is empty
"}
+ else
+ dat = {"Ingredients:
[dat]"}
+ dat += {"
Eject ingredients!
"}
+
+ var/datum/browser/popup = new(user, name, name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
+ onclose(user, "[name]")
+ return
+
+/obj/item/mixing_bowl/Topic(href, href_list)
+ if(..())
+ return
+ if("dispose")
+ dispose()
+ return
+
+/obj/item/mixing_bowl/proc/dispose()
+ for(var/obj/O in contents)
+ O.forceMove(loc)
+ if(reagents.total_volume)
+ make_dirty(5)
+ reagents.clear_reagents()
+ to_chat(usr, "You dispose of [src]'s contents.")
+ updateUsrDialog()
+
+/obj/item/mixing_bowl/proc/make_dirty(chance)
+ if(!chance)
+ return
+ if(prob(chance))
+ dirty = TRUE
+ flags = null
+ icon_state = dirty_icon
+
+/obj/item/mixing_bowl/proc/clean()
+ dirty = FALSE
+ flags = OPENCONTAINER
+ icon_state = clean_icon
+
+/obj/item/mixing_bowl/wash(mob/user, atom/source)
+ if(..())
+ clean()
+
+/obj/item/mixing_bowl/proc/fail(obj/source)
+ if(!source)
+ source = src
+ var/amount = 0
+ for(var/obj/O in contents)
+ amount++
+ if(O.reagents)
+ var/id = O.reagents.get_master_reagent_id()
+ if(id)
+ amount+=O.reagents.get_reagent_amount(id)
+ qdel(O)
+ if(reagents && reagents.total_volume)
+ var/id = reagents.get_master_reagent_id()
+ if(id)
+ amount += reagents.get_reagent_amount(id)
+ reagents.clear_reagents()
+ var/obj/item/reagent_containers/food/snacks/badrecipe/ffuu = new(get_turf(source))
+ ffuu.reagents.add_reagent("carbon", amount)
+ ffuu.reagents.add_reagent("????", amount/10)
+ make_dirty(75)
\ No newline at end of file
diff --git a/code/game/objects/items/mountable_frames/extinguisher_frame.dm b/code/game/objects/items/mountable_frames/extinguisher_frame.dm
new file mode 100644
index 00000000000..5356a154a6d
--- /dev/null
+++ b/code/game/objects/items/mountable_frames/extinguisher_frame.dm
@@ -0,0 +1,10 @@
+/obj/item/mounted/frame/extinguisher
+ name = "Extinguisher Cabinet Frame"
+ desc = "Used for building extinguisher cabinet"
+ icon = 'icons/obj/closet.dmi'
+ icon_state = "extinguisher_frame"
+ mount_reqs = list("simfloor", "nospace")
+
+/obj/item/mounted/frame/extinguisher/do_build(turf/on_wall, mob/user)
+ new /obj/structure/extinguisher_cabinet/empty(get_turf(src), get_dir(user, on_wall))
+ qdel(src)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index d5719261ec8..212f32e0121 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -68,12 +68,12 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \
)
var/global/list/datum/stack_recipe/plasma_recipes = list ( \
- new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe/dangerous("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \
null, \
- new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \
+ new/datum/stack_recipe/dangerous("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \
null, \
- new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe/dangerous("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe/dangerous("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/bananium_recipes = list ( \
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 5ef40ee25e8..90876bcf55c 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -90,6 +90,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("air alarm frame", /obj/item/mounted/frame/alarm_frame, 2),
new /datum/stack_recipe("fire alarm frame", /obj/item/mounted/frame/firealarm, 2),
new /datum/stack_recipe("intercom frame", /obj/item/mounted/frame/intercom, 2),
+ new /datum/stack_recipe("extinguisher cabinet frame", /obj/item/mounted/frame/extinguisher, 2),
null
)
@@ -170,7 +171,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40),
new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40),
new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),
new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index e55569b23e8..b6b3021a08e 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -31,7 +31,10 @@
/obj/item/stack/examine(mob/user)
if(..(user, 1))
- to_chat(user, "There are [amount] [singular_name]\s in the stack.")
+ if(singular_name)
+ to_chat(user, "There are [amount] [singular_name]\s in the stack.")
+ else
+ to_chat(user, "There are [amount] [name]\s in the stack.")
/obj/item/stack/attack_self(mob/user)
list_recipes(user)
diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm
index 10d06e9741d..2a2e91ef599 100644
--- a/code/game/objects/items/stacks/stack_recipe.dm
+++ b/code/game/objects/items/stacks/stack_recipe.dm
@@ -35,6 +35,14 @@
result.color = S.color
..()
+
+/datum/stack_recipe/dangerous
+/datum/stack_recipe/dangerous/post_build(/obj/item/stack/S, /obj/result)
+ var/turf/targ = get_turf(usr)
+ message_admins("[title] made by [key_name_admin(usr)](?) in [get_area(usr)] [ADMIN_COORDJMP(targ)]!",0,1)
+ log_game("[title] made by [key_name_admin(usr)] at [get_area(usr)] [targ.x], [targ.y], [targ.z].")
+ ..()
+
/datum/stack_recipe/rods
/datum/stack_recipe/rods/post_build(var/obj/item/stack/S, var/obj/result)
if(istype(result, /obj/item/stack/rods))
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 5325fb06b77..aa3f23f99b7 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -39,6 +39,9 @@
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5)
user.visible_message("[user.name] sets the plasma tiles on fire!", \
"You set the plasma tiles on fire!")
+ message_admins("Plasma tiles ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
+ log_game("Plasma tiles ignited by [key_name(user)] in ([x],[y],[z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
qdel(src)
return
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index c28fd68fc62..20766ef38cb 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -6,14 +6,26 @@
w_class = WEIGHT_CLASS_TINY
var/colour = "red"
var/open = 0
+ var/list/lipstick_colors = list(
+ "purple" = "purple",
+ "jade" = "#216F43",
+ "lime" = "lime",
+ "black" = "black",
+ "green" = "green",
+ "blue" = "blue",
+ "white" = "white")
+
/obj/item/lipstick/purple
name = "purple lipstick"
colour = "purple"
/obj/item/lipstick/jade
- //It's still called Jade, but theres no HTML color for jade, so we use lime.
name = "jade lipstick"
+ colour = "#216F43"
+
+/obj/item/lipstick/lime
+ name = "lime lipstick"
colour = "lime"
/obj/item/lipstick/black
@@ -36,8 +48,9 @@
name = "lipstick"
/obj/item/lipstick/random/New()
- colour = pick("red","purple","lime","black","green","blue","white")
- name = "[colour] lipstick"
+ var/lscolor = pick(lipstick_colors)//A random color is picked from the var defined initially in a new var.
+ colour = lipstick_colors[lscolor]//The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB)
+ name = "[lscolor] lipstick"//The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon
/obj/item/lipstick/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index b1fc3398af0..c37c1cce2c8 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -293,6 +293,10 @@
update_icon()
return unwield(user)
+/obj/item/twohanded/shockpaddles/on_mob_move(dir, mob/user)
+ if(defib && !(defib.Adjacent(user)))
+ defib.remove_paddles(user)
+
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O)
if(!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
M.unEquip(O)
diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm
index 4a01914a31a..03125313656 100644
--- a/code/game/objects/items/weapons/garrote.dm
+++ b/code/game/objects/items/weapons/garrote.dm
@@ -84,8 +84,7 @@
unwield(U)
U.swap_hand() // For whatever reason the grab will not properly work if we don't have the free hand active.
- M.grabbedby(U, 1)
- var/obj/item/grab/G = U.get_active_hand()
+ var/obj/item/grab/G = M.grabbedby(U, 1)
U.swap_hand()
if(G && istype(G))
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index d9aee2c5347..5a6131b2d4a 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -135,6 +135,7 @@
desc = "You can use this to wrap items in."
icon = 'icons/obj/items.dmi'
icon_state = "wrap_paper"
+ singular_name = "wrapping paper"
flags = NOBLUDGEON
amount = 25
max_amount = 25
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index db8f9f549d5..ad53a49d084 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -16,7 +16,7 @@
if(imp)
icon_state = "implantcase-[imp.item_color]"
origin_tech = imp.origin_tech
- flags = imp.flags
+ flags = imp.flags & ~DROPDEL
reagents = imp.reagents
else
icon_state = "implantcase-0"
diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm
index 047a75bd634..c705374f7a9 100644
--- a/code/game/objects/items/weapons/legcuffs.dm
+++ b/code/game/objects/items/weapons/legcuffs.dm
@@ -160,7 +160,7 @@
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
return//abort
var/mob/living/carbon/C = hit_atom
- if(!C.legcuffed)
+ if(!C.legcuffed && C.get_num_legs() >= 2)
visible_message("[src] ensnares [C]!")
C.legcuffed = src
forceMove(C)
diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm
index e130c3ed606..c139155b57c 100644
--- a/code/game/objects/items/weapons/rpd.dm
+++ b/code/game/objects/items/weapons/rpd.dm
@@ -192,7 +192,27 @@ var/list/pipemenu = list(
return
if(world.time < lastused + spawndelay)
return
- target.rpd_act(user, src) //Handle RPD effects in separate procs
+
+
+ var/turf/T = get_turf(target)
+ if(target != T)
+ // We only check the rpd_act of the target if it isn't the turf, because otherwise
+ // (A) blocked turfs can be acted on, and (B) unblocked turfs get acted on twice.
+ if(target.rpd_act(user, src) == TRUE)
+ // If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else.
+ // Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile.
+ return
+
+ // If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile.
+ // This is done by calling rpd_blocksusage on every /obj in the tile. If any block usage, fail at this point.
+
+ for(var/obj/O in T)
+ if(O.rpd_blocksusage() == TRUE)
+ to_chat(user, "[O] blocks the [src]!")
+ return
+
+ // If we get here, then we're effectively acting on the turf, probably placing a pipe.
+ T.rpd_act(user, src)
#undef RPD_COOLDOWN_TIME
#undef RPD_WALLBUILD_TIME
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 9d4481952f5..65524fec445 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -127,12 +127,48 @@
/obj/item/flashlight/pen,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/gloves/color/latex,
- /obj/item/reagent_containers/hypospray/autoinjector,
- /obj/item/rad_laser,
+ /obj/item/reagent_containers/hypospray/autoinjector,
+ /obj/item/reagent_containers/hypospray/CMO,
+ /obj/item/reagent_containers/hypospray/safety,
+ /obj/item/rad_laser,
/obj/item/sensor_device,
/obj/item/wrench/medical,
)
+/obj/item/storage/belt/medical/surgery
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_combined_w_class = 17
+ use_to_pickup = 1
+ name = "Surgical Belt"
+ desc = "Can hold various surgical tools."
+ storage_slots = 9
+ use_item_overlays = 1
+ can_hold = list(
+ /obj/item/scalpel,
+ /obj/item/hemostat,
+ /obj/item/retractor,
+ /obj/item/circular_saw,
+ /obj/item/bonegel,
+ /obj/item/bonesetter,
+ /obj/item/FixOVein,
+ /obj/item/surgicaldrill,
+ /obj/item/cautery,
+ )
+
+/obj/item/storage/belt/medical/surgery/loaded
+
+/obj/item/storage/belt/medical/surgery/loaded/New()
+ ..()
+ new /obj/item/scalpel(src)
+ new /obj/item/hemostat(src)
+ new /obj/item/retractor(src)
+ new /obj/item/circular_saw(src)
+ new /obj/item/bonegel(src)
+ new /obj/item/bonesetter(src)
+ new /obj/item/FixOVein(src)
+ new /obj/item/surgicaldrill(src)
+ new /obj/item/cautery(src)
+
/obj/item/storage/belt/medical/response_team
/obj/item/storage/belt/medical/response_team/New()
@@ -203,7 +239,7 @@
/obj/item/storage/belt/security/response_team/New()
..()
- new /obj/item/kitchen/knife/combat(src)
+ new /obj/item/reagent_containers/spray/pepper(src)
new /obj/item/melee/baton/loaded(src)
new /obj/item/flash(src)
new /obj/item/melee/classic_baton/telescopic(src)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index ddc8b79012f..3bed8e15333 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -231,6 +231,15 @@
..()
base_name = name
+/obj/item/storage/pill_bottle/ert/New()
+ ..()
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+
/obj/item/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri
if(ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
var/mob/M = usr
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 66316b6f7ef..f24b60c62d0 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -352,6 +352,10 @@
W.fire_act()
return 1
+/obj/item/storage/Exited(atom/A, loc)
+ remove_from_storage(A, loc) //worry not, comrade; this only gets called once
+ ..()
+
/obj/item/storage/empty_object_contents(burn, loc)
for(var/obj/item/Item in contents)
remove_from_storage(Item, loc, burn)
@@ -553,3 +557,6 @@
else
log_runtime(EXCEPTION("Non-list thing found in storage/deserialize."), src, list("Thing: [thing]"))
..()
+
+/obj/item/storage/AllowDrop()
+ return TRUE
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 06eaae8421c..2b93bec6b52 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -49,9 +49,6 @@
if(front_id)
switch(front_id.icon_state)
- if("id")
- icon_state = "walletid"
- return
if("silver")
icon_state = "walletid_silver"
return
@@ -61,6 +58,9 @@
if("centcom")
icon_state = "walletid_centcom"
return
+ else
+ icon_state = "walletid"
+ return
icon_state = "wallet"
@@ -124,9 +124,6 @@
/obj/item/storage/wallet/color/update_icon()
if(front_id)
switch(front_id.icon_state)
- if("id")
- icon_state = "[item_color]_walletid"
- return
if("silver")
icon_state = "[item_color]_walletid_silver"
return
@@ -136,6 +133,9 @@
if("centcom")
icon_state = "[item_color]_walletid_centcom"
return
+ else
+ icon_state = "[item_color]_walletid"
+ return
icon_state = "[item_color]_wallet"
/obj/item/storage/wallet/color/blue
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 57e0290346e..b8437f3b7ed 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -3,6 +3,7 @@
desc = "A roll of sticky tape. Possibly for taping ducks... or was that ducts?"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "taperoll"
+ singular_name = "tape roll"
w_class = WEIGHT_CLASS_TINY
amount = 10
max_amount = 10
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 43904d27359..08a6a3e168c 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -1,3 +1,5 @@
+#define HEALPERWELD 15
+
/* Tools!
* Note: Multitools are in devices
*
@@ -407,24 +409,47 @@
to_chat(user, "Turn on [src] before attempting repairs!")
return 1
- if(S.brute_dam)
- if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP)
- if(get_fuel() >= 1)
- if(H == user)
- if(!do_mob(user, H, 10))
- return 1
- if(remove_fuel(1,null))
- playsound(src.loc, usesound, 50, 1)
- S.heal_damage(15,0,0,1)
- user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].")
- else if(S.open != 2)
- to_chat(user, "Need more welding fuel!")
- return 1
- else
- to_chat(user, "The damage is far too severe to patch over externally.")
- return 1
- else if(S.open != 2)
+ if(S.brute_dam > ROBOLIMB_SELF_REPAIR_CAP)
+ to_chat(user, "The damage is far too severe to patch over externally.")
+ return
+
+ if(!S.brute_dam)
to_chat(user, "Nothing to fix!")
+ return
+
+ if(get_fuel() >= 1)
+ if(H == user)
+ if(!do_mob(user, H, 10))
+ return 1
+ if(!remove_fuel(1,null))
+ to_chat(user, "Need more welding fuel!")
+ var/rembrute = HEALPERWELD
+ var/nrembrute = 0
+ var/childlist
+ if(!isnull(S.children))
+ childlist = S.children.Copy()
+ var/parenthealed = FALSE
+ while(rembrute > 0)
+ var/obj/item/organ/external/E
+ if(S.brute_dam)
+ E = S
+ else if(LAZYLEN(childlist))
+ E = pick_n_take(childlist)
+ if(!E.brute_dam || !E.is_robotic())
+ continue
+ else if(S.parent && !parenthealed)
+ E = S.parent
+ parenthealed = TRUE
+ if(!E.brute_dam || !E.is_robotic())
+ break
+ else
+ break
+ playsound(src.loc, usesound, 50, 1)
+ nrembrute = max(rembrute - E.brute_dam, 0)
+ E.heal_damage(rembrute,0,0,1)
+ rembrute = nrembrute
+ user.visible_message("\The [user] patches some dents on \the [M]'s [E.name] with \the [src].")
+ return 1
else
return ..()
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index a7e57ce5a52..29d3f2663bc 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -71,10 +71,6 @@
SSnanoui.close_uis(src)
return ..()
-/obj/rpd_act(mob/user, obj/item/rpd/our_rpd)
- var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs
- T.rpd_act(user, our_rpd)
-
/obj/proc/process()
set waitfor = 0
processing_objects.Remove(src)
@@ -307,3 +303,6 @@ a {
.["Make speed process"] = "?_src_=vars;makespeedy=[UID()]"
else
.["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]"
+
+/obj/proc/check_uplink_validity()
+ return 1
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
deleted file mode 100644
index 4d02555eac5..00000000000
--- a/code/game/objects/structures/artstuff.dm
+++ /dev/null
@@ -1,136 +0,0 @@
-///////////
-// EASEL //
-///////////
-
-/obj/structure/easel
- name = "easel"
- desc = "only for the finest of art!"
- icon = 'icons/obj/artstuff.dmi'
- icon_state = "easel"
- density = 1
- burn_state = FLAMMABLE
- burntime = 15
- var/obj/item/canvas/painting = null
-
-/obj/structure/easel/Destroy()
- QDEL_NULL(painting)
- return ..()
-
-//Adding canvases
-/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params)
- if(istype(I, /obj/item/canvas))
- var/obj/item/canvas/C = I
- user.unEquip(C)
- painting = C
- C.loc = get_turf(src)
- C.layer = layer+0.1
- user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].")
- return
-
- ..()
-
-
-//Stick to the easel like glue
-/obj/structure/easel/Move()
- var/turf/T = get_turf(src)
- ..()
- if(painting && painting.loc == T) //Only move if it's near us.
- painting.loc = get_turf(src)
- else
- painting = null
-
-
-//////////////
-// CANVASES //
-//////////////
-
-#define AMT_OF_CANVASES 4 //Keep this up to date or shit will break.
-
-//To safe memory on making /icons we cache the blanks..
-var/global/list/globalBlankCanvases[AMT_OF_CANVASES]
-
-/obj/item/canvas
- name = "11px by 11px canvas"
- desc = "Draw out your soul on this canvas! Only crayons can draw on it. Examine it to focus on the canvas."
- icon = 'icons/obj/artstuff.dmi'
- icon_state = "11x11"
- burn_state = FLAMMABLE
- var/whichGlobalBackup = 1 //List index
-
-/obj/item/canvas/nineteenXnineteen
- name = "19px by 19px canvas"
- icon_state = "19x19"
- whichGlobalBackup = 2
-
-/obj/item/canvas/twentythreeXnineteen
- name = "23px by 19px canvas"
- icon_state = "23x19"
- whichGlobalBackup = 3
-
-/obj/item/canvas/twentythreeXtwentythree
- name = "23px by 23px canvas"
- icon_state = "23x23"
- whichGlobalBackup = 4
-
-
-//Find the right size blank canvas
-/obj/item/canvas/proc/getGlobalBackup()
- . = null
- if(globalBlankCanvases[whichGlobalBackup])
- . = globalBlankCanvases[whichGlobalBackup]
- else
- var/icon/I = icon(initial(icon),initial(icon_state))
- globalBlankCanvases[whichGlobalBackup] = I
- . = I
-
-
-
-//One pixel increments
-/obj/item/canvas/attackby(var/obj/item/I, var/mob/user, params)
- //Click info
- var/list/click_params = params2list(params)
- var/pixX = text2num(click_params["icon-x"])
- var/pixY = text2num(click_params["icon-y"])
-
- //Should always be true, otherwise you didn't click the object, but let's check because SS13~
- if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
- return
-
- var/icon/masterpiece = icon(icon,icon_state)
- //Cleaning one pixel with a soap or rag
- if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/glass/rag))
- //Pixel info created only when needed
- var/thePix = masterpiece.GetPixel(pixX,pixY)
- var/icon/Ico = getGlobalBackup()
- if(!Ico)
- qdel(masterpiece)
- return
-
- var/theOriginalPix = Ico.GetPixel(pixX,pixY)
- if(thePix != theOriginalPix) //colour changed
- DrawPixelOn(theOriginalPix,pixX,pixY)
- qdel(masterpiece)
- return 1
-
- //Drawing one pixel with a crayon
- if(istype(I, /obj/item/toy/crayon))
- var/obj/item/toy/crayon/C = I
- var/pix = masterpiece.GetPixel(pixX, pixY)
- if(pix && pix != C.colour) // if the located pixel isn't blank (null))
- DrawPixelOn(C.colour, pixX, pixY)
- qdel(masterpiece)
- return 1
-
- ..()
-
-//Clean the whole canvas
-/obj/item/canvas/attack_self(var/mob/user)
- if(!user)
- return
- var/icon/blank = getGlobalBackup()
- if(blank)
- //it's basically a giant etch-a-sketch
- icon = blank
- user.visible_message("[user] cleans the canvas.","You clean the canvas.")
-
-#undef AMT_OF_CANVASES
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 76f0bab19d5..2f681c79d76 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -7,9 +7,9 @@
armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0)
var/icon_closed = "closed"
var/icon_opened = "open"
- var/opened = 0
- var/welded = 0
- var/locked = 0
+ var/opened = FALSE
+ var/welded = FALSE
+ var/locked = FALSE
var/wall_mounted = 0 //never solid (You can always pass over it)
var/health = 100
var/lastbang
@@ -34,19 +34,20 @@
return ..()
/obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0)
- if(height==0 || wall_mounted) return 1
+ if(height==0 || wall_mounted)
+ return TRUE
return (!density)
/obj/structure/closet/proc/can_open()
if(welded)
- return 0
- return 1
+ return FALSE
+ return TRUE
/obj/structure/closet/proc/can_close()
for(var/obj/structure/closet/closet in get_turf(src))
if(closet != src && closet.anchored != 1)
- return 0
- return 1
+ return FALSE
+ return TRUE
/obj/structure/closet/proc/dump_contents()
var/turf/T = get_turf(src)
@@ -59,27 +60,27 @@
/obj/structure/closet/proc/open()
if(opened)
- return 0
+ return FALSE
if(!can_open())
- return 0
+ return FALSE
dump_contents()
icon_state = icon_opened
- opened = 1
+ opened = TRUE
if(sound)
playsound(loc, sound, 15, 1, -3)
else
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 0
- return 1
+ return TRUE
/obj/structure/closet/proc/close()
if(!opened)
- return 0
+ return FALSE
if(!can_close())
- return 0
+ return FALSE
var/itemcount = 0
@@ -109,13 +110,13 @@
itemcount++
icon_state = icon_closed
- opened = 0
+ opened = FALSE
if(sound)
playsound(loc, sound, 15, 1, -3)
else
playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 1
- return 1
+ return TRUE
/obj/structure/closet/proc/toggle(mob/user)
if(!(opened ? close() : open()))
@@ -246,7 +247,7 @@
if(istype(W, /obj/item/grab))
MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
if(istype(W,/obj/item/tk_grab))
- return 0
+ return FALSE
if(istype(W, cutting_tool))
if(istype(W, /obj/item/weldingtool))
var/obj/item/weldingtool/WT = W
@@ -264,7 +265,7 @@
var/turf/T = get_turf(src)
new material_drop(T, material_drop_amount)
qdel(src)
- return
+ return
if(isrobot(user))
return
if(!user.drop_item()) //couldn't drop the item
@@ -371,8 +372,9 @@
// should be independently resolved, but this is also an interesting twist.
/obj/structure/closet/Exit(atom/movable/AM)
open()
- if(AM.loc == src) return 0
- return 1
+ if(AM.loc == src)
+ return FALSE
+ return TRUE
/obj/structure/closet/container_resist(var/mob/living/L)
var/breakout_time = 2 //2 minutes by default
@@ -404,7 +406,7 @@
return
//Well then break it!
- welded = 0
+ welded = FALSE
update_icon()
to_chat(usr, "You successfully break out!")
for(var/mob/O in viewers(L.loc))
@@ -421,4 +423,7 @@
/obj/structure/closet/get_remote_view_fullscreens(mob/user)
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
- user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
\ No newline at end of file
+ user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
+
+/obj/structure/closet/AllowDrop()
+ return TRUE
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm
index 1d52dbcdf1b..be67d79272f 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm
@@ -6,6 +6,8 @@
anchored = 1
health = 200
req_access = list()
+ var/is_armory = FALSE
+ var/ignore_use = FALSE
/obj/structure/closet/secure_closet/syndicate/depot/New()
@@ -26,9 +28,12 @@
. = ..()
/obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup()
- var/area/syndicate_depot/core/depotarea = areaMaster
- if(depotarea)
- depotarea.locker_looted()
+ if(!ignore_use)
+ var/area/syndicate_depot/core/depotarea = areaMaster
+ if(istype(depotarea))
+ depotarea.locker_looted()
+ if(is_armory)
+ depotarea.armory_locker_looted()
/obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M)
if(isanimal(M) && "syndicate" in M.faction)
@@ -36,10 +41,26 @@
return
return ..(M)
+/obj/structure/closet/secure_closet/syndicate/depot/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/rcs))
+ to_chat(user, "Bluespace interference prevents the [W] from locking onto [src]!")
+ return
+ return ..()
+
/obj/structure/closet/secure_closet/syndicate/depot/emp_act(severity)
return
/obj/structure/closet/secure_closet/syndicate/depot/togglelock(mob/user)
. = ..()
if(!locked)
- loot_pickup()
\ No newline at end of file
+ loot_pickup()
+
+/obj/structure/closet/secure_closet/syndicate/depot/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ ignore_use = TRUE
+ toggle(user)
+ ignore_use = FALSE
+
+/obj/structure/closet/secure_closet/syndicate/depot/armory
+ req_access = list(access_syndicate)
+ is_armory = TRUE
\ No newline at end of file
diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm
index 9dfe256ce38..b655d010aa7 100644
--- a/code/game/objects/structures/depot.dm
+++ b/code/game/objects/structures/depot.dm
@@ -7,15 +7,24 @@
anchored = 1
max_integrity = 50
var/area/syndicate_depot/core/depotarea
+ var/has_overloaded = FALSE
/obj/structure/fusionreactor/Initialize()
- . = ..()
+ ..()
depotarea = areaMaster
- if(depotarea)
+ if(istype(depotarea))
depotarea.reactor = src
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/structure/fusionreactor/LateInitialize()
+ for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc))
+ if(!istype(T.depotarea))
+ T.depotarea = depotarea
/obj/structure/fusionreactor/Destroy()
- if(depotarea)
+ if(istype(depotarea))
+ if(!has_overloaded)
+ overload(TRUE, TRUE)
depotarea.reactor = null
..()
@@ -30,7 +39,7 @@
healthcheck()
/obj/structure/fusionreactor/proc/healthcheck()
- if(obj_integrity <= 0)
+ if(obj_integrity <= 0 && istype(depotarea))
overload(TRUE)
/obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params)
@@ -47,13 +56,20 @@
else
return ..()
-/obj/structure/fusionreactor/proc/overload(containment_failure)
+/obj/structure/fusionreactor/proc/overload(containment_failure = FALSE, skip_qdel = FALSE)
+ if(has_overloaded)
+ return
+ has_overloaded = TRUE
+ if(istype(depotarea) && !depotarea.used_self_destruct)
+ depotarea.activate_self_destruct("Fusion reactor cracked open. Core loose!", TRUE)
var/obj/effect/overload/O = new /obj/effect/overload(get_turf(src))
if(containment_failure)
playsound(loc, 'sound/machines/Alarm.ogg', 100, 0, 0)
O.deliberate = TRUE
O.max_cycles = 6
- qdel(src)
+ if(!skip_qdel)
+ qdel(src)
+
/obj/effect/overload
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 048961defd5..568fb0ededc 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -1,3 +1,8 @@
+#define NO_EXTINGUISHER 0
+#define NORMAL_EXTINGUISHER 1
+#define MINI_EXTINGUISHER 2
+
+
/obj/structure/extinguisher_cabinet
name = "extinguisher cabinet"
desc = "A small wall mounted cabinet designed to hold a fire extinguisher."
@@ -5,13 +10,28 @@
icon_state = "extinguisher_closed"
anchored = 1
density = 0
- var/obj/item/extinguisher/has_extinguisher = new/obj/item/extinguisher
+ var/obj/item/extinguisher/has_extinguisher = null
+ var/extinguishertype
var/opened = 0
+ var/material_drop = /obj/item/stack/sheet/metal
+
+/obj/structure/extinguisher_cabinet/New(turf/loc, ndir = null)
+ ..()
+ if(ndir)
+ pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0
+ pixel_y = (ndir & NORTH|SOUTH)? (ndir == WEST ? 28 : -28) : 0
+ switch(extinguishertype)
+ if(NO_EXTINGUISHER)
+ return
+ if(MINI_EXTINGUISHER)
+ has_extinguisher = new/obj/item/extinguisher/mini
+ else
+ has_extinguisher = new/obj/item/extinguisher
/obj/structure/extinguisher_cabinet/Destroy()
QDEL_NULL(has_extinguisher)
return ..()
-
+
/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params)
if(isrobot(user) || isalien(user))
return
@@ -23,13 +43,34 @@
to_chat(user, "You place [O] in [src].")
else
opened = !opened
+ else if(istype(O, /obj/item/weldingtool))
+ if(has_extinguisher)
+ to_chat(user, "You need to remove the extinguisher before deconstructing the cabinet!")
+ return
+ if(!opened)
+ to_chat(user, "Open the cabinet before cutting it apart!")
+ return
+ var/obj/item/weldingtool/WT = O
+ if(!WT.remove_fuel(0, user))
+ return
+ to_chat(user, "You begin cutting [src] apart...")
+ playsound(loc, WT.usesound, 40, 1)
+ if(do_after(user, 40 * WT.toolspeed, 1, target = src))
+ if(!src ||!opened || !WT.isOn()) // !src to prevent it being duped
+ return
+ visible_message("[user] slices apart [src].",
+ "You cut [src] apart with [WT].",
+ "You hear welding.")
+ var/turf/T = get_turf(src)
+ new material_drop(T)
+ qdel(src)
else
opened = !opened
update_icon()
-
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
if(isrobot(user) || isalien(user))
+ to_chat(user, "You don't have the dexterity to do this!")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -70,3 +111,11 @@
icon_state = "extinguisher_full"
else
icon_state = "extinguisher_empty"
+
+/obj/structure/extinguisher_cabinet/empty/New(turf/loc, ndir = null)
+ extinguishertype = NO_EXTINGUISHER
+ ..()
+
+#undef NO_EXTINGUISHER
+#undef NORMAL_EXTINGUISHER
+#undef MINI_EXTINGUISHER
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 4ef1978cffb..cb7350f5b34 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -47,6 +47,11 @@
new /obj/item/stack/sheet/metal(get_turf(src))
qdel(src)
+/obj/structure/girder/temperature_expose(datum/gas_mixture/air, exposed_temperature)
+ var/temp_check = exposed_temperature
+ if(temp_check >= GIRDER_MELTING_TEMP)
+ take_damage(10)
+
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
if(isscrewdriver(W))
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 7d7c9628d63..0f85d0bb8eb 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -54,6 +54,7 @@
/obj/structure/mirror/attackby(obj/item/I, mob/living/user, params)
+ user.changeNext_move(CLICK_CD_MELEE)
if(isscrewdriver(I))
user.visible_message("[user] begins to unfasten [src].", "You begin to unfasten [src].")
if(do_after(user, 30 * I.toolspeed, target = src))
@@ -80,6 +81,7 @@
/obj/structure/mirror/attack_alien(mob/living/user)
+ user.changeNext_move(CLICK_CD_MELEE)
if(islarva(user))
return
user.do_attack_animation(src)
@@ -91,6 +93,7 @@
/obj/structure/mirror/attack_animal(mob/living/user)
+ user.changeNext_move(CLICK_CD_MELEE)
if(!isanimal(user))
return
var/mob/living/simple_animal/M = user
@@ -105,6 +108,7 @@
/obj/structure/mirror/attack_slime(mob/living/user)
+ user.changeNext_move(CLICK_CD_MELEE)
var/mob/living/carbon/slime/S = user
if(!S.is_adult)
return
@@ -125,4 +129,4 @@
/obj/item/mounted/mirror/do_build(turf/on_wall, mob/user)
var/obj/structure/mirror/M = new /obj/structure/mirror(get_turf(user), get_dir(on_wall, user), 1)
transfer_prints_to(M, TRUE)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 179615dada3..31bfadee7d7 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -243,7 +243,7 @@
icon_state = "shower"
density = 0
anchored = 1
- use_power = 0
+ use_power = NO_POWER_USE
var/on = 0
var/obj/effect/mist/mymist = null
var/ismist = 0 //needs a var so we can make it linger~
@@ -756,4 +756,3 @@
qdel(src)
if(prob(50))
new /obj/item/stack/sheet/cardboard(T)
-
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 646adfa2038..d7aa9e88504 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -410,13 +410,17 @@ var/ert_request_answered = 0
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
suit = /obj/item/clothing/suit/space/hardsuit/ert/commander
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses
-
+ glasses = /obj/item/clothing/glasses/sunglasses
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/eyes/hud/security,
+ /obj/item/organ/internal/cyberimp/chest/nutriment
+ )
belt = /obj/item/gun/energy/gun/nuclear
backpack_contents = list(
/obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
+ /obj/item/gun/energy/ionrifle/carbine = 1,
/obj/item/restraints/handcuffs = 1,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/storage/lockbox/mindshield = 1
@@ -449,15 +453,6 @@ var/ert_request_answered = 0
id = /obj/item/card/id/ert/security
var/has_grenades = FALSE
-/datum/outfit/job/centcom/response_team/security/pre_equip()
- . = ..()
- if(has_grenades)
- var/grenadebox = /obj/item/storage/box/flashbangs
- if(prob(50))
- grenadebox = /obj/item/storage/box/teargas
- backpack_contents.Insert(1, grenadebox)
- backpack_contents[grenadebox] = 1
-
/datum/outfit/job/centcom/response_team/security/amber
name = "RT Security (Amber)"
shoes = /obj/item/clothing/shoes/combat
@@ -471,7 +466,9 @@ var/ert_request_answered = 0
backpack_contents = list(
/obj/item/clothing/head/helmet/ert/security = 1,
/obj/item/clothing/mask/gas/sechailer = 1,
- /obj/item/storage/box/zipties = 1
+ /obj/item/storage/box/zipties = 1,
+ /obj/item/storage/box/teargas = 1,
+ /obj/item/flashlight/seclite = 1
)
/datum/outfit/job/centcom/response_team/security/red
@@ -481,17 +478,22 @@ var/ert_request_answered = 0
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/color/black
suit = /obj/item/clothing/suit/space/hardsuit/ert/security
- suit_store = /obj/item/gun/energy/gun/advtaser
+ suit_store = /obj/item/gun/energy/gun/blueshield
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
-
- r_hand = /obj/item/gun/energy/lasercannon
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/arm/flash,
+ /obj/item/organ/internal/cyberimp/chest/nutriment
+ )
+ r_hand = /obj/item/gun/projectile/automatic/lasercarbine
backpack_contents = list(
/obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1,
/obj/item/clothing/mask/gas/sechailer = 1,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/storage/box/handcuffs = 1,
- /obj/item/gun/energy/ionrifle/carbine = 1
+ /obj/item/storage/box/teargas = 1,
+ /obj/item/grenade/flashbang = 1,
+ /obj/item/ammo_box/magazine/laser = 2
)
/datum/outfit/job/centcom/response_team/security/gamma
@@ -530,12 +532,13 @@ var/ert_request_answered = 0
suit_store = /obj/item/tank/emergency_oxygen/engi
glasses = /obj/item/clothing/glasses/meson
- l_pocket = /obj/item/t_scanner
+ l_pocket = /obj/item/gun/energy/gun/mini
r_pocket = /obj/item/melee/classic_baton/telescopic
backpack_contents = list(
/obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1,
/obj/item/clothing/mask/gas = 1,
+ /obj/item/t_scanner = 1,
/obj/item/stack/sheet/glass/fifty = 1,
/obj/item/stack/sheet/metal/fifty = 1
)
@@ -544,10 +547,14 @@ var/ert_request_answered = 0
name = "RT Engineer (Red)"
shoes = /obj/item/clothing/shoes/magboots/advance
gloves = /obj/item/clothing/gloves/color/yellow
+ belt = /obj/item/storage/belt/utility/chief/full
suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer
suit_store = /obj/item/tank/emergency_oxygen/engi
glasses = /obj/item/clothing/glasses/meson
-
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/eyes/shield,
+ /obj/item/organ/internal/cyberimp/chest/nutriment
+ )
l_pocket = /obj/item/t_scanner/extended_range
r_pocket = /obj/item/melee/classic_baton/telescopic
@@ -586,28 +593,28 @@ var/ert_request_answered = 0
pda = /obj/item/pda/heads/ert/medical
id = /obj/item/card/id/ert/medic
- l_pocket = /obj/item/reagent_containers/hypospray/CMO
- r_pocket = /obj/item/melee/classic_baton/telescopic
-
/datum/outfit/job/centcom/response_team/medic/amber
name = "RT Medic (Amber)"
shoes = /obj/item/clothing/shoes/white
gloves = /obj/item/clothing/gloves/color/latex
suit = /obj/item/clothing/suit/armor/vest/ert/medical
+ suit_store = /obj/item/gun/energy/gun/mini
glasses = /obj/item/clothing/glasses/hud/health
- belt = /obj/item/storage/belt/medical/response_team
+ belt = /obj/item/storage/belt/medical/surgery/loaded
- l_pocket = /obj/item/reagent_containers/hypospray/CMO
+ l_pocket = /obj/item/reagent_containers/hypospray/safety/ert
r_pocket = /obj/item/melee/classic_baton/telescopic
backpack_contents = list(
/obj/item/clothing/head/helmet/ert/medical = 1,
/obj/item/clothing/mask/surgical = 1,
- /obj/item/storage/firstaid/o2 = 1,
- /obj/item/storage/firstaid/brute = 1,
/obj/item/storage/firstaid/adv = 1,
+ /obj/item/storage/firstaid/regular = 1,
+ /obj/item/storage/box/autoinjectors = 1,
+ /obj/item/roller = 1,
+ /obj/item/storage/pill_bottle/ert = 1
)
/datum/outfit/job/centcom/response_team/medic/red
@@ -616,18 +623,24 @@ var/ert_request_answered = 0
gloves = /obj/item/clothing/gloves/color/latex/nitrile
suit = /obj/item/clothing/suit/space/hardsuit/ert/medical
glasses = /obj/item/clothing/glasses/hud/health/health_advanced
-
+ suit_store = /obj/item/gun/energy/gun
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/arm/surgery,
+ /obj/item/organ/internal/cyberimp/chest/nutriment
+ )
belt = /obj/item/defibrillator/compact/loaded
+ l_pocket = /obj/item/reagent_containers/hypospray/safety/ert
+ r_pocket = /obj/item/melee/classic_baton/telescopic
backpack_contents = list(
/obj/item/clothing/head/helmet/space/hardsuit/ert/medical = 1,
/obj/item/clothing/mask/surgical = 1,
- /obj/item/storage/firstaid/o2 = 1,
/obj/item/storage/firstaid/toxin = 1,
- /obj/item/storage/firstaid/adv = 1,
- /obj/item/storage/firstaid/surgery = 1,
- /obj/item/gun/energy/gun = 1,
+ /obj/item/storage/firstaid/brute = 1,
+ /obj/item/storage/firstaid/fire = 1,
+ /obj/item/storage/box/autoinjectors = 1,
+ /obj/item/roller = 1,
/obj/item/clothing/shoes/magboots = 1
)
@@ -637,6 +650,9 @@ var/ert_request_answered = 0
gloves = /obj/item/clothing/gloves/combat
suit = /obj/item/clothing/suit/space/hardsuit/ert/medical
glasses = /obj/item/clothing/glasses/hud/health/night
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/arm/surgery
+ )
belt = /obj/item/defibrillator/compact/loaded
@@ -711,15 +727,22 @@ var/ert_request_answered = 0
/datum/outfit/job/centcom/response_team/janitorial/amber
name = "RT Janitor (Amber)"
+ suit = /obj/item/clothing/suit/armor/vest/ert/janitor
+ head = /obj/item/clothing/head/helmet/ert/janitor
glasses = /obj/item/clothing/glasses/sunglasses
+ r_hand = /obj/item/gun/energy/disabler
+
/datum/outfit/job/centcom/response_team/janitorial/red
name = "RT Janitor (Red)"
suit = /obj/item/clothing/suit/space/hardsuit/ert/janitor
head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
- suit_store = /obj/item/gun/energy/gun
+ cybernetic_implants = list(
+ /obj/item/organ/internal/cyberimp/chest/nutriment
+ )
r_pocket = /obj/item/scythe/tele
+ l_pocket = /obj/item/gun/energy/gun/mini
/datum/outfit/job/centcom/response_team/janitorial/gamma
name = "RT Janitor (Gamma)"
diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm
index 35b7960b742..d2e147d9532 100644
--- a/code/game/turfs/simulated/floor/mineral.dm
+++ b/code/game/turfs/simulated/floor/mineral.dm
@@ -157,18 +157,14 @@
honk()
/turf/simulated/floor/mineral/bananium/proc/honk()
- if(!spam_flag)
- spam_flag = 1
+ if(spam_flag < world.time)
playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
- spawn(20)
- spam_flag = 0
+ spam_flag = world.time + 20
/turf/simulated/floor/mineral/bananium/proc/squeek()
- if(!spam_flag)
- spam_flag = 1
+ if(spam_flag < world.time)
playsound(src, "clownstep", 50, 1)
- spawn(10)
- spam_flag = 0
+ spam_flag = world.time + 10
/turf/simulated/floor/mineral/bananium/airless
oxygen = 0.01
@@ -255,4 +251,4 @@
return //unbreakable
/turf/simulated/floor/plating/abductor2/burn_tile()
- return //unburnable
\ No newline at end of file
+ return //unburnable
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 337233b5bf4..012d270005a 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -475,3 +475,6 @@
SSair.remove_from_active(T0)
T0.CalculateAdjacentTurfs()
SSair.add_to_active(T0,1)
+
+/turf/AllowDrop()
+ return TRUE
\ No newline at end of file
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index da843d8e53c..59f50797cf1 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -84,7 +84,7 @@
do_suicide(damagetype, held_item)
return
- to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.")
+ to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.")
do_suicide(0)
updatehealth()
diff --git a/code/game/world.dm b/code/game/world.dm
index 516346aeca3..2e57bf99a62 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -442,9 +442,11 @@ var/failed_old_db_connections = 0
GLOB.world_game_log = "[GLOB.log_directory]/game.log"
GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log"
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
+ GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log"
start_log(GLOB.world_game_log)
start_log(GLOB.world_href_log)
start_log(GLOB.world_runtime_log)
+ start_log(GLOB.world_qdel_log)
if(fexists(GLOB.config_error_log))
fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 84120c2c669..f401589bf90 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -60,9 +60,9 @@ var/global/nologevent = 0
body += "TP - "
body += "PM - "
body += "SM - "
- body += "[admin_jump_link(M)]\]
"
if(ishuman(M) && M.mind)
- body += "HM"
+ body += "HM -"
+ body += "[admin_jump_link(M)]\]
"
body += "Mob type: [M.type]
"
if(M.client)
if(M.client.related_accounts_cid.len)
@@ -566,7 +566,7 @@ var/global/nologevent = 0
if(!check_rights(R_SERVER,0))
message = adminscrub(message,500)
message = replacetext(message, "\n", "
") // required since we're putting it in a tag
- to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:[message]
")
+ to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:[message]
")
log_admin("Announce: [key_name(usr)] : [message]")
feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/tickets/adminticketsUI.dm b/code/modules/admin/tickets/adminticketsUI.dm
index 750fa13e6cb..b063c5cb673 100644
--- a/code/modules/admin/tickets/adminticketsUI.dm
+++ b/code/modules/admin/tickets/adminticketsUI.dm
@@ -44,14 +44,14 @@
return dat
-/datum/adminTicketHolder/proc/showUI(var/client/user, var/tab)
+/datum/adminTicketHolder/proc/showUI(mob/user, var/tab)
var/dat = null
dat = returnUI(tab)
var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600)
popup.set_content(dat)
popup.open()
-/datum/adminTicketHolder/proc/showDetailUI(var/client/user, var/ticketID)
+/datum/adminTicketHolder/proc/showDetailUI(mob/user, var/ticketID)
var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID]
var/status = "[T.state2text()]"
@@ -91,9 +91,9 @@
popup.set_content(dat)
popup.open()
-/datum/adminTicketHolder/proc/userDetailUI(var/client/user)
+/datum/adminTicketHolder/proc/userDetailUI(mob/user)
//dat
- var/tickets = checkForTicket(user)
+ var/tickets = checkForTicket(user.client)
var/dat
dat += "
Your open tickets
"
dat += ""
@@ -130,7 +130,7 @@
if(href_list["details"])
var/indexNum = text2num(href_list["details"])
- showDetailUI(usr.client, indexNum)
+ showDetailUI(usr, indexNum)
return
if(href_list["resolve"])
@@ -169,4 +169,4 @@
if(globAdminTicketHolder.assignAdminToTicket(usr.client, indexNum))
message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]")
to_chat(returnClient(indexNum), "Your ticket is being handled by [usr.client].")
- showDetailUI(usr, indexNum)
\ No newline at end of file
+ showDetailUI(usr, indexNum)
diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm
index a0431cd8e23..0cf22c5d24c 100644
--- a/code/modules/admin/tickets/adminticketsverbs.dm
+++ b/code/modules/admin/tickets/adminticketsverbs.dm
@@ -48,4 +48,4 @@
if(!holder && !check_rights(R_ADMIN))
return
- globAdminTicketHolder.userDetailUI(usr.client)
+ globAdminTicketHolder.userDetailUI(usr)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 9a526c4a7c2..194b1d49035 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1216,8 +1216,7 @@
//strip their stuff and stick it in the crate
for(var/obj/item/I in M)
- M.unEquip(I)
- if(I)
+ if(M.unEquip(I))
I.loc = locker
I.layer = initial(I.layer)
I.plane = initial(I.plane)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 682a174c450..0b7797b84e3 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -271,7 +271,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return 0
var/obj/item/paicard/card = new(T)
var/mob/living/silicon/pai/pai = new(card)
- pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text
+ var/raw_name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text
+ var/new_name = reject_bad_name(raw_name, 1)
+ if(new_name)
+ pai.name = new_name
+ pai.real_name = new_name
+ else
+ to_chat(usr, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .")
pai.real_name = pai.name
pai.key = choice.key
card.setPersonality(pai)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 5c8e1c77745..c3641766db0 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -32,7 +32,7 @@ client/proc/one_click_antag()
if(M.stat || !M.mind || M.mind.special_role)
return FALSE
if(temp)
- if(M.mind.assigned_role in temp.restricted_jobs || M.client.prefs.species in temp.protected_species)
+ if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species))
return FALSE
if(role) // Don't even bother evaluating if there's no role
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && (!jobban_isbanned(M, role)))
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 0cf729f1e57..0fd53b8b62a 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -28,6 +28,7 @@
prayer_type = "CULTIST PRAYER"
deity = ticker.cultdat.entity_name
+ log_say("(PRAYER) [msg]", usr)
msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]:[key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SC) (BLESS) (SMITE): [msg]"
for(var/client/X in admins)
@@ -36,7 +37,6 @@
to_chat(usr, "Your prayers have been received by the gods.")
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- //log_admin("HELP: [key_name(src)]: [msg]")
/proc/Centcomm_announce(var/text , var/mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 2f794dafbd0..c5d6a50c418 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -435,6 +435,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//Now for special roles and equipment.
switch(new_character.mind.special_role)
if("traitor")
+ job_master.AssignRank(new_character, new_character.mind.assigned_role, 0)
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)
ticker.mode.equip_traitor(new_character)
if("Wizard")
@@ -465,6 +466,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
call(/datum/game_mode/proc/add_law_zero)(new_character)
//Add aliens.
else
+ job_master.AssignRank(new_character, new_character.mind.assigned_role, 0)
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them.
//Announces the character on all the systems, based on the record.
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index c81f30efc83..ecf8c336118 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -45,7 +45,7 @@
spawn_antag(C, get_turf(src.loc), "syndieborg")
else
checking = FALSE
- to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.")
+ to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.")
return
/obj/item/antag_spawner/borg_tele/spawn_antag(client/C, turf/T, type = "")
diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm
index 9b925e2f2ac..c3158e9ccba 100644
--- a/code/modules/arcade/arcade_base.dm
+++ b/code/modules/arcade/arcade_base.dm
@@ -6,7 +6,7 @@
icon_state = "clawmachine_on"
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 40
var/tokens = 0
var/freeplay = 0 //for debugging and admin kindness
@@ -112,28 +112,7 @@
to_chat(user, "Unable to access account: incorrect credentials.")
return 0
- if(token_price > customer_account.money)
- to_chat(user, "Insufficient funds in account.")
- return 0
- else
- // Okay to move the money at this point
-
- // debit money from the purchaser's account
- customer_account.money -= token_price
-
- // create entry in the purchaser's account log
- var/datum/transaction/T = new()
- T.target_name = "[src.name]"
- T.purpose = "Purchase of [src.name] credit"
- if(token_price > 0)
- T.amount = "([token_price])"
- else
- T.amount = "[token_price]"
- T.source_terminal = src.name
- T.date = current_date_string
- T.time = station_time_timestamp()
- customer_account.transaction_log.Add(T)
- return 1
+ return customer_account.charge(token_price, null, "Purchase of [name] credit", name, name)
/obj/machinery/arcade/proc/start_play(mob/user as mob)
user.set_machine(src)
@@ -159,4 +138,4 @@
/obj/machinery/arcade/Destroy()
src.close_game()
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm
index 4e2e4e9a0d7..d8666c36617 100644
--- a/code/modules/arcade/prize_counter.dm
+++ b/code/modules/arcade/prize_counter.dm
@@ -6,7 +6,7 @@
icon_state = "prize_counter-on"
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 40
var/tickets = 0
@@ -205,4 +205,4 @@ th.cost.toomuch {background:maroon;}
print_tickets()
else
new /obj/item/stack/tickets(get_turf(src), tickets)
- tickets = 0
\ No newline at end of file
+ tickets = 0
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index df7206a7914..8228e490a38 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -10,46 +10,67 @@
bomb_name = "voice-activated bomb"
- describe()
- if(recorded || listening)
- return "A meter on [src] flickers with every nearby sound."
- else
- return "[src] is deactivated."
+/obj/item/assembly/voice/describe()
+ if(recorded || listening)
+ return "A meter on [src] flickers with every nearby sound."
+ else
+ return "[src] is deactivated."
- hear_talk(mob/living/M as mob, msg)
- hear_input(M, msg, 0)
+/obj/item/assembly/voice/hear_talk(mob/living/M as mob, msg)
+ hear_input(M, msg, 0)
- hear_message(mob/living/M as mob, msg)
+/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg)
hear_input(M, msg, 1)
- proc/hear_input(mob/living/M as mob, msg, type)
- if(!istype(M,/mob/living))
- return
- if(listening)
- recorded = msg
- recorded_type = type
- listening = 0
- var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"")
- else
- if(findtext(msg, recorded) && type == recorded_type)
- pulse(0)
- var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("[bicon(src)] beeps!")
+/obj/item/assembly/voice/proc/hear_input(mob/living/M as mob, msg, type)
+ if(!istype(M,/mob/living))
+ return
+ if(listening)
+ recorded = msg
+ recorded_type = type
+ listening = 0
+ var/turf/T = get_turf(src) //otherwise it won't work in hand
+ T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"")
+ else if(findtext(msg, recorded) && type == recorded_type)
+ pulse(0)
+ var/turf/T = get_turf(src) //otherwise it won't work in hand
+ T.visible_message("[bicon(src)] beeps!")
- activate()
- return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way.
+/obj/item/assembly/voice/activate()
+ return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way.
- attack_self(mob/user)
- if(!user || !secured) return 0
+/obj/item/assembly/voice/attack_self(mob/user)
+ if(!user || !secured) return 0
- listening = !listening
- var/turf/T = get_turf(src)
- T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
- return 1
+ listening = !listening
+ var/turf/T = get_turf(src)
+ T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
+ return 1
- toggle_secure()
- . = ..()
- listening = 0
\ No newline at end of file
+/obj/item/assembly/voice/toggle_secure()
+ . = ..()
+ listening = 0
+
+/obj/item/assembly/voice/noise
+ name = "noise sensor"
+ desc = "A simple noise sensor that triggers on vocalizations other then speech."
+ icon_state = "voice"
+ materials = list(MAT_METAL=100, MAT_GLASS=10)
+ origin_tech = "magnets=1;engineering=1"
+ bomb_name = "noise-activated bomb"
+
+/obj/item/assembly/voice/noise/attack_self(mob/user)
+ return
+
+/obj/item/assembly/voice/noise/describe()
+ return "[src] does not appear to have any controls."
+
+/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, msg)
+ return
+
+/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg)
+ pulse(0)
+ var/turf/T = get_turf(src) //otherwise it won't work in hand
+ T.visible_message("[bicon(src)] beeps!")
\ No newline at end of file
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index d5e2cbcd34d..d6e72f1505c 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -31,7 +31,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
/obj/machinery/gateway/centerstation
density = 1
icon_state = "offcenter"
- use_power = 1
+ use_power = IDLE_POWER_USE
//warping vars
var/list/linked = list()
@@ -96,9 +96,12 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
/obj/machinery/gateway/centerstation/proc/toggleon(mob/user as mob)
- if(!ready) return
- if(linked.len != 8) return
- if(!powered()) return
+ if(!ready)
+ return
+ if(linked.len != 8)
+ return
+ if(!powered())
+ return
if(!awaygate)
awaygate = locate(/obj/machinery/gateway/centeraway) in world
if(!awaygate)
@@ -135,9 +138,12 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
//okay, here's the good teleporting stuff
/obj/machinery/gateway/centerstation/Bumped(atom/movable/M as mob|obj)
- if(!ready) return
- if(!active) return
- if(!awaygate) return
+ if(!ready)
+ return
+ if(!active)
+ return
+ if(!awaygate)
+ return
if(awaygate.calibrated)
M.forceMove(get_step(awaygate.loc, SOUTH))
@@ -163,7 +169,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
/obj/machinery/gateway/centeraway
density = 1
icon_state = "offcenter"
- use_power = 0
+ use_power = NO_POWER_USE
var/calibrated = 1
var/list/linked = list() //a list of the connected gateway chunks
var/ready = 0
@@ -207,8 +213,10 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
/obj/machinery/gateway/centeraway/proc/toggleon(mob/user as mob)
- if(!ready) return
- if(linked.len != 8) return
+ if(!ready)
+ return
+ if(linked.len != 8)
+ return
if(!stationgate)
stationgate = locate(/obj/machinery/gateway/centerstation) in world
if(!stationgate)
@@ -241,13 +249,20 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
/obj/machinery/gateway/centeraway/Bumped(atom/movable/M as mob|obj)
- if(!ready) return
- if(!active) return
+ if(!ready)
+ return
+ if(!active)
+ return
if(istype(M, /mob/living/carbon))
- if(exilecheck(M)) return
+ if(exilecheck(M))
+ return
if(istype(M, /obj))
+ if(M.can_buckle && M.has_buckled_mobs())
+ if(exilecheck(M.buckled_mob))
+ return
for(var/mob/living/carbon/F in M)
- if(exilecheck(F)) return
+ if(exilecheck(F))
+ return
M.forceMove(get_step(stationgate.loc, SOUTH))
M.dir = SOUTH
diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm
deleted file mode 100644
index bdb15581b61..00000000000
--- a/code/modules/awaymissions/maploader/swapmaps.dm
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- SwapMaps library by Lummox JR
- developed for digitalBYOND
- http://www.digitalbyond.org
-
- Version 2.1
-
- The purpose of this library is to make it easy for authors to swap maps
- in and out of their game using savefiles. Swapped-out maps can be
- transferred between worlds for an MMORPG, sent to the client, etc.
- This is facilitated by the use of a special datum and a global list.
-
- Uses of swapmaps:
-
- - Temporary battle arenas
- - House interiors
- - Individual custom player houses
- - Virtually unlimited terrain
- - Sharing maps between servers running different instances of the same
- game
- - Loading and saving pieces of maps for reusable room templates
- */
-
-/*
- User Interface:
-
- VARS:
-
- swapmaps_iconcache
- An associative list of icon files with names, like
- 'player.dmi' = "player"
- swapmaps_mode
- This must be set at runtime, like in world/New().
-
- SWAPMAPS_SAV 0 (default)
- Uses .sav files for raw /savefile output.
- SWAPMAPS_TEXT 1
- Uses .txt files via ExportText() and ImportText(). These maps
- are easily editable and appear to take up less space in the
- current version of BYOND.
-
- PROCS:
-
- SwapMaps_Find(id)
- Find a map by its id
- SwapMaps_Load(id)
- Load a map by its id
- SwapMaps_Save(id)
- Save a map by its id (calls swapmap.Save())
- SwapMaps_Unload(id)
- Save and unload a map by its id (calls swapmap.Unload())
- SwapMaps_Save_All()
- Save all maps
- SwapMaps_DeleteFile(id)
- Delete a map file
- SwapMaps_CreateFromTemplate(id)
- Create a new map by loading another map to use as a template.
- This map has id==src and will not be saved. To make it savable,
- change id with swapmap.SetID(newid).
- SwapMaps_LoadChunk(id,turf/locorner)
- Load a swapmap as a "chunk", at a specific place. A new datum is
- created but it's not added to the list of maps to save or unload.
- The new datum can be safely deleted without affecting the turfs
- it loaded. The purpose of this is to load a map file onto part of
- another swapmap or an existing part of the world.
- locorner is the corner turf with the lowest x,y,z values.
- SwapMaps_SaveChunk(id,turf/corner1,turf/corner2)
- Save a piece of the world as a "chunk". A new datum is created
- for the chunk, but it can be deleted without destroying any turfs.
- The chunk file can be reloaded as a swapmap all its own, or loaded
- via SwapMaps_LoadChunk() to become part of another map.
- SwapMaps_GetSize(id)
- Return a list corresponding to the x,y,z sizes of a map file,
- without loading the map.
- Returns null if the map is not found.
- SwapMaps_AddIconToCache(name,icon)
- Cache an icon file by name for space-saving storage
-
- swapmap.New(id,x,y,z)
- Create a new map; specify id, width (x), height (y), and
- depth (z)
- Default size is world.maxx,world.maxy,1
- swapmap.New(id,turf1,turf2)
- Create a new map; specify id and 2 corners
- This becomes a /swapmap for one of the compiled-in maps, for
- easy saving.
- swapmap.New()
- Create a new map datum, but does not allocate space or assign an
- ID (used for loading).
- swapmap.Del()
- Deletes a map but does not save
- swapmap.Save()
- Saves to map_[id].sav
- Maps with id==src are not saved.
- swapmap.Unload()
- Saves the map and then deletes it
- Maps with id==src are not saved.
- swapmap.SetID(id)
- Change the map's id and make changes to the lookup list
- swapmap.AllTurfs(z)
- Returns a block of turfs encompassing the entire map, or on just
- one z-level
- z is in world coordinates; it is optional
- swapmap.Contains(turf/T)
- Returns nonzero if T is inside the map's boundaries.
- Also works for objs and mobs, but the proc is not area-safe.
- swapmap.InUse()
- Returns nonzero if a mob with a key is within the map's
- boundaries.
- swapmap.LoCorner(z=z1)
- Returns locate(x1,y1,z), where z=z1 if none is specified.
- swapmap.HiCorner(z=z2)
- Returns locate(x2,y2,z), where z=z2 if none is specified.
- swapmap.BuildFilledRectangle(turf/corner1,turf/corner2,item)
- Builds a filled rectangle of item from one corner turf to the
- other, on multiple z-levels if necessary. The corners may be
- specified in any order.
- item is a type path like /turf/wall or /obj/barrel{full=1}.
- swapmap.BuildRectangle(turf/corner1,turf/corner2,item)
- Builds an unfilled rectangle of item from one corner turf to
- the other, on multiple z-levels if necessary.
- swapmap.BuildInTurfs(list/turfs,item)
- Builds item on all of the turfs listed. The list need not
- contain only turfs, or even only atoms.
- */
-
-swapmap
- var/id // a string identifying this map uniquely
- var/x1 // minimum x,y,z coords
- var/y1
- var/z1
- var/x2 // maximum x,y,z coords (also used as width,height,depth until positioned)
- var/y2
- var/z2
- var/tmp/locked // don't move anyone to this map; it's saving or loading
- var/tmp/mode // save as text-mode
- var/ischunk // tells the load routine to load to the specified location
-
- New(_id,x,y,z)
- if(isnull(_id)) return
- id=_id
- mode=swapmaps_mode
- if(isturf(x) && isturf(y))
- /*
- Special format: Defines a map as an existing set of turfs;
- this is useful for saving a compiled map in swapmap format.
- Because this is a compiled-in map, its turfs are not deleted
- when the datum is deleted.
- */
- x1=min(x:x,y:x);x2=max(x:x,y:x)
- y1=min(x:y,y:y);y2=max(x:y,y:y)
- z1=min(x:z,y:z);z2=max(x:z,y:z)
- InitializeSwapMaps()
- if(z2>swapmaps_compiled_maxz ||\
- y2>swapmaps_compiled_maxy ||\
- x2>swapmaps_compiled_maxx)
- qdel(src)
- return
- x2=x?(x):world.maxx
- y2=y?(y):world.maxy
- z2=z?(z):1
- AllocateSwapMap()
-
- Destroy()
- // a temporary datum for a chunk can be deleted outright
- // for others, some cleanup is necessary
- if(!ischunk)
- swapmaps_loaded-=src
- swapmaps_byname-=id
- if(z2>swapmaps_compiled_maxz ||\
- y2>swapmaps_compiled_maxy ||\
- x2>swapmaps_compiled_maxx)
- var/list/areas=new
- for(var/atom/A in block(locate(x1,y1,z1),locate(x2,y2,z2)))
- for(var/obj/O in A) qdel(O)
- for(var/mob/M in A)
- if(!M.key) qdel(M)
- else M.loc=null
- areas[A.loc]=null
- qdel(A)
- // delete areas that belong only to this map
- for(var/area/a in areas)
- if(a && !a.contents.len) qdel(a)
- if(x2>=world.maxx || y2>=world.maxy || z2>=world.maxz) CutXYZ()
- qdel(areas)
- ..()
- return QDEL_HINT_HARDDEL_NOW
-
- /*
- Savefile format:
- map
- id
- x // size, not coords
- y
- z
- areas // list of areas, not including default
- [each z; 1 to depth]
- [each y; 1 to height]
- [each x; 1 to width]
- type // of turf
- AREA // if non-default; saved as a number (index into areas list)
- vars // all other changed vars
- */
- Write(savefile/S)
- var/x
- var/y
- var/z
- var/n
- var/list/areas
- var/area/defarea=locate(world.area)
- if(!defarea) defarea=new world.area
- areas=list()
- for(var/turf/T in block(locate(x1,y1,z1),locate(x2,y2,z2)))
- areas[T.loc]=null
- for(n in areas) // quickly eliminate associations for smaller storage
- areas-=n
- areas+=n
- areas-=defarea
- InitializeSwapMaps()
- locked=1
- S["id"] << id
- S["z"] << z2-z1+1
- S["y"] << y2-y1+1
- S["x"] << x2-x1+1
- S["areas"] << areas
- for(n in 1 to areas.len) areas[areas[n]]=n
- var/oldcd=S.cd
- for(z in z1 to z2)
- S.cd="[z-z1+1]"
- for(y in y1 to y2)
- S.cd="[y-y1+1]"
- for(x in x1 to x2)
- S.cd="[x-x1+1]"
- var/turf/T=locate(x,y,z)
- S["type"] << T.type
- if(T.loc!=defarea) S["AREA"] << areas[T.loc]
- T.Write(S)
- S.cd=".."
- S.cd=".."
- sleep()
- S.cd=oldcd
- locked=0
- qdel(areas)
-
- Read(savefile/S,_id,turf/locorner)
- var/x
- var/y
- var/z
- var/n
- var/list/areas
- var/area/defarea=locate(world.area)
- id=_id
- if(locorner)
- ischunk=1
- x1=locorner.x
- y1=locorner.y
- z1=locorner.z
- if(!defarea) defarea=new world.area
- if(!_id)
- S["id"] >> id
- else
- var/dummy
- S["id"] >> dummy
- S["z"] >> z2 // these are depth,
- S["y"] >> y2 // height,
- S["x"] >> x2 // width
- S["areas"] >> areas
- locked=1
- AllocateSwapMap() // adjust x1,y1,z1 - x2,y2,z2 coords
- var/oldcd=S.cd
- for(z in z1 to z2)
- S.cd="[z-z1+1]"
- for(y in y1 to y2)
- S.cd="[y-y1+1]"
- for(x in x1 to x2)
- S.cd="[x-x1+1]"
- var/tp
- S["type"]>>tp
- var/turf/T=locate(x,y,z)
- T.loc.contents-=T
- T=new tp(locate(x,y,z))
- if("AREA" in S.dir)
- S["AREA"]>>n
- var/area/A=areas[n]
- A.contents+=T
- else defarea.contents+=T
- // clear the turf
- for(var/obj/O in T) qdel(O)
- for(var/mob/M in T)
- if(!M.key) qdel(M)
- else M.loc=null
- // finish the read
- T.Read(S)
- S.cd=".."
- S.cd=".."
- sleep()
- S.cd=oldcd
- locked=0
- qdel(areas)
-
- /*
- Find an empty block on the world map in which to load this map.
- If no space is found, increase world.maxz as necessary. (If the
- map is greater in x,y size than the current world, expand
- world.maxx and world.maxy too.)
-
- Ignore certain operations if loading a map as a chunk. Use the
- x1,y1,z1 position for it, and *don't* count it as a loaded map.
- */
- proc/AllocateSwapMap()
- InitializeSwapMaps()
- world.maxx=max(x2,world.maxx) // stretch x/y if necessary
- world.maxy=max(y2,world.maxy)
- if(!ischunk)
- if(world.maxz<=swapmaps_compiled_maxz)
- z1=swapmaps_compiled_maxz+1
- x1=1;y1=1
- else
- var/list/l=ConsiderRegion(1,1,world.maxx,world.maxy,swapmaps_compiled_maxz+1)
- x1=l[1]
- y1=l[2]
- z1=l[3]
- qdel(l)
- x2+=x1-1
- y2+=y1-1
- z2+=z1-1
- space_manager.increase_max_zlevel_to(z2) // stretch z if necessary
- if(!ischunk)
- swapmaps_loaded[src]=null
- swapmaps_byname[id]=src
-
- proc/ConsiderRegion(X1,Y1,X2,Y2,Z1,Z2)
- while(1)
- var/nextz=0
- var/swapmap/M
- for(M in swapmaps_loaded)
- if(M.z2Z2) || M.z1>=Z1+z2 ||\
- M.x1>X2 || M.x2=X1+x2 ||\
- M.y1>Y2 || M.y2=Y1+y2) continue
- // look for sub-regions with a defined ceiling
- var/nz2=Z2?(Z2):Z1+z2-1+M.z2-M.z1
- if(M.x1>=X1+x2)
- .=ConsiderRegion(X1,Y1,M.x1-1,Y2,Z1,nz2)
- if(.) return
- else if(M.x2<=X2-x2)
- .=ConsiderRegion(M.x2+1,Y1,X2,Y2,Z1,nz2)
- if(.) return
- if(M.y1>=Y1+y2)
- .=ConsiderRegion(X1,Y1,X2,M.y1-1,Z1,nz2)
- if(.) return
- else if(M.y2<=Y2-y2)
- .=ConsiderRegion(X1,M.y2+1,X2,Y2,Z1,nz2)
- if(.) return
- nextz=nextz?min(nextz,M.z2+1):(M.z2+1)
- if(!M)
- /* If nextz is not 0, then at some point there was an overlap that
- could not be resolved by using an area to the side */
- if(nextz) Z1=nextz
- if(!nextz || (Z2 && Z2-Z1+1=z2)?list(X1,Y1,Z1):null
- X1=1;X2=world.maxx
- Y1=1;Y2=world.maxy
-
- proc/CutXYZ()
- var/mx=swapmaps_compiled_maxx
- var/my=swapmaps_compiled_maxy
- var/mz=swapmaps_compiled_maxz
- for(var/swapmap/M in swapmaps_loaded) // may not include src
- mx=max(mx,M.x2)
- my=max(my,M.y2)
- mz=max(mz,M.z2)
- world.maxx=mx
- world.maxy=my
- space_manager.cut_levels_downto(mz)
-
- // save and delete
- proc/Unload()
- Save()
- qdel(src)
-
- proc/Save()
- if(id==src) return 0
- var/savefile/S=mode?(new):new("map_[id].sav")
- S << src
- while(locked) sleep(1)
- if(mode)
- fdel("map_[id].txt")
- S.ExportText("/","map_[id].txt")
- return 1
-
- // this will not delete existing savefiles for this map
- proc/SetID(newid)
- swapmaps_byname-=id
- id=newid
- swapmaps_byname[id]=src
-
- proc/AllTurfs(z)
- if(isnum(z) && (zz2)) return null
- return block(LoCorner(z),HiCorner(z))
-
- // this could be safely called for an obj or mob as well, but
- // probably not an area
- proc/Contains(turf/T)
- return (T && T.x>=x1 && T.x<=x2\
- && T.y>=y1 && T.y<=y2\
- && T.z>=z1 && T.z<=z2)
-
- proc/InUse()
- for(var/turf/T in AllTurfs())
- for(var/mob/M in T) if(M.key) return 1
-
- proc/LoCorner(z=z1)
- return locate(x1,y1,z)
- proc/HiCorner(z=z2)
- return locate(x2,y2,z)
-
- /*
- Build procs: Take 2 turfs as corners, plus an item type.
- An item may be like:
-
- /turf/wall
- /obj/fence{icon_state="iron"}
- */
- proc/BuildFilledRectangle(turf/T1,turf/T2,item)
- if(!Contains(T1) || !Contains(T2)) return
- var/turf/T=T1
- // pick new corners in a block()-friendly form
- T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z))
- T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z))
- for(T in block(T1,T2)) new item(T)
-
- proc/BuildRectangle(turf/T1,turf/T2,item)
- if(!Contains(T1) || !Contains(T2)) return
- var/turf/T=T1
- // pick new corners in a block()-friendly form
- T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z))
- T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z))
- if(T2.x-T1.x<2 || T2.y-T1.y<2) BuildFilledRectangle(T1,T2,item)
- else
- //for(T in block(T1,T2)-block(locate(T1.x+1,T1.y+1,T1.z),locate(T2.x-1,T2.y-1,T2.z)))
- for(T in block(T1,locate(T2.x,T1.y,T2.z))) new item(T)
- for(T in block(locate(T1.x,T2.y,T1.z),T2)) new item(T)
- for(T in block(locate(T1.x,T1.y+1,T1.z),locate(T1.x,T2.y-1,T2.z))) new item(T)
- for(T in block(locate(T2.x,T1.y+1,T1.z),locate(T2.x,T2.y-1,T2.z))) new item(T)
-
- /*
- Supplementary build proc: Takes a list of turfs, plus an item
- type. Actually the list doesn't have to be just turfs.
- */
- proc/BuildInTurfs(list/turfs,item)
- for(var/T in turfs) new item(T)
-
-atom
- Write(savefile/S)
- for(var/V in vars-"x"-"y"-"z"-"contents"-"icon"-"overlays"-"underlays")
- if(issaved(vars[V]))
- if(vars[V]!=initial(vars[V])) S[V]<>ic
- if(istext(ic)) icon=swapmaps_iconcache[ic]
- if(l && contents!=l)
- contents+=l
- qdel(l)
-
-
-// set this up (at runtime) as follows:
-// list(\
-// 'player.dmi'="player",\
-// 'monster.dmi'="monster",\
-// ...
-// 'item.dmi'="item")
-var/list/swapmaps_iconcache
-
-// preferred mode; sav or text
-var/const/SWAPMAPS_SAV=0
-var/const/SWAPMAPS_TEXT=1
-var/swapmaps_mode=SWAPMAPS_SAV
-
-var/swapmaps_compiled_maxx
-var/swapmaps_compiled_maxy
-var/swapmaps_compiled_maxz
-var/swapmaps_initialized
-var/swapmaps_loaded
-var/swapmaps_byname
-
-proc/InitializeSwapMaps()
- if(swapmaps_initialized) return
- swapmaps_initialized=1
- swapmaps_compiled_maxx=world.maxx
- swapmaps_compiled_maxy=world.maxy
- swapmaps_compiled_maxz=world.maxz
- swapmaps_loaded=list()
- swapmaps_byname=list()
- if(swapmaps_iconcache)
- for(var/V in swapmaps_iconcache)
- // reverse-associate everything
- // so you can look up an icon file by name or vice-versa
- swapmaps_iconcache[swapmaps_iconcache[V]]=V
-
-proc/SwapMaps_AddIconToCache(name,icon)
- if(!swapmaps_iconcache) swapmaps_iconcache=list()
- swapmaps_iconcache[name]=icon
- swapmaps_iconcache[icon]=name
-
-proc/SwapMaps_Find(id)
- InitializeSwapMaps()
- return swapmaps_byname[id]
-
-proc/SwapMaps_Load(id)
- InitializeSwapMaps()
- var/swapmap/M=swapmaps_byname[id]
- if(!M)
- var/savefile/S
- var/text=0
- if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt"))
- text=1
- else if(fexists("map_[id].sav"))
- S=new("map_[id].sav")
- else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt"))
- text=1
- else return // no file found
- if(text)
- S=new
- S.ImportText("/",file("map_[id].txt"))
- S >> M
- while(M.locked) sleep(1)
- M.mode=text
- return M
-
-proc/SwapMaps_Save(id)
- InitializeSwapMaps()
- var/swapmap/M=swapmaps_byname[id]
- if(M) M.Save()
- return M
-
-proc/SwapMaps_Save_All()
- InitializeSwapMaps()
- for(var/swapmap/M in swapmaps_loaded)
- if(M) M.Save()
-
-proc/SwapMaps_Unload(id)
- InitializeSwapMaps()
- var/swapmap/M=swapmaps_byname[id]
- if(!M) return // return silently from an error
- M.Unload()
- return 1
-
-proc/SwapMaps_DeleteFile(id)
- fdel("map_[id].sav")
- fdel("map_[id].txt")
-
-proc/SwapMaps_CreateFromTemplate(template_id)
- var/swapmap/M=new
- var/savefile/S
- var/text=0
- if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[template_id].txt"))
- text=1
- else if(fexists("map_[template_id].sav"))
- S=new("map_[template_id].sav")
- else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt"))
- text=1
- else
- log_world("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.")
- return
- if(text)
- S=new
- S.ImportText("/",file("map_[template_id].txt"))
- /*
- This hacky workaround is needed because S >> M will create a brand new
- M to fill with data. There's no way to control the Read() process
- properly otherwise. The //.0 path should always match the map, however.
- */
- S.cd="//.0"
- M.Read(S,M)
- M.mode=text
- while(M.locked) sleep(1)
- return M
-
-proc/SwapMaps_LoadChunk(chunk_id,turf/locorner)
- var/swapmap/M=new
- var/savefile/S
- var/text=0
- if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[chunk_id].txt"))
- text=1
- else if(fexists("map_[chunk_id].sav"))
- S=new("map_[chunk_id].sav")
- else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt"))
- text=1
- else
- log_world("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.")
- return
- if(text)
- S=new
- S.ImportText("/",file("map_[chunk_id].txt"))
- /*
- This hacky workaround is needed because S >> M will create a brand new
- M to fill with data. There's no way to control the Read() process
- properly otherwise. The //.0 path should always match the map, however.
- */
- S.cd="//.0"
- M.Read(S,M,locorner)
- while(M.locked) sleep(1)
- qdel(M)
- return 1
-
-proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2)
- if(!corner1 || !corner2)
- log_world("SwapMaps error in SwapMaps_SaveChunk():")
- if(!corner1) log_world(" corner1 turf is null")
- if(!corner2) log_world(" corner2 turf is null")
- return
- var/swapmap/M=new
- M.id=chunk_id
- M.ischunk=1 // this is a chunk
- M.x1=min(corner1.x,corner2.x)
- M.y1=min(corner1.y,corner2.y)
- M.z1=min(corner1.z,corner2.z)
- M.x2=max(corner1.x,corner2.x)
- M.y2=max(corner1.y,corner2.y)
- M.z2=max(corner1.z,corner2.z)
- M.mode=swapmaps_mode
- M.Save()
- while(M.locked) sleep(1)
- qdel(M)
- return 1
-
-proc/SwapMaps_GetSize(id)
- var/savefile/S
- var/text=0
- if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt"))
- text=1
- else if(fexists("map_[id].sav"))
- S=new("map_[id].sav")
- else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt"))
- text=1
- else
- log_world("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.")
- return
- if(text)
- S=new
- S.ImportText("/",file("map_[id].txt"))
- /*
- The //.0 path should always be the map. There's no other way to
- read this data.
- */
- S.cd="//.0"
- var/x
- var/y
- var/z
- S["x"] >> x
- S["y"] >> y
- S["z"] >> z
- return list(x,y,z)
diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm
index 8b578fdd1f7..e74da2a6628 100644
--- a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm
+++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm
@@ -181,7 +181,7 @@
/obj/item/paper/terrorspiders9
name = "paper - 'Research Notes'"
- info = "The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them."
+ info = "The notes appear gibberish to you. Perhaps a destructive analyzer in R&D could make sense of them."
origin_tech = "combat=4;materials=4;engineering=4;biotech=4"
/obj/item/gun/energy/laser/awaymission_aeg
@@ -257,5 +257,3 @@
else
to_chat(user, "Your ID card already has all the access this machine can give.")
. = 1
-
-
diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm
index 468863f3026..c2d10d7c97d 100644
--- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm
+++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm
@@ -19,4 +19,9 @@
/area/awaymission/BMPship/Fore
name = "\improper Fore Block"
icon_state = "away3"
+ requires_power = 1
+
+/area/awaymission/BMPship/Gate
+ name = "\improper Gateway Block"
+ icon_state = "away4"
requires_power = 1
\ No newline at end of file
diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm
index 966ce6053f6..b0a092b7e7d 100644
--- a/code/modules/awaymissions/mission_code/challenge.dm
+++ b/code/modules/awaymissions/mission_code/challenge.dm
@@ -28,10 +28,10 @@
anchored = 1
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
idle_power_usage = 0
active_power_usage = 0
active = 1
locked = 1
- state = 2
\ No newline at end of file
+ state = 2
diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm
index 81d21df5dcf..00609b7a218 100644
--- a/code/modules/awaymissions/mission_code/spacehotel.dm
+++ b/code/modules/awaymissions/mission_code/spacehotel.dm
@@ -234,7 +234,7 @@
D.account = get_card_account(id, occupant)
if(!D.account)
return null
- if(!D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name))
+ if(!D.account.charge(100, null, "10 minutes hotel stay", "Biesel GalaxyNet Terminal [rand(111,1111)]", "[name]"))
return null
D.occupant = occupant
@@ -251,7 +251,7 @@
if(!D || !D.occupant)
return
- if(D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name))
+ if(D.account.charge(100, null, "10 minutes hotel stay extension", "Biesel GalaxyNet Terminal [rand(111,1111)]", "[name]"))
D.roomtimer = addtimer(CALLBACK(src, .proc/process_room, roomid), PAY_INTERVAL, TIMER_STOPPABLE)
else
force_checkout(roomid)
@@ -299,4 +299,4 @@
return
S.retal_target = target
- S.retal = 1
\ No newline at end of file
+ S.retal = 1
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index b26bdba7d92..9ebd1d88b6b 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -46,7 +46,7 @@
anchored = 1
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
var/chargesa = 1
var/insistinga = 0
@@ -72,7 +72,7 @@
else
chargesa--
insistinga = 0
- var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","To Kill","Peace")
+ var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","Peace")
switch(wish)
if("Power")
to_chat(user, "Your wish is granted, but at a terrible cost...")
@@ -115,28 +115,6 @@
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
human.set_species(/datum/species/shadow)
user.regenerate_icons()
- if("To Kill")
- to_chat(user, "Your wish is granted, but at a terrible cost...")
- to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.")
- ticker.mode.traitors += user.mind
- user.mind.special_role = SPECIAL_ROLE_TRAITOR
- var/datum/objective/hijack/hijack = new
- hijack.owner = user.mind
- user.mind.objectives += hijack
- to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!")
- var/obj_count = 1
- for(var/datum/objective/OBJ in user.mind.objectives)
- to_chat(user, "Objective #[obj_count]: [OBJ.explanation_text]")
- obj_count++
- if(ishuman(user))
- var/mob/living/carbon/human/human = user
- if(!isshadowperson(human))
- to_chat(user, "Your flesh rapidly mutates!")
- to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
- to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
- to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species(/datum/species/shadow)
- user.regenerate_icons()
if("Peace")
to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.")
to_chat(user, "You feel as if you just narrowly avoided a terrible fate...")
@@ -288,4 +266,4 @@
say("How could you betray the Syndicate?")
for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list)
W.on_alert = TRUE
- ..(gibbed)
\ No newline at end of file
+ ..(gibbed)
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index c7f8504f13e..0fe05e8ff92 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -200,6 +200,7 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
"large_stamp-law.png" = 'icons/paper_icons/large_stamp-law.png',
"large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png',
"large_stamp-syndicate.png" = 'icons/paper_icons/large_stamp-syndicate.png',
+ "large_stamp-rep.png" = 'icons/paper_icons/large_stamp-rep.png',
"talisman.png" = 'icons/paper_icons/talisman.png',
"ntlogo.png" = 'icons/paper_icons/ntlogo.png'
)
@@ -348,4 +349,4 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
register_asset(asset_name, assets[asset_name])
/datum/asset/mob_hunt/send(client)
- send_asset_list(client, assets, verify)
\ No newline at end of file
+ send_asset_list(client, assets, verify)
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 838670221ad..99f7fa69746 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -109,136 +109,42 @@
if("shop")
if(href_list["KarmaBuy"])
var/karma=verify_karma()
+ if(isnull(karma)) //Doesn't display anything if karma database is down.
+ return
switch(href_list["KarmaBuy"])
if("1")
- if(karma <5)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Barber?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_job_unlock("Barber",5)
- return
+ karma_purchase(karma,5,"job","Barber")
if("2")
- if(karma <5)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Brig Physician?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_job_unlock("Brig Physician",5)
- return
+ karma_purchase(karma,5,"job","Brig Physician")
if("3")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Nanotrasen Representative?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_job_unlock("Nanotrasen Representative",30)
- return
+ karma_purchase(karma,30,"job","Nanotrasen Representative")
if("5")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Blueshield?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_job_unlock("Blueshield",30)
- return
+ karma_purchase(karma,30,"job","Blueshield")
if("6")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Mechanic?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_job_unlock("Mechanic",30)
- return
+ karma_purchase(karma,30,"job","Mechanic")
if("7")
- if(karma <45)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Magistrate?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_job_unlock("Magistrate",45)
- return
+ karma_purchase(karma,45,"job","Magistrate")
if("9")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Security Pod Pilot?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_job_unlock("Security Pod Pilot",30)
- return
+ karma_purchase(karma,30,"job","Security Pod Pilot")
if(href_list["KarmaBuy2"])
var/karma=verify_karma()
+ if(isnull(karma)) //Doesn't display anything if karma database is down.
+ return
switch(href_list["KarmaBuy2"])
if("1")
- if(karma <15)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Machine People?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_species_unlock("Machine",15)
- return
+ karma_purchase(karma,15,"species","Machine People","Machine")
if("2")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Kidan?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_species_unlock("Kidan",30)
- return
+ karma_purchase(karma,30,"species","Kidan")
if("3")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Grey?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_species_unlock("Grey",30)
- return
+ karma_purchase(karma,30,"species","Grey")
if("4")
- if(karma <45)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Vox?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_species_unlock("Vox",45)
- return
+ karma_purchase(karma,45,"species","Vox")
if("5")
- if(karma <45)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Slime People?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_species_unlock("Slime People",45)
- return
+ karma_purchase(karma,45,"species","Slime People")
if("6")
- if(karma <100)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Plasmaman?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_species_unlock("Plasmaman",100)
- return
+ karma_purchase(karma,100,"species","Plasmaman")
if("7")
- if(karma <30)
- to_chat(usr, "You do not have enough karma!")
- return
- else
- if(alert("Are you sure you want to unlock Drask?", "Confirmation", "No", "Yes") != "Yes")
- return
- DB_species_unlock("Drask",30)
- return
+ karma_purchase(karma,30,"species","Drask")
if(href_list["KarmaRefund"])
var/type = href_list["KarmaRefundType"]
var/job = href_list["KarmaRefund"]
diff --git a/code/modules/client/preference/loadout/loadout_cosmetics.dm b/code/modules/client/preference/loadout/loadout_cosmetics.dm
index c9b82a0259b..aa7f5f02576 100644
--- a/code/modules/client/preference/loadout/loadout_cosmetics.dm
+++ b/code/modules/client/preference/loadout/loadout_cosmetics.dm
@@ -1,7 +1,11 @@
/datum/gear/lipstick
+ display_name = "lipstick, red"
+ path = /obj/item/lipstick
+ sort_category = "Cosmetics"
+
+/datum/gear/lipstick/black
display_name = "lipstick, black"
path = /obj/item/lipstick/black
- sort_category = "Cosmetics"
/datum/gear/lipstick/jade
display_name = "lipstick, jade"
@@ -11,9 +15,13 @@
display_name = "lipstick, purple"
path = /obj/item/lipstick/purple
-/datum/gear/lipstick/red
- display_name = "lipstick, red"
- path = /obj/item/lipstick
+/datum/gear/lipstick/blue
+ display_name = "lipstick, blue"
+ path = /obj/item/lipstick/blue
+
+/datum/gear/lipstick/lime
+ display_name = "lipstick, lime"
+ path = /obj/item/lipstick/lime
/datum/gear/monocle
display_name = "monocle"
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index a5b4e614551..50872791f59 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -561,6 +561,7 @@ BLIND // can't see anything
strip_delay = 80
put_on_delay = 80
burn_state = FIRE_PROOF
+ hide_tail_by_species = null
species_restricted = list("exclude","Diona","Vox","Wryn")
//Under clothing
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 4936256484e..3c0d57dfff9 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -202,7 +202,27 @@
var/aggressiveness = 1
var/safety = 1
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)
-
+ var/phrase_list = list(
+
+ "halt" = "HALT! HALT! HALT! HALT!",
+ "bobby" = "Stop in the name of the Law.",
+ "compliance" = "Compliance is in your best ineterest.",
+ "justice" = "Prepare for justice!",
+ "running" = "Running will only increase your sentence",
+ "dontmove" = "Don't move, Creep!",
+ "floor" = "Down on the floor, Creep!",
+ "robocop" = "Dead or alive you're coming with me.",
+ "god" = "God made today for the crooks we could not catch yesterday.",
+ "freeze" = "Freeze, Scum Bag!",
+ "imperial" = "Stop right there, criminal scum!",
+ "bash" = "Stop or I'll bash you.",
+ "harry" = "Go ahead, make my day",
+ "asshole" = "Stop breaking the law, asshole.",
+ "stfu" = "You have the right to shut the fuck up",
+ "shutup" = "Shut up crime!",
+ "super" = "Face the wrath of the golden bolt.",
+ "dredd" = "I am, the LAW!"
+ )
/obj/item/clothing/mask/gas/sechailer/hos
name = "\improper HOS SWAT mask"
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe."
@@ -250,133 +270,34 @@
else if(actiontype == /datum/action/item_action/adjust)
adjustmask(user)
else if(actiontype == /datum/action/item_action/selectphrase)
+ var/key = phrase_list[phrase]
+ var/message = phrase_list[key]
+
+ if (!safety)
+ to_chat(user, "You set the restrictor to: FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT.")
+ return
+
switch(aggressiveness)
if(1)
- switch(phrase)
- if(1)
- to_chat(user, "You set the restrictor to: Stop in the name of the Law.")
- phrase = 2
- if(2)
- to_chat(user, "You set the restrictor to: Compliance is in your best interest.")
- phrase = 3
- if(3)
- to_chat(user, "You set the restrictor to: Prepare for justice.")
- phrase = 4
- if(4)
- to_chat(user, "You set the restrictor to: Running will only increase your sentence.")
- phrase = 5
- if(5)
- to_chat(user, "You set the restrictor to: Don't move, Creep!")
- phrase = 6
- if(6)
- to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!")
- phrase = 1
- else
- to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!")
- phrase = 1
+ phrase = (phrase < 6) ? (phrase + 1) : 1
+ key = phrase_list[phrase]
+ message = phrase_list[key]
+ to_chat(user,"You set the restrictor to: [message]")
if(2)
- switch(phrase)
- if(7)
- to_chat(user, "You set the restrictor to: Dead or alive you're coming with me.")
- phrase = 8
- if(8)
- to_chat(user, "You set the restrictor to: God made today for the crooks we could not catch yesterday.")
- phrase = 9
- if(9)
- to_chat(user, "You set the restrictor to: Freeze, Scum Bag!")
- phrase = 10
- if(10)
- to_chat(user, "You set the restrictor to: Stop right there, criminal scum!")
- phrase = 11
- if(11)
- to_chat(user, "You set the restrictor to: Down on the floor, Creep!")
- phrase = 7
- else
- to_chat(user, "You set the restrictor to: Down on the floor, Creep!")
- phrase = 7
+ phrase = (phrase < 11 && phrase >= 7) ? (phrase + 1) : 7
+ key = phrase_list[phrase]
+ message = phrase_list[key]
+ to_chat(user,"You set the restrictor to: [message]")
if(3)
- switch(phrase)
- if(12)
- to_chat(user, "You set the restrictor to: Go ahead, make my day.")
- phrase = 13
- if(13)
- to_chat(user, "You set the restrictor to: Stop breaking the law, ass hole.")
- phrase = 14
- if(14)
- to_chat(user, "You set the restrictor to: You have the right to shut the fuck up.")
- phrase = 15
- if(15)
- to_chat(user, "You set the restrictor to: Shut up crime!")
- phrase = 16
- if(16)
- to_chat(user, "You set the restrictor to: Face the wrath of the golden bolt.")
- phrase = 17
- if(17)
- to_chat(user, "You set the restrictor to: I am, the LAW!")
- phrase = 18
- if(18)
- to_chat(user, "You set the restrictor to: Stop or I'll bash you.")
- phrase = 12
- else
- to_chat(user, "You set the restrictor to: Go ahead, make my day.")
- phrase = 13
-
+ phrase = (phrase < 18 && phrase >= 12 ) ? (phrase + 1) : 12
+ key = phrase_list[phrase]
+ message = phrase_list[key]
+ to_chat(user,"You set the restrictor to: [message]")
if(4)
- switch(phrase)
- if(1)
- to_chat(user, "You set the restrictor to: Stop in the name of the Law.")
- phrase = 2
- if(2)
- to_chat(user, "You set the restrictor to: Compliance is in your best interest.")
- phrase = 3
- if(3)
- to_chat(user, "You set the restrictor to: Prepare for justice.")
- phrase = 4
- if(4)
- to_chat(user, "You set the restrictor to: Running will only increase your sentence.")
- phrase = 5
- if(5)
- to_chat(user, "You set the restrictor to: Don't move, Creep!")
- phrase = 6
- if(6)
- to_chat(user, "You set the restrictor to: Down on the floor, Creep!")
- phrase = 7
- if(7)
- to_chat(user, "You set the restrictor to: Dead or alive you're coming with me.")
- phrase = 8
- if(8)
- to_chat(user, "You set the restrictor to: God made today for the crooks we could not catch yesterday.")
- phrase = 9
- if(9)
- to_chat(user, "You set the restrictor to: Freeze, Scum Bag!")
- phrase = 10
- if(10)
- to_chat(user, "You set the restrictor to: Stop right there, criminal scum!")
- phrase = 11
- if(11)
- to_chat(user, "You set the restrictor to: Stop or I'll bash you.")
- phrase = 12
- if(12)
- to_chat(user, "You set the restrictor to: Go ahead, make my day.")
- phrase = 13
- if(13)
- to_chat(user, "You set the restrictor to: Stop breaking the law, ass hole.")
- phrase = 14
- if(14)
- to_chat(user, "You set the restrictor to: You have the right to shut the fuck up.")
- phrase = 15
- if(15)
- to_chat(user, "You set the restrictor to: Shut up crime!")
- phrase = 16
- if(16)
- to_chat(user, "You set the restrictor to: Face the wrath of the golden bolt.")
- phrase = 17
- if(17)
- to_chat(user, "You set the restrictor to: I am, the LAW!")
- phrase = 18
- if(18)
- to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!")
- phrase = 1
+ phrase = (phrase < 18 && phrase >= 1 ) ? (phrase + 1) : 1
+ key = phrase_list[phrase]
+ message = phrase_list[key]
+ to_chat(user,"You set the restrictor to: [message]")
else
to_chat(user, "It's broken.")
@@ -419,77 +340,20 @@
return
/obj/item/clothing/mask/gas/sechailer/proc/halt()
- var/phrase_text = null
- var/phrase_sound = null
+ var/key = phrase_list[phrase]
+ var/message = phrase_list[key]
if(cooldown < world.time - 35) // A cooldown, to stop people being jerks
if(!safety)
- phrase_text = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT."
- usr.visible_message("[usr]'s Compli-o-Nator: [phrase_text]")
+ message = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT."
+ usr.visible_message("[usr]'s Compli-o-Nator: [message]")
playsound(src.loc, 'sound/voice/binsult.ogg', 100, 0, 4)
cooldown = world.time
return
-
- switch(phrase) //sets the properties of the chosen phrase
- if(1) // good cop
- phrase_text = "HALT! HALT! HALT! HALT!"
- phrase_sound = "halt"
- if(2)
- phrase_text = "Stop in the name of the Law."
- phrase_sound = "bobby"
- if(3)
- phrase_text = "Compliance is in your best interest."
- phrase_sound = "compliance"
- if(4)
- phrase_text = "Prepare for justice!"
- phrase_sound = "justice"
- if(5)
- phrase_text = "Running will only increase your sentence."
- phrase_sound = "running"
- if(6) // bad cop
- phrase_text = "Don't move, Creep!"
- phrase_sound = "dontmove"
- if(7)
- phrase_text = "Down on the floor, Creep!"
- phrase_sound = "floor"
- if(8)
- phrase_text = "Dead or alive you're coming with me."
- phrase_sound = "robocop"
- if(9)
- phrase_text = "God made today for the crooks we could not catch yesterday."
- phrase_sound = "god"
- if(10)
- phrase_text = "Freeze, Scum Bag!"
- phrase_sound = "freeze"
- if(11)
- phrase_text = "Stop right there, criminal scum!"
- phrase_sound = "imperial"
- if(12) // LA-PD
- phrase_text = "Stop or I'll bash you."
- phrase_sound = "bash"
- if(13)
- phrase_text = "Go ahead, make my day."
- phrase_sound = "harry"
- if(14)
- phrase_text = "Stop breaking the law, ass hole."
- phrase_sound = "asshole"
- if(15)
- phrase_text = "You have the right to shut the fuck up."
- phrase_sound = "stfu"
- if(16)
- phrase_text = "Shut up crime!"
- phrase_sound = "shutup"
- if(17)
- phrase_text = "Face the wrath of the golden bolt."
- phrase_sound = "super"
- if(18)
- phrase_text = "I am, the LAW!"
- phrase_sound = "dredd"
-
- usr.visible_message("[usr]'s Compli-o-Nator: [phrase_text]")
- playsound(src.loc, "sound/voice/complionator/[phrase_sound].ogg", 100, 0, 4)
+ usr.visible_message("[usr]'s Compli-o-Nator: [message]")
+ playsound(src.loc, "sound/voice/complionator/[key].ogg", 100, 0, 4)
cooldown = world.time
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 22f293aedfc..fba251f71f8 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -120,6 +120,78 @@
mute = MUZZLE_MUTE_NONE
security_lock = TRUE
locked = FALSE
+ materials = list(MAT_METAL=500, MAT_GLASS=50)
+
+/obj/item/clothing/mask/muzzle/safety/shock
+ name = "shock muzzle"
+ desc = "A muzzle designed to prevent biting. This one is fitted with a behavior correction system."
+ var/obj/item/assembly/trigger = null
+ origin_tech = "materials=1;engineering=1"
+ materials = list(MAT_METAL=500, MAT_GLASS=50)
+
+/obj/item/clothing/mask/muzzle/safety/shock/attackby(obj/item/W, mob/user, params)
+ if(isscrewdriver(W) && trigger)
+ to_chat(user, "You disassemble [src].")
+ trigger.forceMove(get_turf(user))
+ trigger.master = null
+ trigger.holder = null
+ trigger = null
+ return TRUE
+ else if(istype(W, /obj/item/assembly/signaler) || istype(W, /obj/item/assembly/voice))
+ if(istype(trigger, /obj/item/assembly/signaler) || istype(trigger, /obj/item/assembly/voice))
+ to_chat(user, "Something is already attached to [src].")
+ return FALSE
+ if(!user.drop_item())
+ to_chat(user, "You are unable to insert [W] into [src].")
+ return FALSE
+ trigger = W
+ trigger.forceMove(src)
+ trigger.master = src
+ trigger.holder = src
+ to_chat(user, "You attach the [W] to [src].")
+ return TRUE
+ else if(istype(W, /obj/item/assembly))
+ to_chat(user, "That won't fit in [src]. Perhaps a signaler or voice analyzer would?")
+ return FALSE
+
+ return ..()
+
+
+/obj/item/clothing/mask/muzzle/safety/shock/proc/can_shock(obj/item/clothing/C)
+ if(istype(C))
+ if(isliving(C.loc))
+ return C.loc
+ else if(isliving(loc))
+ return loc
+ return FALSE
+
+/obj/item/clothing/mask/muzzle/safety/shock/proc/process_activation(var/obj/D, var/normal = 1, var/special = 1)
+ visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
+ var/mob/M = can_shock(loc)
+ if(M)
+ to_chat(M, "You feel a sharp shock!")
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(3, 1, M)
+ s.start()
+
+ M.Weaken(5)
+ M.Stuttering(1)
+ M.Jitter(20)
+ return
+
+/obj/item/clothing/mask/muzzle/safety/shock/HasProximity(atom/movable/AM as mob|obj)
+ if(trigger)
+ trigger.HasProximity(AM)
+
+
+/obj/item/clothing/mask/muzzle/safety/shock/hear_talk(mob/living/M as mob, msg)
+ if(trigger)
+ trigger.hear_talk(M, msg)
+
+/obj/item/clothing/mask/muzzle/safety/shock/hear_message(mob/living/M as mob, msg)
+ if(trigger)
+ trigger.hear_message(M, msg)
+
/obj/item/clothing/mask/surgical
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 91884eeba2d..2597b3cdde7 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -40,7 +40,7 @@
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/t_scanner, /obj/item/rcd, /obj/item/crowbar, \
/obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/multitool, \
/obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \
- /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun)
+ /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun, /obj/item/gun/projectile/automatic/lasercarbine, /obj/item/gun/energy/gun/blueshield)
strip_delay = 130
species_fit = list("Drask", "Vox")
sprite_sheets = list(
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 75614d56312..2ba550d8a81 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -70,6 +70,7 @@
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd)
siemens_coefficient = 0
+ hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran")
species_restricted = list("exclude","Diona","Wryn")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
@@ -313,7 +314,7 @@
on = 1
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
- visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE
+ visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDETAIL
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[item_color]"
@@ -379,7 +380,7 @@
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
slowdown = 1
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
else
to_chat(user, "You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.")
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 1e874772478..532522747ed 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -110,7 +110,7 @@
slowdown = 0
flags = STOPSPRESSUREDMAGE
flags_size = ONESIZEFITSALL
- allowed = list(/obj/item) //for stuffing exta special presents
+ allowed = list(/obj/item) //for stuffing extra special presents
//Space pirate outfit
/obj/item/clothing/head/helmet/space/pirate
@@ -139,13 +139,20 @@
//Paramedic EVA suit
/obj/item/clothing/head/helmet/space/eva/paramedic
name = "Paramedic EVA helmet"
- desc = "A paramedic EVA helmet. Used in the recovery of bodies from space."
+ desc = "A brand new paramedic EVA helmet. It seems to mold to your head shape. Used for retrieving bodies in space."
icon_state = "paramedic-eva-helmet"
item_state = "paramedic-eva-helmet"
- species_fit = list("Vox", "Grey")
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
+ species_restricted = list("exclude", "Diona", "Wryn")
+ species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
- "Grey" = 'icons/mob/species/grey/helmet.dmi'
+ "Grey" = 'icons/mob/species/grey/helmet.dmi',
+ "Skrell" = 'icons/mob/species/skrell/helmet.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
+ "Drask" = 'icons/mob/species/drask/helmet.dmi',
+ "Unathi" = 'icons/mob/species/unathi/helmet.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
)
sprite_sheets_obj = list(
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi'
@@ -155,10 +162,18 @@
name = "Paramedic EVA suit"
icon_state = "paramedic-eva"
item_state = "paramedic-eva"
- desc = "A paramedic EVA suit. Used in the recovery of bodies from space."
- species_fit = list("Vox")
+ desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space."
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
+ species_restricted = list("exclude", "Diona", "Wryn")
+ species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Grey" = 'icons/mob/species/grey/suit.dmi',
+ "Skrell" = 'icons/mob/species/skrell/suit.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
+ "Drask" = 'icons/mob/species/drask/suit.dmi',
+ "Unathi" = 'icons/mob/species/unathi/suit.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi',
)
sprite_sheets_obj = list(
"Vox" = 'icons/obj/clothing/species/vox/suits.dmi'
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 764ee71583a..a243e734ef6 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -243,7 +243,6 @@
/obj/item/clothing/accessory/holobadge/cord
icon_state = "holobadge-cord"
item_color = "holobadge-cord"
- slot_flags = SLOT_MASK | SLOT_TIE
/obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob)
if(!stored_name)
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index b509f5df1b5..1a1d5d1a98b 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -44,7 +44,7 @@
return
if(!user.canUnEquip(W, 0))
- to_chat(user, "You can't let go of the [W]!")
+ to_chat(user, "You can't let go of the [W]!")
return
holstered = W
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 95ae68dcd26..f371ae3997b 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -103,7 +103,7 @@
item_color = "centcom"
/obj/item/clothing/under/rank/centcom/officer
- desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shounder."
+ desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder."
name = "\improper Nanotrasen Officers Uniform"
icon_state = "officer"
item_state = "g_suit"
@@ -112,7 +112,7 @@
flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/centcom/captain
- desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shounder."
+ desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder."
name = "\improper Nanotrasen Captains Uniform"
icon_state = "centcom"
item_state = "dg_suit"
@@ -120,7 +120,7 @@
displays_id = 0
/obj/item/clothing/under/rank/centcom/blueshield
- desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears \"N.S.S. Cyberiad\" on the left shounder."
+ desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears \"N.S.S. Cyberiad\" on the left shoulder."
name = "\improper Nanotrasen Navy Uniform"
icon_state = "officer"
item_state = "g_suit"
@@ -128,8 +128,12 @@
displays_id = 0
flags_size = ONESIZEFITSALL
+/obj/item/clothing/under/rank/centcom/blueshield/New()
+ ..()
+ desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears [station_name()] on the left shoulder."
+
/obj/item/clothing/under/rank/centcom/representative
- desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shounder."
+ desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shoulder."
name = "\improper Nanotrasen Navy Uniform"
icon_state = "officer"
item_state = "g_suit"
@@ -137,6 +141,10 @@
displays_id = 0
flags_size = ONESIZEFITSALL
+/obj/item/clothing/under/rank/centcom/representative/New()
+ ..()
+ desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears [station_name()] on the left shoulder."
+
/obj/item/clothing/under/rank/centcom/diplomatic
desc = "A very gaudy and official looking uniform of the Nanotrasen Diplomatic Corps."
name = "\improper Nanotrasen Diplomatic Uniform"
@@ -831,4 +839,4 @@
icon_state = "medicalgown"
item_state = "medicalgown"
item_color = "medicalgown"
- body_parts_covered = UPPER_TORSO|LOWER_TORSO
\ No newline at end of file
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 9dad4d2374b..eb616151422 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -563,6 +563,61 @@
else
to_chat(user, "You can't modify [target]!")
+#define USED_MOD_HELM 1
+#define USED_MOD_SUIT 2
+
+/obj/item/fluff/pyro_wintersec_kit //DarkLordpyro: Valthorne Haliber
+ name = "winter sec conversion kit"
+ desc = "A securirty hardsuit conversion kit."
+ icon_state = "modkit"
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/fluff/pyro_wintersec_kit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.incapacitated())
+ return
+ var/mob/living/carbon/human/H = user
+
+ if(istype(target, /obj/item/clothing/head/helmet/space/hardsuit/security))
+ if(used & USED_MOD_HELM)
+ to_chat(H, "The kit's helmet modifier has already been used.")
+ return
+ to_chat(H, "You modify the appearance of [target].")
+ used |= USED_MOD_HELM
+
+ var/obj/item/clothing/head/helmet/space/hardsuit/security/P = target
+ P.name = "winterised security hardsuit helmet"
+ P.desc = "A rare winterised variant of the security hardsuit helmet, used on colder mining worlds for security patrols."
+ P.icon = 'icons/obj/custom_items.dmi'
+ P.icon_state = "hardsuit0-secf"
+ P.item_state = "hardsuit0-secf"
+ P.sprite_sheets = null
+ P.item_color = "secf"
+ user.update_icons()
+
+ if(P == H.head)
+ H.update_inv_head()
+ return
+ if(istype(target, /obj/item/clothing/suit/space/hardsuit/security))
+ if(used & USED_MOD_SUIT)
+ to_chat(user, "The kit's suit modifier has already been used.")
+ return
+ to_chat(H, "You modify the appearance of [target].")
+ used |= USED_MOD_SUIT
+
+ var/obj/item/clothing/suit/space/hardsuit/security/P = target
+ P.name = "winterised security hardsuit"
+ P.desc = "A rare winterised variant of the security hardsuit, used on colder mining worlds for securiry patrols, this one has 'Haliber' written on an ID patch located on the right side of the chest."
+ P.icon = 'icons/obj/custom_items.dmi'
+ P.icon_state = "hardsuit-secf"
+ P.item_state = "hardsuit-secf"
+ P.sprite_sheets = null
+ user.update_icons()
+
+ if(P == H.wear_suit)
+ H.update_inv_wear_suit()
+ return
+ to_chat(user, "You can't modify [target]!")
+
//////////////////////////////////
//////////// Clothing ////////////
//////////////////////////////////
@@ -945,6 +1000,14 @@
flags_inv = HIDEEARS
//////////// Uniforms ////////////
+/obj/item/clothing/under/fluff/benjaminfallout // Benjaminfallout: Pretzel Brassheart
+ icon = 'icons/obj/custom_items.dmi'
+ name = "Pretzel's dress"
+ desc = "A nice looking dress"
+ icon_state = "fallout_dress"
+ item_state = "fallout_dress"
+ item_color = "fallout_dress"
+
/obj/item/clothing/under/fluff/soviet_casual_uniform // Norstead : Natalya Sokolova
icon = 'icons/obj/custom_items.dmi'
name = "Soviet Casual Uniform"
@@ -1043,6 +1106,15 @@
item_color = "aegisuniform"
displays_id = 0
+/obj/item/clothing/under/fluff/elo_turtleneck // vforcebomber: E.L.O.
+ name = "E.L.O's Turtleneck"
+ desc = "This TurtleNeck belongs to the IPC E.L.O. And has her name sown into the upper left breast, a very wooly jumper."
+ icon = 'icons/obj/custom_items.dmi' // for the floor sprite
+ icon_override = 'icons/obj/custom_items.dmi' // for the mob sprite
+ icon_state = "eloturtleneckfloor"
+ item_color = "eloturtleneck"
+ displays_id = FALSE
+
//////////// Masks ////////////
/obj/item/clothing/mask/bandana/fluff/dar //sasanek12: Dar'Konr
@@ -1228,6 +1300,13 @@
species_fit = null
sprite_sheets = null
+/obj/item/storage/backpack/fluff/syndiesatchel //SkeletalElite: Rawkkihiki
+ name= "Military Satchel"
+ desc = "A well made satchel for military operations. Totally not made by an enemy corporation"
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "rawk_satchel"
+ sprite_sheets = null
+
/obj/item/storage/backpack/fluff/krich_back //lizardzsi: Krichahka
name = "Voxcaster"
desc = "Battered, Sol-made military radio backpack that had its speakers fried from playing Vox opera. The words 'Swift-Talon' are crudely scratched onto its side."
@@ -1396,3 +1475,12 @@
item_state = "panzermedal"
item_color = "panzermedal"
slot_flags = SLOT_TIE
+
+/obj/item/clothing/accessory/medal/fluff/XannZxiax //Sagrotter: Xann Zxiax
+ name = "Zxiax Garnet"
+ desc = "Green Garnet on fancy blue cord, when you look at the Garnet, you feel strangely appeased."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "Xann_necklace"
+ item_state = "Xann_necklace"
+ item_color = "Xann_necklace"
+ slot_flags = SLOT_TIE
diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm
index c293e6348c1..64318877847 100644
--- a/code/modules/detective_work/scanner.dm
+++ b/code/modules/detective_work/scanner.dm
@@ -80,7 +80,7 @@
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(P)
- to_chat(M, "Report printed. Log cleared.")
+ to_chat(M, "Report printed. Log cleared.")
// Clear the logs
log = list()
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 6306fa5a83e..e43797ef9dd 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -19,7 +19,7 @@ log transactions
icon = 'icons/obj/terminals.dmi'
icon_state = "atm"
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 10
var/obj/machinery/computer/account_database/linked_db
var/datum/money_account/authenticated_account
@@ -97,18 +97,9 @@ log transactions
if(!powered())
return
var/obj/item/stack/spacecash/C = I
- authenticated_account.money += C.amount
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
- //create a transaction log entry
- var/datum/transaction/T = new()
- T.target_name = authenticated_account.owner_name
- T.purpose = "Credit deposit"
- T.amount = C.amount
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = station_time_timestamp()
- authenticated_account.transaction_log.Add(T)
+ authenticated_account.credit(C.amount, "Credit deposit", machine_id, authenticated_account.owner_name)
to_chat(user, "You insert [C] into [src].")
SSnanoui.update_uis(src)
@@ -175,19 +166,8 @@ log transactions
else if(transfer_amount <= authenticated_account.money)
var/target_account_number = text2num(href_list["target_acc_number"])
var/transfer_purpose = href_list["purpose"]
- if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount))
+ if(linked_db.charge_to_account(target_account_number, authenticated_account, transfer_purpose, machine_id, transfer_amount))
to_chat(usr, "[bicon(src)]Funds transfer successful.")
- authenticated_account.money -= transfer_amount
-
- //create an entry in the account transaction log
- var/datum/transaction/T = new()
- T.target_name = "Account #[target_account_number]"
- T.purpose = transfer_purpose
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = station_time_timestamp()
- T.amount = "([transfer_amount])"
- authenticated_account.transaction_log.Add(T)
else
to_chat(usr, "[bicon(src)]Funds transfer failed.")
@@ -263,15 +243,7 @@ log transactions
authenticated_account.money -= amount
withdraw_arbitrary_sum(amount)
- //create an entry in the account transaction log
- var/datum/transaction/T = new()
- T.target_name = authenticated_account.owner_name
- T.purpose = "Credit withdrawal"
- T.amount = "([amount])"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = station_time_timestamp()
- authenticated_account.transaction_log.Add(T)
+ authenticated_account.charge(amount, null, "Credit withdrawal", machine_id, authenticated_account.owner_name)
else
to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
if("balance_statement")
diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm
index 23b51fd2aea..f1f283fe56a 100644
--- a/code/modules/economy/Accounts.dm
+++ b/code/modules/economy/Accounts.dm
@@ -1,4 +1,9 @@
-var/global/current_date_string
+#define STATION_CREATION_DATE "2 April, 2555"
+#define STATION_CREATION_TIME "11:24:30"
+#define STATION_START_CASH 75000
+#define STATION_SOURCE_TERMINAL "Biesel GalaxyNet Terminal #227"
+#define DEPARTMENT_START_CASH 5000
+
var/global/num_financial_terminals = 1
var/global/datum/money_account/station_account
var/global/list/datum/money_account/department_accounts = list()
@@ -15,19 +20,13 @@ var/global/list/all_money_accounts = list()
station_account.owner_name = "[station_name()] Station Account"
station_account.account_number = rand(111111, 999999)
station_account.remote_access_pin = rand(1111, 111111)
- station_account.money = 75000
+ station_account.money = STATION_START_CASH
//create an entry in the account transaction log for when it was created
- var/datum/transaction/T = new()
- T.target_name = station_account.owner_name
- T.purpose = "Account creation"
- T.amount = 75000
- T.date = "2nd April, 2555"
- T.time = "11:24"
- T.source_terminal = "Biesel GalaxyNet Terminal #277"
+ station_account.makeTransactionLog(STATION_START_CASH, "Account Creation", STATION_SOURCE_TERMINAL, station_account.owner_name, FALSE,
+ STATION_CREATION_DATE, STATION_CREATION_TIME)
//add the account
- station_account.transaction_log.Add(T)
all_money_accounts.Add(station_account)
/proc/create_department_account(department)
@@ -37,19 +36,13 @@ var/global/list/all_money_accounts = list()
department_account.owner_name = "[department] Account"
department_account.account_number = rand(111111, 999999)
department_account.remote_access_pin = rand(1111, 111111)
- department_account.money = 5000
+ department_account.money = DEPARTMENT_START_CASH
//create an entry in the account transaction log for when it was created
- var/datum/transaction/T = new()
- T.target_name = department_account.owner_name
- T.purpose = "Account creation"
- T.amount = department_account.money
- T.date = "2nd April, 2555"
- T.time = "11:24"
- T.source_terminal = "Biesel GalaxyNet Terminal #277"
+ department_account.makeTransactionLog(DEPARTMENT_START_CASH, "Account Creation", STATION_SOURCE_TERMINAL, department_account.owner_name, FALSE,
+ STATION_CREATION_DATE, STATION_CREATION_TIME)
//add the account
- department_account.transaction_log.Add(T)
all_money_accounts.Add(department_account)
department_accounts[department] = department_account
@@ -73,7 +66,7 @@ var/global/list/all_money_accounts = list()
if(!source_db)
//set a random date, time and location some time over the past few decades
T.date = "[num2text(rand(1,31))] [pick(month_names)], [rand(game_year - 20,game_year - 1)]"
- T.time = "[rand(0,23)]:[rand(0,59)]"
+ T.time = "[rand(0,23)]:[rand(0,59)]:[rand(0,59)]"
T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]"
M.account_number = rand(111111, 999999)
@@ -104,7 +97,7 @@ var/global/list/all_money_accounts = list()
Date and time: [station_time_timestamp()], [current_date_string]
Creation terminal ID: [source_db.machine_id]
Authorised NT officer overseeing creation: [overseer]
"}
- // END AUTOFIX
+
//stamp the paper
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
@@ -133,7 +126,6 @@ var/global/list/all_money_accounts = list()
/datum/money_account/New()
..()
- //security_level = pick (0,1) //Stealing is now slightly viable
/datum/transaction
var/target_name = ""
@@ -142,222 +134,14 @@ var/global/list/all_money_accounts = list()
var/date = ""
var/time = ""
var/source_terminal = ""
-/*
-/obj/machinery/account_database
- name = "Accounts database"
- desc = "Holds transaction logs, account data and all kinds of other financial records."
- icon = 'icons/obj/virology.dmi'
- icon_state = "analyser"
- density = 1
- req_one_access = list(access_hop, access_captain)
- var/receipt_num
- var/machine_id = ""
- var/obj/item/card/id/held_card
- var/access_level = 0
- var/datum/money_account/detailed_account_view
- var/creating_new_account = 0
- var/activated = 1
-/obj/machinery/account_database/New()
- ..()
- if(!station_account)
- create_station_account()
-
- if(department_accounts.len == 0)
- for(var/department in station_departments)
- create_department_account(department)
- if(!vendor_account)
- create_department_account("Vendor")
- vendor_account = department_accounts["Vendor"]
-
- if(!current_date_string)
- current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557"
-
- machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]"
-
-/obj/machinery/account_database/attack_hand(mob/user as mob)
- if(ishuman(user) && !user.stat && get_dist(src,user) <= 1)
- var/dat = "Accounts Database
"
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:171: dat += "[machine_id]
"
- dat += {"[machine_id]
- Confirm identity: [held_card ? held_card : "-----"]
"}
- // END AUTOFIX
- if(access_level > 0)
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:175: dat += "[activated ? "Disable" : "Enable"] remote access
"
- dat += {"[activated ? "Disable" : "Enable"] remote access
- You may not edit accounts at this terminal, only create and view them.
"}
- // END AUTOFIX
- if(creating_new_account)
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:178: dat += "
"
- dat += {"
- Return to accounts list
- "}
- // END AUTOFIX
- else
- if(detailed_account_view)
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:190: dat += "
"
- dat += {"
- Return to accounts list
- Account number: #[detailed_account_view.account_number]
- Account holder: [detailed_account_view.owner_name]
- Account balance: $[detailed_account_view.money]
-
-
- | Date |
- Time |
- Target |
- Purpose |
- Value |
- Source terminal ID |
-
"}
- // END AUTOFIX
- for(var/datum/transaction/T in detailed_account_view.transaction_log)
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:205: dat += ""
- dat += {"
- | [T.date] |
- [T.time] |
- [T.target_name] |
- [T.purpose] |
- $[T.amount] |
- [T.source_terminal] |
-
"}
- // END AUTOFIX
- dat += "
"
- else
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:215: dat += "Create new account
"
- dat += {"Create new account
- "}
- // END AUTOFIX
- for(var/i=1, i<=all_money_accounts.len, i++)
- var/datum/money_account/D = all_money_accounts[i]
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:219: dat += ""
- dat += {"
- | #[D.account_number] |
- [D.owner_name] |
- View in detail |
-
"}
- // END AUTOFIX
- dat += "
"
-
- user << browse(dat,"window=account_db;size=700x650")
- else
- user << browse(null,"window=account_db")
-
-/obj/machinery/account_database/attackby(O as obj, user as mob)//TODO:SANITY
- if(istype(O, /obj/item/card))
- var/obj/item/card/id/idcard = O
- if(!held_card)
- usr.drop_item()
- idcard.loc = src
- held_card = idcard
-
- if(access_cent_captain in idcard.access)
- access_level = 2
- else if(access_hop in idcard.access || access_captain in idcard.access)
- access_level = 1
- else
- ..()
-
-/obj/machinery/account_database/Topic(var/href, var/href_list)
- ..()
- if(href_list["toggle_activated"])
- activated = !activated
-
- if(href_list["choice"])
- switch(href_list["choice"])
- if("create_account")
- creating_new_account = 1
- if("finalise_create_account")
- var/account_name = href_list["holder_name"]
- var/starting_funds = max(text2num(href_list["starting_funds"]), 0)
- create_account(account_name, starting_funds, src)
- if(starting_funds > 0)
- //subtract the money
- station_account.money -= starting_funds
-
- //create a transaction log entry
- var/datum/transaction/T = new()
- T.target_name = account_name
- T.purpose = "New account funds initialisation"
- T.amount = "([starting_funds])"
- T.date = current_date_string
- T.time = station_time_timestamp()
- T.source_terminal = machine_id
- station_account.transaction_log.Add(T)
-
- creating_new_account = 0
- if("insert_card")
- if(held_card)
- held_card.loc = src.loc
-
- if(ishuman(usr) && !usr.get_active_hand())
- usr.put_in_hands(held_card)
- held_card = null
- access_level = 0
-
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/card/id))
- var/obj/item/card/id/C = I
- usr.drop_item()
- C.loc = src
- held_card = C
-
- if(access_cent_captain in C.access)
- access_level = 2
- else if(access_hop in C.access || access_captain in C.access)
- access_level = 1
- if("view_account_detail")
- var/index = text2num(href_list["account_index"])
- if(index && index <= all_money_accounts.len)
- detailed_account_view = all_money_accounts[index]
- if("view_accounts_list")
- detailed_account_view = null
- creating_new_account = 0
-
- src.attack_hand(usr)
-*/
-/obj/machinery/computer/account_database/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount)
+/obj/machinery/computer/account_database/proc/charge_to_account(attempt_account_number, datum/money_account/source, purpose, terminal_id, amount)
if(!activated)
return 0
for(var/datum/money_account/D in all_money_accounts)
if(D.account_number == attempt_account_number && !D.suspended)
- D.money += amount
-
- //create a transaction log entry
- var/datum/transaction/T = new()
- T.target_name = source_name
- T.purpose = purpose
- if(amount < 0)
- T.amount = "([amount])"
- else
- T.amount = "[amount]"
- T.date = current_date_string
- T.time = station_time_timestamp()
- T.source_terminal = terminal_id
- D.transaction_log.Add(T)
-
+ source.charge(amount, D, purpose, terminal_id, "Account #[D.account_number]", "Transfer from [source.owner_name]",
+ "[D.owner_name]")
return 1
return 0
@@ -378,3 +162,9 @@ var/global/list/all_money_accounts = list()
for(var/datum/money_account/D in all_money_accounts)
if(D.account_number == attempt_account_number)
return D
+
+#undef STATION_CREATION_DATE
+#undef STATION_CREATION_TIME
+#undef STATION_START_CASH
+#undef STATION_SOURCE_TERMINAL
+#undef DEPARTMENT_START_CASH
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index 3ea778671a1..e99367cb8fd 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -1,3 +1,4 @@
+var/global/current_date_string
/obj/machinery/computer/account_database
name = "Accounts Uplink Terminal"
@@ -15,34 +16,6 @@
light_color = LIGHT_COLOR_GREEN
-/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user)
- if(user.can_admin_interact())
- return 2
- if(!held_card)
- return 0
- if(access_cent_commander in held_card.access)
- return 2
- else if(access_hop in held_card.access || access_captain in held_card.access)
- return 1
-
-/obj/machinery/computer/account_database/proc/create_transation(target, reason, amount)
- var/datum/transaction/T = new()
- T.target_name = target
- T.purpose = reason
- T.amount = amount
- T.date = current_date_string
- T.time = station_time_timestamp()
- T.source_terminal = machine_id
- return T
-
-/obj/machinery/computer/account_database/proc/accounting_letterhead(report_name)
- return {"
- [report_name]
- [station_name()] Accounting Report
-
- Generated By: [held_card.registered_name], [held_card.assignment]
- "}
-
/obj/machinery/computer/account_database/New()
if(!station_account)
create_station_account()
@@ -55,11 +28,29 @@
vendor_account = department_accounts["Vendor"]
if(!current_date_string)
- current_date_string = "[time2text(world.timeofday, "DD MM")], [game_year]"
+ current_date_string = "[time2text(world.timeofday, "DD Month")], [game_year]"
machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]"
..()
+/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user)
+ if(user.can_admin_interact())
+ return 2
+ if(!held_card)
+ return 0
+ if(access_cent_commander in held_card.access)
+ return 2
+ else if(access_hop in held_card.access || access_captain in held_card.access)
+ return 1
+
+/obj/machinery/computer/account_database/proc/accounting_letterhead(report_name)
+ return {"
+ [report_name]
+ [station_name()] Accounting Report
+
+ Generated By: [held_card.registered_name], [held_card.assignment]
+ "}
+
/obj/machinery/computer/account_database/attackby(obj/O, mob/user, params)
if(!istype(O, /obj/item/card/id))
return ..()
@@ -160,16 +151,6 @@
if("create_account")
creating_new_account = 1
- if("add_funds")
- var/amount = input("Enter the amount you wish to add", "Silently add funds") as num
- if(detailed_account_view)
- detailed_account_view.money += amount
-
- if("remove_funds")
- var/amount = input("Enter the amount you wish to remove", "Silently remove funds") as num
- if(detailed_account_view)
- detailed_account_view.money -= amount
-
if("toggle_suspension")
if(detailed_account_view)
detailed_account_view.suspended = !detailed_account_view.suspended
@@ -182,14 +163,10 @@
starting_funds = Clamp(starting_funds, 0, station_account.money) // Not authorized to put the station in debt.
starting_funds = min(starting_funds, fund_cap) // Not authorized to give more than the fund cap.
- create_account(account_name, starting_funds, src)
+ var/datum/money_account/M = create_account(account_name, starting_funds, src)
if(starting_funds > 0)
- //subtract the money
- station_account.money -= starting_funds
-
- //create a transaction log entry
- var/trx = create_transation(account_name, "New account activation", "([starting_funds])")
- station_account.transaction_log.Add(trx)
+ station_account.charge(starting_funds, null, "New account activation",
+ "", "New account activation", M.owner_name)
creating_new_account = 0
ui.close()
@@ -205,19 +182,6 @@
detailed_account_view = null
creating_new_account = 0
- if("revoke_payroll")
- var/funds = detailed_account_view.money
- var/account_trx = create_transation(station_account.owner_name, "Revoke payroll", "([funds])")
- var/station_trx = create_transation(detailed_account_view.owner_name, "Revoke payroll", funds)
-
- station_account.money += funds
- detailed_account_view.money = 0
-
- detailed_account_view.transaction_log.Add(account_trx)
- station_account.transaction_log.Add(station_trx)
-
- callHook("revoke_payroll", list(detailed_account_view))
-
if("print")
var/text
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm
index f305c43ad9d..b636a96e2aa 100644
--- a/code/modules/economy/EFTPOS.dm
+++ b/code/modules/economy/EFTPOS.dm
@@ -3,8 +3,7 @@
desc = "Swipe your ID card to make purchases electronically."
icon = 'icons/obj/device.dmi'
icon_state = "eftpos"
- var/machine_id = ""
- var/eftpos_name = "Default EFTPOS scanner"
+ var/machine_name = ""
var/transaction_locked = 0
var/transaction_paid = 0
var/transaction_amount = 0
@@ -15,7 +14,7 @@
/obj/item/eftpos/New()
..()
- machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]"
+ machine_name = "[station_name()] EFTPOS #[num_financial_terminals++]"
access_code = rand(1111,111111)
reconnect_database()
spawn(0)
@@ -28,14 +27,10 @@
/obj/item/eftpos/proc/print_reference()
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/paper/R = new(loc)
- R.name = "Reference: [eftpos_name]"
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:31: R.info = "[eftpos_name] reference
"
- R.info = {"[eftpos_name] reference
+ R.name = "Reference: [machine_name]"
+ R.info = {"[machine_name] reference
Access code: [access_code]
Do not lose or misplace this code.
"}
- // END AUTOFIX
//stamp the paper
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
@@ -86,8 +81,7 @@
/obj/item/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
- data["eftpos_name"] = eftpos_name
- data["machine_id"] = machine_id
+ data["machine_name"] = machine_name
data["transaction_locked"] = transaction_locked
data["transaction_paid"] = transaction_paid
data["transaction_purpose"] = transaction_purpose
@@ -112,15 +106,6 @@
print_reference()
else
to_chat(usr, "[bicon(src)]Incorrect code entered.")
- if("change_id")
- var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
- if(attempt_code == access_code)
- var/name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
- if(name)
- eftpos_name = "[name] EFTPOS scanner"
- print_reference()
- else
- to_chat(usr, "[bicon(src)]Incorrect code entered.")
if("link_account")
if(!linked_db)
reconnect_database()
@@ -179,48 +164,34 @@
if(istype(I, /obj/item/card/id))
var/obj/item/card/id/C = I
visible_message("[user] swipes a card through [src].")
- if(transaction_locked && !transaction_paid)
- if(linked_account)
- var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num
- var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
- if(D)
- if(transaction_amount <= D.money)
- playsound(src, 'sound/machines/chime.ogg', 50, 1)
- visible_message("[bicon(src)] The [src] chimes.")
- transaction_paid = 1
- //transfer the money
- D.money -= transaction_amount
- linked_account.money += transaction_amount
+ if(!transaction_locked || transaction_paid)
+ return
+
+ if(!linked_account)
+ to_chat(user, "[bicon(src)]EFTPOS is not connected to an account.")
+ return
+
+ var/confirm = alert("Are you sure you want to pay $[transaction_amount] to Account: [linked_account.owner_name] ", "Confirm transaction", "Yes", "No")
+ if(confirm == "No")
+ return
+ var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num
+ var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
+
+ if(!D)
+ to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again.")
+
+ if(transaction_amount > D.money)
+ to_chat(user, "[bicon(src)]You don't have that much money!")
+ return
+
+ var/transSuccess = D.charge(transaction_amount, linked_account, transaction_purpose, machine_name, D.owner_name)
+ if(transSuccess == TRUE)
+ playsound(src, 'sound/machines/chime.ogg', 50, 1)
+ visible_message("[bicon(src)] The [src] chimes.")
+ transaction_paid = 1
- //create entries in the two account transaction logs
- var/datum/transaction/T = new()
- T.target_name = "[linked_account.owner_name] (via [eftpos_name])"
- T.purpose = transaction_purpose
- if(transaction_amount > 0)
- T.amount = "([transaction_amount])"
- else
- T.amount = "[transaction_amount]"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = station_time_timestamp()
- D.transaction_log.Add(T)
- //
- T = new()
- T.target_name = D.owner_name
- T.purpose = transaction_purpose
- T.amount = "[transaction_amount]"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = station_time_timestamp()
- linked_account.transaction_log.Add(T)
- else
- to_chat(user, "[bicon(src)]You don't have that much money!")
- else
- to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again.")
- else
- to_chat(user, "[bicon(src)]EFTPOS is not connected to an account.")
else
..()
- //emag?
\ No newline at end of file
+ //emag?
diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm
index 60361ad3f77..30d570bac92 100644
--- a/code/modules/economy/utils.dm
+++ b/code/modules/economy/utils.dm
@@ -46,47 +46,69 @@
/datum/money_account/proc/fmtBalance()
return "$[num2septext(money)]"
-/datum/money_account/proc/charge(var/transaction_amount,var/datum/money_account/dest,var/transaction_purpose, var/terminal_name="", var/terminal_id=0, var/dest_name = "UNKNOWN")
+// Seperated from charge so they can reuse the code and also because there's many instances where a log will be made without actually making a transaction
+/datum/money_account/proc/makeTransactionLog(transaction_amount = 0, transaction_purpose, terminal_name = "",
+ dest_name = "UNKNOWN", charging = TRUE, date = current_date_string, time = "")
+ var/datum/transaction/T = new()
+ T.target_name = dest_name
+ T.purpose = transaction_purpose
+ if(!charging || transaction_amount == 0)
+ T.amount = "[transaction_amount]"
+ else
+ T.amount = "([transaction_amount])"
+
+ T.source_terminal = terminal_name
+ T.date = date
+ if(time == "")
+ T.time = station_time_timestamp()
+ else
+ T.time = time
+ transaction_log.Add(T)
+
+ // Charge is for transferring money from an account to another. The destination account can possibly not exist (Magical money sink)
+/datum/money_account/proc/charge(transaction_amount = 0, datum/money_account/dest, transaction_purpose,
+ terminal_name = "", dest_name = "UNKNOWN", dest_purpose, dest_target_name)
if(suspended)
to_chat(usr, "Unable to access source account: account suspended.")
return 0
-
+
+ if(transaction_amount <= money)
+ //transfer the money
+ money -= transaction_amount
+ makeTransactionLog(transaction_amount, transaction_purpose, terminal_name, dest_name)
+ if(dest)
+ dest.money += transaction_amount
+ dest.makeTransactionLog(transaction_amount,
+ dest_purpose ? dest_purpose : transaction_purpose, terminal_name, dest_target_name ? dest_target_name : dest_name, FALSE)
+ return 1
+ else
+ to_chat(usr, "Insufficient funds in account.")
+ return 0
+
+// phantom_charge is for when you want to charge an account, without making any corresponding log (e.g. you make it yourself with custom date
+// or there won't be any log for some IC reasons (hacking)
+/datum/money_account/proc/phantom_charge(transaction_amount = 0, datum/money_account/dest, suspensionbypass = 0)
+ if(suspended && !suspensionbypass)
+ return 0
+
if(transaction_amount <= money)
//transfer the money
money -= transaction_amount
if(dest)
dest.money += transaction_amount
-
- //create entries in the two account transaction logs
- var/datum/transaction/T
- if(dest)
- T = new()
- T.target_name = owner_name
- if(terminal_name!="")
- T.target_name += " (via [terminal_name])"
- T.purpose = transaction_purpose
- if(transaction_amount > 0)
- T.amount = "([transaction_amount])"
- else
- T.amount = "[transaction_amount]"
- if(terminal_id)
- T.source_terminal = terminal_id
- T.date = current_date_string
- T.time = station_time_timestamp()
- dest.transaction_log.Add(T)
- //
- T = new()
- T.target_name = (!dest) ? dest_name : dest.owner_name
- if(terminal_name!="")
- T.target_name += " (via [terminal_name])"
- T.purpose = transaction_purpose
- T.amount = "[transaction_amount]"
- if(terminal_id)
- T.source_terminal = terminal_id
- T.date = current_date_string
- T.time = station_time_timestamp()
- transaction_log.Add(T)
return 1
else
- to_chat(usr, "Insufficient funds in account.")
- return 0
\ No newline at end of file
+ return 0
+
+// Credit is for giving money to an account out of thin air. Suspension does not matter.
+/datum/money_account/proc/credit(transaction_amount = 0, transaction_purpose,
+ terminal_name = "", dest_name = "UNKNOWN", date = current_date_string, time = "")
+
+ money += transaction_amount
+ makeTransactionLog(transaction_amount, transaction_purpose, terminal_name, dest_name, FALSE, date, time)
+ return 1
+
+//phantom_credit is like the above without any log
+/datum/money_account/proc/phantom_credit(transaction_amount = 0)
+ money += transaction_amount
+ return 1
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index ef5a816d2ff..a482642f023 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -1,7 +1,6 @@
/datum/event/blob
- announceWhen = 60
- endWhen = 120
- var/obj/structure/blob/core/Blob
+ announceWhen = 120
+ endWhen = 180
/datum/event/blob/announce()
event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
@@ -11,18 +10,17 @@
if(!T)
return kill()
var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
- var/mob/C
- if(candidates.len)
- C = pick(candidates)
- Blob = new /obj/structure/blob/core(T, new_overmind=C.client)
- for(var/i in 1 to 5)
- Blob.process()
- else
+ if(!candidates.len)
return kill()
-
-/datum/event/blob/tick()
- if(!Blob)
- kill()
- return
- if(IsMultiple(activeFor, 3))
- Blob.process()
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in all_vent_pumps)
+ if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
+ if(temp_vent.parent.other_atmosmch.len > 50)
+ vents += temp_vent
+ var/obj/vent = pick(vents)
+ var/mob/living/simple_animal/mouse/blobinfected/B = new(vent.loc)
+ var/mob/M = pick(candidates)
+ B.key = M.key
+ to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.")
+ var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob")
+ notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay)
\ No newline at end of file
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index 9ca4e878050..c0b16ab43a6 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -17,12 +17,12 @@
if(announce)
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
- var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot)
- var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot)
+ var/list/skipped_areas = list(/area/turret_protected/ai)
+ var/list/skipped_areas_apc = list(/area/engine/engineering)
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
- if(current_area.type in skipped_areas || !is_station_level(S.z))
+ if((current_area.type in skipped_areas) || !is_station_level(S.z))
continue
S.last_charge = S.charge
S.last_output_attempt = S.output_attempt
@@ -35,26 +35,26 @@
for(var/obj/machinery/power/apc/C in apcs)
var/area/current_area = get_area(C)
- if(current_area.type in skipped_areas_apc || !is_station_level(C.z))
+ if((current_area.type in skipped_areas_apc) || !is_station_level(C.z))
continue
if(C.cell)
C.cell.charge = 0
/proc/power_restore(var/announce = 1)
- var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot)
- var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot)
+ var/list/skipped_areas = list(/area/turret_protected/ai)
+ var/list/skipped_areas_apc = list(/area/engine/engineering)
if(announce)
event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in apcs)
var/area/current_area = get_area(C)
- if(current_area.type in skipped_areas_apc || !is_station_level(C.z))
+ if((current_area.type in skipped_areas_apc) || !is_station_level(C.z))
continue
if(C.cell)
C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
- if(current_area.type in skipped_areas || !is_station_level(S.z))
+ if((current_area.type in skipped_areas) || !is_station_level(S.z))
continue
S.charge = S.last_charge
S.output_attempt = S.last_output_attempt
diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm
index 641fec1405e..4ba4a14a315 100644
--- a/code/modules/events/money_hacker.dm
+++ b/code/modules/events/money_hacker.dm
@@ -1,3 +1,6 @@
+#define MINIMUM_PERCENTAGE_LOSS 0.5
+#define VARIABLE_LOSS 2 // Invariant: 1 - VARIABLE_LOSS/10 >= MINIMUM_PERCENTAGE_LOSS
+
/var/global/account_hack_attempted = 0
/datum/event/money_hacker
@@ -16,7 +19,7 @@
/datum/event/money_hacker/announce()
var/message = "A brute force hack has been detected (in progress since [station_time_timestamp()]). The target of the attack is: Financial account #[affected_account.account_number], \
- without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \
+ without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected account until the attack has ceased. \
Notifications will be sent as updates occur.
"
var/my_department = "[station_name()] firewall subroutines"
@@ -32,35 +35,38 @@
/datum/event/money_hacker/end()
var/message
- if(affected_account && !affected_account)
- //hacker wins
+ if(!isnull(affected_account) && !affected_account.suspended)
message = "The hack attempt has succeeded."
- //subtract the money
- var/lost = affected_account.money * 0.8 + (rand(2,4) - 2) / 10
- affected_account.money -= lost
+ var/lost = affected_account.money * (MINIMUM_PERCENTAGE_LOSS + rand(0,VARIABLE_LOSS) / 10);
+
+ affected_account.phantom_charge(lost)
+
//create a taunting log entry
- var/datum/transaction/T = new()
- T.target_name = pick("","yo brotha from anotha motha","el Presidente","chieF smackDowN")
- T.purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez")
- T.amount = pick("","([rand(0,99999)])","alla money","9001$","HOLLA HOLLA GET DOLLA","([lost])")
+ var/dest_name = pick("","yo brotha from anotha motha","el Presidente","chieF smackDowN")
+ var/amount = pick("","([rand(0,99999)])","alla money","9001$","HOLLA HOLLA GET DOLLA","([lost])")
+ var/purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez")
var/date1 = "31 December, 1999"
var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]"
- T.date = pick("", current_date_string, date1, date2)
+ var/date = pick("", current_date_string, date1, date2)
var/time1 = rand(0, 99999999)
var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]"
- T.time = pick("", station_time_timestamp(), time2)
- T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD")
+ var/time = pick("", station_time_timestamp(), time2)
+ var/source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD")
+
+ affected_account.makeTransactionLog(amount, purpose, source_terminal, dest_name, TRUE, date, time)
- affected_account.transaction_log.Add(T)
else
//crew wins
- message = "The attack has ceased, the affected accounts can now be brought online."
+ message = "The attack has ceased, the affected account can now be brought online."
var/my_department = "[station_name()] firewall subroutines"
for(var/obj/machinery/message_server/MS in world)
if(!MS.active) continue
MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2)
+
+#undef MINIMUM_PERCENTAGE_LOSS
+#undef VARIABLE_LOSS
diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm
index b95278b441b..9339ee6a626 100644
--- a/code/modules/events/money_lotto.dm
+++ b/code/modules/events/money_lotto.dm
@@ -8,19 +8,9 @@
if(all_money_accounts.len)
var/datum/money_account/D = pick(all_money_accounts)
winner_name = D.owner_name
- if(!D.suspended)
- D.money += winner_sum
- var/datum/transaction/T = new()
- T.target_name = "Nyx Daily Grand Slam -Stellar- Lottery"
- T.purpose = "Winner!"
- T.amount = winner_sum
- T.date = current_date_string
- T.time = worldtime2text()
- T.source_terminal = "Biesel TCD Terminal #[rand(111,333)]"
- D.transaction_log.Add(T)
-
- deposit_success = 1
+ D.credit(winner_sum, "Winner!", "Biesel TCD Terminal #[rand(111,333)]", "Nyx Daily Grand Slam -Stellar- Lottery")
+ deposit_success = 1
/datum/event/money_lotto/announce()
var/datum/feed_message/newMsg = new /datum/feed_message
diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm
index ea35118ab11..e31a6543ce3 100644
--- a/code/modules/flufftext/Dreaming.dm
+++ b/code/modules/flufftext/Dreaming.dm
@@ -43,7 +43,7 @@
nightmare()
if(ishuman(src))
if(prob(10))
- emote("writhes in [p_their()] sleep.")
+ custom_emote(1,"writhes in [p_their()] sleep.")
dir = pick(cardinal)
/mob/living/carbon/proc/experience_dream(dream_image, isNightmare)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index d8a1f4f1526..74a0baf8cd5 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -21,7 +21,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/image/halbody
var/obj/halitem
var/hal_screwyhud = SCREWYHUD_NONE
- var/handling_hal = 0
+ var/handling_hal = FALSE
/mob/living/carbon/proc/handle_hallucinations()
if(handling_hal)
@@ -34,9 +34,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
//AAAAHg
var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"borer"=10,"delusion"=20,"koolaid"=10)
- handling_hal = 1
+ handling_hal = TRUE
while(hallucination > 20)
- sleep(rand(200, 500) / (hallucination / 25))
+ sleep(rand(200, 500) / (hallucination * 0.04))
if(prob(20))
continue
var/list/current = list()
@@ -48,10 +48,8 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(86 to 100)
current = major
- var/halpick = pickweight(current)
-
- hallucinate(halpick)
- handling_hal = 0
+ hallucinate(pickweight(current))
+ handling_hal = FALSE
/obj/effect/hallucination
@@ -70,7 +68,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/col_mod = null
var/image/current_image = null
var/image_layer = MOB_LAYER
- var/active = 1 //qdelery
+ var/active = TRUE //qdelery
/obj/effect/hallucination/simple/New(loc, mob/living/carbon/T)
..()
@@ -113,7 +111,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/simple/Destroy()
if(target.client)
target.client.images.Remove(current_image)
- active = 0
+ active = FALSE
return ..()
#define FAKE_FLOOD_EXPAND_TIME 20
@@ -198,21 +196,17 @@ Gunshots/explosions/opening doors/less rare audio (done)
pump = U
break
if(!pump)
- return 0
+ return
xeno = new(pump.loc,target)
sleep(10)
if(!xeno)
return
- xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
- sleep(10)
- if(!xeno)
- return
- xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
- xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1)
- sleep(10)
- if(!xeno)
- return
+ for(var/i in 0 to 2)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1)
+ sleep(10)
+ if(!xeno)
+ return
var/xeno_name = xeno.name
to_chat(target, "[xeno_name] begins climbing into the ventilation system...")
sleep(10)
@@ -253,7 +247,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
break
if(pump)
borer = new(pump.loc,target)
- for(var/i=0, i<11, i++)
+ for(var/i in 0 to 10)
walk_to(borer, get_step(borer, get_cardinal_dir(borer, T)))
if(borer.Adjacent(T))
to_chat(T, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.")
@@ -331,10 +325,10 @@ Gunshots/explosions/opening doors/less rare audio (done)
target = T
var/turf/start = get_turf(T)
var/screen_border = pick(cardinal)
- for(var/i = 0,i<11,i++)
+ for(var/i in 0 to 10)
start = get_step(start, screen_border)
s = new(start,target)
- for(var/i = 0,i<11,i++)
+ for(var/i in 0 to 10)
sleep(5)
s.loc = get_step(get_turf(s), get_dir(s, target))
s.Show()
@@ -359,10 +353,10 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/battle/New(loc, mob/living/carbon/T)
target = T
- var/hits = rand(3,6)
+ var/hits = rand(2,5)
switch(rand(1,5))
if(1) //Laser fight
- for(var/i=0,i0, i--)
+ for(var/i in 0 to rand(1,3))
playsound_local(null, 'sound/weapons/empty.ogg', 15, 1)
sleep(rand(10,30))
playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1)
@@ -877,10 +865,9 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
playsound_local(null, 'sound/AI/outbreak5.ogg')
if(19) //Tesla loose!
playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1)
- sleep(20)
- playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1)
- sleep(20)
- playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1)
+ for(var/i in 0 to 2)
+ sleep(20)
+ playsound_local(null, 'sound/magic/lightningbolt.ogg', 65+(35*(i-1)), 1) //65%, then 100% volume.
if(20) //AI is doomsdaying!
to_chat(src, "Anomaly Alert
")
to_chat(src, "
Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.
")
@@ -987,8 +974,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
halitem.icon_state = "flashbang1"
halitem.name = "Flashbang"
if(client) client.screen += halitem
- spawn(rand(100,250))
- qdel(halitem)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, halitem), rand(100,250))
if("dangerflash")
//Flashes of danger
if(!halimage)
@@ -1007,8 +993,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER)
if(4)
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
-
-
+
if(client)
client.images += halimage
sleep(rand(40,60)) //Only seen for a brief moment.
@@ -1054,4 +1039,4 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
spawn(rand(30,50)) //Only seen for a brief moment.
if(client)
client.images -= halbody
- halbody = null
+ halbody = null
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm b/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm
index d83bfaeccb0..be4f18539e2 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "candymaker_off"
cook_verbs = list("Wonderizing", "Scrumpdiddlyumptiousification", "Miracle-coating", "Flavorifaction")
- recipe_type = /datum/recipe/candy
+ recipe_type = RECIPE_CANDY
off_icon = "candymaker_off"
on_icon = "candymaker_on"
broken_icon = "candymaker_broke"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
index 62aaf8440bf..802f8f08c54 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
@@ -4,7 +4,7 @@
layer = 2.9
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
var/on = 0
var/onicon = null
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 1e3c5602a22..bd80823addd 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -20,7 +20,7 @@
var/stealthmode = FALSE
var/list/victims = list()
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 500
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm
index c1b2612533d..e95b186a9f0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "grill_off"
cook_verbs = list("Grilling", "Searing", "Frying")
- recipe_type = /datum/recipe/grill
+ recipe_type = RECIPE_GRILL
off_icon = "grill_off"
on_icon = "grill_on"
broken_icon = "grill_broke"
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 a58ccc1bb2b..5d758193bae 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -7,7 +7,7 @@
anchored = 1
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "icecream_vat"
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 20
var/obj/item/reagent_containers/glass/beaker = null
var/useramount = 15 //Last used amount
diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
index ec806610601..a10f4e2fdae 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
@@ -6,7 +6,7 @@
layer = 2.9
density = 1
anchored = 0
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 100
pass_flags = PASSTABLE
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index 83f1126f78f..9de98749e42 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -5,7 +5,7 @@
layer = 2.9
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 100
flags = OPENCONTAINER
@@ -16,10 +16,7 @@
var/list/cook_verbs = list("Cooking")
//Recipe & Item vars
var/recipe_type //Make sure to set this on the machine definition, or else you're gonna runtime on New()
- var/list/datum/recipe/available_recipes // List of the recipes you can use
- var/list/acceptable_items // List of the items you can put in
- var/list/acceptable_reagents // List of the reagents you can put in
- var/max_n_of_items = 0
+ var/max_n_of_items = 25
//Icon states
var/off_icon
var/on_icon
@@ -35,23 +32,28 @@
..()
create_reagents(100)
reagents.set_reacting(FALSE)
- if(!available_recipes)
- available_recipes = new
- acceptable_items = new
- acceptable_reagents = new
- for(var/type in subtypesof(recipe_type))
+ init_lists()
+
+/obj/machinery/kitchen_machine/proc/init_lists()
+ if(!GLOB.cooking_recipes[recipe_type])
+ GLOB.cooking_recipes[recipe_type] = list()
+ GLOB.cooking_ingredients[recipe_type] = list()
+ GLOB.cooking_reagents[recipe_type] = list()
+ if(!length(GLOB.cooking_recipes[recipe_type]))
+ for(var/type in subtypesof(GLOB.cooking_recipe_types[recipe_type]))
var/datum/recipe/recipe = new type
+ if(recipe in GLOB.cooking_recipes[recipe_type])
+ qdel(recipe)
+ continue
if(recipe.result) // Ignore recipe subtypes that lack a result
- available_recipes += recipe
+ GLOB.cooking_recipes[recipe_type] += recipe
for(var/item in recipe.items)
- acceptable_items |= item
+ GLOB.cooking_ingredients[recipe_type] |= item
for(var/reagent in recipe.reagents)
- acceptable_reagents |= reagent
- if(recipe.items)
- max_n_of_items = max(max_n_of_items,recipe.count_n_items())
+ GLOB.cooking_reagents[recipe_type] |= reagent
else
qdel(recipe)
- acceptable_items |= /obj/item/reagent_containers/food/snacks/grown
+ GLOB.cooking_ingredients[recipe_type] |= /obj/item/reagent_containers/food/snacks/grown
/*******************
* Item Adding
@@ -80,26 +82,14 @@
if(broken > 0)
if(broken == 2 && istype(O, /obj/item/screwdriver)) // If it's broken and they're using a screwdriver
- user.visible_message( \
- "[user] starts to fix part of \the [src].", \
- "You start to fix part of \the [src]." \
- )
+ user.visible_message("[user] starts to fix part of [src].", "You start to fix part of [src].")
if(do_after(user, 20 * O.toolspeed, target = src))
- user.visible_message( \
- "[user] fixes part of \the [src].", \
- "You have fixed part of \the [src]." \
- )
+ user.visible_message("[user] fixes part of [src].", "You have fixed part of \the [src].")
broken = 1 // Fix it a bit
else if(broken == 1 && istype(O, /obj/item/wrench)) // If it's broken and they're doing the wrench
- user.visible_message( \
- "[user] starts to fix part of \the [src].", \
- "You start to fix part of \the [src]." \
- )
+ user.visible_message("[user] starts to fix part of [src].", "You start to fix part of [src].")
if(do_after(user, 20 * O.toolspeed, target = src))
- user.visible_message( \
- "[user] fixes \the [src].", \
- "You have fixed \the [src]." \
- )
+ user.visible_message("[user] fixes [src].", "You have fixed [src].")
icon_state = off_icon
broken = 0 // Fix it!
dirty = 0 // just to be sure
@@ -109,15 +99,9 @@
return 1
else if(dirty==100) // The machine is all dirty so can't be used!
if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/soap)) // If they're trying to clean it then let them
- user.visible_message( \
- "[user] starts to clean \the [src].", \
- "You start to clean \the [src]." \
- )
+ user.visible_message("[user] starts to clean [src].", "You start to clean [src].")
if(do_after(user, 20 * O.toolspeed, target = src))
- user.visible_message( \
- "[user] has cleaned \the [src].", \
- "You have cleaned \the [src]." \
- )
+ user.visible_message("[user] has cleaned [src].", "You have cleaned [src].")
dirty = 0 // It's clean!
broken = 0 // just to be sure
icon_state = off_icon
@@ -125,33 +109,25 @@
else //Otherwise bad luck!!
to_chat(user, "It's dirty!")
return 1
- else if(is_type_in_list(O,acceptable_items))
+ else if(is_type_in_list(O, GLOB.cooking_ingredients[recipe_type]) || istype(O, /obj/item/mixing_bowl))
if(contents.len>=max_n_of_items)
to_chat(user, "This [src] is full of ingredients, you cannot put more.")
return 1
- if(istype(O,/obj/item/stack) && O:amount>1)
- new O.type (src)
- O:use(1)
- user.visible_message( \
- "[user] has added one of [O] to \the [src].", \
- "You add one of [O] to \the [src].")
+ if(istype(O,/obj/item/stack))
+ var/obj/item/stack/S = O
+ if(S.amount > 1)
+ var/obj/item/stack/to_add = S.split(user, 1)
+ to_add.forceMove(src)
+ user.visible_message("[user] adds one of [S] to [src].", "You add one of [S] to [src].")
+ else
+ add_item(S, user)
else
- if(!user.drop_item())
- to_chat(user, "\The [O] is stuck to your hand, you cannot put it in \the [src]")
- return 0
-
- O.forceMove(src)
- user.visible_message( \
- "[user] has added \the [O] to \the [src].", \
- "You add \the [O] to \the [src].")
- else if(istype(O,/obj/item/reagent_containers/glass) || \
- istype(O,/obj/item/reagent_containers/food/drinks) || \
- istype(O,/obj/item/reagent_containers/food/condiment) \
- )
+ add_item(O, user)
+ else if(is_type_in_list(O, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment)))
if(!O.reagents)
return 1
for(var/datum/reagent/R in O.reagents.reagent_list)
- if(!(R.id in acceptable_reagents))
+ if(!(R.id in GLOB.cooking_reagents[recipe_type]))
to_chat(user, "Your [O] contains components unsuitable for cookery.")
return 1
//G.reagents.trans_to(src,G.amount_per_transfer_from_this)
@@ -162,6 +138,14 @@
return 1
updateUsrDialog()
+/obj/machinery/kitchen_machine/proc/add_item(obj/item/I, mob/user)
+ if(!user.drop_item())
+ to_chat(user, "\The [I] is stuck to your hand, you cannot put it in [src]")
+ //return 0
+ else
+ I.forceMove(src)
+ user.visible_message("[user] adds [I] to [src].", "You add [I] to [src].")
+
/obj/machinery/kitchen_machine/attack_ai(mob/user)
return 0
@@ -182,11 +166,11 @@
return
var/dat = ""
if(broken > 0)
- dat = {"Bzzzzttttt"}
+ dat = {"Bzzzzttttt"}
else if(operating)
- dat = {"[pick(cook_verbs)] in progress!
Please wait...!"}
+ dat = {"[pick(cook_verbs)] in progress!
Please wait...!"}
else if(dirty==100)
- dat = {"This [src] is dirty!
Please clean it before use!"}
+ dat = {"This [src] is dirty!
Please clean it before use!"}
else
var/list/items_counts = new
var/list/items_measures = new
@@ -260,12 +244,13 @@
stop()
return
- var/datum/recipe/recipe = select_recipe(available_recipes,src)
- var/obj/cooked
- var/obj/byproduct
- if(!recipe)
+ var/list/recipes_to_make = choose_recipes()
+
+ if(recipes_to_make.len == 1 && recipes_to_make[1][2] == RECIPE_FAIL)
+ //This only runs if there is a single recipe source to be made and it is a failure (the machine was loaded with only 1 mixing bowl that results in failure OR was directly loaded with ingredients that results in failure).
+ //If there are multiple sources, this bit gets skipped.
dirty += 1
- if(prob(max(10,dirty*5)))
+ if(prob(max(10,dirty*5))) //chance to get so dirty we require cleaning before next use
if(!wzhzhzh(4))
abort()
return
@@ -274,14 +259,14 @@
muck_finish()
fail()
return
- else if(has_extra_item())
+ else if(has_extra_item()) //if extra items present, break down and require repair before next use
if(!wzhzhzh(4))
abort()
return
broke()
fail()
return
- else
+ else //otherwise just stop without requiring cleaning/repair
if(!wzhzhzh(10))
abort()
return
@@ -289,24 +274,69 @@
fail()
return
else
- var/halftime = round(recipe.time/10/2)
- if(!wzhzhzh(halftime))
+ if(!wzhzhzh(5))
abort()
return
- if(!wzhzhzh(halftime))
+ if(!wzhzhzh(5))
abort()
fail()
return
- cooked = recipe.make_food(src)
- byproduct = recipe.get_byproduct()
- stop()
- if(cooked)
- cooked.forceMove(loc)
- for(var/i=1,iThe machine's display flashes that it has [grinded] monkey\s worth of material left.")
else // I'm not sure if the \s macro works with a word in between; I'll play it safe
to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].")
- return
\ No newline at end of file
+ return
diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven.dm b/code/modules/food_and_drinks/kitchen_machinery/oven.dm
index cf27804d823..2827720c12e 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/oven.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/oven.dm
@@ -6,7 +6,7 @@
layer = 2.9
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
var/candy = 0
idle_power_usage = 5
var/on = FALSE //Is it making food already?
diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm
index 4904a2a5d5f..67a65148244 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "oven_off"
cook_verbs = list("Baking", "Roasting", "Broiling")
- recipe_type = /datum/recipe/oven
+ recipe_type = RECIPE_OVEN
off_icon = "oven_off"
on_icon = "oven_on"
broken_icon = "oven_broke"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index ad4dcb5e4d8..19c866fae43 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -9,7 +9,7 @@
var/broken = 0
var/processing = 0
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 50
var/rating_speed = 1
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index fd4aa5aa340..3a905a658d0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -7,7 +7,7 @@
layer = 2.9
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 100
var/max_n_of_items = 1500
@@ -226,7 +226,6 @@
if(load(O, user))
user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
-
SSnanoui.update_uis(src)
else if(istype(O, /obj/item/storage/bag))
@@ -242,7 +241,7 @@
SSnanoui.update_uis(src)
- else
+ else if(!istype(O, /obj/item/card/emag))
to_chat(user, "\The [src] smartly refuses [O].")
return 1
@@ -308,11 +307,6 @@
to_chat(user, "Some items are refused.")
SSnanoui.update_uis(src)
-/obj/machinery/smartfridge/secure/emag_act(mob/user)
- emagged = 1
- locked = -1
- to_chat(user, "You short out the product lock on [src].")
-
/*******************
* SmartFridge Menu
********************/
@@ -416,7 +410,7 @@
desc = "A wooden contraption, used to dry plant products, food and leather."
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "drying_rack_on"
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 200
icon_on = "drying_rack_on"
@@ -453,13 +447,13 @@
return 1
if(href_list["dryingOn"])
drying = TRUE
- use_power = 2
+ use_power = ACTIVE_POWER_USE
update_icon()
return 1
if(href_list["dryingOff"])
drying = FALSE
- use_power = 1
+ use_power = IDLE_POWER_USE
update_icon()
return 1
return 0
@@ -503,10 +497,10 @@
/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff)
if(drying || forceoff)
drying = FALSE
- use_power = 1
+ use_power = IDLE_POWER_USE
else
drying = TRUE
- use_power = 2
+ use_power = ACTIVE_POWER_USE
update_icon()
/obj/machinery/smartfridge/drying_rack/proc/rack_dry()
@@ -539,6 +533,16 @@
/************************
* Secure SmartFridges
*************************/
+/obj/machinery/smartfridge/secure/emag_act(mob/user)
+ emagged = 1
+ locked = -1
+ to_chat(user, "You short out the product lock on [src].")
+
+/obj/machinery/smartfridge/secure/emp_act(severity)
+ if(prob(40/severity) && (!emagged) && (locked != -1))
+ playsound(loc, 'sound/effects/sparks4.ogg', 60, 1)
+ emagged = 1
+ locked = -1
/obj/machinery/smartfridge/secure/Topic(href, href_list)
if(stat & (NOPOWER|BROKEN))
@@ -548,4 +552,4 @@
to_chat(usr, "Access denied.")
SSnanoui.update_uis(src)
return 0
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index e14aaa09ba7..459d8d144f5 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -40,7 +40,7 @@
/obj/item/deck/examine(mob/user)
..()
- to_chat(user,"It contains [cards.len ? cards.len : "no"] cards")
+ to_chat(user,"It contains [cards.len ? cards.len : "no"] cards")
/obj/item/deck/attack_hand(mob/user as mob)
draw_card(user)
@@ -221,6 +221,8 @@
return
if(over_object == M)
+ if(!remove_item_from_storage(M))
+ M.unEquip(src)
M.put_in_hands(src)
else if(istype(over_object, /obj/screen))
@@ -250,7 +252,7 @@
/obj/item/pack/attack_self(mob/user as mob)
user.visible_message("[name] rips open the [src]!", "You rips open the [src]!")
- var/obj/item/cardhand/H = new()
+ var/obj/item/cardhand/H = new(get_turf(user))
H.cards += cards
cards.Cut()
@@ -258,7 +260,7 @@
qdel(src)
H.update_icon()
- user.put_in_active_hand(H)
+ user.put_in_hands(H)
/obj/item/cardhand
name = "hand of cards"
@@ -315,9 +317,9 @@
/obj/item/cardhand/examine(mob/user)
..(user)
if((!concealed) && cards.len)
- to_chat(user,"It contains:")
+ to_chat(user,"It contains:")
for(var/datum/playingcard/P in cards)
- to_chat(user,"the [P.name].")
+ to_chat(user,"the [P.name].")
// Datum action here
@@ -368,16 +370,17 @@
var/datum/playingcard/card = pickablecards[pickedcard]
var/obj/item/cardhand/H = new(get_turf(src))
- user.put_in_active_hand(H)
+ user.put_in_hands(H)
H.cards += card
cards -= card
H.parentdeck = parentdeck
H.concealed = concealed
H.update_icon()
- update_icon()
if(!cards.len)
qdel(src)
+ return
+ update_icon()
/obj/item/cardhand/verb/discard(var/mob/user as mob)
@@ -410,7 +413,7 @@
if(cards.len)
update_icon()
if(H.cards.len)
- usr.visible_message("The [user] plays the [discarding].", "You play the [discarding].")
+ usr.visible_message("The [usr] plays the [discarding].", "You play the [discarding].")
H.loc = get_step(usr,usr.dir)
if(!cards.len)
@@ -419,7 +422,6 @@
/obj/item/cardhand/update_icon(var/direction = 0)
if(!cards.len)
- qdel(src)
return
else if(cards.len > 1)
name = "hand of cards"
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 96553775361..67979b61dd7 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -5,7 +5,7 @@
icon_state = "biogen-empty"
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 40
var/processing = 0
var/obj/item/reagent_containers/glass/beaker = null
diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm
index d75791f5404..24ddf1dbbba 100644
--- a/code/modules/hydroponics/grown/beans.dm
+++ b/code/modules/hydroponics/grown/beans.dm
@@ -15,7 +15,7 @@
icon_dead = "soybean-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
mutatelist = list(/obj/item/seeds/soya/koi)
- reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05)
+ reagents_add = list("soybeanoil" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.05)
/obj/item/reagent_containers/food/snacks/grown/soybeans
seed = /obj/item/seeds/soya
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 903fec0c1a2..b5bea1fc6b3 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -1008,7 +1008,7 @@
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "soil"
density = 0
- use_power = 0
+ use_power = NO_POWER_USE
wrenchable = 0
/obj/machinery/hydroponics/soil/update_icon_hoses()
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 5b4a35262d7..84db02cb89c 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -315,12 +315,16 @@
/datum/plant_gene/trait/teleport/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
var/teleport_radius = max(round(G.seed.potency / 10), 1)
var/turf/T = get_turf(C)
- to_chat(C, "You slip through spacetime!")
- do_teleport(C, T, teleport_radius)
- if(prob(50))
- do_teleport(G, T, teleport_radius)
+ if(do_teleport(C, T, teleport_radius))
+ to_chat(C, "You slip through spacetime!")
+ if(prob(50))
+ do_teleport(G, T, teleport_radius)
+ else
+ new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
+ qdel(G)
else
- new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
+ to_chat(C, "[src] sparks, and burns up!")
+ new /obj/effect/decal/cleanable/molten_object(T)
qdel(G)
diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm
index 1f18edfae22..cfc44382d64 100644
--- a/code/modules/karma/karma.dm
+++ b/code/modules/karma/karma.dm
@@ -1,3 +1,7 @@
+/* KARMA
+ Everything karma related is here.
+ Part of karma purchase is handled in client_procs.dm */
+
proc/sql_report_karma(var/mob/spender, var/mob/receiver)
var/sqlspendername = sanitizeSQL(spender.name)
var/sqlspenderkey = spender.ckey
@@ -39,49 +43,49 @@ proc/sql_report_karma(var/mob/spender, var/mob/receiver)
var/err = query.ErrorMsg()
log_game("SQL ERROR during karmatotal logging (adding new key). Error : \[[err]\]\n")
else
- karma += 1
+ karma++
query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karma=[karma] WHERE id=[id]")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during karmatotal logging (updating existing entry). Error : \[[err]\]\n")
-
var/list/karma_spenders = list()
-// Returns 1 if mob can give karma at all; if not, tells them why
+// Returns TRUE if mob can give karma at all; if not, tells them why
/mob/proc/can_give_karma()
if(!client)
- return 0
+ to_chat(src, "You can't award karma without being connected.")
+ return FALSE
if(config.disable_karma)
to_chat(src, "Karma is disabled.")
- return 0
+ return FALSE
if(!ticker || !player_list.len || (ticker.current_state == GAME_STATE_PREGAME))
to_chat(src, "You can't award karma until the game has started.")
- return 0
+ return FALSE
if(client.karma_spent || (ckey in karma_spenders))
to_chat(src, "You've already spent your karma for the round.")
- return 0
- return 1
+ return FALSE
+ return TRUE
-// Returns 1 if mob can give karma to M; if not, tells them why
+// Returns TRUE if mob can give karma to M; if not, tells them why
/mob/proc/can_give_karma_to_mob(mob/M)
if(!can_give_karma())
- return 0
+ return FALSE
if(!istype(M))
to_chat(src, "That's not a mob.")
- return 0
+ return FALSE
if(!M.client)
to_chat(src, "That mob has no client connected at the moment.")
- return 0
- if(ckey == M.ckey)
+ return FALSE
+ if(M.ckey == ckey)
to_chat(src, "You can't spend karma on yourself!")
- return 0
+ return FALSE
if(client.address == M.client.address)
message_admins("Illegal karma spending attempt detected from [key] to [M.key]. Using the same IP!")
log_game("Illegal karma spending attempt detected from [key] to [M.key]. Using the same IP!")
to_chat(src, "You can't spend karma on someone connected from the same IP.")
- return 0
- return 1
+ return FALSE
+ return TRUE
/mob/verb/spend_karma_list()
@@ -129,9 +133,9 @@ var/list/karma_spenders = list()
if(!can_give_karma_to_mob(M))
return // Check again, just in case things changed while the alert box was up
- M.client.karma += 1
+ M.client.karma++
to_chat(usr, "Good karma spent on [M.name].")
- client.karma_spent = 1
+ client.karma_spent = TRUE
karma_spenders += ckey
var/special_role = "None"
@@ -153,14 +157,14 @@ var/list/karma_spenders = list()
if(config.disable_karma)
to_chat(src, "Karma is disabled.")
- return 0
+ return
- var/currentkarma=verify_karma()
- to_chat(usr, {"
You have [currentkarma] available."})
- return
+ var/currentkarma = verify_karma()
+ if(!isnull(currentkarma))
+ to_chat(usr, {"
You have [currentkarma] available."})
/client/proc/verify_karma()
- var/currentkarma=0
+ var/currentkarma = 0
if(!dbcon.IsConnected())
to_chat(usr, "Unable to connect to karma database. Please try again later.
")
return
@@ -174,24 +178,18 @@ var/list/karma_spenders = list()
totalkarma = query.item[1]
karmaspent = query.item[2]
currentkarma = (text2num(totalkarma) - text2num(karmaspent))
-/* if(totalkarma)
- to_chat(usr, {"
You have [currentkarma] available.
)
-You've gained [totalkarma] total karma in your time here.
"}
- else
- to_chat(usr, "Your total karma is: 0
")*/
+
return currentkarma
/client/verb/karmashop()
set name = "karmashop"
set desc = "Spend your hard-earned karma here"
- set hidden = 1
+ set hidden = TRUE
if(config.disable_karma)
to_chat(src, "Karma is disabled.")
- return 0
-
+ return
karmashopmenu()
- return
/client/proc/karmashopmenu()
var/dat = ""
@@ -267,7 +265,23 @@ You've gained [totalkarma] total karma in your time here.
"}
var/datum/browser/popup = new(usr, "karmashop", "Karma Shop
", 400, 400)
popup.set_content(dat)
popup.open(0)
- return
+
+//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm)
+/client/proc/karma_purchase(var/karma = 0, var/price = 1, var/category, var/name, var/DBname = null)
+ if(karma < price)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes")
+ return
+ if(karma < price) //Check one more time. (definitely not repeated code)
+ to_chat(usr, "You do not have enough karma!")
+ return
+ if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People)
+ name = DBname
+ if(category == "job")
+ DB_job_unlock(name,price)
+ else if(category == "species")
+ DB_species_unlock(name,price)
/client/proc/DB_job_unlock(var/job,var/cost)
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
@@ -281,9 +295,7 @@ You've gained [totalkarma] total karma in your time here.
"}
if(!dbckey)
query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, job) VALUES ('[usr.ckey]','[job]')")
if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n")
- message_admins("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n")
+ queryErrorLog(query.ErrorMsg(),"adding new key")
return
else
to_chat(usr, "You have unlocked [job].")
@@ -297,9 +309,7 @@ You've gained [totalkarma] total karma in your time here.
"}
var/newjoblist = jointext(joblist,",")
query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET job='[newjoblist]' WHERE ckey='[dbckey]'")
if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n")
- message_admins("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n")
+ queryErrorLog(query.ErrorMsg(),"updating existing entry")
return
else
to_chat(usr, "You have unlocked [job].")
@@ -321,9 +331,7 @@ You've gained [totalkarma] total karma in your time here.
"}
if(!dbckey)
query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, species) VALUES ('[usr.ckey]','[species]')")
if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n")
- message_admins("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n")
+ queryErrorLog(query.ErrorMsg(),"adding new key")
return
else
to_chat(usr, "You have unlocked [species].")
@@ -337,9 +345,7 @@ You've gained [totalkarma] total karma in your time here.
"}
var/newspecieslist = jointext(specieslist,",")
query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET species='[newspecieslist]' WHERE ckey='[dbckey]'")
if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n")
- message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n")
+ queryErrorLog(query.ErrorMsg(),"updating existing entry")
return
else
to_chat(usr, "You have unlocked [species].")
@@ -349,7 +355,7 @@ You've gained [totalkarma] total karma in your time here.
"}
to_chat(usr, "You already have this species unlocked!")
return
-/client/proc/karmacharge(var/cost,var/refund = 0)
+/client/proc/karmacharge(var/cost,var/refund = FALSE)
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[usr.ckey]'")
query.Execute()
@@ -361,9 +367,7 @@ You've gained [totalkarma] total karma in your time here.
"}
spent += cost
query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karmaspent=[spent] WHERE byondkey='[usr.ckey]'")
if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n")
- message_admins("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n")
+ queryErrorLog(query.ErrorMsg(),"updating existing entry")
return
else
to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.")
@@ -372,23 +376,8 @@ You've gained [totalkarma] total karma in your time here.
"}
/client/proc/karmarefund(var/type,var/name,var/cost)
switch(name)
- if("Tajaran Ambassador")
- cost = 30
- if("Unathi Ambassador")
- cost = 30
- if("Skrell Ambassador")
- cost = 30
- if("Diona Ambassador")
- cost = 30
- if("Kidan Ambassador")
- cost = 30
- if("Slime People Ambassador")
- cost = 30
- if("Grey Ambassador")
- cost = 30
- if("Vox Ambassador")
- cost = 30
- if("Customs Officer")
+ if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador",
+ "Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer")
cost = 30
if("Nanotrasen Recruiter")
cost = 10
@@ -422,9 +411,7 @@ You've gained [totalkarma] total karma in your time here.
"}
var/newtypelist = jointext(typelist,",")
query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET [type]='[newtypelist]' WHERE ckey='[dbckey]'")
if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n")
- message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n")
+ queryErrorLog(query.ErrorMsg(),"updating existing entry")
return
else
to_chat(usr, "You have been refunded [cost] karma for [type] [name].")
@@ -436,6 +423,10 @@ You've gained [totalkarma] total karma in your time here.
"}
else
to_chat(usr, "Your ckey ([dbckey]) was not found.")
+/client/proc/queryErrorLog(err = null, errType)
+ log_game("SQL ERROR during whitelist logging ([errType]]). Error : \[[err]\]\n")
+ message_admins("SQL ERROR during whitelist logging ([errType]]). Error : \[[err]\]\n")
+
/client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'")
query.Execute()
@@ -454,10 +445,10 @@ You've gained [totalkarma] total karma in your time here.
"}
var/list/combinedlist = joblist + specieslist
if(name)
if(name in combinedlist)
- return 1
+ return TRUE
else
- return 0
+ return FALSE
else
return combinedlist
else
- return 0
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index a856e3f822f..dd7f591e3b7 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -77,7 +77,7 @@
health -= O.force * 0.75
else
if(health <= 0)
- visible_message("The bookcase is smashed apart!")
+ visible_message("The bookcase is smashed apart!")
qdel(src)
return ..()
diff --git a/code/modules/martial_arts/adminfu.dm b/code/modules/martial_arts/adminfu.dm
index a279765c980..eaec2b1c3c8 100644
--- a/code/modules/martial_arts/adminfu.dm
+++ b/code/modules/martial_arts/adminfu.dm
@@ -37,8 +37,7 @@
add_to_streak("G",D)
if(check_streak(A,D))
return 1
- D.grabbedby(A,1)
- var/obj/item/grab/G = A.get_active_hand()
+ var/obj/item/grab/G = D.grabbedby(A,1)
if(G)
G.state = GRAB_NECK
diff --git a/code/modules/martial_arts/brawling.dm b/code/modules/martial_arts/brawling.dm
index b326e9f8b33..f7c4d307968 100644
--- a/code/modules/martial_arts/brawling.dm
+++ b/code/modules/martial_arts/brawling.dm
@@ -53,8 +53,7 @@
A.visible_message("[A] tries to grab ahold of [D], but fails!", \
"You fail to grab ahold of [D]!")
return 1
- D.grabbedby(A,1)
- var/obj/item/grab/G = A.get_active_hand()
+ var/obj/item/grab/G = D.grabbedby(A,1)
if(G)
D.visible_message("[A] grabs ahold of [D] drunkenly!", \
"[A] grabs ahold of [D] drunkenly!")
diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm
index a6cd25d50c0..38f1dba77b9 100644
--- a/code/modules/martial_arts/sleeping_carp.dm
+++ b/code/modules/martial_arts/sleeping_carp.dm
@@ -108,8 +108,7 @@
add_to_streak("G",D)
if(check_streak(A,D))
return 1
- D.grabbedby(A,1)
- var/obj/item/grab/G = A.get_active_hand()
+ var/obj/item/grab/G = D.grabbedby(A,1)
if(G)
G.state = GRAB_AGGRESSIVE //Instant aggressive grab
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index bf9c5a67783..852bcd3edf3 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -664,6 +664,9 @@
var/turf/T = get_turf(H)
T.add_vomit_floor(H)
playsound(H, 'sound/effects/splat.ogg', 50, 1)
+ else
+ visible_message("[src] flickers and fails, due to bluespace interference!")
+ qdel(src)
/**********************Resonator**********************/
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
index 59d3a715f32..1e0f73cd995 100644
--- a/code/modules/mining/lavaland/loot/colossus_loot.dm
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -12,7 +12,7 @@
unacidable = 1
burn_state = LAVA_PROOF | FIRE_PROOF
pixel_y = -4
- use_power = 0
+ use_power = NO_POWER_USE
var/memory_saved = FALSE
var/list/stored_items = list()
var/static/list/blacklist = typecacheof(list(/obj/item/spellbook))
@@ -97,7 +97,7 @@
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "anomaly_crystal"
luminosity = 8
- use_power = 0
+ use_power = NO_POWER_USE
density = 1
burn_state = LAVA_PROOF | FIRE_PROOF
unacidable = 1
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 623f5b6b353..6c4e847fe32 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -24,15 +24,20 @@
return target
// All mobs should have custom emote, really..
-/mob/proc/custom_emote(var/m_type=1,var/message = null)
+/mob/proc/custom_emote(var/m_type=EMOTE_VISUAL,var/message = null)
if(stat || !use_me && usr == src)
if(usr)
to_chat(usr, "You are unable to emote.")
return
- var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
- if(m_type == 2 && muzzled) return
+ var/muzzled = is_muzzled()
+ if(muzzled)
+ var/obj/item/clothing/mask/muzzle/M = wear_mask
+ if(m_type == EMOTE_SOUND && M.mute >= MUZZLE_MUTE_MUFFLE)
+ return //Not all muzzles block sound
+ if(m_type == EMOTE_SOUND && !can_speak())
+ return
var/input
if(!message)
@@ -63,7 +68,7 @@
// Type 1 (Visual) emotes are sent to anyone in view of the item
- if(m_type & 1)
+ if(m_type & EMOTE_VISUAL)
var/list/can_see = get_mobs_in_view(1,src) //Allows silicon & mmi mobs carried around to see the emotes of the person carrying them around.
can_see |= viewers(src,null)
for(var/mob/O in can_see)
@@ -80,7 +85,7 @@
// Type 2 (Audible) emotes are sent to anyone in hear range
// of the *LOCATION* -- this is important for pAIs to be heard
- else if(m_type & 2)
+ else if(m_type & EMOTE_SOUND)
for(var/mob/O in get_mobs_in_view(7,src))
if(O.status_flags & PASSEMOTES)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 57be913c699..6c11ee7a3a4 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -1,6 +1,6 @@
// At minimum every mob has a hear_say proc.
-/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
+/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(!client)
return 0
@@ -70,12 +70,12 @@
if(speaker == src)
to_chat(src, "You cannot hear yourself speak!")
else
- to_chat(src, "[speaker_name][alt_name] talks but you cannot hear [speaker.p_them()].")
+ to_chat(src, "[speaker_name][speaker.GetAltName()] talks but you cannot hear [speaker.p_them()].")
else
if(language)
- to_chat(src, "[speaker_name][alt_name] [track][language.format_message(message, verb)]")
+ to_chat(src, "[speaker_name][speaker.GetAltName()] [track][language.format_message(message, verb)]")
else
- to_chat(src, "[speaker_name][alt_name] [track][verb], \"[message]\"")
+ to_chat(src, "[speaker_name][speaker.GetAltName()] [track][verb], \"[message]\"")
if(speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z))
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
src.playsound_local(source, speech_sound, sound_vol, 1)
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 4c01ac1a4a5..5ff0ea8e28b 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -83,7 +83,7 @@
//This is probably the main one you need to know :)
//Just puts stuff on the floor for most mobs, since all mobs have hands but putting stuff in the AI/corgi/ghost hand is VERY BAD.
/mob/proc/put_in_hands(obj/item/W)
- W.forceMove(get_turf(src))
+ W.forceMove(drop_location())
W.layer = initial(W.layer)
W.plane = initial(W.plane)
W.dropped()
@@ -137,7 +137,7 @@
if(I)
if(client)
client.screen -= I
- I.forceMove(loc)
+ I.forceMove(drop_location())
I.dropped(src)
if(I)
I.layer = initial(I.layer)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index ddac1cc18e9..adf81753827 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -66,7 +66,7 @@
#define MAX_ALIEN_LEAP_DIST 7
/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(var/atom/A)
- if(pounce_cooldown)
+ if(pounce_cooldown > world.time)
to_chat(src, "You are too fatigued to pounce right now!")
return
@@ -114,9 +114,7 @@
Weaken(2, 1, 1)
toggle_leap(0)
- pounce_cooldown = !pounce_cooldown
- spawn(pounce_cooldown_time) //3s by default
- pounce_cooldown = !pounce_cooldown
+ pounce_cooldown = world.time + pounce_cooldown_time
else if(A.density && !A.CanPass(src))
visible_message("[src] smashes into [A]!", "[src] smashes into [A]!")
Weaken(2, 1, 1)
diff --git a/code/modules/mob/living/carbon/brain/MMI_radio.dm b/code/modules/mob/living/carbon/brain/MMI_radio.dm
index 6eeaa44a42c..7064b4a2a82 100644
--- a/code/modules/mob/living/carbon/brain/MMI_radio.dm
+++ b/code/modules/mob/living/carbon/brain/MMI_radio.dm
@@ -3,3 +3,4 @@
desc = "Enables radio capability on MMIs when either installed directly on the MMI, or through a cyborg's chassis."
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade1"
+ origin_tech = "programming=3;biotech=2;engineering=2"
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index 907a2e4862d..f2a15119156 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -29,7 +29,7 @@
to_chat(usr, "You cannot speak, as your internal speaker is turned off.")
. = FALSE
-/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
+/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios)
switch(message_mode)
if("headset")
var/radio_worked = 0 // If any of the radios our brainmob could use functioned, this is set true so that we don't use any others
@@ -45,6 +45,6 @@
radio_worked = c.radio.talk_into(src, message, message_mode, verb, speaking)
return radio_worked
if("whisper")
- whisper_say(message, speaking, alt_name)
+ whisper_say(message, speaking)
return 1
else return 0
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 4b00bf832c8..81f386a3364 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -78,6 +78,10 @@
#undef STOMACH_ATTACK_DELAY
+/mob/living/carbon/proc/has_mutated_organs()
+ return FALSE
+
+
/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1)
if(src.is_muzzled())
if(message)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index c1eb8641820..69653dfe1e8 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -10,6 +10,10 @@
act = copytext(act, 1, t1)
var/muzzled = is_muzzled()
+ if(muzzled)
+ var/obj/item/clothing/mask/muzzle/M = wear_mask
+ if(M.mute == MUZZLE_MUTE_NONE)
+ muzzled = 0 //Not all muzzles block sound
if(!can_speak())
muzzled = 1
//var/m_type = 1
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 3f36b8b6d55..d718e7e95d3 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1328,7 +1328,7 @@
dna.species.create_organs(src)
for(var/thing in kept_items)
- equip_to_slot_or_del(thing, kept_items[thing])
+ equip_to_slot_if_possible(thing, kept_items[thing], redraw_mob = 0)
//Handle default hair/head accessories for created mobs.
var/obj/item/organ/external/head/H = get_organ("head")
@@ -1615,6 +1615,12 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
else
return FALSE
+/mob/living/carbon/human/has_mutated_organs()
+ for(var/obj/item/organ/external/E in bodyparts)
+ if(E.status & ORGAN_MUTATED)
+ return TRUE
+ return FALSE
+
/mob/living/carbon/human/InCritical()
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 80c128ee07f..ddfce48f6ce 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -88,21 +88,21 @@
return amount
-/mob/living/carbon/human/adjustBruteLoss(amount, damage_source)
+/mob/living/carbon/human/adjustBruteLoss(amount, damage_source, robotic=0)
if(dna.species)
amount = amount * dna.species.brute_mod
if(amount > 0)
take_overall_damage(amount, 0, used_weapon = damage_source)
else
- heal_overall_damage(-amount, 0)
+ heal_overall_damage(-amount, 0, 0, robotic)
-/mob/living/carbon/human/adjustFireLoss(amount, damage_source)
+/mob/living/carbon/human/adjustFireLoss(amount, damage_source, robotic=0)
if(dna.species)
amount = amount * dna.species.burn_mod
if(amount > 0)
take_overall_damage(0, amount, used_weapon = damage_source)
else
- heal_overall_damage(0, -amount)
+ heal_overall_damage(0, -amount, 0, robotic)
/mob/living/carbon/human/proc/adjustBruteLossByPart(amount, organ_name, obj/damage_source = null)
if(dna.species)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 6c2bb844155..b8e209498c2 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -178,7 +178,7 @@ emp_act
/mob/living/carbon/human/grabbedby(mob/living/user)
if(w_uniform)
w_uniform.add_fingerprint(user)
- ..()
+ return ..()
//Returns 1 if the attack hit, 0 if it missed.
/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone)
diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm
index 8e8c2c80013..06df994df5f 100644
--- a/code/modules/mob/living/carbon/human/interactive/functions.dm
+++ b/code/modules/mob/living/carbon/human/interactive/functions.dm
@@ -630,7 +630,7 @@
var/obj/item/reagent_containers/food/snacks/newSnack = new chosenType(get_turf(src))
TARGET = newSnack
newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1)
- newSnack.name = "Synthetic [newSnack.name]"
+ newSnack.name = "synthetic [newSnack.name]"
custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!")
catch(var/exception/e)
log_runtime(e, src, "Caught in SNPC cooking module")
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index 763a5ef15be..d8d469cfd57 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -581,7 +581,7 @@
saveVoice()
..()
-/mob/living/carbon/human/interactive/hear_say(message, verb = "says", datum/language/language = null, alt_name = "", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol)
+/mob/living/carbon/human/interactive/hear_say(message, verb = "says", datum/language/language = null, italics = 0, mob/speaker = null, sound/speech_sound, sound_vol)
if(!istype(speaker, /mob/living/carbon/human/interactive))
knownStrings |= html_decode(message)
..()
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 7d408ce9199..a9f93f3d441 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,10 +1,10 @@
/mob/living/carbon/human/say(var/message, var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE)
- var/alt_name = ""
+ ..(message, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here.
+/mob/living/carbon/human/GetAltName()
if(name != GetVoice())
- alt_name = " (as [get_id_name("Unknown")])"
-
- ..(message, alt_name = alt_name, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here.
+ return " (as [get_id_name("Unknown")])"
+ return ..()
/mob/living/carbon/human/proc/forcesay(list/append)
if(stat == CONSCIOUS)
@@ -160,7 +160,7 @@
returns[3] = speech_problem_flag
return returns
-/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
+/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios)
switch(message_mode)
if("intercom")
for(var/obj/item/radio/intercom/I in view(1, src))
@@ -203,7 +203,7 @@
R.talk_into(src, message, null, verb, speaking)
if("whisper")
- whisper_say(message, speaking, alt_name)
+ whisper_say(message, speaking)
return 1
else
if(message_mode)
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index c11d84451f9..cb1d9b55319 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -253,8 +253,8 @@
if(H.status_flags & GOTTAGOFAST)
. -= 1
- if(H.status_flags & GOTTAGOREALLYFAST)
- . -= 2
+ if(H.status_flags & GOTTAGOFAST_METH)
+ . -= 1
return .
/datum/species/proc/on_species_gain(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm
index fa3e4e321a9..a27f7fee103 100644
--- a/code/modules/mob/living/carbon/human/species/machine.dm
+++ b/code/modules/mob/living/carbon/human/species/machine.dm
@@ -127,9 +127,26 @@
if((head_organ.dna.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
+ var/file = file2text("config/custom_sprites.txt") //Pulls up the custom_sprites list
+ var/lines = splittext(file, "\n")
+
+ for(var/line in lines) // Looks for lines set up as screen:ckey:screen_name
+ var/list/Entry = splittext(line, ":") // split lines
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i]) // Cleans up lines
+ if(Entry.len != 3 || Entry[1] != "screen") // Ignore entries that aren't for screens
+ continue
+ if(Entry[2] == H.ckey) // They're in the list? Custom sprite time, var and icon change required
+ hair += Entry[3] // Adds custom screen to list
+
var/new_style = input(H, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
+ var/new_color = input("Please select hair color.", "Monitor Color", head_organ.hair_colour) as null|color
+
if(H.incapacitated())
- to_chat(src, "You were interrupted while changing your monitor display.")
+ to_chat(H, "You were interrupted while changing your monitor display.")
return
+
if(new_style)
- H.change_hair(new_style)
\ No newline at end of file
+ H.change_hair(new_style, 1) // The 1 is to enable custom sprites
+ if(new_color)
+ H.change_hair_color(new_color)
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index b49dd88d8e6..82c875444d2 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -83,7 +83,6 @@
if("Warden","Security Officer","Security Pod Pilot")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
- H.equip_or_collect(new /obj/item/gun/energy/gun/advtaser(H), slot_in_backpack)
if("Internal Affairs Agent")
suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
@@ -93,7 +92,6 @@
if("Head of Security")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
- H.equip_or_collect(new /obj/item/gun/energy/gun(H), slot_in_backpack)
if("Captain", "Blueshield")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
@@ -106,7 +104,6 @@
if("Medical Doctor","Brig Physician","Virologist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
- H.equip_or_collect(new /obj/item/flashlight/pen(H), slot_in_backpack)
if("Paramedic")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm
index 1bc0b8b3b9e..d01f1ccf6fe 100644
--- a/code/modules/mob/living/carbon/human/species/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/vox.dm
@@ -84,16 +84,21 @@
/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H)
if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
H.unEquip(H.wear_mask)
- H.unEquip(H.l_hand)
H.equip_or_collect(new /obj/item/clothing/mask/breath/vox(H), slot_wear_mask)
var/tank_pref = H.client && H.client.prefs ? H.client.prefs.speciesprefs : null
+ var/obj/item/tank/internal_tank
if(tank_pref)//Diseasel, here you go
- H.equip_or_collect(new /obj/item/tank/nitrogen(H), slot_l_hand)
+ internal_tank = new /obj/item/tank/nitrogen(H)
else
- H.equip_or_collect(new /obj/item/tank/emergency_oxygen/vox(H), slot_l_hand)
- to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.")
- H.internal = H.l_hand
+ internal_tank = new /obj/item/tank/emergency_oxygen/vox(H)
+ if(!H.equip_to_appropriate_slot(internal_tank))
+ if(!H.put_in_any_hand_if_possible(internal_tank))
+ H.unEquip(H.l_hand)
+ H.equip_or_collect(internal_tank, slot_l_hand)
+ to_chat(H, "Could not find an empty slot for internals! Please report this as a bug")
+ H.internal = internal_tank
+ to_chat(H, "You are now running on nitrogen internals from the [internal_tank]. Your species finds oxygen toxic, so you must breathe nitrogen only.")
H.update_action_buttons_icon()
/datum/species/vox/on_species_gain(mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 5b0c7813ef3..4e74688e10f 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -1,10 +1,5 @@
//Lallander was here
/mob/living/carbon/human/whisper(message as text)
- var/alt_name = ""
-
- if(name != GetVoice())
- alt_name = "(as [get_id_name("Unknown")])"
-
message = trim_strip_html_properly(message) //bit of duplicate code, acceptable because the workaround would be annoying
//parse the language code and consume it
@@ -23,4 +18,4 @@
message = trim_left(message)
message = handle_autohiss(message, speaking)
- whisper_say(message, speaking, alt_name)
\ No newline at end of file
+ whisper_say(message, speaking)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm
index 6d47231792b..04416e945ee 100644
--- a/code/modules/mob/living/carbon/slime/say.dm
+++ b/code/modules/mob/living/carbon/slime/say.dm
@@ -14,7 +14,7 @@
return 1
return ..()
-/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
+/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(speaker in Friends)
speech_buffer = list()
speech_buffer.Add(speaker)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 55e8536cd10..2f6bb4628c3 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -95,10 +95,10 @@ proc/get_radio_key_from_channel(var/channel)
returns[3] = speech_problem_flag
return returns
-/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios)
switch(message_mode)
if("whisper") //all mobs can whisper by default
- whisper_say(message, speaking, alt_name)
+ whisper_say(message, speaking)
return 1
return 0
@@ -109,7 +109,7 @@ proc/get_radio_key_from_channel(var/channel)
return returns
-/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name = "", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE)
+/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE)
if(client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot speak in IC (Muted).")
@@ -184,7 +184,7 @@ proc/get_radio_key_from_channel(var/channel)
return 0
var/list/used_radios = list()
- if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name))
+ if(handle_message_mode(message_mode, message, verb, speaking, used_radios))
return 1
var/list/handle_v = handle_speech_sound()
@@ -268,7 +268,7 @@ proc/get_radio_key_from_channel(var/channel)
var/speech_bubble_test = say_test(message)
for(var/mob/M in listening)
- M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)
+ M.hear_say(message, verb, speaking, italics, src, speech_sound, sound_vol)
if(M.client)
speech_bubble_recipients.Add(M.client)
spawn(0)
@@ -359,7 +359,7 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/proc/get_whisper_loc()
return src
-/mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers")
+/mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/verb="whispers")
if(client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot speak in IC (Muted).")
@@ -381,6 +381,7 @@ proc/get_radio_key_from_channel(var/channel)
var/eavesdropping_range = 2
var/watching_range = 5
var/italics = 1
+ var/adverb_added = FALSE
var/not_heard //the message displayed to people who could not hear the whispering
if(speaking)
@@ -389,6 +390,7 @@ proc/get_radio_key_from_channel(var/channel)
not_heard = "[verb] something"
else
var/adverb = pick("quietly", "softly")
+ adverb_added = TRUE
verb = "[speaking.speech_verb] [adverb]"
not_heard = "[speaking.speech_verb] something [adverb]"
else
@@ -404,7 +406,7 @@ proc/get_radio_key_from_channel(var/channel)
if(verb == "yells loudly")
verb = "slurs emphatically"
- else if(speech_problem_flag)
+ else if(speech_problem_flag && !adverb_added)
var/adverb = pick("quietly", "softly")
verb = "[verb] [adverb]"
@@ -464,14 +466,14 @@ proc/get_radio_key_from_channel(var/channel)
var/speech_bubble_test = say_test(message)
for(var/mob/M in listening)
- M.hear_say(message, verb, speaking, alt_name, italics, src)
+ M.hear_say(message, verb, speaking, italics, src)
if(M.client)
speech_bubble_recipients.Add(M.client)
if(eavesdropping.len)
var/new_message = stars(message) //hopefully passing the message twice through stars() won't hurt... I guess if you already don't understand the language, when they speak it too quietly to hear normally you would be able to catch even less.
for(var/mob/M in eavesdropping)
- M.hear_say(new_message, verb, speaking, alt_name, italics, src)
+ M.hear_say(new_message, verb, speaking, italics, src)
if(M.client)
speech_bubble_recipients.Add(M.client)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index c0393d78f92..cf9102858bd 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -69,7 +69,7 @@ var/list/ai_verbs_default = list(
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE
var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
- var/malf_cooldown = 0 //Cooldown var for malf modules
+ var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown
var/obj/machinery/power/apc/malfhack = null
var/explosive = 0 //does the AI explode when it dies?
@@ -281,7 +281,7 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply
name="\improper AI power supply"
active_power_usage=1000
- use_power = 2
+ use_power = ACTIVE_POWER_USE
power_channel = EQUIP
var/mob/living/silicon/ai/powered_ai = null
invisibility = 100
@@ -303,9 +303,9 @@ var/list/ai_verbs_default = list(
return
if(!powered_ai.anchored)
loc = powered_ai.loc
- use_power = 0
+ use_power = NO_POWER_USE
if(powered_ai.anchored)
- use_power = 2
+ use_power = ACTIVE_POWER_USE
/mob/living/silicon/ai/proc/pick_icon()
set category = "AI Commands"
@@ -1250,7 +1250,7 @@ var/list/ai_verbs_default = list(
else
to_chat(src, "Target is not on or near any active cameras on the station.")
-
+
/mob/living/silicon/ai/handle_fire()
return
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 2728a1af55e..98b97ed0602 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -137,6 +137,6 @@
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
-/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
+/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(relay_speech)
ai.relay_speech(speaker, message, verb, language)
diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm
index 41d4c67427d..b0f498014d8 100644
--- a/code/modules/mob/living/silicon/pai/death.dm
+++ b/code/modules/mob/living/silicon/pai/death.dm
@@ -7,7 +7,7 @@
var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
- M.show_message("[src] emits a dull beep before it loses power and collapses.", 3, "You hear a dull beep followed by the sound of glass crunching.", 2)
+ M.show_message("[src] emits a dull beep before it loses power and collapses.", 3, "You hear a dull beep followed by the sound of glass crunching.", 2)
name = "pAI debris"
desc = "The unfortunate remains of some poor personal AI device."
icon_state = "[chassis]_dead"
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index d28ce620a0c..d635422073f 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -324,11 +324,11 @@
return
if(loc != card)
- to_chat(src, "You are already in your mobile form!")
+ to_chat(src, "You are already in your mobile form!")
return
if(world.time <= last_special)
- to_chat(src, "You must wait before folding your chassis out again!")
+ to_chat(src, "You must wait before folding your chassis out again!")
return
last_special = world.time + 200
@@ -336,7 +336,7 @@
//I'm not sure how much of this is necessary, but I would rather avoid issues.
force_fold_out()
- visible_message("[src] folds outwards, expanding into a mobile form.", "You fold outwards, expanding into a mobile form.")
+ visible_message("[src] folds outwards, expanding into a mobile form.", "You fold outwards, expanding into a mobile form.")
/mob/living/silicon/pai/proc/force_fold_out()
if(istype(card.loc, /mob))
@@ -359,11 +359,11 @@
return
if(loc == card)
- to_chat(src, "You are already in your card form!")
+ to_chat(src, "You are already in your card form!")
return
if(world.time <= last_special)
- to_chat(src, "You must wait before returning to your card form!")
+ to_chat(src, "You must wait before returning to your card form!")
return
close_up()
@@ -494,7 +494,7 @@
if(loc == card)
return
- visible_message("[src] neatly folds inwards, compacting down to a rectangular card.", "You neatly fold inwards, compacting down to a rectangular card.")
+ visible_message("[src] neatly folds inwards, compacting down to a rectangular card.", "You neatly fold inwards, compacting down to a rectangular card.")
stop_pulling()
reset_perspective(card)
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index f330dddf1a3..2d52af6e89d 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -65,7 +65,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if("name")
t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text
if(t)
- candidate.name = sanitize(copytext(t,1,MAX_NAME_LEN))
+ candidate.name = reject_bad_name(sanitize(copytext(t,1,MAX_NAME_LEN)))
if("desc")
t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message
if(t)
@@ -84,7 +84,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
candidate.savefile_load(usr)
//In case people have saved unsanitized stuff.
if(candidate.name)
- candidate.name = sanitize(copytext(candidate.name,1,MAX_NAME_LEN))
+ candidate.name = reject_bad_name(sanitize(copytext(candidate.name,1,MAX_NAME_LEN)))
if(candidate.description)
candidate.description = sanitize(copytext(candidate.description,1,MAX_MESSAGE_LEN))
if(candidate.role)
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index cc5108d89f8..dfdaac8015c 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -163,7 +163,7 @@
icon_state = "radio"
//
-//Robotic Component Analyser, basically a health analyser for robots
+//Robotic Component Analyzer, basically a health analyzer for robots
//
/obj/item/robotanalyzer
name = "cyborg analyzer"
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index adf6e2f7682..88d566ad692 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -281,7 +281,7 @@
grabbed_something = 1
if(grabbed_something)
- to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].")
+ to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].")
else
to_chat(user, "Nothing on \the [T] is useful to you.")
return
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index 790ecaa399a..9bf388fe5fe 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -4,7 +4,7 @@
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 20
active_power_usage = 5000
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
index 053384baba5..779b3a2de14 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
@@ -1,7 +1,7 @@
/mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null)
if(copytext(message, 1, 2) == "*")
return emote(copytext(message, 2))
-
+
if(!speaking)
speaking = parse_language(message)
if(!speaking)
@@ -10,6 +10,6 @@
if(speaking)
return ..()
-/mob/living/silicon/robot/drone/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers")
+/mob/living/silicon/robot/drone/whisper_say(var/message, var/datum/language/speaking = null, var/verb="whispers")
say(message) //drones do not get to whisper, only speak normally
return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index f284a0b250c..d590892cc01 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -20,6 +20,9 @@
contents -= O
if(module)
O.loc = module //Return item to module so it appears in its contents, so it can be taken out again.
+ for(var/X in O.actions) // Remove assocated actions
+ var/datum/action/A = X
+ A.Remove(src)
if(module_active == O)
module_active = null
@@ -56,6 +59,7 @@
O.plane = HUD_PLANE
O.screen_loc = inv1.screen_loc
contents += O
+ set_actions(O)
else if(!module_state_2)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_2 = O
@@ -63,6 +67,7 @@
O.plane = HUD_PLANE
O.screen_loc = inv2.screen_loc
contents += O
+ set_actions(O)
else if(!module_state_3)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_3 = O
@@ -70,10 +75,16 @@
O.plane = HUD_PLANE
O.screen_loc = inv3.screen_loc
contents += O
+ set_actions(O)
else
to_chat(src, "You need to disable a module first!")
update_icons()
+/mob/living/silicon/robot/proc/set_actions(obj/item/I)
+ for(var/X in I.actions)
+ var/datum/action/A = X
+ A.Grant(src)
+
/mob/living/silicon/robot/proc/uneq_active()
uneq_module(module_active)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 755b874667a..86968bcf6c3 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -51,6 +51,7 @@ var/list/robot_verbs_default = list(
var/opened = 0
var/custom_panel = null
var/list/custom_panel_names = list("Cricket")
+ var/list/custom_eye_names = list("Cricket","Standard")
var/emagged = 0
var/is_emaggable = TRUE
var/eye_protection = 0
@@ -290,7 +291,7 @@ var/list/robot_verbs_default = list(
if(N.kickoff)
modules = list("Nations")
if(mmi != null && mmi.alien)
- modules = "Hunter"
+ modules = list("Hunter")
modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules
if(!modtype)
return
@@ -306,7 +307,7 @@ var/list/robot_verbs_default = list(
module.channels = list("Service" = 1)
module_sprites["Basic"] = "robot_old"
module_sprites["Android"] = "droid"
- module_sprites["Default"] = "robot"
+ module_sprites["Default"] = "Standard"
module_sprites["Noble-STD"] = "Noble-STD"
if("Service")
@@ -317,7 +318,7 @@ var/list/robot_verbs_default = list(
module_sprites["Bro"] = "Brobot"
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
- module_sprites["Standard"] = "robotServ"
+ module_sprites["Standard"] = "Standard-Serv"
module_sprites["Noble-SRV"] = "Noble-SRV"
module_sprites["Cricket"] = "Cricket-SERV"
@@ -329,7 +330,7 @@ var/list/robot_verbs_default = list(
module_sprites["Basic"] = "Miner_old"
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
- module_sprites["Standard"] = "robotMine"
+ module_sprites["Standard"] = "Standard-Mine"
module_sprites["Noble-DIG"] = "Noble-DIG"
module_sprites["Cricket"] = "Cricket-MINE"
@@ -342,7 +343,7 @@ var/list/robot_verbs_default = list(
module_sprites["Surgeon"] = "surgeon"
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
- module_sprites["Standard"] = "robotMedi"
+ module_sprites["Standard"] = "Standard-Medi"
module_sprites["Noble-MED"] = "Noble-MED"
module_sprites["Cricket"] = "Cricket-MEDI"
status_flags &= ~CANPUSH
@@ -354,7 +355,7 @@ var/list/robot_verbs_default = list(
module_sprites["Red Knight"] = "Security"
module_sprites["Black Knight"] = "securityrobot"
module_sprites["Bloodhound"] = "bloodhound"
- module_sprites["Standard"] = "robotSecy"
+ module_sprites["Standard"] = "Standard-Secy"
module_sprites["Noble-SEC"] = "Noble-SEC"
module_sprites["Cricket"] = "Cricket-SEC"
status_flags &= ~CANPUSH
@@ -367,7 +368,7 @@ var/list/robot_verbs_default = list(
module_sprites["Basic"] = "Engineering"
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
- module_sprites["Standard"] = "robotEngi"
+ module_sprites["Standard"] = "Standard-Engi"
module_sprites["Noble-ENG"] = "Noble-ENG"
module_sprites["Cricket"] = "Cricket-ENGI"
magpulse = 1
@@ -378,7 +379,7 @@ var/list/robot_verbs_default = list(
module_sprites["Basic"] = "JanBot2"
module_sprites["Mopbot"] = "janitorrobot"
module_sprites["Mop Gear Rex"] = "mopgearrex"
- module_sprites["Standard"] = "robotJani"
+ module_sprites["Standard"] = "Standard-Jani"
module_sprites["Noble-CLN"] = "Noble-CLN"
module_sprites["Cricket"] = "Cricket-JANI"
@@ -394,7 +395,6 @@ var/list/robot_verbs_default = list(
if("Hunter")
module = new /obj/item/robot_module/alien/hunter(src)
- icon = "icons/mob/alien.dmi"
icon_state = "xenoborg-state-a"
modtype = "Xeno-Hu"
feedback_inc("xeborg_hunter",1)
@@ -871,7 +871,10 @@ var/list/robot_verbs_default = list(
overlays.Cut()
if(stat != DEAD && !(paralysis || stunned || weakened || low_power_mode)) //Not dead, not stunned.
- overlays += "eyes-[icon_state]"
+ if(custom_panel in custom_eye_names)
+ overlays += "eyes-[custom_panel]"
+ else
+ overlays += "eyes-[icon_state]"
else
overlays -= "eyes"
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 0a3ed47b933..48297dbb401 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -1,12 +1,13 @@
-/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios)
log_say(message, src)
if(..())
return 1
-/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios)
if(..())
return 1
if(message_mode)
+ used_radios += radio
if(!is_component_functioning("radio"))
to_chat(src, "Your radio isn't functional at this time.")
return 0
@@ -14,12 +15,14 @@
message_mode = null
return radio.talk_into(src,message,message_mode,verb,speaking)
-/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios)
if(..())
return 1
if(message_mode == "department")
+ used_radios += aiRadio
return holopad_talk(message, verb, speaking)
else if(message_mode)
+ used_radios += aiRadio
if(aiRadio.disabledAi || aiRestorePowerRoutine || stat)
to_chat(src, "System Error - Transceiver Disabled.")
return 0
@@ -27,15 +30,16 @@
message_mode = null
return aiRadio.talk_into(src,message,message_mode,verb,speaking)
-/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios)
if(..())
return 1
else if(message_mode == "whisper")
- whisper_say(message, speaking, alt_name)
+ whisper_say(message, speaking)
return 1
else if(message_mode)
if(message_mode == "general")
message_mode = null
+ used_radios += radio
return radio.talk_into(src,message,message_mode,verb,speaking)
/mob/living/silicon/say_quote(var/text)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 5e79c315f42..7f5c1916619 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -889,7 +889,7 @@ Pass a positive integer as an argument to override a bot's default speed.
// Machinery to simplify topic and access calls
/obj/machinery/bot_core
- use_power = 0
+ use_power = NO_POWER_USE
var/mob/living/simple_animal/bot/owner = null
/obj/machinery/bot_core/New(loc)
@@ -1106,4 +1106,4 @@ Pass a positive integer as an argument to override a bot's default speed.
var/image/I = path[path[1]]
if(I)
I.icon = null
- path.Cut(1, 2)
\ No newline at end of file
+ path.Cut(1, 2)
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 90c44f19286..085f9e2bd3d 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -44,7 +44,7 @@
icon_state = "ed209_frame"
item_state = "ed209_frame"
var/build_step = 0
- var/created_name = "ED-209 Security Robot" //To preserve the name if it's a unique securitron I guess
+ var/created_name = "\improper ED-209 Security Robot" //To preserve the name if it's a unique securitron I guess
var/lasercolor = ""
/obj/item/ed209_assembly/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 0efaefcce07..619d0316349 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -694,7 +694,7 @@
/mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H)
add_attack_logs(src, H, "Run over (DAMTYPE: [uppertext(BRUTE)])")
H.visible_message("[src] drives over [H]!", \
- "[src] drives over you!")
+ "[src] drives over you!")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/damage = rand(5,15)
@@ -706,10 +706,14 @@
H.apply_damage(0.5*damage, BRUTE, "r_arm", run_armor_check("r_arm", "melee"))
- var/turf/T = get_turf(src)
- H.add_mob_blood(H)
- H.add_splatter_floor(T)
+
+ if(NO_BLOOD in H.dna.species.species_traits)//Does the run over mob have blood?
+ return//If it doesn't it shouldn't bleed (Though a check should be made eventually for things with liquid in them, like slime people, vox armalis, etc.)
+
+ var/turf/T = get_turf(src)//Where are we?
+ H.add_mob_blood(H)//Cover the victim in their own blood.
+ H.add_splatter_floor(T)//Put the blood where we are.
bloodiness += 4
var/list/blood_dna = H.get_blood_dna_list()
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index ef5de1908a8..451f21ce09a 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -175,7 +175,7 @@ Auto Patrol: []"},
mode = BOT_HUNT
/mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H)
- if(H.a_intent == INTENT_HARM)
+ if(H.a_intent == INTENT_HARM || H.a_intent == INTENT_DISARM)
retaliate(H)
return ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 2514af0eebd..bda169fe576 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -78,7 +78,7 @@
to_chat(user, "[src] is wearing too much armor! You can't cause [p_them()] any damage.")
visible_message(" [user] hits [src] with [O], however [src] is too armored.")
else
- to_chat(user, "[src] is wearing too much armor! You can't reach [p_their()] skin.")
+ to_chat(user, "[src] is wearing too much armor! You can't reach [p_their()] skin.")
visible_message("[user] gently taps [src] with [O].")
if(health>0 && prob(15))
custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.")
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index a7a62c74c0b..762dea31272 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -146,3 +146,55 @@
response_disarm = "gently pushes aside"
response_harm = "splats"
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+
+
+/mob/living/simple_animal/mouse/blobinfected
+ maxHealth = 100
+ health = 100
+ 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
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ var/cycles_alive = 0
+ var/cycles_limit = 30
+ var/has_burst = FALSE
+
+/mob/living/simple_animal/mouse/blobinfected/Life()
+ cycles_alive++
+ var/timeleft = (cycles_limit - cycles_alive) * 2
+ if(ismob(loc)) // if someone ate it, burst immediately
+ burst(FALSE)
+ else if(timeleft < 1) // if timer expired, burst.
+ burst(FALSE)
+ else if(cycles_alive % 2 == 0) // give the mouse/player a countdown reminder every 2 cycles
+ to_chat(src, "[timeleft] seconds until you burst, and become a blob...")
+ return ..()
+
+/mob/living/simple_animal/mouse/blobinfected/death(gibbed)
+ burst(gibbed)
+ return ..(gibbed)
+
+/mob/living/simple_animal/mouse/blobinfected/proc/burst(gibbed)
+ if(has_burst)
+ return FALSE
+ var/turf/T = get_turf(src)
+ if(!is_station_level(T.z) || isspaceturf(T))
+ to_chat(src, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!")
+ return FALSE
+ has_burst = TRUE
+ var/datum/mind/blobmind = mind
+ var/client/C = client
+ if(istype(blobmind) && istype(C))
+ blobmind.special_role = SPECIAL_ROLE_BLOB
+ var/obj/structure/blob/core/core = new(T, 200, C, 3)
+ core.lateblobtimer()
+ else
+ new /obj/structure/blob/core(T) // Ghosts will be prompted to control it.
+ if(ismob(loc)) // in case some taj/etc ate the mouse.
+ var/mob/M = loc
+ M.gib()
+ if(!gibbed)
+ gib()
+
+/mob/living/simple_animal/mouse/blobinfected/get_scooped(mob/living/carbon/grabber)
+ to_chat(grabber, "You try to pick up [src], but they slip out of your grasp!")
+ to_chat(src, "[src] tries to pick you up, but you wriggle free of their grasp!")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index 3063c5a8ce1..9e4bae870cd 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -65,10 +65,12 @@
addtimer(CALLBACK(src, .proc/inert_check), 2400)
/obj/item/organ/internal/hivelord_core/proc/inert_check()
- if(!owner && !preserved)
- go_inert()
- else
+ if(owner)
preserved(implanted = 1)
+ else if(preserved)
+ preserved()
+ else
+ go_inert()
/obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0)
inert = FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index cdbc64eea1e..30546ecb17d 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -168,11 +168,11 @@
W.ChangeTurf(/turf/simulated/floor/plating)
new /obj/item/stack/sheet/metal(src, plasmaPoopPotential)
currentlyEating = null //ffs, unstore this
- src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing.
+ src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing.
else
currentlyEating = null
contents += noms
- src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing.
+ src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing.
if(ismob(noms))
var/mob/M = noms //typecast because noms isn't movable
M.loc = src //because just setting a mob loc to null breaks the camera and such
@@ -331,4 +331,4 @@
/mob/living/simple_animal/hostile/spaceWorm/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y)
..()
if(previousWorm)
- previousWorm.do_attack_animation(src)
\ No newline at end of file
+ previousWorm.do_attack_animation(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 894c039b3f4..875af3da359 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -51,7 +51,10 @@
var/damage = O.force
if(O.damtype == STAMINA)
damage = 0
- health -= damage
+ if(force_threshold && damage < force_threshold)
+ visible_message("[src] is unharmed by [O]!")
+ return
+ adjustHealth(damage)
visible_message("[src] has been attacked with the [O] by [user]. ")
playsound(loc, O.hitsound, 25, 1, -1)
else
@@ -125,6 +128,9 @@
seen_revived_enemy = TRUE
raise_alert("[name] reports intruder [target] has returned from death!")
depotarea.list_remove(target, depotarea.dead_list)
+ if(!atoms_share_level(src, target) && prob(20))
+ // This prevents someone from aggroing a depot mob, then hiding in a locker, perfectly safe, while the mob stands there getting killed by their friends.
+ LoseTarget()
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_action()
if(seen_enemy)
@@ -134,6 +140,14 @@
if(scan_cycles >= 15 && istype(depotarea))
scan_cycles = 0
if(!atoms_share_level(src, spawn_turf))
+ if(istype(loc, /obj/structure/closet))
+ var/obj/structure/closet/O = loc
+ forceMove(get_turf(src))
+ visible_message("[src] smashes their way out of [O]!")
+ qdel(O)
+ raise_alert("[src] reported being trapped in a locker.")
+ raised_alert = FALSE
+ return
if(alert_on_spacing)
raise_alert("[src] lost in space.")
death()
@@ -196,19 +210,14 @@
alert_on_timeout = TRUE
alert_on_shield_breach = TRUE
-/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/death()
- if(depotarea)
- depotarea.declare_finished()
- return ..()
-
-
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize()
- . = ..()
+ ..()
+ return INITIALIZE_HINT_LATELOAD
+
+/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/LateInitialize()
if(istype(depotarea))
var/list/key_candidates = list()
for(var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O in living_mob_list)
- if(O == src)
- continue
key_candidates += O
if(key_candidates.len)
var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O = pick(key_candidates)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index 693ca724ac6..b5d0a100ae3 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -171,8 +171,8 @@ var/global/list/ts_spiderling_list = list()
visible_message("[src] harmlessly nuzzles [target].")
T.CheckFaction()
CheckFaction()
- else if(istype(target, /obj/structure/spider/cocoon))
- to_chat(src, "Destroying our own cocoons would not help us.")
+ else if(istype(target, /obj/structure/spider)) // Prevents destroying coccoons (exploit), eggs (horrible misclick), etc
+ to_chat(src, "Destroying things created by fellow spiders would not help us.")
else if(istype(target, /obj/machinery/door/firedoor))
var/obj/machinery/door/firedoor/F = target
if(F.density)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index dba62b4744c..ed4c074bff0 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -703,12 +703,12 @@
available_channels = list(":e")
..()
-/mob/living/simple_animal/parrot/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
+/mob/living/simple_animal/parrot/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios)
if(message_mode && istype(ears))
ears.talk_into(src, message, message_mode, verb, speaking)
used_radios += ears
-/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
+/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null)
if(speaker != src && prob(50))
parrot_hear(html_decode(message))
..()
diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm
index f7498392c02..c7f9bdd0d96 100644
--- a/code/modules/mob/living/update_status.dm
+++ b/code/modules/mob/living/update_status.dm
@@ -49,7 +49,14 @@
// Whether the mob is capable of talking
/mob/living/can_speak()
- return !(silent || (disabilities & MUTE) || is_muzzled())
+ if(!(silent || (disabilities & MUTE)))
+ if(is_muzzled())
+ var/obj/item/clothing/mask/muzzle/M = wear_mask
+ if(M.mute >= MUZZLE_MUTE_MUFFLE)
+ return FALSE
+ return TRUE
+ else
+ return FALSE
// Whether the mob is capable of standing or not
/mob/living/proc/can_stand()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index fc09105e948..77c98392740 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -47,6 +47,9 @@
/mob/proc/generate_name()
return name
+/mob/proc/GetAltName()
+ return ""
+
/mob/proc/Cell()
set category = "Admin"
@@ -857,7 +860,7 @@ var/list/slot_equipment_priority = list( \
if(machine && in_range(src, usr))
show_inv(machine)
- if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr))
+ if(!usr.incapacitated() && in_range(src, usr))
if(href_list["item"])
var/slot = text2num(href_list["item"])
var/obj/item/what = get_item_by_slot(slot)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 46b5d1b0606..01bcb2bcc1a 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -469,7 +469,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, title = null, atom/source = null, image/alert_overlay = null, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts.
for(var/mob/dead/observer/O in player_list)
if(O.client)
- to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]")
+ to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]")
if(ghost_sound)
O << sound(ghost_sound)
if(flashwindow)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index a2586dd65a1..97a0dc9ca80 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -68,8 +68,8 @@
var/list/antags = client.prefs.be_special
if(antags && antags.len)
- if(!skip_antag) output += "Global Antag Candidancy"
- else output += "
Global Antag Candidancy"
+ if(!skip_antag) output += "
Global Antag Candidacy"
+ else output += "
Global Antag Candidacy"
output += "
You are [skip_antag ? "ineligible" : "eligible"] for all antag roles.
"
else
output += "View the Crew Manifest
"
@@ -316,12 +316,10 @@
job_master.AssignRole(src, rank, 1)
var/mob/living/character = create_character() //creates the human and transfers vars and mind
- character = job_master.EquipRank(character, rank, 1) //equips the human
- EquipCustomItems(character)
+ character = job_master.AssignRank(character, rank, 1) //equips the human
// AIs don't need a spawnpoint, they must spawn at an empty core
if(character.mind.assigned_role == "AI")
-
var/mob/living/silicon/ai/ai_character = character.AIize() // AIize the character, but don't move them yet
// IsJobAvailable for AI checks that there is an empty core available in this list
@@ -365,6 +363,9 @@
ticker.mode.latespawn(character)
+ character = job_master.EquipRank(character, rank, 1) //equips the human
+ EquipCustomItems(character)
+
if(character.mind.assigned_role == "Cyborg")
AnnounceCyborg(character, rank, join_message)
callHook("latespawn", list(character))
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 83bb2ae1322..bdf93fbd4eb 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -890,6 +890,21 @@
icon_state = "hesphiastos_alt_rainbow"
models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/fluff
+ fluff = 1
+
+/datum/sprite_accessory/hair/ipc/fluff/lumi_face //Lumi Fluff hair
+ name = "Lumi Face"
+ icon_state = "lumi_face"
+
+/datum/sprite_accessory/hair/ipc/fluff/lumi_blush //Lumi Fluff hair
+ name = "Lumi Blush"
+ icon_state = "lumi_blush"
+
+/datum/sprite_accessory/hair/ipc/fluff/lumi_waiting //Lumi Fluff hair
+ name = "Lumi Waiting"
+ icon_state = "lumi_waiting"
+
/*
///////////////////////////////////
/ =---------------------------= /
@@ -1292,6 +1307,11 @@
name = "Rough-Cropped Mane"
icon_state = "rough"
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_raine
+ name = "Raine"
+ icon_state = "vulp_hair_raine"
+ gender = FEMALE
+
/datum/sprite_accessory/hair/vox
species_allowed = list("Vox")
glasses_over = 1
@@ -1410,6 +1430,42 @@
name = "Wildflowers"
icon_state = "diona_wildflower"
+//Kidan Hairstyles, sprites by Travelling Merchant
+
+/datum/sprite_accessory/hair/kidan
+ species_allowed = list("Kidan")
+ glasses_over = 1
+ do_colouration = 0
+
+/datum/sprite_accessory/hair/kidan/hollow_horns
+ name = "Hollow Horns"
+ icon_state = "kidan_hollow_horns"
+
+/datum/sprite_accessory/hair/kidan/wide_horns
+ name = "Wide Horns"
+ icon_state = "kidan_wide_horns"
+
+/datum/sprite_accessory/hair/kidan/curled_horns
+ name = "Curled Horns"
+ icon_state = "kidan_curled_horns"
+
+/datum/sprite_accessory/hair/kidan/hawk_horn
+ name = "Hawk Horn"
+ icon_state = "kidan_hawk_horn"
+
+/datum/sprite_accessory/hair/kidan/kidan_bull_horns
+ name = "Bull Horns"
+ icon_state = "kidan_bull_horns"
+
+/datum/sprite_accessory/hair/kidan/kidan_broken_bull_horns
+ name = "Broken Bull Horns"
+ icon_state = "kidan_broken_bull_horns"
+
+/datum/sprite_accessory/hair/kidan/kidan_tall_horns
+ name = "Tall Horns"
+ icon_state = "kidan_tall_horns"
+
+
// Apollo-specific
/datum/sprite_accessory/hair/wryn
@@ -2517,6 +2573,17 @@
name = "Moth Antennae"
icon_state = "kidan_moth"
+/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Long
+ name = "Mantie Long"
+ icon_state = "kidan_Mantie_Long"
+
+/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Curled
+ name = "Mantie Curled"
+ icon_state = "kidan_Mantie_Curled"
+
+/datum/sprite_accessory/head_accessory/kidan/kidan_very_short
+ name = "Very Short"
+ icon_state = "kidan_very_short"
/* BODY MARKINGS */
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index 1cb1bc5f3b0..4cbbe9c51c9 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -210,5 +210,5 @@
return
/mob/proc/adjust_bodytemperature(amount, min_temp = 0, max_temp = INFINITY)
- if(bodytemperature > min_temp && bodytemperature < max_temp)
+ if(bodytemperature >= min_temp && bodytemperature <= max_temp)
bodytemperature = Clamp(bodytemperature + amount, min_temp, max_temp)
\ No newline at end of file
diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm
index 2ae0c251f20..436070470ea 100644
--- a/code/modules/modular_computers/NTNet/NTNet_relay.dm
+++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm
@@ -2,7 +2,7 @@
/obj/machinery/ntnet_relay
name = "NTNet Quantum Relay"
desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile."
- use_power = 2
+ use_power = ACTIVE_POWER_USE
active_power_usage = 10000 //10kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. Used to be 20 but that actually drained the smes one round
idle_power_usage = 100
icon = 'icons/obj/stationobjs.dmi'
@@ -38,9 +38,9 @@
/obj/machinery/ntnet_relay/process()
if(operable())
- use_power = 2
+ use_power = ACTIVE_POWER_USE
else
- use_power = 1
+ use_power = IDLE_POWER_USE
update_icon()
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index 832f5558cd8..36c4409fb34 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -7,7 +7,7 @@ var/list/global_modular_computers = list()
name = "modular computer"
desc = "An advanced computer."
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
var/hardware_flag = 0 // A flag that describes this device type
var/last_power_usage = 0 // Power usage during last tick
diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm
index 3be4a091301..60f711ad960 100644
--- a/code/modules/modular_computers/hardware/printer.dm
+++ b/code/modules/modular_computers/hardware/printer.dm
@@ -24,7 +24,7 @@
if(!check_functionality())
return FALSE
- var/obj/item/paper/P = new/obj/item/paper(get_turf(holder))
+ var/obj/item/paper/P = new/obj/item/paper(holder.drop_location())
// Damaged printer causes the resulting paper to be somewhat harder to read.
if(damage > damage_malfunction)
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index 7ba6ba5751a..4fe833e08ae 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -282,21 +282,9 @@ obj/machinery/lapvend/attackby(obj/item/I, mob/user)
atom_say("Insufficient funds in account.")
return 0
else
- var/paid = customer_account.charge(total_price,
- transaction_purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].",
- terminal_name = name,
- terminal_id = name,
- dest_name = vendor_account.owner_name)
+ customer_account.charge(total_price, vendor_account,
+ "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].",
+ name, customer_account.owner_name, "Sale of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].",
+ customer_account.owner_name)
- if(paid)
- vendor_account.money += total_price
- var/datum/transaction/T = new()
- T.target_name = customer_account.owner_name
- T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]"
- T.amount = "[total_price]"
- T.source_terminal = name
- T.date = current_date_string
- T.time = station_time_timestamp()
- vendor_account.transaction_log.Add(T)
- return 1
- return 0
+ return 1
diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm
index ed102005ed5..19e6dfef3f7 100644
--- a/code/modules/nano/modules/crew_monitor.dm
+++ b/code/modules/nano/modules/crew_monitor.dm
@@ -6,7 +6,7 @@
return 1
var/turf/T = get_turf(nano_host())
if(!T || !is_level_reachable(T.z))
- to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
+ to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return 0
if(href_list["track"])
if(isAI(usr))
diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm
index c97a3e505c3..a7edb67407f 100644
--- a/code/modules/ninja/martial_art.dm
+++ b/code/modules/ninja/martial_art.dm
@@ -87,8 +87,7 @@
"[A]\ puts you in a [hold_name]! You are unable to speak!")
step_to(D,get_step(D,D.dir),1)
- D.grabbedby(A, 1)
- var/obj/item/grab/G = A.get_active_hand()
+ var/obj/item/grab/G = D.grabbedby(A, 1)
if(G)
G.state = GRAB_NECK
@@ -136,8 +135,7 @@
return A.pointed(D)
/datum/martial_art/ninja_martial_art/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) //Instant aggressive grab
- D.grabbedby(A)
- var/obj/item/grab/G = A.get_active_hand()
+ var/obj/item/grab/G = D.grabbedby(A)
if(G)
G.state = GRAB_AGGRESSIVE
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 201455f7a9e..2b699c36530 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -13,7 +13,7 @@ var/list/alldepartments = list()
var/long_range_enabled = 0 // Can we send messages off the station?
req_one_access = list(access_lawyer, access_heads, access_armory)
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 30
active_power_usage = 200
@@ -207,7 +207,7 @@ var/list/alldepartments = list()
set name = "Eject ID Card"
set src in oview(1)
- if(usr.restrained())
+ if(usr.incapacitated())
return
if(scan)
diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm
index c0455b872b2..4203b5abfff 100644
--- a/code/modules/paperwork/frames.dm
+++ b/code/modules/paperwork/frames.dm
@@ -35,8 +35,6 @@
icon_state = "[icon_base]-photo"
else if(istype(displayed, /obj/structure/sign/poster))
icon_state = "[icon_base]-[(displayed.icon_state in wide_posters) ? "wposter" : "poster"]"
- else if(istype(displayed, /obj/item/canvas))
- icon_state = "[icon_base]-canvas-[displayed.icon_state]"
else
icon_state = "[icon_base]-paper"
@@ -61,7 +59,7 @@
if(istype(I, /obj/item/screwdriver))
if(displayed)
playsound(src, I.usesound, 100, 1)
- user.visible_message("[user] unfastens \the [displayed] out of \the [src].", "You unfasten \the [displayed] out of \the [src].")
+ user.visible_message("[user] unfastens \the [displayed] out of \the [src].", "You unfasten \the [displayed] out of \the [src].")
if(istype(displayed, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = displayed
@@ -72,10 +70,10 @@
name = initial(name)
update_icon()
else
- to_chat(user, "There is nothing to remove from \the [src].")
+ to_chat(user, "There is nothing to remove from \the [src].")
else if(istype(I, /obj/item/crowbar))
playsound(src, I.usesound, 100, 1)
- user.visible_message("[user] breaks down \the [src].", "You break down \the [src].")
+ user.visible_message("[user] breaks down \the [src].", "You break down \the [src].")
for(var/A in contents)
if(istype(A, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = A
@@ -91,7 +89,7 @@
insert(I)
update_icon()
else
- to_chat(user, "\The [src] already contains \a [displayed].")
+ to_chat(user, "\The [src] already contains \a [displayed].")
else
return ..()
@@ -214,10 +212,10 @@
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/screwdriver))
playsound(src, I.usesound, 100, 1)
- user.visible_message("[user] begins to unfasten \the [src] from the wall.", "You begin to unfasten \the [src] from the wall.")
+ user.visible_message("[user] begins to unfasten \the [src] from the wall.", "You begin to unfasten \the [src] from the wall.")
if(do_after(user, 100 * I.toolspeed, target = src))
playsound(src, I.usesound, 100, 1)
- user.visible_message("[user] unfastens \the [src] from the wall.", "You unfasten \the [src] from the wall.")
+ user.visible_message("[user] unfastens \the [src] from the wall.", "You unfasten \the [src] from the wall.")
frame.forceMove(user.loc)
frame = null
if(explosive)
@@ -231,7 +229,7 @@
if(!tilted)
to_chat(user, "\The [src] needs to be already tilted before being rigged with \the [I].")
return 1
- user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].")
+ user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].")
if(do_after(user, 150, target = src))
if(explosive || !tilted)
return
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 831b496bab7..586138f1845 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -32,6 +32,8 @@
return
if(over_object == M)
+ if(!remove_item_from_storage(M))
+ M.unEquip(src)
M.put_in_hands(src)
else if(istype(over_object, /obj/screen))
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index ed5b7c1cfd4..a8a0c8ddd19 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -7,7 +7,7 @@
var/insert_anim = "bigscanner1"
anchored = 1
density = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
@@ -207,7 +207,7 @@
var/image/img //and puts a matching
for(var/j = 1, j <= temp_overlays.len, j++) //gray overlay onto the copy
if(copy.ico.len)
- if(findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent"))
+ if(findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent") || findtext(copy.ico[j], "rep"))
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-circle")
else if(findtext(copy.ico[j], "deny"))
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-x")
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 5a101629c94..3aa21c5a5d0 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -72,8 +72,13 @@
icon_state = "stamp-clown"
item_color = "clown"
-/obj/item/stamp/centcom
+/obj/item/stamp/rep
name = "Nanotrasen Representative's rubber stamp"
+ icon_state = "stamp-rep"
+ item_color = "rep"
+
+/obj/item/stamp/centcom
+ name = "Central Command rubber stamp"
icon_state = "stamp-cent"
item_color = "centcom"
diff --git a/code/modules/pda/utilities.dm b/code/modules/pda/utilities.dm
index 55403b372cc..e144841a144 100644
--- a/code/modules/pda/utilities.dm
+++ b/code/modules/pda/utilities.dm
@@ -41,24 +41,24 @@
icon = "heart-o"
/datum/data/pda/utility/scanmode/medical/scan_mob(mob/living/C as mob, mob/living/user as mob)
- C.visible_message("[user] has analyzed [C]'s vitals!")
+ C.visible_message("[user] has analyzed [C]'s vitals!")
- user.show_message("Analyzing Results for [C]:")
- user.show_message("\t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]", 1)
- user.show_message("\t Damage Specifics: [C.getOxyLoss() > 50 ? "" : ""][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "" : ""][C.getToxLoss()]-[C.getFireLoss() > 50 ? "" : ""][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "" : ""][C.getBruteLoss()]", 1)
- user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1)
- user.show_message("\t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1)
+ user.show_message("Analyzing Results for [C]:")
+ user.show_message("\t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]", 1)
+ user.show_message("\t Damage Specifics: [C.getOxyLoss() > 50 ? "" : ""][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "" : ""][C.getToxLoss()]-[C.getFireLoss() > 50 ? "" : ""][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "" : ""][C.getBruteLoss()]", 1)
+ user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1)
+ user.show_message("\t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1)
if(C.timeofdeath && (C.stat == DEAD || (C.status_flags & FAKEDEATH)))
- user.show_message("\t Time of Death: [station_time_timestamp("hh:mm:ss", C.timeofdeath)]")
+ user.show_message("\t Time of Death: [station_time_timestamp("hh:mm:ss", C.timeofdeath)]")
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message("Localized Damage, Brute/Burn:",1)
+ user.show_message("Localized Damage, Brute/Burn:",1)
if(length(damaged)>0)
for(var/obj/item/organ/external/org in damaged)
- user.show_message("\t [capitalize(org.name)]: [org.brute_dam > 0 ? "[org.brute_dam]" : "0"]-[org.burn_dam > 0 ? "[org.burn_dam]" : "0"]", 1)
+ user.show_message("\t [capitalize(org.name)]: [org.brute_dam > 0 ? "[org.brute_dam]" : "0"]-[org.burn_dam > 0 ? "[org.burn_dam]" : "0"]", 1)
else
- user.show_message("\t Limbs are OK.",1)
+ user.show_message("\t Limbs are OK.",1)
/datum/data/pda/utility/scanmode/dna
base_name = "DNA Scanner"
@@ -68,9 +68,9 @@
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
if(!istype(H.dna, /datum/dna))
- to_chat(user, "No fingerprints found on [H]")
+ to_chat(user, "No fingerprints found on [H]")
else
- to_chat(user, "[H]'s Fingerprints: [md5(H.dna.uni_identity)]")
+ to_chat(user, "[H]'s Fingerprints: [md5(H.dna.uni_identity)]")
scan_blood(C, user)
/datum/data/pda/utility/scanmode/dna/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
@@ -78,27 +78,27 @@
/datum/data/pda/utility/scanmode/dna/proc/scan_blood(atom/A, mob/user)
if(!A.blood_DNA)
- to_chat(user, "No blood found on [A]")
+ to_chat(user, "No blood found on [A]")
if(A.blood_DNA)
qdel(A.blood_DNA)
else
- to_chat(user, "Blood found on [A]. Analysing...")
+ to_chat(user, "Blood found on [A]. Analysing...")
spawn(15)
for(var/blood in A.blood_DNA)
- to_chat(user, "Blood type: [A.blood_DNA[blood]]\nDNA: [blood]")
+ to_chat(user, "Blood type: [A.blood_DNA[blood]]\nDNA: [blood]")
/datum/data/pda/utility/scanmode/halogen
base_name = "Halogen Counter"
icon = "exclamation-circle"
/datum/data/pda/utility/scanmode/halogen/scan_mob(mob/living/C as mob, mob/living/user as mob)
- C.visible_message("[user] has analyzed [C]'s radiation levels!")
+ C.visible_message("[user] has analyzed [C]'s radiation levels!")
- user.show_message("Analyzing Results for [C]:")
+ user.show_message("Analyzing Results for [C]:")
if(C.radiation)
- user.show_message("Radiation Level: [C.radiation > 0 ? "[C.radiation]" : "0"]")
+ user.show_message("Radiation Level: [C.radiation > 0 ? "[C.radiation]" : "0"]")
else
- user.show_message("No radiation detected.")
+ user.show_message("No radiation detected.")
/datum/data/pda/utility/scanmode/reagent
base_name = "Reagent Scanner"
@@ -194,7 +194,7 @@
// notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents"
// feature to the PDA, which would better convey the availability of the feature, but this will work for now.
// Inform the user
- to_chat(user, "Paper scanned and OCRed to notekeeper.")//concept of scanning paper copyright brainoblivion 2009
+ to_chat(user, "Paper scanned and OCRed to notekeeper.")//concept of scanning paper copyright brainoblivion 2009
else
- to_chat(user, "Error scanning [A].")
+ to_chat(user, "Error scanning [A].")
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 3ba1a4b5210..a0df2084b2f 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -47,7 +47,7 @@
desc = "A control terminal for the area electrical systems."
icon_state = "apc0"
anchored = 1
- use_power = 0
+ use_power = NO_POWER_USE
req_access = list(access_engine_equip)
var/spooky=0
var/area/area
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index ae64d5d4d6e..ed1458c1cae 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -1,3 +1,5 @@
+#define HEALPERCABLE 3
+#define MAXCABLEPERHEAL 8
///////////////////////////////
//CABLE STRUCTURE
///////////////////////////////
@@ -149,7 +151,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(c.d1 == 12 || c.d2 == 12)
c.qdel()*/
///// Z-Level Stuff
- investigate_log("was cut by [key_name(usr, usr.client)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires")
+ investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires")
qdel(src) // qdel
return
@@ -531,23 +533,44 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
if(!S.is_robotic() || user.a_intent != INTENT_HELP || S.open == 2)
return ..()
- if(S.burn_dam)
- if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP)
- if(H == user)
- if(!do_mob(user, H, 10))
- return 1
- var/cable_to_use = 0
- for(cable_to_use in 1 to 5)
- if(cable_to_use == amount || (cable_to_use * 3) >= S.burn_dam)
- break
- use(cable_to_use)
- S.heal_damage(0, (cable_to_use * 3), 0, 1)
- user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].")
- else if(S.open != 2)
- to_chat(user, "The damage is far too severe to patch over externally.")
- return 1
- else if(S.open != 2)
+ if(S.burn_dam > ROBOLIMB_SELF_REPAIR_CAP)
+ to_chat(user, "The damage is far too severe to patch over externally.")
+ return
+
+ if(!S.burn_dam)
to_chat(user, "Nothing to fix!")
+ return
+
+ if(H == user)
+ if(!do_mob(user, H, 10))
+ return 0
+ var/cable_used = 0
+ var/childlist
+ if(!isnull(S.children))
+ childlist = S.children.Copy()
+ var/parenthealed = FALSE
+ while(cable_used <= MAXCABLEPERHEAL && amount >= 1)
+ var/obj/item/organ/external/E
+ if(S.burn_dam)
+ E = S
+ else if(LAZYLEN(childlist))
+ E = pick_n_take(childlist)
+ if(!E.burn_dam || !E.is_robotic())
+ continue
+ else if(S.parent && !parenthealed)
+ E = S.parent
+ parenthealed = TRUE
+ if(!E.burn_dam || !E.is_robotic())
+ break
+ else
+ break
+ while(cable_used <= MAXCABLEPERHEAL && E.burn_dam && amount >= 1)
+ use(1)
+ cable_used += 1
+ E.heal_damage(0, HEALPERCABLE, 0, 1)
+ user.visible_message("\The [user] repairs some burn damage on \the [M]'s [E.name] with \the [src].")
+ return 1
+
else
return ..()
@@ -820,3 +843,6 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white")
color = cablecolor
update_icon()
+
+#undef MAXCABLEPERHEAL
+#undef HEALPERCABLE
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 8c9ee3eda0d..7bbb5ac20f9 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -4,7 +4,7 @@
icon_state = "teg"
anchored = 0
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
var/obj/machinery/atmospherics/binary/circulator/cold_circ
var/obj/machinery/atmospherics/binary/circulator/hot_circ
@@ -244,4 +244,4 @@
/obj/machinery/power/generator/power_change()
..()
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 42f7cbde657..8f9d9fb14cd 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -24,7 +24,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
icon = 'icons/obj/machines/gravity_generator.dmi'
anchored = 1
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
unacidable = 1
var/sprite_number = 0
@@ -101,7 +101,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
active_power_usage = 3000
power_channel = ENVIRON
sprite_number = 8
- use_power = 1
+ use_power = IDLE_POWER_USE
interact_offline = 1
var/on = 1
var/breaker = 1
@@ -287,7 +287,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
/obj/machinery/gravity_generator/main/proc/set_state(var/new_state)
charging_state = POWER_IDLE
on = new_state
- use_power = on ? 2 : 1
+ use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE
// Sound the alert if gravity was just enabled or disabled.
var/alert = 0
var/area/area = get_area(src)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index df12267015f..f83b00ec0d3 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -133,7 +133,7 @@
desc = "A lighting fixture."
anchored = 1
layer = 5 // They were appearing under mobs which is a little weird - Ostaf
- use_power = 2
+ use_power = ACTIVE_POWER_USE
idle_power_usage = 2
active_power_usage = 20
power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list
@@ -258,10 +258,10 @@
on = 0
set_light(0)
else
- use_power = 2
+ use_power = ACTIVE_POWER_USE
set_light(BR, PO, CO)
else
- use_power = 1
+ use_power = IDLE_POWER_USE
set_light(0)
active_power_usage = (brightness_range * 10)
@@ -484,7 +484,7 @@
// create a light tube/bulb item and put it in the user's hand
- var/obj/item/light/L = new light_type()
+ var/obj/item/light/L = new light_type(get_turf(user))
L.status = status
L.rigged = rigged
L.brightness_range = brightness_range
@@ -499,7 +499,7 @@
L.update()
L.add_fingerprint(user)
- user.put_in_active_hand(L) //puts it in our active hand
+ user.put_in_hands(L) //puts it in our active hand
status = LIGHT_EMPTY
update()
@@ -576,7 +576,7 @@
/obj/machinery/light/blob_act()
if(prob(75))
- broken()
+ qdel(src)
// timed process
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 2892d0245b2..bf2563fe310 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -6,7 +6,7 @@
icon_state = "portgen0_0"
density = 1
anchored = 0
- use_power = 0
+ use_power = NO_POWER_USE
var/active = 0
var/power_gen = 5000
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 15b47a47635..0e255a804fe 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -12,7 +12,7 @@
anchored = 1.0
on_blueprints = TRUE
var/datum/powernet/powernet = null
- use_power = 0
+ use_power = NO_POWER_USE
idle_power_usage = 0
active_power_usage = 0
@@ -297,7 +297,7 @@
//source is an object caused electrocuting (airlock, grille, etc)
//No animations will be performed by this proc.
/proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0)
- if(!istype(M))
+ if(!istype(M))
return 0
if(istype(M.loc,/obj/mecha))
return 0 //feckin mechs are dumb
@@ -305,7 +305,7 @@
var/mob/living/carbon/human/H = M
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
- if(G.siemens_coefficient == 0)
+ if(G.siemens_coefficient == 0)
return 0 //to avoid spamming with insulated glvoes on
var/area/source_area
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index d54deb2f6f1..a85d9e880bd 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -8,7 +8,7 @@ var/global/list/rad_collectors = list()
anchored = 0
density = 1
req_access = list(access_engine_equip)
-// use_power = 0
+// use_power = NO_POWER_USE
var/obj/item/tank/plasma/P = null
var/last_power = 0
var/active = 0
@@ -148,4 +148,3 @@ var/global/list/rad_collectors = list()
flick("ca_deactive", src)
update_icons()
return
-
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 3a5a059d670..0e9bdd8ddf3 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -6,7 +6,7 @@
anchored = 1
density = 0
unacidable = 1
- use_power = 0
+ use_power = NO_POWER_USE
light_range = 4
layer = OBJ_LAYER + 0.1
var/obj/machinery/field/generator/FG1 = null
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index a6c86d3f2ef..0bcde54af4b 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -7,7 +7,7 @@
density = 1
req_access = list(access_engine_equip)
- use_power = 0
+ use_power = NO_POWER_USE
idle_power_usage = 10
active_power_usage = 300
@@ -167,7 +167,7 @@
/* if((severity == 1)&&prob(1)&&prob(1))
if(src.active)
src.active = 0
- src.use_power = 1 */
+ src.use_power = IDLE_POWER_USE */
return 1
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 11651ff13fe..0f281c634e3 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -26,7 +26,7 @@ field_generator power level display
icon_state = "Field_Gen"
anchored = 0
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
armor = list(melee = 25, bullet = 10, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
var/const/num_power_levels = 6 // Total number of power level icon has
var/power_level = 0
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
index 02a015ba6d5..69153cb4d89 100644
--- a/code/modules/power/singularity/generator.dm
+++ b/code/modules/power/singularity/generator.dm
@@ -6,7 +6,7 @@
icon_state = "TheSingGen"
anchored = 0
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
var/energy = 0
var/creation_type = /obj/singularity
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index dfbedc07ad2..c6c6de434c2 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -281,7 +281,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
icon_state = "none"
anchored = 0
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
idle_power_usage = 0
active_power_usage = 0
var/construction_state = 0
@@ -408,10 +408,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(construction_state < 3)//Was taken apart, update state
update_state()
if(use_power)
- use_power = 0
+ use_power = NO_POWER_USE
construction_state = temp_state
if(construction_state >= 3)
- use_power = 1
+ use_power = IDLE_POWER_USE
update_icon()
return 1
return 0
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 42fbb784f49..bf20ef45140 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -6,7 +6,7 @@
reference = "control_box"
anchored = 0
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
idle_power_usage = 500
active_power_usage = 10000
construction_state = 0
@@ -42,7 +42,7 @@
/obj/machinery/particle_accelerator/control_box/update_state()
if(construction_state < 3)
- use_power = 0
+ use_power = NO_POWER_USE
assembled = 0
active = 0
for(var/obj/structure/particle_accelerator/part in connected_parts)
@@ -52,7 +52,7 @@
connected_parts = list()
return
if(!part_scan())
- use_power = 1
+ use_power = IDLE_POWER_USE
active = 0
connected_parts = list()
@@ -147,9 +147,9 @@
..()
if(stat & NOPOWER)
active = 0
- use_power = 0
+ use_power = NO_POWER_USE
else if(!stat && construction_state <= 3)
- use_power = 1
+ use_power = IDLE_POWER_USE
update_icon()
if((stat & NOPOWER) || (!stat && construction_state <= 3)) //Only update the part icons if something's changed (i.e. any of the above condition sets are met).
@@ -231,13 +231,13 @@
log_game("PA Control Computer turned ON by [key_name(usr)] in ([x],[y],[z])")
use_log += text("\[[time_stamp()]\] [key_name(usr)] has turned on the PA Control Computer.")
if(active)
- use_power = 2
+ use_power = ACTIVE_POWER_USE
for(var/obj/structure/particle_accelerator/part in connected_parts)
part.strength = strength
part.powered = 1
part.update_icon()
else
- use_power = 1
+ use_power = IDLE_POWER_USE
for(var/obj/structure/particle_accelerator/part in connected_parts)
part.strength = null
part.powered = 0
@@ -276,4 +276,4 @@
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
- return
\ No newline at end of file
+ return
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index a2025376e9d..7342c1f26c1 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -8,7 +8,7 @@
icon_state = "sp_base"
anchored = 1
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
idle_power_usage = 0
active_power_usage = 0
var/id = 0
@@ -279,7 +279,7 @@
icon_state = "computer"
anchored = 1
density = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 250
var/icon_screen = "solar"
var/icon_keyboard = "power_key"
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 20f4031a8ce..e4e3275ef26 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -10,7 +10,7 @@
icon_state = "tracker"
anchored = 1
density = 1
- use_power = 0
+ use_power = NO_POWER_USE
var/id = 0
var/sun_angle = 0 // sun angle as set by sun datum
@@ -82,4 +82,4 @@
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
w_class = WEIGHT_CLASS_SMALL
- origin_tech = "engineering=2;programming=1"
\ No newline at end of file
+ origin_tech = "engineering=2;programming=1"
diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm
index 762d442a2a9..4f7e7e9c895 100644
--- a/code/modules/power/treadmill.dm
+++ b/code/modules/power/treadmill.dm
@@ -8,7 +8,7 @@
desc = "A power-generating treadmill."
layer = 2.2
anchored = 1
- use_power = 0
+ use_power = NO_POWER_USE
var/speed = 0
var/friction = 0.15 // lose this much speed every ptick
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
index 08a2104383d..9d16a9c2123 100644
--- a/code/modules/projectiles/firing.dm
+++ b/code/modules/projectiles/firing.dm
@@ -40,6 +40,12 @@
if(!istype(targloc) || !istype(curloc) || !BB)
return 0
BB.ammo_casing = src
+
+ if(target && get_dist(user, target) <= 1) //Point blank shot must always hit
+ target.bullet_act(BB, BB.def_zone)
+ QDEL_NULL(BB)
+ return 1
+
if(targloc == curloc)
if(target) //if the target is right on our location we go straight to bullet_act()
target.bullet_act(BB, BB.def_zone)
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index c279abdc5c1..5c78613fbdf 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -58,11 +58,11 @@
/obj/item/gun/dartgun/examine(mob/user)
if(..(user, 2))
if(beakers.len)
- to_chat(user, "[src] contains:")
for(var/obj/item/reagent_containers/glass/beaker/B in beakers)
if(B.reagents && B.reagents.reagent_list.len)
for(var/datum/reagent/R in B.reagents.reagent_list)
- to_chat(user, "[R.volume] units of [R.name]")
/obj/item/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/dart_cartridge))
@@ -99,7 +99,7 @@
return
B.forceMove(src)
beakers += B
- to_chat(user, "You slot [B] into [src].")
src.updateUsrDialog()
/obj/item/gun/dartgun/can_shoot()
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index a154691d0a8..85ec203e063 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -124,7 +124,7 @@
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
else if(isliving(loc))
- to_chat(loc, "[src] silently charges up.")
+ to_chat(loc, "[src] silently charges up.")
update_icon()
overheat = FALSE
@@ -172,7 +172,6 @@
damage_type = BRUTE
flag = "bomb"
range = 3
- log_override = TRUE
var/pressure_decrease = 0.25
var/turf_aoe = FALSE
@@ -218,7 +217,9 @@
for(var/mob/living/L in range(1, target_turf) - firer - target)
var/armor = L.run_armor_check(def_zone, flag, "", "", armour_penetration)
L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor)
- to_chat(L, "You're struck by a [name]!")
+ L.visible_message("[L] is hit by \a [src]!",
+ "You are hit by \a [src]!")
+ add_attack_logs(firer, L, "Shot with a [type]")
//Modkits
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 94f397b45bf..f6d84635c08 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -27,7 +27,7 @@
if(no_den_usage)
var/area/A = get_area(user)
if(istype(A, /area/wizard_station))
- to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
+ to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
return
else
no_den_usage = 0
@@ -72,7 +72,7 @@
return
/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj)
- to_chat(user, "The [name] whizzles quietly.")
+ to_chat(user, "The [name] whizzles quietly.")
return
/obj/item/gun/magic/suicide_act(mob/user)
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index cae9d11cbb6..e00c6e16724 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -38,7 +38,7 @@
if(no_den_usage)
var/area/A = get_area(user)
if(istype(A, /area/wizard_station))
- to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
+ to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
return
else
no_den_usage = 0
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index d4d232d2ed7..cf291fba675 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -4,7 +4,7 @@
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "dispenser"
- use_power = 0
+ use_power = NO_POWER_USE
idle_power_usage = 40
var/ui_title = "Chem Dispenser 5000"
var/energy = 100
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index 16914c77c4d..2d031d9c2c5 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -4,7 +4,7 @@
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0b"
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 40
var/obj/item/reagent_containers/beaker = null
var/desired_temp = 300
@@ -154,4 +154,4 @@
beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list...
data["beakerContents"] = beakerContents
- return data
\ No newline at end of file
+ return data
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 90f9ed47eec..2a7dac0f48d 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -4,7 +4,7 @@
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0"
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 20
var/obj/item/reagent_containers/beaker = null
var/obj/item/storage/pill_bottle/loaded_pill_bottle = null
@@ -416,4 +416,4 @@
to_chat(user, "You can't use the [name] while it's panel is opened!")
return 1
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 8296550d8f9..ee2ac418555 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -6,7 +6,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0"
circuit = /obj/item/circuitboard/pandemic
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 20
var/temp_html = ""
var/wait = null
@@ -294,4 +294,4 @@
..()
return
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index ce5ed918932..5948d29e4cd 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -4,7 +4,7 @@
icon_state = "juicer1"
layer = 2.9
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 100
pass_flags = PASSTABLE
@@ -33,7 +33,6 @@
/obj/item/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0),
//Blender Stuff
- /obj/item/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0),
/obj/item/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0),
/obj/item/reagent_containers/food/snacks/grown/wheat = list("flour" = -5),
/obj/item/reagent_containers/food/snacks/grown/oat = list("flour" = -5),
@@ -58,6 +57,7 @@
var/list/juice_items = list (
//Juicer Stuff
+ /obj/item/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0),
/obj/item/reagent_containers/food/snacks/grown/corn = list("corn_starch" = 0),
/obj/item/reagent_containers/food/snacks/grown/tomato = list("tomatojuice" = 0),
/obj/item/reagent_containers/food/snacks/grown/carrot = list("carrotjuice" = 0),
@@ -446,4 +446,4 @@
var/amount = O.reagents.total_volume
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
- remove_object(O)
\ No newline at end of file
+ remove_object(O)
diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm
index a2bd35ae75a..77c4b08f359 100644
--- a/code/modules/reagents/chemistry/reagents/drugs.dm
+++ b/code/modules/reagents/chemistry/reagents/drugs.dm
@@ -302,13 +302,13 @@
M.AdjustWeakened(-2.5)
M.adjustStaminaLoss(-2)
M.SetSleeping(0)
- M.status_flags |= GOTTAGOREALLYFAST
+ M.status_flags |= GOTTAGOFAST_METH
if(prob(50))
M.adjustBrainLoss(1.0)
..()
/datum/reagent/methamphetamine/on_mob_delete(mob/living/M)
- M.status_flags &= ~GOTTAGOREALLYFAST
+ M.status_flags &= ~GOTTAGOFAST_METH
..()
/datum/reagent/methamphetamine/overdose_process(mob/living/M, severity)
@@ -590,7 +590,7 @@
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
M.adjustStaminaLoss(-2)
- M.status_flags |= GOTTAGOREALLYFAST
+ M.status_flags |= GOTTAGOFAST_METH
M.Jitter(3)
M.adjustBrainLoss(0.5)
if(prob(5))
@@ -598,7 +598,7 @@
..()
/datum/reagent/lube/ultra/on_mob_delete(mob/living/M)
- M.status_flags &= ~GOTTAGOREALLYFAST
+ M.status_flags &= ~GOTTAGOFAST_METH
..()
/datum/reagent/lube/ultra/overdose_process(mob/living/M, severity)
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 199edb72fb4..7779cb91d85 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -397,7 +397,7 @@
if(13 to INFINITY)
to_chat(M, "You suddenly ignite in a holy fire!")
for(var/mob/O in viewers(M, null))
- O.show_message(text("[] suddenly bursts into flames!", M), 1)
+ O.show_message(text("[] suddenly bursts into flames!", M), 1)
M.fire_stacks = min(5,M.fire_stacks + 3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard?
@@ -513,4 +513,4 @@
if(istype(O, /obj/item/clothing/shoes/galoshes))
var/t_loc = get_turf(O)
qdel(O)
- new /obj/item/clothing/shoes/galoshes/dry(t_loc)
\ No newline at end of file
+ new /obj/item/clothing/shoes/galoshes/dry(t_loc)
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 39c2e8c78fb..bcbce7f8af8 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -52,7 +52,7 @@
/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
- holder.my_atom.visible_message("The solution spews out a metalic foam!")
var/datum/effect_system/foam_spread/s = new()
s.set_up(created_volume, location, holder, MFOAM_IRON)
@@ -480,4 +480,4 @@
if(B && B.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
if(D)
- D.Devolve()
\ No newline at end of file
+ D.Devolve()
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 771214661b4..ced02f2e48f 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -73,6 +73,9 @@
icon_state = "medivend_hypo"
safety_hypo = TRUE
+/obj/item/reagent_containers/hypospray/safety/ert
+ list_reagents = list("omnizine" = 30)
+
/obj/item/reagent_containers/hypospray/CMO
list_reagents = list("omnizine" = 30)
@@ -158,4 +161,4 @@
/obj/item/reagent_containers/hypospray/autoinjector/nanocalcium/attack(mob/living/M, mob/user)
if(..())
- playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1)
\ No newline at end of file
+ playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1)
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 1a22f664ad5..eb588200265 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -377,7 +377,7 @@
found = 1
break
if(!found)
- to_chat(usr, "[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.")
+ to_chat(usr, "[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.")
return
var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id)
transfer_fingerprints_to(NC)
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index c7e276cae17..3bb3c237d07 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -258,6 +258,7 @@
return
/obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ . = TRUE
if(our_rpd.mode == RPD_ROTATE_MODE)
rotate()
else if(our_rpd.mode == RPD_FLIP_MODE)
@@ -265,4 +266,4 @@
else if(our_rpd.mode == RPD_DELETE_MODE)
our_rpd.delete_single_pipe(user, src)
else
- ..()
+ return ..()
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 476028b4532..9de8033a00f 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -335,7 +335,7 @@
// timed process
// charge the gas reservoir and perform flush if ready
/obj/machinery/disposal/process()
- use_power = 0
+ use_power = NO_POWER_USE
if(stat & BROKEN) // nothing can happen if broken
return
@@ -356,13 +356,13 @@
if(stat & NOPOWER) // won't charge if no power
return
- use_power = 1
+ use_power = IDLE_POWER_USE
if(mode != 1) // if off or ready, no need to charge
return
// otherwise charge
- use_power = 2
+ use_power = ACTIVE_POWER_USE
var/atom/L = loc // recharging from loc turf
@@ -760,12 +760,8 @@
return
if(T.intact && istype(T,/turf/simulated/floor)) //intact floor, pop the tile
var/turf/simulated/floor/F = T
- //F.health = 100
- F.burnt = 1
- F.intact = 0
- F.levelupdate()
- new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff
- F.icon_state = "Floor[F.burnt ? "1" : ""]"
+ new F.builtin_tile.type(H)
+ F.remove_tile(null,TRUE,FALSE)
if(direction) // direction is specified
if(istype(T, /turf/space)) // if ended in space, then range is unlimited
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 8b2f7c4197f..1b1b5c0ffa9 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -134,6 +134,7 @@
name = "package wrapper"
icon = 'icons/obj/items.dmi'
icon_state = "deliveryPaper"
+ singular_name = "package wrapper"
flags = NOBLUDGEON
amount = 25
max_amount = 25
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index bba85a5ff00..5a54bf54005 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -543,14 +543,22 @@
build_path = /obj/item/assembly/timer
category = list("initial", "Miscellaneous")
-/datum/design/voice_analyser
- name = "Voice Analyser"
- id = "voice_analyser"
+/datum/design/voice_analyzer
+ name = "Voice Analyzer"
+ id = "voice_analyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/assembly/voice
category = list("initial", "Miscellaneous")
+/datum/design/noise_analyser
+ name = "Noise Analyser"
+ id = "Noise_analyser"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 100, MAT_GLASS = 10)
+ build_path = /obj/item/assembly/voice/noise
+ category = list("initial", "Miscellaneous")
+
/datum/design/light_tube
name = "Light Tube"
id = "light_tube"
@@ -848,38 +856,6 @@
build_path = /obj/item/videocam
category = list("initial", "Miscellaneous")
-/datum/design/canvas
- name = "11px by 11px Canvas"
- id = "canvas"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50)
- build_path = /obj/item/canvas
- category = list("initial", "Miscellaneous")
-
-/datum/design/canvas/nineteenXnineteen
- name = "19px by 19px Canvas"
- id = "canvas19x19"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 50)
- build_path = /obj/item/canvas/nineteenXnineteen
- category = list("initial", "Miscellaneous")
-
-/datum/design/canvas/twentythreeXnineteen
- name = "23px by 19px Canvas"
- id = "canvas23x19"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 70)
- build_path = /obj/item/canvas/twentythreeXnineteen
- category = list("initial", "Miscellaneous")
-
-/datum/design/canvas/twentythreeXtwentythree
- name = "23px by 23px Canvas"
- id = "canvas23x23"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 100)
- build_path = /obj/item/canvas/twentythreeXtwentythree
- category = list("initial", "Miscellaneous")
-
/datum/design/logic_board
name = "Logic Circuit"
id = "logic_board"
@@ -904,4 +880,4 @@
build_type = AUTOLATHE
materials = list(MAT_GLASS = 2500) //1.25 glass sheets, broken mirrors will return a shard (1 sheet)
build_path = /obj/item/mounted/mirror
- category = list("initial", "Miscellaneous")
\ No newline at end of file
+ category = list("initial", "Miscellaneous")
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 57886d2972c..cc6305319c7 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -272,6 +272,16 @@
build_path = /obj/item/circuitboard/mechfab
category = list("Research Machinery")
+/datum/design/podfab
+ name = "Machine Board (Spacepod Fabricator)"
+ desc = "The circuit board for an Spacepod Fabricator"
+ id = "podfab"
+ req_tech = list("programming" = 3, "engineering" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000)
+ build_path = /obj/item/circuitboard/podfab
+ category = list("Research Machinery")
+
/datum/design/mech_recharger
name = "Machine Board (Mech Bay Recharger)"
desc = "The circuit board for a Mech Bay Recharger."
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index a7fe42063ff..b5840d82265 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -323,6 +323,17 @@
build_path = /obj/item/organ/internal/cyberimp/arm/toolset
category = list("Misc", "Medical")
+/datum/design/cyberimp_diagnostic_hud
+ name = "Diagnostic HUD implant"
+ desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see. Wiggle eyes to control."
+ id = "ci-diaghud"
+ req_tech = list("materials" = 5, "engineering" = 4, "programming" = 4, "biotech" = 4)
+ build_type = PROTOLATHE | MECHFAB
+ construction_time = 50
+ materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500)
+ build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic
+ category = list("Misc", "Medical")
+
/datum/design/cyberimp_medical_hud
name = "Medical HUD implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
@@ -345,6 +356,17 @@
build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security
category = list("Misc", "Medical")
+/datum/design/cyberimp_meson
+ name = "Meson scanner implant"
+ desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else."
+ id = "ci-mesonhud"
+ req_tech = list("materials" = 4, "biotech" = 4, "engineering" = 4)
+ build_type = PROTOLATHE | MECHFAB
+ construction_time = 50
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500, MAT_GOLD = 300)
+ build_path = /obj/item/organ/internal/cyberimp/eyes/meson
+ category = list("Misc", "Medical")
+
/datum/design/cyberimp_xray
name = "X-Ray implant"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
@@ -537,4 +559,4 @@
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/organ/internal/lungs/cybernetic/upgraded
- category = list("Medical")
\ No newline at end of file
+ category = list("Medical")
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index 8bdf6771df1..1036bb6e188 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -60,3 +60,23 @@
materials = list(MAT_METAL = 500, MAT_GLASS = 300)
build_path = /obj/item/camera/digital
category = list("Miscellaneous")
+
+/datum/design/safety_muzzle
+ name = "Safety Muzzle"
+ desc = "Produce a lockable muzzle keyed to security ID cards"
+ id = "safetymuzzle"
+ req_tech = list("materials" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL=500, MAT_GLASS=50)
+ build_path = /obj/item/clothing/mask/muzzle/safety
+ category = list("Miscellaneous")
+
+/datum/design/shock_muzzle
+ name = "Shock Muzzle"
+ desc = "Produce a modified safety muzzle that includes an electric shock pack and a slot for a trigger assembly."
+ id = "shockmuzzle"
+ req_tech = list("materials" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL=500, MAT_GLASS=50)
+ build_path = /obj/item/clothing/mask/muzzle/safety/shock
+ category = list("Miscellaneous")
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index e504216fe38..f6e4f2c0877 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -21,7 +21,7 @@
icon_state = "h_lathe"
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
var/recentlyExperimented = 0
var/mob/trackedIan
var/mob/trackedRuntime
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 86d507d34de..88ecedbf555 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -50,7 +50,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
name = "Messaging Server"
density = 1
anchored = 1.0
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
@@ -199,7 +199,7 @@ var/obj/machinery/blackbox_recorder/blackbox
name = "Blackbox Recorder"
density = 1
anchored = 1.0
- use_power = 1
+ use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
var/list/messages = list() //Stores messages of non-standard frequencies
@@ -377,4 +377,4 @@ proc/feedback_add_details(var/variable,var/details)
if(!FV) return
- FV.add_details(details)
\ No newline at end of file
+ FV.add_details(details)
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 8d18df1ee07..aebbeb4bb9c 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -426,7 +426,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/key = usr.key //so we don't lose the info during the spawn delay
if(!(being_built.build_type & PROTOLATHE))
g2g = 0
- message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!")
+ message_admins("Protolathe exploit attempted by [key_name(usr, TRUE)]!")
if(g2g) //If input is incorrect, nothing happens
var/new_coeff = coeff * being_built.lathe_time_factor
@@ -502,7 +502,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
power = max(2000, power)
if(!(being_built.build_type & IMPRINTER))
g2g = 0
- message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!")
+ message_admins("Circuit imprinter exploit attempted by [key_name(usr, TRUE)]!")
if(g2g) //Again, if input is wrong, do nothing
add_wait_message("Imprinting Circuit. Please Wait...", IMPRINTER_DELAY)
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 51b4f8512e1..1e884e35c3a 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -6,7 +6,7 @@
icon = 'icons/obj/machines/research.dmi'
density = 1
anchored = 1
- use_power = 1
+ use_power = IDLE_POWER_USE
var/busy = 0
var/hacked = 0
var/disabled = 0
@@ -130,4 +130,4 @@
use_power(min(1000, (amount_inserted / 100)))
overlays += "[initial(name)]_[stack_name]"
sleep(10)
- overlays -= "[initial(name)]_[stack_name]"
\ No newline at end of file
+ overlays -= "[initial(name)]_[stack_name]"
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 0e9053bbb44..8b0675d90de 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -248,7 +248,7 @@
But I like HTML, so back to no sanitizing.*/
var/message = interpreter.GetVar("$content")
- var/regex/bannedTags = new ("(