mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-25 00:22:39 +00:00
## About The Pull Request This PR does many things and I expect to be asked to atomize some stuff. ### Oldstation Additions Oldstation now has their own research server, generating their own points. To help alleviate major concerns, they have a few stuff to help with this: - They now have a pre-built operating computer - They now have an Autopsy scanner - They now have access to Experimental Dissection Experimental Dissection is the old dissection, giving research points in the form of paper notes on completion. They must be turned in to the RND server (only works on the Oldstation one, so you can't abuse this) for points. This was an idea I've had for some time, as Oldstation is used somewhat as a representation of how ss13 used to be (through its use of directional windows (before they got removed, but I'd like to bring them back), old IDs, RTGs, and old engines before they got removed from the game fully) Considering there are 11 alien mobs in Oldstation, there is 27.5k research points to get from alien corpses, enough to bring them up to speed with whatever they wish to do. This is their 'alternative' for experiments (which they can still do if they want, but it is very hard to do, outside of dissection which is needed for the node). This surgery isn't repeatable, isn't upgradable, and isn't removed by being healed. It is not mutually exclusive with autopsy (so you can't ruin yourself doing the wrong surgery). ### Other stuff - Ninjas now drain RND points from the server they drain from, rather than always hitting science - Syncing machines to research roundstart is now a macro, and now immediately syncs to a server on your Z-level. Machines will automatically connect to the Science servers if none else are available. ### non-player facing - Science, Admin, and Oldstation techwebs are now no longer vars on research, but stored in research's list of techwebs. - ``get_available_servers`` and ``find_valid_servers`` are now procs on the research subsystem, rather than the experisci component. - Oldstation code has been split into separate files. ## Why It's Good For The Game Oldstation is one of my favorite ruins, but it is also one of the largest complaints for RND (along with Golems) because they use the station's Science nodes & points (I recently tried de-hardcoding Science stuff to help prepare for this, but I didn't get everything in advance). The complaint stems from these ghost roles, who are meant to be a fun activity to do while waiting for the next round, using the station's research points for their own stuff, completely untrackable unless someone goes out of their way to grief a ghost spawn just for using points to get things they need. These roles make their own servers to drain the station, and I find that unfun and quite boring for everyone- it's also not very flavorful, why would Charliestation know of the station's RND to take advantage of it? This hopes to fix those issues, make Charliestation more worthwhile, and more flavorful. ## Changelog 🆑 fix: Getting a node researched now properly makes it no longer hidden. fix: Ninjas draining RD servers now drains it from the connected techweb, rather than sniping Science. balance: Machines will first try to connect to a techweb with servers on their z-level, with the Science techweb remaining as fallback. add: Oldstation RND, comes with their own Techweb and special surgery to gain research points through dissecting Xenomorphs. /🆑
153 lines
5.6 KiB
Plaintext
153 lines
5.6 KiB
Plaintext
///How many research points you gain from dissecting a Human.
|
|
#define BASE_HUMAN_REWARD 500
|
|
|
|
/datum/surgery/advanced/experimental_dissection
|
|
name = "Experimental Dissection"
|
|
desc = "A surgical procedure which analyzes the biology of a corpse, and automatically adds new findings to the research database."
|
|
steps = list(
|
|
/datum/surgery_step/incise,
|
|
/datum/surgery_step/retract_skin,
|
|
/datum/surgery_step/experimental_dissection,
|
|
/datum/surgery_step/close,
|
|
)
|
|
surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY
|
|
possible_locs = list(BODY_ZONE_CHEST)
|
|
target_mobtypes = list(/mob/living)
|
|
|
|
/datum/surgery/advanced/experimental_dissection/can_start(mob/user, mob/living/target)
|
|
. = ..()
|
|
if(HAS_TRAIT_FROM(target, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT))
|
|
return FALSE
|
|
if(target.stat != DEAD)
|
|
return FALSE
|
|
|
|
/datum/surgery_step/experimental_dissection
|
|
name = "dissection"
|
|
implements = list(
|
|
/obj/item/autopsy_scanner = 100,
|
|
TOOL_SCALPEL = 60,
|
|
TOOL_KNIFE = 20,
|
|
/obj/item/shard = 10,
|
|
)
|
|
time = 12 SECONDS
|
|
silicons_obey_prob = TRUE
|
|
|
|
/datum/surgery_step/experimental_dissection/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
|
user.visible_message("<span class='notice'>[user] starts dissecting [target].</span>", "<span class='notice'>You start dissecting [target].</span>")
|
|
|
|
/datum/surgery_step/experimental_dissection/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
|
|
var/points_earned = check_value(target)
|
|
user.visible_message("<span class='notice'>[user] dissects [target], discovering [points_earned] point\s of data!</span>", "<span class='notice'>You dissect [target], finding [points_earned] point\s worth of discoveries, you also write a few notes.</span>")
|
|
|
|
var/obj/item/research_notes/the_dossier = new /obj/item/research_notes(user.loc, points_earned, "biology")
|
|
if(!user.put_in_hands(the_dossier) && istype(user.get_inactive_held_item(), /obj/item/research_notes))
|
|
var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item()
|
|
hand_dossier.merge(the_dossier)
|
|
|
|
var/obj/item/bodypart/target_chest = target.get_bodypart(BODY_ZONE_CHEST)
|
|
target.apply_damage(80, BRUTE, target_chest)
|
|
ADD_TRAIT(target, TRAIT_DISSECTED, EXPERIMENTAL_SURGERY_TRAIT)
|
|
return ..()
|
|
|
|
/datum/surgery_step/experimental_dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
|
var/points_earned = round(check_value(target) * 0.01)
|
|
user.visible_message(
|
|
"<span class='notice'>[user] dissects [target]!</span>",
|
|
"<span class='notice'>You dissect [target], but do not find anything particularly interesting.</span>",
|
|
)
|
|
|
|
var/obj/item/research_notes/the_dossier = new /obj/item/research_notes(user.loc, points_earned, "biology")
|
|
if(!user.put_in_hands(the_dossier) && istype(user.get_inactive_held_item(), /obj/item/research_notes))
|
|
var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item()
|
|
hand_dossier.merge(the_dossier)
|
|
|
|
var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST)
|
|
target.apply_damage(80, BRUTE, L)
|
|
return TRUE
|
|
|
|
///Calculates how many research points dissecting 'target' is worth.
|
|
/datum/surgery_step/experimental_dissection/proc/check_value(mob/living/target)
|
|
var/cost = BASE_HUMAN_REWARD
|
|
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/human_target = target
|
|
if(human_target.dna?.species)
|
|
if(ismonkey(human_target))
|
|
cost /= 5
|
|
else if(isabductor(human_target))
|
|
cost *= 4
|
|
else if(isgolem(human_target) || iszombie(human_target))
|
|
cost *= 3
|
|
else if(isjellyperson(human_target) || ispodperson(human_target))
|
|
cost *= 2
|
|
else if(isalienroyal(target))
|
|
cost *= 10
|
|
else if(isalienadult(target))
|
|
cost *= 5
|
|
else
|
|
cost /= 6
|
|
|
|
return cost
|
|
|
|
#undef BASE_HUMAN_REWARD
|
|
|
|
/obj/item/research_notes
|
|
name = "research notes"
|
|
desc = "Valuable scientific data. Use it in an ancient research server to turn it in."
|
|
icon = 'icons/obj/service/bureaucracy.dmi'
|
|
icon_state = "paper"
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
///research points it holds
|
|
var/value = 100
|
|
///origin of the research
|
|
var/origin_type = "debug"
|
|
///if it ws merged with different origins to apply a bonus
|
|
var/mixed = FALSE
|
|
|
|
/obj/item/research_notes/Initialize(mapload, value, origin_type)
|
|
. = ..()
|
|
if(value)
|
|
src.value = value
|
|
if(origin_type)
|
|
src.origin_type = origin_type
|
|
change_vol()
|
|
|
|
/obj/item/research_notes/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("It is worth [value] research points.")
|
|
|
|
/obj/item/research_notes/attackby(obj/item/attacking_item, mob/living/user, params)
|
|
if(istype(attacking_item, /obj/item/research_notes))
|
|
var/obj/item/research_notes/notes = attacking_item
|
|
value = value + notes.value
|
|
change_vol()
|
|
qdel(notes)
|
|
return
|
|
return ..()
|
|
|
|
/// proc that changes name and icon depending on value
|
|
/obj/item/research_notes/proc/change_vol()
|
|
if(value >= 10000)
|
|
name = "revolutionary discovery in the field of [origin_type]"
|
|
icon_state = "docs_verified"
|
|
else if(value >= 2500)
|
|
name = "essay about [origin_type]"
|
|
icon_state = "paper_words"
|
|
else if(value >= 100)
|
|
name = "notes of [origin_type]"
|
|
icon_state = "paperslip_words"
|
|
else
|
|
name = "fragmentary data of [origin_type]"
|
|
icon_state = "scrap"
|
|
|
|
///proc when you slap research notes into another one, it applies a bonus if they are of different origin (only applied once)
|
|
/obj/item/research_notes/proc/merge(obj/item/research_notes/new_paper)
|
|
var/bonus = min(value , new_paper.value)
|
|
value = value + new_paper.value
|
|
if(origin_type != new_paper.origin_type && !mixed)
|
|
value += bonus * 0.3
|
|
origin_type = "[origin_type] and [new_paper.origin_type]"
|
|
mixed = TRUE
|
|
change_vol()
|
|
qdel(new_paper)
|