[MIRROR] Removes Global Iterators

This commit is contained in:
Chompstation Bot
2021-06-19 13:43:53 +00:00
parent 5f76f2e855
commit 42cdb33edb
30 changed files with 8491 additions and 672 deletions

View File

@@ -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 ..()

View File

@@ -104,7 +104,8 @@
if(move_result) if(move_result)
if(istype(src.loc, /turf/space)) if(istype(src.loc, /turf/space))
if(!src.check_for_support()) if(!src.check_for_support())
src.pr_inertial_movement.start(list(src,direction)) float_direction = direction
start_process(MECHA_PROC_MOVEMENT)
can_move = 0 can_move = 0
spawn(tmp_step_in) can_move = 1 spawn(tmp_step_in) can_move = 1
use_power(tmp_step_energy_drain) use_power(tmp_step_energy_drain)

View File

@@ -81,9 +81,7 @@
C.forceMove(src) C.forceMove(src)
cell = C cell = C
return return
cell = new(src) cell = new /obj/item/weapon/cell/hyper(src)
cell.charge = 30000
cell.maxcharge = 30000
/obj/mecha/combat/gygax/serenity /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." 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."

View File

@@ -97,7 +97,7 @@
src.occupant_message("Unable to move while connected to the air system port") src.occupant_message("Unable to move while connected to the air system port")
last_message = world.time last_message = world.time
return 0 return 0
if(!thrusters && src.pr_inertial_movement.active()) if(!thrusters && (current_processes & MECHA_PROC_MOVEMENT))
return 0 return 0
if(state || !has_charge(step_energy_drain)) if(state || !has_charge(step_energy_drain))
return 0 return 0
@@ -113,9 +113,9 @@
if(move_result) if(move_result)
if(istype(src.loc, /turf/space)) if(istype(src.loc, /turf/space))
if(!src.check_for_support()) if(!src.check_for_support())
src.pr_inertial_movement.start(list(src,direction)) float_direction = direction
start_process(MECHA_PROC_MOVEMENT)
if(thrusters) if(thrusters)
src.pr_inertial_movement.set_process_args(list(src,direction))
tmp_step_energy_drain = step_energy_drain*2 tmp_step_energy_drain = step_energy_drain*2
can_move = 0 can_move = 0

View File

@@ -17,13 +17,13 @@
origin_tech = list(TECH_MATERIAL = 2) origin_tech = list(TECH_MATERIAL = 2)
description_info = "Some equipment may gain new abilities or advantages if equipped to certain types of Exosuits." description_info = "Some equipment may gain new abilities or advantages if equipped to certain types of Exosuits."
var/equip_cooldown = 0 var/equip_cooldown = 0
var/equip_ready = 1 var/equip_ready = TRUE
var/energy_drain = 0 var/energy_drain = 0
var/obj/mecha/chassis = null var/obj/mecha/chassis = null
var/range = MELEE //bitflags var/range = MELEE //bitflags
/// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this.
var/mech_flags = NONE 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/required_type = /obj/mecha //may be either a type or a list of allowed types
var/equip_type = null //mechaequip2 var/equip_type = null //mechaequip2
var/allow_duplicate = FALSE var/allow_duplicate = FALSE
@@ -34,7 +34,7 @@
/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1) /obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1)
sleep(equip_cooldown) sleep(equip_cooldown)
set_ready_state(1) set_ready_state(TRUE)
if(ready_sound) //Kind of like the kinetic accelerator. if(ready_sound) //Kind of like the kinetic accelerator.
playsound(src, ready_sound, 50, 1, -1) playsound(src, ready_sound, 50, 1, -1)
if(target && chassis) if(target && chassis)
@@ -45,10 +45,6 @@
. = ..() . = ..()
. += "<span class='notice'>[src] will fill [equip_type?"a [equip_type]":"any"] slot.</span>" . += "<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) /obj/item/mecha_parts/mecha_equipment/proc/add_equip_overlay(obj/mecha/M as obj)
return return
@@ -233,8 +229,13 @@
src.update_chassis_page() src.update_chassis_page()
return return
/obj/item/mecha_parts/mecha_equipment/Destroy()
detach()
return ..()
/obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null)
moveto = moveto || get_turf(chassis) moveto = moveto || get_turf(chassis)
<<<<<<< HEAD
if(src.Move(moveto)) if(src.Move(moveto))
chassis.equipment -= src chassis.equipment -= src
chassis.universal_equipment -= src chassis.universal_equipment -= src
@@ -262,6 +263,59 @@
chassis.log_message("[src] removed from equipment.") chassis.log_message("[src] removed from equipment.")
chassis = null chassis = null
set_ready_state(1) 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 enable_special = FALSE
return return

View File

@@ -29,7 +29,7 @@
chassis.occupant_message("<span class='danger'>\The [user] hits [chassis] with [W].</span>") 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>") 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 inc_damage *= damage_coeff
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
spawn() spawn()
do_after_cooldown() 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>") 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.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)) 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) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return return

View File

