Files
Yogstation/code/modules/shuttle/custom_shuttle.dm
Chubbygummibear 0fda5cfc6a Icon smoothing, and Rendering overhaul, and Camera fix, and mapmerge.py fix, and Multi-z, and THE PLANE CUBE (#21221)
* why no work

angy

* weird errors

shit sucks

* fixved it

I can spell good

* fix?

POSSIBLY

* nope

wasnt this

* no more immutable

thhanks koffee

* ok

ok

* removes all the pref stuff

""removes""

* remove this

idiot

* this goes bye

 bye

* these go too

genius

* bye

bye

* better night vision

* tries to fix camera

maybe

* ok fuck it we ball

we ball

* ok lets go back

go back go back go back

* WORK

DAMNIT

* ha

fuc kyou

* this

maybe

* this doesnt work :(

* maybe fix

maybe

* fucks everything

why do i do this

* test update

test

* Revert "tries to fix camera"

This reverts commit 2d14fbae66.

* reverts everything I just did

peko pain

* bye

bitch

* oh yeah add this

I guess

* Fucks up the camera net + chunk

why

* test maybe revert

* Revert "test maybe revert"

This reverts commit 98c5ef1b93.

* Revert "Fucks up the camera net + chunk"

This reverts commit 0e421ebf5f.

* this isnt going well

uh oh

* Attempts to rework out security camera

and probably more

* Revert "this isnt going well"

This reverts commit 1d8ceac867.

* Revert "Revert "this isnt going well""

This reverts commit e26fb61415.

* ok

ok

* Revert "ok"

This reverts commit 7e7a7f8372.

* Revert "Merge remote-tracking branch 'upstream/master' into NahI'dPortit"

This reverts commit 01094731c1, reversing
changes made to c0cf69ebf1.

* this doesn't need to be redefined

I guess

* no we need this

totally

* a familiar pain

* 515 is L

* yeah

yeah

* ok god

fine

* bye bye basemap :(

doesnt work on runtime station

* Fixes AI statis not working

god im good

* remove this

oh god

* Revert "Revert "Merge remote-tracking branch 'upstream/master' into NahI'dPortit""

This reverts commit b3fb3ba0db.

* proves to god I exist

and im pissed

* yog exclusive feature (tm)

plane master

* bring this back from previous push

* updates vendor emissives

as well as firealarms

* Updates barsign

and fucks everything up

* Fixes barsigns breaks all lights and updates barsigns to be machines and not structures

We will address this in a later patch

* not sure who changed that

oh well

* yeah

this got moved

* this needs updating

yeah

* turns off the carbon monoxide alarm

duh

* FIXES IT YES

thank you biome

* turns this off too

yeah

* Can't compile yet but ports a ton of shit

* L

* the game opens ig

* extra shit

* fixes

* signals and smooth queue

* look ma im going horribly out of scope

* fixes chasms

* this fixed nothing

* ???

* more barsigns

for later

* forgive me cowboy. also fuck diagonals

* oops

we need this apparently

* fuck it we ball

* Update _lists.dm

* Update icon_smoothing.dm

* it now works kinda

* Update atom_initializing_EXPENSIVE.dm

* lighting don't work

* we have light

* sort turfs better

* big fucking reorganize

* like everything except templates

* boy i sure hope nothing bad happens to these bar templates

* we're back

* no runtimes baby

* no errors

* shuttles are almost fixed i think

* Revert "shuttles are almost fixed i think"

This reverts commit 046058827c.

* Revert "Merge remote-tracking branch 'upstream/master' into icon_smoothing"

This reverts commit 863e1b776d, reversing
changes made to 884623e600.

* Revert "no errors"

This reverts commit 884623e600.

* too far back i think

* midround smoothing runtimes fixed i think

* comment cleanup

* should fix the component runtimes

* Revert "Revert "Merge remote-tracking branch 'upstream/master' into icon_smoothing""

This reverts commit a8ff8d63aa.

* NO RUNTIMES AND ICEMETA WORKS LET'S GOOOOOO

* please stay fixed icemeta

* organizing render dms

* woops this too in the reorganizing

* cryo fixed

* nah, i'd win

* parallax isn't my problem

* pls don't break icemeta

* runtime station gets a cam console

* well it compiles

* maybe fix the map

* woops

* man i hate maps

* was that it?

* PLEASE

* missing focus tests

* maybe that was it

* maybe

* let's take the batteries out of the carbon monoxide detector

* fuck osha

* i hate vending machines

* that's not a computer

* slot machine fix

* PLEASE

* that wasn't supposed to be there

* fuck it i can't fix everything at once

* BLUESPACE LOCKER?

* literally why

* hhh

* does this fix chasms?

* that should fix bad index

* please?

* turf_flags for reservations

* haha oops

* yolo (kill me)

* fix wood walls and other walls

* fix stairs

* that might have fixed shittles

* baseturfs are good now i think

* should fix plasma windows

* decals fixed

* please fix changelog

* shuttle lighting still fucky

* lighting is stinky slow and doesn't finish updating by the time the server starts guh

* lighting seemingly works

* slipping works

* shuttle sounds, slips, and windoors fixed

* why am i here

* fuck the changelog

* of course someone touched smoothing as i'm almost done

* we good?

* updating ai_eye and rename

* z updates and more ai cam updates

* ice fixed

* weather and ice fix

* clockies can see and other clean up catches

* windows fixed

* cowbot forgive me i'm trying to update flashlights to tg because there's no light on lower multi-z z's like ice meta bottom floor

* movable lighting works on multi-z

* gps fix

* item stacking from drag works

* falsewall fix

* job panel fixed

* AI HANDLED

* woops that comment should be gone

* i hate ai i hate ai

* brass glass visible again

* vents on top of tiles now

* sigdrobe sprite back

* centcomm portals work

* portals and see openspace mapping icons fixed

* icemeta my behated

* kill

* is that it

* lighting cutoff is old hat

* angery overlay

* not super necessary

* also extra but whatever

* ticker but thicker

* job fix i hope

* this isn't needed anymore

* latejoin fix?

* laserpointer, pipecrawl, and some consoles fixed

* i hate fixing bugs as they're made

* we're not ready for that

* redef cleanup

* gps arrows, gun flashlights, shuttle console placement, multi-z pulling fixed

* goofy ah gun code

* this was a good idea and necessary

* should fix caltrop component

* does this please the linter

* linter please accept this async function

* THERE

* take the batteries out

* make it stop

* cowbot stopped me from letting ghosts dab

* recycler loc fix

* fix border firedoors not blocking movement

* should fix screen fade out and fade in on round start and end

* darker command tile trim and fixed bronze wall sprites

* fuck you linter

* railings actually stop you from leaving

* probably fixes gibtonite overlay when struck

* armaments dispenser and clockwork catwalk

* turbine fix probably

* pointing at inhand items should be fixed

* fix overwatch app

* should hopefully fix cable rotation on shuttle move

* flashlights have better directionality logic

* hopefully fixes shuttle atmos on move

* grilles fixed

* hopefully this fixes shuttle buttons, airolocks, and other machinery not working after moving

* ice meta mining area finally not freezing

* fix lightbulb icons not updating

* lava mask and lighting dots

* we actually have this

* fuck glowshrooms GC

* fix light fixture interactions and icon updates

* hopefully catches all the updates

* lava lighting good to go

* seclite was missing inhands

* smoothing in replays

* light updates accurate in replays

* biome's multi-z requests

---------

Co-authored-by: cowbot92 <75333826+cowbot92@users.noreply.github.com>
Co-authored-by: Molti <gamingjoelouis@gmail.com>
Co-authored-by: Ringalong <53777086+JohnFulpWillard@users.noreply.github.com>
2024-02-18 13:16:55 -06:00

282 lines
11 KiB
Plaintext

#define Z_DIST 500
#define CUSTOM_ENGINES_START_TIME 65
#define CALCULATE_STATS_COOLDOWN 2
/obj/machinery/computer/custom_shuttle
name = "nanotrasen shuttle flight controller"
desc = "A terminal used to fly shuttles defined by the Shuttle Zoning Designator"
circuit = /obj/item/circuitboard/computer/shuttle/flight_control
icon_screen = "shuttle"
icon_keyboard = "tech_key"
light_color = LIGHT_COLOR_CYAN
req_access = list( )
var/shuttleId
var/possible_destinations = "whiteship_home;auxiliary_construction;spacebar"
var/admin_controlled
var/no_destination_swap = 0
var/calculated_mass = 0
var/calculated_dforce = 0
var/calculated_speed = 0
var/calculated_engine_count = 0
var/calculated_consumption = 0
var/calculated_cooldown = 0
var/calculated_non_operational_thrusters = 0
var/calculated_fuel_less_thrusters = 0
var/target_fuel_cost = 0
var/targetLocation
var/datum/browser/popup
var/stat_calc_cooldown = 0
//Upgrades
var/distance_multiplier = 1
/obj/machinery/computer/custom_shuttle/examine(mob/user)
. = ..()
. += distance_multiplier < 1 ? "Bluespace shortcut module installed. Route is [distance_multiplier]x the original length." : ""
/obj/machinery/computer/custom_shuttle/ui_interact(mob/user)
var/list/options = params2list(possible_destinations)
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
var/dat = "[M ? "Current Location : [M.getStatusText()]" : "Shuttle link required."]<br><br>"
if(M)
dat += "<A href='?src=[REF(src)];calculate=1'>Run Flight Calculations</A><br>"
dat += "<b>Shuttle Data</b><hr>"
dat += "Shuttle Mass: [calculated_mass/10]tons<br>"
dat += "Engine Force: [calculated_dforce]kN ([calculated_engine_count] engines)<br>"
dat += "Sublight Speed: [calculated_speed]ms<sup>-1</sup><br>"
dat += calculated_speed < 1 ? "<b>INSUFFICIENT ENGINE POWER</b><br>" : ""
dat += calculated_non_operational_thrusters > 0 ? "<b>Warning: [calculated_non_operational_thrusters] thrusters offline.</b><br>" : ""
dat += "Fuel Consumption: [calculated_consumption]units per distance<br>"
dat += "Engine Cooldown: [calculated_cooldown]s<hr>"
var/destination_found
for(var/obj/docking_port/stationary/S in SSshuttle.stationary_docking_ports)
if(!options.Find(S.port_destinations))
continue
if(!M.check_dock(S, silent=TRUE))
continue
if(calculated_speed == 0)
break
destination_found = TRUE
var/dist = round(calculateDistance(S))
dat += "<A href='?src=[REF(src)];setloc=[S.shuttle_id]'>Target [S.name] (Dist: [dist] | Fuel Cost: [round(dist * calculated_consumption)] | Time: [round(dist / calculated_speed)])</A><br>"
if(!destination_found)
dat += "<B>No valid destinations</B><br>"
dat += "<hr>[targetLocation ? "Target Location : [targetLocation]" : "No Target Location"]"
dat += "<hr><A href='?src=[REF(src)];fly=1'>Initate Flight</A><br>"
dat += "<A href='?src=[REF(user)];mach_close=computer'>Close</a>"
popup = new(user, "computer", M ? M.name : "shuttle", 350, 450)
popup.set_content("<center>[dat]</center>")
//popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/machinery/computer/custom_shuttle/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
if(!allowed(usr))
to_chat(usr, "<span class='danger'>Access denied.</span>")
return
if(href_list["calculate"])
calculateStats()
ui_interact(usr)
return
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(!M)
return
if(M.launch_status == ENDGAME_LAUNCHED)
return
if(href_list["setloc"])
SetTargetLocation(href_list["setloc"])
ui_interact(usr)
return
else if(href_list["fly"])
Fly()
ui_interact(usr)
return
/obj/machinery/computer/custom_shuttle/proc/calculateDistance(obj/port)
var/deltaX = port.x - x
var/deltaY = port.y - y
var/deltaZ = (port.z - z) * Z_DIST
return sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * distance_multiplier
/obj/machinery/computer/custom_shuttle/proc/linkShuttle(new_id)
shuttleId = new_id
possible_destinations = "whiteship_home;auxiliary_construction;spacebar;shuttle[new_id]_custom"
/obj/machinery/computer/custom_shuttle/proc/calculateStats(useFuel = FALSE, dist = 0, ignore_cooldown = FALSE)
if(!ignore_cooldown && stat_calc_cooldown >= world.time)
to_chat(usr, "<span>You are using this too fast, please slow down</span>")
return
stat_calc_cooldown = world.time + CALCULATE_STATS_COOLDOWN
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(!M)
return FALSE
//Reset data
calculated_mass = 0
calculated_dforce = 0
calculated_speed = 0
calculated_engine_count = 0
calculated_consumption = 0
calculated_cooldown = 0
calculated_fuel_less_thrusters = 0
calculated_non_operational_thrusters = 0
//Calculate all the data
var/list/areas = M.shuttle_areas
for(var/shuttleArea in areas)
for(var/turf/T in shuttleArea)
calculated_mass += 1
for(var/obj/machinery/shuttle/engine/E in shuttleArea)
E.check_setup()
if(!E.thruster_active) //Skipover thrusters with no valid heater
calculated_non_operational_thrusters ++
continue
if(E.attached_heater)
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = E.attached_heater.resolve()
if(resolvedHeater && !resolvedHeater.hasFuel(dist * E.fuel_use) && useFuel)
calculated_fuel_less_thrusters ++
continue
calculated_engine_count++
calculated_dforce += E.thrust
calculated_consumption += E.fuel_use
calculated_cooldown = max(calculated_cooldown, E.cooldown)
//This should really be accelleration, but its a 2d spessman game so who cares
if(calculated_mass == 0)
return FALSE
calculated_speed = (calculated_dforce*1000) / (calculated_mass*100)
return TRUE
/obj/machinery/computer/custom_shuttle/proc/consumeFuel(dist)
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(!M)
return FALSE
//Calculate all the data
for(var/obj/machinery/shuttle/engine/shuttle_machine in GLOB.custom_shuttle_machines)
shuttle_machine.check_setup()
if(!shuttle_machine.thruster_active)
continue
if(get_area(M) != get_area(shuttle_machine))
continue
if(shuttle_machine.attached_heater)
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolvedHeater = shuttle_machine.attached_heater.resolve()
if(resolvedHeater && !resolvedHeater.hasFuel(dist * shuttle_machine.fuel_use))
continue
resolvedHeater?.consumeFuel(dist * shuttle_machine.fuel_use)
shuttle_machine.fireEngine()
/obj/machinery/computer/custom_shuttle/proc/SetTargetLocation(newTarget)
if(!(newTarget in params2list(possible_destinations)))
log_admin("[usr] attempted to href dock exploit on [src] with target location \"[newTarget]\"")
message_admins("[usr] just attempted to href dock exploit on [src] with target location \"[newTarget]\"")
return
targetLocation = newTarget
say("Shuttle route calculated.")
return
/obj/machinery/computer/custom_shuttle/proc/Fly()
if(!targetLocation)
return
var/obj/docking_port/mobile/linkedShuttle = SSshuttle.getShuttle(shuttleId)
if(!linkedShuttle)
return
if(linkedShuttle.mode != SHUTTLE_IDLE)
return
if(!calculateStats(TRUE, 0, TRUE))
return
if(calculated_fuel_less_thrusters > 0)
say("Warning, [calculated_fuel_less_thrusters] do not have enough fuel for this journey, engine output may be limitted.")
if(calculated_speed < 1)
say("Insufficient engine power, shuttle requires [calculated_mass / 10]kN of thrust.")
return
var/obj/docking_port/stationary/targetPort = SSshuttle.getDock(targetLocation)
if(!targetPort)
return
var/dist = calculateDistance(targetPort)
var/time = min(max(round(dist / calculated_speed), 10), 90)
linkedShuttle.callTime = time * 10
linkedShuttle.rechargeTime = calculated_cooldown
linkedShuttle.ignitionTime = CUSTOM_ENGINES_START_TIME
linkedShuttle.count_engines()
linkedShuttle.hyperspace_sound(HYPERSPACE_WARMUP)
var/throwForce = clamp((calculated_speed / 2) - 5, 0, 10)
linkedShuttle.movement_force = list("KNOCKDOWN" = calculated_speed > 5 ? 3 : 0, "THROW" = throwForce)
if(!(targetLocation in params2list(possible_destinations)))
log_admin("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"")
message_admins("[usr] attempted to launch a shuttle that has been affected by href dock exploit on [src] with target location \"[targetLocation]\"")
return
switch(SSshuttle.moveShuttle(shuttleId, targetLocation, 1))
if(0)
consumeFuel(dist)
say("Shuttle departing. Please stand away from the doors.")
if(1)
to_chat(usr, "<span class='warning'>Invalid shuttle requested.</span>")
else
to_chat(usr, "<span class='notice'>Unable to comply.</span>")
return
/obj/machinery/computer/custom_shuttle/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(!mapload)
return
if(!port)
return
//Remove old custom port id and ";;"
var/find_old = findtextEx(possible_destinations, "[shuttleId]_custom")
if(find_old)
possible_destinations = replacetext(replacetextEx(possible_destinations, "[shuttleId]_custom", ""), ";;", ";")
shuttleId = port.shuttle_id
possible_destinations += ";[port.shuttle_id]_custom"
//Custom shuttle docker locations
/obj/machinery/computer/camera_advanced/shuttle_docker/custom
name = "Shuttle Zoning Designator"
desc = "Used to designate a precise transit location for private ships."
lock_override = NONE
whitelist_turfs = list(/turf/open/space,
/turf/open/lava,
/turf/open/floor/plating/beach,
/turf/open/floor/plating/ashplanet,
/turf/open/floor/plating/asteroid,
/turf/open/floor/plating/lavaland_baseturf)
jump_to_ports = list("whiteship_home" = 1)
view_range = 12
designate_time = 100
circuit = /obj/item/circuitboard/computer/shuttle/docker
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Initialize(mapload)
. = ..()
GLOB.jam_on_wardec += src
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/Destroy()
GLOB.jam_on_wardec -= src
return ..()
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/placeLandingSpot()
if(!shuttleId)
return //Only way this would happen is if someone else delinks the console while in use somehow
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
if(M?.mode != SHUTTLE_IDLE)
to_chat(usr, "<span class='warning'>You cannot target locations while in transit.</span>")
return
..()
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/attack_hand(mob/user)
if(!shuttleId)
to_chat(user, "<span class='warning'>You must link the console to a shuttle first.</span>")
return
return ..()
/obj/machinery/computer/camera_advanced/shuttle_docker/custom/proc/linkShuttle(new_id)
shuttleId = new_id
shuttlePortId = "shuttle[new_id]_custom"
//Take info from connected port and calculate amendments
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(new_id)
var/list/shuttlebounds = M.return_coords()
view_range = min(round(max(M.width, M.height)*0.5), 15)
x_offset = round((shuttlebounds[1] + shuttlebounds[3])*0.5) - M.x
y_offset = round((shuttlebounds[2] + shuttlebounds[4])*0.5) - M.y