[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(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)

View File

@@ -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."

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

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."
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

View File

@@ -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>")

View File

@@ -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>&nbsp;[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>&nbsp;[src.name] - <a href='?src=\ref[src];toggle_relay=1'>[(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate</a>"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

@@ -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

View File

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

View File

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

View File

@@ -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

View File

@@ -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)")

View File

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

View File

@@ -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

View File

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

File diff suppressed because it is too large Load Diff