@@ -25,7 +25,7 @@
inc_damage = 0 inc_damage = 0
else else
inc_damage *= src.damage_coeff inc_damage *= src.damage_coeff
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
spawn() spawn()
do_after_cooldown() do_after_cooldown()
@@ -41,7 +41,7 @@
inc_damage = 0 inc_damage = 0
else if(istype(A, /obj)) else if(istype(A, /obj))
inc_damage *= damage_coeff inc_damage *= damage_coeff
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
spawn() spawn()
do_after_cooldown() do_after_cooldown()
@@ -83,7 +83,7 @@
chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour) 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)) 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) Proj.on_hit(chassis)
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return return
@@ -103,7 +103,7 @@
if(O.throwforce) if(O.throwforce)
chassis.take_damage(round(O.throwforce*damage_coeff)) 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)) 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) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return return

View File

@@ -73,7 +73,7 @@
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount) /obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount)
if(!cable || cable.amount<1) if(!cable || cable.amount<1)
set_ready_state(1) set_ready_state(TRUE)
occupant_message("Cable depleted, [src] deactivated.") occupant_message("Cable depleted, [src] deactivated.")
log_message("Cable depleted, [src] deactivated.") log_message("Cable depleted, [src] deactivated.")
return return

View File

@@ -39,7 +39,7 @@
locked.throw_at(target, 14, 1.5, chassis) locked.throw_at(target, 14, 1.5, chassis)
locked = null locked = null
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) 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) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
else else
@@ -60,7 +60,7 @@
for(var/i=0 to iter) for(var/i=0 to iter)
step_away(A,target) step_away(A,target)
sleep(2) sleep(2)
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return return

View File

@@ -76,7 +76,7 @@
occupant_message("You lift [target] and start to load it into cargo compartment.") 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.") 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) chassis.use_power(energy_drain)
O.anchored = 1 O.anchored = 1
var/T = chassis.loc var/T = chassis.loc
@@ -115,7 +115,7 @@
step_away(M,chassis) step_away(M,chassis)
occupant_message("You push [target] out of the way.") occupant_message("You push [target] out of the way.")
chassis.visible_message("[chassis] pushes [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) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return 1 return 1
@@ -137,7 +137,7 @@
if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) if(cargo_holder.cargo.len < cargo_holder.cargo_capacity)
chassis.occupant_message("You lift [target] and start to load it into cargo compartment.") 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.") 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) chassis.use_power(energy_drain)
O.anchored = 1 O.anchored = 1
var/T = chassis.loc var/T = chassis.loc
@@ -169,7 +169,7 @@
step_away(M,chassis) step_away(M,chassis)
chassis.occupant_message("You smash into [target], sending them flying.") chassis.occupant_message("You smash into [target], sending them flying.")
chassis.visible_message("[chassis] tosses [target] like a piece of paper.") chassis.visible_message("[chassis] tosses [target] like a piece of paper.")
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return 1 return 1

View File

@@ -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." desc = "Integrated cloaking system. High power usage, but does render you invisible to the naked eye. Doesn't prevent noise, however."
icon_state = "tesla" icon_state = "tesla"
origin_tech = list(TECH_MAGNET = 5, TECH_DATA = 5) origin_tech = list(TECH_MAGNET = 5, TECH_DATA = 5)
equip_cooldown = 2 SECONDS
energy_drain = 300 energy_drain = 300
range = 0 range = 0
equip_type = EQUIP_SPECIAL equip_type = EQUIP_SPECIAL
var/datum/global_iterator/mecha_cloak/cloak_iterator /obj/item/mecha_parts/mecha_equipment/cloak/process()
..()
/obj/item/mecha_parts/mecha_equipment/cloak/Initialize() //Removed from chassis or ran out of power
. = ..() if(!chassis || !chassis.use_power(energy_drain))
cloak_iterator = new /datum/global_iterator/mecha_cloak(list(src),0) stop_cloak()
cloak_iterator.set_delay(equip_cooldown) return
/obj/item/mecha_parts/mecha_equipment/cloak/Destroy()
qdel_null(cloak_iterator)
return ..()
/obj/item/mecha_parts/mecha_equipment/cloak/detach() /obj/item/mecha_parts/mecha_equipment/cloak/detach()
qdel_null(cloak_iterator)
if(!equip_ready) //We were running if(!equip_ready) //We were running
stop_cloak() stop_cloak()
return ..() return ..()
@@ -44,27 +37,14 @@
if(chassis) if(chassis)
chassis.cloak() chassis.cloak()
log_message("Activated.") log_message("Activated.")
cloak_iterator.start() START_PROCESSING(SSobj, src)
set_ready_state(0) set_ready_state(FALSE)
playsound(src, 'sound/effects/EMPulse.ogg', 100, 1) playsound(src, 'sound/effects/EMPulse.ogg', 100, 1)
/obj/item/mecha_parts/mecha_equipment/cloak/proc/stop_cloak() /obj/item/mecha_parts/mecha_equipment/cloak/proc/stop_cloak()
if(chassis) if(chassis)
chassis.uncloak() chassis.uncloak()
log_message("Deactivated.") log_message("Deactivated.")
cloak_iterator.stop() STOP_PROCESSING(SSobj, src)
set_ready_state(1) set_ready_state(TRUE)
playsound(src, 'sound/effects/EMPulse.ogg', 100, 1) 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

View File

