/
shuttle_engine_types.dm
266 lines (230 loc) · 9.26 KB
/
shuttle_engine_types.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#define ENGINE_HEAT_TARGET 600
#define ENGINE_HEATING_POWER 5000000
/**
* ### Fueled engines
* Shuttle engines that require a gas or gases to burn.
*/
/obj/machinery/power/shuttle/engine/fueled
name = "fueled thruster"
desc = "A thruster that burns a specific gas that is stored in an adjacent heater."
icon_state = "burst_plasma"
icon_state_off = "burst_plasma_off"
idle_power_usage = 0
///The specific gas to burn out of the engine heater. If none, burns any gas.
var/datum/gas/fuel_type
///How much fuel (in mols) of the specified gas should be used in a full burn.
var/fuel_use = 0
///If this engine should create heat when burned.
var/heat_creation = FALSE
///A weakref of the connected engine heater with fuel.
var/datum/weakref/attached_heater
/obj/machinery/power/shuttle/engine/fueled/burn_engine(percentage = 100, deltatime)
..()
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater?.resolve()
if(!resolved_heater)
return
if(heat_creation)
heat_engine()
var/to_use = fuel_use * (percentage / 100) * deltatime
return resolved_heater.consume_fuel(to_use, fuel_type) / to_use * thrust //This proc returns how much was actually burned, so let's use that and multiply it by the thrust to get all the thrust we CAN give.
/obj/machinery/power/shuttle/engine/fueled/return_fuel()
. = ..()
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater?.resolve()
return resolved_heater?.return_gas(fuel_type)
/obj/machinery/power/shuttle/engine/fueled/return_fuel_cap()
. = ..()
var/obj/machinery/atmospherics/components/unary/shuttle/heater/resolved_heater = attached_heater?.resolve()
return resolved_heater?.return_gas_capacity()
/obj/machinery/power/shuttle/engine/fueled/screwdriver_act(mob/living/user, obj/item/I)
. = ..()
if(!panel_open)
update_icon_state()
///This proc makes the area the shuttle is in EXTREMELY hot. I don't know how it does this, but that's what it does.
/obj/machinery/power/shuttle/engine/proc/heat_engine()
var/turf/heatTurf = loc
if(!heatTurf)
return
var/datum/gas_mixture/env = heatTurf.return_air()
var/heat_cap = env.heat_capacity()
var/req_power = abs(env.return_temperature() - ENGINE_HEAT_TARGET) * heat_cap
req_power = min(req_power, ENGINE_HEATING_POWER)
if(heat_cap <= 0)
return
var/deltaTemperature = req_power / heat_cap
if(deltaTemperature < 0)
return
env.set_temperature(env.return_temperature() + deltaTemperature)
air_update_turf()
/obj/machinery/power/shuttle/engine/fueled/update_engine()
. = ..()
if(!.)
return
if(!attached_heater)
if(!set_heater())
thruster_active = FALSE
return FALSE
/obj/machinery/power/shuttle/engine/fueled/proc/set_heater()
for(var/direction in GLOB.cardinals)
for(var/obj/machinery/atmospherics/components/unary/shuttle/heater/found in get_step(get_turf(src), direction))
if(found.dir != dir)
continue
if(found.panel_open)
continue
if(!found.anchored)
continue
attached_heater = WEAKREF(found)
update_icon_state()
return TRUE
/obj/machinery/power/shuttle/engine/fueled/plasma
name = "plasma thruster"
desc = "A thruster that burns plasma from an adjacent heater to create thrust."
circuit = /obj/item/circuitboard/machine/shuttle/engine/plasma
fuel_type = GAS_PLASMA
fuel_use = 20
thrust = 25
/obj/machinery/power/shuttle/engine/fueled/expulsion
name = "expulsion thruster"
desc = "A thruster that expels gas inefficiently to create thrust."
circuit = /obj/item/circuitboard/machine/shuttle/engine/expulsion
fuel_use = 80
thrust = 15
//All fuel code already handled
/**
* ### Ion Engines
* Engines that convert electricity to thrust. Yes, I know that's not how it works, it needs a propellant, but this is a video game.
*/
/obj/machinery/power/shuttle/engine/electric
name = "ion thruster"
desc = "A thruster that expels charged particles to generate thrust."
circuit = /obj/item/circuitboard/machine/shuttle/engine/electric
icon_state = "burst"
icon_state_off = "burst_off"
icon_state_closed = "burst"
icon_state_open = "burst_open"
thrust = 10
///Amount, in kilojoules, needed for a full burn.
var/power_per_burn = 50000
/obj/machinery/power/shuttle/engine/electric/bad
name = "Outdated Ion Thruster"
circuit = /obj/item/circuitboard/machine/shuttle/engine/electric/bad
thrust = 2
power_per_burn = 70000
/obj/machinery/power/shuttle/engine/electric/premium
name = "high performance ion thruster"
desc = "An expensive variant of a standard ion thruster, using highest quality components in order to achieve much better performance."
thrust = 30
power_per_burn = 65000
/obj/machinery/power/smes/shuttle
name = "electric engine precharger"
desc = "A medium-capacity, high transfer superconducting magnetic energy storage unit specially made for use with shuttle engines."
icon = 'icons/obj/shuttle.dmi'
input_level = 5000
input_level_max = 50000
output_level = 50000
circuit = /obj/item/circuitboard/machine/shuttle/smes
/obj/machinery/power/smes/shuttle/precharged
charge = 1e6
/obj/machinery/power/smes/shuttle/micro
name = "micro electric engine precharger"
desc = "A low-capacity, high transfer superconducting magnetic energy storage unit specially made for use with compact shuttle engines."
icon = 'icons/obj/shuttle.dmi'
circuit = /obj/item/circuitboard/machine/shuttle/smes/micro
density = 0
capacity = 1e6
/obj/machinery/power/smes/shuttle/micro/precharged
charge = 1e6
/obj/machinery/power/shuttle/engine/electric/update_engine()
. = ..()
if(!.)
return
if(!powernet)
thruster_active = FALSE
return FALSE
/obj/machinery/power/shuttle/engine/electric/on_construction()
. = ..()
connect_to_network()
/obj/machinery/power/shuttle/engine/electric/burn_engine(percentage = 100, deltatime)
. = ..()
var/true_percentage = min(newavail() / power_per_burn, percentage / 100)
add_delayedload(power_per_burn * true_percentage)
return thrust * true_percentage
/obj/machinery/power/shuttle/engine/electric/return_fuel()
if(length(powernet?.nodes) == 2)
for(var/obj/machinery/power/smes/S in powernet.nodes)
return S.charge
return newavail()
/obj/machinery/power/shuttle/engine/electric/return_fuel_cap()
if(length(powernet?.nodes) == 2)
for(var/obj/machinery/power/smes/S in powernet.nodes)
return S.capacity
return power_per_burn
/**
* ### Liquid Fuel Engines
* Turns a specific reagent or reagents into thrust.
*/
/obj/machinery/power/shuttle/engine/liquid
name = "If you see me, ping a coder."
desc = "Wow! You really shouldn't be seeing this!" //if you want the engines to work and be movable, you need to make a subtype of them.
///How much fuel can be loaded into the engine.
var/max_reagents = 0
///What reagent is consumed to burn the engine, and how much is needed.
var/list/datum/reagent/fuel_reagents
///Used to store how much total of any reagent is needed per burn. Don't set anywhere but /Initialize()
var/reagent_amount_holder = 0
/obj/machinery/power/shuttle/engine/liquid/Initialize()
if(!length(fuel_reagents))
stack_trace("Attempted to create an abstract liquid thruster. Deleting...")
return INITIALIZE_HINT_QDEL
. = ..()
create_reagents(max_reagents, OPENCONTAINER)
AddComponent(/datum/component/plumbing/simple_demand)
for(var/reagent in fuel_reagents)
reagent_amount_holder += fuel_reagents[reagent]
/obj/machinery/power/shuttle/engine/liquid/burn_engine(percentage = 100)
. = ..()
var/true_percentage = 1
for(var/reagent in fuel_reagents)
true_percentage *= reagents.remove_reagent(reagent, fuel_reagents[reagent]) / fuel_reagents[reagent]
return thrust * true_percentage
/obj/machinery/power/shuttle/engine/liquid/return_fuel()
var/true_percentage = INFINITY
for(var/reagent in fuel_reagents)
true_percentage = min(reagents?.get_reagent_amount(reagent) / fuel_reagents[reagent], true_percentage)
return reagent_amount_holder * true_percentage //Multiplies the total amount needed by the smallest percentage of any reagent in the recipe
/obj/machinery/power/shuttle/engine/liquid/return_fuel_cap()
return reagents.maximum_volume
/obj/machinery/power/shuttle/engine/liquid/oil
name = "oil thruster"
desc = "A highly inefficient thruster that burns oil as a propellant."
max_reagents = 1000
thrust = 20
fuel_reagents = list(/datum/reagent/fuel/oil = 50)
circuit = /obj/item/circuitboard/machine/shuttle/engine/oil
/obj/machinery/power/shuttle/engine/liquid/beer
name = "beer thruster"
desc = "Beer is quite possibly the worst thing to use as interstellar propulsion, how these even work is a mystery."
max_reagents = 1000
thrust = 10
fuel_reagents= list(/datum/reagent/consumable/ethanol/beer = 50)
circuit = /obj/item/circuitboard/machine/shuttle/engine/beer
/**
* ### Void Engines
* These engines are literally magic. Adminspawn only.
*/
/obj/machinery/power/shuttle/engine/void
name = "void thruster"
desc = "A thruster using technology to breach voidspace for propulsion."
icon_state = "burst_void"
icon_state_off = "burst_void"
icon_state_closed = "burst_void"
icon_state_open = "burst_void_open"
circuit = /obj/item/circuitboard/machine/shuttle/engine/void
thrust = 400
/obj/machinery/power/shuttle/engine/void/return_fuel()
return TRUE
/obj/machinery/power/shuttle/engine/void/return_fuel_cap()
return TRUE
/obj/machinery/power/shuttle/engine/void/burn_engine()
return thrust
#undef ENGINE_HEAT_TARGET
#undef ENGINE_HEATING_POWER