Code optimizations + clean-up (#45)

This commit is contained in:
SandPoot
2020-08-14 02:01:54 -03:00
committed by GitHub
parent 88a63bfa03
commit fe8119c18c
21 changed files with 90 additions and 601 deletions
-1
View File
@@ -1,3 +1,2 @@
//mob traits
#define TRAIT_SHELTERED "sheltered" // thanks yog, i want it
#define TRAIT_KNOWSSAGARU "knows sagaru"
+2 -4
View File
@@ -10,10 +10,8 @@
/datum/quirk/sheltered/on_spawn()
var/mob/living/carbon/human/H = quirk_holder
H.remove_language(/datum/language/common)
/* if(!H.can_speak_language(/datum/language/draconic) && !H.can_speak_language(/datum/language/machine))
H.grant_language(/datum/language/japanese)
*/ //if doesn't know common wont know anything else unless already does.... like lizards! :3
// You can pick languages for your character, if you don't pick anything, enjoy the rest of the round understanding nothing.
/datum/quirk/sheltered/remove() //i mean, the lose text explains it, so i'm making it actually work
var/mob/living/carbon/human/H = quirk_holder
H.grant_language(/datum/language/common)
H.grant_language(/datum/language/common)
+3 -3
View File
@@ -40,7 +40,7 @@
occupant.forceMove(drop_location())
occupant = null
return
to_chat(occupant, "<span class='notice'>You enter [src]</span>")
to_chat(occupant, "<span class='notice'>You enter [src].</span>")
dosurgery()
@@ -78,14 +78,14 @@
currentorgan.forceMove(get_turf(src))
storedorgan.Insert(occupant)//insert stored organ into the user
storedorgan = null
occupant.visible_message("<span class='notice'>[src] completes the surgery procedure", "<span class='notice'>[src] inserts the organ into your body.</span>")
occupant.visible_message("<span class='notice'>[src] completes the surgery procedure.", "<span class='notice'>[src] inserts the organ into your body.</span>")
playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, 0)
processing = FALSE
open_machine()
/obj/machinery/autodoc/open_machine(mob/user)
if(processing)
occupant.visible_message("<span class='notice'>[user] cancels [src]'s procedure", "<span class='notice'>[src] stops inserting the organ into your body.</span>")
occupant.visible_message("<span class='notice'>[user] cancels [src]'s procedure.", "<span class='notice'>[src] stops inserting the organ into your body.</span>")
processing = FALSE
if(occupant)
occupant.forceMove(drop_location())
+5 -495
View File
@@ -1,500 +1,10 @@
/*
* Cryogenic refrigeration unit. Basically a despawner.
* Stealing a lot of concepts/code from sleepers due to massive laziness.
* The despawn tick will only fire if it's been more than time_till_despawned ticks
* since time_entered, which is world.time when the occupant moves in.
* ~ Zuhayr
*/
//Main cryopod console.
/obj/machinery/computer/cryopod_tele
name = "teleporter oversight console"
desc = "An interface between crew and the internal storage, because centcom certainly won't let you take some stuff home..."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "cellconsole_1"
circuit = /obj/item/circuitboard/cryopodcontrol
density = FALSE
interaction_flags_machine = INTERACT_MACHINE_OFFLINE
req_one_access = list(ACCESS_HEADS, ACCESS_ARMORY) //Heads of staff or the warden can go here to claim recover items from their department that people went were cryodormed with.
var/menu = 1 //Which menu screen to display
//Used for logging people entering cryosleep and important items they are carrying.
var/list/frozen_crew = list()
var/list/frozen_items = list()
// Used for containing rare items traitors need to steal, so it's not
// game-over if they get iced
var/list/objective_items = list()
// A cache of theft datums so you don't have to re-create them for
// each item check
var/list/theft_cache = list()
var/allow_items = TRUE
/obj/machinery/computer/cryopod_tele/attack_ai()
attack_hand()
/obj/machinery/computer/cryopod_tele/ui_interact(mob/user = usr)
if(!is_operational())
return
user.set_machine(src)
add_fingerprint(user)
var/dat = ""
dat += "<h2>Welcome, [user.real_name].</h2><hr/>"
dat += "<br><br>"
switch(src.menu)
if(1)
dat += "<a href='byond://?src=[REF(src)];menu=2'>View crew storage log</a><br><br>"
if(allow_items)
dat += "<a href='byond://?src=[REF(src)];menu=3'>View objects storage log</a><br><br>"
dat += "<a href='byond://?src=[REF(src)];item=1'>Recover object</a><br><br>"
dat += "<a href='byond://?src=[REF(src)];allitems=1'>Recover all objects</a><br>"
if(2)
dat += "<a href='byond://?src=[REF(src)];menu=1'><< Back</a><br><br>"
dat += "<h3>Recently teleported Crew</h3><br/><hr/><br/>"
if(!frozen_crew.len)
dat += "There has been no storage usage at this terminal.<br/>"
else
for(var/person in frozen_crew)
dat += "[person]<br/>"
dat += "<hr/>"
if(3)
dat += "<a href='byond://?src=[REF(src)];menu=1'><< Back</a><br><br>"
dat += "<h3>Recently stored objects</h3><br/><hr/><br/>"
if(!frozen_items.len)
dat += "There has been no storage usage at this terminal.<br/>"
else
for(var/obj/item/I in frozen_items)
dat += "[I.name]<br/>"
dat += "<hr/>"
var/datum/browser/popup = new(user, "cryopod_console", "CentCom Teleporter System Control")
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/machinery/computer/cryopod_tele/Topic(href, href_list)
if(..())
return TRUE
var/mob/user = usr
add_fingerprint(user)
if(href_list["item"])
if(!allowed(user))
to_chat(user, "<span class='warning'>Access Denied.</span>")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
if(!allow_items) return
if(frozen_items.len == 0)
to_chat(user, "<span class='notice'>There is nothing to recover from storage.</span>")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items
playsound(src, "terminal_type", 25, 0)
if(!I)
return
if(!(I in frozen_items))
to_chat(user, "<span class='notice'>\The [I] is no longer in storage.</span>")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
visible_message("<span class='notice'>The console beeps happily as it disgorges \the [I].</span>")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
I.forceMove(drop_location())
if(user && Adjacent(user) && user.can_hold_items())
user.put_in_hands(I)
frozen_items -= I
updateUsrDialog()
else if(href_list["allitems"])
playsound(src, "terminal_type", 25, 0)
if(!allowed(user))
to_chat(user, "<span class='warning'>Access Denied.</span>")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
if(!allow_items)
return
if(frozen_items.len == 0)
to_chat(user, "<span class='notice'>There is nothing to recover from storage.</span>")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
visible_message("<span class='notice'>The console beeps happily as it disgorges the desired objects.</span>")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
for(var/obj/item/I in frozen_items)
I.forceMove(drop_location())
frozen_items -= I
updateUsrDialog()
else if (href_list["menu"])
src.menu = text2num(href_list["menu"])
playsound(src, "terminal_type", 25, 0)
updateUsrDialog()
ui_interact(usr)
updateUsrDialog()
return
/obj/item/circuitboard/cryopodcontrol_tele
name = "Circuit board (Teleporter Oversight Console)"
build_path = "/obj/machinery/computer/cryopod_tele"
/obj/machinery/computer/cryopod_tele/contents_explosion()
return
//Cryopods themselves.
/obj/machinery/cryopod_tele
//Teleporters themselves. Also holy crap, what a code crunch i did on this!
/obj/machinery/cryopod/tele
name = "CentCom Teleporter"
desc = "Suited for everyone who wishes to leave the station and go back to CentCom.\n<span class='notice'>This is not for actually getting into CentCom, you will leave the round.</span>"
icon = 'icons/obj/machines/implantchair.dmi'
icon_state = "implantchair_open"
density = TRUE
anchored = TRUE
state_open = TRUE
tele = TRUE
var/on_store_message = "has been teleported to CentCom."
var/on_store_name = "Teleporter Oversight"
// 15 minutes-ish safe period before being despawned.
var/time_till_despawn = 15 * 600 // This is reduced by 90% if a player manually enters cryo
var/despawn_world_time = null // Used to keep track of the safe period.
var/obj/machinery/computer/cryopod_tele/control_computer
var/last_no_computer_message = 0
// These items are preserved when the process() despawn proc occurs.
var/static/list/preserve_items = typecacheof(list(
/obj/item/hand_tele,
/obj/item/card/id/captains_spare,
/obj/item/aicard,
/obj/item/mmi,
/obj/item/paicard,
/obj/item/gun,
/obj/item/pinpointer,
/obj/item/clothing/shoes/magboots,
/obj/item/areaeditor/blueprints,
/obj/item/clothing/head/helmet/space,
/obj/item/clothing/suit/space,
/obj/item/clothing/suit/armor,
/obj/item/defibrillator/compact,
/obj/item/reagent_containers/hypospray/CMO,
/obj/item/clothing/accessory/medal/gold/captain,
/obj/item/clothing/gloves/krav_maga,
/obj/item/nullrod,
/obj/item/tank/jetpack,
/obj/item/documents,
/obj/item/nuke_core_container
))
// These items will NOT be preserved
var/static/list/do_not_preserve_items = typecacheof(list(
/obj/item/mmi/posibrain,
/obj/item/gun/energy/laser/mounted,
/obj/item/gun/energy/e_gun/advtaser/mounted,
/obj/item/gun/ballistic/revolver/grenadelauncher/cyborg,
/obj/item/gun/energy/disabler/cyborg,
/obj/item/gun/energy/e_gun/advtaser/cyborg,
/obj/item/gun/energy/printer,
/obj/item/gun/energy/kinetic_accelerator/cyborg,
/obj/item/gun/energy/laser/cyborg
))
/obj/machinery/cryopod_tele/Initialize(mapload)
. = ..()
update_icon()
find_control_computer(mapload)
/obj/machinery/cryopod_tele/proc/find_control_computer(urgent = FALSE)
for(var/obj/machinery/computer/cryopod_tele/C in get_area(src))
control_computer = C
if(C)
return C
break
// Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged
if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time)
log_admin("CentCom Teleporter in [get_area(src)] could not find control computer!")
message_admins("CentCom Teleporter in [get_area(src)] could not find control computer!")
last_no_computer_message = world.time
return control_computer != null
/obj/machinery/cryopod_tele/close_machine(mob/user)
if(!control_computer)
find_control_computer(TRUE)
if((isnull(user) || istype(user)) && state_open && !panel_open)
..(user)
var/mob/living/mob_occupant = occupant
investigate_log("CentCom Teleporter closed with occupant [key_name(occupant)] by user [key_name(user)].", INVESTIGATE_CRYOGENICS)
if(mob_occupant && mob_occupant.stat != DEAD)
to_chat(occupant, "<span class='boldnotice'>You feel cool air surround you. You go numb as your senses turn inward.</span>")
if(mob_occupant.client)//if they're logged in
despawn_world_time = world.time + (time_till_despawn * 0.1)
else
despawn_world_time = world.time + time_till_despawn
icon_state = "implantchair_occupied"
/obj/machinery/cryopod_tele/open_machine()
if(occupant)
investigate_log("CentCom Teleporter opened with occupant [key_name(occupant)] inside.", INVESTIGATE_CRYOGENICS)
..()
icon_state = "implantchair_open"
density = TRUE
name = initial(name)
/obj/machinery/cryopod_tele/container_resist(mob/living/user)
investigate_log("CentCom Teleporter container resisted by [key_name(user)] with occupant [key_name(occupant)].", INVESTIGATE_CRYOGENICS)
visible_message("<span class='notice'>[occupant] emerges from [src]!</span>",
"<span class='notice'>You climb out of [src]!</span>")
open_machine()
/obj/machinery/cryopod_tele/relaymove(mob/user)
container_resist(user)
/obj/machinery/cryopod_tele/process()
if(!occupant)
return
var/mob/living/mob_occupant = occupant
if(mob_occupant)
// Eject dead people
if(mob_occupant.stat == DEAD)
open_machine()
if(!(world.time > despawn_world_time + 100))//+ 10 seconds
return
if(!mob_occupant.client && mob_occupant.stat < 2) //Occupant is living and has no client.
if(!control_computer)
find_control_computer(urgent = TRUE)//better hope you found it this time
despawn_occupant()
do_sparks(2, TRUE, src)
playsound(src, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
#define CRYO_DESTROY 0
#define CRYO_PRESERVE 1
#define CRYO_OBJECTIVE 2
#define CRYO_IGNORE 3
#define CRYO_DESTROY_LATER 4
/obj/machinery/cryopod_tele/proc/should_preserve_item(obj/item/I)
for(var/datum/objective_item/steal/T in control_computer.theft_cache)
if(istype(I, T.targetitem) && T.check_special_completion(I))
return CRYO_OBJECTIVE
if(preserve_items[I] && !do_not_preserve_items[I])
return CRYO_PRESERVE
return CRYO_DESTROY
// This function can not be undone; do not call this unless you are sure
/obj/machinery/cryopod_tele/proc/despawn_occupant()
if(!control_computer)
find_control_computer()
var/mob/living/mob_occupant = occupant
var/list/obj/item/cryo_items = list()
investigate_log("Despawning [key_name(mob_occupant)].", INVESTIGATE_CRYOGENICS)
//Handle Borg stuff first
if(iscyborg(mob_occupant))
var/mob/living/silicon/robot/R = mob_occupant
if(R.mmi?.brain)
cryo_items[R.mmi] = CRYO_DESTROY_LATER
cryo_items[R.mmi.brain] = CRYO_DESTROY_LATER
for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc
for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags
cryo_items[O] = should_preserve_item(O)
O.forceMove(src)
R.module.remove_module(I, TRUE) //delete the module itself so it doesn't transfer over.
//Drop all items into the pod.
for(var/obj/item/I in mob_occupant)
if(cryo_items[I] == CRYO_IGNORE || cryo_items[I] ==CRYO_DESTROY_LATER)
continue
cryo_items[I] = should_preserve_item(I)
mob_occupant.transferItemToLoc(I, src, TRUE)
if(I.contents.len) //Make sure we catch anything not handled by qdel() on the items.
if(cryo_items[I] != CRYO_DESTROY) // Don't remove the contents of things that need preservation
continue
for(var/obj/item/O in I.contents)
cryo_items[O] = should_preserve_item(O)
O.forceMove(src)
for(var/A in cryo_items)
var/obj/item/I = A
if(QDELETED(I)) //edge cases and DROPDEL.
continue
var/preserve = cryo_items[I]
if(preserve == CRYO_DESTROY_LATER)
continue
if(preserve != CRYO_IGNORE)
if(preserve == CRYO_DESTROY)
qdel(I)
else if(control_computer?.allow_items)
control_computer.frozen_items += I
if(preserve == CRYO_OBJECTIVE)
control_computer.objective_items += I
I.moveToNullspace()
else
I.forceMove(loc)
cryo_items -= I
//Update any existing objectives involving this mob.
for(var/datum/objective/O in GLOB.objectives)
// We don't want revs to get objectives that aren't for heads of staff. Letting
// them win or lose based on cryo is silly so we remove the objective.
if(istype(O,/datum/objective/mutiny) && O.target == mob_occupant.mind)
qdel(O)
else if(O.target && istype(O.target, /datum/mind))
if(O.target == mob_occupant.mind)
if(O.owner && O.owner.current)
to_chat(O.owner.current, "<BR><span class='userdanger'>You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!</span>")
O.target = null
spawn(10) //This should ideally fire after the occupant is deleted.
if(!O)
return
O.find_target()
O.update_explanation_text()
if(!(O.target))
qdel(O)
if(mob_occupant.mind)
//Handle job slot/tater cleanup.
if(mob_occupant.mind.assigned_role)
var/job = mob_occupant.mind.assigned_role
SSjob.FreeRole(job)
mob_occupant.mind.special_role = null
// Delete them from datacore.
var/announce_rank = null
for(var/datum/data/record/R in GLOB.data_core.medical)
if((R.fields["name"] == mob_occupant.real_name))
qdel(R)
for(var/datum/data/record/T in GLOB.data_core.security)
if((T.fields["name"] == mob_occupant.real_name))
qdel(T)
for(var/datum/data/record/G in GLOB.data_core.general)
if((G.fields["name"] == mob_occupant.real_name))
announce_rank = G.fields["rank"]
qdel(G)
for(var/obj/machinery/computer/cloning/cloner in world)
for(var/datum/data/record/R in cloner.records)
if(R.fields["name"] == mob_occupant.real_name)
cloner.records.Remove(R)
//Make an announcement and log the person entering storage.
if(control_computer)
control_computer.frozen_crew += "[mob_occupant.real_name]"
if(GLOB.announcement_systems.len)
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
announcer.announce("CRYOSTORAGE", mob_occupant.real_name, announce_rank, list())
visible_message("<span class='notice'>\The [src] hums and hisses as it teleports [mob_occupant.real_name] back to CentCom.</span>")
// Ghost and delete the mob.
if(!mob_occupant.get_ghost(1))
mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE)
QDEL_NULL(occupant)
for(var/I in cryo_items) //only "CRYO_DESTROY_LATER" atoms are left)
var/atom/A = I
if(!QDELETED(A))
qdel(A)
open_machine()
name = initial(name)
#undef CRYO_DESTROY
#undef CRYO_PRESERVE
#undef CRYO_OBJECTIVE
#undef CRYO_IGNORE
#undef CRYO_DESTROY_LATER
/obj/machinery/cryopod_tele/MouseDrop_T(mob/living/target, mob/user)
if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled)
return
if(occupant)
to_chat(user, "<span class='boldnotice'>The CentCom Teleporter is already occupied!</span>")
return
if(target.stat == DEAD)
to_chat(user, "<span class='notice'>Dead people can not be teleported.</span>")
return
if(target.client && user != target)
if(iscyborg(target))
to_chat(user, "<span class='danger'>You can't put [target] into [src]. They're online.</span>")
else
to_chat(user, "<span class='danger'>You can't put [target] into [src]. They're conscious.</span>")
return
else if(target.client)
if(alert(target,"Would you like to teleport back to CentCom?",,"Yes","No") == "No")
return
var/generic_plsnoleave_message = " Please adminhelp before leaving the round, even if there are no administrators online!"
if(target == user && world.time - target.client.cryo_warned > 5 MINUTES)//if we haven't warned them in the last 5 minutes
var/list/caught_string
var/addendum = ""
if(target.mind.assigned_role in GLOB.command_positions)
LAZYADD(caught_string, "Head of Staff")
addendum = " Be sure to put your locker items back into your locker!"
if(iscultist(target) || is_servant_of_ratvar(target))
LAZYADD(caught_string, "Cultist")
if(is_devil(target))
LAZYADD(caught_string, "Devil")
if(target.mind.has_antag_datum(/datum/antagonist/gang))
LAZYADD(caught_string, "Gangster")
if(target.mind.has_antag_datum(/datum/antagonist/rev/head))
LAZYADD(caught_string, "Head Revolutionary")
if(target.mind.has_antag_datum(/datum/antagonist/rev))
LAZYADD(caught_string, "Revolutionary")
if(caught_string)
alert(target, "You're a [english_list(caught_string)]![generic_plsnoleave_message][addendum]")
target.client.cryo_warned = world.time
return
if(!target || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled)
return
//rerun the checks in case of shenanigans
if(target == user)
visible_message("[user] starts climbing into the CentCom Teleporter.")
else
visible_message("[user] starts putting [target] into the CentCom Teleporter.")
if(occupant)
to_chat(user, "<span class='boldnotice'>\The [src] is in use.</span>")
return
close_machine(target)
to_chat(target, "<span class='boldnotice'>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</span>")
name = "[name] ([occupant.name])"
log_admin("<span class='notice'>[key_name(target)] entered a CentCom Teleporter.</span>")
message_admins("[key_name_admin(target)] entered a CentCom Teleporter. (<A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
add_fingerprint(target)
//Attacks/effects.
/obj/machinery/cryopod_tele/blob_act()
return //Sorta gamey, but we don't really want these to be destroyed.
on_store_message = "has been teleported to CentCom."
on_store_name = "Teleporter Oversight"
+2 -2
View File
@@ -18,5 +18,5 @@
key = "blep"
key_third_person = "bleps"
message = "bleps!"
emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE
mob_type_allowed_typecache = list(/mob/living/carbon)
emote_type = EMOTE_VISIBLE
mob_type_allowed_typecache = list(/mob/living)
@@ -10,4 +10,6 @@
actions_types = list()
icon = 'sandcode/icons/obj/guns/projectile.dmi'
spawnwithmagazine = FALSE
var/can_supress = FALSE
var/can_supress = FALSE
//Note for the future, i didn't know this gun already existed in the code, may be deleted eventually.
@@ -5,8 +5,13 @@
/obj/item/organ/cyberimp/arm/toolset/advanced
name = "advanced integrated toolset implant"
desc = "A very advanced version of the regular toolset implant, has alien stuff!"
contents = newlist(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/weldingtool/abductor,
/obj/item/crowbar/abductor, /obj/item/wirecutters/abductor, /obj/item/multitool/abductor, /obj/item/analyzer)
contents = newlist(/obj/item/screwdriver/abductor,
/obj/item/wrench/abductor,
/obj/item/weldingtool/abductor,
/obj/item/crowbar/abductor,
/obj/item/wirecutters/abductor,
/obj/item/multitool/abductor,
/obj/item/analyzer/ranged)
/obj/item/organ/cyberimp/arm/toolset/advanced/emag_act()
. = ..()
@@ -18,9 +23,15 @@
return TRUE
/obj/item/organ/cyberimp/arm/surgery/advanced
name = "advanced surgical toolset implant"
name = "advanced integrated surgical implant"
desc = "A very advanced version of the regular surgical implant, has alien stuff!"
contents = newlist(/obj/item/retractor/alien, /obj/item/hemostat/alien, /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/scalpel/alien, /obj/item/circular_saw/alien, /obj/item/surgical_drapes)
contents = newlist(/obj/item/retractor/alien,
/obj/item/hemostat/alien,
/obj/item/cautery/alien,
/obj/item/surgicaldrill/alien,
/obj/item/scalpel/alien,
/obj/item/circular_saw/alien,
/obj/item/surgical_drapes)
/obj/item/organ/cyberimp/arm/surgery/emag_act()
. = ..()
+2 -2
View File
@@ -30,7 +30,7 @@
var/distance = time * power_x
var/dest_x = src_x + distance*sin(rotation); //You can never accurately predict where it lands, at all.
var/dest_y = src_y + distance*cos(rotation); //Telethievery has now been killed, thank me later.
var/dest_x = src_x + distance*sin(rotation);
var/dest_y = src_y + distance*cos(rotation);
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
@@ -14,9 +14,7 @@
var/z_co = 1
var/power_off
var/rotation_off
var/angle_off
var/offsety
var/offsetx
//var/angle_off
var/last_target
var/in_use
@@ -45,8 +43,8 @@
return ..()
/obj/machinery/computer/telescience/examine(mob/user)
..()
to_chat(user, "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.")
. = ..()
. += "<span class='notice'>There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.</span>"
/obj/machinery/computer/telescience/Initialize(mapload)
. = ..()
@@ -163,15 +161,13 @@
var/truePower = clamp(power + power_off, 1, 1000)
var/trueRotation = rotation + rotation_off
var/trueAngle = clamp(angle + angle_off, 1, 90)
var/trueoffsetx = offsetx + rand(-1,1) // Where will you land?
var/trueoffsety = offsety + rand(-1,1) // You never TRULY know. There are 9 possibilities, IF you calculated the offsetx and offsety.
var/trueAngle = clamp(angle, 1, 90)
var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower)
last_tele_data = proj_data
var/trueX = clamp(round(proj_data.dest_x + trueoffsetx, 1), 1, world.maxx)
var/trueY = clamp(round(proj_data.dest_y + trueoffsety, 1), 1, world.maxy)
var/trueX = clamp(round(proj_data.dest_x, 1), 1, world.maxx)
var/trueY = clamp(round(proj_data.dest_y, 1), 1, world.maxy)
var/spawn_time = round(proj_data.time) * 10
var/turf/target = locate(trueX, trueY, z_co)
@@ -353,9 +349,7 @@
updateDialog()
/obj/machinery/computer/telescience/proc/recalibrate()
teles_left = rand(10, 30)
angle_off = rand(-15, 15)
teles_left = rand(30, 40)
//angle_off = rand(-25, 25)
power_off = rand(-4, 0)
rotation_off = rand(-10, 10)
offsetx = rand(0, 7)
offsety = rand(0, 7)