@@ -13,7 +13,7 @@
if(isobj(target)) if(isobj(target))
var/obj/target_obj = target var/obj/target_obj = target
if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) 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>") 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>") occupant_message("<span class='danger'>You start to drill [target]</span>")
@@ -100,7 +100,7 @@
if(isobj(target)) if(isobj(target))
var/obj/target_obj = target var/obj/target_obj = target
if(target_obj.unacidable) return if(target_obj.unacidable) return
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) 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>") 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>") occupant_message("<span class='danger'>You start to bore into \the [target]</span>")

View File

@@ -6,25 +6,39 @@
equip_cooldown = 10 equip_cooldown = 10
energy_drain = 0 energy_drain = 0
range = 0 range = 0
var/datum/global_iterator/pr_energy_relay
var/coeff = 100 var/coeff = 100
var/list/use_channels = list(EQUIP,ENVIRON,LIGHT) var/list/use_channels = list(EQUIP,ENVIRON,LIGHT)
equip_type = EQUIP_UTILITY 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 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() /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["dynusepower"] = null
chassis.proc_res["dyngetcharge"] = null chassis.proc_res["dyngetcharge"] = null
..() ..()
@@ -66,50 +80,16 @@
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Topic(href, href_list) /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Topic(href, href_list)
..() ..()
if(href_list["toggle_relay"]) if(href_list["toggle_relay"])
if(pr_energy_relay.toggle()) if(datum_flags & DF_ISPROCESSING)
set_ready_state(0) STOP_PROCESSING(SSfastprocess, src)
log_message("Activated.") set_ready_state(TRUE)
else
set_ready_state(1)
log_message("Deactivated.") log_message("Deactivated.")
else
START_PROCESSING(SSfastprocess, src)
set_ready_state(FALSE)
log_message("Activated.")
return return
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/get_equip_info() /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/get_equip_info()
if(!chassis) return if(!chassis) return
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[src.name] - <a href='?src=\ref[src];toggle_relay=1'>[pr_energy_relay.active()?"Dea":"A"]ctivate</a>" return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[src.name] - <a href='?src=\ref[src];toggle_relay=1'>[(datum_flags & DF_ISPROCESSING)?"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

View File

@@ -20,7 +20,7 @@
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher/action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch. /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(!action_checks(target) || get_dist(chassis, target)>3) return
if(get_dist(chassis, target)>2) return if(get_dist(chassis, target)>2) return
set_ready_state(0) set_ready_state(FALSE)
if(do_after_cooldown(target)) if(do_after_cooldown(target))
if( istype(target, /obj/structure/reagent_dispensers) && get_dist(chassis,target) <= 1) //VOREStation Edit if( istype(target, /obj/structure/reagent_dispensers) && get_dist(chassis,target) <= 1) //VOREStation Edit
var/obj/o = target var/obj/o = target

View File

