mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
[MIRROR] Removes Global Iterators
This commit is contained in:
@@ -1,160 +0,0 @@
|
||||
/*
|
||||
DO NOT USE THIS. THIS IS BEING DEPRECATED BY PROCESSING SUBSYSTEMS (controllers/subsystems/processing) AND TIMERS.
|
||||
*/
|
||||
|
||||
/*
|
||||
README:
|
||||
|
||||
The global_iterator datum is supposed to provide a simple and robust way to
|
||||
create some constantly "looping" processes with ability to stop and restart them at will.
|
||||
Generally, the only thing you want to play with (meaning, redefine) is the process() proc.
|
||||
It must contain all the things you want done.
|
||||
|
||||
Control functions:
|
||||
new - used to create datum. First argument (optional) - var list(to use in process() proc) as list,
|
||||
second (optional) - autostart control.
|
||||
If autostart == TRUE, the loop will be started immediately after datum creation.
|
||||
|
||||
start(list/arguments) - starts the loop. Takes arguments(optional) as a list, which is then used
|
||||
by process() proc. Returns null if datum already active, 1 if loop started succesfully and 0 if there's
|
||||
an error in supplied arguments (not list or empty list).
|
||||
|
||||
stop() - stops the loop. Returns null if datum is already inactive and 1 on success.
|
||||
|
||||
set_delay(new_delay) - sets the delay between iterations. Pretty selfexplanatory.
|
||||
Returns 0 on error(new_delay is not numerical), 1 otherwise.
|
||||
|
||||
set_process_args(list/arguments) - passes the supplied arguments to the process() proc.
|
||||
|
||||
active() - Returns 1 if datum is active, 0 otherwise.
|
||||
|
||||
toggle() - toggles datum state. Returns new datum state (see active()).
|
||||
|
||||
Misc functions:
|
||||
|
||||
get_last_exec_time() - Returns the time of last iteration.
|
||||
|
||||
get_last_exec_time_as_text() - Returns the time of last iteration as text
|
||||
|
||||
|
||||
Control vars:
|
||||
|
||||
delay - delay between iterations
|
||||
|
||||
check_for_null - if equals TRUE, on each iteration the supplied arguments will be checked for nulls.
|
||||
If some varible equals null (and null only), the loop is stopped.
|
||||
Usefull, if some var unexpectedly becomes null - due to object deletion, for example.
|
||||
Of course, you can also check the variables inside process() proc to prevent runtime errors.
|
||||
|
||||
Data storage vars:
|
||||
|
||||
result - stores the value returned by process() proc
|
||||
*/
|
||||
|
||||
/datum/global_iterator
|
||||
var/control_switch = 0
|
||||
var/delay = 10
|
||||
var/list/arg_list = new
|
||||
var/last_exec = null
|
||||
var/check_for_null = 1
|
||||
var/forbid_garbage = 0
|
||||
var/result
|
||||
var/state = 0
|
||||
|
||||
New(list/arguments=null,autostart=1)
|
||||
delay = delay>0?(delay):1
|
||||
if(forbid_garbage) //prevents garbage collection with tag != null
|
||||
tag = "\ref[src]"
|
||||
set_process_args(arguments)
|
||||
if(autostart)
|
||||
start()
|
||||
return
|
||||
|
||||
proc/main()
|
||||
state = 1
|
||||
while(src && control_switch)
|
||||
last_exec = world.timeofday
|
||||
if(check_for_null && has_null_args())
|
||||
stop()
|
||||
return 0
|
||||
result = process(arglist(arg_list))
|
||||
for(var/sleep_time=delay;sleep_time>0;sleep_time--) //uhh, this is ugly. But I see no other way to terminate sleeping proc. Such disgrace.
|
||||
if(!control_switch)
|
||||
return 0
|
||||
sleep(1)
|
||||
return 0
|
||||
|
||||
proc/start(list/arguments=null)
|
||||
if(active())
|
||||
return
|
||||
if(arguments)
|
||||
if(!set_process_args(arguments))
|
||||
return 0
|
||||
if(!state_check()) //the main loop is sleeping, wait for it to terminate.
|
||||
return
|
||||
control_switch = 1
|
||||
spawn()
|
||||
state = main()
|
||||
return 1
|
||||
|
||||
proc/stop()
|
||||
if(!active())
|
||||
return
|
||||
control_switch = 0
|
||||
spawn(-1) //report termination error but don't wait for state_check().
|
||||
state_check()
|
||||
return 1
|
||||
|
||||
proc/state_check()
|
||||
var/lag = 0
|
||||
while(state)
|
||||
sleep(1)
|
||||
if(++lag>10)
|
||||
CRASH("The global_iterator loop \ref[src] failed to terminate in designated timeframe. This may be caused by server lagging.")
|
||||
return 1
|
||||
|
||||
proc/active()
|
||||
return control_switch
|
||||
|
||||
proc/has_null_args()
|
||||
if(null in arg_list)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
proc/set_delay(new_delay)
|
||||
if(isnum(new_delay))
|
||||
delay = max(1, round(new_delay))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
proc/get_last_exec_time()
|
||||
return (last_exec||0)
|
||||
|
||||
proc/get_last_exec_time_as_text()
|
||||
return (time2text(last_exec)||"Wasn't executed yet")
|
||||
|
||||
proc/set_process_args(list/arguments)
|
||||
if(arguments && istype(arguments, /list) && arguments.len)
|
||||
arg_list = arguments
|
||||
return 1
|
||||
else
|
||||
// to_world("<span class='danger'>Invalid arguments supplied for [src.type], ref = \ref[src]</span>")
|
||||
return 0
|
||||
|
||||
proc/toggle_null_checks()
|
||||
check_for_null = !check_for_null
|
||||
return check_for_null
|
||||
|
||||
proc/toggle()
|
||||
if(!stop())
|
||||
start()
|
||||
return active()
|
||||
|
||||
/datum/global_iterator/Destroy()
|
||||
tag = null
|
||||
arg_list.Cut()
|
||||
stop()
|
||||
return QDEL_HINT_LETMELIVE
|
||||
//Do not call ..()
|
||||
@@ -104,7 +104,8 @@
|
||||
if(move_result)
|
||||
if(istype(src.loc, /turf/space))
|
||||
if(!src.check_for_support())
|
||||
src.pr_inertial_movement.start(list(src,direction))
|
||||
float_direction = direction
|
||||
start_process(MECHA_PROC_MOVEMENT)
|
||||
can_move = 0
|
||||
spawn(tmp_step_in) can_move = 1
|
||||
use_power(tmp_step_energy_drain)
|
||||
|
||||
@@ -81,9 +81,7 @@
|
||||
C.forceMove(src)
|
||||
cell = C
|
||||
return
|
||||
cell = new(src)
|
||||
cell.charge = 30000
|
||||
cell.maxcharge = 30000
|
||||
cell = new /obj/item/weapon/cell/hyper(src)
|
||||
|
||||
/obj/mecha/combat/gygax/serenity
|
||||
desc = "A lightweight exosuit made from a modified Gygax chassis combined with proprietary VeyMed medical tech. It's faster and sturdier than most medical mechs, but much of the armor plating has been stripped out, leaving it more vulnerable than a regular Gygax."
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
src.occupant_message("Unable to move while connected to the air system port")
|
||||
last_message = world.time
|
||||
return 0
|
||||
if(!thrusters && src.pr_inertial_movement.active())
|
||||
if(!thrusters && (current_processes & MECHA_PROC_MOVEMENT))
|
||||
return 0
|
||||
if(state || !has_charge(step_energy_drain))
|
||||
return 0
|
||||
@@ -113,9 +113,9 @@
|
||||
if(move_result)
|
||||
if(istype(src.loc, /turf/space))
|
||||
if(!src.check_for_support())
|
||||
src.pr_inertial_movement.start(list(src,direction))
|
||||
float_direction = direction
|
||||
start_process(MECHA_PROC_MOVEMENT)
|
||||
if(thrusters)
|
||||
src.pr_inertial_movement.set_process_args(list(src,direction))
|
||||
tmp_step_energy_drain = step_energy_drain*2
|
||||
|
||||
can_move = 0
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
origin_tech = list(TECH_MATERIAL = 2)
|
||||
description_info = "Some equipment may gain new abilities or advantages if equipped to certain types of Exosuits."
|
||||
var/equip_cooldown = 0
|
||||
var/equip_ready = 1
|
||||
var/equip_ready = TRUE
|
||||
var/energy_drain = 0
|
||||
var/obj/mecha/chassis = null
|
||||
var/range = MELEE //bitflags
|
||||
/// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this.
|
||||
var/mech_flags = NONE
|
||||
var/salvageable = 1
|
||||
var/salvageable = TRUE
|
||||
var/required_type = /obj/mecha //may be either a type or a list of allowed types
|
||||
var/equip_type = null //mechaequip2
|
||||
var/allow_duplicate = FALSE
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1)
|
||||
sleep(equip_cooldown)
|
||||
set_ready_state(1)
|
||||
set_ready_state(TRUE)
|
||||
if(ready_sound) //Kind of like the kinetic accelerator.
|
||||
playsound(src, ready_sound, 50, 1, -1)
|
||||
if(target && chassis)
|
||||
@@ -45,10 +45,6 @@
|
||||
. = ..()
|
||||
. += "<span class='notice'>[src] will fill [equip_type?"a [equip_type]":"any"] slot.</span>"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/New()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/add_equip_overlay(obj/mecha/M as obj)
|
||||
return
|
||||
|
||||
@@ -233,8 +229,13 @@
|
||||
src.update_chassis_page()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/Destroy()
|
||||
detach()
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null)
|
||||
moveto = moveto || get_turf(chassis)
|
||||
<<<<<<< HEAD
|
||||
if(src.Move(moveto))
|
||||
chassis.equipment -= src
|
||||
chassis.universal_equipment -= src
|
||||
@@ -262,6 +263,59 @@
|
||||
chassis.log_message("[src] removed from equipment.")
|
||||
chassis = null
|
||||
set_ready_state(1)
|
||||
||||||| parent of 65ba367501... Merge pull request #10686 from VOREStation/upstream-merge-8146
|
||||
if(src.Move(moveto))
|
||||
chassis.equipment -= src
|
||||
chassis.universal_equipment -= src
|
||||
if(equip_type)
|
||||
switch(equip_type)
|
||||
if(EQUIP_HULL)
|
||||
chassis.hull_equipment -= src
|
||||
if(EQUIP_WEAPON)
|
||||
chassis.weapon_equipment -= src
|
||||
if(EQUIP_UTILITY)
|
||||
chassis.utility_equipment -= src
|
||||
if(EQUIP_SPECIAL)
|
||||
chassis.special_equipment -= src
|
||||
//VOREStation Addition begin: MICROMECHS
|
||||
if(EQUIP_MICRO_UTILITY)
|
||||
chassis.micro_utility_equipment -= src
|
||||
if(EQUIP_MICRO_WEAPON)
|
||||
chassis.micro_weapon_equipment -= src
|
||||
//VOREStation Addition end: MICROMECHS
|
||||
if(chassis.selected == src)
|
||||
chassis.selected = null
|
||||
update_chassis_page()
|
||||
chassis.log_message("[src] removed from equipment.")
|
||||
chassis = null
|
||||
set_ready_state(1)
|
||||
=======
|
||||
forceMove(moveto)
|
||||
chassis.equipment -= src
|
||||
chassis.universal_equipment -= src
|
||||
if(equip_type)
|
||||
switch(equip_type)
|
||||
if(EQUIP_HULL)
|
||||
chassis.hull_equipment -= src
|
||||
if(EQUIP_WEAPON)
|
||||
chassis.weapon_equipment -= src
|
||||
if(EQUIP_UTILITY)
|
||||
chassis.utility_equipment -= src
|
||||
if(EQUIP_SPECIAL)
|
||||
chassis.special_equipment -= src
|
||||
//VOREStation Addition begin: MICROMECHS
|
||||
if(EQUIP_MICRO_UTILITY)
|
||||
chassis.micro_utility_equipment -= src
|
||||
if(EQUIP_MICRO_WEAPON)
|
||||
chassis.micro_weapon_equipment -= src
|
||||
//VOREStation Addition end: MICROMECHS
|
||||
if(chassis.selected == src)
|
||||
chassis.selected = null
|
||||
update_chassis_page()
|
||||
chassis.log_message("[src] removed from equipment.")
|
||||
chassis = null
|
||||
set_ready_state(TRUE)
|
||||
>>>>>>> 65ba367501... Merge pull request #10686 from VOREStation/upstream-merge-8146
|
||||
enable_special = FALSE
|
||||
return
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
chassis.occupant_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>")
|
||||
user.visible_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>", "<span class='danger'>You hit [src] with [W].</span>")
|
||||
inc_damage *= damage_coeff
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
spawn()
|
||||
do_after_cooldown()
|
||||
@@ -65,7 +65,7 @@
|
||||
user.visible_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>", "<span class='danger'>You hit [src] with [W].</span>")
|
||||
chassis.take_damage(round(W.force*damage_coeff),W.damtype)
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
inc_damage = 0
|
||||
else
|
||||
inc_damage *= src.damage_coeff
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
spawn()
|
||||
do_after_cooldown()
|
||||
@@ -41,7 +41,7 @@
|
||||
inc_damage = 0
|
||||
else if(istype(A, /obj))
|
||||
inc_damage *= damage_coeff
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
spawn()
|
||||
do_after_cooldown()
|
||||
@@ -83,7 +83,7 @@
|
||||
chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour)
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
Proj.on_hit(chassis)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
@@ -103,7 +103,7 @@
|
||||
if(O.throwforce)
|
||||
chassis.take_damage(round(O.throwforce*damage_coeff))
|
||||
chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount)
|
||||
if(!cable || cable.amount<1)
|
||||
set_ready_state(1)
|
||||
set_ready_state(TRUE)
|
||||
occupant_message("Cable depleted, [src] deactivated.")
|
||||
log_message("Cable depleted, [src] deactivated.")
|
||||
return
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
locked.throw_at(target, 14, 1.5, chassis)
|
||||
locked = null
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
else
|
||||
@@ -60,7 +60,7 @@
|
||||
for(var/i=0 to iter)
|
||||
step_away(A,target)
|
||||
sleep(2)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
@@ -115,7 +115,7 @@
|
||||
step_away(M,chassis)
|
||||
occupant_message("You push [target] out of the way.")
|
||||
chassis.visible_message("[chassis] pushes [target] out of the way.")
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
@@ -137,7 +137,7 @@
|
||||
if(cargo_holder.cargo.len < cargo_holder.cargo_capacity)
|
||||
chassis.occupant_message("You lift [target] and start to load it into cargo compartment.")
|
||||
chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
O.anchored = 1
|
||||
var/T = chassis.loc
|
||||
@@ -169,7 +169,7 @@
|
||||
step_away(M,chassis)
|
||||
chassis.occupant_message("You smash into [target], sending them flying.")
|
||||
chassis.visible_message("[chassis] tosses [target] like a piece of paper.")
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
@@ -3,25 +3,18 @@
|
||||
desc = "Integrated cloaking system. High power usage, but does render you invisible to the naked eye. Doesn't prevent noise, however."
|
||||
icon_state = "tesla"
|
||||
origin_tech = list(TECH_MAGNET = 5, TECH_DATA = 5)
|
||||
equip_cooldown = 2 SECONDS
|
||||
energy_drain = 300
|
||||
range = 0
|
||||
|
||||
equip_type = EQUIP_SPECIAL
|
||||
|
||||
var/datum/global_iterator/mecha_cloak/cloak_iterator
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/cloak/Initialize()
|
||||
. = ..()
|
||||
cloak_iterator = new /datum/global_iterator/mecha_cloak(list(src),0)
|
||||
cloak_iterator.set_delay(equip_cooldown)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/cloak/Destroy()
|
||||
qdel_null(cloak_iterator)
|
||||
return ..()
|
||||
/obj/item/mecha_parts/mecha_equipment/cloak/process()
|
||||
..()
|
||||
//Removed from chassis or ran out of power
|
||||
if(!chassis || !chassis.use_power(energy_drain))
|
||||
stop_cloak()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/cloak/detach()
|
||||
qdel_null(cloak_iterator)
|
||||
if(!equip_ready) //We were running
|
||||
stop_cloak()
|
||||
return ..()
|
||||
@@ -44,27 +37,14 @@
|
||||
if(chassis)
|
||||
chassis.cloak()
|
||||
log_message("Activated.")
|
||||
cloak_iterator.start()
|
||||
set_ready_state(0)
|
||||
START_PROCESSING(SSobj, src)
|
||||
set_ready_state(FALSE)
|
||||
playsound(src, 'sound/effects/EMPulse.ogg', 100, 1)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/cloak/proc/stop_cloak()
|
||||
if(chassis)
|
||||
chassis.uncloak()
|
||||
log_message("Deactivated.")
|
||||
cloak_iterator.stop()
|
||||
set_ready_state(1)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
set_ready_state(TRUE)
|
||||
playsound(src, 'sound/effects/EMPulse.ogg', 100, 1)
|
||||
|
||||
// These things are so silly
|
||||
/datum/global_iterator/mecha_cloak/process(var/obj/item/mecha_parts/mecha_equipment/cloak/cloak)
|
||||
//Removed from chassis
|
||||
if(!cloak.chassis)
|
||||
stop()
|
||||
cloak.stop_cloak()
|
||||
return
|
||||
//Ran out of power
|
||||
if(!cloak.chassis.use_power(cloak.energy_drain))
|
||||
stop()
|
||||
cloak.stop_cloak()
|
||||
return
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
|
||||
occupant_message("<span class='danger'>You start to drill [target]</span>")
|
||||
@@ -100,7 +100,7 @@
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to bore into \the [target]</span>", "<span class='warning'>You hear the bore.</span>")
|
||||
occupant_message("<span class='danger'>You start to bore into \the [target]</span>")
|
||||
|
||||
@@ -6,25 +6,39 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = 0
|
||||
var/datum/global_iterator/pr_energy_relay
|
||||
var/coeff = 100
|
||||
var/list/use_channels = list(EQUIP,ENVIRON,LIGHT)
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/New()
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
..()
|
||||
pr_energy_relay = new /datum/global_iterator/mecha_energy_relay(list(src),0)
|
||||
pr_energy_relay.set_delay(equip_cooldown)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process()
|
||||
if(!chassis || chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
set_ready_state(TRUE)
|
||||
return PROCESS_KILL
|
||||
var/cur_charge = chassis.get_charge()
|
||||
if(isnull(cur_charge) || !chassis.cell)
|
||||
set_ready_state(TRUE)
|
||||
occupant_message("No powercell detected.")
|
||||
return PROCESS_KILL
|
||||
if(cur_charge<chassis.cell.maxcharge)
|
||||
var/area/A = get_area(chassis)
|
||||
if(A)
|
||||
var/pow_chan
|
||||
for(var/c in list(EQUIP,ENVIRON,LIGHT))
|
||||
if(A.powered(c))
|
||||
pow_chan = c
|
||||
break
|
||||
if(pow_chan)
|
||||
var/delta = min(12, chassis.cell.maxcharge-cur_charge)
|
||||
chassis.give_power(delta)
|
||||
A.use_power_oneoff(delta*coeff, pow_chan)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy()
|
||||
qdel(pr_energy_relay)
|
||||
pr_energy_relay = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/detach()
|
||||
pr_energy_relay.stop()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
// chassis.proc_res["dynusepower"] = null
|
||||
chassis.proc_res["dyngetcharge"] = null
|
||||
..()
|
||||
@@ -66,50 +80,16 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle_relay"])
|
||||
if(pr_energy_relay.toggle())
|
||||
set_ready_state(0)
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
if(datum_flags & DF_ISPROCESSING)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
set_ready_state(TRUE)
|
||||
log_message("Deactivated.")
|
||||
else
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
set_ready_state(FALSE)
|
||||
log_message("Activated.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] - <a href='?src=\ref[src];toggle_relay=1'>[pr_energy_relay.active()?"Dea":"A"]ctivate</a>"
|
||||
|
||||
/* proc/dynusepower(amount)
|
||||
if(!equip_ready) //enabled
|
||||
var/area/A = get_area(chassis)
|
||||
var/pow_chan = get_power_channel(A)
|
||||
if(pow_chan)
|
||||
A.master.use_power(amount*coeff, pow_chan)
|
||||
return 1
|
||||
return chassis.dynusepower(amount)*/
|
||||
|
||||
/datum/global_iterator/mecha_energy_relay
|
||||
|
||||
/datum/global_iterator/mecha_energy_relay/process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER)
|
||||
if(!ER.chassis || ER.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
stop()
|
||||
ER.set_ready_state(1)
|
||||
return
|
||||
var/cur_charge = ER.chassis.get_charge()
|
||||
if(isnull(cur_charge) || !ER.chassis.cell)
|
||||
stop()
|
||||
ER.set_ready_state(1)
|
||||
ER.occupant_message("No powercell detected.")
|
||||
return
|
||||
if(cur_charge<ER.chassis.cell.maxcharge)
|
||||
var/area/A = get_area(ER.chassis)
|
||||
if(A)
|
||||
var/pow_chan
|
||||
for(var/c in list(EQUIP,ENVIRON,LIGHT))
|
||||
if(A.powered(c))
|
||||
pow_chan = c
|
||||
break
|
||||
if(pow_chan)
|
||||
var/delta = min(12, ER.chassis.cell.maxcharge-cur_charge)
|
||||
ER.chassis.give_power(delta)
|
||||
A.use_power_oneoff(delta*ER.coeff, pow_chan)
|
||||
return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] - <a href='?src=\ref[src];toggle_relay=1'>[(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate</a>"
|
||||
@@ -20,7 +20,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher/action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch.
|
||||
if(!action_checks(target) || get_dist(chassis, target)>3) return
|
||||
if(get_dist(chassis, target)>2) return
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
if(do_after_cooldown(target))
|
||||
if( istype(target, /obj/structure/reagent_dispensers) && get_dist(chassis,target) <= 1) //VOREStation Edit
|
||||
var/obj/o = target
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 0
|
||||
range = MELEE
|
||||
var/datum/global_iterator/pr_mech_generator
|
||||
var/coeff = 100
|
||||
var/obj/item/stack/material/fuel
|
||||
var/fuel_type = /obj/item/stack/material/phoron
|
||||
var/max_fuel = 150000
|
||||
var/fuel_per_cycle_idle = 100
|
||||
var/fuel_per_cycle_active = 500
|
||||
@@ -16,25 +16,38 @@
|
||||
|
||||
equip_type = EQUIP_UTILITY
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/New()
|
||||
..()
|
||||
init()
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/Initialize()
|
||||
. = ..()
|
||||
fuel = new fuel_type(src)
|
||||
fuel.amount = 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/Destroy()
|
||||
qdel(pr_mech_generator)
|
||||
pr_mech_generator = null
|
||||
..()
|
||||
qdel(fuel)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/proc/init()
|
||||
fuel = new /obj/item/stack/material/phoron(src)
|
||||
fuel.amount = 0
|
||||
pr_mech_generator = new /datum/global_iterator/mecha_generator(list(src),0)
|
||||
pr_mech_generator.set_delay(equip_cooldown)
|
||||
return
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/process()
|
||||
if(!chassis)
|
||||
set_ready_state(TRUE)
|
||||
return PROCESS_KILL
|
||||
if(fuel.amount<=0)
|
||||
log_message("Deactivated - no fuel.")
|
||||
set_ready_state(TRUE)
|
||||
return PROCESS_KILL
|
||||
var/cur_charge = chassis.get_charge()
|
||||
if(isnull(cur_charge))
|
||||
set_ready_state(TRUE)
|
||||
occupant_message("No powercell detected.")
|
||||
log_message("Deactivated.")
|
||||
return PROCESS_KILL
|
||||
var/use_fuel = fuel_per_cycle_idle
|
||||
if(cur_charge<chassis.cell.maxcharge)
|
||||
use_fuel = fuel_per_cycle_active
|
||||
chassis.give_power(power_per_cycle)
|
||||
fuel.amount -= min(use_fuel/fuel.perunit,fuel.amount)
|
||||
update_equip_info()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/detach()
|
||||
pr_mech_generator.stop()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -42,18 +55,20 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle"])
|
||||
if(pr_mech_generator.toggle())
|
||||
set_ready_state(0)
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
if(datum_flags & DF_ISPROCESSING)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
set_ready_state(TRUE)
|
||||
log_message("Deactivated.")
|
||||
else
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
set_ready_state(FALSE)
|
||||
log_message("Activated.")
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/get_equip_info()
|
||||
var/output = ..()
|
||||
if(output)
|
||||
return "[output] \[[fuel]: [round(fuel.amount*fuel.perunit,0.1)] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[pr_mech_generator.active()?"Dea":"A"]ctivate</a>"
|
||||
return "[output] \[[fuel]: [round(fuel.amount*fuel.perunit,0.1)] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate</a>"
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/action(target)
|
||||
@@ -109,33 +124,6 @@
|
||||
T.assume_air(GM)
|
||||
return
|
||||
|
||||
/datum/global_iterator/mecha_generator
|
||||
|
||||
/datum/global_iterator/mecha_generator/process(var/obj/item/mecha_parts/mecha_equipment/generator/EG)
|
||||
if(!EG.chassis)
|
||||
stop()
|
||||
EG.set_ready_state(1)
|
||||
return 0
|
||||
if(EG.fuel.amount<=0)
|
||||
stop()
|
||||
EG.log_message("Deactivated - no fuel.")
|
||||
EG.set_ready_state(1)
|
||||
return 0
|
||||
var/cur_charge = EG.chassis.get_charge()
|
||||
if(isnull(cur_charge))
|
||||
EG.set_ready_state(1)
|
||||
EG.occupant_message("No powercell detected.")
|
||||
EG.log_message("Deactivated.")
|
||||
stop()
|
||||
return 0
|
||||
var/use_fuel = EG.fuel_per_cycle_idle
|
||||
if(cur_charge<EG.chassis.cell.maxcharge)
|
||||
use_fuel = EG.fuel_per_cycle_active
|
||||
EG.chassis.give_power(EG.power_per_cycle)
|
||||
EG.fuel.amount -= min(use_fuel/EG.fuel.perunit,EG.fuel.amount)
|
||||
EG.update_equip_info()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear
|
||||
name = "\improper ExoNuclear reactor"
|
||||
@@ -146,21 +134,13 @@
|
||||
fuel_per_cycle_idle = 10
|
||||
fuel_per_cycle_active = 30
|
||||
power_per_cycle = 50
|
||||
fuel_type = /obj/item/stack/material/uranium
|
||||
var/rad_per_cycle = 0.3
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/init()
|
||||
fuel = new /obj/item/stack/material/uranium(src)
|
||||
fuel.amount = 0
|
||||
pr_mech_generator = new /datum/global_iterator/mecha_generator/nuclear(list(src),0)
|
||||
pr_mech_generator.set_delay(equip_cooldown)
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/process()
|
||||
if(..())
|
||||
SSradiation.radiate(src, (rad_per_cycle * 3))
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/critfail()
|
||||
return
|
||||
|
||||
/datum/global_iterator/mecha_generator/nuclear
|
||||
|
||||
/datum/global_iterator/mecha_generator/nuclear/process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG)
|
||||
if(..())
|
||||
SSradiation.radiate(EG, (EG.rad_per_cycle * 3))
|
||||
return 1
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
else
|
||||
occupant_message("[target] is not compatible with any present hardpoints.")
|
||||
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
if(istype(target, /obj/item/inflatable) || istype(target, /obj/structure/inflatable))
|
||||
my_deployer.pick_up(target, chassis.occupant)
|
||||
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
@@ -31,14 +31,14 @@
|
||||
return equip_ready
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_on()
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.proc_res["dyndomove"] = src
|
||||
ion_trail.start()
|
||||
occupant_message("Activated")
|
||||
log_message("Activated")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_off()
|
||||
set_ready_state(1)
|
||||
set_ready_state(TRUE)
|
||||
chassis.proc_res["dyndomove"] = null
|
||||
ion_trail.stop()
|
||||
occupant_message("Deactivated")
|
||||
@@ -62,10 +62,9 @@
|
||||
if(move_result)
|
||||
wait = 1
|
||||
chassis.use_power(energy_drain)
|
||||
if(!chassis.pr_inertial_movement.active())
|
||||
chassis.pr_inertial_movement.start(list(chassis,direction))
|
||||
else
|
||||
chassis.pr_inertial_movement.set_process_args(list(chassis,direction))
|
||||
chassis.float_direction = direction
|
||||
if(!(chassis.current_processes & MECHA_PROC_MOVEMENT))
|
||||
chassis.start_process(MECHA_PROC_MOVEMENT)
|
||||
do_after_cooldown()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
energy_drain = 100
|
||||
range = 0
|
||||
var/health_boost = 2
|
||||
var/datum/global_iterator/pr_repair_droid
|
||||
var/icon/droid_overlay
|
||||
var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH)
|
||||
|
||||
@@ -15,17 +14,6 @@
|
||||
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/New()
|
||||
..()
|
||||
pr_repair_droid = new /datum/global_iterator/mecha_repair_droid(list(src),0)
|
||||
pr_repair_droid.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy()
|
||||
qdel(pr_repair_droid)
|
||||
pr_repair_droid = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/add_equip_overlay(obj/mecha/M as obj)
|
||||
..()
|
||||
if(!droid_overlay)
|
||||
@@ -40,73 +28,70 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/detach()
|
||||
chassis.cut_overlay(droid_overlay)
|
||||
pr_repair_droid.stop()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info()
|
||||
if(!chassis) return
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] - <a href='?src=\ref[src];toggle_repairs=1'>[pr_repair_droid.active()?"Dea":"A"]ctivate</a>"
|
||||
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span> [src.name] - <a href='?src=\ref[src];toggle_repairs=1'>[(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate</a>"
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["toggle_repairs"])
|
||||
chassis.cut_overlay(droid_overlay)
|
||||
if(pr_repair_droid.toggle())
|
||||
if(datum_flags & DF_ISPROCESSING)
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid")
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
log_message("Deactivated.")
|
||||
set_ready_state(TRUE)
|
||||
else
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid_a")
|
||||
log_message("Activated.")
|
||||
else
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid")
|
||||
log_message("Deactivated.")
|
||||
set_ready_state(1)
|
||||
START_PROCESSING(SSobj, src)
|
||||
chassis.add_overlay(droid_overlay)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
|
||||
return
|
||||
|
||||
|
||||
/datum/global_iterator/mecha_repair_droid
|
||||
|
||||
/datum/global_iterator/mecha_repair_droid/process(var/obj/item/mecha_parts/mecha_equipment/repair_droid/RD as obj)
|
||||
if(!RD.chassis)
|
||||
stop()
|
||||
RD.set_ready_state(1)
|
||||
return
|
||||
var/health_boost = RD.health_boost
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/process()
|
||||
if(!chassis)
|
||||
set_ready_state(TRUE)
|
||||
return PROCESS_KILL
|
||||
var/repaired = 0
|
||||
if(RD.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
health_boost *= -2
|
||||
else if(RD.chassis.hasInternalDamage() && prob(15))
|
||||
for(var/int_dam_flag in RD.repairable_damage)
|
||||
if(RD.chassis.hasInternalDamage(int_dam_flag))
|
||||
RD.chassis.clearInternalDamage(int_dam_flag)
|
||||
var/effective_boost = health_boost
|
||||
if(chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
effective_boost *= -2
|
||||
else if(chassis.hasInternalDamage() && prob(15))
|
||||
for(var/int_dam_flag in repairable_damage)
|
||||
if(chassis.hasInternalDamage(int_dam_flag))
|
||||
chassis.clearInternalDamage(int_dam_flag)
|
||||
repaired = 1
|
||||
break
|
||||
|
||||
var/obj/item/mecha_parts/component/AC = RD.chassis.internal_components[MECH_ARMOR]
|
||||
var/obj/item/mecha_parts/component/HC = RD.chassis.internal_components[MECH_HULL]
|
||||
var/obj/item/mecha_parts/component/AC = chassis.internal_components[MECH_ARMOR]
|
||||
var/obj/item/mecha_parts/component/HC = chassis.internal_components[MECH_HULL]
|
||||
|
||||
var/damaged_armor = AC.integrity < AC.max_integrity
|
||||
|
||||
var/damaged_hull = HC.integrity < HC.max_integrity
|
||||
|
||||
if(health_boost<0 || RD.chassis.health < initial(RD.chassis.health) || damaged_armor || damaged_hull)
|
||||
RD.chassis.health += min(health_boost, initial(RD.chassis.health)-RD.chassis.health)
|
||||
if(effective_boost<0 || chassis.health < initial(chassis.health) || damaged_armor || damaged_hull)
|
||||
chassis.health += min(effective_boost, initial(chassis.health)-chassis.health)
|
||||
|
||||
if(AC)
|
||||
AC.adjust_integrity(round(health_boost * 0.5, 0.5))
|
||||
AC.adjust_integrity(round(effective_boost * 0.5, 0.5))
|
||||
|
||||
if(HC)
|
||||
HC.adjust_integrity(round(health_boost * 0.5, 0.5))
|
||||
HC.adjust_integrity(round(effective_boost * 0.5, 0.5))
|
||||
|
||||
repaired = 1
|
||||
if(repaired)
|
||||
if(RD.chassis.use_power(RD.energy_drain))
|
||||
RD.set_ready_state(0)
|
||||
if(chassis.use_power(energy_drain))
|
||||
set_ready_state(FALSE)
|
||||
else
|
||||
stop()
|
||||
RD.set_ready_state(1)
|
||||
return
|
||||
set_ready_state(TRUE)
|
||||
return PROCESS_KILL
|
||||
else
|
||||
RD.set_ready_state(1)
|
||||
set_ready_state(TRUE)
|
||||
return
|
||||
@@ -70,11 +70,11 @@
|
||||
if(chassis)
|
||||
my_shield.attack_self(chassis.occupant)
|
||||
if(my_shield.active)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
step_delay = 4
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
set_ready_state(TRUE)
|
||||
step_delay = 1
|
||||
log_message("Deactivated.")
|
||||
|
||||
|
||||
@@ -42,11 +42,11 @@
|
||||
if(shields)
|
||||
shields.set_on(!shields.active)
|
||||
if(shields.active)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
step_delay = 4
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
set_ready_state(TRUE)
|
||||
step_delay = initial(step_delay)
|
||||
log_message("Deactivated.")
|
||||
|
||||
|
||||
@@ -9,20 +9,12 @@
|
||||
equip_cooldown = 30
|
||||
mech_flags = EXOSUIT_MODULE_MEDICAL
|
||||
var/mob/living/carbon/human/occupant = null
|
||||
var/datum/global_iterator/pr_mech_sleeper
|
||||
var/inject_amount = 5
|
||||
required_type = list(/obj/mecha/medical)
|
||||
salvageable = 0
|
||||
allow_duplicate = TRUE
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/New()
|
||||
..()
|
||||
pr_mech_sleeper = new /datum/global_iterator/mech_sleeper(list(src),0)
|
||||
pr_mech_sleeper.set_delay(equip_cooldown)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/Destroy()
|
||||
qdel(pr_mech_sleeper)
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(get_turf(src))
|
||||
return ..()
|
||||
@@ -63,8 +55,8 @@
|
||||
target.client.perspective = EYE_PERSPECTIVE
|
||||
target.client.eye = chassis
|
||||
*/
|
||||
set_ready_state(0)
|
||||
pr_mech_sleeper.start()
|
||||
set_ready_state(FALSE)
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
occupant_message("<font color='blue'>[target] successfully loaded into [src]. Life support functions engaged.</font>")
|
||||
chassis.visible_message("[chassis] loads [target] into [src].")
|
||||
log_message("[target] loaded. Life support functions engaged.")
|
||||
@@ -84,15 +76,15 @@
|
||||
*/
|
||||
occupant.Stasis(0)
|
||||
occupant = null
|
||||
pr_mech_sleeper.stop()
|
||||
set_ready_state(1)
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
set_ready_state(TRUE)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/detach()
|
||||
if(occupant)
|
||||
occupant_message("Unable to detach [src] - equipment occupied.")
|
||||
return
|
||||
pr_mech_sleeper.stop()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/get_equip_info()
|
||||
@@ -218,18 +210,17 @@
|
||||
return
|
||||
go_out()//and release him from the eternal prison.
|
||||
|
||||
/datum/global_iterator/mech_sleeper
|
||||
|
||||
/datum/global_iterator/mech_sleeper/process(var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S)
|
||||
if(!S.chassis)
|
||||
S.set_ready_state(1)
|
||||
return stop()
|
||||
if(!S.chassis.has_charge(S.energy_drain))
|
||||
S.set_ready_state(1)
|
||||
S.log_message("Deactivated.")
|
||||
S.occupant_message("[src] deactivated - no power.")
|
||||
return stop()
|
||||
var/mob/living/carbon/M = S.occupant
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/process()
|
||||
..()
|
||||
if(!chassis)
|
||||
set_ready_state(TRUE)
|
||||
return PROCESS_KILL
|
||||
if(!chassis.has_charge(energy_drain))
|
||||
set_ready_state(TRUE)
|
||||
log_message("Deactivated.")
|
||||
occupant_message("[src] deactivated - no power.")
|
||||
return PROCESS_KILL
|
||||
var/mob/living/carbon/M = occupant
|
||||
if(!M)
|
||||
return
|
||||
if(M.health > 0)
|
||||
@@ -243,6 +234,6 @@
|
||||
M.Stun(2)
|
||||
if(M.reagents.get_reagent_amount("inaprovaline") < 5)
|
||||
M.reagents.add_reagent("inaprovaline", 5)
|
||||
S.chassis.use_power(S.energy_drain)
|
||||
S.update_equip_info()
|
||||
chassis.use_power(energy_drain)
|
||||
update_equip_info()
|
||||
return
|
||||
@@ -18,17 +18,16 @@
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
|
||||
required_type = list(/obj/mecha/medical)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/New()
|
||||
..()
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/Initialize()
|
||||
. = ..()
|
||||
flags |= NOREACT
|
||||
syringes = new
|
||||
known_reagents = list("inaprovaline"="Inaprovaline","anti_toxin"="Dylovene")
|
||||
processed_reagents = new
|
||||
create_reagents(max_volume)
|
||||
synth = new (list(src),0)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/detach()
|
||||
synth.stop()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/critfail()
|
||||
@@ -59,7 +58,7 @@
|
||||
if(reagents.total_volume<=0)
|
||||
occupant_message("<span class=\"alert\">No available reagents to load syringe with.</span>")
|
||||
return
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
var/turf/trg = get_turf(target)
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
|
||||
@@ -123,7 +122,7 @@
|
||||
m++
|
||||
if(processed_reagents.len)
|
||||
message += " added to production"
|
||||
synth.start()
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
occupant_message(message)
|
||||
occupant_message("Reagent processing started.")
|
||||
log_message("Reagent processing started.")
|
||||
@@ -243,7 +242,7 @@
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/proc/add_known_reagent(r_id,r_name)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
do_after_cooldown()
|
||||
if(!(r_id in known_reagents))
|
||||
known_reagents += r_id
|
||||
@@ -264,22 +263,17 @@
|
||||
update_equip_info()
|
||||
return
|
||||
|
||||
/datum/global_iterator/mech_synth
|
||||
delay = 100
|
||||
|
||||
/datum/global_iterator/mech_synth/process(var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/S)
|
||||
if(!S.chassis)
|
||||
return stop()
|
||||
var/energy_drain = S.energy_drain*10
|
||||
if(!S.processed_reagents.len || S.reagents.total_volume >= S.reagents.maximum_volume || !S.chassis.has_charge(energy_drain))
|
||||
S.occupant_message("<span class=\"alert\">Reagent processing stopped.</span>")
|
||||
S.log_message("Reagent processing stopped.")
|
||||
return stop()
|
||||
var/amount = S.synth_speed / S.processed_reagents.len
|
||||
for(var/reagent in S.processed_reagents)
|
||||
S.reagents.add_reagent(reagent,amount)
|
||||
S.chassis.use_power(energy_drain)
|
||||
return 1
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/process()
|
||||
if(!chassis)
|
||||
return PROCESS_KILL
|
||||
if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain))
|
||||
occupant_message("<span class=\"alert\">Reagent processing stopped.</span>")
|
||||
log_message("Reagent processing stopped.")
|
||||
return PROCESS_KILL
|
||||
var/amount = synth_speed / processed_reagents.len
|
||||
for(var/reagent in processed_reagents)
|
||||
reagents.add_reagent(reagent,amount)
|
||||
chassis.use_power(energy_drain)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone
|
||||
name = "crisis dronebay"
|
||||
@@ -321,10 +315,6 @@
|
||||
. = ..()
|
||||
drone_overlay = new(src.icon, icon_state = droid_state)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone/attach(obj/mecha/M as obj)
|
||||
. = ..(M)
|
||||
if(chassis)
|
||||
@@ -464,10 +454,10 @@
|
||||
if(chassis)
|
||||
enabled = !enabled
|
||||
if(enabled)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
log_message("Activated.")
|
||||
else
|
||||
set_ready_state(1)
|
||||
set_ready_state(TRUE)
|
||||
log_message("Deactivated.")
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone/add_equip_overlay(obj/mecha/M as obj)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(!action_checks(target) || src.loc.z == 2) return
|
||||
var/turf/T = get_turf(target)
|
||||
if(T)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
chassis.use_power(energy_drain)
|
||||
do_teleport(chassis, T, 4)
|
||||
do_after_cooldown()
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
if(!target_turf)
|
||||
return
|
||||
chassis.use_power(energy_drain)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
var/obj/effect/portal/P = new /obj/effect/portal(get_turf(target))
|
||||
P.target = target_turf
|
||||
P.creator = null
|
||||
|
||||
@@ -57,12 +57,12 @@
|
||||
var/P = new projectile(projectile_turf)
|
||||
Fire(P, target, params)
|
||||
if(i == 1)
|
||||
set_ready_state(0)
|
||||
set_ready_state(FALSE)
|
||||
if(fire_cooldown)
|
||||
sleep(fire_cooldown)
|
||||
if(auto_rearm)
|
||||
projectiles = projectiles_per_shot
|
||||
// set_ready_state(0)
|
||||
// set_ready_state(FALSE)
|
||||
|
||||
//CHOMPedit, redundant code removed. Fixes weapon lock on mob kill.
|
||||
add_attack_logs(chassis.occupant,target, "Fired exosuit weapon [src.name] (MANUAL)")
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
#define MECHA_INT_TANK_BREACH 8
|
||||
#define MECHA_INT_CONTROL_LOST 16
|
||||
|
||||
#define MECHA_PROC_MOVEMENT 1
|
||||
#define MECHA_PROC_DAMAGE 2
|
||||
#define MECHA_PROC_INT_TEMP 4
|
||||
|
||||
#define MELEE 1
|
||||
#define RANGED 2
|
||||
|
||||
@@ -92,18 +96,18 @@
|
||||
var/list/operation_req_access = list() //Required access level for mecha operation
|
||||
var/list/internals_req_access = list(access_engine,access_robotics) //Required access level to open cell compartment
|
||||
|
||||
var/datum/global_iterator/pr_int_temp_processor //Normalizes internal air mixture temperature
|
||||
var/datum/global_iterator/pr_inertial_movement //Controls intertial movement in spesss
|
||||
var/datum/global_iterator/pr_give_air //Moves air from tank to cabin
|
||||
var/datum/global_iterator/pr_internal_damage //Processes internal damage
|
||||
|
||||
|
||||
var/wreckage
|
||||
|
||||
var/list/equipment = new //This lists holds what stuff you bolted onto your baby ride
|
||||
var/obj/item/mecha_parts/mecha_equipment/selected
|
||||
var/max_equip = 2
|
||||
var/datum/events/events
|
||||
|
||||
// What direction to float in, if inertial movement is active.
|
||||
var/float_direction = 0
|
||||
// Process() iterator count.
|
||||
var/process_ticks = 0
|
||||
// These control what toggleable processes are executed within process().
|
||||
var/current_processes = MECHA_PROC_INT_TEMP
|
||||
|
||||
//mechaequipt2 stuffs
|
||||
var/list/hull_equipment = new
|
||||
@@ -222,8 +226,6 @@
|
||||
|
||||
/obj/mecha/New()
|
||||
..()
|
||||
events = new
|
||||
|
||||
icon_state += "-open"
|
||||
add_radio()
|
||||
add_cabin()
|
||||
@@ -239,7 +241,6 @@
|
||||
src.smoke_system.attach(src)
|
||||
|
||||
add_cell()
|
||||
add_iterators()
|
||||
removeVerb(/obj/mecha/verb/disconnect_from_port)
|
||||
log_message("[src.name] created.")
|
||||
loc.Entered(src)
|
||||
@@ -282,7 +283,7 @@
|
||||
if(E.salvageable && prob(30))
|
||||
WR.crowbar_salvage += E
|
||||
E.forceMove(WR)
|
||||
E.equip_ready = 1
|
||||
E.equip_ready = TRUE
|
||||
else
|
||||
E.forceMove(loc)
|
||||
E.destroy()
|
||||
@@ -324,16 +325,122 @@
|
||||
|
||||
GLOB.mech_destroyed_roundstat++
|
||||
|
||||
QDEL_NULL(pr_int_temp_processor)
|
||||
QDEL_NULL(pr_inertial_movement)
|
||||
QDEL_NULL(pr_give_air)
|
||||
QDEL_NULL(pr_internal_damage)
|
||||
QDEL_NULL(spark_system)
|
||||
QDEL_NULL(minihud)
|
||||
|
||||
mechas_list -= src //global mech list
|
||||
. = ..()
|
||||
|
||||
// The main process loop to replace the ancient global iterators.
|
||||
// It's a bit hardcoded but I don't see anyone else adding stuff to
|
||||
// mechas, and it's easy enough to modify.
|
||||
/obj/mecha/process()
|
||||
var/static/max_ticks = 16
|
||||
|
||||
if (current_processes & MECHA_PROC_MOVEMENT)
|
||||
process_inertial_movement()
|
||||
|
||||
if ((current_processes & MECHA_PROC_DAMAGE) && !(process_ticks % 2))
|
||||
process_internal_damage()
|
||||
|
||||
if ((current_processes & MECHA_PROC_INT_TEMP) && !(process_ticks % 4))
|
||||
process_preserve_temp()
|
||||
|
||||
if (!(process_ticks % 3))
|
||||
process_tank_give_air()
|
||||
|
||||
// Max value is 16. So we let it run between [0, 16] with this.
|
||||
process_ticks = (process_ticks + 1) % 17
|
||||
|
||||
// Normalizing cabin air temperature to 20 degrees celsius.
|
||||
// Called every fourth process() tick (20 deciseconds).
|
||||
/obj/mecha/proc/process_preserve_temp()
|
||||
if (cabin_air && cabin_air.volume > 0)
|
||||
var/delta = cabin_air.temperature - T20C
|
||||
cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1)))
|
||||
|
||||
// Handles internal air tank action.
|
||||
// Called every third process() tick (15 deciseconds).
|
||||
/obj/mecha/proc/process_tank_give_air()
|
||||
if(internal_tank)
|
||||
var/datum/gas_mixture/tank_air = internal_tank.return_air()
|
||||
|
||||
var/release_pressure = internal_tank_valve
|
||||
var/cabin_pressure = cabin_air.return_pressure()
|
||||
var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2)
|
||||
var/transfer_moles = 0
|
||||
|
||||
if(pressure_delta > 0) //cabin pressure lower than release pressure
|
||||
if(tank_air.temperature > 0)
|
||||
transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION)
|
||||
var/datum/gas_mixture/removed = tank_air.remove(transfer_moles)
|
||||
cabin_air.merge(removed)
|
||||
|
||||
else if(pressure_delta < 0) //cabin pressure higher than release pressure
|
||||
var/datum/gas_mixture/t_air = get_turf_air()
|
||||
pressure_delta = cabin_pressure - release_pressure
|
||||
|
||||
if(t_air)
|
||||
pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta)
|
||||
if(pressure_delta > 0) //if location pressure is lower than cabin pressure
|
||||
transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles)
|
||||
if(t_air)
|
||||
t_air.merge(removed)
|
||||
else //just delete the cabin gas, we're in space or some shit
|
||||
qdel(removed)
|
||||
|
||||
// Inertial movement in space.
|
||||
// Called every process() tick (5 deciseconds).
|
||||
/obj/mecha/proc/process_inertial_movement()
|
||||
if(float_direction)
|
||||
if(!step(src, float_direction) || check_for_support())
|
||||
stop_process(MECHA_PROC_MOVEMENT)
|
||||
else
|
||||
stop_process(MECHA_PROC_MOVEMENT)
|
||||
return
|
||||
|
||||
// Processes internal damage.
|
||||
// Called every other process() tick (10 deciseconds).
|
||||
/obj/mecha/proc/process_internal_damage()
|
||||
if(!hasInternalDamage())
|
||||
stop_process(MECHA_PROC_DAMAGE)
|
||||
return
|
||||
|
||||
if(hasInternalDamage(MECHA_INT_FIRE))
|
||||
if(!hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5))
|
||||
clearInternalDamage(MECHA_INT_FIRE)
|
||||
if(internal_tank)
|
||||
if(internal_tank.return_pressure()>internal_tank.maximum_pressure && !(hasInternalDamage(MECHA_INT_TANK_BREACH)))
|
||||
setInternalDamage(MECHA_INT_TANK_BREACH)
|
||||
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
|
||||
if(int_tank_air && int_tank_air.volume>0) //heat the air_contents
|
||||
int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15))
|
||||
if(cabin_air && cabin_air.volume>0)
|
||||
cabin_air.temperature = min(6000+T0C, cabin_air.temperature+rand(10,15))
|
||||
if(cabin_air.temperature>max_temperature/2)
|
||||
take_damage(4/round(max_temperature/cabin_air.temperature,0.1),"fire")
|
||||
|
||||
if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
|
||||
stop_process(MECHA_PROC_INT_TEMP)
|
||||
|
||||
if(hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank
|
||||
if(internal_tank)
|
||||
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
|
||||
var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10)
|
||||
if(istype(loc, /turf/simulated))
|
||||
loc.assume_air(leaked_gas)
|
||||
else
|
||||
qdel(leaked_gas)
|
||||
|
||||
if(hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
if(get_charge())
|
||||
spark_system.start()
|
||||
cell.charge -= min(20,cell.charge)
|
||||
cell.maxcharge -= min(20,cell.maxcharge)
|
||||
return
|
||||
|
||||
////////////////////////
|
||||
////// Helpers /////////
|
||||
////////////////////////
|
||||
@@ -372,12 +479,6 @@
|
||||
radio.icon_state = icon_state
|
||||
radio.subspace_transmission = 1
|
||||
|
||||
/obj/mecha/proc/add_iterators()
|
||||
pr_int_temp_processor = new /datum/global_iterator/mecha_preserve_temp(list(src))
|
||||
pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0)
|
||||
pr_give_air = new /datum/global_iterator/mecha_tank_give_air(list(src))
|
||||
pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0)
|
||||
|
||||
/obj/mecha/proc/do_after(delay as num)
|
||||
sleep(delay)
|
||||
if(src)
|
||||
@@ -692,7 +793,7 @@
|
||||
/obj/mecha/proc/dyndomove(direction)
|
||||
if(!can_move)
|
||||
return 0
|
||||
if(src.pr_inertial_movement.active())
|
||||
if(current_processes & MECHA_PROC_MOVEMENT)
|
||||
return 0
|
||||
if(!has_charge(step_energy_drain))
|
||||
return 0
|
||||
@@ -711,16 +812,7 @@
|
||||
last_message = world.time
|
||||
return 0
|
||||
|
||||
|
||||
/*
|
||||
//A first draft of a check to stop mechs from moving fully. TBD when all thrusters modules are unified.
|
||||
if(!thrusters && !src.pr_inertial_movement.active() && isspace(src.loc))//No thrsters, not drifting, in space
|
||||
src.occupant_message("Error 543")//debug
|
||||
return 0
|
||||
*/
|
||||
|
||||
|
||||
if(!thrusters && src.pr_inertial_movement.active()) //I think this mean 'if you try to move in space without thruster, u no move'
|
||||
if(!thrusters && (current_processes & MECHA_PROC_MOVEMENT)) //I think this mean 'if you try to move in space without thruster, u no move'
|
||||
return 0
|
||||
|
||||
if(overload)//Check if you have leg overload
|
||||
@@ -780,7 +872,8 @@
|
||||
use_power(step_energy_drain)
|
||||
if(istype(src.loc, /turf/space))
|
||||
if(!src.check_for_support())
|
||||
src.pr_inertial_movement.start(list(src,direction))
|
||||
float_direction = direction
|
||||
start_process(MECHA_PROC_MOVEMENT)
|
||||
src.log_message("<span class='warning'>Movement control lost. Inertial movement started.</span>")
|
||||
if(do_after(get_step_delay()))
|
||||
can_move = 1
|
||||
@@ -882,10 +975,8 @@
|
||||
|
||||
|
||||
/obj/mecha/proc/setInternalDamage(int_dam_flag)
|
||||
if(!pr_internal_damage) return
|
||||
|
||||
internal_damage |= int_dam_flag
|
||||
pr_internal_damage.start()
|
||||
start_process(MECHA_PROC_DAMAGE)
|
||||
log_append_to_last("Internal damage of type [int_dam_flag].",1)
|
||||
occupant << sound('sound/mecha/internaldmgalarm.ogg',volume=50) //Better sounding.
|
||||
return
|
||||
@@ -895,7 +986,7 @@
|
||||
switch(int_dam_flag)
|
||||
if(MECHA_INT_TEMP_CONTROL)
|
||||
occupant_message("<font color='blue'><b>Life support system reactivated.</b></font>")
|
||||
pr_int_temp_processor.start()
|
||||
start_process(MECHA_PROC_INT_TEMP)
|
||||
if(MECHA_INT_FIRE)
|
||||
occupant_message("<font color='blue'><b>Internal fire extinquished.</b></font>")
|
||||
if(MECHA_INT_TANK_BREACH)
|
||||
@@ -2725,99 +2816,21 @@
|
||||
return 1
|
||||
|
||||
|
||||
//////////////////////////////////////////
|
||||
//////// Mecha global iterators ////////
|
||||
//////////////////////////////////////////
|
||||
/////////////////////////////////////////
|
||||
//////// Mecha process() helpers ////////
|
||||
/////////////////////////////////////////
|
||||
/obj/mecha/proc/stop_process(process)
|
||||
current_processes &= ~process
|
||||
|
||||
/obj/mecha/proc/start_process(process)
|
||||
current_processes |= process
|
||||
|
||||
/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsium
|
||||
delay = 20
|
||||
/////////////////////////////////////////////////
|
||||
//////// Mecha process() subcomponents ////////
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
process(var/obj/mecha/mecha)
|
||||
if(mecha.cabin_air && mecha.cabin_air.volume > 0)
|
||||
var/delta = mecha.cabin_air.temperature - T20C
|
||||
mecha.cabin_air.temperature -= max(-10, min(10, round(delta/4,0.1)))
|
||||
return
|
||||
|
||||
/datum/global_iterator/mecha_tank_give_air
|
||||
delay = 15
|
||||
|
||||
/datum/global_iterator/mecha_tank_give_air/process(var/obj/mecha/mecha)
|
||||
if(mecha.internal_tank)
|
||||
var/datum/gas_mixture/tank_air = mecha.internal_tank.return_air()
|
||||
var/datum/gas_mixture/cabin_air = mecha.cabin_air
|
||||
|
||||
var/release_pressure = mecha.internal_tank_valve
|
||||
var/cabin_pressure = cabin_air.return_pressure()
|
||||
var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2)
|
||||
var/transfer_moles = 0
|
||||
if(pressure_delta > 0) //cabin pressure lower than release pressure
|
||||
if(tank_air.temperature > 0)
|
||||
transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION)
|
||||
var/datum/gas_mixture/removed = tank_air.remove(transfer_moles)
|
||||
cabin_air.merge(removed)
|
||||
else if(pressure_delta < 0) //cabin pressure higher than release pressure
|
||||
var/datum/gas_mixture/t_air = mecha.get_turf_air()
|
||||
pressure_delta = cabin_pressure - release_pressure
|
||||
if(t_air)
|
||||
pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta)
|
||||
if(pressure_delta > 0) //if location pressure is lower than cabin pressure
|
||||
transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION)
|
||||
var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles)
|
||||
if(t_air)
|
||||
t_air.merge(removed)
|
||||
else //just delete the cabin gas, we're in space or some shit
|
||||
qdel(removed)
|
||||
else
|
||||
return stop()
|
||||
return
|
||||
|
||||
/datum/global_iterator/mecha_intertial_movement //inertial movement in space
|
||||
delay = 7
|
||||
|
||||
/datum/global_iterator/mecha_intertial_movement/process(var/obj/mecha/mecha as obj,direction)
|
||||
if(direction)
|
||||
if(!step(mecha, direction)||mecha.check_for_support())
|
||||
src.stop()
|
||||
mecha.handle_equipment_movement()
|
||||
else
|
||||
src.stop()
|
||||
return
|
||||
|
||||
/datum/global_iterator/mecha_internal_damage // processing internal damage
|
||||
|
||||
/datum/global_iterator/mecha_internal_damage/process(var/obj/mecha/mecha)
|
||||
if(!mecha.hasInternalDamage())
|
||||
return stop()
|
||||
if(mecha.hasInternalDamage(MECHA_INT_FIRE))
|
||||
if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5))
|
||||
mecha.clearInternalDamage(MECHA_INT_FIRE)
|
||||
if(mecha.internal_tank)
|
||||
if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)))
|
||||
mecha.setInternalDamage(MECHA_INT_TANK_BREACH)
|
||||
var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air()
|
||||
if(int_tank_air && int_tank_air.volume>0) //heat the air_contents
|
||||
int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15))
|
||||
if(mecha.cabin_air && mecha.cabin_air.volume>0)
|
||||
mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.temperature+rand(10,15))
|
||||
if(mecha.cabin_air.temperature>mecha.max_temperature/2)
|
||||
mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.temperature,0.1),"fire") //The take_damage() proc handles armor values
|
||||
if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum
|
||||
mecha.pr_int_temp_processor.stop()
|
||||
if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank
|
||||
if(mecha.internal_tank)
|
||||
var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air()
|
||||
var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10)
|
||||
if(mecha.loc && hascall(mecha.loc,"assume_air"))
|
||||
mecha.loc.assume_air(leaked_gas)
|
||||
else
|
||||
qdel(leaked_gas)
|
||||
if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
if(mecha.get_charge())
|
||||
mecha.spark_system.start()
|
||||
mecha.cell.charge -= min(20,mecha.cell.charge)
|
||||
mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge)
|
||||
return
|
||||
// Handles the internal alarms for a mech.
|
||||
// Called every 16 iterations (80 deciseconds).
|
||||
|
||||
|
||||
/////////////
|
||||
|
||||
@@ -44,40 +44,25 @@
|
||||
var/list/operation_req_access = list()//required access level for mecha operation
|
||||
var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment
|
||||
|
||||
//var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature //In airtight.dm you go -Agouri
|
||||
var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss
|
||||
|
||||
//var/datum/global_iterator/pr_give_air //moves air from tank to cabin //Y-you too -Agouri
|
||||
|
||||
var/datum/global_iterator/pr_internal_damage //processes internal damage
|
||||
|
||||
|
||||
var/wreckage
|
||||
|
||||
var/list/equipment = new
|
||||
var/obj/selected
|
||||
//var/max_equip = 3
|
||||
|
||||
var/datum/events/events
|
||||
|
||||
|
||||
|
||||
/obj/vehicle/New()
|
||||
..()
|
||||
events = new
|
||||
/obj/vehicle/Initialize()
|
||||
. = ..()
|
||||
icon_state += "-unmanned"
|
||||
add_radio()
|
||||
//add_cabin() //No cabin for non-airtights
|
||||
|
||||
spark_system.set_up(2, 0, src)
|
||||
spark_system.attach(src)
|
||||
add_cell()
|
||||
add_iterators()
|
||||
removeVerb(/obj/mecha/verb/disconnect_from_port)
|
||||
removeVerb(/atom/movable/verb/pull)
|
||||
log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.")
|
||||
loc.Entered(src)
|
||||
return
|
||||
|
||||
|
||||
//################ Helpers ###########################################################
|
||||
@@ -89,26 +74,12 @@
|
||||
/obj/vehicle/proc/addVerb(verb_path)
|
||||
verbs += verb_path
|
||||
|
||||
/*/obj/vehicle/proc/add_airtank() //In airtight.dm -Agouri
|
||||
internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
|
||||
return internal_tank*/
|
||||
|
||||
/obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null)
|
||||
if(C)
|
||||
C.forceMove(src)
|
||||
cell = C
|
||||
return
|
||||
cell = new(src)
|
||||
cell.charge = 15000
|
||||
cell.maxcharge = 15000
|
||||
|
||||
/*/obj/vehicle/proc/add_cabin() //In airtight.dm -Agouri
|
||||
cabin_air = new
|
||||
cabin_air.temperature = T20C
|
||||
cabin_air.volume = 200
|
||||
cabin_air.oxygen = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
|
||||
cabin_air.nitrogen = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
|
||||
return cabin_air*/
|
||||
cell = new /obj/item/weapon/cell/mech(src)
|
||||
|
||||
/obj/vehicle/proc/add_radio()
|
||||
radio = new(src)
|
||||
@@ -117,12 +88,6 @@
|
||||
radio.icon_state = icon_state
|
||||
radio.subspace_transmission = 1
|
||||
|
||||
/obj/vehicle/proc/add_iterators()
|
||||
pr_inertial_movement = new /datum/global_iterator/vehicle_intertial_movement(null,0)
|
||||
//pr_internal_damage = new /datum/global_iterator/vehicle_internal_damage(list(src),0)
|
||||
//pr_int_temp_processor = new /datum/global_iterator/vehicle_preserve_temp(list(src)) //In airtight.dm's add_airtight_iterators -Agouri
|
||||
//pr_give_air = new /datum/global_iterator/vehicle_tank_give_air(list(src) //Same here -Agouri
|
||||
|
||||
/obj/vehicle/proc/check_for_support()
|
||||
if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src)))
|
||||
return 1
|
||||
@@ -136,55 +101,3 @@
|
||||
log.len++
|
||||
log[log.len] = list("time"=world.timeofday,"message"="[red?"<font color='red'>":null][message][red?"</font>":null]")
|
||||
return log.len
|
||||
|
||||
|
||||
|
||||
//################ Global Iterator Datums ######################################
|
||||
|
||||
|
||||
/datum/global_iterator/vehicle_intertial_movement //inertial movement in space
|
||||
delay = 7
|
||||
|
||||
process(var/obj/vehicle/V as obj, direction)
|
||||
if(direction)
|
||||
if(!step(V, direction)||V.check_for_support())
|
||||
src.stop()
|
||||
else
|
||||
src.stop()
|
||||
return
|
||||
|
||||
|
||||
/datum/global_iterator/mecha_internal_damage // processing internal damage
|
||||
|
||||
process(var/obj/mecha/mecha)
|
||||
if(!mecha.hasInternalDamage())
|
||||
return stop()
|
||||
if(mecha.hasInternalDamage(MECHA_INT_FIRE))
|
||||
if(!mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL) && prob(5))
|
||||
mecha.clearInternalDamage(MECHA_INT_FIRE)
|
||||
if(mecha.internal_tank)
|
||||
if(mecha.internal_tank.return_pressure()>mecha.internal_tank.maximum_pressure && !(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)))
|
||||
mecha.setInternalDamage(MECHA_INT_TANK_BREACH)
|
||||
var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air()
|
||||
if(int_tank_air && int_tank_air.return_volume()>0) //heat the air_contents
|
||||
int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(10,15))
|
||||
if(mecha.cabin_air && mecha.cabin_air.return_volume()>0)
|
||||
mecha.cabin_air.temperature = min(6000+T0C, mecha.cabin_air.return_temperature()+rand(10,15))
|
||||
if(mecha.cabin_air.return_temperature()>mecha.max_temperature/2)
|
||||
mecha.take_damage(4/round(mecha.max_temperature/mecha.cabin_air.return_temperature(),0.1),"fire")
|
||||
if(mecha.hasInternalDamage(MECHA_INT_TEMP_CONTROL)) //stop the mecha_preserve_temp loop datum
|
||||
mecha.pr_int_temp_processor.stop()
|
||||
if(mecha.hasInternalDamage(MECHA_INT_TANK_BREACH)) //remove some air from internal tank
|
||||
if(mecha.internal_tank)
|
||||
var/datum/gas_mixture/int_tank_air = mecha.internal_tank.return_air()
|
||||
var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.10)
|
||||
if(mecha.loc && hascall(mecha.loc,"assume_air"))
|
||||
mecha.loc.assume_air(leaked_gas)
|
||||
else
|
||||
qdel(leaked_gas)
|
||||
if(mecha.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
if(mecha.get_charge())
|
||||
mecha.spark_system.start()
|
||||
mecha.cell.charge -= min(20,mecha.cell.charge)
|
||||
mecha.cell.maxcharge -= min(20,mecha.cell.maxcharge)
|
||||
return
|
||||
@@ -363,15 +363,15 @@
|
||||
if((my_tool && loc != my_tool) && (my_mecha && loc != my_mecha))
|
||||
forceMove(my_tool)
|
||||
if(active)
|
||||
my_tool.set_ready_state(0)
|
||||
my_tool.set_ready_state(FALSE)
|
||||
if(my_mecha.has_charge(my_tool.energy_drain * 50)) //Stops at around 1000 charge.
|
||||
my_mecha.use_power(my_tool.energy_drain)
|
||||
else
|
||||
destroy_shields()
|
||||
my_tool.set_ready_state(1)
|
||||
my_tool.set_ready_state(TRUE)
|
||||
my_tool.log_message("Power lost.")
|
||||
else
|
||||
my_tool.set_ready_state(1)
|
||||
my_tool.set_ready_state(TRUE)
|
||||
|
||||
/obj/item/shield_projector/line/exosuit/attack_self(var/mob/living/user)
|
||||
if(active)
|
||||
|
||||
8095
vorestation.dme
8095
vorestation.dme
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user