mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 19:52:40 +00:00
Merge branch 'master' into upstream-merge-9751
This commit is contained in:
@@ -55,6 +55,9 @@
|
|||||||
|
|
||||||
var/rev_cooldown = 0
|
var/rev_cooldown = 0
|
||||||
var/tcrystals = 0
|
var/tcrystals = 0
|
||||||
|
var/list/purchase_log = new
|
||||||
|
var/used_TC = 0
|
||||||
|
|
||||||
|
|
||||||
// the world.time since the mob has been brigged, or -1 if not at all
|
// the world.time since the mob has been brigged, or -1 if not at all
|
||||||
var/brigged_since = -1
|
var/brigged_since = -1
|
||||||
@@ -73,7 +76,7 @@
|
|||||||
|
|
||||||
/datum/mind/New(var/key)
|
/datum/mind/New(var/key)
|
||||||
src.key = key
|
src.key = key
|
||||||
|
purchase_log = list()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/mind/proc/transfer_to(mob/living/new_character)
|
/datum/mind/proc/transfer_to(mob/living/new_character)
|
||||||
|
|||||||
@@ -22,22 +22,22 @@
|
|||||||
desc = "Buys you one random item."
|
desc = "Buys you one random item."
|
||||||
|
|
||||||
/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user)
|
/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user)
|
||||||
var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses)
|
var/datum/uplink_item/item = default_uplink_selection.get_random_item((user ? user.mind.tcrystals : DEFAULT_TELECRYSTAL_AMOUNT), U)
|
||||||
return item.buy(U, user)
|
return item.buy(U, user)
|
||||||
|
|
||||||
/datum/uplink_item/item/badassery/random_one/can_buy(obj/item/device/uplink/U)
|
/datum/uplink_item/item/badassery/random_one/can_buy(var/obj/item/device/uplink/U, var/telecrystals)
|
||||||
return default_uplink_selection.get_random_item(U.uses, U) != null
|
return default_uplink_selection.get_random_item(telecrystals, U) != null
|
||||||
|
|
||||||
/datum/uplink_item/item/badassery/random_many
|
/datum/uplink_item/item/badassery/random_many
|
||||||
name = "Random Items"
|
name = "Random Items"
|
||||||
desc = "Buys you as many random items you can afford. Convenient packaging NOT included."
|
desc = "Buys you as many random items you can afford. Convenient packaging NOT included."
|
||||||
|
|
||||||
/datum/uplink_item/item/badassery/random_many/cost(var/telecrystals)
|
/datum/uplink_item/item/badassery/random_many/cost(obj/item/device/uplink/U, var/telecrystals)
|
||||||
return max(1, telecrystals)
|
return max(1, telecrystals)
|
||||||
|
|
||||||
/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc)
|
/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/M)
|
||||||
var/list/bought_items = list()
|
var/list/bought_items = list()
|
||||||
for(var/datum/uplink_item/UI in get_random_uplink_items(U, U.uses, loc))
|
for(var/datum/uplink_item/UI in get_random_uplink_items(U, M.mind.tcrystals, loc))
|
||||||
UI.purchase_log(U)
|
UI.purchase_log(U)
|
||||||
var/obj/item/I = UI.get_goods(U, loc)
|
var/obj/item/I = UI.get_goods(U, loc)
|
||||||
if(istype(I))
|
if(istype(I))
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
|
|
||||||
/datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U)
|
/datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U)
|
||||||
feedback_add_details("traitor_uplink_items_bought", "[src]")
|
feedback_add_details("traitor_uplink_items_bought", "[src]")
|
||||||
log_and_message_admins("used \the [U.loc] to buy \a [src]")
|
log_and_message_admins("used \the [U.loc] to buy \a [src] at random")
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
* Surplus Crate *
|
* Surplus Crate *
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
category = /datum/uplink_category/telecrystals
|
category = /datum/uplink_category/telecrystals
|
||||||
blacklisted = 1
|
blacklisted = 1
|
||||||
|
|
||||||
/datum/uplink_item/item/telecrystal/get_goods(var/obj/item/device/uplink/U, var/loc)
|
/datum/uplink_item/item/telecrystal/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/M)
|
||||||
return new /obj/item/stack/telecrystal(loc, cost(U.uses))
|
return new /obj/item/stack/telecrystal(loc, cost(U, M.mind.tcrystals))
|
||||||
|
|
||||||
/datum/uplink_item/item/telecrystal/one
|
/datum/uplink_item/item/telecrystal/one
|
||||||
name = "Telecrystal - 01"
|
name = "Telecrystal - 01"
|
||||||
@@ -35,5 +35,5 @@
|
|||||||
/datum/uplink_item/item/telecrystal/all
|
/datum/uplink_item/item/telecrystal/all
|
||||||
name = "Telecrystals - Empty Uplink"
|
name = "Telecrystals - Empty Uplink"
|
||||||
|
|
||||||
/datum/uplink_item/item/telecrystal/all/cost(var/telecrystals)
|
/datum/uplink_item/item/telecrystal/all/cost(obj/item/device/uplink/U, mob/M)
|
||||||
return max(1, telecrystals)
|
return max(1, M.mind.tcrystals)
|
||||||
@@ -6,12 +6,6 @@
|
|||||||
..()
|
..()
|
||||||
items = list()
|
items = list()
|
||||||
|
|
||||||
/datum/uplink_category/proc/can_view(obj/item/device/uplink/U)
|
|
||||||
for(var/datum/uplink_item/item in items)
|
|
||||||
if(item.can_view(U))
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
datum/uplink_category/ammunition
|
datum/uplink_category/ammunition
|
||||||
name = "Ammunition"
|
name = "Ammunition"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ var/datum/uplink/uplink = new()
|
|||||||
var/item_cost = 0
|
var/item_cost = 0
|
||||||
var/datum/uplink_category/category // Item category
|
var/datum/uplink_category/category // Item category
|
||||||
var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all.
|
var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all.
|
||||||
var/blacklisted = 0
|
var/blacklisted = FALSE
|
||||||
|
|
||||||
/datum/uplink_item/item
|
/datum/uplink_item/item
|
||||||
var/path = null
|
var/path = null
|
||||||
@@ -48,50 +48,34 @@ var/datum/uplink/uplink = new()
|
|||||||
if(!extra_args)
|
if(!extra_args)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!can_buy(U))
|
if(!can_buy(U, user.mind.tcrystals))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(U.tgui_status(user, GLOB.tgui_inventory_state) != STATUS_INTERACTIVE)
|
if(U.tgui_status(user, GLOB.tgui_deep_inventory_state) != STATUS_INTERACTIVE)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/cost = cost(U.uses, U)
|
var/cost = cost(U, user.mind.tcrystals)
|
||||||
|
|
||||||
var/goods = get_goods(U, get_turf(user), user, extra_args)
|
var/goods = get_goods(U, get_turf(user), user, extra_args)
|
||||||
if(!goods)
|
if(!goods)
|
||||||
return
|
return
|
||||||
|
|
||||||
purchase_log(U)
|
purchase_log(user)
|
||||||
user.mind.tcrystals -= cost
|
user.mind.tcrystals -= cost
|
||||||
U.used_TC += cost
|
user.mind.used_TC += cost
|
||||||
return goods
|
return goods
|
||||||
|
|
||||||
// Any additional arguments you wish to send to the get_goods
|
// Any additional arguments you wish to send to the get_goods
|
||||||
/datum/uplink_item/proc/extra_args(var/mob/user)
|
/datum/uplink_item/proc/extra_args(var/mob/user)
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/datum/uplink_item/proc/can_buy(obj/item/device/uplink/U)
|
/datum/uplink_item/proc/can_buy(var/obj/item/device/uplink/U, var/telecrystals)
|
||||||
if(cost(U.uses, U) > U.uses)
|
if(cost(U, telecrystals) > telecrystals)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
return can_view(U)
|
return TRUE
|
||||||
|
|
||||||
/datum/uplink_item/proc/can_view(obj/item/device/uplink/U)
|
/datum/uplink_item/proc/cost(obj/item/device/uplink/U, mob/M)
|
||||||
// Making the assumption that if no uplink was supplied, then we don't care about antag roles
|
|
||||||
if(!U || !antag_roles.len)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
// With no owner, there's no need to check antag status.
|
|
||||||
if(!U.uplink_owner)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
for(var/antag_role in antag_roles)
|
|
||||||
var/datum/antagonist/antag = all_antag_types[antag_role]
|
|
||||||
if(!isnull(antag))
|
|
||||||
if(antag.is_antagonist(U.uplink_owner))
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
/datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U)
|
|
||||||
. = item_cost
|
. = item_cost
|
||||||
if(U)
|
if(U)
|
||||||
. = U.get_item_cost(src, .)
|
. = U.get_item_cost(src, .)
|
||||||
@@ -100,19 +84,19 @@ var/datum/uplink/uplink = new()
|
|||||||
return desc
|
return desc
|
||||||
|
|
||||||
// get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying
|
// get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying
|
||||||
/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc)
|
/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc, mob/user)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/datum/uplink_item/proc/log_icon()
|
/datum/uplink_item/proc/log_icon()
|
||||||
return
|
return
|
||||||
|
|
||||||
/datum/uplink_item/proc/purchase_log(obj/item/device/uplink/U)
|
/datum/uplink_item/proc/purchase_log(mob/M)
|
||||||
feedback_add_details("traitor_uplink_items_bought", "[src]")
|
feedback_add_details("traitor_uplink_items_bought", "[src]")
|
||||||
log_and_message_admins("used \the [U.loc] to buy \a [src]")
|
log_and_message_admins("\the [M] bought \a [src] through the uplink")
|
||||||
U.purchase_log[src] = U.purchase_log[src] + 1
|
M.mind.purchase_log[src] += 1
|
||||||
|
|
||||||
datum/uplink_item/dd_SortValue()
|
datum/uplink_item/dd_SortValue()
|
||||||
return cost(INFINITY)
|
return item_cost
|
||||||
|
|
||||||
/********************************
|
/********************************
|
||||||
* *
|
* *
|
||||||
@@ -133,7 +117,7 @@ datum/uplink_item/dd_SortValue()
|
|||||||
A.put_in_any_hand_if_possible(I)
|
A.put_in_any_hand_if_possible(I)
|
||||||
return I
|
return I
|
||||||
|
|
||||||
/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc)
|
/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user)
|
||||||
var/obj/item/I = new path(loc)
|
var/obj/item/I = new path(loc)
|
||||||
return I
|
return I
|
||||||
|
|
||||||
@@ -208,7 +192,7 @@ datum/uplink_item/dd_SortValue()
|
|||||||
|
|
||||||
/proc/get_surplus_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc)
|
/proc/get_surplus_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc)
|
||||||
var/list/bought_items = list()
|
var/list/bought_items = list()
|
||||||
var/override = 1
|
var/override = TRUE
|
||||||
while(remaining_TC)
|
while(remaining_TC)
|
||||||
var/datum/uplink_item/I = all_uplink_selection.get_random_item(remaining_TC, U, bought_items, override)
|
var/datum/uplink_item/I = all_uplink_selection.get_random_item(remaining_TC, U, bought_items, override)
|
||||||
if(!I)
|
if(!I)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/datum/antagonist/proc/print_player_summary()
|
/datum/antagonist/proc/print_player_summary()
|
||||||
|
|
||||||
if(!current_antagonists.len)
|
if(!current_antagonists.len)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
var/text = "<br><br><font size = 2><b>The [current_antagonists.len == 1 ? "[role_text] was" : "[role_text_plural] were"]:</b></font>"
|
var/text = "<br><br><font size = 2><b>The [current_antagonists.len == 1 ? "[role_text] was" : "[role_text_plural] were"]:</b></font>"
|
||||||
for(var/datum/mind/P in current_antagonists)
|
for(var/datum/mind/P in current_antagonists)
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
else
|
else
|
||||||
text += "<font color='red'>Fail.</font>"
|
text += "<font color='red'>Fail.</font>"
|
||||||
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
||||||
failed = 1
|
failed = TRUE
|
||||||
num++
|
num++
|
||||||
if(failed)
|
if(failed)
|
||||||
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
text += "<BR><FONT size = 2>Their objectives were:</FONT>"
|
text += "<BR><FONT size = 2>Their objectives were:</FONT>"
|
||||||
var/num = 1
|
var/num = 1
|
||||||
for(var/datum/objective/O in global_objectives)
|
for(var/datum/objective/O in global_objectives)
|
||||||
text += print_objective(O, num, 1)
|
text += print_objective(O, num, TRUE)
|
||||||
num++
|
num++
|
||||||
|
|
||||||
// Display the results.
|
// Display the results.
|
||||||
@@ -68,14 +68,14 @@
|
|||||||
/datum/antagonist/proc/print_player_full(var/datum/mind/ply)
|
/datum/antagonist/proc/print_player_full(var/datum/mind/ply)
|
||||||
var/text = print_player_lite(ply)
|
var/text = print_player_lite(ply)
|
||||||
|
|
||||||
var/TC_uses = 0
|
var/TC_uses = FALSE
|
||||||
var/uplink_true = 0
|
var/uplink_true = FALSE
|
||||||
var/purchases = ""
|
var/purchases = ""
|
||||||
for(var/obj/item/device/uplink/H in GLOB.world_uplinks)
|
for(var/mob/M in player_list)
|
||||||
if(H && H.uplink_owner && H.uplink_owner == ply)
|
if(M.mind && M.mind.used_TC)
|
||||||
TC_uses += H.used_TC
|
TC_uses += M.mind.used_TC
|
||||||
uplink_true = 1
|
uplink_true = TRUE
|
||||||
purchases += get_uplink_purchases(H)
|
purchases += get_uplink_purchases(M.mind)
|
||||||
if(uplink_true)
|
if(uplink_true)
|
||||||
text += " (used [TC_uses] TC)"
|
text += " (used [TC_uses] TC)"
|
||||||
if(purchases)
|
if(purchases)
|
||||||
@@ -83,18 +83,8 @@
|
|||||||
|
|
||||||
return text
|
return text
|
||||||
|
|
||||||
/proc/print_ownerless_uplinks()
|
/proc/get_uplink_purchases(var/datum/mind/M)
|
||||||
var/has_printed = 0
|
|
||||||
for(var/obj/item/device/uplink/H in GLOB.world_uplinks)
|
|
||||||
if(isnull(H.uplink_owner) && H.used_TC)
|
|
||||||
if(!has_printed)
|
|
||||||
has_printed = 1
|
|
||||||
to_world("<b>Ownerless Uplinks</b>")
|
|
||||||
to_world("[H.loc] (used [H.used_TC] TC)")
|
|
||||||
to_world(get_uplink_purchases(H))
|
|
||||||
|
|
||||||
/proc/get_uplink_purchases(var/obj/item/device/uplink/H)
|
|
||||||
var/list/refined_log = new()
|
var/list/refined_log = new()
|
||||||
for(var/datum/uplink_item/UI in H.purchase_log)
|
for(var/datum/uplink_item/UI in M.purchase_log)
|
||||||
refined_log.Add("[H.purchase_log[UI]]x[UI.log_icon()][UI.name]")
|
refined_log.Add("[M.purchase_log[UI]]x[UI.log_icon()][UI.name]")
|
||||||
. = english_list(refined_log, nothing_text = "")
|
. = english_list(refined_log, nothing_text = "")
|
||||||
|
|||||||
@@ -292,7 +292,6 @@ var/global/list/additional_antag_types = list()
|
|||||||
antag.check_victory()
|
antag.check_victory()
|
||||||
antag.print_player_summary()
|
antag.print_player_summary()
|
||||||
sleep(10)
|
sleep(10)
|
||||||
print_ownerless_uplinks()
|
|
||||||
|
|
||||||
var/clients = 0
|
var/clients = 0
|
||||||
var/surviving_humans = 0
|
var/surviving_humans = 0
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|
||||||
|
|
||||||
// I placed this here because of how relevant it is.
|
// I placed this here because of how relevant it is.
|
||||||
// You place this in your uplinkable item to check if an uplink is active or not.
|
// You place this in your uplinkable item to check if an uplink is active or not.
|
||||||
// If it is, it will display the uplink menu and return 1, else it'll return false.
|
// If it is, it will display the uplink menu and return 1, else it'll return false.
|
||||||
@@ -14,29 +12,19 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
|
|
||||||
/obj/item/device/uplink
|
/obj/item/device/uplink
|
||||||
var/welcome = "Welcome, Operative" // Welcoming menu message
|
var/welcome = "Welcome, Operative" // Welcoming menu message
|
||||||
var/uses // Numbers of crystals
|
|
||||||
var/list/ItemsCategory // List of categories with lists of items
|
var/list/ItemsCategory // List of categories with lists of items
|
||||||
var/list/ItemsReference // List of references with an associated item
|
var/list/ItemsReference // List of references with an associated item
|
||||||
var/list/nanoui_items // List of items for NanoUI use
|
var/list/nanoui_items // List of items for NanoUI use
|
||||||
var/faction = "" //Antag faction holder.
|
var/faction = "" //Antag faction holder.
|
||||||
|
|
||||||
var/list/purchase_log = new
|
|
||||||
var/datum/mind/uplink_owner = null
|
|
||||||
var/used_TC = 0
|
|
||||||
var/offer_time = 10 MINUTES //The time increment per discount offered
|
var/offer_time = 10 MINUTES //The time increment per discount offered
|
||||||
var/next_offer_time
|
var/next_offer_time
|
||||||
var/datum/uplink_item/discount_item //The item to be discounted
|
var/datum/uplink_item/discount_item //The item to be discounted
|
||||||
var/discount_amount //The amount as a percent the item will be discounted by
|
var/discount_amount //The amount as a percent the item will be discounted by
|
||||||
var/compact_mode = FALSE
|
var/compact_mode = FALSE
|
||||||
|
|
||||||
/obj/item/device/uplink/Initialize(var/mapload, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
|
/obj/item/device/uplink/Initialize(var/mapload)
|
||||||
. = ..()
|
. = ..()
|
||||||
uplink_owner = owner
|
|
||||||
purchase_log = list()
|
|
||||||
if(owner)
|
|
||||||
uses = owner.tcrystals
|
|
||||||
else
|
|
||||||
uses = telecrystals
|
|
||||||
addtimer(CALLBACK(src, .proc/next_offer), offer_time) //It seems like only the /hidden type actually makes use of this...
|
addtimer(CALLBACK(src, .proc/next_offer), offer_time) //It seems like only the /hidden type actually makes use of this...
|
||||||
|
|
||||||
/obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost)
|
/obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost)
|
||||||
@@ -85,7 +73,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
/obj/item/device/uplink/hidden/proc/trigger(mob/user as mob)
|
/obj/item/device/uplink/hidden/proc/trigger(mob/user as mob)
|
||||||
if(!active)
|
if(!active)
|
||||||
toggle()
|
toggle()
|
||||||
interact(user)
|
tgui_interact(user)
|
||||||
|
|
||||||
// Checks to see if the value meets the target. Like a frequency being a traitor_frequency, in order to unlock a headset.
|
// Checks to see if the value meets the target. Like a frequency being a traitor_frequency, in order to unlock a headset.
|
||||||
// If true, it accesses trigger() and returns 1. If it fails, it returns false. Use this to see if you need to close the
|
// If true, it accesses trigger() and returns 1. If it fails, it returns false. Use this to see if you need to close the
|
||||||
@@ -93,8 +81,8 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
/obj/item/device/uplink/hidden/proc/check_trigger(mob/user as mob, var/value, var/target)
|
/obj/item/device/uplink/hidden/proc/check_trigger(mob/user as mob, var/value, var/target)
|
||||||
if(value == target)
|
if(value == target)
|
||||||
trigger(user)
|
trigger(user)
|
||||||
return 1
|
return TRUE
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
// Legacy
|
// Legacy
|
||||||
/obj/item/device/uplink/hidden/interact(mob/user)
|
/obj/item/device/uplink/hidden/interact(mob/user)
|
||||||
@@ -107,12 +95,11 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
return loc
|
return loc
|
||||||
|
|
||||||
/obj/item/device/uplink/hidden/tgui_state(mob/user)
|
/obj/item/device/uplink/hidden/tgui_state(mob/user)
|
||||||
return GLOB.tgui_inventory_state
|
return GLOB.tgui_deep_inventory_state
|
||||||
|
|
||||||
/obj/item/device/uplink/hidden/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
|
/obj/item/device/uplink/hidden/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
|
||||||
if(!active)
|
if(!active)
|
||||||
toggle()
|
toggle()
|
||||||
uses = user.mind.tcrystals
|
|
||||||
ui = SStgui.try_update_ui(user, src, ui)
|
ui = SStgui.try_update_ui(user, src, ui)
|
||||||
if(!ui)
|
if(!ui)
|
||||||
ui = new(user, src, "Uplink", "Remote Uplink")
|
ui = new(user, src, "Uplink", "Remote Uplink")
|
||||||
@@ -127,7 +114,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
|
|
||||||
var/list/data = ..()
|
var/list/data = ..()
|
||||||
|
|
||||||
data["telecrystals"] = uses
|
data["telecrystals"] = user.mind.tcrystals
|
||||||
data["lockable"] = TRUE
|
data["lockable"] = TRUE
|
||||||
data["compactMode"] = compact_mode
|
data["compactMode"] = compact_mode
|
||||||
|
|
||||||
@@ -177,22 +164,19 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
|
|
||||||
data["categories"] = list()
|
data["categories"] = list()
|
||||||
for(var/datum/uplink_category/category in uplink.categories)
|
for(var/datum/uplink_category/category in uplink.categories)
|
||||||
if(category.can_view(src))
|
var/list/cat = list(
|
||||||
var/list/cat = list(
|
|
||||||
"name" = category.name,
|
"name" = category.name,
|
||||||
"items" = (category == selected_cat ? list() : null)
|
"items" = (category == selected_cat ? list() : null)
|
||||||
)
|
)
|
||||||
for(var/datum/uplink_item/item in category.items)
|
for(var/datum/uplink_item/item in category.items)
|
||||||
if(!item.can_view(src))
|
var/cost = item.cost(src, user) || "???"
|
||||||
continue
|
cat["items"] += list(list(
|
||||||
var/cost = item.cost(uses, src) || "???"
|
"name" = item.name,
|
||||||
cat["items"] += list(list(
|
"cost" = cost,
|
||||||
"name" = item.name,
|
"desc" = item.description(),
|
||||||
"cost" = cost,
|
"ref" = REF(item),
|
||||||
"desc" = item.description(),
|
))
|
||||||
"ref" = REF(item),
|
data["categories"] += list(cat)
|
||||||
))
|
|
||||||
data["categories"] += list(cat)
|
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
@@ -228,9 +212,9 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
//
|
//
|
||||||
// Includes normal radio uplink, multitool uplink,
|
// Includes normal radio uplink, multitool uplink,
|
||||||
// implant uplink (not the implant tool) and a preset headset uplink.
|
// implant uplink (not the implant tool) and a preset headset uplink.
|
||||||
/obj/item/device/radio/uplink/New(atom/loc, datum/mind/target_mind, telecrystals)
|
/obj/item/device/radio/uplink/New()
|
||||||
..(loc)
|
..()
|
||||||
hidden_uplink = new(src, target_mind, telecrystals)
|
hidden_uplink = new(src)
|
||||||
icon_state = "radio"
|
icon_state = "radio"
|
||||||
|
|
||||||
/obj/item/device/radio/uplink/attack_self(mob/user as mob)
|
/obj/item/device/radio/uplink/attack_self(mob/user as mob)
|
||||||
@@ -238,6 +222,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
hidden_uplink.trigger(user)
|
hidden_uplink.trigger(user)
|
||||||
|
|
||||||
/obj/item/device/multitool/uplink/New()
|
/obj/item/device/multitool/uplink/New()
|
||||||
|
..()
|
||||||
hidden_uplink = new(src)
|
hidden_uplink = new(src)
|
||||||
|
|
||||||
/obj/item/device/multitool/uplink/attack_self(mob/user as mob)
|
/obj/item/device/multitool/uplink/attack_self(mob/user as mob)
|
||||||
@@ -250,4 +235,3 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
|||||||
/obj/item/device/radio/headset/uplink/New()
|
/obj/item/device/radio/headset/uplink/New()
|
||||||
..()
|
..()
|
||||||
hidden_uplink = new(src)
|
hidden_uplink = new(src)
|
||||||
hidden_uplink.uses = DEFAULT_TELECRYSTAL_AMOUNT
|
|
||||||
|
|||||||
@@ -34,11 +34,11 @@ var/datum/uplink_random_selection/all_uplink_selection = new/datum/uplink_random
|
|||||||
if(!prob(RI.keep_probability))
|
if(!prob(RI.keep_probability))
|
||||||
continue
|
continue
|
||||||
var/datum/uplink_item/I = uplink.items_assoc[RI.uplink_item]
|
var/datum/uplink_item/I = uplink.items_assoc[RI.uplink_item]
|
||||||
if(I.cost(telecrystals, U) > telecrystals)
|
if(I.cost(U) > telecrystals)
|
||||||
continue
|
continue
|
||||||
if(bought_items && (I in bought_items) && !prob(RI.reselect_probability))
|
if(bought_items && (I in bought_items) && !prob(RI.reselect_probability))
|
||||||
continue
|
continue
|
||||||
if(U && !I.can_buy(U))
|
if(U && !I.can_buy(U, telecrystals))
|
||||||
continue
|
continue
|
||||||
return I
|
return I
|
||||||
|
|
||||||
|
|||||||
@@ -126,7 +126,6 @@
|
|||||||
<h4>((The websites linked above are also on our stations wiki. Which is always in need of helping heads to fix it up. The recipes listed on the web link may not be fully accurate so please don't be afraid to pop into the discord wiki channel and lend a hand!))</h4>
|
<h4>((The websites linked above are also on our stations wiki. Which is always in need of helping heads to fix it up. The recipes listed on the web link may not be fully accurate so please don't be afraid to pop into the discord wiki channel and lend a hand!))</h4>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
"}
|
"}
|
||||||
|
|
||||||
//accurate as of 2/23/21
|
//accurate as of 2/23/21
|
||||||
@@ -342,4 +341,4 @@
|
|||||||
<h2>Part 3: Closing Remarks</h2>
|
<h2>Part 3: Closing Remarks</h2>
|
||||||
<p>This all may seem daunting at a glance; so many recipes to learn, and a "lot" to keep in mind. But really it's not - tending the Bar is mostly about going with the flow of things and providing a good times, and drinks just provide liquid courage to make a good time easier. Take a deep breath if you ever feel overwhelmed, and handle one order at a time. You can do it! Don't feel the need to know every recipe, just learn your favorites and go from there; the rest is here or online if someone asks for it! If somebody asks you to give them anything without a specific request, don't panic: evalulate their likes and tolerance level, and try your best to give them something nice!</p>
|
<p>This all may seem daunting at a glance; so many recipes to learn, and a "lot" to keep in mind. But really it's not - tending the Bar is mostly about going with the flow of things and providing a good times, and drinks just provide liquid courage to make a good time easier. Take a deep breath if you ever feel overwhelmed, and handle one order at a time. You can do it! Don't feel the need to know every recipe, just learn your favorites and go from there; the rest is here or online if someone asks for it! If somebody asks you to give them anything without a specific request, don't panic: evalulate their likes and tolerance level, and try your best to give them something nice!</p>
|
||||||
</body>
|
</body>
|
||||||
</html> "}
|
</html> "}
|
||||||
@@ -154,7 +154,12 @@
|
|||||||
last_special = world.time
|
last_special = world.time
|
||||||
drop_from_inventory(E)
|
drop_from_inventory(E)
|
||||||
E.replaced(src)
|
E.replaced(src)
|
||||||
|
|
||||||
|
// Reconnect the organ and children as normally this is done with surgery.
|
||||||
E.status &= ~ORGAN_CUT_AWAY
|
E.status &= ~ORGAN_CUT_AWAY
|
||||||
|
for(var/obj/item/organ/external/child in E.children)
|
||||||
|
child.status &= ~ORGAN_CUT_AWAY
|
||||||
|
|
||||||
var/datum/gender/G = gender_datums[gender]
|
var/datum/gender/G = gender_datums[gender]
|
||||||
visible_message(
|
visible_message(
|
||||||
SPAN_NOTICE("\The [src] attaches \the [E] to [G.his] body!"),
|
SPAN_NOTICE("\The [src] attaches \the [E] to [G.his] body!"),
|
||||||
|
|||||||
@@ -20,6 +20,17 @@
|
|||||||
var/wikilink = null //link to wiki page for species
|
var/wikilink = null //link to wiki page for species
|
||||||
var/icon_height = 32
|
var/icon_height = 32
|
||||||
var/agility = 20 //prob() to do agile things
|
var/agility = 20 //prob() to do agile things
|
||||||
|
|
||||||
|
var/organic_food_coeff = 1
|
||||||
|
var/synthetic_food_coeff = 0
|
||||||
|
//var/vore_numbing = 0
|
||||||
|
var/metabolism = 0.0015
|
||||||
|
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
|
||||||
|
var/trashcan = FALSE //It's always sunny in the wrestling ring.
|
||||||
|
var/eat_minerals = FALSE //HEAVY METAL DIET
|
||||||
|
var/base_species = null // Unused outside of a few species
|
||||||
|
var/selects_bodytype = FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
|
||||||
|
|
||||||
var/is_weaver = FALSE
|
var/is_weaver = FALSE
|
||||||
var/silk_production = FALSE
|
var/silk_production = FALSE
|
||||||
var/silk_reserve = 100
|
var/silk_reserve = 100
|
||||||
|
|||||||
@@ -1,14 +1,3 @@
|
|||||||
|
|
||||||
/datum/species
|
|
||||||
//var/vore_numbing = 0
|
|
||||||
var/gets_food_nutrition = TRUE // If this is set to 0, the person can't get nutrition from food.
|
|
||||||
var/metabolism = 0.0015
|
|
||||||
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
|
|
||||||
var/trashcan = FALSE //It's always sunny in the wrestling ring.
|
|
||||||
var/eat_minerals = FALSE //HEAVY METAL DIET
|
|
||||||
var/base_species = null //Used in every UpdateAppearance call.
|
|
||||||
var/selects_bodytype = FALSE // Allows the species to choose from body types intead of being forced to be just one.
|
|
||||||
|
|
||||||
/datum/species/New()
|
/datum/species/New()
|
||||||
if(!base_species)
|
if(!base_species)
|
||||||
base_species = name
|
base_species = name
|
||||||
|
|||||||
@@ -132,8 +132,8 @@ YW change end */
|
|||||||
desc = "Makes you unable to gain nutrition from anything but blood. To compensate, you get fangs that can be used to drain blood from prey."
|
desc = "Makes you unable to gain nutrition from anything but blood. To compensate, you get fangs that can be used to drain blood from prey."
|
||||||
cost = 0
|
cost = 0
|
||||||
custom_only = FALSE
|
custom_only = FALSE
|
||||||
var_changes = list("gets_food_nutrition" = 0) //The verb is given in human.dm
|
var_changes = list("organic_food_coeff" = 0) //The verb is given in human.dm
|
||||||
excludes = list(/datum/trait/bloodsucker_plus)
|
excludes = list(/datum/trait/bloodsucker_plus) //YW edit
|
||||||
|
|
||||||
/datum/trait/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
/datum/trait/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||||
..(S,H)
|
..(S,H)
|
||||||
@@ -187,11 +187,19 @@ YW change end */
|
|||||||
desc = "You only gain nutrition from raw ore and refined minerals. There's nothing that sates the appetite better than precious gems, exotic or rare minerals and you have damn fine taste. Anything else is beneath you."
|
desc = "You only gain nutrition from raw ore and refined minerals. There's nothing that sates the appetite better than precious gems, exotic or rare minerals and you have damn fine taste. Anything else is beneath you."
|
||||||
cost = 0
|
cost = 0
|
||||||
custom_only = FALSE
|
custom_only = FALSE
|
||||||
var_changes = list("gets_food_nutrition" = 0, "eat_minerals" = 1)
|
var_changes = list("organic_food_coeff" = 0, "eat_minerals" = 1)
|
||||||
|
|
||||||
/datum/trait/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
/datum/trait/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||||
..(S,H)
|
..(S,H)
|
||||||
H.verbs |= /mob/living/proc/eat_minerals
|
H.verbs |= /mob/living/proc/eat_minerals
|
||||||
|
|
||||||
|
/datum/trait/synth_chemfurnace
|
||||||
|
name = "Biofuel Processor"
|
||||||
|
desc = "You are able to gain energy through consuming and processing normal food. Energy-dense foods such as protein bars and survival food will yield the best results."
|
||||||
|
cost = 0
|
||||||
|
custom_only = FALSE
|
||||||
|
can_take = SYNTHETICS
|
||||||
|
var_changes = list("organic_food_coeff" = 0, "synthetic_food_coeff" = 0.25)
|
||||||
|
|
||||||
/datum/trait/glowing_eyes
|
/datum/trait/glowing_eyes
|
||||||
name = "Glowing Eyes"
|
name = "Glowing Eyes"
|
||||||
|
|||||||
@@ -234,7 +234,7 @@
|
|||||||
name = "Evolved Bloodsucker"
|
name = "Evolved Bloodsucker"
|
||||||
desc = "Makes you able to gain nutrition by draining blood as well as eating food. To compensate, you get fangs that can be used to drain blood from prey."
|
desc = "Makes you able to gain nutrition by draining blood as well as eating food. To compensate, you get fangs that can be used to drain blood from prey."
|
||||||
cost = 1
|
cost = 1
|
||||||
var_changes = list("gets_food_nutrition" = 0.5) // Hopefully this works???
|
var_changes = list("organic_food_coeff" = 0.5) // Hopefully this works???
|
||||||
excludes = list(/datum/trait/bloodsucker)
|
excludes = list(/datum/trait/bloodsucker)
|
||||||
|
|
||||||
/datum/trait/bloodsucker_plus/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
/datum/trait/bloodsucker_plus/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
//TFF 5/1/20 - Add Ore Scanner for mining drones
|
//TFF 5/1/20 - Add Ore Scanner for mining drones
|
||||||
/obj/item/weapon/robot_module/drone/mining/New()
|
/obj/item/weapon/robot_module/drone/mining/New()
|
||||||
..()
|
..()
|
||||||
src.modules += new /obj/item/weapon/mining_scanner(src)
|
src.modules += new /obj/item/weapon/mining_scanner(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/robot_module/robot/engineering/New()
|
||||||
|
..()
|
||||||
|
src.modules += new /obj/item/weapon/pipe_dispenser(src)
|
||||||
@@ -307,5 +307,4 @@ var/list/civilian_cartridges = list(
|
|||||||
name = "F.R.A.M.E. cartridge"
|
name = "F.R.A.M.E. cartridge"
|
||||||
icon_state = "cart"
|
icon_state = "cart"
|
||||||
charges = 5
|
charges = 5
|
||||||
var/telecrystals = 0
|
|
||||||
messenger_plugins = list(new/datum/data/pda/messenger_plugin/virus/frame)
|
messenger_plugins = list(new/datum/data/pda/messenger_plugin/virus/frame)
|
||||||
|
|||||||
@@ -85,7 +85,4 @@
|
|||||||
P.lock_code = lock_code
|
P.lock_code = lock_code
|
||||||
// else
|
// else
|
||||||
// P.hidden_uplink.hidden_crystals += P.hidden_uplink.uses //Temporarially hide the PDA's crystals, so you can't steal telecrystals.
|
// P.hidden_uplink.hidden_crystals += P.hidden_uplink.uses //Temporarially hide the PDA's crystals, so you can't steal telecrystals.
|
||||||
var/obj/item/weapon/cartridge/frame/parent_cart = pda.cartridge
|
|
||||||
P.hidden_uplink.uses = parent_cart.telecrystals
|
|
||||||
parent_cart.telecrystals = 0
|
|
||||||
P.hidden_uplink.active = TRUE
|
P.hidden_uplink.active = TRUE
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
var/is_vampire = 0 //VOREStation Edit START
|
var/is_vampire = 0 //VOREStation Edit START
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
if(H.species.gets_food_nutrition == 0)
|
if(H.species.organic_food_coeff == 0)
|
||||||
H.adjust_nutrition(removed)
|
H.adjust_nutrition(removed)
|
||||||
is_vampire = 1 //VOREStation Edit END
|
is_vampire = 1 //VOREStation Edit END
|
||||||
if(alien == IS_SLIME) // Treat it like nutriment for the jello, but not equivalent.
|
if(alien == IS_SLIME) // Treat it like nutriment for the jello, but not equivalent.
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
var/allergen_type = GENERIC // What potential allergens does this contain?
|
var/allergen_type = GENERIC // What potential allergens does this contain?
|
||||||
var/injectable = 0
|
var/injectable = 0
|
||||||
color = "#664330"
|
color = "#664330"
|
||||||
|
affects_robots = 1 //VOREStation Edit
|
||||||
|
|
||||||
/datum/reagent/nutriment/mix_data(var/list/newdata, var/newamount)
|
/datum/reagent/nutriment/mix_data(var/list/newdata, var/newamount)
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@
|
|||||||
data -= taste
|
data -= taste
|
||||||
|
|
||||||
/datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
/datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||||
if(!injectable && alien != IS_SLIME && alien != IS_CHIMERA) //VOREStation Edit
|
if(!injectable && alien != IS_SLIME && alien != IS_CHIMERA && !M.isSynthetic()) //VOREStation Edit
|
||||||
M.adjustToxLoss(0.1 * removed)
|
M.adjustToxLoss(0.1 * removed)
|
||||||
return
|
return
|
||||||
if(M.species.allergens & allergen_type)
|
if(M.species.allergens & allergen_type)
|
||||||
@@ -906,7 +907,7 @@
|
|||||||
if(adj_temp < 0 && M.bodytemperature > 310)
|
if(adj_temp < 0 && M.bodytemperature > 310)
|
||||||
M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT))
|
M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT))
|
||||||
if(issmall(M)) removed *= 2 //CHOMP Station addition Small bodymass, more effect from lower volume.
|
if(issmall(M)) removed *= 2 //CHOMP Station addition Small bodymass, more effect from lower volume.
|
||||||
if(M.species.gets_food_nutrition) //CHOMPStation addition. If this is set to 0, they don't get nutrition from food.
|
if(M.species.organic_food_coeff) //CHOMPStation addition. If this is set to 0, they don't get nutrition from food.
|
||||||
M.nutrition += nutriment_factor * removed //CHOMPStation addition For hunger and fatness
|
M.nutrition += nutriment_factor * removed //CHOMPStation addition For hunger and fatness
|
||||||
/* VOREStation Removal
|
/* VOREStation Removal
|
||||||
if(alien == IS_SLIME && water_based)
|
if(alien == IS_SLIME && water_based)
|
||||||
|
|||||||
@@ -125,7 +125,7 @@
|
|||||||
/datum/reagent/ethanol/monstertamer/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
/datum/reagent/ethanol/monstertamer/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
if(M.species.gets_food_nutrition) //it's still food!
|
if(M.species.organic_food_coeff) //it's still food!
|
||||||
switch(alien)
|
switch(alien)
|
||||||
if(IS_DIONA) //Diona don't get any nutrition from nutriment or protein.
|
if(IS_DIONA) //Diona don't get any nutrition from nutriment or protein.
|
||||||
if(IS_SKRELL)
|
if(IS_SKRELL)
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
..()
|
..()
|
||||||
if(alien == IS_SKRELL)
|
if(alien == IS_SKRELL)
|
||||||
M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein.
|
M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein.
|
||||||
if(M.species.gets_food_nutrition)
|
if(M.species.organic_food_coeff)
|
||||||
if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein
|
if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein
|
||||||
M.adjust_nutrition(alt_nutriment_factor * removed)
|
M.adjust_nutrition(alt_nutriment_factor * removed)
|
||||||
|
|
||||||
@@ -429,7 +429,7 @@
|
|||||||
/datum/reagent/ethanol/hairoftherat/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
/datum/reagent/ethanol/hairoftherat/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
if(M.species.gets_food_nutrition) //it's still food!
|
if(M.species.organic_food_coeff) //it's still food!
|
||||||
switch(alien)
|
switch(alien)
|
||||||
if(IS_DIONA) //Diona don't get any nutrition from nutriment or protein.
|
if(IS_DIONA) //Diona don't get any nutrition from nutriment or protein.
|
||||||
if(IS_SKRELL)
|
if(IS_SKRELL)
|
||||||
@@ -455,6 +455,6 @@
|
|||||||
..()
|
..()
|
||||||
if(alien == IS_SKRELL)
|
if(alien == IS_SKRELL)
|
||||||
M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein.
|
M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein.
|
||||||
if(M.species.gets_food_nutrition)
|
if(M.species.organic_food_coeff)
|
||||||
if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein
|
if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein
|
||||||
M.nutrition += (alt_nutriment_factor * removed)
|
M.nutrition += (alt_nutriment_factor * removed)
|
||||||
@@ -59,6 +59,13 @@
|
|||||||
"<span class='notice'>You have attached [target]'s [E.name] to the [E.amputation_point].</span>")
|
"<span class='notice'>You have attached [target]'s [E.name] to the [E.amputation_point].</span>")
|
||||||
user.drop_from_inventory(E)
|
user.drop_from_inventory(E)
|
||||||
E.replaced(target)
|
E.replaced(target)
|
||||||
|
|
||||||
|
// Modular bodyparts (like prosthetics) do not need to be reconnected.
|
||||||
|
if(E.get_modular_limb_category() != MODULAR_BODYPART_INVALID)
|
||||||
|
E.status &= ~ORGAN_CUT_AWAY
|
||||||
|
for(var/obj/item/organ/external/child in E.children)
|
||||||
|
child.status &= ~ORGAN_CUT_AWAY
|
||||||
|
|
||||||
target.update_icons_body(FALSE)
|
target.update_icons_body(FALSE)
|
||||||
target.updatehealth()
|
target.updatehealth()
|
||||||
target.UpdateDamageIcon()
|
target.UpdateDamageIcon()
|
||||||
|
|||||||
@@ -103,11 +103,6 @@
|
|||||||
|
|
||||||
///// If user clicked on themselves
|
///// If user clicked on themselves
|
||||||
if(src == G.assailant && is_vore_predator(src))
|
if(src == G.assailant && is_vore_predator(src))
|
||||||
if(!G.affecting.devourable)
|
|
||||||
to_chat(user, "<span class='notice'>They aren't able to be devoured.</span>")
|
|
||||||
log_and_message_admins("[key_name_admin(src)] attempted to devour [key_name_admin(G.affecting)] against their prefs ([G.affecting ? ADMIN_JMP(G.affecting) : "null"])")
|
|
||||||
return FALSE
|
|
||||||
|
|
||||||
if(feed_grabbed_to_self(src, G.affecting))
|
if(feed_grabbed_to_self(src, G.affecting))
|
||||||
qdel(G)
|
qdel(G)
|
||||||
return TRUE
|
return TRUE
|
||||||
@@ -503,6 +498,11 @@
|
|||||||
if(user_to_pred > 1 || user_to_prey > 1)
|
if(user_to_pred > 1 || user_to_prey > 1)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
|
if(!prey.devourable)
|
||||||
|
to_chat(user, "<span class='notice'>They aren't able to be devoured.</span>")
|
||||||
|
log_and_message_admins("[key_name_admin(src)] attempted to devour [key_name_admin(prey)] against their prefs ([prey ? ADMIN_JMP(prey) : "null"])")
|
||||||
|
return FALSE
|
||||||
|
|
||||||
// Prepare messages
|
// Prepare messages
|
||||||
//CHOMPEdit begin
|
//CHOMPEdit begin
|
||||||
if(prey.is_slipping)
|
if(prey.is_slipping)
|
||||||
|
|||||||
Reference in New Issue
Block a user