@@ -6,9 +6,9 @@
equip_cooldown = 10 equip_cooldown = 10
energy_drain = 0 energy_drain = 0
range = MELEE range = MELEE
var/datum/global_iterator/pr_mech_generator
var/coeff = 100 var/coeff = 100
var/obj/item/stack/material/fuel var/obj/item/stack/material/fuel
var/fuel_type = /obj/item/stack/material/phoron
var/max_fuel = 150000 var/max_fuel = 150000
var/fuel_per_cycle_idle = 100 var/fuel_per_cycle_idle = 100
var/fuel_per_cycle_active = 500 var/fuel_per_cycle_active = 500
@@ -16,25 +16,38 @@
equip_type = EQUIP_UTILITY equip_type = EQUIP_UTILITY
/obj/item/mecha_parts/mecha_equipment/generator/New() /obj/item/mecha_parts/mecha_equipment/generator/Initialize()
..() . = ..()
init() fuel = new fuel_type(src)
return fuel.amount = 0
/obj/item/mecha_parts/mecha_equipment/generator/Destroy() /obj/item/mecha_parts/mecha_equipment/generator/Destroy()
qdel(pr_mech_generator) qdel(fuel)
pr_mech_generator = null return ..()
..()
/obj/item/mecha_parts/mecha_equipment/generator/proc/init() /obj/item/mecha_parts/mecha_equipment/generator/process()
fuel = new /obj/item/stack/material/phoron(src) if(!chassis)
fuel.amount = 0 set_ready_state(TRUE)
pr_mech_generator = new /datum/global_iterator/mecha_generator(list(src),0) return PROCESS_KILL
pr_mech_generator.set_delay(equip_cooldown) if(fuel.amount<=0)
return 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() /obj/item/mecha_parts/mecha_equipment/generator/detach()
pr_mech_generator.stop() STOP_PROCESSING(SSfastprocess, src)
..() ..()
return return
@@ -42,18 +55,20 @@
/obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list) /obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list)
..() ..()
if(href_list["toggle"]) if(href_list["toggle"])
if(pr_mech_generator.toggle()) if(datum_flags & DF_ISPROCESSING)
set_ready_state(0) STOP_PROCESSING(SSfastprocess, src)
log_message("Activated.") set_ready_state(TRUE)
else
set_ready_state(1)
log_message("Deactivated.") log_message("Deactivated.")
else
START_PROCESSING(SSfastprocess, src)
set_ready_state(FALSE)
log_message("Activated.")
return return
/obj/item/mecha_parts/mecha_equipment/generator/get_equip_info() /obj/item/mecha_parts/mecha_equipment/generator/get_equip_info()
var/output = ..() var/output = ..()
if(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 return
/obj/item/mecha_parts/mecha_equipment/generator/action(target) /obj/item/mecha_parts/mecha_equipment/generator/action(target)
@@ -109,33 +124,6 @@
T.assume_air(GM) T.assume_air(GM)
return 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 /obj/item/mecha_parts/mecha_equipment/generator/nuclear
name = "\improper ExoNuclear reactor" name = "\improper ExoNuclear reactor"
@@ -146,21 +134,13 @@
fuel_per_cycle_idle = 10 fuel_per_cycle_idle = 10
fuel_per_cycle_active = 30 fuel_per_cycle_active = 30
power_per_cycle = 50 power_per_cycle = 50
fuel_type = /obj/item/stack/material/uranium
var/rad_per_cycle = 0.3 var/rad_per_cycle = 0.3
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/init() /obj/item/mecha_parts/mecha_equipment/generator/nuclear/process()
fuel = new /obj/item/stack/material/uranium(src) if(..())
fuel.amount = 0 SSradiation.radiate(src, (rad_per_cycle * 3))
pr_mech_generator = new /datum/global_iterator/mecha_generator/nuclear(list(src),0)
pr_mech_generator.set_delay(equip_cooldown)
return return
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/critfail() /obj/item/mecha_parts/mecha_equipment/generator/nuclear/critfail()
return 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

View File

@@ -28,7 +28,7 @@
else else
occupant_message("[target] is not compatible with any present hardpoints.") occupant_message("[target] is not compatible with any present hardpoints.")
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return return

View File

@@ -41,7 +41,7 @@
if(istype(target, /obj/item/inflatable) || istype(target, /obj/structure/inflatable)) if(istype(target, /obj/item/inflatable) || istype(target, /obj/structure/inflatable))
my_deployer.pick_up(target, chassis.occupant) my_deployer.pick_up(target, chassis.occupant)
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
do_after_cooldown() do_after_cooldown()
return return

View File

@@ -31,14 +31,14 @@
return equip_ready return equip_ready
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_on() /obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_on()
set_ready_state(0) set_ready_state(FALSE)
chassis.proc_res["dyndomove"] = src chassis.proc_res["dyndomove"] = src
ion_trail.start() ion_trail.start()
occupant_message("Activated") occupant_message("Activated")
log_message("Activated") log_message("Activated")
/obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_off() /obj/item/mecha_parts/mecha_equipment/tool/jetpack/proc/turn_off()
set_ready_state(1) set_ready_state(TRUE)
chassis.proc_res["dyndomove"] = null chassis.proc_res["dyndomove"] = null
ion_trail.stop() ion_trail.stop()
occupant_message("Deactivated") occupant_message("Deactivated")
@@ -62,10 +62,9 @@
if(move_result) if(move_result)
wait = 1 wait = 1
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
if(!chassis.pr_inertial_movement.active()) chassis.float_direction = direction
chassis.pr_inertial_movement.start(list(chassis,direction)) if(!(chassis.current_processes & MECHA_PROC_MOVEMENT))
else chassis.start_process(MECHA_PROC_MOVEMENT)
chassis.pr_inertial_movement.set_process_args(list(chassis,direction))
do_after_cooldown() do_after_cooldown()
return 1 return 1
return 0 return 0

View File

@@ -7,7 +7,6 @@
energy_drain = 100 energy_drain = 100
range = 0 range = 0
var/health_boost = 2 var/health_boost = 2
var/datum/global_iterator/pr_repair_droid
var/icon/droid_overlay var/icon/droid_overlay
var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH) var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH)
@@ -15,17 +14,6 @@
equip_type = EQUIP_HULL 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) /obj/item/mecha_parts/mecha_equipment/repair_droid/add_equip_overlay(obj/mecha/M as obj)
..() ..()
if(!droid_overlay) if(!droid_overlay)
@@ -40,73 +28,70 @@
/obj/item/mecha_parts/mecha_equipment/repair_droid/detach() /obj/item/mecha_parts/mecha_equipment/repair_droid/detach()
chassis.cut_overlay(droid_overlay) chassis.cut_overlay(droid_overlay)
pr_repair_droid.stop() STOP_PROCESSING(SSobj, src)
..() ..()
return return
/obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info() /obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info()
if(!chassis) return if(!chassis) return
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[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>&nbsp;[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) /obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list)
..() ..()
if(href_list["toggle_repairs"]) if(href_list["toggle_repairs"])
chassis.cut_overlay(droid_overlay) 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") droid_overlay = new(src.icon, icon_state = "repair_droid_a")
log_message("Activated.") log_message("Activated.")
else START_PROCESSING(SSobj, src)
droid_overlay = new(src.icon, icon_state = "repair_droid")
log_message("Deactivated.")
set_ready_state(1)
chassis.add_overlay(droid_overlay) chassis.add_overlay(droid_overlay)
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
return return
/obj/item/mecha_parts/mecha_equipment/repair_droid/process()
/datum/global_iterator/mecha_repair_droid if(!chassis)
set_ready_state(TRUE)
/datum/global_iterator/mecha_repair_droid/process(var/obj/item/mecha_parts/mecha_equipment/repair_droid/RD as obj) return PROCESS_KILL
if(!RD.chassis)
stop()
RD.set_ready_state(1)
return
var/health_boost = RD.health_boost
var/repaired = 0 var/repaired = 0
if(RD.chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) var/effective_boost = health_boost
health_boost *= -2 if(chassis.hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
else if(RD.chassis.hasInternalDamage() && prob(15)) effective_boost *= -2
for(var/int_dam_flag in RD.repairable_damage) else if(chassis.hasInternalDamage() && prob(15))
if(RD.chassis.hasInternalDamage(int_dam_flag)) for(var/int_dam_flag in repairable_damage)
RD.chassis.clearInternalDamage(int_dam_flag) if(chassis.hasInternalDamage(int_dam_flag))
chassis.clearInternalDamage(int_dam_flag)
repaired = 1 repaired = 1
break break
var/obj/item/mecha_parts/component/AC = RD.chassis.internal_components[MECH_ARMOR] var/obj/item/mecha_parts/component/AC = chassis.internal_components[MECH_ARMOR]
var/obj/item/mecha_parts/component/HC = RD.chassis.internal_components[MECH_HULL] var/obj/item/mecha_parts/component/HC = chassis.internal_components[MECH_HULL]
var/damaged_armor = AC.integrity < AC.max_integrity var/damaged_armor = AC.integrity < AC.max_integrity
var/damaged_hull = HC.integrity < HC.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) if(effective_boost<0 || chassis.health < initial(chassis.health) || damaged_armor || damaged_hull)
RD.chassis.health += min(health_boost, initial(RD.chassis.health)-RD.chassis.health) chassis.health += min(effective_boost, initial(chassis.health)-chassis.health)
if(AC) if(AC)
AC.adjust_integrity(round(health_boost * 0.5, 0.5)) AC.adjust_integrity(round(effective_boost * 0.5, 0.5))
if(HC) if(HC)
HC.adjust_integrity(round(health_boost * 0.5, 0.5)) HC.adjust_integrity(round(effective_boost * 0.5, 0.5))
repaired = 1 repaired = 1
if(repaired) if(repaired)
if(RD.chassis.use_power(RD.energy_drain)) if(chassis.use_power(energy_drain))
RD.set_ready_state(0) set_ready_state(FALSE)
else else
stop() set_ready_state(TRUE)
RD.set_ready_state(1) return PROCESS_KILL
return
else else
RD.set_ready_state(1) set_ready_state(TRUE)
return return

