Merge branch 'master' into upstream-merge-9751

This commit is contained in:
Nadyr
2021-03-06 02:31:39 -05:00
committed by GitHub
23 changed files with 125 additions and 151 deletions

View File

@@ -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)

View File

@@ -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 *

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -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 = "")

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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> "}

View File

@@ -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!"),

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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.

View File

@@ -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)

View File

@@ -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)

View File

@@ -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()

View File

@@ -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)