View File

@@ -70,11 +70,11 @@
if(chassis) if(chassis)
my_shield.attack_self(chassis.occupant) my_shield.attack_self(chassis.occupant)
if(my_shield.active) if(my_shield.active)
set_ready_state(0) set_ready_state(FALSE)
step_delay = 4 step_delay = 4
log_message("Activated.") log_message("Activated.")
else else
set_ready_state(1) set_ready_state(TRUE)
step_delay = 1 step_delay = 1
log_message("Deactivated.") log_message("Deactivated.")

View File

@@ -42,11 +42,11 @@
if(shields) if(shields)
shields.set_on(!shields.active) shields.set_on(!shields.active)
if(shields.active) if(shields.active)
set_ready_state(0) set_ready_state(FALSE)
step_delay = 4 step_delay = 4
log_message("Activated.") log_message("Activated.")
else else
set_ready_state(1) set_ready_state(TRUE)
step_delay = initial(step_delay) step_delay = initial(step_delay)
log_message("Deactivated.") log_message("Deactivated.")

View File

@@ -9,20 +9,12 @@
equip_cooldown = 30 equip_cooldown = 30
mech_flags = EXOSUIT_MODULE_MEDICAL mech_flags = EXOSUIT_MODULE_MEDICAL
var/mob/living/carbon/human/occupant = null var/mob/living/carbon/human/occupant = null
var/datum/global_iterator/pr_mech_sleeper
var/inject_amount = 5 var/inject_amount = 5
required_type = list(/obj/mecha/medical) required_type = list(/obj/mecha/medical)
salvageable = 0 salvageable = 0
allow_duplicate = TRUE 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() /obj/item/mecha_parts/mecha_equipment/tool/sleeper/Destroy()
qdel(pr_mech_sleeper)
for(var/atom/movable/AM in src) for(var/atom/movable/AM in src)
AM.forceMove(get_turf(src)) AM.forceMove(get_turf(src))
return ..() return ..()
@@ -63,8 +55,8 @@
target.client.perspective = EYE_PERSPECTIVE target.client.perspective = EYE_PERSPECTIVE
target.client.eye = chassis target.client.eye = chassis
*/ */
set_ready_state(0) set_ready_state(FALSE)
pr_mech_sleeper.start() START_PROCESSING(SSprocessing, src)
occupant_message("<font color='blue'>[target] successfully loaded into [src]. Life support functions engaged.</font>") occupant_message("<font color='blue'>[target] successfully loaded into [src]. Life support functions engaged.</font>")
chassis.visible_message("[chassis] loads [target] into [src].") chassis.visible_message("[chassis] loads [target] into [src].")
log_message("[target] loaded. Life support functions engaged.") log_message("[target] loaded. Life support functions engaged.")
@@ -84,15 +76,15 @@
*/ */
occupant.Stasis(0) occupant.Stasis(0)
occupant = null occupant = null
pr_mech_sleeper.stop() STOP_PROCESSING(SSprocessing, src)
set_ready_state(1) set_ready_state(TRUE)
return return
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/detach() /obj/item/mecha_parts/mecha_equipment/tool/sleeper/detach()
if(occupant) if(occupant)
occupant_message("Unable to detach [src] - equipment occupied.") occupant_message("Unable to detach [src] - equipment occupied.")
return return
pr_mech_sleeper.stop() STOP_PROCESSING(SSprocessing, src)
return ..() return ..()
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/get_equip_info() /obj/item/mecha_parts/mecha_equipment/tool/sleeper/get_equip_info()
@@ -218,18 +210,17 @@
return return
go_out()//and release him from the eternal prison. go_out()//and release him from the eternal prison.
/datum/global_iterator/mech_sleeper /obj/item/mecha_parts/mecha_equipment/tool/sleeper/process()
..()
/datum/global_iterator/mech_sleeper/process(var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S) if(!chassis)
if(!S.chassis) set_ready_state(TRUE)
S.set_ready_state(1) return PROCESS_KILL
return stop() if(!chassis.has_charge(energy_drain))
if(!S.chassis.has_charge(S.energy_drain)) set_ready_state(TRUE)
S.set_ready_state(1) log_message("Deactivated.")
S.log_message("Deactivated.") occupant_message("[src] deactivated - no power.")
S.occupant_message("[src] deactivated - no power.") return PROCESS_KILL
return stop() var/mob/living/carbon/M = occupant
var/mob/living/carbon/M = S.occupant
if(!M) if(!M)
return return
if(M.health > 0) if(M.health > 0)
@@ -243,6 +234,6 @@
M.Stun(2) M.Stun(2)
if(M.reagents.get_reagent_amount("inaprovaline") < 5) if(M.reagents.get_reagent_amount("inaprovaline") < 5)
M.reagents.add_reagent("inaprovaline", 5) M.reagents.add_reagent("inaprovaline", 5)
S.chassis.use_power(S.energy_drain) chassis.use_power(energy_drain)
S.update_equip_info() update_equip_info()
return return

View File

@@ -18,17 +18,16 @@
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
required_type = list(/obj/mecha/medical) 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 flags |= NOREACT
syringes = new syringes = new
known_reagents = list("inaprovaline"="Inaprovaline","anti_toxin"="Dylovene") known_reagents = list("inaprovaline"="Inaprovaline","anti_toxin"="Dylovene")
processed_reagents = new processed_reagents = new
create_reagents(max_volume) create_reagents(max_volume)
synth = new (list(src),0)
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/detach() /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/detach()
synth.stop() STOP_PROCESSING(SSfastprocess, src)
return ..() return ..()
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/critfail() /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/critfail()
@@ -59,7 +58,7 @@
if(reagents.total_volume<=0) if(reagents.total_volume<=0)
occupant_message("<span class=\"alert\">No available reagents to load syringe with.</span>") occupant_message("<span class=\"alert\">No available reagents to load syringe with.</span>")
return return
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
var/turf/trg = get_turf(target) var/turf/trg = get_turf(target)
var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
@@ -123,7 +122,7 @@
m++ m++
if(processed_reagents.len) if(processed_reagents.len)
message += " added to production" message += " added to production"
synth.start() START_PROCESSING(SSfastprocess, src)
occupant_message(message) occupant_message(message)
occupant_message("Reagent processing started.") occupant_message("Reagent processing started.")
log_message("Reagent processing started.") log_message("Reagent processing started.")
@@ -243,7 +242,7 @@
return 1 return 1
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/proc/add_known_reagent(r_id,r_name) /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() do_after_cooldown()
if(!(r_id in known_reagents)) if(!(r_id in known_reagents))
known_reagents += r_id known_reagents += r_id
@@ -264,22 +263,17 @@
update_equip_info() update_equip_info()
return return
/datum/global_iterator/mech_synth /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/process()
delay = 100 if(!chassis)
return PROCESS_KILL
/datum/global_iterator/mech_synth/process(var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/S) if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain))
if(!S.chassis) occupant_message("<span class=\"alert\">Reagent processing stopped.</span>")
return stop() log_message("Reagent processing stopped.")
var/energy_drain = S.energy_drain*10 return PROCESS_KILL
if(!S.processed_reagents.len || S.reagents.total_volume >= S.reagents.maximum_volume || !S.chassis.has_charge(energy_drain)) var/amount = synth_speed / processed_reagents.len
S.occupant_message("<span class=\"alert\">Reagent processing stopped.</span>") for(var/reagent in processed_reagents)
S.log_message("Reagent processing stopped.") reagents.add_reagent(reagent,amount)
return stop() chassis.use_power(energy_drain)
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/crisis_drone /obj/item/mecha_parts/mecha_equipment/crisis_drone
name = "crisis dronebay" name = "crisis dronebay"
@@ -321,10 +315,6 @@
. = ..() . = ..()
drone_overlay = new(src.icon, icon_state = droid_state) 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) /obj/item/mecha_parts/mecha_equipment/crisis_drone/attach(obj/mecha/M as obj)
. = ..(M) . = ..(M)
if(chassis) if(chassis)
@@ -464,10 +454,10 @@
if(chassis) if(chassis)
enabled = !enabled enabled = !enabled
if(enabled) if(enabled)
set_ready_state(0) set_ready_state(FALSE)
log_message("Activated.") log_message("Activated.")
else else
set_ready_state(1) set_ready_state(TRUE)
log_message("Deactivated.") log_message("Deactivated.")
/obj/item/mecha_parts/mecha_equipment/crisis_drone/add_equip_overlay(obj/mecha/M as obj) /obj/item/mecha_parts/mecha_equipment/crisis_drone/add_equip_overlay(obj/mecha/M as obj)

View File

@@ -13,7 +13,7 @@
if(!action_checks(target) || src.loc.z == 2) return if(!action_checks(target) || src.loc.z == 2) return
var/turf/T = get_turf(target) var/turf/T = get_turf(target)
if(T) if(T)
set_ready_state(0) set_ready_state(FALSE)
chassis.use_power(energy_drain) chassis.use_power(energy_drain)
do_teleport(chassis, T, 4) do_teleport(chassis, T, 4)
do_after_cooldown() do_after_cooldown()

View File

@@ -35,7 +35,7 @@
if(!target_turf) if(!target_turf)
return return
chassis.use_power(energy_drain) 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)) var/obj/effect/portal/P = new /obj/effect/portal(get_turf(target))
P.target = target_turf P.target = target_turf
P.creator = null P.creator = null

View File

@@ -57,12 +57,12 @@
var/P = new projectile(projectile_turf) var/P = new projectile(projectile_turf)
Fire(P, target, params) Fire(P, target, params)
if(i == 1) if(i == 1)
set_ready_state(0) set_ready_state(FALSE)
if(fire_cooldown) if(fire_cooldown)
sleep(fire_cooldown) sleep(fire_cooldown)
if(auto_rearm) if(auto_rearm)
projectiles = projectiles_per_shot projectiles = projectiles_per_shot
// set_ready_state(0) // set_ready_state(FALSE)
//CHOMPedit, redundant code removed. Fixes weapon lock on mob kill. //CHOMPedit, redundant code removed. Fixes weapon lock on mob kill.
add_attack_logs(chassis.occupant,target, "Fired exosuit weapon [src.name] (MANUAL)") add_attack_logs(chassis.occupant,target, "Fired exosuit weapon [src.name] (MANUAL)")

View File

@@ -4,6 +4,10 @@
#define MECHA_INT_TANK_BREACH 8 #define MECHA_INT_TANK_BREACH 8
#define MECHA_INT_CONTROL_LOST 16 #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 MELEE 1
#define RANGED 2 #define RANGED 2
@@ -92,18 +96,18 @@
var/list/operation_req_access = list() //Required access level for mecha operation 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/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/wreckage
var/list/equipment = new //This lists holds what stuff you bolted onto your baby ride var/list/equipment = new //This lists holds what stuff you bolted onto your baby ride
var/obj/item/mecha_parts/mecha_equipment/selected var/obj/item/mecha_parts/mecha_equipment/selected
var/max_equip = 2 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 //mechaequipt2 stuffs
var/list/hull_equipment = new var/list/hull_equipment = new
@@ -222,8 +226,6 @@
/obj/mecha/New() /obj/mecha/New()
..() ..()
events = new
icon_state += "-open" icon_state += "-open"
add_radio() add_radio()
add_cabin() add_cabin()
@@ -239,7 +241,6 @@
src.smoke_system.attach(src) src.smoke_system.attach(src)
add_cell() add_cell()
add_iterators()
removeVerb(/obj/mecha/verb/disconnect_from_port) removeVerb(/obj/mecha/verb/disconnect_from_port)
log_message("[src.name] created.") log_message("[src.name] created.")
loc.Entered(src) loc.Entered(src)
@@ -282,7 +283,7 @@
if(E.salvageable && prob(30)) if(E.salvageable && prob(30))
WR.crowbar_salvage += E WR.crowbar_salvage += E
E.forceMove(WR) E.forceMove(WR)
E.equip_ready = 1 E.equip_ready = TRUE
else else
E.forceMove(loc) E.forceMove(loc)
E.destroy() E.destroy()
@@ -324,16 +325,122 @@
GLOB.mech_destroyed_roundstat++ 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(spark_system)
QDEL_NULL(minihud) QDEL_NULL(minihud)
mechas_list -= src //global mech list 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 ///////// ////// Helpers /////////
//////////////////////// ////////////////////////
@@ -372,12 +479,6 @@
radio.icon_state = icon_state radio.icon_state = icon_state
radio.subspace_transmission = 1 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) /obj/mecha/proc/do_after(delay as num)
sleep(delay) sleep(delay)
if(src) if(src)
@@ -692,7 +793,7 @@
/obj/mecha/proc/dyndomove(direction) /obj/mecha/proc/dyndomove(direction)
if(!can_move) if(!can_move)
return 0 return 0
if(src.pr_inertial_movement.active()) if(current_processes & MECHA_PROC_MOVEMENT)
return 0 return 0
if(!has_charge(step_energy_drain)) if(!has_charge(step_energy_drain))
return 0 return 0
@@ -711,16 +812,7 @@
last_message = world.time last_message = world.time
return 0 return 0
if(!thrusters && (current_processes & MECHA_PROC_MOVEMENT)) //I think this mean 'if you try to move in space without thruster, u no move'
/*
//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'
return 0 return 0
if(overload)//Check if you have leg overload if(overload)//Check if you have leg overload
@@ -780,7 +872,8 @@
use_power(step_energy_drain) use_power(step_energy_drain)
if(istype(src.loc, /turf/space)) if(istype(src.loc, /turf/space))
if(!src.check_for_support()) 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>") src.log_message("<span class='warning'>Movement control lost. Inertial movement started.</span>")
if(do_after(get_step_delay())) if(do_after(get_step_delay()))
can_move = 1 can_move = 1
@@ -882,10 +975,8 @@
/obj/mecha/proc/setInternalDamage(int_dam_flag) /obj/mecha/proc/setInternalDamage(int_dam_flag)
if(!pr_internal_damage) return
internal_damage |= int_dam_flag 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) log_append_to_last("Internal damage of type [int_dam_flag].",1)
occupant << sound('sound/mecha/internaldmgalarm.ogg',volume=50) //Better sounding. occupant << sound('sound/mecha/internaldmgalarm.ogg',volume=50) //Better sounding.
return return
@@ -895,7 +986,7 @@
switch(int_dam_flag) switch(int_dam_flag)
if(MECHA_INT_TEMP_CONTROL) if(MECHA_INT_TEMP_CONTROL)
occupant_message("<font color='blue'><b>Life support system reactivated.</b></font>") 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) if(MECHA_INT_FIRE)
occupant_message("<font color='blue'><b>Internal fire extinquished.</b></font>") occupant_message("<font color='blue'><b>Internal fire extinquished.</b></font>")
if(MECHA_INT_TANK_BREACH) if(MECHA_INT_TANK_BREACH)
@@ -2725,99 +2816,21 @@
return 1 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) // Handles the internal alarms for a mech.
if(mecha.cabin_air && mecha.cabin_air.volume > 0) // Called every 16 iterations (80 deciseconds).
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
///////////// /////////////

View File

@@ -44,40 +44,25 @@
var/list/operation_req_access = list()//required access level for mecha operation 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/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/wreckage
var/list/equipment = new var/list/equipment = new
var/obj/selected var/obj/selected
//var/max_equip = 3 //var/max_equip = 3
var/datum/events/events
/obj/vehicle/New() /obj/vehicle/Initialize()
..() . = ..()
events = new
icon_state += "-unmanned" icon_state += "-unmanned"
add_radio() add_radio()
//add_cabin() //No cabin for non-airtights
spark_system.set_up(2, 0, src) spark_system.set_up(2, 0, src)
spark_system.attach(src) spark_system.attach(src)
add_cell() add_cell()
add_iterators()
removeVerb(/obj/mecha/verb/disconnect_from_port)
removeVerb(/atom/movable/verb/pull) removeVerb(/atom/movable/verb/pull)
log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.") log_message("[src.name]'s functions initialised. Work protocols active - Entering IDLE mode.")
loc.Entered(src)
return
//################ Helpers ########################################################### //################ Helpers ###########################################################
@@ -89,26 +74,12 @@
/obj/vehicle/proc/addVerb(verb_path) /obj/vehicle/proc/addVerb(verb_path)
verbs += 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) /obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null)
if(C) if(C)
C.forceMove(src) C.forceMove(src)
cell = C cell = C
return return
cell = new(src) cell = new /obj/item/weapon/cell/mech(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*/
/obj/vehicle/proc/add_radio() /obj/vehicle/proc/add_radio()
radio = new(src) radio = new(src)
@@ -117,12 +88,6 @@
radio.icon_state = icon_state radio.icon_state = icon_state
radio.subspace_transmission = 1 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() /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))) 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 return 1
@@ -136,55 +101,3 @@
log.len++ log.len++
log[log.len] = list("time"=world.timeofday,"message"="[red?"<font color='red'>":null][message][red?"</font>":null]") log[log.len] = list("time"=world.timeofday,"message"="[red?"<font color='red'>":null][message][red?"</font>":null]")
return log.len 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

View File

@@ -363,15 +363,15 @@
if((my_tool && loc != my_tool) && (my_mecha && loc != my_mecha)) if((my_tool && loc != my_tool) && (my_mecha && loc != my_mecha))
forceMove(my_tool) forceMove(my_tool)
if(active) 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. if(my_mecha.has_charge(my_tool.energy_drain * 50)) //Stops at around 1000 charge.
my_mecha.use_power(my_tool.energy_drain) my_mecha.use_power(my_tool.energy_drain)
else else
destroy_shields() destroy_shields()
my_tool.set_ready_state(1) my_tool.set_ready_state(TRUE)
my_tool.log_message("Power lost.") my_tool.log_message("Power lost.")
else 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) /obj/item/shield_projector/line/exosuit/attack_self(var/mob/living/user)
if(active) if(active)

File diff suppressed because it is too large Load Diff